Hex Artifact Content

Artifact 911e0722122a6b303d357a1d651211f8c75d15d0:


0000: 23 69 66 64 65 66 20 48 41 56 45 5f 43 4f 4e 46  #ifdef HAVE_CONF
0010: 49 47 5f 48 0a 23 69 6e 63 6c 75 64 65 20 22 63  IG_H.#include "c
0020: 6f 6e 66 69 67 2e 68 22 0a 23 65 6e 64 69 66 0a  onfig.h".#endif.
0030: 0a 23 69 66 64 65 66 20 48 41 56 45 5f 57 49 4e  .#ifdef HAVE_WIN
0040: 54 59 50 45 53 5f 48 0a 23 20 20 69 6e 63 6c 75  TYPES_H.#  inclu
0050: 64 65 20 3c 77 69 6e 74 79 70 65 73 2e 68 3e 0a  de <wintypes.h>.
0060: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 48 41  #endif.#ifdef HA
0070: 56 45 5f 50 43 53 43 4c 49 54 45 5f 48 0a 23 20  VE_PCSCLITE_H.# 
0080: 20 69 6e 63 6c 75 64 65 20 3c 70 63 73 63 6c 69   include <pcscli
0090: 74 65 2e 68 3e 0a 23 65 6e 64 69 66 0a 23 69 66  te.h>.#endif.#if
00a0: 64 65 66 20 48 41 56 45 5f 57 49 4e 53 43 41 52  def HAVE_WINSCAR
00b0: 44 5f 48 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c  D_H.#  include <
00c0: 77 69 6e 73 63 61 72 64 2e 68 3e 0a 23 65 6e 64  winscard.h>.#end
00d0: 69 66 0a 23 69 66 64 65 66 20 48 41 56 45 5f 53  if.#ifdef HAVE_S
00e0: 54 44 49 4e 54 5f 48 0a 23 20 20 69 6e 63 6c 75  TDINT_H.#  inclu
00f0: 64 65 20 3c 73 74 64 69 6e 74 2e 68 3e 0a 23 65  de <stdint.h>.#e
0100: 6e 64 69 66 0a 23 69 66 64 65 66 20 48 41 56 45  ndif.#ifdef HAVE
0110: 5f 49 4e 54 54 59 50 45 53 5f 48 0a 23 20 20 69  _INTTYPES_H.#  i
0120: 6e 63 6c 75 64 65 20 3c 69 6e 74 74 79 70 65 73  nclude <inttypes
0130: 2e 68 3e 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  .h>.#endif.#ifde
0140: 66 20 48 41 56 45 5f 53 54 44 4c 49 42 5f 48 0a  f HAVE_STDLIB_H.
0150: 23 20 20 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c  #  include <stdl
0160: 69 62 2e 68 3e 0a 23 65 6e 64 69 66 0a 23 69 66  ib.h>.#endif.#if
0170: 64 65 66 20 48 41 56 45 5f 55 4e 49 53 54 44 5f  def HAVE_UNISTD_
0180: 48 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 75 6e  H.#  include <un
0190: 69 73 74 64 2e 68 3e 0a 23 65 6e 64 69 66 0a 23  istd.h>.#endif.#
01a0: 69 66 64 65 66 20 48 41 56 45 5f 53 54 52 49 4e  ifdef HAVE_STRIN
01b0: 47 5f 48 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c  G_H.#  include <
01c0: 73 74 72 69 6e 67 2e 68 3e 0a 23 65 6e 64 69 66  string.h>.#endif
01d0: 0a 23 69 66 64 65 66 20 48 41 56 45 5f 50 54 48  .#ifdef HAVE_PTH
01e0: 52 45 41 44 5f 48 0a 23 20 20 69 6e 63 6c 75 64  READ_H.#  includ
01f0: 65 20 3c 70 74 68 72 65 61 64 2e 68 3e 0a 23 65  e <pthread.h>.#e
0200: 6e 64 69 66 0a 23 69 66 64 65 66 20 48 41 56 45  ndif.#ifdef HAVE
0210: 5f 4c 49 4d 49 54 53 5f 48 0a 23 20 20 69 6e 63  _LIMITS_H.#  inc
0220: 6c 75 64 65 20 3c 6c 69 6d 69 74 73 2e 68 3e 0a  lude <limits.h>.
0230: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 48 41  #endif.#ifdef HA
0240: 56 45 5f 53 54 44 49 4f 5f 48 0a 23 20 20 69 6e  VE_STDIO_H.#  in
0250: 63 6c 75 64 65 20 3c 73 74 64 69 6f 2e 68 3e 0a  clude <stdio.h>.
0260: 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 48  #endif.#define H
0270: 41 56 45 5f 45 52 52 4e 4f 5f 48 20 31 0a 23 69  AVE_ERRNO_H 1.#i
0280: 66 64 65 66 20 48 41 56 45 5f 45 52 52 4e 4f 5f  fdef HAVE_ERRNO_
0290: 48 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 65 72  H.#  include <er
02a0: 72 6e 6f 2e 68 3e 0a 23 65 6e 64 69 66 0a 23 69  rno.h>.#endif.#i
02b0: 66 64 65 66 20 48 41 56 45 5f 5a 4c 49 42 5f 48  fdef HAVE_ZLIB_H
02c0: 0a 23 20 20 69 66 64 65 66 20 48 41 56 45 5f 4c  .#  ifdef HAVE_L
02d0: 49 42 5a 0a 23 20 20 20 20 69 6e 63 6c 75 64 65  IBZ.#    include
02e0: 20 3c 7a 6c 69 62 2e 68 3e 0a 23 20 20 65 6e 64   <zlib.h>.#  end
02f0: 69 66 0a 23 65 6c 73 65 0a 23 20 20 69 66 64 65  if.#else.#  ifde
0300: 66 20 48 41 56 45 5f 4c 49 42 5a 0a 23 20 20 20  f HAVE_LIBZ.#   
0310: 20 75 6e 64 65 66 20 48 41 56 45 5f 4c 49 42 5a   undef HAVE_LIBZ
0320: 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69 66  .#  endif.#endif
0330: 0a 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f 44  .#ifdef CACKEY_D
0340: 45 42 55 47 5f 53 45 41 52 43 48 5f 53 50 45 45  EBUG_SEARCH_SPEE
0350: 44 54 45 53 54 0a 23 20 20 69 6e 63 6c 75 64 65  DTEST.#  include
0360: 20 3c 73 79 73 2f 74 69 6d 65 2e 68 3e 0a 23 65   <sys/time.h>.#e
0370: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 43 4b  ndif..#define CK
0380: 5f 50 54 52 20 2a 0a 23 64 65 66 69 6e 65 20 43  _PTR *.#define C
0390: 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
03a0: 4e 28 72 65 74 75 72 6e 54 79 70 65 2c 20 6e 61  N(returnType, na
03b0: 6d 65 29 20 72 65 74 75 72 6e 54 79 70 65 20 6e  me) returnType n
03c0: 61 6d 65 0a 23 64 65 66 69 6e 65 20 43 4b 5f 44  ame.#define CK_D
03d0: 45 43 4c 41 52 45 5f 46 55 4e 43 54 49 4f 4e 28  ECLARE_FUNCTION(
03e0: 72 65 74 75 72 6e 54 79 70 65 2c 20 6e 61 6d 65  returnType, name
03f0: 29 20 72 65 74 75 72 6e 54 79 70 65 20 6e 61 6d  ) returnType nam
0400: 65 0a 23 64 65 66 69 6e 65 20 43 4b 5f 44 45 43  e.#define CK_DEC
0410: 4c 41 52 45 5f 46 55 4e 43 54 49 4f 4e 5f 50 4f  LARE_FUNCTION_PO
0420: 49 4e 54 45 52 28 72 65 74 75 72 6e 54 79 70 65  INTER(returnType
0430: 2c 20 6e 61 6d 65 29 20 72 65 74 75 72 6e 54 79  , name) returnTy
0440: 70 65 20 28 2a 20 6e 61 6d 65 29 0a 23 64 65 66  pe (* name).#def
0450: 69 6e 65 20 43 4b 5f 43 41 4c 4c 42 41 43 4b 5f  ine CK_CALLBACK_
0460: 46 55 4e 43 54 49 4f 4e 28 72 65 74 75 72 6e 54  FUNCTION(returnT
0470: 79 70 65 2c 20 6e 61 6d 65 29 20 72 65 74 75 72  ype, name) retur
0480: 6e 54 79 70 65 20 28 2a 20 6e 61 6d 65 29 0a 23  nType (* name).#
0490: 69 66 6e 64 65 66 20 4e 55 4c 4c 5f 50 54 52 0a  ifndef NULL_PTR.
04a0: 23 20 20 64 65 66 69 6e 65 20 4e 55 4c 4c 5f 50  #  define NULL_P
04b0: 54 52 20 30 0a 23 65 6e 64 69 66 0a 0a 23 69 6e  TR 0.#endif..#in
04c0: 63 6c 75 64 65 20 22 70 6b 63 73 31 31 2e 68 22  clude "pkcs11.h"
04d0: 0a 23 69 6e 63 6c 75 64 65 20 22 70 6b 63 73 31  .#include "pkcs1
04e0: 31 6e 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22  1n.h".#include "
04f0: 61 73 6e 31 2d 78 35 30 39 2e 68 22 0a 23 69 6e  asn1-x509.h".#in
0500: 63 6c 75 64 65 20 22 73 68 61 31 2e 68 22 0a 23  clude "sha1.h".#
0510: 69 6e 63 6c 75 64 65 20 22 6d 64 35 2e 68 22 0a  include "md5.h".
0520: 0a 23 69 66 6e 64 65 66 20 43 41 43 4b 45 59 5f  .#ifndef CACKEY_
0530: 43 52 59 50 54 4f 4b 49 5f 56 45 52 53 49 4f 4e  CRYPTOKI_VERSION
0540: 5f 43 4f 44 45 0a 23 20 20 64 65 66 69 6e 65 20  _CODE.#  define 
0550: 43 41 43 4b 45 59 5f 43 52 59 50 54 4f 4b 49 5f  CACKEY_CRYPTOKI_
0560: 56 45 52 53 49 4f 4e 5f 43 4f 44 45 20 30 78 30  VERSION_CODE 0x0
0570: 32 31 65 30 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a  21e00.#endif../*
0580: 20 47 53 43 2d 49 53 20 76 32 2e 31 20 44 65 66   GSC-IS v2.1 Def
0590: 69 6e 69 74 69 6f 6e 73 20 2a 2f 0a 2f 2a 2a 20  initions */./** 
05a0: 43 6c 61 73 73 65 73 20 2a 2a 2f 0a 23 64 65 66  Classes **/.#def
05b0: 69 6e 65 20 47 53 43 49 53 5f 43 4c 41 53 53 5f  ine GSCIS_CLASS_
05c0: 49 53 4f 37 38 31 36 20 20 20 20 20 20 20 20 20  ISO7816         
05d0: 20 20 30 78 30 30 0a 23 64 65 66 69 6e 65 20 47    0x00.#define G
05e0: 53 43 49 53 5f 43 4c 41 53 53 5f 47 4c 4f 42 41  SCIS_CLASS_GLOBA
05f0: 4c 5f 50 4c 41 54 46 4f 52 4d 20 20 20 30 78 38  L_PLATFORM   0x8
0600: 30 0a 0a 2f 2a 2a 20 49 6e 73 74 72 75 63 74 69  0../** Instructi
0610: 6f 6e 73 20 2a 2a 2f 0a 23 64 65 66 69 6e 65 20  ons **/.#define 
0620: 47 53 43 49 53 5f 49 4e 53 54 52 5f 47 45 54 5f  GSCIS_INSTR_GET_
0630: 52 45 53 50 4f 4e 53 45 20 20 20 20 20 20 30 78  RESPONSE      0x
0640: 43 30 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53  C0.#define GSCIS
0650: 5f 49 4e 53 54 52 5f 52 45 41 44 5f 42 49 4e 41  _INSTR_READ_BINA
0660: 52 59 20 20 20 20 20 20 20 30 78 42 30 0a 23 64  RY       0xB0.#d
0670: 65 66 69 6e 65 20 47 53 43 49 53 5f 49 4e 53 54  efine GSCIS_INST
0680: 52 5f 55 50 44 41 54 45 5f 42 49 4e 41 52 59 20  R_UPDATE_BINARY 
0690: 20 20 20 20 30 78 44 36 0a 23 64 65 66 69 6e 65      0xD6.#define
06a0: 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 53 45 4c   GSCIS_INSTR_SEL
06b0: 45 43 54 20 20 20 20 20 20 20 20 20 20 20 20 30  ECT            0
06c0: 78 41 34 0a 23 64 65 66 69 6e 65 20 47 53 43 49  xA4.#define GSCI
06d0: 53 5f 49 4e 53 54 52 5f 45 58 54 45 52 4e 41 4c  S_INSTR_EXTERNAL
06e0: 5f 41 55 54 48 20 20 20 20 20 30 78 38 32 0a 23  _AUTH     0x82.#
06f0: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 49 4e 53  define GSCIS_INS
0700: 54 52 5f 47 45 54 5f 43 48 41 4c 4c 45 4e 47 45  TR_GET_CHALLENGE
0710: 20 20 20 20 20 30 78 38 34 0a 23 64 65 66 69 6e       0x84.#defin
0720: 65 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 49 4e  e GSCIS_INSTR_IN
0730: 54 45 52 4e 41 4c 5f 41 55 54 48 20 20 20 20 20  TERNAL_AUTH     
0740: 30 78 38 38 0a 23 64 65 66 69 6e 65 20 47 53 43  0x88.#define GSC
0750: 49 53 5f 49 4e 53 54 52 5f 56 45 52 49 46 59 20  IS_INSTR_VERIFY 
0760: 20 20 20 20 20 20 20 20 20 20 20 30 78 32 30 0a             0x20.
0770: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 49 4e  #define GSCIS_IN
0780: 53 54 52 5f 43 48 41 4e 47 45 5f 52 45 46 45 52  STR_CHANGE_REFER
0790: 45 4e 43 45 20 20 30 78 32 34 0a 23 64 65 66 69  ENCE  0x24.#defi
07a0: 6e 65 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 53  ne GSCIS_INSTR_S
07b0: 49 47 4e 20 20 20 20 20 20 20 20 20 20 20 20 20  IGN             
07c0: 20 30 78 32 41 0a 23 64 65 66 69 6e 65 20 47 53   0x2A.#define GS
07d0: 43 49 53 5f 49 4e 53 54 52 5f 47 45 54 5f 50 52  CIS_INSTR_GET_PR
07e0: 4f 50 20 20 20 20 20 20 20 20 20 20 30 78 35 36  OP          0x56
07f0: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 49  .#define GSCIS_I
0800: 4e 53 54 52 5f 47 45 54 5f 41 43 52 20 20 20 20  NSTR_GET_ACR    
0810: 20 20 20 20 20 20 20 30 78 34 43 0a 23 64 65 66         0x4C.#def
0820: 69 6e 65 20 47 53 43 49 53 5f 49 4e 53 54 52 5f  ine GSCIS_INSTR_
0830: 52 45 41 44 5f 42 55 46 46 45 52 20 20 20 20 20  READ_BUFFER     
0840: 20 20 30 78 35 32 0a 23 64 65 66 69 6e 65 20 47    0x52.#define G
0850: 53 43 49 53 5f 49 4e 53 54 52 5f 53 49 47 4e 44  SCIS_INSTR_SIGND
0860: 45 43 52 59 50 54 20 20 20 20 20 20 20 30 78 34  ECRYPT       0x4
0870: 32 0a 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53  2..#define GSCIS
0880: 5f 50 41 52 41 4d 5f 53 45 4c 45 43 54 5f 41 50  _PARAM_SELECT_AP
0890: 50 4c 45 54 20 20 20 20 20 30 78 30 34 0a 0a 2f  PLET     0x04../
08a0: 2a 2a 20 54 61 67 73 20 2a 2a 2f 0a 2f 2a 2a 2a  ** Tags **/./***
08b0: 20 43 43 43 20 54 61 67 73 20 2a 2a 2a 2f 0a 23   CCC Tags ***/.#
08c0: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47  define GSCIS_TAG
08d0: 5f 43 41 52 44 49 44 20 20 20 20 20 20 20 20 20  _CARDID         
08e0: 20 20 20 20 20 30 78 46 30 0a 23 64 65 66 69 6e       0xF0.#defin
08f0: 65 20 47 53 43 49 53 5f 54 41 47 5f 43 43 43 5f  e GSCIS_TAG_CCC_
0900: 56 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20  VER             
0910: 30 78 46 31 0a 23 64 65 66 69 6e 65 20 47 53 43  0xF1.#define GSC
0920: 49 53 5f 54 41 47 5f 43 43 47 5f 56 45 52 20 20  IS_TAG_CCG_VER  
0930: 20 20 20 20 20 20 20 20 20 20 20 30 78 46 32 0a             0xF2.
0940: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
0950: 47 5f 43 41 52 44 55 52 4c 20 20 20 20 20 20 20  G_CARDURL       
0960: 20 20 20 20 20 20 30 78 46 33 0a 23 64 65 66 69        0xF3.#defi
0970: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 50 4b 43  ne GSCIS_TAG_PKC
0980: 53 31 35 20 20 20 20 20 20 20 20 20 20 20 20 20  S15             
0990: 20 30 78 46 34 0a 23 64 65 66 69 6e 65 20 47 53   0xF4.#define GS
09a0: 43 49 53 5f 54 41 47 5f 52 45 47 5f 44 41 54 41  CIS_TAG_REG_DATA
09b0: 5f 4d 4f 44 45 4c 20 20 20 20 20 20 30 78 46 35  _MODEL      0xF5
09c0: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54  .#define GSCIS_T
09d0: 41 47 5f 41 43 52 5f 54 41 42 4c 45 20 20 20 20  AG_ACR_TABLE    
09e0: 20 20 20 20 20 20 20 30 78 46 36 0a 23 64 65 66         0xF6.#def
09f0: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 43 41  ine GSCIS_TAG_CA
0a00: 52 44 5f 41 50 44 55 20 20 20 20 20 20 20 20 20  RD_APDU         
0a10: 20 20 30 78 46 37 0a 23 64 65 66 69 6e 65 20 47    0xF7.#define G
0a20: 53 43 49 53 5f 54 41 47 5f 52 45 44 49 52 45 43  SCIS_TAG_REDIREC
0a30: 54 49 4f 4e 20 20 20 20 20 20 20 20 20 30 78 46  TION         0xF
0a40: 41 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f  A.#define GSCIS_
0a50: 54 41 47 5f 43 54 20 20 20 20 20 20 20 20 20 20  TAG_CT          
0a60: 20 20 20 20 20 20 20 20 30 78 46 42 0a 23 64 65          0xFB.#de
0a70: 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 53  fine GSCIS_TAG_S
0a80: 54 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  T               
0a90: 20 20 20 30 78 46 43 0a 23 64 65 66 69 6e 65 20     0xFC.#define 
0aa0: 47 53 43 49 53 5f 54 41 47 5f 4e 45 58 54 43 43  GSCIS_TAG_NEXTCC
0ab0: 43 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78  C             0x
0ac0: 46 44 0a 0a 2f 2a 2a 2a 20 47 65 6e 65 72 61 6c  FD../*** General
0ad0: 20 2d 20 45 46 20 32 32 30 30 20 2a 2a 2a 2f 0a   - EF 2200 ***/.
0ae0: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
0af0: 47 5f 46 4e 41 4d 45 20 20 20 20 20 20 20 20 20  G_FNAME         
0b00: 20 20 20 20 20 20 30 78 30 31 0a 23 64 65 66 69        0x01.#defi
0b10: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 4d 4e 41  ne GSCIS_TAG_MNA
0b20: 4d 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ME              
0b30: 20 30 78 30 32 0a 23 64 65 66 69 6e 65 20 47 53   0x02.#define GS
0b40: 43 49 53 5f 54 41 47 5f 4c 4e 41 4d 45 20 20 20  CIS_TAG_LNAME   
0b50: 20 20 20 20 20 20 20 20 20 20 20 20 30 78 30 33              0x03
0b60: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54  .#define GSCIS_T
0b70: 41 47 5f 53 55 46 46 49 58 20 20 20 20 20 20 20  AG_SUFFIX       
0b80: 20 20 20 20 20 20 20 30 78 30 34 0a 23 64 65 66         0x04.#def
0b90: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 47 4f  ine GSCIS_TAG_GO
0ba0: 56 54 5f 41 47 45 4e 43 59 20 20 20 20 20 20 20  VT_AGENCY       
0bb0: 20 20 30 78 30 35 0a 23 64 65 66 69 6e 65 20 47    0x05.#define G
0bc0: 53 43 49 53 5f 54 41 47 5f 42 55 52 45 41 55 20  SCIS_TAG_BUREAU 
0bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78 30               0x0
0be0: 36 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f  6.#define GSCIS_
0bf0: 54 41 47 5f 42 55 52 45 41 55 5f 43 4f 44 45 20  TAG_BUREAU_CODE 
0c00: 20 20 20 20 20 20 20 20 30 78 30 37 0a 23 64 65          0x07.#de
0c10: 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 44  fine GSCIS_TAG_D
0c20: 45 50 54 5f 43 4f 44 45 20 20 20 20 20 20 20 20  EPT_CODE        
0c30: 20 20 20 30 78 30 38 0a 23 64 65 66 69 6e 65 20     0x08.#define 
0c40: 47 53 43 49 53 5f 54 41 47 5f 54 49 54 4c 45 20  GSCIS_TAG_TITLE 
0c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78                0x
0c60: 30 39 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53  09.#define GSCIS
0c70: 5f 54 41 47 5f 42 55 49 4c 44 49 4e 47 20 20 20  _TAG_BUILDING   
0c80: 20 20 20 20 20 20 20 20 20 30 78 31 30 0a 23 64           0x10.#d
0c90: 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f  efine GSCIS_TAG_
0ca0: 4f 46 46 49 43 45 5f 41 44 44 52 31 20 20 20 20  OFFICE_ADDR1    
0cb0: 20 20 20 20 30 78 31 31 0a 23 64 65 66 69 6e 65      0x11.#define
0cc0: 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43   GSCIS_TAG_OFFIC
0cd0: 45 5f 41 44 44 52 32 20 20 20 20 20 20 20 20 30  E_ADDR2        0
0ce0: 78 31 32 0a 23 64 65 66 69 6e 65 20 47 53 43 49  x12.#define GSCI
0cf0: 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 43 49 54  S_TAG_OFFICE_CIT
0d00: 59 20 20 20 20 20 20 20 20 20 30 78 31 33 0a 23  Y         0x13.#
0d10: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47  define GSCIS_TAG
0d20: 5f 4f 46 46 49 43 45 5f 53 54 41 54 45 20 20 20  _OFFICE_STATE   
0d30: 20 20 20 20 20 30 78 31 34 0a 23 64 65 66 69 6e       0x14.#defin
0d40: 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49  e GSCIS_TAG_OFFI
0d50: 43 45 5f 5a 49 50 20 20 20 20 20 20 20 20 20 20  CE_ZIP          
0d60: 30 78 31 35 0a 23 64 65 66 69 6e 65 20 47 53 43  0x15.#define GSC
0d70: 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 43 4f  IS_TAG_OFFICE_CO
0d80: 55 4e 54 52 59 20 20 20 20 20 20 30 78 31 36 0a  UNTRY      0x16.
0d90: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
0da0: 47 5f 4f 46 46 49 43 45 5f 50 48 4f 4e 45 20 20  G_OFFICE_PHONE  
0db0: 20 20 20 20 20 20 30 78 31 37 0a 23 64 65 66 69        0x17.#defi
0dc0: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46  ne GSCIS_TAG_OFF
0dd0: 49 43 45 5f 50 48 4f 4e 45 5f 45 58 54 20 20 20  ICE_PHONE_EXT   
0de0: 20 30 78 31 38 0a 23 64 65 66 69 6e 65 20 47 53   0x18.#define GS
0df0: 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 46  CIS_TAG_OFFICE_F
0e00: 41 58 20 20 20 20 20 20 20 20 20 20 30 78 31 39  AX          0x19
0e10: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54  .#define GSCIS_T
0e20: 41 47 5f 4f 46 46 49 43 45 5f 45 4d 41 49 4c 20  AG_OFFICE_EMAIL 
0e30: 20 20 20 20 20 20 20 30 78 31 41 0a 23 64 65 66         0x1A.#def
0e40: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46  ine GSCIS_TAG_OF
0e50: 46 49 43 45 5f 52 4f 4f 4d 20 20 20 20 20 20 20  FICE_ROOM       
0e60: 20 20 30 78 31 42 0a 23 64 65 66 69 6e 65 20 47    0x1B.#define G
0e70: 53 43 49 53 5f 54 41 47 5f 4e 4f 4e 47 4f 56 5f  SCIS_TAG_NONGOV_
0e80: 41 47 45 4e 43 59 20 20 20 20 20 20 20 30 78 31  AGENCY       0x1
0e90: 43 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f  C.#define GSCIS_
0ea0: 54 41 47 5f 53 53 4e 5f 44 45 53 49 47 4e 41 54  TAG_SSN_DESIGNAT
0eb0: 4f 52 20 20 20 20 20 20 30 78 31 44 0a 0a 2f 2a  OR      0x1D../*
0ec0: 2a 2a 20 50 49 49 20 2d 20 45 46 20 32 31 30 30  ** PII - EF 2100
0ed0: 20 2a 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 47 53   ***/.#define GS
0ee0: 43 49 53 5f 54 41 47 5f 53 53 4e 20 20 20 20 20  CIS_TAG_SSN     
0ef0: 20 20 20 20 20 20 20 20 20 20 20 20 30 78 32 30              0x20
0f00: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54  .#define GSCIS_T
0f10: 41 47 5f 44 4f 42 20 20 20 20 20 20 20 20 20 20  AG_DOB          
0f20: 20 20 20 20 20 20 20 30 78 32 31 0a 23 64 65 66         0x21.#def
0f30: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 47 45  ine GSCIS_TAG_GE
0f40: 4e 44 45 52 20 20 20 20 20 20 20 20 20 20 20 20  NDER            
0f50: 20 20 30 78 32 32 0a 0a 2f 2a 2a 2a 20 4c 6f 67    0x22../*** Log
0f60: 69 6e 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d  in Information -
0f70: 20 45 46 20 34 30 30 30 20 2a 2a 2a 2f 0a 23 64   EF 4000 ***/.#d
0f80: 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f  efine GSCIS_TAG_
0f90: 55 53 45 52 49 44 20 20 20 20 20 20 20 20 20 20  USERID          
0fa0: 20 20 20 20 30 78 34 30 0a 23 64 65 66 69 6e 65      0x40.#define
0fb0: 20 47 53 43 49 53 5f 54 41 47 5f 44 4f 4d 41 49   GSCIS_TAG_DOMAI
0fc0: 4e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30  N              0
0fd0: 78 34 31 0a 23 64 65 66 69 6e 65 20 47 53 43 49  x41.#define GSCI
0fe0: 53 5f 54 41 47 5f 50 41 53 53 57 4f 52 44 20 20  S_TAG_PASSWORD  
0ff0: 20 20 20 20 20 20 20 20 20 20 30 78 34 32 0a 0a            0x42..
1000: 2f 2a 2a 2a 20 43 61 72 64 20 49 6e 66 6f 72 6d  /*** Card Inform
1010: 61 74 69 6f 6e 20 2d 20 45 46 20 35 30 30 30 20  ation - EF 5000 
1020: 2a 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 47 53 43  ***/.#define GSC
1030: 49 53 5f 54 41 47 5f 49 53 53 55 45 52 49 44 20  IS_TAG_ISSUERID 
1040: 20 20 20 20 20 20 20 20 20 20 20 30 78 35 30 0a             0x50.
1050: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
1060: 47 5f 53 45 52 4e 4f 20 20 20 20 20 20 20 20 20  G_SERNO         
1070: 20 20 20 20 20 20 30 78 35 31 0a 23 64 65 66 69        0x51.#defi
1080: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 49 53 53  ne GSCIS_TAG_ISS
1090: 55 45 5f 44 41 54 45 20 20 20 20 20 20 20 20 20  UE_DATE         
10a0: 20 30 78 35 32 0a 23 64 65 66 69 6e 65 20 47 53   0x52.#define GS
10b0: 43 49 53 5f 54 41 47 5f 45 58 50 49 52 45 5f 44  CIS_TAG_EXPIRE_D
10c0: 41 54 45 20 20 20 20 20 20 20 20 20 30 78 35 33  ATE         0x53
10d0: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54  .#define GSCIS_T
10e0: 41 47 5f 43 41 52 44 5f 54 59 50 45 20 20 20 20  AG_CARD_TYPE    
10f0: 20 20 20 20 20 20 20 30 78 35 34 0a 23 64 65 66         0x54.#def
1100: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 53 45  ine GSCIS_TAG_SE
1110: 43 55 52 49 54 59 5f 43 4f 44 45 20 20 20 20 20  CURITY_CODE     
1120: 20 20 30 78 35 37 0a 23 64 65 66 69 6e 65 20 47    0x57.#define G
1130: 53 43 49 53 5f 54 41 47 5f 43 41 52 44 49 44 5f  SCIS_TAG_CARDID_
1140: 41 49 44 20 20 20 20 20 20 20 20 20 20 30 78 35  AID          0x5
1150: 38 0a 0a 2f 2a 2a 2a 20 50 49 56 20 43 6f 64 65  8../*** PIV Code
1160: 73 20 2a 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e  s ***/.#define N
1170: 49 53 54 53 50 38 30 30 5f 37 33 5f 33 5f 49 4e  ISTSP800_73_3_IN
1180: 53 54 52 5f 47 45 54 5f 44 41 54 41 20 30 78 43  STR_GET_DATA 0xC
1190: 42 0a 23 64 65 66 69 6e 65 20 4e 49 53 54 53 50  B.#define NISTSP
11a0: 38 30 30 5f 37 33 5f 33 5f 49 4e 53 54 52 5f 47  800_73_3_INSTR_G
11b0: 45 4e 41 55 54 48 20 20 30 78 38 37 0a 0a 2f 2a  ENAUTH  0x87../*
11c0: 2a 2a 20 50 4b 49 20 49 6e 66 6f 72 6d 61 74 69  ** PKI Informati
11d0: 6f 6e 20 2d 20 45 46 20 37 30 30 30 20 2a 2a 2a  on - EF 7000 ***
11e0: 2f 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f  /.#define GSCIS_
11f0: 54 41 47 5f 43 45 52 54 49 46 49 43 41 54 45 20  TAG_CERTIFICATE 
1200: 20 20 20 20 20 20 20 20 30 78 37 30 0a 23 64 65          0x70.#de
1210: 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 43  fine GSCIS_TAG_C
1220: 45 52 54 5f 49 53 53 55 45 5f 44 41 54 45 20 20  ERT_ISSUE_DATE  
1230: 20 20 20 30 78 37 31 0a 23 64 65 66 69 6e 65 20     0x71.#define 
1240: 47 53 43 49 53 5f 54 41 47 5f 43 45 52 54 5f 45  GSCIS_TAG_CERT_E
1250: 58 50 49 52 45 5f 44 41 54 45 20 20 20 20 30 78  XPIRE_DATE    0x
1260: 37 32 0a 0a 2f 2a 2a 20 41 70 70 6c 65 74 20 49  72../** Applet I
1270: 44 73 20 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 47  Ds **/.#define G
1280: 53 43 49 53 5f 41 49 44 5f 43 43 43 20 20 20 20  SCIS_AID_CCC    
1290: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78 41               0xA
12a0: 30 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30  0, 0x00, 0x00, 0
12b0: 78 30 31 2c 20 30 78 31 36 2c 20 30 78 44 42 2c  x01, 0x16, 0xDB,
12c0: 20 30 78 30 30 0a 23 64 65 66 69 6e 65 20 47 53   0x00.#define GS
12d0: 43 49 53 5f 41 49 44 5f 49 44 30 20 20 20 20 20  CIS_AID_ID0     
12e0: 20 20 20 20 20 20 20 20 20 20 20 20 30 78 41 30              0xA0
12f0: 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78  , 0x00, 0x00, 0x
1300: 30 30 2c 20 30 78 37 39 2c 20 30 78 30 31 2c 20  00, 0x79, 0x01, 
1310: 30 78 30 30 0a 23 64 65 66 69 6e 65 20 4e 49 53  0x00.#define NIS
1320: 54 53 50 38 30 30 5f 37 33 5f 33 5f 50 49 56 5f  TSP800_73_3_PIV_
1330: 41 49 44 20 20 20 20 20 20 20 20 30 78 41 30 2c  AID        0xA0,
1340: 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30   0x00, 0x00, 0x0
1350: 33 2c 20 30 78 30 38 2c 20 30 78 30 30 2c 20 30  3, 0x08, 0x00, 0
1360: 78 30 30 2c 20 30 78 31 30 2c 20 30 78 30 30 2c  x00, 0x10, 0x00,
1370: 20 30 78 30 31 2c 20 30 78 30 30 0a 0a 2f 2a 20   0x01, 0x00../* 
1380: 50 49 56 20 49 44 73 20 2a 2f 0a 2f 2a 2a 20 4b  PIV IDs */./** K
1390: 65 79 20 49 64 65 6e 74 69 66 69 65 72 73 20 28  ey Identifiers (
13a0: 4e 49 53 54 20 53 50 20 38 30 30 2d 37 38 2d 33  NIST SP 800-78-3
13b0: 2c 20 54 61 62 6c 65 20 36 2d 31 20 2a 2a 2f 0a  , Table 6-1 **/.
13c0: 23 64 65 66 69 6e 65 20 4e 49 53 54 53 50 38 30  #define NISTSP80
13d0: 30 5f 37 38 5f 33 5f 4b 45 59 5f 50 49 56 41 55  0_78_3_KEY_PIVAU
13e0: 54 48 20 20 20 30 78 39 41 0a 23 64 65 66 69 6e  TH   0x9A.#defin
13f0: 65 20 4e 49 53 54 53 50 38 30 30 5f 37 38 5f 33  e NISTSP800_78_3
1400: 5f 4b 45 59 5f 53 49 47 4e 41 54 55 52 45 20 30  _KEY_SIGNATURE 0
1410: 78 39 43 0a 23 64 65 66 69 6e 65 20 4e 49 53 54  x9C.#define NIST
1420: 53 50 38 30 30 5f 37 38 5f 33 5f 4b 45 59 5f 4b  SP800_78_3_KEY_K
1430: 45 59 4d 47 54 20 20 20 20 30 78 39 44 0a 23 64  EYMGT    0x9D.#d
1440: 65 66 69 6e 65 20 4e 49 53 54 53 50 38 30 30 5f  efine NISTSP800_
1450: 37 38 5f 33 5f 4b 45 59 5f 43 41 52 44 41 55 54  78_3_KEY_CARDAUT
1460: 48 20 20 30 78 39 45 0a 0a 2f 2a 2a 20 41 6c 67  H  0x9E../** Alg
1470: 6f 72 69 74 68 6d 20 49 64 65 6e 74 69 66 69 65  orithm Identifie
1480: 72 73 20 28 4e 49 53 54 20 53 50 20 38 30 30 2d  rs (NIST SP 800-
1490: 37 38 2d 33 2c 20 54 61 62 6c 65 20 36 2d 32 20  78-3, Table 6-2 
14a0: 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 49 53 54  **/.#define NIST
14b0: 53 50 38 30 30 5f 37 38 5f 33 5f 41 4c 47 4f 5f  SP800_78_3_ALGO_
14c0: 52 53 41 31 30 32 34 20 20 30 78 30 36 0a 23 64  RSA1024  0x06.#d
14d0: 65 66 69 6e 65 20 4e 49 53 54 53 50 38 30 30 5f  efine NISTSP800_
14e0: 37 38 5f 33 5f 41 4c 47 4f 5f 52 53 41 32 30 34  78_3_ALGO_RSA204
14f0: 38 20 20 30 78 30 37 0a 0a 2f 2a 2a 20 4f 62 6a  8  0x07../** Obj
1500: 65 63 74 20 49 64 65 6e 74 69 66 69 65 72 73 20  ect Identifiers 
1510: 28 4e 49 53 54 20 53 50 20 38 30 30 2d 37 33 2d  (NIST SP 800-73-
1520: 33 20 50 61 72 74 20 31 2c 20 54 61 62 6c 65 20  3 Part 1, Table 
1530: 32 29 20 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e  2) **/.#define N
1540: 49 53 54 53 50 38 30 30 5f 37 33 5f 33 5f 4f 49  ISTSP800_73_3_OI
1550: 44 5f 50 49 56 41 55 54 48 20 20 20 30 78 35 46  D_PIVAUTH   0x5F
1560: 2c 20 30 78 43 31 2c 20 30 78 30 35 0a 23 64 65  , 0xC1, 0x05.#de
1570: 66 69 6e 65 20 4e 49 53 54 53 50 38 30 30 5f 37  fine NISTSP800_7
1580: 33 5f 33 5f 4f 49 44 5f 53 49 47 4e 41 54 55 52  3_3_OID_SIGNATUR
1590: 45 20 30 78 35 46 2c 20 30 78 43 31 2c 20 30 78  E 0x5F, 0xC1, 0x
15a0: 30 41 0a 23 64 65 66 69 6e 65 20 4e 49 53 54 53  0A.#define NISTS
15b0: 50 38 30 30 5f 37 33 5f 33 5f 4f 49 44 5f 4b 45  P800_73_3_OID_KE
15c0: 59 4d 47 54 20 20 20 20 30 78 35 46 2c 20 30 78  YMGT    0x5F, 0x
15d0: 43 31 2c 20 30 78 30 42 0a 23 64 65 66 69 6e 65  C1, 0x0B.#define
15e0: 20 4e 49 53 54 53 50 38 30 30 5f 37 33 5f 33 5f   NISTSP800_73_3_
15f0: 4f 49 44 5f 43 41 52 44 41 55 54 48 20 20 30 78  OID_CARDAUTH  0x
1600: 35 46 2c 20 30 78 43 31 2c 20 30 78 30 31 0a 0a  5F, 0xC1, 0x01..
1610: 2f 2a 20 4d 61 78 69 6d 75 6d 20 73 69 7a 65 20  /* Maximum size 
1620: 6f 66 20 64 61 74 61 20 70 6f 72 74 69 6f 6e 20  of data portion 
1630: 6f 66 20 41 50 44 55 73 20 2a 2f 0a 2f 2a 2a 20  of APDUs */./** 
1640: 44 6f 20 6e 6f 74 20 73 65 74 20 74 68 69 73 20  Do not set this 
1650: 61 62 6f 76 65 20 32 35 30 20 2a 2a 2f 0a 23 64  above 250 **/.#d
1660: 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 41 50 44  efine CACKEY_APD
1670: 55 5f 4d 54 55 20 20 20 20 20 20 20 20 20 20 20  U_MTU           
1680: 20 20 20 20 32 35 30 0a 0a 2f 2a 20 41 54 52 20      250../* ATR 
1690: 49 66 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  If not available
16a0: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4d 41 58 5f   */.#ifndef MAX_
16b0: 41 54 52 5f 53 49 5a 45 0a 23 64 65 66 69 6e 65  ATR_SIZE.#define
16c0: 20 4d 41 58 5f 41 54 52 5f 53 49 5a 45 20 31 30   MAX_ATR_SIZE 10
16d0: 32 34 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65  24.#endif..#ifde
16e0: 66 20 43 41 43 4b 45 59 5f 44 45 42 55 47 0a 23  f CACKEY_DEBUG.#
16f0: 20 20 69 66 64 65 66 20 48 41 56 45 5f 54 49 4d    ifdef HAVE_TIM
1700: 45 5f 48 0a 23 20 20 20 20 69 6e 63 6c 75 64 65  E_H.#    include
1710: 20 3c 74 69 6d 65 2e 68 3e 0a 73 74 61 74 69 63   <time.h>.static
1720: 20 74 69 6d 65 5f 74 20 63 61 63 6b 65 79 5f 64   time_t cackey_d
1730: 65 62 75 67 5f 73 74 61 72 74 5f 74 69 6d 65 20  ebug_start_time 
1740: 3d 20 30 3b 0a 73 74 61 74 69 63 20 75 6e 73 69  = 0;.static unsi
1750: 67 6e 65 64 20 6c 6f 6e 67 20 43 41 43 4b 45 59  gned long CACKEY
1760: 5f 44 45 42 55 47 5f 47 45 54 54 49 4d 45 28 76  _DEBUG_GETTIME(v
1770: 6f 69 64 29 20 7b 0a 09 69 66 20 28 63 61 63 6b  oid) {..if (cack
1780: 65 79 5f 64 65 62 75 67 5f 73 74 61 72 74 5f 74  ey_debug_start_t
1790: 69 6d 65 20 3d 3d 20 30 29 20 7b 0a 09 09 63 61  ime == 0) {...ca
17a0: 63 6b 65 79 5f 64 65 62 75 67 5f 73 74 61 72 74  ckey_debug_start
17b0: 5f 74 69 6d 65 20 3d 20 74 69 6d 65 28 4e 55 4c  _time = time(NUL
17c0: 4c 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28  L);..}...return(
17d0: 74 69 6d 65 28 4e 55 4c 4c 29 20 2d 20 63 61 63  time(NULL) - cac
17e0: 6b 65 79 5f 64 65 62 75 67 5f 73 74 61 72 74 5f  key_debug_start_
17f0: 74 69 6d 65 29 3b 0a 7d 0a 23 20 20 65 6c 73 65  time);.}.#  else
1800: 0a 73 74 61 74 69 63 20 75 6e 73 69 67 6e 65 64  .static unsigned
1810: 20 6c 6f 6e 67 20 43 41 43 4b 45 59 5f 44 45 42   long CACKEY_DEB
1820: 55 47 5f 47 45 54 54 49 4d 45 28 76 6f 69 64 29  UG_GETTIME(void)
1830: 20 7b 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a 7d   {..return(0);.}
1840: 0a 23 20 20 65 6e 64 69 66 0a 0a 23 20 20 64 65  .#  endif..#  de
1850: 66 69 6e 65 20 43 41 43 4b 45 59 5f 44 45 42 55  fine CACKEY_DEBU
1860: 47 5f 50 52 49 4e 54 46 28 78 2e 2e 2e 29 20 7b  G_PRINTF(x...) {
1870: 20 5c 0a 09 73 74 61 74 69 63 20 63 68 61 72 20   \..static char 
1880: 62 75 66 5f 75 73 65 72 5b 34 30 39 36 5d 20 3d  buf_user[4096] =
1890: 20 7b 30 7d 3b 20 5c 0a 09 73 6e 70 72 69 6e 74   {0}; \..snprint
18a0: 66 28 62 75 66 5f 75 73 65 72 2c 20 73 69 7a 65  f(buf_user, size
18b0: 6f 66 28 62 75 66 5f 75 73 65 72 29 2c 20 78 29  of(buf_user), x)
18c0: 3b 20 5c 0a 09 62 75 66 5f 75 73 65 72 5b 73 69  ; \..buf_user[si
18d0: 7a 65 6f 66 28 62 75 66 5f 75 73 65 72 29 20 2d  zeof(buf_user) -
18e0: 20 31 5d 20 3d 20 27 5c 30 27 3b 20 5c 0a 09 66   1] = '\0'; \..f
18f0: 70 72 69 6e 74 66 28 63 61 63 6b 65 79 5f 64 65  printf(cackey_de
1900: 62 75 67 5f 66 64 28 29 2c 20 22 5b 25 6c 75 5d  bug_fd(), "[%lu]
1910: 3a 20 25 73 28 29 3a 25 69 3a 20 25 73 5c 6e 22  : %s():%i: %s\n"
1920: 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 47  , CACKEY_DEBUG_G
1930: 45 54 54 49 4d 45 28 29 2c 20 5f 5f 66 75 6e 63  ETTIME(), __func
1940: 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f 5f 2c 20 62 75  __, __LINE__, bu
1950: 66 5f 75 73 65 72 29 3b 20 5c 0a 09 66 66 6c 75  f_user); \..fflu
1960: 73 68 28 63 61 63 6b 65 79 5f 64 65 62 75 67 5f  sh(cackey_debug_
1970: 66 64 28 29 29 3b 20 5c 0a 7d 0a 23 20 20 64 65  fd()); \.}.#  de
1980: 66 69 6e 65 20 43 41 43 4b 45 59 5f 44 45 42 55  fine CACKEY_DEBU
1990: 47 5f 50 52 49 4e 54 42 55 46 28 66 2c 20 78 2c  G_PRINTBUF(f, x,
19a0: 20 79 29 20 7b 20 5c 0a 09 73 74 61 74 69 63 20   y) { \..static 
19b0: 63 68 61 72 20 62 75 66 5f 75 73 65 72 5b 38 31  char buf_user[81
19c0: 39 32 5d 20 3d 20 7b 30 7d 2c 20 2a 62 75 66 5f  92] = {0}, *buf_
19d0: 75 73 65 72 5f 70 2c 20 2a 62 75 66 5f 75 73 65  user_p, *buf_use
19e0: 72 5f 70 72 69 6e 74 3b 20 5c 0a 09 75 6e 73 69  r_print; \..unsi
19f0: 67 6e 65 64 20 6c 6f 6e 67 20 62 75 66 5f 75 73  gned long buf_us
1a00: 65 72 5f 73 69 7a 65 3b 20 5c 0a 09 75 6e 73 69  er_size; \..unsi
1a10: 67 6e 65 64 20 63 68 61 72 20 2a 54 4d 50 42 55  gned char *TMPBU
1a20: 46 3b 20 5c 0a 09 75 6e 73 69 67 6e 65 64 20 6c  F; \..unsigned l
1a30: 6f 6e 67 20 69 64 78 3b 20 5c 0a 09 69 6e 74 20  ong idx; \..int 
1a40: 73 6e 70 72 69 6e 74 66 5f 72 65 74 3b 20 5c 0a  snprintf_ret; \.
1a50: 09 54 4d 50 42 55 46 20 3d 20 28 75 6e 73 69 67  .TMPBUF = (unsig
1a60: 6e 65 64 20 63 68 61 72 20 2a 29 20 28 78 29 3b  ned char *) (x);
1a70: 20 5c 0a 09 62 75 66 5f 75 73 65 72 5b 30 5d 20   \..buf_user[0] 
1a80: 3d 20 30 3b 20 5c 0a 09 62 75 66 5f 75 73 65 72  = 0; \..buf_user
1a90: 5b 32 5d 20 3d 20 30 3b 20 5c 0a 09 62 75 66 5f  [2] = 0; \..buf_
1aa0: 75 73 65 72 5f 70 20 3d 20 62 75 66 5f 75 73 65  user_p = buf_use
1ab0: 72 3b 20 5c 0a 09 62 75 66 5f 75 73 65 72 5f 73  r; \..buf_user_s
1ac0: 69 7a 65 20 3d 20 73 69 7a 65 6f 66 28 62 75 66  ize = sizeof(buf
1ad0: 5f 75 73 65 72 29 3b 20 5c 0a 09 66 6f 72 20 28  _user); \..for (
1ae0: 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 28  idx = 0; idx < (
1af0: 79 29 3b 20 69 64 78 2b 2b 29 20 7b 20 5c 0a 09  y); idx++) { \..
1b00: 09 69 66 20 28 62 75 66 5f 75 73 65 72 5f 73 69  .if (buf_user_si
1b10: 7a 65 20 3c 3d 20 30 29 20 7b 20 5c 0a 09 09 09  ze <= 0) { \....
1b20: 62 72 65 61 6b 3b 20 5c 0a 09 09 7d 3b 20 5c 0a  break; \...}; \.
1b30: 09 09 73 6e 70 72 69 6e 74 66 5f 72 65 74 20 3d  ..snprintf_ret =
1b40: 20 73 6e 70 72 69 6e 74 66 28 62 75 66 5f 75 73   snprintf(buf_us
1b50: 65 72 5f 70 2c 20 62 75 66 5f 75 73 65 72 5f 73  er_p, buf_user_s
1b60: 69 7a 65 2c 20 22 2c 20 25 30 32 78 22 2c 20 54  ize, ", %02x", T
1b70: 4d 50 42 55 46 5b 69 64 78 5d 29 3b 20 5c 0a 09  MPBUF[idx]); \..
1b80: 09 69 66 20 28 73 6e 70 72 69 6e 74 66 5f 72 65  .if (snprintf_re
1b90: 74 20 3c 3d 20 30 29 20 7b 20 5c 0a 09 09 09 62  t <= 0) { \....b
1ba0: 72 65 61 6b 3b 20 5c 0a 09 09 7d 3b 20 5c 0a 09  reak; \...}; \..
1bb0: 09 62 75 66 5f 75 73 65 72 5f 70 20 2b 3d 20 73  .buf_user_p += s
1bc0: 6e 70 72 69 6e 74 66 5f 72 65 74 3b 20 5c 0a 09  nprintf_ret; \..
1bd0: 09 62 75 66 5f 75 73 65 72 5f 73 69 7a 65 20 2d  .buf_user_size -
1be0: 3d 20 73 6e 70 72 69 6e 74 66 5f 72 65 74 3b 20  = snprintf_ret; 
1bf0: 5c 0a 09 7d 3b 20 5c 0a 09 62 75 66 5f 75 73 65  \..}; \..buf_use
1c00: 72 5b 73 69 7a 65 6f 66 28 62 75 66 5f 75 73 65  r[sizeof(buf_use
1c10: 72 29 20 2d 20 31 5d 20 3d 20 27 5c 30 27 3b 20  r) - 1] = '\0'; 
1c20: 5c 0a 09 62 75 66 5f 75 73 65 72 5f 70 72 69 6e  \..buf_user_prin
1c30: 74 20 3d 20 62 75 66 5f 75 73 65 72 20 2b 20 32  t = buf_user + 2
1c40: 3b 20 5c 0a 09 66 70 72 69 6e 74 66 28 63 61 63  ; \..fprintf(cac
1c50: 6b 65 79 5f 64 65 62 75 67 5f 66 64 28 29 2c 20  key_debug_fd(), 
1c60: 22 5b 25 6c 75 5d 3a 20 25 73 28 29 3a 25 69 3a  "[%lu]: %s():%i:
1c70: 20 25 73 20 20 28 25 73 2f 25 6c 75 20 3d 20 7b   %s  (%s/%lu = {
1c80: 25 73 7d 29 5c 6e 22 2c 20 43 41 43 4b 45 59 5f  %s})\n", CACKEY_
1c90: 44 45 42 55 47 5f 47 45 54 54 49 4d 45 28 29 2c  DEBUG_GETTIME(),
1ca0: 20 5f 5f 66 75 6e 63 5f 5f 2c 20 5f 5f 4c 49 4e   __func__, __LIN
1cb0: 45 5f 5f 2c 20 66 2c 20 23 78 2c 20 28 75 6e 73  E__, f, #x, (uns
1cc0: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 28 79 29 2c  igned long) (y),
1cd0: 20 62 75 66 5f 75 73 65 72 5f 70 72 69 6e 74 29   buf_user_print)
1ce0: 3b 20 5c 0a 09 66 66 6c 75 73 68 28 63 61 63 6b  ; \..fflush(cack
1cf0: 65 79 5f 64 65 62 75 67 5f 66 64 28 29 29 3b 20  ey_debug_fd()); 
1d00: 5c 0a 7d 0a 23 20 20 64 65 66 69 6e 65 20 66 72  \.}.#  define fr
1d10: 65 65 28 78 29 20 7b 20 43 41 43 4b 45 59 5f 44  ee(x) { CACKEY_D
1d20: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 52 45  EBUG_PRINTF("FRE
1d30: 45 28 25 70 29 20 28 25 73 29 22 2c 20 28 76 6f  E(%p) (%s)", (vo
1d40: 69 64 20 2a 29 20 78 2c 20 23 78 29 3b 20 66 72  id *) x, #x); fr
1d50: 65 65 28 78 29 3b 20 7d 0a 0a 73 74 61 74 69 63  ee(x); }..static
1d60: 20 46 49 4c 45 20 2a 63 61 63 6b 65 79 5f 64 65   FILE *cackey_de
1d70: 62 75 67 5f 66 64 28 76 6f 69 64 29 20 7b 0a 09  bug_fd(void) {..
1d80: 73 74 61 74 69 63 20 46 49 4c 45 20 2a 66 64 20  static FILE *fd 
1d90: 3d 20 4e 55 4c 4c 3b 0a 09 63 68 61 72 20 2a 6c  = NULL;..char *l
1da0: 6f 67 66 69 6c 65 3b 0a 0a 09 69 66 20 28 66 64  ogfile;...if (fd
1db0: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65   != NULL) {...re
1dc0: 74 75 72 6e 28 66 64 29 3b 0a 09 7d 0a 0a 09 2f  turn(fd);..}.../
1dd0: 2a 0a 09 20 2a 20 4c 6f 67 20 74 6f 20 73 74 64  *.. * Log to std
1de0: 65 72 72 20 69 6e 69 74 69 61 6c 6c 79 20 73 6f  err initially so
1df0: 20 77 65 20 63 61 6e 20 75 73 65 20 64 65 62 75   we can use debu
1e00: 67 67 69 6e 67 20 77 69 74 68 69 6e 0a 09 20 2a  gging within.. *
1e10: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   this function w
1e20: 69 74 68 6f 75 74 20 67 65 74 74 69 6e 67 20 69  ithout getting i
1e30: 6e 74 6f 20 61 6e 20 69 6e 66 69 6e 69 74 65 20  nto an infinite 
1e40: 6c 6f 6f 70 0a 09 20 2a 2f 0a 09 66 64 20 3d 20  loop.. */..fd = 
1e50: 73 74 64 65 72 72 3b 0a 0a 09 6c 6f 67 66 69 6c  stderr;...logfil
1e60: 65 20 3d 20 67 65 74 65 6e 76 28 22 43 41 43 4b  e = getenv("CACK
1e70: 45 59 5f 44 45 42 55 47 5f 4c 4f 47 46 49 4c 45  EY_DEBUG_LOGFILE
1e80: 22 29 3b 0a 09 69 66 20 28 6c 6f 67 66 69 6c 65  ");..if (logfile
1e90: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   != NULL) {...CA
1ea0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1eb0: 46 28 22 46 6f 75 6e 64 20 65 6e 76 69 72 6f 6e  F("Found environ
1ec0: 6d 65 6e 74 20 76 61 72 69 61 62 6c 65 3a 20 25  ment variable: %
1ed0: 73 22 2c 20 6c 6f 67 66 69 6c 65 29 3b 0a 0a 09  s", logfile);...
1ee0: 09 6c 6f 67 66 69 6c 65 20 3d 20 73 74 72 63 68  .logfile = strch
1ef0: 72 28 6c 6f 67 66 69 6c 65 2c 20 27 3d 27 29 3b  r(logfile, '=');
1f00: 0a 09 09 69 66 20 28 6c 6f 67 66 69 6c 65 20 3d  ...if (logfile =
1f10: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 6c 6f 67  = NULL) {....log
1f20: 66 69 6c 65 20 3d 20 67 65 74 65 6e 76 28 22 43  file = getenv("C
1f30: 41 43 4b 45 59 5f 44 45 42 55 47 5f 4c 4f 47 46  ACKEY_DEBUG_LOGF
1f40: 49 4c 45 22 29 3b 0a 09 09 7d 20 65 6c 73 65 20  ILE");...} else 
1f50: 7b 0a 09 09 09 6c 6f 67 66 69 6c 65 2b 2b 3b 0a  {....logfile++;.
1f60: 09 09 7d 0a 09 7d 0a 0a 23 69 66 64 65 66 20 43  ..}..}..#ifdef C
1f70: 41 43 4b 45 59 5f 44 45 42 55 47 5f 4c 4f 47 46  ACKEY_DEBUG_LOGF
1f80: 49 4c 45 0a 09 69 66 20 28 6c 6f 67 66 69 6c 65  ILE..if (logfile
1f90: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 6c 6f   == NULL) {...lo
1fa0: 67 66 69 6c 65 20 3d 20 43 41 43 4b 45 59 5f 44  gfile = CACKEY_D
1fb0: 45 42 55 47 5f 4c 4f 47 46 49 4c 45 3b 0a 09 7d  EBUG_LOGFILE;..}
1fc0: 0a 23 65 6e 64 69 66 0a 0a 09 69 66 20 28 6c 6f  .#endif...if (lo
1fd0: 67 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b  gfile != NULL) {
1fe0: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1ff0: 50 52 49 4e 54 46 28 22 46 6f 75 6e 64 20 6c 6f  PRINTF("Found lo
2000: 67 20 66 69 6c 65 3a 20 25 73 22 2c 20 6c 6f 67  g file: %s", log
2010: 66 69 6c 65 29 3b 0a 0a 09 09 66 64 20 3d 20 66  file);....fd = f
2020: 6f 70 65 6e 28 6c 6f 67 66 69 6c 65 2c 20 22 61  open(logfile, "a
2030: 22 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 66 64 20  ");..}...if (fd 
2040: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 66 64 20  == NULL) {...fd 
2050: 3d 20 73 74 64 65 72 72 3b 0a 09 7d 0a 0a 09 69  = stderr;..}...i
2060: 66 20 28 66 64 20 3d 3d 20 73 74 64 65 72 72 29  f (fd == stderr)
2070: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
2080: 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
2090: 69 6e 67 20 73 74 64 65 72 72 22 29 3b 0a 09 7d  ing stderr");..}
20a0: 20 65 6c 73 65 20 7b 0a 09 09 43 41 43 4b 45 59   else {...CACKEY
20b0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
20c0: 65 74 75 72 6e 69 6e 67 20 25 70 22 2c 20 28 76  eturning %p", (v
20d0: 6f 69 64 20 2a 29 20 66 64 29 3b 0a 09 7d 0a 0a  oid *) fd);..}..
20e0: 09 72 65 74 75 72 6e 28 66 64 29 3b 0a 7d 0a 0a  .return(fd);.}..
20f0: 73 74 61 74 69 63 20 76 6f 69 64 20 2a 43 41 43  static void *CAC
2100: 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 4d  KEY_DEBUG_FUNC_M
2110: 41 4c 4c 4f 43 28 73 69 7a 65 5f 74 20 73 69 7a  ALLOC(size_t siz
2120: 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 66  e, const char *f
2130: 75 6e 63 2c 20 69 6e 74 20 6c 69 6e 65 29 20 7b  unc, int line) {
2140: 0a 09 76 6f 69 64 20 2a 72 65 74 76 61 6c 3b 0a  ..void *retval;.
2150: 0a 09 72 65 74 76 61 6c 20 3d 20 6d 61 6c 6c 6f  ..retval = mallo
2160: 63 28 73 69 7a 65 29 3b 0a 0a 09 66 70 72 69 6e  c(size);...fprin
2170: 74 66 28 63 61 63 6b 65 79 5f 64 65 62 75 67 5f  tf(cackey_debug_
2180: 66 64 28 29 2c 20 22 5b 25 6c 75 5d 3a 20 25 73  fd(), "[%lu]: %s
2190: 28 29 3a 25 69 3a 20 4d 41 4c 4c 4f 43 28 29 20  ():%i: MALLOC() 
21a0: 3d 20 25 70 5c 6e 22 2c 20 43 41 43 4b 45 59 5f  = %p\n", CACKEY_
21b0: 44 45 42 55 47 5f 47 45 54 54 49 4d 45 28 29 2c  DEBUG_GETTIME(),
21c0: 20 66 75 6e 63 2c 20 6c 69 6e 65 2c 20 72 65 74   func, line, ret
21d0: 76 61 6c 29 3b 0a 09 66 66 6c 75 73 68 28 63 61  val);..fflush(ca
21e0: 63 6b 65 79 5f 64 65 62 75 67 5f 66 64 28 29 29  ckey_debug_fd())
21f0: 3b 0a 0a 09 72 65 74 75 72 6e 28 72 65 74 76 61  ;...return(retva
2200: 6c 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f  l);.}..static vo
2210: 69 64 20 2a 43 41 43 4b 45 59 5f 44 45 42 55 47  id *CACKEY_DEBUG
2220: 5f 46 55 4e 43 5f 52 45 41 4c 4c 4f 43 28 76 6f  _FUNC_REALLOC(vo
2230: 69 64 20 2a 70 74 72 2c 20 73 69 7a 65 5f 74 20  id *ptr, size_t 
2240: 73 69 7a 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  size, const char
2250: 20 2a 66 75 6e 63 2c 20 69 6e 74 20 6c 69 6e 65   *func, int line
2260: 29 20 7b 0a 09 76 6f 69 64 20 2a 72 65 74 76 61  ) {..void *retva
2270: 6c 3b 0a 0a 09 72 65 74 76 61 6c 20 3d 20 72 65  l;...retval = re
2280: 61 6c 6c 6f 63 28 70 74 72 2c 20 73 69 7a 65 29  alloc(ptr, size)
2290: 3b 0a 0a 09 69 66 20 28 72 65 74 76 61 6c 20 21  ;...if (retval !
22a0: 3d 20 70 74 72 29 20 7b 0a 09 09 66 70 72 69 6e  = ptr) {...fprin
22b0: 74 66 28 63 61 63 6b 65 79 5f 64 65 62 75 67 5f  tf(cackey_debug_
22c0: 66 64 28 29 2c 20 22 5b 25 6c 75 5d 3a 20 25 73  fd(), "[%lu]: %s
22d0: 28 29 3a 25 69 3a 20 52 45 41 4c 4c 4f 43 28 25  ():%i: REALLOC(%
22e0: 70 29 20 3d 20 25 70 5c 6e 22 2c 20 43 41 43 4b  p) = %p\n", CACK
22f0: 45 59 5f 44 45 42 55 47 5f 47 45 54 54 49 4d 45  EY_DEBUG_GETTIME
2300: 28 29 2c 20 66 75 6e 63 2c 20 6c 69 6e 65 2c 20  (), func, line, 
2310: 70 74 72 2c 20 72 65 74 76 61 6c 29 3b 0a 09 09  ptr, retval);...
2320: 66 66 6c 75 73 68 28 63 61 63 6b 65 79 5f 64 65  fflush(cackey_de
2330: 62 75 67 5f 66 64 28 29 29 3b 0a 09 7d 0a 0a 09  bug_fd());..}...
2340: 69 66 20 28 72 65 74 76 61 6c 20 3d 3d 20 4e 55  if (retval == NU
2350: 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
2360: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2a 2a  EBUG_PRINTF(" **
2370: 2a 20 45 52 52 4f 52 20 2a 2a 2a 20 72 65 61 6c  * ERROR *** real
2380: 6c 6f 63 20 72 65 74 75 72 6e 65 64 20 4e 55 4c  loc returned NUL
2390: 4c 20 28 73 69 7a 65 20 3d 20 25 6c 75 29 22 2c  L (size = %lu)",
23a0: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
23b0: 20 73 69 7a 65 29 3b 0a 09 7d 0a 0a 09 72 65 74   size);..}...ret
23c0: 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a  urn(retval);.}..
23d0: 73 74 61 74 69 63 20 63 68 61 72 20 2a 43 41 43  static char *CAC
23e0: 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53  KEY_DEBUG_FUNC_S
23f0: 54 52 44 55 50 28 63 6f 6e 73 74 20 63 68 61 72  TRDUP(const char
2400: 20 2a 70 74 72 2c 20 63 6f 6e 73 74 20 63 68 61   *ptr, const cha
2410: 72 20 2a 66 75 6e 63 2c 20 69 6e 74 20 6c 69 6e  r *func, int lin
2420: 65 29 20 7b 0a 09 63 68 61 72 20 2a 72 65 74 76  e) {..char *retv
2430: 61 6c 3b 0a 0a 09 72 65 74 76 61 6c 20 3d 20 73  al;...retval = s
2440: 74 72 64 75 70 28 70 74 72 29 3b 0a 0a 09 66 70  trdup(ptr);...fp
2450: 72 69 6e 74 66 28 63 61 63 6b 65 79 5f 64 65 62  rintf(cackey_deb
2460: 75 67 5f 66 64 28 29 2c 20 22 5b 25 6c 75 5d 3a  ug_fd(), "[%lu]:
2470: 20 25 73 28 29 3a 25 69 3a 20 53 54 52 44 55 50   %s():%i: STRDUP
2480: 5f 4d 41 4c 4c 4f 43 28 29 20 3d 20 25 70 5c 6e  _MALLOC() = %p\n
2490: 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ", CACKEY_DEBUG_
24a0: 47 45 54 54 49 4d 45 28 29 2c 20 66 75 6e 63 2c  GETTIME(), func,
24b0: 20 6c 69 6e 65 2c 20 72 65 74 76 61 6c 29 3b 0a   line, retval);.
24c0: 09 66 66 6c 75 73 68 28 63 61 63 6b 65 79 5f 64  .fflush(cackey_d
24d0: 65 62 75 67 5f 66 64 28 29 29 3b 0a 0a 09 72 65  ebug_fd());...re
24e0: 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a  turn(retval);.}.
24f0: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
2500: 61 72 20 2a 43 41 43 4b 45 59 5f 44 45 42 55 47  ar *CACKEY_DEBUG
2510: 5f 46 55 4e 43 5f 54 41 47 5f 54 4f 5f 53 54 52  _FUNC_TAG_TO_STR
2520: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 74  (unsigned char t
2530: 61 67 29 20 7b 0a 09 73 77 69 74 63 68 20 28 74  ag) {..switch (t
2540: 61 67 29 20 7b 0a 09 09 63 61 73 65 20 47 53 43  ag) {...case GSC
2550: 49 53 5f 54 41 47 5f 43 41 52 44 49 44 3a 0a 09  IS_TAG_CARDID:..
2560: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
2570: 54 41 47 5f 43 41 52 44 49 44 22 29 3b 0a 09 09  TAG_CARDID");...
2580: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43  case GSCIS_TAG_C
2590: 43 43 5f 56 45 52 3a 0a 09 09 09 72 65 74 75 72  CC_VER:....retur
25a0: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 43 43 43  n("GSCIS_TAG_CCC
25b0: 5f 56 45 52 22 29 3b 0a 09 09 63 61 73 65 20 47  _VER");...case G
25c0: 53 43 49 53 5f 54 41 47 5f 43 43 47 5f 56 45 52  SCIS_TAG_CCG_VER
25d0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
25e0: 49 53 5f 54 41 47 5f 43 43 47 5f 56 45 52 22 29  IS_TAG_CCG_VER")
25f0: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ;...case GSCIS_T
2600: 41 47 5f 43 41 52 44 55 52 4c 3a 0a 09 09 09 72  AG_CARDURL:....r
2610: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
2620: 5f 43 41 52 44 55 52 4c 22 29 3b 0a 09 09 63 61  _CARDURL");...ca
2630: 73 65 20 47 53 43 49 53 5f 54 41 47 5f 50 4b 43  se GSCIS_TAG_PKC
2640: 53 31 35 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  S15:....return("
2650: 47 53 43 49 53 5f 54 41 47 5f 50 4b 43 53 31 35  GSCIS_TAG_PKCS15
2660: 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53  ");...case GSCIS
2670: 5f 54 41 47 5f 52 45 47 5f 44 41 54 41 5f 4d 4f  _TAG_REG_DATA_MO
2680: 44 45 4c 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  DEL:....return("
2690: 47 53 43 49 53 5f 54 41 47 5f 52 45 47 5f 44 41  GSCIS_TAG_REG_DA
26a0: 54 41 5f 4d 4f 44 45 4c 22 29 3b 0a 09 09 63 61  TA_MODEL");...ca
26b0: 73 65 20 47 53 43 49 53 5f 54 41 47 5f 41 43 52  se GSCIS_TAG_ACR
26c0: 5f 54 41 42 4c 45 3a 0a 09 09 09 72 65 74 75 72  _TABLE:....retur
26d0: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 41 43 52  n("GSCIS_TAG_ACR
26e0: 5f 54 41 42 4c 45 22 29 3b 0a 09 09 63 61 73 65  _TABLE");...case
26f0: 20 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44 5f   GSCIS_TAG_CARD_
2700: 41 50 44 55 3a 0a 09 09 09 72 65 74 75 72 6e 28  APDU:....return(
2710: 22 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44 5f  "GSCIS_TAG_CARD_
2720: 41 50 44 55 22 29 3b 0a 09 09 63 61 73 65 20 47  APDU");...case G
2730: 53 43 49 53 5f 54 41 47 5f 52 45 44 49 52 45 43  SCIS_TAG_REDIREC
2740: 54 49 4f 4e 3a 0a 09 09 09 72 65 74 75 72 6e 28  TION:....return(
2750: 22 47 53 43 49 53 5f 54 41 47 5f 52 45 44 49 52  "GSCIS_TAG_REDIR
2760: 45 43 54 49 4f 4e 22 29 3b 0a 09 09 63 61 73 65  ECTION");...case
2770: 20 47 53 43 49 53 5f 54 41 47 5f 43 54 3a 0a 09   GSCIS_TAG_CT:..
2780: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
2790: 54 41 47 5f 43 54 22 29 3b 0a 09 09 63 61 73 65  TAG_CT");...case
27a0: 20 47 53 43 49 53 5f 54 41 47 5f 53 54 3a 0a 09   GSCIS_TAG_ST:..
27b0: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
27c0: 54 41 47 5f 53 54 22 29 3b 0a 09 09 63 61 73 65  TAG_ST");...case
27d0: 20 47 53 43 49 53 5f 54 41 47 5f 4e 45 58 54 43   GSCIS_TAG_NEXTC
27e0: 43 43 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47  CC:....return("G
27f0: 53 43 49 53 5f 54 41 47 5f 4e 45 58 54 43 43 43  SCIS_TAG_NEXTCCC
2800: 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53  ");...case GSCIS
2810: 5f 54 41 47 5f 46 4e 41 4d 45 3a 0a 09 09 09 72  _TAG_FNAME:....r
2820: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
2830: 5f 46 4e 41 4d 45 22 29 3b 0a 09 09 63 61 73 65  _FNAME");...case
2840: 20 47 53 43 49 53 5f 54 41 47 5f 4d 4e 41 4d 45   GSCIS_TAG_MNAME
2850: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
2860: 49 53 5f 54 41 47 5f 4d 4e 41 4d 45 22 29 3b 0a  IS_TAG_MNAME");.
2870: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47  ..case GSCIS_TAG
2880: 5f 4c 4e 41 4d 45 3a 0a 09 09 09 72 65 74 75 72  _LNAME:....retur
2890: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4c 4e 41  n("GSCIS_TAG_LNA
28a0: 4d 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43  ME");...case GSC
28b0: 49 53 5f 54 41 47 5f 53 55 46 46 49 58 3a 0a 09  IS_TAG_SUFFIX:..
28c0: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
28d0: 54 41 47 5f 53 55 46 46 49 58 22 29 3b 0a 09 09  TAG_SUFFIX");...
28e0: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 47  case GSCIS_TAG_G
28f0: 4f 56 54 5f 41 47 45 4e 43 59 3a 0a 09 09 09 72  OVT_AGENCY:....r
2900: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
2910: 5f 47 4f 56 54 5f 41 47 45 4e 43 59 22 29 3b 0a  _GOVT_AGENCY");.
2920: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47  ..case GSCIS_TAG
2930: 5f 42 55 52 45 41 55 3a 0a 09 09 09 72 65 74 75  _BUREAU:....retu
2940: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 42 55  rn("GSCIS_TAG_BU
2950: 52 45 41 55 22 29 3b 0a 09 09 63 61 73 65 20 47  REAU");...case G
2960: 53 43 49 53 5f 54 41 47 5f 42 55 52 45 41 55 5f  SCIS_TAG_BUREAU_
2970: 43 4f 44 45 3a 0a 09 09 09 72 65 74 75 72 6e 28  CODE:....return(
2980: 22 47 53 43 49 53 5f 54 41 47 5f 42 55 52 45 41  "GSCIS_TAG_BUREA
2990: 55 5f 43 4f 44 45 22 29 3b 0a 09 09 63 61 73 65  U_CODE");...case
29a0: 20 47 53 43 49 53 5f 54 41 47 5f 44 45 50 54 5f   GSCIS_TAG_DEPT_
29b0: 43 4f 44 45 3a 0a 09 09 09 72 65 74 75 72 6e 28  CODE:....return(
29c0: 22 47 53 43 49 53 5f 54 41 47 5f 44 45 50 54 5f  "GSCIS_TAG_DEPT_
29d0: 43 4f 44 45 22 29 3b 0a 09 09 63 61 73 65 20 47  CODE");...case G
29e0: 53 43 49 53 5f 54 41 47 5f 54 49 54 4c 45 3a 0a  SCIS_TAG_TITLE:.
29f0: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
2a00: 5f 54 41 47 5f 54 49 54 4c 45 22 29 3b 0a 09 09  _TAG_TITLE");...
2a10: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 42  case GSCIS_TAG_B
2a20: 55 49 4c 44 49 4e 47 3a 0a 09 09 09 72 65 74 75  UILDING:....retu
2a30: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 42 55  rn("GSCIS_TAG_BU
2a40: 49 4c 44 49 4e 47 22 29 3b 0a 09 09 63 61 73 65  ILDING");...case
2a50: 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43   GSCIS_TAG_OFFIC
2a60: 45 5f 41 44 44 52 31 3a 0a 09 09 09 72 65 74 75  E_ADDR1:....retu
2a70: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4f 46  rn("GSCIS_TAG_OF
2a80: 46 49 43 45 5f 41 44 44 52 31 22 29 3b 0a 09 09  FICE_ADDR1");...
2a90: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4f  case GSCIS_TAG_O
2aa0: 46 46 49 43 45 5f 41 44 44 52 32 3a 0a 09 09 09  FFICE_ADDR2:....
2ab0: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
2ac0: 47 5f 4f 46 46 49 43 45 5f 41 44 44 52 32 22 29  G_OFFICE_ADDR2")
2ad0: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ;...case GSCIS_T
2ae0: 41 47 5f 4f 46 46 49 43 45 5f 43 49 54 59 3a 0a  AG_OFFICE_CITY:.
2af0: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
2b00: 5f 54 41 47 5f 4f 46 46 49 43 45 5f 43 49 54 59  _TAG_OFFICE_CITY
2b10: 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53  ");...case GSCIS
2b20: 5f 54 41 47 5f 4f 46 46 49 43 45 5f 53 54 41 54  _TAG_OFFICE_STAT
2b30: 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  E:....return("GS
2b40: 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 53  CIS_TAG_OFFICE_S
2b50: 54 41 54 45 22 29 3b 0a 09 09 63 61 73 65 20 47  TATE");...case G
2b60: 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f  SCIS_TAG_OFFICE_
2b70: 5a 49 50 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ZIP:....return("
2b80: 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45  GSCIS_TAG_OFFICE
2b90: 5f 5a 49 50 22 29 3b 0a 09 09 63 61 73 65 20 47  _ZIP");...case G
2ba0: 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f  SCIS_TAG_OFFICE_
2bb0: 43 4f 55 4e 54 52 59 3a 0a 09 09 09 72 65 74 75  COUNTRY:....retu
2bc0: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4f 46  rn("GSCIS_TAG_OF
2bd0: 46 49 43 45 5f 43 4f 55 4e 54 52 59 22 29 3b 0a  FICE_COUNTRY");.
2be0: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47  ..case GSCIS_TAG
2bf0: 5f 4f 46 46 49 43 45 5f 50 48 4f 4e 45 3a 0a 09  _OFFICE_PHONE:..
2c00: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
2c10: 54 41 47 5f 4f 46 46 49 43 45 5f 50 48 4f 4e 45  TAG_OFFICE_PHONE
2c20: 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53  ");...case GSCIS
2c30: 5f 54 41 47 5f 4f 46 46 49 43 45 5f 50 48 4f 4e  _TAG_OFFICE_PHON
2c40: 45 5f 45 58 54 3a 0a 09 09 09 72 65 74 75 72 6e  E_EXT:....return
2c50: 28 22 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49  ("GSCIS_TAG_OFFI
2c60: 43 45 5f 50 48 4f 4e 45 5f 45 58 54 22 29 3b 0a  CE_PHONE_EXT");.
2c70: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47  ..case GSCIS_TAG
2c80: 5f 4f 46 46 49 43 45 5f 46 41 58 3a 0a 09 09 09  _OFFICE_FAX:....
2c90: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
2ca0: 47 5f 4f 46 46 49 43 45 5f 46 41 58 22 29 3b 0a  G_OFFICE_FAX");.
2cb0: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47  ..case GSCIS_TAG
2cc0: 5f 4f 46 46 49 43 45 5f 45 4d 41 49 4c 3a 0a 09  _OFFICE_EMAIL:..
2cd0: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
2ce0: 54 41 47 5f 4f 46 46 49 43 45 5f 45 4d 41 49 4c  TAG_OFFICE_EMAIL
2cf0: 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53  ");...case GSCIS
2d00: 5f 54 41 47 5f 4f 46 46 49 43 45 5f 52 4f 4f 4d  _TAG_OFFICE_ROOM
2d10: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
2d20: 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 52 4f  IS_TAG_OFFICE_RO
2d30: 4f 4d 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43  OM");...case GSC
2d40: 49 53 5f 54 41 47 5f 4e 4f 4e 47 4f 56 5f 41 47  IS_TAG_NONGOV_AG
2d50: 45 4e 43 59 3a 0a 09 09 09 72 65 74 75 72 6e 28  ENCY:....return(
2d60: 22 47 53 43 49 53 5f 54 41 47 5f 4e 4f 4e 47 4f  "GSCIS_TAG_NONGO
2d70: 56 5f 41 47 45 4e 43 59 22 29 3b 0a 09 09 63 61  V_AGENCY");...ca
2d80: 73 65 20 47 53 43 49 53 5f 54 41 47 5f 53 53 4e  se GSCIS_TAG_SSN
2d90: 5f 44 45 53 49 47 4e 41 54 4f 52 3a 0a 09 09 09  _DESIGNATOR:....
2da0: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
2db0: 47 5f 53 53 4e 5f 44 45 53 49 47 4e 41 54 4f 52  G_SSN_DESIGNATOR
2dc0: 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53  ");...case GSCIS
2dd0: 5f 54 41 47 5f 53 53 4e 3a 0a 09 09 09 72 65 74  _TAG_SSN:....ret
2de0: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 53  urn("GSCIS_TAG_S
2df0: 53 4e 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43  SN");...case GSC
2e00: 49 53 5f 54 41 47 5f 44 4f 42 3a 0a 09 09 09 72  IS_TAG_DOB:....r
2e10: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
2e20: 5f 44 4f 42 22 29 3b 0a 09 09 63 61 73 65 20 47  _DOB");...case G
2e30: 53 43 49 53 5f 54 41 47 5f 47 45 4e 44 45 52 3a  SCIS_TAG_GENDER:
2e40: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49  ....return("GSCI
2e50: 53 5f 54 41 47 5f 47 45 4e 44 45 52 22 29 3b 0a  S_TAG_GENDER");.
2e60: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47  ..case GSCIS_TAG
2e70: 5f 55 53 45 52 49 44 3a 0a 09 09 09 72 65 74 75  _USERID:....retu
2e80: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 55 53  rn("GSCIS_TAG_US
2e90: 45 52 49 44 22 29 3b 0a 09 09 63 61 73 65 20 47  ERID");...case G
2ea0: 53 43 49 53 5f 54 41 47 5f 44 4f 4d 41 49 4e 3a  SCIS_TAG_DOMAIN:
2eb0: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49  ....return("GSCI
2ec0: 53 5f 54 41 47 5f 44 4f 4d 41 49 4e 22 29 3b 0a  S_TAG_DOMAIN");.
2ed0: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47  ..case GSCIS_TAG
2ee0: 5f 50 41 53 53 57 4f 52 44 3a 0a 09 09 09 72 65  _PASSWORD:....re
2ef0: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
2f00: 50 41 53 53 57 4f 52 44 22 29 3b 0a 09 09 63 61  PASSWORD");...ca
2f10: 73 65 20 47 53 43 49 53 5f 54 41 47 5f 49 53 53  se GSCIS_TAG_ISS
2f20: 55 45 52 49 44 3a 0a 09 09 09 72 65 74 75 72 6e  UERID:....return
2f30: 28 22 47 53 43 49 53 5f 54 41 47 5f 49 53 53 55  ("GSCIS_TAG_ISSU
2f40: 45 52 49 44 22 29 3b 0a 09 09 63 61 73 65 20 47  ERID");...case G
2f50: 53 43 49 53 5f 54 41 47 5f 53 45 52 4e 4f 3a 0a  SCIS_TAG_SERNO:.
2f60: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
2f70: 5f 54 41 47 5f 53 45 52 4e 4f 22 29 3b 0a 09 09  _TAG_SERNO");...
2f80: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 49  case GSCIS_TAG_I
2f90: 53 53 55 45 5f 44 41 54 45 3a 0a 09 09 09 72 65  SSUE_DATE:....re
2fa0: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
2fb0: 49 53 53 55 45 5f 44 41 54 45 22 29 3b 0a 09 09  ISSUE_DATE");...
2fc0: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 45  case GSCIS_TAG_E
2fd0: 58 50 49 52 45 5f 44 41 54 45 3a 0a 09 09 09 72  XPIRE_DATE:....r
2fe0: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
2ff0: 5f 45 58 50 49 52 45 5f 44 41 54 45 22 29 3b 0a  _EXPIRE_DATE");.
3000: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47  ..case GSCIS_TAG
3010: 5f 43 41 52 44 5f 54 59 50 45 3a 0a 09 09 09 72  _CARD_TYPE:....r
3020: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
3030: 5f 43 41 52 44 5f 54 59 50 45 22 29 3b 0a 09 09  _CARD_TYPE");...
3040: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 53  case GSCIS_TAG_S
3050: 45 43 55 52 49 54 59 5f 43 4f 44 45 3a 0a 09 09  ECURITY_CODE:...
3060: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
3070: 41 47 5f 53 45 43 55 52 49 54 59 5f 43 4f 44 45  AG_SECURITY_CODE
3080: 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53  ");...case GSCIS
3090: 5f 54 41 47 5f 43 41 52 44 49 44 5f 41 49 44 3a  _TAG_CARDID_AID:
30a0: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49  ....return("GSCI
30b0: 53 5f 54 41 47 5f 43 41 52 44 49 44 5f 41 49 44  S_TAG_CARDID_AID
30c0: 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53  ");...case GSCIS
30d0: 5f 54 41 47 5f 43 45 52 54 49 46 49 43 41 54 45  _TAG_CERTIFICATE
30e0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
30f0: 49 53 5f 54 41 47 5f 43 45 52 54 49 46 49 43 41  IS_TAG_CERTIFICA
3100: 54 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43  TE");...case GSC
3110: 49 53 5f 54 41 47 5f 43 45 52 54 5f 49 53 53 55  IS_TAG_CERT_ISSU
3120: 45 5f 44 41 54 45 3a 0a 09 09 09 72 65 74 75 72  E_DATE:....retur
3130: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 43 45 52  n("GSCIS_TAG_CER
3140: 54 5f 49 53 53 55 45 5f 44 41 54 45 22 29 3b 0a  T_ISSUE_DATE");.
3150: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47  ..case GSCIS_TAG
3160: 5f 43 45 52 54 5f 45 58 50 49 52 45 5f 44 41 54  _CERT_EXPIRE_DAT
3170: 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  E:....return("GS
3180: 43 49 53 5f 54 41 47 5f 43 45 52 54 5f 45 58 50  CIS_TAG_CERT_EXP
3190: 49 52 45 5f 44 41 54 45 22 29 3b 0a 09 7d 0a 0a  IRE_DATE");..}..
31a0: 09 72 65 74 75 72 6e 28 22 55 4e 4b 4e 4f 57 4e  .return("UNKNOWN
31b0: 22 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 63 6f  ");.}..static co
31c0: 6e 73 74 20 63 68 61 72 20 2a 43 41 43 4b 45 59  nst char *CACKEY
31d0: 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52  _DEBUG_FUNC_SCAR
31e0: 44 45 52 52 5f 54 4f 5f 53 54 52 28 4c 4f 4e 47  DERR_TO_STR(LONG
31f0: 20 72 65 74 63 6f 64 65 29 20 7b 0a 09 73 77 69   retcode) {..swi
3200: 74 63 68 20 28 72 65 74 63 6f 64 65 29 20 7b 0a  tch (retcode) {.
3210: 09 09 63 61 73 65 20 53 43 41 52 44 5f 53 5f 53  ..case SCARD_S_S
3220: 55 43 43 45 53 53 3a 0a 09 09 09 72 65 74 75 72  UCCESS:....retur
3230: 6e 28 22 53 43 41 52 44 5f 53 5f 53 55 43 43 45  n("SCARD_S_SUCCE
3240: 53 53 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41  SS");...case SCA
3250: 52 44 5f 45 5f 43 41 4e 43 45 4c 4c 45 44 3a 0a  RD_E_CANCELLED:.
3260: 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44  ...return("SCARD
3270: 5f 45 5f 43 41 4e 43 45 4c 4c 45 44 22 29 3b 0a  _E_CANCELLED");.
3280: 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 43  ..case SCARD_E_C
3290: 41 4e 54 5f 44 49 53 50 4f 53 45 3a 0a 09 09 09  ANT_DISPOSE:....
32a0: 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f  return("SCARD_E_
32b0: 43 41 4e 54 5f 44 49 53 50 4f 53 45 22 29 3b 0a  CANT_DISPOSE");.
32c0: 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 49  ..case SCARD_E_I
32d0: 4e 53 55 46 46 49 43 49 45 4e 54 5f 42 55 46 46  NSUFFICIENT_BUFF
32e0: 45 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53  ER:....return("S
32f0: 43 41 52 44 5f 45 5f 49 4e 53 55 46 46 49 43 49  CARD_E_INSUFFICI
3300: 45 4e 54 5f 42 55 46 46 45 52 22 29 3b 0a 09 09  ENT_BUFFER");...
3310: 63 61 73 65 20 53 43 41 52 44 5f 45 5f 49 4e 56  case SCARD_E_INV
3320: 41 4c 49 44 5f 41 54 52 3a 0a 09 09 09 72 65 74  ALID_ATR:....ret
3330: 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 49 4e 56  urn("SCARD_E_INV
3340: 41 4c 49 44 5f 41 54 52 22 29 3b 0a 09 09 63 61  ALID_ATR");...ca
3350: 73 65 20 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c  se SCARD_E_INVAL
3360: 49 44 5f 48 41 4e 44 4c 45 3a 0a 09 09 09 72 65  ID_HANDLE:....re
3370: 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 49 4e  turn("SCARD_E_IN
3380: 56 41 4c 49 44 5f 48 41 4e 44 4c 45 22 29 3b 0a  VALID_HANDLE");.
3390: 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 49  ..case SCARD_E_I
33a0: 4e 56 41 4c 49 44 5f 50 41 52 41 4d 45 54 45 52  NVALID_PARAMETER
33b0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41  :....return("SCA
33c0: 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 50 41 52  RD_E_INVALID_PAR
33d0: 41 4d 45 54 45 52 22 29 3b 0a 09 09 63 61 73 65  AMETER");...case
33e0: 20 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44   SCARD_E_INVALID
33f0: 5f 54 41 52 47 45 54 3a 0a 09 09 09 72 65 74 75  _TARGET:....retu
3400: 72 6e 28 22 53 43 41 52 44 5f 45 5f 49 4e 56 41  rn("SCARD_E_INVA
3410: 4c 49 44 5f 54 41 52 47 45 54 22 29 3b 0a 09 09  LID_TARGET");...
3420: 63 61 73 65 20 53 43 41 52 44 5f 45 5f 49 4e 56  case SCARD_E_INV
3430: 41 4c 49 44 5f 56 41 4c 55 45 3a 0a 09 09 09 72  ALID_VALUE:....r
3440: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 49  eturn("SCARD_E_I
3450: 4e 56 41 4c 49 44 5f 56 41 4c 55 45 22 29 3b 0a  NVALID_VALUE");.
3460: 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 4e  ..case SCARD_E_N
3470: 4f 5f 4d 45 4d 4f 52 59 3a 0a 09 09 09 72 65 74  O_MEMORY:....ret
3480: 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 4e 4f 5f  urn("SCARD_E_NO_
3490: 4d 45 4d 4f 52 59 22 29 3b 0a 09 09 63 61 73 65  MEMORY");...case
34a0: 20 53 43 41 52 44 5f 45 5f 55 4e 4b 4e 4f 57 4e   SCARD_E_UNKNOWN
34b0: 5f 52 45 41 44 45 52 3a 0a 09 09 09 72 65 74 75  _READER:....retu
34c0: 72 6e 28 22 53 43 41 52 44 5f 45 5f 55 4e 4b 4e  rn("SCARD_E_UNKN
34d0: 4f 57 4e 5f 52 45 41 44 45 52 22 29 3b 0a 09 09  OWN_READER");...
34e0: 63 61 73 65 20 53 43 41 52 44 5f 45 5f 54 49 4d  case SCARD_E_TIM
34f0: 45 4f 55 54 3a 0a 09 09 09 72 65 74 75 72 6e 28  EOUT:....return(
3500: 22 53 43 41 52 44 5f 45 5f 54 49 4d 45 4f 55 54  "SCARD_E_TIMEOUT
3510: 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44  ");...case SCARD
3520: 5f 45 5f 53 48 41 52 49 4e 47 5f 56 49 4f 4c 41  _E_SHARING_VIOLA
3530: 54 49 4f 4e 3a 0a 09 09 09 72 65 74 75 72 6e 28  TION:....return(
3540: 22 53 43 41 52 44 5f 45 5f 53 48 41 52 49 4e 47  "SCARD_E_SHARING
3550: 5f 56 49 4f 4c 41 54 49 4f 4e 22 29 3b 0a 09 09  _VIOLATION");...
3560: 63 61 73 65 20 53 43 41 52 44 5f 45 5f 4e 4f 5f  case SCARD_E_NO_
3570: 53 4d 41 52 54 43 41 52 44 3a 0a 09 09 09 72 65  SMARTCARD:....re
3580: 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 4e 4f  turn("SCARD_E_NO
3590: 5f 53 4d 41 52 54 43 41 52 44 22 29 3b 0a 09 09  _SMARTCARD");...
35a0: 63 61 73 65 20 53 43 41 52 44 5f 45 5f 55 4e 4b  case SCARD_E_UNK
35b0: 4e 4f 57 4e 5f 43 41 52 44 3a 0a 09 09 09 72 65  NOWN_CARD:....re
35c0: 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 55 4e  turn("SCARD_E_UN
35d0: 4b 4e 4f 57 4e 5f 43 41 52 44 22 29 3b 0a 09 09  KNOWN_CARD");...
35e0: 63 61 73 65 20 53 43 41 52 44 5f 45 5f 50 52 4f  case SCARD_E_PRO
35f0: 54 4f 5f 4d 49 53 4d 41 54 43 48 3a 0a 09 09 09  TO_MISMATCH:....
3600: 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f  return("SCARD_E_
3610: 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 22 29  PROTO_MISMATCH")
3620: 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45  ;...case SCARD_E
3630: 5f 4e 4f 54 5f 52 45 41 44 59 3a 0a 09 09 09 72  _NOT_READY:....r
3640: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 4e  eturn("SCARD_E_N
3650: 4f 54 5f 52 45 41 44 59 22 29 3b 0a 09 09 63 61  OT_READY");...ca
3660: 73 65 20 53 43 41 52 44 5f 45 5f 53 59 53 54 45  se SCARD_E_SYSTE
3670: 4d 5f 43 41 4e 43 45 4c 4c 45 44 3a 0a 09 09 09  M_CANCELLED:....
3680: 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f  return("SCARD_E_
3690: 53 59 53 54 45 4d 5f 43 41 4e 43 45 4c 4c 45 44  SYSTEM_CANCELLED
36a0: 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44  ");...case SCARD
36b0: 5f 45 5f 4e 4f 54 5f 54 52 41 4e 53 41 43 54 45  _E_NOT_TRANSACTE
36c0: 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43  D:....return("SC
36d0: 41 52 44 5f 45 5f 4e 4f 54 5f 54 52 41 4e 53 41  ARD_E_NOT_TRANSA
36e0: 43 54 45 44 22 29 3b 0a 09 09 63 61 73 65 20 53  CTED");...case S
36f0: 43 41 52 44 5f 45 5f 52 45 41 44 45 52 5f 55 4e  CARD_E_READER_UN
3700: 41 56 41 49 4c 41 42 4c 45 3a 0a 09 09 09 72 65  AVAILABLE:....re
3710: 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 52 45  turn("SCARD_E_RE
3720: 41 44 45 52 5f 55 4e 41 56 41 49 4c 41 42 4c 45  ADER_UNAVAILABLE
3730: 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44  ");...case SCARD
3740: 5f 57 5f 55 4e 53 55 50 50 4f 52 54 45 44 5f 43  _W_UNSUPPORTED_C
3750: 41 52 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ARD:....return("
3760: 53 43 41 52 44 5f 57 5f 55 4e 53 55 50 50 4f 52  SCARD_W_UNSUPPOR
3770: 54 45 44 5f 43 41 52 44 22 29 3b 0a 09 09 63 61  TED_CARD");...ca
3780: 73 65 20 53 43 41 52 44 5f 57 5f 55 4e 52 45 53  se SCARD_W_UNRES
3790: 50 4f 4e 53 49 56 45 5f 43 41 52 44 3a 0a 09 09  PONSIVE_CARD:...
37a0: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 57  .return("SCARD_W
37b0: 5f 55 4e 52 45 53 50 4f 4e 53 49 56 45 5f 43 41  _UNRESPONSIVE_CA
37c0: 52 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41  RD");...case SCA
37d0: 52 44 5f 57 5f 55 4e 50 4f 57 45 52 45 44 5f 43  RD_W_UNPOWERED_C
37e0: 41 52 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ARD:....return("
37f0: 53 43 41 52 44 5f 57 5f 55 4e 50 4f 57 45 52 45  SCARD_W_UNPOWERE
3800: 44 5f 43 41 52 44 22 29 3b 0a 09 09 63 61 73 65  D_CARD");...case
3810: 20 53 43 41 52 44 5f 57 5f 52 45 53 45 54 5f 43   SCARD_W_RESET_C
3820: 41 52 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ARD:....return("
3830: 53 43 41 52 44 5f 57 5f 52 45 53 45 54 5f 43 41  SCARD_W_RESET_CA
3840: 52 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41  RD");...case SCA
3850: 52 44 5f 57 5f 52 45 4d 4f 56 45 44 5f 43 41 52  RD_W_REMOVED_CAR
3860: 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43  D:....return("SC
3870: 41 52 44 5f 57 5f 52 45 4d 4f 56 45 44 5f 43 41  ARD_W_REMOVED_CA
3880: 52 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41  RD");...case SCA
3890: 52 44 5f 45 5f 50 43 49 5f 54 4f 4f 5f 53 4d 41  RD_E_PCI_TOO_SMA
38a0: 4c 4c 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53  LL:....return("S
38b0: 43 41 52 44 5f 45 5f 50 43 49 5f 54 4f 4f 5f 53  CARD_E_PCI_TOO_S
38c0: 4d 41 4c 4c 22 29 3b 0a 09 09 63 61 73 65 20 53  MALL");...case S
38d0: 43 41 52 44 5f 45 5f 52 45 41 44 45 52 5f 55 4e  CARD_E_READER_UN
38e0: 53 55 50 50 4f 52 54 45 44 3a 0a 09 09 09 72 65  SUPPORTED:....re
38f0: 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 52 45  turn("SCARD_E_RE
3900: 41 44 45 52 5f 55 4e 53 55 50 50 4f 52 54 45 44  ADER_UNSUPPORTED
3910: 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44  ");...case SCARD
3920: 5f 45 5f 44 55 50 4c 49 43 41 54 45 5f 52 45 41  _E_DUPLICATE_REA
3930: 44 45 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  DER:....return("
3940: 53 43 41 52 44 5f 45 5f 44 55 50 4c 49 43 41 54  SCARD_E_DUPLICAT
3950: 45 5f 52 45 41 44 45 52 22 29 3b 0a 09 09 63 61  E_READER");...ca
3960: 73 65 20 53 43 41 52 44 5f 45 5f 43 41 52 44 5f  se SCARD_E_CARD_
3970: 55 4e 53 55 50 50 4f 52 54 45 44 3a 0a 09 09 09  UNSUPPORTED:....
3980: 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f  return("SCARD_E_
3990: 43 41 52 44 5f 55 4e 53 55 50 50 4f 52 54 45 44  CARD_UNSUPPORTED
39a0: 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44  ");...case SCARD
39b0: 5f 45 5f 4e 4f 5f 53 45 52 56 49 43 45 3a 0a 09  _E_NO_SERVICE:..
39c0: 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f  ..return("SCARD_
39d0: 45 5f 4e 4f 5f 53 45 52 56 49 43 45 22 29 3b 0a  E_NO_SERVICE");.
39e0: 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 53  ..case SCARD_E_S
39f0: 45 52 56 49 43 45 5f 53 54 4f 50 50 45 44 3a 0a  ERVICE_STOPPED:.
3a00: 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44  ...return("SCARD
3a10: 5f 45 5f 53 45 52 56 49 43 45 5f 53 54 4f 50 50  _E_SERVICE_STOPP
3a20: 45 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41  ED");...case SCA
3a30: 52 44 5f 45 5f 55 4e 53 55 50 50 4f 52 54 45 44  RD_E_UNSUPPORTED
3a40: 5f 46 45 41 54 55 52 45 3a 0a 09 09 09 72 65 74  _FEATURE:....ret
3a50: 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 55 4e 53  urn("SCARD_E_UNS
3a60: 55 50 50 4f 52 54 45 44 5f 46 45 41 54 55 52 45  UPPORTED_FEATURE
3a70: 22 29 3b 0a 23 69 66 64 65 66 20 53 43 41 52 44  ");.#ifdef SCARD
3a80: 5f 57 5f 49 4e 53 45 52 54 45 44 5f 43 41 52 44  _W_INSERTED_CARD
3a90: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 57 5f  ...case SCARD_W_
3aa0: 49 4e 53 45 52 54 45 44 5f 43 41 52 44 3a 0a 09  INSERTED_CARD:..
3ab0: 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f  ..return("SCARD_
3ac0: 57 5f 49 4e 53 45 52 54 45 44 5f 43 41 52 44 22  W_INSERTED_CARD"
3ad0: 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  );.#endif.#ifdef
3ae0: 20 53 43 41 52 44 5f 45 5f 4e 4f 5f 52 45 41 44   SCARD_E_NO_READ
3af0: 45 52 53 5f 41 56 41 49 4c 41 42 4c 45 0a 09 09  ERS_AVAILABLE...
3b00: 63 61 73 65 20 53 43 41 52 44 5f 45 5f 4e 4f 5f  case SCARD_E_NO_
3b10: 52 45 41 44 45 52 53 5f 41 56 41 49 4c 41 42 4c  READERS_AVAILABL
3b20: 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43  E:....return("SC
3b30: 41 52 44 5f 45 5f 4e 4f 5f 52 45 41 44 45 52 53  ARD_E_NO_READERS
3b40: 5f 41 56 41 49 4c 41 42 4c 45 22 29 3b 0a 23 65  _AVAILABLE");.#e
3b50: 6e 64 69 66 0a 09 7d 0a 0a 09 72 65 74 75 72 6e  ndif..}...return
3b60: 28 22 55 4e 4b 4e 4f 57 4e 22 29 3b 0a 7d 0a 0a  ("UNKNOWN");.}..
3b70: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
3b80: 72 20 2a 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  r *CACKEY_DEBUG_
3b90: 46 55 4e 43 5f 4f 42 4a 49 44 5f 54 4f 5f 53 54  FUNC_OBJID_TO_ST
3ba0: 52 28 75 69 6e 74 31 36 5f 74 20 6f 62 6a 69 64  R(uint16_t objid
3bb0: 29 20 7b 0a 09 73 77 69 74 63 68 20 28 6f 62 6a  ) {..switch (obj
3bc0: 69 64 29 20 7b 0a 09 09 63 61 73 65 20 30 78 32  id) {...case 0x2
3bd0: 30 30 30 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  000:....return("
3be0: 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44  CACKEY_TLV_OBJID
3bf0: 5f 47 45 4e 45 52 41 4c 49 4e 46 4f 22 29 3b 0a  _GENERALINFO");.
3c00: 09 09 63 61 73 65 20 30 78 32 31 30 30 3a 0a 09  ..case 0x2100:..
3c10: 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59  ..return("CACKEY
3c20: 5f 54 4c 56 5f 4f 42 4a 49 44 5f 50 52 4f 50 45  _TLV_OBJID_PROPE
3c30: 52 53 4f 4e 41 4c 49 4e 46 4f 22 29 3b 0a 09 09  RSONALINFO");...
3c40: 63 61 73 65 20 30 78 33 30 30 30 3a 0a 09 09 09  case 0x3000:....
3c50: 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54  return("CACKEY_T
3c60: 4c 56 5f 4f 42 4a 49 44 5f 41 43 43 45 53 53 43  LV_OBJID_ACCESSC
3c70: 4f 4e 54 52 4f 4c 22 29 3b 0a 09 09 63 61 73 65  ONTROL");...case
3c80: 20 30 78 34 30 30 30 3a 0a 09 09 09 72 65 74 75   0x4000:....retu
3c90: 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f  rn("CACKEY_TLV_O
3ca0: 42 4a 49 44 5f 4c 4f 47 49 4e 22 29 3b 0a 09 09  BJID_LOGIN");...
3cb0: 63 61 73 65 20 30 78 35 30 30 30 3a 0a 09 09 09  case 0x5000:....
3cc0: 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54  return("CACKEY_T
3cd0: 4c 56 5f 4f 42 4a 49 44 5f 43 41 52 44 49 4e 46  LV_OBJID_CARDINF
3ce0: 4f 22 29 3b 0a 09 09 63 61 73 65 20 30 78 36 30  O");...case 0x60
3cf0: 30 30 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  00:....return("C
3d00: 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f  ACKEY_TLV_OBJID_
3d10: 42 49 4f 4d 45 54 52 49 43 53 22 29 3b 0a 09 09  BIOMETRICS");...
3d20: 63 61 73 65 20 30 78 37 30 30 30 3a 0a 09 09 09  case 0x7000:....
3d30: 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54  return("CACKEY_T
3d40: 4c 56 5f 4f 42 4a 49 44 5f 44 49 47 49 54 41 4c  LV_OBJID_DIGITAL
3d50: 53 49 47 43 45 52 54 22 29 3b 0a 09 09 63 61 73  SIGCERT");...cas
3d60: 65 20 30 78 30 32 30 30 3a 0a 09 09 09 72 65 74  e 0x0200:....ret
3d70: 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f  urn("CACKEY_TLV_
3d80: 4f 42 4a 49 44 5f 43 41 43 5f 50 45 52 53 4f 4e  OBJID_CAC_PERSON
3d90: 22 29 3b 0a 09 09 63 61 73 65 20 30 78 30 32 30  ");...case 0x020
3da0: 32 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41  2:....return("CA
3db0: 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43  CKEY_TLV_OBJID_C
3dc0: 41 43 5f 42 45 4e 45 46 49 54 53 22 29 3b 0a 09  AC_BENEFITS");..
3dd0: 09 63 61 73 65 20 30 78 30 32 30 33 3a 0a 09 09  .case 0x0203:...
3de0: 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f  .return("CACKEY_
3df0: 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 4f 54  TLV_OBJID_CAC_OT
3e00: 48 45 52 42 45 4e 45 46 49 54 53 22 29 3b 0a 09  HERBENEFITS");..
3e10: 09 63 61 73 65 20 30 78 30 32 30 31 3a 0a 09 09  .case 0x0201:...
3e20: 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f  .return("CACKEY_
3e30: 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 50 45  TLV_OBJID_CAC_PE
3e40: 52 53 4f 4e 4e 45 4c 22 29 3b 0a 09 09 63 61 73  RSONNEL");...cas
3e50: 65 20 30 78 30 32 46 45 3a 0a 09 09 09 72 65 74  e 0x02FE:....ret
3e60: 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f  urn("CACKEY_TLV_
3e70: 4f 42 4a 49 44 5f 43 41 43 5f 50 4b 49 43 45 52  OBJID_CAC_PKICER
3e80: 54 22 29 3b 0a 09 7d 0a 09 0a 09 72 65 74 75 72  T");..}....retur
3e90: 6e 28 22 55 4e 4b 4e 4f 57 4e 22 29 3b 0a 7d 0a  n("UNKNOWN");.}.
3ea0: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
3eb0: 61 72 20 2a 43 41 43 4b 45 59 5f 44 45 42 55 47  ar *CACKEY_DEBUG
3ec0: 5f 46 55 4e 43 5f 41 50 50 54 59 50 45 5f 54 4f  _FUNC_APPTYPE_TO
3ed0: 5f 53 54 52 28 75 69 6e 74 38 5f 74 20 61 70 70  _STR(uint8_t app
3ee0: 74 79 70 65 29 20 7b 0a 09 73 77 69 74 63 68 20  type) {..switch 
3ef0: 28 61 70 70 74 79 70 65 29 20 7b 0a 09 09 63 61  (apptype) {...ca
3f00: 73 65 20 30 78 30 30 3a 0a 09 09 09 72 65 74 75  se 0x00:....retu
3f10: 72 6e 28 22 4e 4f 4e 45 22 29 3b 0a 09 09 63 61  rn("NONE");...ca
3f20: 73 65 20 30 78 30 31 3a 0a 09 09 09 72 65 74 75  se 0x01:....retu
3f30: 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 41  rn("CACKEY_TLV_A
3f40: 50 50 5f 47 45 4e 45 52 49 43 22 29 3b 0a 09 09  PP_GENERIC");...
3f50: 63 61 73 65 20 30 78 30 32 3a 0a 09 09 09 72 65  case 0x02:....re
3f60: 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56  turn("CACKEY_TLV
3f70: 5f 41 50 50 5f 53 4b 49 22 29 3b 0a 09 09 63 61  _APP_SKI");...ca
3f80: 73 65 20 30 78 30 33 3a 0a 09 09 09 72 65 74 75  se 0x03:....retu
3f90: 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 41  rn("CACKEY_TLV_A
3fa0: 50 50 5f 47 45 4e 45 52 49 43 20 7c 20 43 41 43  PP_GENERIC | CAC
3fb0: 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 53 4b 49 22  KEY_TLV_APP_SKI"
3fc0: 29 3b 0a 09 09 63 61 73 65 20 30 78 30 34 3a 0a  );...case 0x04:.
3fd0: 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45  ...return("CACKE
3fe0: 59 5f 54 4c 56 5f 41 50 50 5f 50 4b 49 22 29 3b  Y_TLV_APP_PKI");
3ff0: 0a 09 09 63 61 73 65 20 30 78 30 35 3a 0a 09 09  ...case 0x05:...
4000: 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f  .return("CACKEY_
4010: 54 4c 56 5f 41 50 50 5f 47 45 4e 45 52 49 43 20  TLV_APP_GENERIC 
4020: 7c 20 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50  | CACKEY_TLV_APP
4030: 5f 50 4b 49 22 29 3b 0a 09 09 63 61 73 65 20 30  _PKI");...case 0
4040: 78 30 36 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  x06:....return("
4050: 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 53  CACKEY_TLV_APP_S
4060: 4b 49 20 7c 20 43 41 43 4b 45 59 5f 54 4c 56 5f  KI | CACKEY_TLV_
4070: 41 50 50 5f 50 4b 49 22 29 3b 0a 09 09 63 61 73  APP_PKI");...cas
4080: 65 20 30 78 30 37 3a 0a 09 09 09 72 65 74 75 72  e 0x07:....retur
4090: 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50  n("CACKEY_TLV_AP
40a0: 50 5f 47 45 4e 45 52 49 43 20 7c 20 43 41 43 4b  P_GENERIC | CACK
40b0: 45 59 5f 54 4c 56 5f 41 50 50 5f 53 4b 49 20 7c  EY_TLV_APP_SKI |
40c0: 20 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f   CACKEY_TLV_APP_
40d0: 50 4b 49 22 29 3b 0a 09 7d 0a 0a 09 72 65 74 75  PKI");..}...retu
40e0: 72 6e 28 22 49 4e 56 41 4c 49 44 22 29 3b 0a 7d  rn("INVALID");.}
40f0: 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  ..static const c
4100: 68 61 72 20 2a 43 41 43 4b 45 59 5f 44 45 42 55  har *CACKEY_DEBU
4110: 47 5f 46 55 4e 43 5f 41 54 54 52 49 42 55 54 45  G_FUNC_ATTRIBUTE
4120: 5f 54 4f 5f 53 54 52 28 43 4b 5f 41 54 54 52 49  _TO_STR(CK_ATTRI
4130: 42 55 54 45 5f 54 59 50 45 20 61 74 74 72 29 20  BUTE_TYPE attr) 
4140: 7b 0a 09 73 77 69 74 63 68 20 28 61 74 74 72 29  {..switch (attr)
4150: 20 7b 0a 09 09 63 61 73 65 20 43 4b 41 5f 43 4c   {...case CKA_CL
4160: 41 53 53 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ASS:....return("
4170: 43 4b 41 5f 43 4c 41 53 53 22 29 3b 0a 09 09 63  CKA_CLASS");...c
4180: 61 73 65 20 43 4b 41 5f 54 4f 4b 45 4e 3a 0a 09  ase CKA_TOKEN:..
4190: 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 54 4f  ..return("CKA_TO
41a0: 4b 45 4e 22 29 3b 0a 09 09 63 61 73 65 20 43 4b  KEN");...case CK
41b0: 41 5f 50 52 49 56 41 54 45 3a 0a 09 09 09 72 65  A_PRIVATE:....re
41c0: 74 75 72 6e 28 22 43 4b 41 5f 50 52 49 56 41 54  turn("CKA_PRIVAT
41d0: 45 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f  E");...case CKA_
41e0: 4c 41 42 45 4c 3a 0a 09 09 09 72 65 74 75 72 6e  LABEL:....return
41f0: 28 22 43 4b 41 5f 4c 41 42 45 4c 22 29 3b 0a 09  ("CKA_LABEL");..
4200: 09 63 61 73 65 20 43 4b 41 5f 41 50 50 4c 49 43  .case CKA_APPLIC
4210: 41 54 49 4f 4e 3a 0a 09 09 09 72 65 74 75 72 6e  ATION:....return
4220: 28 22 43 4b 41 5f 41 50 50 4c 49 43 41 54 49 4f  ("CKA_APPLICATIO
4230: 4e 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f  N");...case CKA_
4240: 56 41 4c 55 45 3a 0a 09 09 09 72 65 74 75 72 6e  VALUE:....return
4250: 28 22 43 4b 41 5f 56 41 4c 55 45 22 29 3b 0a 09  ("CKA_VALUE");..
4260: 09 63 61 73 65 20 43 4b 41 5f 4f 42 4a 45 43 54  .case CKA_OBJECT
4270: 5f 49 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  _ID:....return("
4280: 43 4b 41 5f 4f 42 4a 45 43 54 5f 49 44 22 29 3b  CKA_OBJECT_ID");
4290: 0a 09 09 63 61 73 65 20 43 4b 41 5f 43 45 52 54  ...case CKA_CERT
42a0: 49 46 49 43 41 54 45 5f 54 59 50 45 3a 0a 09 09  IFICATE_TYPE:...
42b0: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 43 45 52  .return("CKA_CER
42c0: 54 49 46 49 43 41 54 45 5f 54 59 50 45 22 29 3b  TIFICATE_TYPE");
42d0: 0a 09 09 63 61 73 65 20 43 4b 41 5f 49 53 53 55  ...case CKA_ISSU
42e0: 45 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  ER:....return("C
42f0: 4b 41 5f 49 53 53 55 45 52 22 29 3b 0a 09 09 63  KA_ISSUER");...c
4300: 61 73 65 20 43 4b 41 5f 53 45 52 49 41 4c 5f 4e  ase CKA_SERIAL_N
4310: 55 4d 42 45 52 3a 0a 09 09 09 72 65 74 75 72 6e  UMBER:....return
4320: 28 22 43 4b 41 5f 53 45 52 49 41 4c 5f 4e 55 4d  ("CKA_SERIAL_NUM
4330: 42 45 52 22 29 3b 0a 09 09 63 61 73 65 20 43 4b  BER");...case CK
4340: 41 5f 41 43 5f 49 53 53 55 45 52 3a 0a 09 09 09  A_AC_ISSUER:....
4350: 72 65 74 75 72 6e 28 22 43 4b 41 5f 41 43 5f 49  return("CKA_AC_I
4360: 53 53 55 45 52 22 29 3b 0a 09 09 63 61 73 65 20  SSUER");...case 
4370: 43 4b 41 5f 4f 57 4e 45 52 3a 0a 09 09 09 72 65  CKA_OWNER:....re
4380: 74 75 72 6e 28 22 43 4b 41 5f 4f 57 4e 45 52 22  turn("CKA_OWNER"
4390: 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 41 54  );...case CKA_AT
43a0: 54 52 5f 54 59 50 45 53 3a 0a 09 09 09 72 65 74  TR_TYPES:....ret
43b0: 75 72 6e 28 22 43 4b 41 5f 41 54 54 52 5f 54 59  urn("CKA_ATTR_TY
43c0: 50 45 53 22 29 3b 0a 09 09 63 61 73 65 20 43 4b  PES");...case CK
43d0: 41 5f 54 52 55 53 54 45 44 3a 0a 09 09 09 72 65  A_TRUSTED:....re
43e0: 74 75 72 6e 28 22 43 4b 41 5f 54 52 55 53 54 45  turn("CKA_TRUSTE
43f0: 44 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f  D");...case CKA_
4400: 4b 45 59 5f 54 59 50 45 3a 0a 09 09 09 72 65 74  KEY_TYPE:....ret
4410: 75 72 6e 28 22 43 4b 41 5f 4b 45 59 5f 54 59 50  urn("CKA_KEY_TYP
4420: 45 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f  E");...case CKA_
4430: 53 55 42 4a 45 43 54 3a 0a 09 09 09 72 65 74 75  SUBJECT:....retu
4440: 72 6e 28 22 43 4b 41 5f 53 55 42 4a 45 43 54 22  rn("CKA_SUBJECT"
4450: 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 49 44  );...case CKA_ID
4460: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41  :....return("CKA
4470: 5f 49 44 22 29 3b 0a 09 09 63 61 73 65 20 43 4b  _ID");...case CK
4480: 41 5f 53 45 4e 53 49 54 49 56 45 3a 0a 09 09 09  A_SENSITIVE:....
4490: 72 65 74 75 72 6e 28 22 43 4b 41 5f 53 45 4e 53  return("CKA_SENS
44a0: 49 54 49 56 45 22 29 3b 0a 09 09 63 61 73 65 20  ITIVE");...case 
44b0: 43 4b 41 5f 45 4e 43 52 59 50 54 3a 0a 09 09 09  CKA_ENCRYPT:....
44c0: 72 65 74 75 72 6e 28 22 43 4b 41 5f 45 4e 43 52  return("CKA_ENCR
44d0: 59 50 54 22 29 3b 0a 09 09 63 61 73 65 20 43 4b  YPT");...case CK
44e0: 41 5f 44 45 43 52 59 50 54 3a 0a 09 09 09 72 65  A_DECRYPT:....re
44f0: 74 75 72 6e 28 22 43 4b 41 5f 44 45 43 52 59 50  turn("CKA_DECRYP
4500: 54 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f  T");...case CKA_
4510: 57 52 41 50 3a 0a 09 09 09 72 65 74 75 72 6e 28  WRAP:....return(
4520: 22 43 4b 41 5f 57 52 41 50 22 29 3b 0a 09 09 63  "CKA_WRAP");...c
4530: 61 73 65 20 43 4b 41 5f 55 4e 57 52 41 50 3a 0a  ase CKA_UNWRAP:.
4540: 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 55  ...return("CKA_U
4550: 4e 57 52 41 50 22 29 3b 0a 09 09 63 61 73 65 20  NWRAP");...case 
4560: 43 4b 41 5f 53 49 47 4e 3a 0a 09 09 09 72 65 74  CKA_SIGN:....ret
4570: 75 72 6e 28 22 43 4b 41 5f 53 49 47 4e 22 29 3b  urn("CKA_SIGN");
4580: 0a 09 09 63 61 73 65 20 43 4b 41 5f 53 49 47 4e  ...case CKA_SIGN
4590: 5f 52 45 43 4f 56 45 52 3a 0a 09 09 09 72 65 74  _RECOVER:....ret
45a0: 75 72 6e 28 22 43 4b 41 5f 53 49 47 4e 5f 52 45  urn("CKA_SIGN_RE
45b0: 43 4f 56 45 52 22 29 3b 0a 09 09 63 61 73 65 20  COVER");...case 
45c0: 43 4b 41 5f 56 45 52 49 46 59 3a 0a 09 09 09 72  CKA_VERIFY:....r
45d0: 65 74 75 72 6e 28 22 43 4b 41 5f 56 45 52 49 46  eturn("CKA_VERIF
45e0: 59 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f  Y");...case CKA_
45f0: 56 45 52 49 46 59 5f 52 45 43 4f 56 45 52 3a 0a  VERIFY_RECOVER:.
4600: 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 56  ...return("CKA_V
4610: 45 52 49 46 59 5f 52 45 43 4f 56 45 52 22 29 3b  ERIFY_RECOVER");
4620: 0a 09 09 63 61 73 65 20 43 4b 41 5f 44 45 52 49  ...case CKA_DERI
4630: 56 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  VE:....return("C
4640: 4b 41 5f 44 45 52 49 56 45 22 29 3b 0a 09 09 63  KA_DERIVE");...c
4650: 61 73 65 20 43 4b 41 5f 53 54 41 52 54 5f 44 41  ase CKA_START_DA
4660: 54 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  TE:....return("C
4670: 4b 41 5f 53 54 41 52 54 5f 44 41 54 45 22 29 3b  KA_START_DATE");
4680: 0a 09 09 63 61 73 65 20 43 4b 41 5f 45 4e 44 5f  ...case CKA_END_
4690: 44 41 54 45 3a 0a 09 09 09 72 65 74 75 72 6e 28  DATE:....return(
46a0: 22 43 4b 41 5f 45 4e 44 5f 44 41 54 45 22 29 3b  "CKA_END_DATE");
46b0: 0a 09 09 63 61 73 65 20 43 4b 41 5f 4d 4f 44 55  ...case CKA_MODU
46c0: 4c 55 53 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  LUS:....return("
46d0: 43 4b 41 5f 4d 4f 44 55 4c 55 53 22 29 3b 0a 09  CKA_MODULUS");..
46e0: 09 63 61 73 65 20 43 4b 41 5f 4d 4f 44 55 4c 55  .case CKA_MODULU
46f0: 53 5f 42 49 54 53 3a 0a 09 09 09 72 65 74 75 72  S_BITS:....retur
4700: 6e 28 22 43 4b 41 5f 4d 4f 44 55 4c 55 53 5f 42  n("CKA_MODULUS_B
4710: 49 54 53 22 29 3b 0a 09 09 63 61 73 65 20 43 4b  ITS");...case CK
4720: 41 5f 50 55 42 4c 49 43 5f 45 58 50 4f 4e 45 4e  A_PUBLIC_EXPONEN
4730: 54 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b  T:....return("CK
4740: 41 5f 50 55 42 4c 49 43 5f 45 58 50 4f 4e 45 4e  A_PUBLIC_EXPONEN
4750: 54 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f  T");...case CKA_
4760: 50 52 49 56 41 54 45 5f 45 58 50 4f 4e 45 4e 54  PRIVATE_EXPONENT
4770: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41  :....return("CKA
4780: 5f 50 52 49 56 41 54 45 5f 45 58 50 4f 4e 45 4e  _PRIVATE_EXPONEN
4790: 54 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f  T");...case CKA_
47a0: 50 52 49 4d 45 5f 31 3a 0a 09 09 09 72 65 74 75  PRIME_1:....retu
47b0: 72 6e 28 22 43 4b 41 5f 50 52 49 4d 45 5f 31 22  rn("CKA_PRIME_1"
47c0: 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 50 52  );...case CKA_PR
47d0: 49 4d 45 5f 32 3a 0a 09 09 09 72 65 74 75 72 6e  IME_2:....return
47e0: 28 22 43 4b 41 5f 50 52 49 4d 45 5f 32 22 29 3b  ("CKA_PRIME_2");
47f0: 0a 09 09 63 61 73 65 20 43 4b 41 5f 45 58 50 4f  ...case CKA_EXPO
4800: 4e 45 4e 54 5f 31 3a 0a 09 09 09 72 65 74 75 72  NENT_1:....retur
4810: 6e 28 22 43 4b 41 5f 45 58 50 4f 4e 45 4e 54 5f  n("CKA_EXPONENT_
4820: 31 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f  1");...case CKA_
4830: 45 58 50 4f 4e 45 4e 54 5f 32 3a 0a 09 09 09 72  EXPONENT_2:....r
4840: 65 74 75 72 6e 28 22 43 4b 41 5f 45 58 50 4f 4e  eturn("CKA_EXPON
4850: 45 4e 54 5f 32 22 29 3b 0a 09 09 63 61 73 65 20  ENT_2");...case 
4860: 43 4b 41 5f 43 4f 45 46 46 49 43 49 45 4e 54 3a  CKA_COEFFICIENT:
4870: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f  ....return("CKA_
4880: 43 4f 45 46 46 49 43 49 45 4e 54 22 29 3b 0a 09  COEFFICIENT");..
4890: 09 63 61 73 65 20 43 4b 41 5f 50 52 49 4d 45 3a  .case CKA_PRIME:
48a0: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f  ....return("CKA_
48b0: 50 52 49 4d 45 22 29 3b 0a 09 09 63 61 73 65 20  PRIME");...case 
48c0: 43 4b 41 5f 53 55 42 50 52 49 4d 45 3a 0a 09 09  CKA_SUBPRIME:...
48d0: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 53 55 42  .return("CKA_SUB
48e0: 50 52 49 4d 45 22 29 3b 0a 09 09 63 61 73 65 20  PRIME");...case 
48f0: 43 4b 41 5f 42 41 53 45 3a 0a 09 09 09 72 65 74  CKA_BASE:....ret
4900: 75 72 6e 28 22 43 4b 41 5f 42 41 53 45 22 29 3b  urn("CKA_BASE");
4910: 0a 09 09 63 61 73 65 20 43 4b 41 5f 50 52 49 4d  ...case CKA_PRIM
4920: 45 5f 42 49 54 53 3a 0a 09 09 09 72 65 74 75 72  E_BITS:....retur
4930: 6e 28 22 43 4b 41 5f 50 52 49 4d 45 5f 42 49 54  n("CKA_PRIME_BIT
4940: 53 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f  S");...case CKA_
4950: 53 55 42 5f 50 52 49 4d 45 5f 42 49 54 53 3a 0a  SUB_PRIME_BITS:.
4960: 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 53  ...return("CKA_S
4970: 55 42 5f 50 52 49 4d 45 5f 42 49 54 53 22 29 3b  UB_PRIME_BITS");
4980: 0a 09 09 63 61 73 65 20 43 4b 41 5f 56 41 4c 55  ...case CKA_VALU
4990: 45 5f 42 49 54 53 3a 0a 09 09 09 72 65 74 75 72  E_BITS:....retur
49a0: 6e 28 22 43 4b 41 5f 56 41 4c 55 45 5f 42 49 54  n("CKA_VALUE_BIT
49b0: 53 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f  S");...case CKA_
49c0: 56 41 4c 55 45 5f 4c 45 4e 3a 0a 09 09 09 72 65  VALUE_LEN:....re
49d0: 74 75 72 6e 28 22 43 4b 41 5f 56 41 4c 55 45 5f  turn("CKA_VALUE_
49e0: 4c 45 4e 22 29 3b 0a 09 09 63 61 73 65 20 43 4b  LEN");...case CK
49f0: 41 5f 45 58 54 52 41 43 54 41 42 4c 45 3a 0a 09  A_EXTRACTABLE:..
4a00: 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 45 58  ..return("CKA_EX
4a10: 54 52 41 43 54 41 42 4c 45 22 29 3b 0a 09 09 63  TRACTABLE");...c
4a20: 61 73 65 20 43 4b 41 5f 4c 4f 43 41 4c 3a 0a 09  ase CKA_LOCAL:..
4a30: 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 4c 4f  ..return("CKA_LO
4a40: 43 41 4c 22 29 3b 0a 09 09 63 61 73 65 20 43 4b  CAL");...case CK
4a50: 41 5f 4e 45 56 45 52 5f 45 58 54 52 41 43 54 41  A_NEVER_EXTRACTA
4a60: 42 4c 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  BLE:....return("
4a70: 43 4b 41 5f 4e 45 56 45 52 5f 45 58 54 52 41 43  CKA_NEVER_EXTRAC
4a80: 54 41 42 4c 45 22 29 3b 0a 09 09 63 61 73 65 20  TABLE");...case 
4a90: 43 4b 41 5f 41 4c 57 41 59 53 5f 53 45 4e 53 49  CKA_ALWAYS_SENSI
4aa0: 54 49 56 45 3a 0a 09 09 09 72 65 74 75 72 6e 28  TIVE:....return(
4ab0: 22 43 4b 41 5f 41 4c 57 41 59 53 5f 53 45 4e 53  "CKA_ALWAYS_SENS
4ac0: 49 54 49 56 45 22 29 3b 0a 09 09 63 61 73 65 20  ITIVE");...case 
4ad0: 43 4b 41 5f 4b 45 59 5f 47 45 4e 5f 4d 45 43 48  CKA_KEY_GEN_MECH
4ae0: 41 4e 49 53 4d 3a 0a 09 09 09 72 65 74 75 72 6e  ANISM:....return
4af0: 28 22 43 4b 41 5f 4b 45 59 5f 47 45 4e 5f 4d 45  ("CKA_KEY_GEN_ME
4b00: 43 48 41 4e 49 53 4d 22 29 3b 0a 09 09 63 61 73  CHANISM");...cas
4b10: 65 20 43 4b 41 5f 4d 4f 44 49 46 49 41 42 4c 45  e CKA_MODIFIABLE
4b20: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41  :....return("CKA
4b30: 5f 4d 4f 44 49 46 49 41 42 4c 45 22 29 3b 0a 09  _MODIFIABLE");..
4b40: 09 63 61 73 65 20 43 4b 41 5f 45 43 44 53 41 5f  .case CKA_ECDSA_
4b50: 50 41 52 41 4d 53 3a 0a 09 09 09 72 65 74 75 72  PARAMS:....retur
4b60: 6e 28 22 43 4b 41 5f 45 43 44 53 41 5f 50 41 52  n("CKA_ECDSA_PAR
4b70: 41 4d 53 22 29 3b 0a 09 09 63 61 73 65 20 43 4b  AMS");...case CK
4b80: 41 5f 45 43 5f 50 4f 49 4e 54 3a 0a 09 09 09 72  A_EC_POINT:....r
4b90: 65 74 75 72 6e 28 22 43 4b 41 5f 45 43 5f 50 4f  eturn("CKA_EC_PO
4ba0: 49 4e 54 22 29 3b 0a 09 09 63 61 73 65 20 43 4b  INT");...case CK
4bb0: 41 5f 53 45 43 4f 4e 44 41 52 59 5f 41 55 54 48  A_SECONDARY_AUTH
4bc0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41  :....return("CKA
4bd0: 5f 53 45 43 4f 4e 44 41 52 59 5f 41 55 54 48 22  _SECONDARY_AUTH"
4be0: 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 41 55  );...case CKA_AU
4bf0: 54 48 5f 50 49 4e 5f 46 4c 41 47 53 3a 0a 09 09  TH_PIN_FLAGS:...
4c00: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 41 55 54  .return("CKA_AUT
4c10: 48 5f 50 49 4e 5f 46 4c 41 47 53 22 29 3b 0a 09  H_PIN_FLAGS");..
4c20: 09 63 61 73 65 20 43 4b 41 5f 48 57 5f 46 45 41  .case CKA_HW_FEA
4c30: 54 55 52 45 5f 54 59 50 45 3a 0a 09 09 09 72 65  TURE_TYPE:....re
4c40: 74 75 72 6e 28 22 43 4b 41 5f 48 57 5f 46 45 41  turn("CKA_HW_FEA
4c50: 54 55 52 45 5f 54 59 50 45 22 29 3b 0a 09 09 63  TURE_TYPE");...c
4c60: 61 73 65 20 43 4b 41 5f 52 45 53 45 54 5f 4f 4e  ase CKA_RESET_ON
4c70: 5f 49 4e 49 54 3a 0a 09 09 09 72 65 74 75 72 6e  _INIT:....return
4c80: 28 22 43 4b 41 5f 52 45 53 45 54 5f 4f 4e 5f 49  ("CKA_RESET_ON_I
4c90: 4e 49 54 22 29 3b 0a 09 09 63 61 73 65 20 43 4b  NIT");...case CK
4ca0: 41 5f 48 41 53 5f 52 45 53 45 54 3a 0a 09 09 09  A_HAS_RESET:....
4cb0: 72 65 74 75 72 6e 28 22 43 4b 41 5f 48 41 53 5f  return("CKA_HAS_
4cc0: 52 45 53 45 54 22 29 3b 0a 09 09 63 61 73 65 20  RESET");...case 
4cd0: 43 4b 41 5f 56 45 4e 44 4f 52 5f 44 45 46 49 4e  CKA_VENDOR_DEFIN
4ce0: 45 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  ED:....return("C
4cf0: 4b 41 5f 56 45 4e 44 4f 52 5f 44 45 46 49 4e 45  KA_VENDOR_DEFINE
4d00: 44 22 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e  D");..}...return
4d10: 28 22 55 4e 4b 4e 4f 57 4e 22 29 3b 0a 7d 0a 0a  ("UNKNOWN");.}..
4d20: 23 20 20 64 65 66 69 6e 65 20 6d 61 6c 6c 6f 63  #  define malloc
4d30: 28 78 29 20 43 41 43 4b 45 59 5f 44 45 42 55 47  (x) CACKEY_DEBUG
4d40: 5f 46 55 4e 43 5f 4d 41 4c 4c 4f 43 28 78 2c 20  _FUNC_MALLOC(x, 
4d50: 5f 5f 66 75 6e 63 5f 5f 2c 20 5f 5f 4c 49 4e 45  __func__, __LINE
4d60: 5f 5f 29 0a 23 20 20 64 65 66 69 6e 65 20 72 65  __).#  define re
4d70: 61 6c 6c 6f 63 28 78 2c 20 79 29 20 43 41 43 4b  alloc(x, y) CACK
4d80: 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 52 45  EY_DEBUG_FUNC_RE
4d90: 41 4c 4c 4f 43 28 78 2c 20 79 2c 20 5f 5f 66 75  ALLOC(x, y, __fu
4da0: 6e 63 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 0a  nc__, __LINE__).
4db0: 23 20 20 69 66 64 65 66 20 73 74 72 64 75 70 0a  #  ifdef strdup.
4dc0: 23 20 20 20 20 75 6e 64 65 66 20 73 74 72 64 75  #    undef strdu
4dd0: 70 0a 23 20 20 65 6e 64 69 66 0a 23 20 20 64 65  p.#  endif.#  de
4de0: 66 69 6e 65 20 73 74 72 64 75 70 28 78 29 20 43  fine strdup(x) C
4df0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43  ACKEY_DEBUG_FUNC
4e00: 5f 53 54 52 44 55 50 28 78 2c 20 5f 5f 66 75 6e  _STRDUP(x, __fun
4e10: 63 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 0a 23  c__, __LINE__).#
4e20: 65 6c 73 65 0a 23 20 20 64 65 66 69 6e 65 20 43  else.#  define C
4e30: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
4e40: 54 46 28 78 2e 2e 2e 29 20 2f 2a 2a 2f 0a 23 20  TF(x...) /**/.# 
4e50: 20 64 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 44   define CACKEY_D
4e60: 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 66 2c  EBUG_PRINTBUF(f,
4e70: 20 78 2c 20 79 29 20 2f 2a 2a 2f 0a 23 20 20 64   x, y) /**/.#  d
4e80: 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 44 45 42  efine CACKEY_DEB
4e90: 55 47 5f 46 55 4e 43 5f 54 41 47 5f 54 4f 5f 53  UG_FUNC_TAG_TO_S
4ea0: 54 52 28 78 29 20 22 44 45 42 55 47 5f 44 49 53  TR(x) "DEBUG_DIS
4eb0: 41 42 4c 45 44 22 0a 23 20 20 64 65 66 69 6e 65  ABLED".#  define
4ec0: 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55   CACKEY_DEBUG_FU
4ed0: 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53  NC_SCARDERR_TO_S
4ee0: 54 52 28 78 29 20 22 44 45 42 55 47 5f 44 49 53  TR(x) "DEBUG_DIS
4ef0: 41 42 4c 45 44 22 0a 23 20 20 64 65 66 69 6e 65  ABLED".#  define
4f00: 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55   CACKEY_DEBUG_FU
4f10: 4e 43 5f 4f 42 4a 49 44 5f 54 4f 5f 53 54 52 28  NC_OBJID_TO_STR(
4f20: 78 29 20 22 44 45 42 55 47 5f 44 49 53 41 42 4c  x) "DEBUG_DISABL
4f30: 45 44 22 0a 23 20 20 64 65 66 69 6e 65 20 43 41  ED".#  define CA
4f40: 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
4f50: 41 50 50 54 59 50 45 5f 54 4f 5f 53 54 52 28 78  APPTYPE_TO_STR(x
4f60: 29 20 22 44 45 42 55 47 5f 44 49 53 41 42 4c 45  ) "DEBUG_DISABLE
4f70: 44 22 0a 23 20 20 64 65 66 69 6e 65 20 43 41 43  D".#  define CAC
4f80: 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 41  KEY_DEBUG_FUNC_A
4f90: 54 54 52 49 42 55 54 45 5f 54 4f 5f 53 54 52 28  TTRIBUTE_TO_STR(
4fa0: 78 29 20 22 44 45 42 55 47 5f 44 49 53 41 42 4c  x) "DEBUG_DISABL
4fb0: 45 44 22 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20  ED".#endif../*. 
4fc0: 2a 20 49 6e 63 6c 75 64 65 20 74 68 65 73 65 20  * Include these 
4fd0: 73 6f 75 72 63 65 20 66 69 6c 65 73 20 69 6e 20  source files in 
4fe0: 74 68 69 73 20 74 72 61 6e 73 6c 61 74 69 6f 6e  this translation
4ff0: 20 75 6e 69 74 20 73 6f 20 74 68 61 74 20 77 65   unit so that we
5000: 20 63 61 6e 20 62 69 6e 64 20 74 6f 0a 20 2a 20   can bind to. * 
5010: 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20 6e 6f  functions and no
5020: 74 20 69 6e 63 6c 75 64 65 20 61 6e 79 20 73 79  t include any sy
5030: 6d 62 6f 6c 73 20 69 6e 20 74 68 65 20 6f 75 74  mbols in the out
5040: 70 75 74 20 73 68 61 72 65 64 20 6f 62 6a 65 63  put shared objec
5050: 74 2e 0a 20 2a 2f 0a 23 69 6e 63 6c 75 64 65 20  t.. */.#include 
5060: 22 61 73 6e 31 2d 78 35 30 39 2e 63 22 0a 23 69  "asn1-x509.c".#i
5070: 6e 63 6c 75 64 65 20 22 73 68 61 31 2e 63 22 0a  nclude "sha1.c".
5080: 23 69 6e 63 6c 75 64 65 20 22 6d 64 35 2e 63 22  #include "md5.c"
5090: 0a 0a 74 79 70 65 64 65 66 20 65 6e 75 6d 20 7b  ..typedef enum {
50a0: 0a 09 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45  ..CACKEY_ID_TYPE
50b0: 5f 45 52 52 4f 52 2c 0a 09 43 41 43 4b 45 59 5f  _ERROR,..CACKEY_
50c0: 49 44 5f 54 59 50 45 5f 55 4e 4b 4e 4f 57 4e 2c  ID_TYPE_UNKNOWN,
50d0: 0a 09 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45  ..CACKEY_ID_TYPE
50e0: 5f 43 41 43 2c 0a 09 43 41 43 4b 45 59 5f 49 44  _CAC,..CACKEY_ID
50f0: 5f 54 59 50 45 5f 50 49 56 2c 0a 09 43 41 43 4b  _TYPE_PIV,..CACK
5100: 45 59 5f 49 44 5f 54 59 50 45 5f 43 45 52 54 5f  EY_ID_TYPE_CERT_
5110: 4f 4e 4c 59 0a 7d 20 63 61 63 6b 65 79 5f 70 63  ONLY.} cackey_pc
5120: 73 63 5f 69 64 5f 74 79 70 65 3b 0a 0a 73 74 72  sc_id_type;..str
5130: 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f  uct cackey_pcsc_
5140: 69 64 65 6e 74 69 74 79 20 7b 0a 09 63 61 63 6b  identity {..cack
5150: 65 79 5f 70 63 73 63 5f 69 64 5f 74 79 70 65 20  ey_pcsc_id_type 
5160: 69 64 5f 74 79 70 65 3b 0a 0a 09 73 69 7a 65 5f  id_type;...size_
5170: 74 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65  t certificate_le
5180: 6e 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61  n;..unsigned cha
5190: 72 20 2a 63 65 72 74 69 66 69 63 61 74 65 3b 0a  r *certificate;.
51a0: 0a 09 73 73 69 7a 65 5f 74 20 6b 65 79 73 69 7a  ..ssize_t keysiz
51b0: 65 3b 0a 0a 09 75 6e 69 6f 6e 20 7b 0a 09 09 73  e;...union {...s
51c0: 74 72 75 63 74 20 7b 0a 09 09 09 75 6e 73 69 67  truct {....unsig
51d0: 6e 65 64 20 63 68 61 72 20 61 70 70 6c 65 74 5b  ned char applet[
51e0: 37 5d 3b 0a 09 09 09 75 69 6e 74 31 36 5f 74 20  7];....uint16_t 
51f0: 66 69 6c 65 3b 0a 09 09 7d 20 63 61 63 3b 0a 0a  file;...} cac;..
5200: 09 09 73 74 72 75 63 74 20 7b 0a 09 09 09 75 6e  ..struct {....un
5210: 73 69 67 6e 65 64 20 63 68 61 72 20 6b 65 79 5f  signed char key_
5220: 69 64 3b 0a 09 09 09 63 68 61 72 20 6c 61 62 65  id;....char labe
5230: 6c 5b 33 32 5d 3b 0a 09 09 7d 20 70 69 76 3b 0a  l[32];...} piv;.
5240: 09 7d 20 63 61 72 64 3b 0a 7d 3b 0a 0a 73 74 72  .} card;.};..str
5250: 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e 74  uct cackey_ident
5260: 69 74 79 20 7b 0a 09 73 74 72 75 63 74 20 63 61  ity {..struct ca
5270: 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69  ckey_pcsc_identi
5280: 74 79 20 2a 70 63 73 63 5f 69 64 65 6e 74 69 74  ty *pcsc_identit
5290: 79 3b 0a 0a 09 43 4b 5f 41 54 54 52 49 42 55 54  y;...CK_ATTRIBUT
52a0: 45 20 2a 61 74 74 72 69 62 75 74 65 73 3b 0a 09  E *attributes;..
52b0: 43 4b 5f 55 4c 4f 4e 47 20 61 74 74 72 69 62 75  CK_ULONG attribu
52c0: 74 65 73 5f 63 6f 75 6e 74 3b 0a 7d 3b 0a 0a 73  tes_count;.};..s
52d0: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 65 73  truct cackey_ses
52e0: 73 69 6f 6e 20 7b 0a 09 69 6e 74 20 61 63 74 69  sion {..int acti
52f0: 76 65 3b 0a 0a 09 43 4b 5f 53 4c 4f 54 5f 49 44  ve;...CK_SLOT_ID
5300: 20 73 6c 6f 74 49 44 3b 0a 0a 09 43 4b 5f 53 54   slotID;...CK_ST
5310: 41 54 45 20 73 74 61 74 65 3b 0a 09 43 4b 5f 46  ATE state;..CK_F
5320: 4c 41 47 53 20 66 6c 61 67 73 3b 0a 09 43 4b 5f  LAGS flags;..CK_
5330: 55 4c 4f 4e 47 20 75 6c 44 65 76 69 63 65 45 72  ULONG ulDeviceEr
5340: 72 6f 72 3b 0a 09 43 4b 5f 56 4f 49 44 5f 50 54  ror;..CK_VOID_PT
5350: 52 20 70 41 70 70 6c 69 63 61 74 69 6f 6e 3b 0a  R pApplication;.
5360: 09 43 4b 5f 4e 4f 54 49 46 59 20 4e 6f 74 69 66  .CK_NOTIFY Notif
5370: 79 3b 0a 0a 09 73 74 72 75 63 74 20 63 61 63 6b  y;...struct cack
5380: 65 79 5f 69 64 65 6e 74 69 74 79 20 2a 69 64 65  ey_identity *ide
5390: 6e 74 69 74 69 65 73 3b 0a 09 75 6e 73 69 67 6e  ntities;..unsign
53a0: 65 64 20 6c 6f 6e 67 20 69 64 65 6e 74 69 74 69  ed long identiti
53b0: 65 73 5f 63 6f 75 6e 74 3b 0a 0a 09 69 6e 74 20  es_count;...int 
53c0: 73 65 61 72 63 68 5f 61 63 74 69 76 65 3b 0a 09  search_active;..
53d0: 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52  CK_ATTRIBUTE_PTR
53e0: 20 73 65 61 72 63 68 5f 71 75 65 72 79 3b 0a 09   search_query;..
53f0: 43 4b 5f 55 4c 4f 4e 47 20 73 65 61 72 63 68 5f  CK_ULONG search_
5400: 71 75 65 72 79 5f 63 6f 75 6e 74 3b 0a 09 75 6e  query_count;..un
5410: 73 69 67 6e 65 64 20 6c 6f 6e 67 20 73 65 61 72  signed long sear
5420: 63 68 5f 63 75 72 72 5f 69 64 3b 0a 0a 09 69 6e  ch_curr_id;...in
5430: 74 20 73 69 67 6e 5f 61 63 74 69 76 65 3b 0a 09  t sign_active;..
5440: 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 54 59 50  CK_MECHANISM_TYP
5450: 45 20 73 69 67 6e 5f 6d 65 63 68 61 6e 69 73 6d  E sign_mechanism
5460: 3b 0a 09 43 4b 5f 42 59 54 45 5f 50 54 52 20 73  ;..CK_BYTE_PTR s
5470: 69 67 6e 5f 62 75 66 3b 0a 09 75 6e 73 69 67 6e  ign_buf;..unsign
5480: 65 64 20 6c 6f 6e 67 20 73 69 67 6e 5f 62 75 66  ed long sign_buf
5490: 6c 65 6e 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c  len;..unsigned l
54a0: 6f 6e 67 20 73 69 67 6e 5f 62 75 66 75 73 65 64  ong sign_bufused
54b0: 3b 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65 79  ;..struct cackey
54c0: 5f 69 64 65 6e 74 69 74 79 20 2a 73 69 67 6e 5f  _identity *sign_
54d0: 69 64 65 6e 74 69 74 79 3b 0a 0a 09 69 6e 74 20  identity;...int 
54e0: 64 65 63 72 79 70 74 5f 61 63 74 69 76 65 3b 0a  decrypt_active;.
54f0: 09 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 54 59  .CK_MECHANISM_TY
5500: 50 45 20 64 65 63 72 79 70 74 5f 6d 65 63 68 61  PE decrypt_mecha
5510: 6e 69 73 6d 3b 0a 09 43 4b 5f 56 4f 49 44 5f 50  nism;..CK_VOID_P
5520: 54 52 20 64 65 63 72 79 70 74 5f 6d 65 63 68 5f  TR decrypt_mech_
5530: 70 61 72 6d 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20  parm;..CK_ULONG 
5540: 64 65 63 72 79 70 74 5f 6d 65 63 68 5f 70 61 72  decrypt_mech_par
5550: 6d 6c 65 6e 3b 0a 09 73 74 72 75 63 74 20 63 61  mlen;..struct ca
5560: 63 6b 65 79 5f 69 64 65 6e 74 69 74 79 20 2a 64  ckey_identity *d
5570: 65 63 72 79 70 74 5f 69 64 65 6e 74 69 74 79 3b  ecrypt_identity;
5580: 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 63 61 63 6b  .};..struct cack
5590: 65 79 5f 73 6c 6f 74 20 7b 0a 09 69 6e 74 20 61  ey_slot {..int a
55a0: 63 74 69 76 65 3b 0a 09 69 6e 74 20 69 6e 74 65  ctive;..int inte
55b0: 72 6e 61 6c 3b 0a 0a 09 63 68 61 72 20 2a 70 63  rnal;...char *pc
55c0: 73 63 5f 72 65 61 64 65 72 3b 0a 0a 09 69 6e 74  sc_reader;...int
55d0: 20 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65   pcsc_card_conne
55e0: 63 74 65 64 3b 0a 09 53 43 41 52 44 48 41 4e 44  cted;..SCARDHAND
55f0: 4c 45 20 70 63 73 63 5f 63 61 72 64 3b 0a 0a 09  LE pcsc_card;...
5600: 69 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 5f  int transaction_
5610: 64 65 70 74 68 3b 0a 09 69 6e 74 20 74 72 61 6e  depth;..int tran
5620: 73 61 63 74 69 6f 6e 5f 6e 65 65 64 5f 68 77 5f  saction_need_hw_
5630: 6c 6f 63 6b 3b 0a 0a 09 69 6e 74 20 73 6c 6f 74  lock;...int slot
5640: 5f 72 65 73 65 74 3b 0a 0a 09 43 4b 5f 46 4c 41  _reset;...CK_FLA
5650: 47 53 20 74 6f 6b 65 6e 5f 66 6c 61 67 73 3b 0a  GS token_flags;.
5660: 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  ..unsigned char 
5670: 2a 6c 61 62 65 6c 3b 0a 0a 09 44 57 4f 52 44 20  *label;...DWORD 
5680: 70 72 6f 74 6f 63 6f 6c 3b 0a 0a 09 75 6e 73 69  protocol;...unsi
5690: 67 6e 65 64 20 69 6e 74 20 63 61 63 68 65 64 5f  gned int cached_
56a0: 63 65 72 74 73 5f 63 6f 75 6e 74 3b 0a 09 73 74  certs_count;..st
56b0: 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63  ruct cackey_pcsc
56c0: 5f 69 64 65 6e 74 69 74 79 20 2a 63 61 63 68 65  _identity *cache
56d0: 64 5f 63 65 72 74 73 3b 0a 0a 09 63 61 63 6b 65  d_certs;...cacke
56e0: 79 5f 70 63 73 63 5f 69 64 5f 74 79 70 65 20 69  y_pcsc_id_type i
56f0: 64 5f 74 79 70 65 5f 68 69 6e 74 3b 0a 7d 3b 0a  d_type_hint;.};.
5700: 0a 74 79 70 65 64 65 66 20 65 6e 75 6d 20 7b 0a  .typedef enum {.
5710: 09 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f  .CACKEY_TLV_APP_
5720: 47 45 4e 45 52 49 43 20 3d 20 30 78 30 31 2c 0a  GENERIC = 0x01,.
5730: 09 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f  .CACKEY_TLV_APP_
5740: 53 4b 49 20 20 20 20 20 3d 20 30 78 30 32 2c 0a  SKI     = 0x02,.
5750: 09 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f  .CACKEY_TLV_APP_
5760: 50 4b 49 20 20 20 20 20 3d 20 30 78 30 34 0a 7d  PKI     = 0x04.}
5770: 20 63 61 63 6b 65 79 5f 74 6c 76 5f 61 70 70 74   cackey_tlv_appt
5780: 79 70 65 3b 0a 0a 74 79 70 65 64 65 66 20 65 6e  ype;..typedef en
5790: 75 6d 20 7b 0a 09 43 41 43 4b 45 59 5f 54 4c 56  um {..CACKEY_TLV
57a0: 5f 4f 42 4a 49 44 5f 47 45 4e 45 52 41 4c 49 4e  _OBJID_GENERALIN
57b0: 46 4f 20 20 20 20 20 20 20 3d 20 30 78 32 30 30  FO       = 0x200
57c0: 30 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f  0,..CACKEY_TLV_O
57d0: 42 4a 49 44 5f 50 52 4f 50 45 52 53 4f 4e 41 4c  BJID_PROPERSONAL
57e0: 49 4e 46 4f 20 20 20 3d 20 30 78 32 31 30 30 2c  INFO   = 0x2100,
57f0: 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a  ..CACKEY_TLV_OBJ
5800: 49 44 5f 41 43 43 45 53 53 43 4f 4e 54 52 4f 4c  ID_ACCESSCONTROL
5810: 20 20 20 20 20 3d 20 30 78 33 30 30 30 2c 0a 09       = 0x3000,..
5820: 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44  CACKEY_TLV_OBJID
5830: 5f 4c 4f 47 49 4e 20 20 20 20 20 20 20 20 20 20  _LOGIN          
5840: 20 20 20 3d 20 30 78 34 30 30 30 2c 0a 09 43 41     = 0x4000,..CA
5850: 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43  CKEY_TLV_OBJID_C
5860: 41 52 44 49 4e 46 4f 20 20 20 20 20 20 20 20 20  ARDINFO         
5870: 20 3d 20 30 78 35 30 30 30 2c 0a 09 43 41 43 4b   = 0x5000,..CACK
5880: 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 42 49 4f  EY_TLV_OBJID_BIO
5890: 4d 45 54 52 49 43 53 20 20 20 20 20 20 20 20 3d  METRICS        =
58a0: 20 30 78 36 30 30 30 2c 0a 09 43 41 43 4b 45 59   0x6000,..CACKEY
58b0: 5f 54 4c 56 5f 4f 42 4a 49 44 5f 44 49 47 49 54  _TLV_OBJID_DIGIT
58c0: 41 4c 53 49 47 43 45 52 54 20 20 20 20 3d 20 30  ALSIGCERT    = 0
58d0: 78 37 30 30 30 2c 0a 09 43 41 43 4b 45 59 5f 54  x7000,..CACKEY_T
58e0: 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 50 45 52  LV_OBJID_CAC_PER
58f0: 53 4f 4e 20 20 20 20 20 20 20 20 3d 20 30 78 30  SON        = 0x0
5900: 32 30 30 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56  200,..CACKEY_TLV
5910: 5f 4f 42 4a 49 44 5f 43 41 43 5f 42 45 4e 45 46  _OBJID_CAC_BENEF
5920: 49 54 53 20 20 20 20 20 20 3d 20 30 78 30 32 30  ITS      = 0x020
5930: 32 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f  2,..CACKEY_TLV_O
5940: 42 4a 49 44 5f 43 41 43 5f 4f 54 48 45 52 42 45  BJID_CAC_OTHERBE
5950: 4e 45 46 49 54 53 20 3d 20 30 78 30 32 30 33 2c  NEFITS = 0x0203,
5960: 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a  ..CACKEY_TLV_OBJ
5970: 49 44 5f 43 41 43 5f 50 45 52 53 4f 4e 4e 45 4c  ID_CAC_PERSONNEL
5980: 20 20 20 20 20 3d 20 30 78 30 32 30 31 2c 0a 09       = 0x0201,..
5990: 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44  CACKEY_TLV_OBJID
59a0: 5f 43 41 43 5f 50 4b 49 43 45 52 54 20 20 20 20  _CAC_PKICERT    
59b0: 20 20 20 3d 20 30 78 30 32 46 45 0a 7d 20 63 61     = 0x02FE.} ca
59c0: 63 6b 65 79 5f 74 6c 76 5f 6f 62 6a 65 63 74 69  ckey_tlv_objecti
59d0: 64 3b 0a 0a 74 79 70 65 64 65 66 20 65 6e 75 6d  d;..typedef enum
59e0: 20 7b 0a 09 43 41 43 4b 45 59 5f 50 43 53 43 5f   {..CACKEY_PCSC_
59f0: 53 5f 54 4f 4b 45 4e 50 52 45 53 45 4e 54 20 20  S_TOKENPRESENT  
5a00: 20 20 3d 20 31 2c 0a 09 43 41 43 4b 45 59 5f 50    = 1,..CACKEY_P
5a10: 43 53 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20  CSC_S_OK        
5a20: 20 20 20 20 20 20 3d 20 30 2c 0a 09 43 41 43 4b        = 0,..CACK
5a30: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49  EY_PCSC_E_GENERI
5a40: 43 20 20 20 20 20 20 20 20 20 3d 20 2d 31 2c 0a  C         = -1,.
5a50: 09 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 42  .CACKEY_PCSC_E_B
5a60: 41 44 50 49 4e 20 20 20 20 20 20 20 20 20 20 3d  ADPIN          =
5a70: 20 2d 32 2c 0a 09 43 41 43 4b 45 59 5f 50 43 53   -2,..CACKEY_PCS
5a80: 43 5f 45 5f 4c 4f 43 4b 45 44 20 20 20 20 20 20  C_E_LOCKED      
5a90: 20 20 20 20 3d 20 2d 33 2c 0a 09 43 41 43 4b 45      = -3,..CACKE
5aa0: 59 5f 50 43 53 43 5f 45 5f 4e 45 45 44 4c 4f 47  Y_PCSC_E_NEEDLOG
5ab0: 49 4e 20 20 20 20 20 20 20 3d 20 2d 34 2c 0a 09  IN       = -4,..
5ac0: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f  CACKEY_PCSC_E_TO
5ad0: 4b 45 4e 41 42 53 45 4e 54 20 20 20 20 20 3d 20  KENABSENT     = 
5ae0: 2d 36 2c 0a 09 43 41 43 4b 45 59 5f 50 43 53 43  -6,..CACKEY_PCSC
5af0: 5f 45 5f 52 45 54 52 59 20 20 20 20 20 20 20 20  _E_RETRY        
5b00: 20 20 20 3d 20 2d 37 2c 0a 09 43 41 43 4b 45 59     = -7,..CACKEY
5b10: 5f 50 43 53 43 5f 45 5f 4e 4f 44 41 54 41 20 20  _PCSC_E_NODATA  
5b20: 20 20 20 20 20 20 20 20 3d 20 2d 38 0a 7d 20 63          = -8.} c
5b30: 61 63 6b 65 79 5f 72 65 74 3b 0a 0a 73 74 72 75  ackey_ret;..stru
5b40: 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 63 61  ct cackey_tlv_ca
5b50: 72 64 75 72 6c 20 7b 0a 09 75 6e 73 69 67 6e 65  rdurl {..unsigne
5b60: 64 20 63 68 61 72 20 20 20 20 20 20 20 20 72 69  d char        ri
5b70: 64 5b 35 5d 3b 0a 09 63 61 63 6b 65 79 5f 74 6c  d[5];..cackey_tl
5b80: 76 5f 61 70 70 74 79 70 65 20 20 20 61 70 70 74  v_apptype   appt
5b90: 79 70 65 3b 0a 09 63 61 63 6b 65 79 5f 74 6c 76  ype;..cackey_tlv
5ba0: 5f 6f 62 6a 65 63 74 69 64 20 20 6f 62 6a 65 63  _objectid  objec
5bb0: 74 69 64 3b 0a 09 63 61 63 6b 65 79 5f 74 6c 76  tid;..cackey_tlv
5bc0: 5f 6f 62 6a 65 63 74 69 64 20 20 61 70 70 69 64  _objectid  appid
5bd0: 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72  ;..unsigned char
5be0: 20 20 20 20 20 20 20 20 70 69 6e 69 64 3b 0a 7d          pinid;.}
5bf0: 3b 0a 0a 73 74 72 75 63 74 20 63 61 63 6b 65 79  ;..struct cackey
5c00: 5f 74 6c 76 5f 65 6e 74 69 74 79 3b 0a 73 74 72  _tlv_entity;.str
5c10: 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65  uct cackey_tlv_e
5c20: 6e 74 69 74 79 20 7b 0a 09 75 69 6e 74 38 5f 74  ntity {..uint8_t
5c30: 20 74 61 67 3b 0a 09 73 69 7a 65 5f 74 20 6c 65   tag;..size_t le
5c40: 6e 67 74 68 3b 0a 0a 09 75 6e 69 6f 6e 20 7b 0a  ngth;...union {.
5c50: 09 09 76 6f 69 64 20 2a 76 61 6c 75 65 3b 0a 09  ..void *value;..
5c60: 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74  .struct cackey_t
5c70: 6c 76 5f 63 61 72 64 75 72 6c 20 2a 76 61 6c 75  lv_cardurl *valu
5c80: 65 5f 63 61 72 64 75 72 6c 3b 0a 09 09 75 69 6e  e_cardurl;...uin
5c90: 74 38 5f 74 20 76 61 6c 75 65 5f 62 79 74 65 3b  t8_t value_byte;
5ca0: 0a 09 7d 3b 0a 0a 09 73 74 72 75 63 74 20 63 61  ..};...struct ca
5cb0: 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20  ckey_tlv_entity 
5cc0: 2a 5f 6e 65 78 74 3b 0a 7d 3b 0a 0a 2f 2a 20 43  *_next;.};../* C
5cd0: 41 43 4b 45 59 20 47 6c 6f 62 61 6c 20 48 61 6e  ACKEY Global Han
5ce0: 64 6c 65 73 20 2a 2f 0a 73 74 61 74 69 63 20 76  dles */.static v
5cf0: 6f 69 64 20 2a 63 61 63 6b 65 79 5f 62 69 67 6c  oid *cackey_bigl
5d00: 6f 63 6b 20 3d 20 4e 55 4c 4c 3b 0a 73 74 61 74  ock = NULL;.stat
5d10: 69 63 20 73 74 72 75 63 74 20 63 61 63 6b 65 79  ic struct cackey
5d20: 5f 73 65 73 73 69 6f 6e 20 63 61 63 6b 65 79 5f  _session cackey_
5d30: 73 65 73 73 69 6f 6e 73 5b 31 32 38 5d 3b 0a 73  sessions[128];.s
5d40: 74 61 74 69 63 20 73 74 72 75 63 74 20 63 61 63  tatic struct cac
5d50: 6b 65 79 5f 73 6c 6f 74 20 63 61 63 6b 65 79 5f  key_slot cackey_
5d60: 73 6c 6f 74 73 5b 31 32 38 5d 3b 0a 73 74 61 74  slots[128];.stat
5d70: 69 63 20 69 6e 74 20 63 61 63 6b 65 79 5f 69 6e  ic int cackey_in
5d80: 69 74 69 61 6c 69 7a 65 64 20 3d 20 30 3b 0a 73  itialized = 0;.s
5d90: 74 61 74 69 63 20 69 6e 74 20 63 61 63 6b 65 79  tatic int cackey
5da0: 5f 62 69 67 6c 6f 63 6b 5f 69 6e 69 74 20 3d 20  _biglock_init = 
5db0: 30 3b 0a 43 4b 5f 43 5f 49 4e 49 54 49 41 4c 49  0;.CK_C_INITIALI
5dc0: 5a 45 5f 41 52 47 53 20 63 61 63 6b 65 79 5f 61  ZE_ARGS cackey_a
5dd0: 72 67 73 3b 0a 0a 2f 2a 2a 20 45 78 74 72 61 20  rgs;../** Extra 
5de0: 63 65 72 74 69 66 69 63 61 74 65 73 20 74 6f 20  certificates to 
5df0: 69 6e 63 6c 75 64 65 20 69 6e 20 74 6f 6b 65 6e  include in token
5e00: 20 2a 2a 2f 0a 73 74 72 75 63 74 20 63 61 63 6b   **/.struct cack
5e10: 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79  ey_pcsc_identity
5e20: 20 65 78 74 72 61 5f 63 65 72 74 73 5b 5d 20 3d   extra_certs[] =
5e30: 20 7b 0a 23 69 6e 63 6c 75 64 65 20 22 63 61 63   {.#include "cac
5e40: 6b 65 79 5f 62 75 69 6c 74 69 6e 5f 63 65 72 74  key_builtin_cert
5e50: 73 2e 68 22 0a 7d 3b 0a 0a 23 64 65 66 69 6e 65  s.h".};..#define
5e60: 20 43 41 43 4b 45 59 5f 4d 41 43 52 4f 5f 44 45   CACKEY_MACRO_DE
5e70: 46 41 55 4c 54 5f 58 53 54 52 28 73 74 72 29 20  FAULT_XSTR(str) 
5e80: 43 41 43 4b 45 59 5f 4d 41 43 52 4f 5f 44 45 46  CACKEY_MACRO_DEF
5e90: 41 55 4c 54 5f 53 54 52 28 73 74 72 29 0a 23 64  AULT_STR(str).#d
5ea0: 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 4d 41 43  efine CACKEY_MAC
5eb0: 52 4f 5f 44 45 46 41 55 4c 54 5f 53 54 52 28 73  RO_DEFAULT_STR(s
5ec0: 74 72 29 20 23 73 74 72 0a 0a 2f 2a 20 50 72 6f  tr) #str../* Pro
5ed0: 74 65 63 74 65 64 20 41 75 74 68 65 6e 74 69 63  tected Authentic
5ee0: 61 74 69 6f 6e 20 50 61 74 68 20 63 6f 6d 6d 61  ation Path comma
5ef0: 6e 64 20 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  nd */.static cha
5f00: 72 20 2a 63 61 63 6b 65 79 5f 70 69 6e 5f 63 6f  r *cackey_pin_co
5f10: 6d 6d 61 6e 64 20 3d 20 4e 55 4c 4c 3b 0a 0a 2f  mmand = NULL;../
5f20: 2a 20 52 65 61 64 65 72 20 45 78 63 6c 75 73 69  * Reader Exclusi
5f30: 6f 6e 20 6f 72 20 49 6e 63 6c 75 64 65 2d 6f 6e  on or Include-on
5f40: 6c 79 20 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  ly */.static cha
5f50: 72 20 2a 63 61 63 6b 65 79 5f 72 65 61 64 65 72  r *cackey_reader
5f60: 73 5f 69 6e 63 6c 75 64 65 5f 6f 6e 6c 79 20 3d  s_include_only =
5f70: 20 4e 55 4c 4c 3b 0a 73 74 61 74 69 63 20 63 68   NULL;.static ch
5f80: 61 72 20 2a 63 61 63 6b 65 79 5f 72 65 61 64 65  ar *cackey_reade
5f90: 72 73 5f 65 78 63 6c 75 64 65 20 3d 20 4e 55 4c  rs_exclude = NUL
5fa0: 4c 3b 0a 0a 2f 2a 20 50 43 53 43 20 47 6c 6f 62  L;../* PCSC Glob
5fb0: 61 6c 20 48 61 6e 64 6c 65 73 20 2a 2f 0a 73 74  al Handles */.st
5fc0: 61 74 69 63 20 4c 50 53 43 41 52 44 43 4f 4e 54  atic LPSCARDCONT
5fd0: 45 58 54 20 63 61 63 6b 65 79 5f 70 63 73 63 5f  EXT cackey_pcsc_
5fe0: 68 61 6e 64 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 0a  handle = NULL;..
5ff0: 73 74 61 74 69 63 20 75 6e 73 69 67 6e 65 64 20  static unsigned 
6000: 6c 6f 6e 67 20 63 61 63 6b 65 79 5f 67 65 74 76  long cackey_getv
6010: 65 72 73 69 6f 6e 28 76 6f 69 64 29 20 7b 0a 09  ersion(void) {..
6020: 73 74 61 74 69 63 20 75 6e 73 69 67 6e 65 64 20  static unsigned 
6030: 6c 6f 6e 67 20 72 65 74 76 61 6c 20 3d 20 32 35  long retval = 25
6040: 35 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  5;..unsigned lon
6050: 67 20 6d 61 6a 6f 72 20 3d 20 30 3b 0a 09 75 6e  g major = 0;..un
6060: 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6d 69 6e 6f  signed long mino
6070: 72 20 3d 20 30 3b 0a 09 63 68 61 72 20 2a 6d 61  r = 0;..char *ma
6080: 6a 6f 72 5f 73 74 72 20 3d 20 4e 55 4c 4c 3b 0a  jor_str = NULL;.
6090: 09 63 68 61 72 20 2a 6d 69 6e 6f 72 5f 73 74 72  .char *minor_str
60a0: 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 43 41 43 4b 45   = NULL;...CACKE
60b0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
60c0: 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
60d0: 28 72 65 74 76 61 6c 20 21 3d 20 32 35 35 29 20  (retval != 255) 
60e0: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
60f0: 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
6100: 6e 67 20 30 78 25 6c 78 20 28 63 61 63 68 65 64  ng 0x%lx (cached
6110: 29 2e 22 2c 20 72 65 74 76 61 6c 29 3b 0a 0a 09  ).", retval);...
6120: 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b  .return(retval);
6130: 0a 09 7d 0a 0a 09 72 65 74 76 61 6c 20 3d 20 30  ..}...retval = 0
6140: 3b 0a 0a 23 69 66 64 65 66 20 50 41 43 4b 41 47  ;..#ifdef PACKAG
6150: 45 5f 56 45 52 53 49 4f 4e 0a 20 20 20 20 20 20  E_VERSION.      
6160: 20 20 6d 61 6a 6f 72 5f 73 74 72 20 3d 20 50 41    major_str = PA
6170: 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e 3b 0a 09  CKAGE_VERSION;..
6180: 69 66 20 28 6d 61 6a 6f 72 5f 73 74 72 29 20 7b  if (major_str) {
6190: 0a 09 20 20 20 20 20 20 20 20 6d 61 6a 6f 72 20  ..        major 
61a0: 3d 20 73 74 72 74 6f 75 6c 28 6d 61 6a 6f 72 5f  = strtoul(major_
61b0: 73 74 72 2c 20 26 6d 69 6e 6f 72 5f 73 74 72 2c  str, &minor_str,
61c0: 20 31 30 29 3b 0a 0a 09 09 69 66 20 28 6d 69 6e   10);....if (min
61d0: 6f 72 5f 73 74 72 29 20 7b 0a 09 09 09 6d 69 6e  or_str) {....min
61e0: 6f 72 20 3d 20 73 74 72 74 6f 75 6c 28 6d 69 6e  or = strtoul(min
61f0: 6f 72 5f 73 74 72 20 2b 20 31 2c 20 4e 55 4c 4c  or_str + 1, NULL
6200: 2c 20 31 30 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09  , 10);...}..}...
6210: 72 65 74 76 61 6c 20 3d 20 28 6d 61 6a 6f 72 20  retval = (major 
6220: 3c 3c 20 31 36 29 20 7c 20 28 6d 69 6e 6f 72 20  << 16) | (minor 
6230: 3c 3c 20 38 29 3b 0a 23 65 6e 64 69 66 0a 0a 09  << 8);.#endif...
6240: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
6250: 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 30  NTF("Returning 0
6260: 78 25 6c 78 22 2c 20 72 65 74 76 61 6c 29 3b 0a  x%lx", retval);.
6270: 0a 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29  ..return(retval)
6280: 3b 0a 7d 0a 0a 2f 2a 20 50 43 2f 53 43 20 52 65  ;.}../* PC/SC Re
6290: 6c 61 74 65 64 20 46 75 6e 63 74 69 6f 6e 73 20  lated Functions 
62a0: 2a 2f 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49  */./*. * SYNPOSI
62b0: 53 0a 20 2a 20 20 20 20 20 76 6f 69 64 20 63 61  S. *     void ca
62c0: 63 6b 65 79 5f 73 6c 6f 74 73 5f 64 69 73 63 6f  ckey_slots_disco
62d0: 6e 6e 65 63 74 5f 61 6c 6c 28 69 6e 74 20 75 6e  nnect_all(int un
62e0: 69 74 69 61 6c 69 7a 65 5f 61 6c 6c 5f 72 65 61  itialize_all_rea
62f0: 64 65 72 73 29 3b 0a 20 2a 0a 20 2a 20 41 52 47  ders);. *. * ARG
6300: 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 69 6e  UMENTS. *     in
6310: 74 20 75 6e 69 74 69 61 6c 69 7a 65 5f 61 6c 6c  t unitialize_all
6320: 5f 72 65 61 64 65 72 73 20 20 20 20 20 20 46 72  _readers      Fr
6330: 65 65 20 74 68 65 20 22 70 63 73 63 5f 72 65 61  ee the "pcsc_rea
6340: 64 65 72 22 20 6f 62 6a 65 63 74 20 61 73 73 6f  der" object asso
6350: 63 69 61 74 65 64 20 77 69 74 68 0a 20 2a 20 20  ciated with. *  
6360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6370: 20 20 20 20 20 20 20 20 20 65 61 63 68 20 73 6c           each sl
6380: 6f 74 20 28 62 6f 6f 6c 65 61 6e 29 0a 20 2a 0a  ot (boolean). *.
6390: 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a   * RETURN VALUE.
63a0: 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20   *     None. *. 
63b0: 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 54  * NOTES. *     T
63c0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 69 73  his function dis
63d0: 63 6f 6e 6e 65 63 74 73 20 66 72 6f 6d 20 61 6c  connects from al
63e0: 6c 20 63 61 72 64 73 2e 0a 20 2a 0a 20 2a 2f 0a  l cards.. *. */.
63f0: 73 74 61 74 69 63 20 76 6f 69 64 20 63 61 63 6b  static void cack
6400: 65 79 5f 73 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e  ey_slots_disconn
6410: 65 63 74 5f 61 6c 6c 28 69 6e 74 20 75 6e 69 74  ect_all(int unit
6420: 69 61 6c 69 7a 65 5f 61 6c 6c 5f 72 65 61 64 65  ialize_all_reade
6430: 72 73 29 20 7b 0a 09 75 69 6e 74 33 32 5f 74 20  rs) {..uint32_t 
6440: 69 64 78 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  idx;...CACKEY_DE
6450: 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
6460: 65 64 2e 22 29 3b 0a 0a 09 66 6f 72 20 28 69 64  ed.");...for (id
6470: 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 28 73 69  x = 0; idx < (si
6480: 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
6490: 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
64a0: 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b 20 69  ey_slots[0])); i
64b0: 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28 63 61  dx++) {...if (ca
64c0: 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e  ckey_slots[idx].
64d0: 69 6e 74 65 72 6e 61 6c 29 20 7b 0a 09 09 09 2f  internal) {..../
64e0: 2a 20 53 6b 69 70 20 69 6e 74 65 72 6e 61 6c 20  * Skip internal 
64f0: 73 6c 6f 74 73 20 2a 2f 0a 09 09 09 63 6f 6e 74  slots */....cont
6500: 69 6e 75 65 3b 0a 09 09 7d 0a 0a 09 09 69 66 20  inue;...}....if 
6510: 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64  (cackey_slots[id
6520: 78 5d 2e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e  x].pcsc_card_con
6530: 6e 65 63 74 65 64 29 20 7b 0a 09 09 09 43 41 43  nected) {....CAC
6540: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
6550: 28 22 53 43 61 72 64 44 69 73 63 6f 6e 6e 65 63  ("SCardDisconnec
6560: 74 28 25 6c 75 29 20 63 61 6c 6c 65 64 22 2c 20  t(%lu) called", 
6570: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
6580: 69 64 78 29 3b 0a 0a 09 09 09 53 43 61 72 64 44  idx);.....SCardD
6590: 69 73 63 6f 6e 6e 65 63 74 28 63 61 63 6b 65 79  isconnect(cackey
65a0: 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 70 63 73 63  _slots[idx].pcsc
65b0: 5f 63 61 72 64 2c 20 53 43 41 52 44 5f 4c 45 41  _card, SCARD_LEA
65c0: 56 45 5f 43 41 52 44 29 3b 0a 09 09 7d 0a 0a 09  VE_CARD);...}...
65d0: 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74  .if (cackey_slot
65e0: 73 5b 69 64 78 5d 2e 6c 61 62 65 6c 29 20 7b 0a  s[idx].label) {.
65f0: 09 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f 73  ...free(cackey_s
6600: 6c 6f 74 73 5b 69 64 78 5d 2e 6c 61 62 65 6c 29  lots[idx].label)
6610: 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f  ;.....cackey_slo
6620: 74 73 5b 69 64 78 5d 2e 6c 61 62 65 6c 20 3d 20  ts[idx].label = 
6630: 4e 55 4c 4c 3b 0a 09 09 7d 0a 0a 09 09 69 66 20  NULL;...}....if 
6640: 28 75 6e 69 74 69 61 6c 69 7a 65 5f 61 6c 6c 5f  (unitialize_all_
6650: 72 65 61 64 65 72 73 20 7c 7c 20 21 63 61 63 6b  readers || !cack
6660: 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 61 63  ey_slots[idx].ac
6670: 74 69 76 65 29 20 7b 0a 09 09 09 69 66 20 28 63  tive) {....if (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 29 20 7b 0a  .pcsc_reader) {.
66a0: 09 09 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f  ....free(cackey_
66b0: 73 6c 6f 74 73 5b 69 64 78 5d 2e 70 63 73 63 5f  slots[idx].pcsc_
66c0: 72 65 61 64 65 72 29 3b 0a 0a 09 09 09 09 63 61  reader);......ca
66d0: 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e  ckey_slots[idx].
66e0: 70 63 73 63 5f 72 65 61 64 65 72 20 3d 20 4e 55  pcsc_reader = NU
66f0: 4c 4c 3b 0a 09 09 09 7d 0a 0a 09 09 09 63 61 63  LL;....}.....cac
6700: 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 74  key_slots[idx].t
6710: 72 61 6e 73 61 63 74 69 6f 6e 5f 6e 65 65 64 5f  ransaction_need_
6720: 68 77 5f 6c 6f 63 6b 20 3d 20 30 3b 0a 09 09 09  hw_lock = 0;....
6730: 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78  cackey_slots[idx
6740: 5d 2e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65  ].transaction_de
6750: 70 74 68 20 3d 20 30 3b 0a 09 09 09 63 61 63 6b  pth = 0;....cack
6760: 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 69 64  ey_slots[idx].id
6770: 5f 74 79 70 65 5f 68 69 6e 74 20 3d 20 43 41 43  _type_hint = CAC
6780: 4b 45 59 5f 49 44 5f 54 59 50 45 5f 55 4e 4b 4e  KEY_ID_TYPE_UNKN
6790: 4f 57 4e 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a  OWN;...} else {.
67a0: 09 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c  ...if (cackey_sl
67b0: 6f 74 73 5b 69 64 78 5d 2e 74 72 61 6e 73 61 63  ots[idx].transac
67c0: 74 69 6f 6e 5f 64 65 70 74 68 20 3e 20 30 29 20  tion_depth > 0) 
67d0: 7b 0a 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f  {.....cackey_slo
67e0: 74 73 5b 69 64 78 5d 2e 74 72 61 6e 73 61 63 74  ts[idx].transact
67f0: 69 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b  ion_need_hw_lock
6800: 20 3d 20 31 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a   = 1;....}...}..
6810: 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69  ..cackey_slots[i
6820: 64 78 5d 2e 70 63 73 63 5f 63 61 72 64 5f 63 6f  dx].pcsc_card_co
6830: 6e 6e 65 63 74 65 64 20 3d 20 30 3b 0a 0a 09 09  nnected = 0;....
6840: 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  if (cackey_slots
6850: 5b 69 64 78 5d 2e 61 63 74 69 76 65 29 20 7b 0a  [idx].active) {.
6860: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
6870: 50 52 49 4e 54 46 28 22 4d 61 72 6b 69 6e 67 20  PRINTF("Marking 
6880: 61 63 74 69 76 65 20 73 6c 6f 74 20 25 6c 75 20  active slot %lu 
6890: 61 73 20 62 65 69 6e 67 20 72 65 73 65 74 22 2c  as being reset",
68a0: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
68b0: 20 69 64 78 29 3b 0a 0a 09 09 09 63 61 63 6b 65   idx);.....cacke
68c0: 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 73 6c 6f  y_slots[idx].slo
68d0: 74 5f 72 65 73 65 74 20 3d 20 31 3b 0a 09 09 7d  t_reset = 1;...}
68e0: 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
68f0: 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
6900: 6e 69 6e 67 22 29 3b 0a 0a 09 72 65 74 75 72 6e  ning");...return
6910: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f  ;.}../*. * SYNPO
6920: 53 49 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65  SIS. *     cacke
6930: 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 70 63 73  y_ret cackey_pcs
6940: 63 5f 63 6f 6e 6e 65 63 74 28 76 6f 69 64 29 3b  c_connect(void);
6950: 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53  . *. * ARGUMENTS
6960: 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a  . *     None. *.
6970: 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a   * RETURN VALUE.
6980: 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43   *     CACKEY_PC
6990: 53 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 20  SC_S_OK         
69a0: 4f 6e 20 73 75 63 63 65 73 73 0a 20 2a 20 20 20  On success. *   
69b0: 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f    CACKEY_PCSC_E_
69c0: 47 45 4e 45 52 49 43 20 20 20 20 4f 6e 20 65 72  GENERIC    On er
69d0: 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a  ror. *. * NOTES.
69e0: 20 2a 20 20 20 20 20 54 68 69 73 20 66 75 6e 63   *     This func
69f0: 74 69 6f 6e 20 63 6f 6e 6e 65 63 74 73 20 74 6f  tion connects to
6a00: 20 74 68 65 20 50 43 2f 53 43 20 43 6f 6e 6e 65   the PC/SC Conne
6a10: 63 74 69 6f 6e 20 4d 61 6e 61 67 65 72 20 61 6e  ction Manager an
6a20: 64 20 75 70 64 61 74 65 73 20 74 68 65 0a 20 2a  d updates the. *
6a30: 20 20 20 20 20 67 6c 6f 62 61 6c 20 68 61 6e 64       global hand
6a40: 6c 65 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69  le.. *. */.stati
6a50: 63 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63  c cackey_ret cac
6a60: 6b 65 79 5f 70 63 73 63 5f 63 6f 6e 6e 65 63 74  key_pcsc_connect
6a70: 28 76 6f 69 64 29 20 7b 0a 09 4c 4f 4e 47 20 73  (void) {..LONG s
6a80: 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74  card_est_context
6a90: 5f 72 65 74 3b 0a 23 69 66 64 65 66 20 48 41 56  _ret;.#ifdef HAV
6aa0: 45 5f 53 43 41 52 44 49 53 56 41 4c 49 44 43 4f  E_SCARDISVALIDCO
6ab0: 4e 54 45 58 54 0a 09 4c 4f 4e 47 20 73 63 61 72  NTEXT..LONG scar
6ac0: 64 5f 69 73 76 61 6c 69 64 5f 72 65 74 3b 0a 23  d_isvalid_ret;.#
6ad0: 65 6e 64 69 66 0a 0a 09 43 41 43 4b 45 59 5f 44  endif...CACKEY_D
6ae0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
6af0: 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 63 61  led.");...if (ca
6b00: 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65  ckey_pcsc_handle
6b10: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 63 61   == NULL) {...ca
6b20: 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65  ckey_pcsc_handle
6b30: 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66   = malloc(sizeof
6b40: 28 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61  (*cackey_pcsc_ha
6b50: 6e 64 6c 65 29 29 3b 0a 09 09 69 66 20 28 63 61  ndle));...if (ca
6b60: 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65  ckey_pcsc_handle
6b70: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 43   == NULL) {....C
6b80: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
6b90: 54 46 28 22 43 61 6c 6c 20 74 6f 20 6d 61 6c 6c  TF("Call to mall
6ba0: 6f 63 28 29 20 66 61 69 6c 65 64 2c 20 72 65 74  oc() failed, ret
6bb0: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
6bc0: 65 22 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f  e");.....cackey_
6bd0: 73 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e 65 63 74  slots_disconnect
6be0: 5f 61 6c 6c 28 30 29 3b 0a 0a 09 09 09 72 65 74  _all(0);.....ret
6bf0: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
6c00: 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 09 7d 0a  E_GENERIC);...}.
6c10: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
6c20: 50 52 49 4e 54 46 28 22 53 43 61 72 64 45 73 74  PRINTF("SCardEst
6c30: 61 62 6c 69 73 68 43 6f 6e 74 65 78 74 28 29 20  ablishContext() 
6c40: 63 61 6c 6c 65 64 22 29 3b 0a 09 09 73 63 61 72  called");...scar
6c50: 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65  d_est_context_re
6c60: 74 20 3d 20 53 43 61 72 64 45 73 74 61 62 6c 69  t = SCardEstabli
6c70: 73 68 43 6f 6e 74 65 78 74 28 53 43 41 52 44 5f  shContext(SCARD_
6c80: 53 43 4f 50 45 5f 53 59 53 54 45 4d 2c 20 4e 55  SCOPE_SYSTEM, NU
6c90: 4c 4c 2c 20 4e 55 4c 4c 2c 20 63 61 63 6b 65 79  LL, NULL, cackey
6ca0: 5f 70 63 73 63 5f 68 61 6e 64 6c 65 29 3b 0a 09  _pcsc_handle);..
6cb0: 09 69 66 20 28 73 63 61 72 64 5f 65 73 74 5f 63  .if (scard_est_c
6cc0: 6f 6e 74 65 78 74 5f 72 65 74 20 21 3d 20 53 43  ontext_ret != SC
6cd0: 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b  ARD_S_SUCCESS) {
6ce0: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
6cf0: 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 20 74 6f  _PRINTF("Call to
6d00: 20 53 43 61 72 64 45 73 74 61 62 6c 69 73 68 43   SCardEstablishC
6d10: 6f 6e 74 65 78 74 20 66 61 69 6c 65 64 20 28 72  ontext failed (r
6d20: 65 74 75 72 6e 65 64 20 25 73 2f 25 6c 69 29 2c  eturned %s/%li),
6d30: 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61   returning in fa
6d40: 69 6c 75 72 65 22 2c 20 43 41 43 4b 45 59 5f 44  ilure", CACKEY_D
6d50: 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45  EBUG_FUNC_SCARDE
6d60: 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 5f  RR_TO_STR(scard_
6d70: 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74 29  est_context_ret)
6d80: 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72 64 5f 65  , (long) scard_e
6d90: 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74 29 3b  st_context_ret);
6da0: 0a 0a 09 09 09 66 72 65 65 28 63 61 63 6b 65 79  .....free(cackey
6db0: 5f 70 63 73 63 5f 68 61 6e 64 6c 65 29 3b 0a 09  _pcsc_handle);..
6dc0: 09 09 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61  ..cackey_pcsc_ha
6dd0: 6e 64 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09  ndle = NULL;....
6de0: 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5f 64 69  .cackey_slots_di
6df0: 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28 30 29 3b  sconnect_all(0);
6e00: 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b  .....return(CACK
6e10: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49  EY_PCSC_E_GENERI
6e20: 43 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 23 69 66 64  C);...}..}..#ifd
6e30: 65 66 20 48 41 56 45 5f 53 43 41 52 44 49 53 56  ef HAVE_SCARDISV
6e40: 41 4c 49 44 43 4f 4e 54 45 58 54 0a 09 43 41 43  ALIDCONTEXT..CAC
6e50: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
6e60: 28 22 53 43 61 72 64 49 73 56 61 6c 69 64 43 6f  ("SCardIsValidCo
6e70: 6e 74 65 78 74 28 29 20 63 61 6c 6c 65 64 22 29  ntext() called")
6e80: 3b 0a 09 73 63 61 72 64 5f 69 73 76 61 6c 69 64  ;..scard_isvalid
6e90: 5f 72 65 74 20 3d 20 53 43 61 72 64 49 73 56 61  _ret = SCardIsVa
6ea0: 6c 69 64 43 6f 6e 74 65 78 74 28 2a 63 61 63 6b  lidContext(*cack
6eb0: 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 29 3b  ey_pcsc_handle);
6ec0: 0a 09 69 66 20 28 73 63 61 72 64 5f 69 73 76 61  ..if (scard_isva
6ed0: 6c 69 64 5f 72 65 74 20 21 3d 20 53 43 41 52 44  lid_ret != SCARD
6ee0: 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09  _S_SUCCESS) {...
6ef0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
6f00: 4e 54 46 28 22 48 61 6e 64 6c 65 20 68 61 73 20  NTF("Handle has 
6f10: 62 65 63 6f 6d 65 20 69 6e 76 61 6c 69 64 20 28  become invalid (
6f20: 53 43 61 72 64 49 73 56 61 6c 69 64 43 6f 6e 74  SCardIsValidCont
6f30: 65 78 74 20 3d 20 25 73 2f 25 6c 69 29 2c 20 74  ext = %s/%li), t
6f40: 72 79 69 6e 67 20 74 6f 20 72 65 2d 65 73 74 61  rying to re-esta
6f50: 62 6c 69 73 68 2e 2e 2e 22 2c 20 43 41 43 4b 45  blish...", CACKE
6f60: 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41  Y_DEBUG_FUNC_SCA
6f70: 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61  RDERR_TO_STR(sca
6f80: 72 64 5f 69 73 76 61 6c 69 64 5f 72 65 74 29 2c  rd_isvalid_ret),
6f90: 20 28 6c 6f 6e 67 29 20 73 63 61 72 64 5f 69 73   (long) scard_is
6fa0: 76 61 6c 69 64 5f 72 65 74 29 3b 0a 0a 09 09 43  valid_ret);....C
6fb0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
6fc0: 54 46 28 22 53 43 61 72 64 45 73 74 61 62 6c 69  TF("SCardEstabli
6fd0: 73 68 43 6f 6e 74 65 78 74 28 29 20 63 61 6c 6c  shContext() call
6fe0: 65 64 22 29 3b 0a 09 09 73 63 61 72 64 5f 65 73  ed");...scard_es
6ff0: 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74 20 3d 20  t_context_ret = 
7000: 53 43 61 72 64 45 73 74 61 62 6c 69 73 68 43 6f  SCardEstablishCo
7010: 6e 74 65 78 74 28 53 43 41 52 44 5f 53 43 4f 50  ntext(SCARD_SCOP
7020: 45 5f 53 59 53 54 45 4d 2c 20 4e 55 4c 4c 2c 20  E_SYSTEM, NULL, 
7030: 4e 55 4c 4c 2c 20 63 61 63 6b 65 79 5f 70 63 73  NULL, cackey_pcs
7040: 63 5f 68 61 6e 64 6c 65 29 3b 0a 09 09 69 66 20  c_handle);...if 
7050: 28 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65  (scard_est_conte
7060: 78 74 5f 72 65 74 20 21 3d 20 53 43 41 52 44 5f  xt_ret != SCARD_
7070: 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09 09  S_SUCCESS) {....
7080: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
7090: 4e 54 46 28 22 43 61 6c 6c 20 74 6f 20 53 43 61  NTF("Call to SCa
70a0: 72 64 45 73 74 61 62 6c 69 73 68 43 6f 6e 74 65  rdEstablishConte
70b0: 78 74 20 66 61 69 6c 65 64 20 28 72 65 74 75 72  xt failed (retur
70c0: 6e 65 64 20 25 73 2f 25 6c 69 29 2c 20 72 65 74  ned %s/%li), ret
70d0: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
70e0: 65 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47  e", CACKEY_DEBUG
70f0: 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54  _FUNC_SCARDERR_T
7100: 4f 5f 53 54 52 28 73 63 61 72 64 5f 65 73 74 5f  O_STR(scard_est_
7110: 63 6f 6e 74 65 78 74 5f 72 65 74 29 2c 20 28 6c  context_ret), (l
7120: 6f 6e 67 29 20 73 63 61 72 64 5f 65 73 74 5f 63  ong) scard_est_c
7130: 6f 6e 74 65 78 74 5f 72 65 74 29 3b 0a 0a 09 09  ontext_ret);....
7140: 09 66 72 65 65 28 63 61 63 6b 65 79 5f 70 63 73  .free(cackey_pcs
7150: 63 5f 68 61 6e 64 6c 65 29 3b 0a 09 09 09 63 61  c_handle);....ca
7160: 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65  ckey_pcsc_handle
7170: 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 63 61 63   = NULL;.....cac
7180: 6b 65 79 5f 73 6c 6f 74 73 5f 64 69 73 63 6f 6e  key_slots_discon
7190: 6e 65 63 74 5f 61 6c 6c 28 30 29 3b 0a 0a 09 09  nect_all(0);....
71a0: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
71b0: 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a  CSC_E_GENERIC);.
71c0: 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  ..}....CACKEY_DE
71d0: 42 55 47 5f 50 52 49 4e 54 46 28 22 48 61 6e 64  BUG_PRINTF("Hand
71e0: 6c 65 20 68 61 73 20 62 65 65 6e 20 72 65 2d 65  le has been re-e
71f0: 73 74 61 62 6c 69 73 68 65 64 22 29 3b 0a 09 7d  stablished");..}
7200: 0a 23 65 6e 64 69 66 0a 0a 09 43 41 43 4b 45 59  .#endif...CACKEY
7210: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53  _DEBUG_PRINTF("S
7220: 75 63 65 73 73 66 75 6c 6c 79 20 63 6f 6e 6e 65  ucessfully conne
7230: 63 74 65 64 20 74 6f 20 50 43 2f 53 43 2c 20 72  cted to PC/SC, r
7240: 65 74 75 72 6e 69 6e 67 20 69 6e 20 73 75 63 63  eturning in succ
7250: 65 73 73 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28  ess");...return(
7260: 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
7270: 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50  );.}../*. * SYNP
7280: 4f 53 49 53 0a 20 2a 20 20 20 20 20 63 61 63 6b  OSIS. *     cack
7290: 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 70 63  ey_ret cackey_pc
72a0: 73 63 5f 64 69 73 63 6f 6e 6e 65 63 74 28 76 6f  sc_disconnect(vo
72b0: 69 64 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d  id);. *. * ARGUM
72c0: 45 4e 54 53 0a 20 2a 20 20 20 20 20 4e 6f 6e 65  ENTS. *     None
72d0: 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41  . *. * RETURN VA
72e0: 4c 55 45 0a 20 2a 20 20 20 20 20 43 41 43 4b 45  LUE. *     CACKE
72f0: 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20 20 20  Y_PCSC_S_OK     
7300: 20 20 20 20 4f 6e 20 73 75 63 63 65 73 73 0a 20      On success. 
7310: 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53  *     CACKEY_PCS
7320: 43 5f 45 5f 47 45 4e 45 52 49 43 20 20 20 20 4f  C_E_GENERIC    O
7330: 6e 20 65 72 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f  n error. *. * NO
7340: 54 45 53 0a 20 2a 20 20 20 20 20 54 68 69 73 20  TES. *     This 
7350: 66 75 6e 63 74 69 6f 6e 20 64 69 73 63 6f 6e 6e  function disconn
7360: 65 63 74 73 20 66 72 6f 6d 20 74 68 65 20 50 43  ects from the PC
7370: 2f 53 43 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 6d  /SC Connection m
7380: 61 6e 61 67 65 72 20 61 6e 64 20 75 70 64 61 74  anager and updat
7390: 65 73 0a 20 2a 20 20 20 20 20 74 68 65 20 67 6c  es. *     the gl
73a0: 6f 62 61 6c 20 68 61 6e 64 6c 65 2e 0a 20 2a 0a  obal handle.. *.
73b0: 20 2a 2f 0a 73 74 61 74 69 63 20 63 61 63 6b 65   */.static cacke
73c0: 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 70 63 73  y_ret cackey_pcs
73d0: 63 5f 64 69 73 63 6f 6e 6e 65 63 74 28 76 6f 69  c_disconnect(voi
73e0: 64 29 20 7b 0a 09 4c 4f 4e 47 20 73 63 61 72 64  d) {..LONG scard
73f0: 5f 72 65 6c 5f 63 6f 6e 74 65 78 74 5f 72 65 74  _rel_context_ret
7400: 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
7410: 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
7420: 22 29 3b 0a 0a 09 69 66 20 28 63 61 63 6b 65 79  ");...if (cackey
7430: 5f 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d 3d 20  _pcsc_handle == 
7440: 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e  NULL) {...return
7450: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f  (CACKEY_PCSC_S_O
7460: 4b 29 3b 0a 09 7d 0a 0a 09 73 63 61 72 64 5f 72  K);..}...scard_r
7470: 65 6c 5f 63 6f 6e 74 65 78 74 5f 72 65 74 20 3d  el_context_ret =
7480: 20 53 43 61 72 64 52 65 6c 65 61 73 65 43 6f 6e   SCardReleaseCon
7490: 74 65 78 74 28 2a 63 61 63 6b 65 79 5f 70 63 73  text(*cackey_pcs
74a0: 63 5f 68 61 6e 64 6c 65 29 3b 0a 0a 09 69 66 20  c_handle);...if 
74b0: 28 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e  (cackey_pcsc_han
74c0: 64 6c 65 29 20 7b 0a 09 09 66 72 65 65 28 63 61  dle) {...free(ca
74d0: 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65  ckey_pcsc_handle
74e0: 29 3b 0a 09 0a 09 09 63 61 63 6b 65 79 5f 70 63  );.....cackey_pc
74f0: 73 63 5f 68 61 6e 64 6c 65 20 3d 20 4e 55 4c 4c  sc_handle = NULL
7500: 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 63 61 72 64  ;..}...if (scard
7510: 5f 72 65 6c 5f 63 6f 6e 74 65 78 74 5f 72 65 74  _rel_context_ret
7520: 20 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43   != SCARD_S_SUCC
7530: 45 53 53 29 20 7b 0a 09 09 72 65 74 75 72 6e 28  ESS) {...return(
7540: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45  CACKEY_PCSC_E_GE
7550: 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 63 61 63  NERIC);..}...cac
7560: 6b 65 79 5f 73 6c 6f 74 73 5f 64 69 73 63 6f 6e  key_slots_discon
7570: 6e 65 63 74 5f 61 6c 6c 28 30 29 3b 0a 0a 09 72  nect_all(0);...r
7580: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
7590: 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20  C_S_OK);.}../*. 
75a0: 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20  * SYNPOSIS. *   
75b0: 20 20 76 6f 69 64 20 63 61 63 6b 65 79 5f 6d 61    void cackey_ma
75c0: 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74 28 73 74  rk_slot_reset(st
75d0: 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74  ruct cackey_slot
75e0: 20 2a 73 6c 6f 74 29 3b 0a 20 2a 0a 20 2a 20 41   *slot);. *. * A
75f0: 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20  RGUMENTS. *     
7600: 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 52 45 54 55 52  None. *. * RETUR
7610: 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 4e  N VALUE. *     N
7620: 6f 6e 65 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a  one. *. * NOTES.
7630: 20 2a 20 20 20 20 20 54 68 69 73 20 66 75 6e 63   *     This func
7640: 74 69 6f 6e 20 6d 61 72 6b 73 20 61 20 73 6c 6f  tion marks a slo
7650: 74 20 68 61 73 20 68 61 76 69 6e 67 20 62 65 65  t has having bee
7660: 6e 20 72 65 73 65 74 2c 20 74 6f 20 6c 61 74 65  n reset, to late
7670: 72 20 62 65 20 63 6c 65 61 6e 65 64 20 75 70 2e  r be cleaned up.
7680: 0a 20 2a 20 20 20 20 20 43 6c 65 61 6e 75 70 20  . *     Cleanup 
7690: 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 77 68 65  only happens whe
76a0: 6e 20 61 20 50 4b 43 53 23 31 31 20 63 6c 69 65  n a PKCS#11 clie
76b0: 6e 74 20 63 61 6c 6c 73 20 43 5f 46 69 6e 64 4f  nt calls C_FindO
76c0: 62 6a 65 63 74 73 49 6e 69 74 2e 0a 20 2a 0a 20  bjectsInit.. *. 
76d0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
76e0: 61 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f  ackey_mark_slot_
76f0: 72 65 73 65 74 28 73 74 72 75 63 74 20 63 61 63  reset(struct cac
7700: 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 20  key_slot *slot) 
7710: 7b 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65 79  {..struct cackey
7720: 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a  _pcsc_identity *
7730: 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 3b  pcsc_identities;
7740: 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  ..unsigned long 
7750: 6e 75 6d 5f 63 65 72 74 73 3b 0a 0a 09 69 66 20  num_certs;...if 
7760: 28 73 6c 6f 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b  (slot == NULL) {
7770: 0a 09 09 72 65 74 75 72 6e 3b 0a 09 7d 0a 0a 09  ...return;..}...
7780: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
7790: 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
77a0: 0a 09 69 66 20 28 73 6c 6f 74 2d 3e 70 63 73 63  ..if (slot->pcsc
77b0: 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 29  _card_connected)
77c0: 20 7b 0a 09 09 53 43 61 72 64 44 69 73 63 6f 6e   {...SCardDiscon
77d0: 6e 65 63 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f  nect(slot->pcsc_
77e0: 63 61 72 64 2c 20 53 43 41 52 44 5f 4c 45 41 56  card, SCARD_LEAV
77f0: 45 5f 43 41 52 44 29 3b 0a 09 7d 0a 0a 09 73 6c  E_CARD);..}...sl
7800: 6f 74 2d 3e 73 6c 6f 74 5f 72 65 73 65 74 20 3d  ot->slot_reset =
7810: 20 31 3b 0a 09 73 6c 6f 74 2d 3e 70 63 73 63 5f   1;..slot->pcsc_
7820: 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 20 3d  card_connected =
7830: 20 30 3b 0a 09 69 66 20 28 63 61 63 6b 65 79 5f   0;..if (cackey_
7840: 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20 3d 3d 20 4e  pin_command == N
7850: 55 4c 4c 29 20 7b 0a 09 09 73 6c 6f 74 2d 3e 74  ULL) {...slot->t
7860: 6f 6b 65 6e 5f 66 6c 61 67 73 20 3d 20 43 4b 46  oken_flags = CKF
7870: 5f 4c 4f 47 49 4e 5f 52 45 51 55 49 52 45 44 3b  _LOGIN_REQUIRED;
7880: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 73 6c 6f  ..} else {...slo
7890: 74 2d 3e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 3d  t->token_flags =
78a0: 20 30 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 3b   0;..}...return;
78b0: 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53  .}../*. * SYNPOS
78c0: 49 53 0a 20 2a 20 20 20 20 20 4c 4f 4e 47 20 63  IS. *     LONG c
78d0: 61 63 6b 65 79 5f 72 65 63 6f 6e 6e 65 63 74 5f  ackey_reconnect_
78e0: 63 61 72 64 28 73 74 72 75 63 74 20 63 61 63 6b  card(struct cack
78f0: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 44  ey_slot *slot, D
7900: 57 4f 52 44 20 64 65 66 61 75 6c 74 5f 70 72 6f  WORD default_pro
7910: 74 6f 63 6f 6c 29 3b 0a 20 2a 0a 20 2a 20 41 52  tocol);. *. * AR
7920: 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 63  GUMENTS. *     c
7930: 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74  ackey_slot *slot
7940: 0a 20 2a 20 20 20 20 20 20 20 20 20 53 6c 6f 74  . *         Slot
7950: 20 74 6f 20 73 65 6e 64 20 63 6f 6d 6d 61 6e 64   to send command
7960: 73 20 74 6f 0a 20 2a 0a 20 2a 20 20 20 20 20 44  s to. *. *     D
7970: 57 4f 52 44 20 64 65 66 61 75 6c 74 5f 70 72 6f  WORD default_pro
7980: 74 6f 63 6f 6c 0a 20 2a 20 20 20 20 20 20 20 20  tocol. *        
7990: 20 50 72 6f 74 6f 63 6f 6c 20 74 6f 20 61 74 74   Protocol to att
79a0: 65 6d 70 74 20 66 69 72 73 74 0a 20 2a 0a 20 2a  empt first. *. *
79b0: 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a   RETURN VALUE. *
79c0: 20 20 20 20 20 54 68 65 20 72 65 74 75 72 6e 20       The return 
79d0: 76 61 6c 75 65 20 66 72 6f 6d 20 53 43 61 72 64  value from SCard
79e0: 52 65 63 6f 6e 6e 65 63 74 28 29 0a 20 2a 0a 20  Reconnect(). *. 
79f0: 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 54  * NOTES. *     T
7a00: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
7a10: 61 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64  a wrapper around
7a20: 20 53 43 61 72 64 52 65 63 6f 6e 6e 65 63 74 28   SCardReconnect(
7a30: 29 0a 20 2a 0a 20 2a 20 20 20 20 20 54 68 65 20  ). *. *     The 
7a40: 53 43 61 72 64 52 65 63 6f 6e 6e 65 63 74 28 29  SCardReconnect()
7a50: 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 77   function call w
7a60: 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 66 69  ill be called fi
7a70: 72 73 74 20 77 69 74 68 20 74 68 65 0a 20 2a 20  rst with the. * 
7a80: 20 20 20 20 64 77 50 72 65 66 65 72 72 65 64 50      dwPreferredP
7a90: 72 6f 74 6f 63 6f 6c 73 20 6f 66 20 22 64 65 66  rotocols of "def
7aa0: 61 75 6c 74 5f 70 72 6f 74 6f 63 6f 6c 22 2e 20  ault_protocol". 
7ab0: 20 49 66 20 74 68 61 74 20 63 61 6c 6c 20 72 65   If that call re
7ac0: 74 75 72 6e 73 0a 20 2a 20 20 20 20 20 53 43 41  turns. *     SCA
7ad0: 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41  RD_E_PROTO_MISMA
7ae0: 54 43 48 20 74 72 79 20 61 67 61 69 6e 20 77 69  TCH try again wi
7af0: 74 68 20 61 20 70 72 6f 74 6f 63 6f 6c 20 6f 66  th a protocol of
7b00: 20 54 3d 30 2c 20 61 6e 64 20 66 61 69 6c 69 6e   T=0, and failin
7b10: 67 0a 20 2a 20 20 20 20 20 74 68 61 74 20 54 3d  g. *     that T=
7b20: 31 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63  1.. *. */.static
7b30: 20 4c 4f 4e 47 20 63 61 63 6b 65 79 5f 72 65 63   LONG cackey_rec
7b40: 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73 74 72 75  onnect_card(stru
7b50: 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a  ct cackey_slot *
7b60: 73 6c 6f 74 2c 20 44 57 4f 52 44 20 64 65 66 61  slot, DWORD defa
7b70: 75 6c 74 5f 70 72 6f 74 6f 63 6f 6c 29 20 7b 0a  ult_protocol) {.
7b80: 09 44 57 4f 52 44 20 73 65 6c 65 63 74 65 64 5f  .DWORD selected_
7b90: 70 72 6f 74 6f 63 6f 6c 3b 0a 09 4c 4f 4e 47 20  protocol;..LONG 
7ba0: 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 3b 0a  scard_conn_ret;.
7bb0: 0a 09 73 65 6c 65 63 74 65 64 5f 70 72 6f 74 6f  ..selected_proto
7bc0: 63 6f 6c 20 3d 20 30 3b 0a 0a 09 73 63 61 72 64  col = 0;...scard
7bd0: 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 53 43 61 72  _conn_ret = SCar
7be0: 64 52 65 63 6f 6e 6e 65 63 74 28 73 6c 6f 74 2d  dReconnect(slot-
7bf0: 3e 70 63 73 63 5f 63 61 72 64 2c 20 53 43 41 52  >pcsc_card, SCAR
7c00: 44 5f 53 48 41 52 45 5f 53 48 41 52 45 44 2c 20  D_SHARE_SHARED, 
7c10: 64 65 66 61 75 6c 74 5f 70 72 6f 74 6f 63 6f 6c  default_protocol
7c20: 2c 20 53 43 41 52 44 5f 52 45 53 45 54 5f 43 41  , SCARD_RESET_CA
7c30: 52 44 2c 20 26 73 65 6c 65 63 74 65 64 5f 70 72  RD, &selected_pr
7c40: 6f 74 6f 63 6f 6c 29 3b 0a 0a 09 69 66 20 28 73  otocol);...if (s
7c50: 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 3d  card_conn_ret ==
7c60: 20 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d   SCARD_E_PROTO_M
7c70: 49 53 4d 41 54 43 48 29 20 7b 0a 09 09 43 41 43  ISMATCH) {...CAC
7c80: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
7c90: 28 22 53 43 61 72 64 52 65 63 6f 6e 6e 65 63 74  ("SCardReconnect
7ca0: 28 29 20 72 65 74 75 72 6e 65 64 20 53 43 41 52  () returned SCAR
7cb0: 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54  D_E_PROTO_MISMAT
7cc0: 43 48 2c 20 74 72 79 69 6e 67 20 77 69 74 68 20  CH, trying with 
7cd0: 6a 75 73 74 20 54 3d 30 22 29 0a 09 09 73 63 61  just T=0")...sca
7ce0: 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 53 43  rd_conn_ret = SC
7cf0: 61 72 64 52 65 63 6f 6e 6e 65 63 74 28 73 6c 6f  ardReconnect(slo
7d00: 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 53 43  t->pcsc_card, SC
7d10: 41 52 44 5f 53 48 41 52 45 5f 53 48 41 52 45 44  ARD_SHARE_SHARED
7d20: 2c 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c  , SCARD_PROTOCOL
7d30: 5f 54 30 2c 20 53 43 41 52 44 5f 52 45 53 45 54  _T0, SCARD_RESET
7d40: 5f 43 41 52 44 2c 20 26 73 65 6c 65 63 74 65 64  _CARD, &selected
7d50: 5f 70 72 6f 74 6f 63 6f 6c 29 3b 0a 0a 09 09 69  _protocol);....i
7d60: 66 20 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65  f (scard_conn_re
7d70: 74 20 3d 3d 20 53 43 41 52 44 5f 45 5f 50 52 4f  t == SCARD_E_PRO
7d80: 54 4f 5f 4d 49 53 4d 41 54 43 48 29 20 7b 0a 09  TO_MISMATCH) {..
7d90: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
7da0: 52 49 4e 54 46 28 22 53 43 61 72 64 52 65 63 6f  RINTF("SCardReco
7db0: 6e 6e 65 63 74 28 29 20 72 65 74 75 72 6e 65 64  nnect() returned
7dc0: 20 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d   SCARD_E_PROTO_M
7dd0: 49 53 4d 41 54 43 48 2c 20 74 72 79 69 6e 67 20  ISMATCH, trying 
7de0: 77 69 74 68 20 6a 75 73 74 20 54 3d 31 22 29 0a  with just T=1").
7df0: 09 09 09 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65  ...scard_conn_re
7e00: 74 20 3d 20 53 43 61 72 64 52 65 63 6f 6e 6e 65  t = SCardReconne
7e10: 63 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61  ct(slot->pcsc_ca
7e20: 72 64 2c 20 53 43 41 52 44 5f 53 48 41 52 45 5f  rd, SCARD_SHARE_
7e30: 53 48 41 52 45 44 2c 20 53 43 41 52 44 5f 50 52  SHARED, SCARD_PR
7e40: 4f 54 4f 43 4f 4c 5f 54 31 2c 20 53 43 41 52 44  OTOCOL_T1, SCARD
7e50: 5f 52 45 53 45 54 5f 43 41 52 44 2c 20 26 73 65  _RESET_CARD, &se
7e60: 6c 65 63 74 65 64 5f 70 72 6f 74 6f 63 6f 6c 29  lected_protocol)
7e70: 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28 73  ;...}..}...if (s
7e80: 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 3d  card_conn_ret ==
7e90: 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53   SCARD_S_SUCCESS
7ea0: 29 20 7b 0a 09 09 73 6c 6f 74 2d 3e 70 72 6f 74  ) {...slot->prot
7eb0: 6f 63 6f 6c 20 3d 20 73 65 6c 65 63 74 65 64 5f  ocol = selected_
7ec0: 70 72 6f 74 6f 63 6f 6c 3b 0a 09 7d 0a 0a 09 72  protocol;..}...r
7ed0: 65 74 75 72 6e 28 73 63 61 72 64 5f 63 6f 6e 6e  eturn(scard_conn
7ee0: 5f 72 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20  _ret);.}../*. * 
7ef0: 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20  SYNPOSIS. *     
7f00: 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65  cackey_ret cacke
7f10: 79 5f 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73  y_connect_card(s
7f20: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f  truct cackey_slo
7f30: 74 20 2a 73 6c 6f 74 29 3b 0a 20 2a 0a 20 2a 20  t *slot);. *. * 
7f40: 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20  ARGUMENTS. *    
7f50: 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c   cackey_slot *sl
7f60: 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20 53 6c  ot. *         Sl
7f70: 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d 6d 61  ot to send comma
7f80: 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 52 45 54  nds to. *. * RET
7f90: 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20  URN VALUE. *    
7fa0: 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f   CACKEY_PCSC_S_O
7fb0: 4b 20 20 20 20 20 20 20 20 20 4f 6e 20 73 75 63  K         On suc
7fc0: 63 65 73 73 0a 20 2a 20 20 20 20 20 43 41 43 4b  cess. *     CACK
7fd0: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49  EY_PCSC_E_GENERI
7fe0: 43 20 20 20 20 4f 6e 20 65 72 72 6f 72 0a 20 2a  C    On error. *
7ff0: 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20  . * NOTES. *    
8000: 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 2f 0a 73 74 61   None. *. */.sta
8010: 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74 20 63  tic cackey_ret c
8020: 61 63 6b 65 79 5f 63 6f 6e 6e 65 63 74 5f 63 61  ackey_connect_ca
8030: 72 64 28 73 74 72 75 63 74 20 63 61 63 6b 65 79  rd(struct cackey
8040: 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 20 7b 0a 09  _slot *slot) {..
8050: 63 61 63 6b 65 79 5f 72 65 74 20 70 63 73 63 5f  cackey_ret pcsc_
8060: 63 6f 6e 6e 65 63 74 5f 72 65 74 3b 0a 09 44 57  connect_ret;..DW
8070: 4f 52 44 20 70 72 6f 74 6f 63 6f 6c 3b 0a 09 4c  ORD protocol;..L
8080: 4f 4e 47 20 73 63 61 72 64 5f 63 6f 6e 6e 5f 72  ONG scard_conn_r
8090: 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  et;...CACKEY_DEB
80a0: 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
80b0: 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 73 6c 6f  d.");...if (!slo
80c0: 74 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  t) {...CACKEY_DE
80d0: 42 55 47 5f 50 52 49 4e 54 46 28 22 49 6e 76 61  BUG_PRINTF("Inva
80e0: 6c 69 64 20 73 6c 6f 74 20 73 70 65 63 69 66 69  lid slot specifi
80f0: 65 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e  ed, returning in
8100: 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72   failure");....r
8110: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
8120: 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d  C_E_GENERIC);..}
8130: 0a 0a 09 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f  ...pcsc_connect_
8140: 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 70 63 73  ret = cackey_pcs
8150: 63 5f 63 6f 6e 6e 65 63 74 28 29 3b 0a 09 69 66  c_connect();..if
8160: 20 28 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72   (pcsc_connect_r
8170: 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53  et != CACKEY_PCS
8180: 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b  C_S_OK) {...CACK
8190: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
81a0: 22 43 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 50  "Connection to P
81b0: 43 2f 53 43 20 66 61 69 6c 65 64 2c 20 72 65 74  C/SC failed, ret
81c0: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
81d0: 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  e");....return(C
81e0: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e  ACKEY_PCSC_E_GEN
81f0: 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 43  ERIC);..}.../* C
8200: 6f 6e 6e 65 63 74 20 74 6f 20 72 65 61 64 65 72  onnect to reader
8210: 2c 20 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a 09  , if needed */..
8220: 69 66 20 28 21 73 6c 6f 74 2d 3e 70 63 73 63 5f  if (!slot->pcsc_
8230: 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 29 20  card_connected) 
8240: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
8250: 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64 43 6f  _PRINTF("SCardCo
8260: 6e 6e 65 63 74 28 25 73 29 20 63 61 6c 6c 65 64  nnect(%s) called
8270: 20 66 6f 72 20 73 6c 6f 74 20 25 70 22 2c 20 73   for slot %p", s
8280: 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64 65 72  lot->pcsc_reader
8290: 2c 20 73 6c 6f 74 29 3b 0a 09 09 73 63 61 72 64  , slot);...scard
82a0: 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 53 43 61 72  _conn_ret = SCar
82b0: 64 43 6f 6e 6e 65 63 74 28 2a 63 61 63 6b 65 79  dConnect(*cackey
82c0: 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20 73 6c  _pcsc_handle, sl
82d0: 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64 65 72 2c  ot->pcsc_reader,
82e0: 20 53 43 41 52 44 5f 53 48 41 52 45 5f 53 48 41   SCARD_SHARE_SHA
82f0: 52 45 44 2c 20 53 43 41 52 44 5f 50 52 4f 54 4f  RED, SCARD_PROTO
8300: 43 4f 4c 5f 54 30 20 7c 20 53 43 41 52 44 5f 50  COL_T0 | SCARD_P
8310: 52 4f 54 4f 43 4f 4c 5f 54 31 2c 20 26 73 6c 6f  ROTOCOL_T1, &slo
8320: 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 26 70  t->pcsc_card, &p
8330: 72 6f 74 6f 63 6f 6c 29 3b 0a 0a 09 09 69 66 20  rotocol);....if 
8340: 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20  (scard_conn_ret 
8350: 3d 3d 20 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f  == SCARD_E_PROTO
8360: 5f 4d 49 53 4d 41 54 43 48 29 20 7b 0a 09 09 09  _MISMATCH) {....
8370: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
8380: 4e 54 46 28 22 53 43 61 72 64 43 6f 6e 6e 65 63  NTF("SCardConnec
8390: 74 28 29 20 72 65 74 75 72 6e 65 64 20 53 43 41  t() returned SCA
83a0: 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41  RD_E_PROTO_MISMA
83b0: 54 43 48 2c 20 74 72 79 69 6e 67 20 77 69 74 68  TCH, trying with
83c0: 20 6a 75 73 74 20 54 3d 30 22 29 0a 09 09 09 73   just T=0")....s
83d0: 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20  card_conn_ret = 
83e0: 53 43 61 72 64 43 6f 6e 6e 65 63 74 28 2a 63 61  SCardConnect(*ca
83f0: 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65  ckey_pcsc_handle
8400: 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61  , slot->pcsc_rea
8410: 64 65 72 2c 20 53 43 41 52 44 5f 53 48 41 52 45  der, SCARD_SHARE
8420: 5f 53 48 41 52 45 44 2c 20 53 43 41 52 44 5f 50  _SHARED, SCARD_P
8430: 52 4f 54 4f 43 4f 4c 5f 54 30 2c 20 26 73 6c 6f  ROTOCOL_T0, &slo
8440: 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 26 70  t->pcsc_card, &p
8450: 72 6f 74 6f 63 6f 6c 29 3b 0a 0a 09 09 09 69 66  rotocol);.....if
8460: 20 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74   (scard_conn_ret
8470: 20 3d 3d 20 53 43 41 52 44 5f 45 5f 50 52 4f 54   == SCARD_E_PROT
8480: 4f 5f 4d 49 53 4d 41 54 43 48 29 20 7b 0a 09 09  O_MISMATCH) {...
8490: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
84a0: 52 49 4e 54 46 28 22 53 43 61 72 64 43 6f 6e 6e  RINTF("SCardConn
84b0: 65 63 74 28 29 20 72 65 74 75 72 6e 65 64 20 53  ect() returned S
84c0: 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53  CARD_E_PROTO_MIS
84d0: 4d 41 54 43 48 2c 20 74 72 79 69 6e 67 20 77 69  MATCH, trying wi
84e0: 74 68 20 6a 75 73 74 20 54 3d 31 22 29 0a 09 09  th just T=1")...
84f0: 09 09 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74  ..scard_conn_ret
8500: 20 3d 20 53 43 61 72 64 43 6f 6e 6e 65 63 74 28   = SCardConnect(
8510: 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e  *cackey_pcsc_han
8520: 64 6c 65 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 5f  dle, slot->pcsc_
8530: 72 65 61 64 65 72 2c 20 53 43 41 52 44 5f 53 48  reader, SCARD_SH
8540: 41 52 45 5f 53 48 41 52 45 44 2c 20 53 43 41 52  ARE_SHARED, SCAR
8550: 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31 2c 20 26  D_PROTOCOL_T1, &
8560: 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c  slot->pcsc_card,
8570: 20 26 70 72 6f 74 6f 63 6f 6c 29 3b 0a 09 09 09   &protocol);....
8580: 7d 0a 09 09 7d 0a 0a 09 09 69 66 20 28 73 63 61  }...}....if (sca
8590: 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53  rd_conn_ret == S
85a0: 43 41 52 44 5f 57 5f 55 4e 50 4f 57 45 52 45 44  CARD_W_UNPOWERED
85b0: 5f 43 41 52 44 29 20 7b 0a 09 09 09 43 41 43 4b  _CARD) {....CACK
85c0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
85d0: 22 53 43 61 72 64 43 6f 6e 6e 65 63 74 28 29 20  "SCardConnect() 
85e0: 72 65 74 75 72 6e 65 64 20 53 43 41 52 44 5f 57  returned SCARD_W
85f0: 5f 55 4e 50 4f 57 45 52 45 44 5f 43 41 52 44 2c  _UNPOWERED_CARD,
8600: 20 74 72 79 69 6e 67 20 74 6f 20 72 65 2d 63 6f   trying to re-co
8610: 6e 6e 65 63 74 2e 2e 2e 22 29 3b 0a 0a 09 09 09  nnect...");.....
8620: 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d  scard_conn_ret =
8630: 20 53 43 61 72 64 43 6f 6e 6e 65 63 74 28 2a 63   SCardConnect(*c
8640: 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c  ackey_pcsc_handl
8650: 65 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 65  e, slot->pcsc_re
8660: 61 64 65 72 2c 20 53 43 41 52 44 5f 53 48 41 52  ader, SCARD_SHAR
8670: 45 5f 44 49 52 45 43 54 2c 20 53 43 41 52 44 5f  E_DIRECT, SCARD_
8680: 50 52 4f 54 4f 43 4f 4c 5f 54 30 20 7c 20 53 43  PROTOCOL_T0 | SC
8690: 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31 2c  ARD_PROTOCOL_T1,
86a0: 20 26 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72   &slot->pcsc_car
86b0: 64 2c 20 26 70 72 6f 74 6f 63 6f 6c 29 3b 0a 0a  d, &protocol);..
86c0: 09 09 09 69 66 20 28 73 63 61 72 64 5f 63 6f 6e  ...if (scard_con
86d0: 6e 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 45  n_ret == SCARD_E
86e0: 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 29  _PROTO_MISMATCH)
86f0: 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45   {.....CACKEY_DE
8700: 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43 61 72  BUG_PRINTF("SCar
8710: 64 43 6f 6e 6e 65 63 74 28 29 20 72 65 74 75 72  dConnect() retur
8720: 6e 65 64 20 53 43 41 52 44 5f 45 5f 50 52 4f 54  ned SCARD_E_PROT
8730: 4f 5f 4d 49 53 4d 41 54 43 48 2c 20 74 72 79 69  O_MISMATCH, tryi
8740: 6e 67 20 77 69 74 68 20 6a 75 73 74 20 54 3d 30  ng with just T=0
8750: 22 29 0a 09 09 09 09 73 63 61 72 64 5f 63 6f 6e  ").....scard_con
8760: 6e 5f 72 65 74 20 3d 20 53 43 61 72 64 43 6f 6e  n_ret = SCardCon
8770: 6e 65 63 74 28 2a 63 61 63 6b 65 79 5f 70 63 73  nect(*cackey_pcs
8780: 63 5f 68 61 6e 64 6c 65 2c 20 73 6c 6f 74 2d 3e  c_handle, slot->
8790: 70 63 73 63 5f 72 65 61 64 65 72 2c 20 53 43 41  pcsc_reader, SCA
87a0: 52 44 5f 53 48 41 52 45 5f 53 48 41 52 45 44 2c  RD_SHARE_SHARED,
87b0: 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f   SCARD_PROTOCOL_
87c0: 54 30 2c 20 26 73 6c 6f 74 2d 3e 70 63 73 63 5f  T0, &slot->pcsc_
87d0: 63 61 72 64 2c 20 26 70 72 6f 74 6f 63 6f 6c 29  card, &protocol)
87e0: 3b 0a 0a 09 09 09 09 69 66 20 28 73 63 61 72 64  ;......if (scard
87f0: 5f 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53 43 41  _conn_ret == SCA
8800: 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41  RD_E_PROTO_MISMA
8810: 54 43 48 29 20 7b 0a 09 09 09 09 09 43 41 43 4b  TCH) {......CACK
8820: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
8830: 22 53 43 61 72 64 43 6f 6e 6e 65 63 74 28 29 20  "SCardConnect() 
8840: 72 65 74 75 72 6e 65 64 20 53 43 41 52 44 5f 45  returned SCARD_E
8850: 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 2c  _PROTO_MISMATCH,
8860: 20 74 72 79 69 6e 67 20 77 69 74 68 20 6a 75 73   trying with jus
8870: 74 20 54 3d 31 22 29 0a 09 09 09 09 09 73 63 61  t T=1")......sca
8880: 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 53 43  rd_conn_ret = SC
8890: 61 72 64 43 6f 6e 6e 65 63 74 28 2a 63 61 63 6b  ardConnect(*cack
88a0: 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20  ey_pcsc_handle, 
88b0: 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64 65  slot->pcsc_reade
88c0: 72 2c 20 53 43 41 52 44 5f 53 48 41 52 45 5f 53  r, SCARD_SHARE_S
88d0: 48 41 52 45 44 2c 20 53 43 41 52 44 5f 50 52 4f  HARED, SCARD_PRO
88e0: 54 4f 43 4f 4c 5f 54 31 2c 20 26 73 6c 6f 74 2d  TOCOL_T1, &slot-
88f0: 3e 70 63 73 63 5f 63 61 72 64 2c 20 26 70 72 6f  >pcsc_card, &pro
8900: 74 6f 63 6f 6c 29 3b 0a 09 09 09 09 7d 0a 09 09  tocol);.....}...
8910: 09 7d 0a 0a 09 09 09 73 63 61 72 64 5f 63 6f 6e  .}.....scard_con
8920: 6e 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 72  n_ret = cackey_r
8930: 65 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73 6c  econnect_card(sl
8940: 6f 74 2c 20 70 72 6f 74 6f 63 6f 6c 29 3b 0a 09  ot, protocol);..
8950: 09 7d 0a 0a 09 09 69 66 20 28 73 63 61 72 64 5f  .}....if (scard_
8960: 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53 43 41 52  conn_ret == SCAR
8970: 44 5f 45 5f 4e 4f 5f 53 45 52 56 49 43 45 29 20  D_E_NO_SERVICE) 
8980: 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
8990: 47 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64 43  G_PRINTF("SCardC
89a0: 6f 6e 6e 65 63 74 28 29 20 72 65 74 75 72 6e 65  onnect() returne
89b0: 64 20 53 43 41 52 44 5f 45 5f 4e 4f 5f 53 45 52  d SCARD_E_NO_SER
89c0: 56 49 43 45 20 2d 2d 20 77 68 69 63 68 20 63 6f  VICE -- which co
89d0: 75 6c 64 20 6d 65 61 6e 20 6f 75 72 20 68 61 6e  uld mean our han
89e0: 64 6c 65 20 69 73 20 69 6e 76 61 6c 69 64 2c 20  dle is invalid, 
89f0: 77 69 6c 6c 20 74 72 79 20 74 6f 20 72 65 63 6f  will try to reco
8a00: 6e 6e 65 63 74 20 74 6f 20 50 43 2f 53 43 20 73  nnect to PC/SC s
8a10: 65 72 76 69 63 65 22 29 3b 0a 0a 09 09 09 63 61  ervice");.....ca
8a20: 63 6b 65 79 5f 70 63 73 63 5f 64 69 73 63 6f 6e  ckey_pcsc_discon
8a30: 6e 65 63 74 28 29 3b 0a 0a 09 09 09 63 61 63 6b  nect();.....cack
8a40: 65 79 5f 70 63 73 63 5f 63 6f 6e 6e 65 63 74 28  ey_pcsc_connect(
8a50: 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 6d 61  );.....cackey_ma
8a60: 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74 28 73 6c  rk_slot_reset(sl
8a70: 6f 74 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28  ot);.....return(
8a80: 63 61 63 6b 65 79 5f 63 6f 6e 6e 65 63 74 5f 63  cackey_connect_c
8a90: 61 72 64 28 73 6c 6f 74 29 29 3b 0a 09 09 7d 0a  ard(slot));...}.
8aa0: 0a 09 09 69 66 20 28 73 63 61 72 64 5f 63 6f 6e  ...if (scard_con
8ab0: 6e 5f 72 65 74 20 21 3d 20 53 43 41 52 44 5f 53  n_ret != SCARD_S
8ac0: 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09 09 43  _SUCCESS) {....C
8ad0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
8ae0: 54 46 28 22 43 6f 6e 6e 65 63 74 69 6f 6e 20 74  TF("Connection t
8af0: 6f 20 63 61 72 64 20 66 61 69 6c 65 64 2c 20 72  o card failed, r
8b00: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
8b10: 75 72 65 20 28 53 43 61 72 64 43 6f 6e 6e 65 63  ure (SCardConnec
8b20: 74 28 29 20 3d 20 25 73 2f 25 6c 69 29 22 2c 20  t() = %s/%li)", 
8b30: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e  CACKEY_DEBUG_FUN
8b40: 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54  C_SCARDERR_TO_ST
8b50: 52 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74  R(scard_conn_ret
8b60: 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72 64 5f  ), (long) scard_
8b70: 63 6f 6e 6e 5f 72 65 74 29 3b 0a 0a 09 09 09 72  conn_ret);.....r
8b80: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
8b90: 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 09  C_E_GENERIC);...
8ba0: 7d 0a 0a 09 09 73 6c 6f 74 2d 3e 70 63 73 63 5f  }....slot->pcsc_
8bb0: 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 20 3d  card_connected =
8bc0: 20 31 3b 0a 09 09 73 6c 6f 74 2d 3e 74 72 61 6e   1;...slot->tran
8bd0: 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d 20  saction_depth = 
8be0: 30 3b 0a 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73  0;...slot->trans
8bf0: 61 63 74 69 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c  action_need_hw_l
8c00: 6f 63 6b 20 3d 20 30 3b 0a 09 09 73 6c 6f 74 2d  ock = 0;...slot-
8c10: 3e 70 72 6f 74 6f 63 6f 6c 20 3d 20 70 72 6f 74  >protocol = prot
8c20: 6f 63 6f 6c 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ocol;..}...CACKE
8c30: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
8c40: 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 73 75 63  Returning in suc
8c50: 63 65 73 73 22 29 3b 0a 0a 09 72 65 74 75 72 6e  cess");...return
8c60: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f  (CACKEY_PCSC_S_O
8c70: 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e  K);.}../*. * SYN
8c80: 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 63 61 63  POSIS. *     cac
8c90: 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 62  key_ret cackey_b
8ca0: 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e  egin_transaction
8cb0: 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73  (struct cackey_s
8cc0: 6c 6f 74 20 2a 73 6c 6f 74 29 3b 0a 20 2a 0a 20  lot *slot);. *. 
8cd0: 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20  * ARGUMENTS. *  
8ce0: 20 20 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a     cackey_slot *
8cf0: 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20  slot. *         
8d00: 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d  Slot to send com
8d10: 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 52  mands to. *. * R
8d20: 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20  ETURN VALUE. *  
8d30: 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53     CACKEY_PCSC_S
8d40: 5f 4f 4b 20 20 20 20 20 20 20 20 20 4f 6e 20 73  _OK         On s
8d50: 75 63 63 65 73 73 0a 20 2a 20 20 20 20 20 43 41  uccess. *     CA
8d60: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45  CKEY_PCSC_E_GENE
8d70: 52 49 43 20 20 20 20 4f 6e 20 65 72 72 6f 72 0a  RIC    On error.
8d80: 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20   *. * NOTES. *  
8d90: 20 20 20 54 68 65 20 74 72 61 6e 73 61 63 74 69     The transacti
8da0: 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20 74 65 72  on should be ter
8db0: 6d 69 6e 61 74 65 64 20 75 73 69 6e 67 20 22 63  minated using "c
8dc0: 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61  ackey_end_transa
8dd0: 63 74 69 6f 6e 22 0a 20 2a 0a 20 2a 2f 0a 73 74  ction". *. */.st
8de0: 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74 20  atic cackey_ret 
8df0: 63 61 63 6b 65 79 5f 62 65 67 69 6e 5f 74 72 61  cackey_begin_tra
8e00: 6e 73 61 63 74 69 6f 6e 28 73 74 72 75 63 74 20  nsaction(struct 
8e10: 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f  cackey_slot *slo
8e20: 74 29 20 7b 0a 09 63 61 63 6b 65 79 5f 72 65 74  t) {..cackey_ret
8e30: 20 63 61 63 6b 65 79 5f 63 6f 6e 6e 5f 72 65 74   cackey_conn_ret
8e40: 3b 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f 74 72  ;..LONG scard_tr
8e50: 61 6e 73 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45  ans_ret;...CACKE
8e60: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
8e70: 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 63 61 63  Called.");...cac
8e80: 6b 65 79 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 63  key_conn_ret = c
8e90: 61 63 6b 65 79 5f 63 6f 6e 6e 65 63 74 5f 63 61  ackey_connect_ca
8ea0: 72 64 28 73 6c 6f 74 29 3b 0a 09 69 66 20 28 63  rd(slot);..if (c
8eb0: 61 63 6b 65 79 5f 63 6f 6e 6e 5f 72 65 74 20 21  ackey_conn_ret !
8ec0: 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  = CACKEY_PCSC_S_
8ed0: 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  OK) {...CACKEY_D
8ee0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61  EBUG_PRINTF("Una
8ef0: 62 6c 65 20 74 6f 20 63 6f 6e 6e 65 63 74 20 74  ble to connect t
8f00: 6f 20 63 61 72 64 2c 20 72 65 74 75 72 6e 69 6e  o card, returnin
8f10: 67 20 69 6e 20 65 72 72 6f 72 22 29 3b 0a 0a 09  g in error");...
8f20: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
8f30: 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a  CSC_E_GENERIC);.
8f40: 09 7d 0a 0a 09 73 6c 6f 74 2d 3e 74 72 61 6e 73  .}...slot->trans
8f50: 61 63 74 69 6f 6e 5f 64 65 70 74 68 2b 2b 3b 0a  action_depth++;.
8f60: 0a 09 69 66 20 28 73 6c 6f 74 2d 3e 74 72 61 6e  ..if (slot->tran
8f70: 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3e 20  saction_depth > 
8f80: 31 20 26 26 20 21 73 6c 6f 74 2d 3e 74 72 61 6e  1 && !slot->tran
8f90: 73 61 63 74 69 6f 6e 5f 6e 65 65 64 5f 68 77 5f  saction_need_hw_
8fa0: 6c 6f 63 6b 29 20 7b 0a 09 09 43 41 43 4b 45 59  lock) {...CACKEY
8fb0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 41  _DEBUG_PRINTF("A
8fc0: 6c 72 65 61 64 79 20 69 6e 20 61 20 74 72 61 6e  lready in a tran
8fd0: 73 61 63 74 69 6f 6e 2c 20 70 65 72 66 6f 72 6d  saction, perform
8fe0: 69 6e 67 20 6e 6f 20 61 63 74 69 6f 6e 20 28 6e  ing no action (n
8ff0: 65 77 20 64 65 70 74 68 20 3d 20 25 69 29 22 2c  ew depth = %i)",
9000: 20 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69   slot->transacti
9010: 6f 6e 5f 64 65 70 74 68 29 3b 0a 0a 09 09 72 65  on_depth);....re
9020: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
9030: 5f 53 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 73 6c 6f  _S_OK);..}...slo
9040: 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 6e  t->transaction_n
9050: 65 65 64 5f 68 77 5f 6c 6f 63 6b 20 3d 20 30 3b  eed_hw_lock = 0;
9060: 0a 0a 09 73 63 61 72 64 5f 74 72 61 6e 73 5f 72  ...scard_trans_r
9070: 65 74 20 3d 20 53 43 61 72 64 42 65 67 69 6e 54  et = SCardBeginT
9080: 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 2d  ransaction(slot-
9090: 3e 70 63 73 63 5f 63 61 72 64 29 3b 0a 09 69 66  >pcsc_card);..if
90a0: 20 28 73 63 61 72 64 5f 74 72 61 6e 73 5f 72 65   (scard_trans_re
90b0: 74 20 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 43  t != SCARD_S_SUC
90c0: 43 45 53 53 29 20 7b 0a 09 09 43 41 43 4b 45 59  CESS) {...CACKEY
90d0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55  _DEBUG_PRINTF("U
90e0: 6e 61 62 6c 65 20 74 6f 20 62 65 67 69 6e 20 74  nable to begin t
90f0: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 72 65 74 75  ransaction, retu
9100: 72 6e 69 6e 67 20 69 6e 20 65 72 72 6f 72 22 29  rning in error")
9110: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b  ;....return(CACK
9120: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49  EY_PCSC_E_GENERI
9130: 43 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  C);..}...CACKEY_
9140: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 75  DEBUG_PRINTF("Su
9150: 63 65 73 73 66 75 6c 6c 79 20 62 65 67 61 6e 20  cessfully began 
9160: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 73  transaction on s
9170: 6c 6f 74 20 28 25 73 29 22 2c 20 73 6c 6f 74 2d  lot (%s)", slot-
9180: 3e 70 63 73 63 5f 72 65 61 64 65 72 29 3b 0a 0a  >pcsc_reader);..
9190: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
91a0: 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a  CSC_S_OK);.}../*
91b0: 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20  . * SYNPOSIS. * 
91c0: 20 20 20 20 63 61 63 6b 65 79 5f 72 65 74 20 63      cackey_ret c
91d0: 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61  ackey_end_transa
91e0: 63 74 69 6f 6e 28 73 74 72 75 63 74 20 63 61 63  ction(struct cac
91f0: 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 3b  key_slot *slot);
9200: 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53  . *. * ARGUMENTS
9210: 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 73  . *     cackey_s
9220: 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20  lot *slot. *    
9230: 20 20 20 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e       Slot to sen
9240: 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a  d commands to. *
9250: 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45  . * RETURN VALUE
9260: 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50  . *     CACKEY_P
9270: 43 53 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20  CSC_S_OK        
9280: 20 4f 6e 20 73 75 63 63 65 73 73 0a 20 2a 20 20   On success. *  
9290: 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45     CACKEY_PCSC_E
92a0: 5f 47 45 4e 45 52 49 43 20 20 20 20 4f 6e 20 65  _GENERIC    On e
92b0: 72 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53  rror. *. * NOTES
92c0: 0a 20 2a 20 20 20 20 20 54 68 69 73 20 66 75 6e  . *     This fun
92d0: 63 74 69 6f 6e 20 72 65 71 75 69 72 65 73 20 22  ction requires "
92e0: 63 61 63 6b 65 79 5f 62 65 67 69 6e 5f 74 72 61  cackey_begin_tra
92f0: 6e 73 61 63 74 69 6f 6e 22 20 74 6f 20 62 65 20  nsaction" to be 
9300: 63 61 6c 6c 65 64 20 66 69 72 73 74 0a 20 2a 0a  called first. *.
9310: 20 2a 2f 0a 73 74 61 74 69 63 20 63 61 63 6b 65   */.static cacke
9320: 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 65 6e 64  y_ret cackey_end
9330: 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 74 72  _transaction(str
9340: 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20  uct cackey_slot 
9350: 2a 73 6c 6f 74 29 20 7b 0a 09 4c 4f 4e 47 20 73  *slot) {..LONG s
9360: 63 61 72 64 5f 74 72 61 6e 73 5f 72 65 74 3b 0a  card_trans_ret;.
9370: 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
9380: 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
9390: 3b 0a 0a 09 69 66 20 28 21 73 6c 6f 74 2d 3e 70  ;...if (!slot->p
93a0: 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74  csc_card_connect
93b0: 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
93c0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 72  EBUG_PRINTF("Car
93d0: 64 20 69 73 20 6e 6f 74 20 63 6f 6e 6e 65 63 74  d is not connect
93e0: 65 64 2c 20 75 6e 61 62 6c 65 20 74 6f 20 65 6e  ed, unable to en
93f0: 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e  d transaction on
9400: 20 63 61 72 64 22 29 3b 0a 0a 09 09 69 66 20 28   card");....if (
9410: 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f  slot->transactio
9420: 6e 5f 64 65 70 74 68 20 3e 20 30 29 20 7b 0a 09  n_depth > 0) {..
9430: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
9440: 52 49 4e 54 46 28 22 44 65 63 72 65 61 73 69 6e  RINTF("Decreasin
9450: 67 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 64 65  g transaction de
9460: 70 74 68 20 61 6e 64 20 61 73 6b 69 6e 67 20 66  pth and asking f
9470: 6f 72 20 61 20 68 61 72 64 77 61 72 65 20 6c 6f  or a hardware lo
9480: 63 6b 20 6f 6e 20 74 68 65 20 6e 65 78 74 20 62  ck on the next b
9490: 65 67 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e  egin transaction
94a0: 20 28 63 75 72 72 65 6e 74 20 64 65 70 74 68 20   (current depth 
94b0: 3d 20 25 69 29 22 2c 20 73 6c 6f 74 2d 3e 74 72  = %i)", slot->tr
94c0: 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 29  ansaction_depth)
94d0: 3b 0a 0a 09 09 09 73 6c 6f 74 2d 3e 74 72 61 6e  ;.....slot->tran
94e0: 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 2d 2d 3b  saction_depth--;
94f0: 0a 0a 09 09 09 69 66 20 28 73 6c 6f 74 2d 3e 74  .....if (slot->t
9500: 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68  ransaction_depth
9510: 20 3e 20 30 29 20 7b 0a 09 09 09 09 73 6c 6f 74   > 0) {.....slot
9520: 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 6e 65  ->transaction_ne
9530: 65 64 5f 68 77 5f 6c 6f 63 6b 20 3d 20 31 3b 0a  ed_hw_lock = 1;.
9540: 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 72 65 74 75  ...}...}....retu
9550: 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  rn(CACKEY_PCSC_E
9560: 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09  _GENERIC);..}...
9570: 69 66 20 28 73 6c 6f 74 2d 3e 74 72 61 6e 73 61  if (slot->transa
9580: 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d 3d 20 30  ction_depth == 0
9590: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
95a0: 55 47 5f 50 52 49 4e 54 46 28 22 54 65 72 6d 69  UG_PRINTF("Termi
95b0: 6e 61 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63  nating a transac
95c0: 74 69 6f 6e 20 74 68 61 74 20 68 61 73 20 6e 6f  tion that has no
95d0: 74 20 62 65 67 75 6e 21 22 29 3b 0a 0a 09 09 72  t begun!");....r
95e0: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
95f0: 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d  C_E_GENERIC);..}
9600: 0a 0a 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63  ...slot->transac
9610: 74 69 6f 6e 5f 64 65 70 74 68 2d 2d 3b 0a 0a 09  tion_depth--;...
9620: 69 66 20 28 73 6c 6f 74 2d 3e 74 72 61 6e 73 61  if (slot->transa
9630: 63 74 69 6f 6e 5f 64 65 70 74 68 20 3e 20 30 29  ction_depth > 0)
9640: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
9650: 47 5f 50 52 49 4e 54 46 28 22 54 72 61 6e 73 61  G_PRINTF("Transa
9660: 63 74 69 6f 6e 73 20 73 74 69 6c 6c 20 69 6e 20  ctions still in 
9670: 70 72 6f 67 72 65 73 73 2c 20 6e 6f 74 20 74 65  progress, not te
9680: 72 6d 69 6e 61 74 69 6e 67 20 6f 6e 2d 63 61 72  rminating on-car
9690: 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 28 63  d Transaction (c
96a0: 75 72 72 65 6e 74 20 64 65 70 74 68 20 3d 20 25  urrent depth = %
96b0: 69 29 22 2c 20 73 6c 6f 74 2d 3e 74 72 61 6e 73  i)", slot->trans
96c0: 61 63 74 69 6f 6e 5f 64 65 70 74 68 29 3b 0a 0a  action_depth);..
96d0: 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
96e0: 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 09 7d 0a 0a  PCSC_S_OK);..}..
96f0: 09 73 63 61 72 64 5f 74 72 61 6e 73 5f 72 65 74  .scard_trans_ret
9700: 20 3d 20 53 43 61 72 64 45 6e 64 54 72 61 6e 73   = SCardEndTrans
9710: 61 63 74 69 6f 6e 28 73 6c 6f 74 2d 3e 70 63 73  action(slot->pcs
9720: 63 5f 63 61 72 64 2c 20 53 43 41 52 44 5f 4c 45  c_card, SCARD_LE
9730: 41 56 45 5f 43 41 52 44 29 3b 0a 09 69 66 20 28  AVE_CARD);..if (
9740: 73 63 61 72 64 5f 74 72 61 6e 73 5f 72 65 74 20  scard_trans_ret 
9750: 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45  != SCARD_S_SUCCE
9760: 53 53 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  SS) {...CACKEY_D
9770: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61  EBUG_PRINTF("Una
9780: 62 6c 65 20 74 6f 20 65 6e 64 20 74 72 61 6e 73  ble to end trans
9790: 61 63 74 69 6f 6e 2c 20 72 65 74 75 72 6e 69 6e  action, returnin
97a0: 67 20 69 6e 20 65 72 72 6f 72 22 29 3b 0a 0a 09  g in error");...
97b0: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
97c0: 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a  CSC_E_GENERIC);.
97d0: 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
97e0: 47 5f 50 52 49 4e 54 46 28 22 53 75 63 65 73 73  G_PRINTF("Sucess
97f0: 66 75 6c 6c 79 20 74 65 72 6d 69 6e 61 74 65 64  fully terminated
9800: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20   transaction on 
9810: 73 6c 6f 74 20 28 25 73 29 22 2c 20 73 6c 6f 74  slot (%s)", slot
9820: 2d 3e 70 63 73 63 5f 72 65 61 64 65 72 29 3b 0a  ->pcsc_reader);.
9830: 0a 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
9840: 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f  PCSC_S_OK);.}../
9850: 2a 20 41 50 44 55 20 52 65 6c 61 74 65 64 20 46  * APDU Related F
9860: 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 2f 2a 0a 20  unctions */./*. 
9870: 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20  * SYNPOSIS. *   
9880: 20 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63    cackey_ret cac
9890: 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 74  key_send_apdu(st
98a0: 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74  ruct cackey_slot
98b0: 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64   *slot, unsigned
98c0: 20 63 68 61 72 20 63 6c 61 73 73 2c 20 75 6e 73   char class, uns
98d0: 69 67 6e 65 64 20 63 68 61 72 20 69 6e 73 74 72  igned char instr
98e0: 75 63 74 69 6f 6e 2c 20 75 6e 73 69 67 6e 65 64  uction, unsigned
98f0: 20 63 68 61 72 20 70 31 2c 20 75 6e 73 69 67 6e   char p1, unsign
9900: 65 64 20 63 68 61 72 20 70 32 2c 20 75 6e 73 69  ed char p2, unsi
9910: 67 6e 65 64 20 63 68 61 72 20 6c 63 2c 20 75 6e  gned char lc, un
9920: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74  signed char *dat
9930: 61 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  a, unsigned char
9940: 20 6c 65 2c 20 75 69 6e 74 31 36 5f 74 20 2a 72   le, uint16_t *r
9950: 65 73 70 63 6f 64 65 2c 20 75 6e 73 69 67 6e 65  espcode, unsigne
9960: 64 20 63 68 61 72 20 2a 72 65 73 70 64 61 74 61  d char *respdata
9970: 2c 20 73 69 7a 65 5f 74 20 2a 72 65 73 70 64 61  , size_t *respda
9980: 74 61 5f 6c 65 6e 29 3b 0a 20 2a 0a 20 2a 20 41  ta_len);. *. * A
9990: 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20  RGUMENTS. *     
99a0: 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f  cackey_slot *slo
99b0: 74 0a 20 2a 20 20 20 20 20 20 20 20 20 53 6c 6f  t. *         Slo
99c0: 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d 6d 61 6e  t to send comman
99d0: 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 20 20 20 20  ds to. *. *     
99e0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63 6c  unsigned char cl
99f0: 61 73 73 0a 20 2a 20 20 20 20 20 20 20 20 20 41  ass. *         A
9a00: 50 44 55 20 43 6c 61 73 73 20 28 47 53 43 49 53  PDU Class (GSCIS
9a10: 5f 43 4c 41 53 53 5f 49 53 4f 37 38 31 36 20 6f  _CLASS_ISO7816 o
9a20: 72 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 47 4c  r GSCIS_CLASS_GL
9a30: 4f 42 41 4c 5f 50 4c 41 54 46 4f 52 4d 0a 20 2a  OBAL_PLATFORM. *
9a40: 20 20 20 20 20 20 20 20 20 75 73 75 61 6c 6c 79           usually
9a50: 29 2c 20 28 43 4c 41 29 0a 20 2a 0a 20 2a 20 20  ), (CLA). *. *  
9a60: 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
9a70: 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 20 2a 20   instruction. * 
9a80: 20 20 20 20 20 20 20 20 41 50 44 55 20 49 6e 73          APDU Ins
9a90: 74 72 75 63 74 69 6f 6e 20 28 49 4e 53 29 0a 20  truction (INS). 
9aa0: 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65  *. *     unsigne
9ab0: 64 20 63 68 61 72 20 70 31 0a 20 2a 20 20 20 20  d char p1. *    
9ac0: 20 20 20 20 20 41 50 44 55 20 50 61 72 61 6d 65       APDU Parame
9ad0: 74 65 72 20 31 20 28 50 31 29 0a 20 2a 0a 20 2a  ter 1 (P1). *. *
9ae0: 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68       unsigned ch
9af0: 61 72 20 70 32 0a 20 2a 20 20 20 20 20 20 20 20  ar p2. *        
9b00: 20 41 50 44 55 20 50 61 72 61 6d 65 74 65 72 20   APDU Parameter 
9b10: 32 20 28 50 32 29 0a 20 2a 0a 20 2a 20 20 20 20  2 (P2). *. *    
9b20: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6c   unsigned char l
9b30: 63 0a 20 2a 20 20 20 20 20 20 20 20 20 41 50 44  c. *         APD
9b40: 55 20 4c 65 6e 67 74 68 20 6f 66 20 43 6f 6e 74  U Length of Cont
9b50: 65 6e 74 20 28 4c 63 29 20 2d 2d 20 74 68 69 73  ent (Lc) -- this
9b60: 20 69 73 20 74 68 65 20 6c 65 6e 67 74 68 20 6f   is the length o
9b70: 66 20 22 64 61 74 61 22 0a 20 2a 20 20 20 20 20  f "data". *     
9b80: 20 20 20 20 70 61 72 61 6d 65 74 65 72 2e 20 20      parameter.  
9b90: 49 66 20 22 64 61 74 61 22 20 69 73 20 73 70 65  If "data" is spe
9ba0: 63 69 66 69 65 64 20 61 73 20 4e 55 4c 4c 2c 20  cified as NULL, 
9bb0: 74 68 69 73 20 70 61 72 61 6d 65 74 65 72 20 77  this parameter w
9bc0: 69 6c 6c 0a 20 2a 20 20 20 20 20 20 20 20 20 62  ill. *         b
9bd0: 65 20 69 67 6e 6f 72 65 64 2e 0a 20 2a 0a 20 2a  e ignored.. *. *
9be0: 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68       unsigned ch
9bf0: 61 72 20 2a 64 61 74 61 0a 20 2a 20 20 20 20 20  ar *data. *     
9c00: 20 20 20 20 50 6f 69 6e 74 65 72 20 74 6f 20 62      Pointer to b
9c10: 75 66 66 65 72 20 74 6f 20 73 65 6e 64 2e 20 20  uffer to send.  
9c20: 49 74 20 73 68 6f 75 6c 64 20 62 65 20 22 4c 63  It should be "Lc
9c30: 22 20 62 79 74 65 73 20 6c 6f 6e 67 2e 20 20 49  " bytes long.  I
9c40: 66 0a 20 2a 20 20 20 20 20 20 20 20 20 73 70 65  f. *         spe
9c50: 63 69 66 69 65 64 20 61 73 20 4e 55 4c 4c 2c 20  cified as NULL, 
9c60: 22 4c 63 22 20 77 69 6c 6c 20 6e 6f 74 20 62 65  "Lc" will not be
9c70: 20 73 65 6e 74 2c 20 61 6e 64 20 74 68 69 73 20   sent, and this 
9c80: 62 75 66 66 65 72 20 77 69 6c 6c 20 62 65 0a 20  buffer will be. 
9c90: 2a 20 20 20 20 20 20 20 20 20 69 67 6e 6f 72 65  *         ignore
9ca0: 64 2e 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73  d.. *. *     uns
9cb0: 69 67 6e 65 64 20 63 68 61 72 20 6c 65 0a 20 2a  igned char le. *
9cc0: 20 20 20 20 20 20 20 20 20 41 50 44 55 20 4c 65           APDU Le
9cd0: 6e 67 74 68 20 6f 66 20 45 78 70 65 63 74 61 74  ngth of Expectat
9ce0: 69 6f 6e 20 28 4c 65 29 20 2d 2d 20 74 68 69 73  ion (Le) -- this
9cf0: 20 69 73 20 74 68 65 20 6c 65 6e 67 74 68 20 6f   is the length o
9d00: 66 20 74 68 65 0a 20 2a 20 20 20 20 20 20 20 20  f the. *        
9d10: 20 65 78 70 65 63 74 65 64 20 72 65 70 6c 79 2e   expected reply.
9d20: 20 20 49 66 20 74 68 69 73 20 69 73 20 73 70 65    If this is spe
9d30: 63 69 66 69 65 64 20 61 73 20 30 20 74 68 65 6e  cified as 0 then
9d40: 20 69 74 20 77 69 6c 6c 20 6e 6f 74 0a 20 2a 20   it will not. * 
9d50: 20 20 20 20 20 20 20 20 62 65 20 73 65 6e 74 2e          be sent.
9d60: 0a 20 2a 0a 20 2a 20 20 20 20 20 75 69 6e 74 31  . *. *     uint1
9d70: 36 5f 74 20 2a 72 65 73 70 63 6f 64 65 0a 20 2a  6_t *respcode. *
9d80: 20 20 20 20 20 20 20 20 20 5b 4f 55 54 5d 20 50           [OUT] P
9d90: 6f 69 6e 74 65 72 20 74 6f 20 73 74 6f 72 61 67  ointer to storag
9da0: 65 20 6f 66 20 41 50 44 55 20 72 65 73 70 6f 6e  e of APDU respon
9db0: 73 65 20 63 6f 64 65 2e 20 20 49 66 20 74 68 69  se code.  If thi
9dc0: 73 20 69 73 0a 20 2a 20 20 20 20 20 20 20 20 20  s is. *         
9dd0: 73 70 65 63 69 66 69 65 64 20 61 73 20 4e 55 4c  specified as NUL
9de0: 4c 2c 20 74 68 65 20 72 65 73 70 6f 6e 73 65 20  L, the response 
9df0: 63 6f 64 65 20 77 69 6c 6c 20 62 65 20 64 69 73  code will be dis
9e00: 63 61 72 64 65 64 2e 0a 20 2a 0a 20 2a 20 20 20  carded.. *. *   
9e10: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
9e20: 2a 72 65 73 70 64 61 74 61 0a 20 2a 20 20 20 20  *respdata. *    
9e30: 20 20 20 20 20 5b 4f 55 54 5d 20 50 6f 69 6e 74       [OUT] Point
9e40: 65 72 20 74 6f 20 73 74 6f 72 61 67 65 20 6f 66  er to storage of
9e50: 20 41 50 44 55 20 72 65 73 70 6f 6e 73 65 20 64   APDU response d
9e60: 61 74 61 2e 20 20 49 66 20 74 68 69 73 20 69 73  ata.  If this is
9e70: 0a 20 2a 20 20 20 20 20 20 20 20 20 73 70 65 63  . *         spec
9e80: 69 66 69 65 64 20 61 73 20 4e 55 4c 4c 2c 20 74  ified as NULL, t
9e90: 68 65 20 72 65 73 70 6f 6e 73 65 20 64 61 74 61  he response data
9ea0: 20 77 69 6c 6c 20 62 65 20 64 69 73 63 61 72 64   will be discard
9eb0: 65 64 2e 20 20 49 66 0a 20 2a 20 20 20 20 20 20  ed.  If. *      
9ec0: 20 20 20 74 68 65 20 22 72 65 73 70 64 61 74 61     the "respdata
9ed0: 5f 6c 65 6e 22 20 70 61 72 61 6d 65 74 65 72 20  _len" parameter 
9ee0: 69 73 20 73 70 65 63 69 66 69 65 64 20 61 73 20  is specified as 
9ef0: 4e 55 4c 4c 2c 20 74 68 69 73 20 62 75 66 66 65  NULL, this buffe
9f00: 72 0a 20 2a 20 20 20 20 20 20 20 20 20 77 69 6c  r. *         wil
9f10: 6c 20 6e 6f 74 20 62 65 20 75 70 64 61 74 65 64  l not be updated
9f20: 2e 0a 20 2a 0a 20 2a 20 20 20 20 20 73 69 7a 65  .. *. *     size
9f30: 5f 74 20 2a 72 65 73 70 64 61 74 61 5f 6c 65 6e  _t *respdata_len
9f40: 0a 20 2a 20 20 20 20 20 20 20 20 20 5b 49 4e 2c  . *         [IN,
9f50: 20 4f 55 54 5d 20 50 6f 69 6e 74 65 72 20 69 6e   OUT] Pointer in
9f60: 69 74 69 61 6c 69 6e 67 20 63 6f 6e 74 61 69 6e  itialing contain
9f70: 69 6e 67 20 74 68 65 20 73 69 7a 65 20 6f 66 20  ing the size of 
9f80: 74 68 65 20 22 72 65 73 70 64 61 74 61 22 0a 20  the "respdata". 
9f90: 2a 20 20 20 20 20 20 20 20 20 62 75 66 66 65 72  *         buffer
9fa0: 2e 20 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e  .  Before return
9fb0: 69 6e 67 2c 20 74 68 65 20 70 6f 69 6e 74 65 64  ing, the pointed
9fc0: 20 74 6f 20 76 61 6c 75 65 20 69 73 20 75 70 64   to value is upd
9fd0: 61 74 65 64 20 74 6f 20 74 68 65 0a 20 2a 20 20  ated to the. *  
9fe0: 20 20 20 20 20 20 20 6e 75 6d 62 65 72 20 6f 66         number of
9ff0: 20 62 79 74 65 73 20 77 72 69 74 74 65 6e 20 74   bytes written t
a000: 6f 20 74 68 65 20 62 75 66 66 65 72 2e 20 20 49  o the buffer.  I
a010: 66 20 74 68 69 73 20 69 73 20 73 70 65 63 69 66  f this is specif
a020: 69 65 64 20 61 73 0a 20 2a 20 20 20 20 20 20 20  ied as. *       
a030: 20 20 4e 55 4c 4c 2c 20 69 74 20 77 69 6c 6c 20    NULL, it will 
a040: 6e 6f 74 20 62 65 20 75 70 64 61 74 65 64 2c 20  not be updated, 
a050: 61 6e 64 20 22 72 65 73 70 64 61 74 61 22 20 77  and "respdata" w
a060: 69 6c 6c 20 62 65 20 69 67 6e 6f 72 65 64 20 63  ill be ignored c
a070: 61 75 73 69 6e 67 0a 20 2a 20 20 20 20 20 20 20  ausing. *       
a080: 20 20 74 68 65 20 72 65 73 70 6f 6e 73 65 20 64    the response d
a090: 61 74 61 20 74 6f 20 62 65 20 64 69 73 63 61 72  ata to be discar
a0a0: 64 65 64 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52  ded.. *. * RETUR
a0b0: 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 43  N VALUE. *     C
a0c0: 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20  ACKEY_PCSC_S_OK 
a0d0: 20 20 20 20 20 20 20 20 20 20 4f 6e 20 73 75 63            On suc
a0e0: 63 65 73 73 0a 20 2a 20 20 20 20 20 43 41 43 4b  cess. *     CACK
a0f0: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49  EY_PCSC_E_GENERI
a100: 43 20 20 20 20 20 20 4f 6e 20 65 72 72 6f 72 0a  C      On error.
a110: 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43   *     CACKEY_PC
a120: 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54  SC_E_TOKENABSENT
a130: 20 20 49 66 20 74 68 65 20 73 65 6e 64 69 6e 67    If the sending
a140: 20 66 61 69 6c 65 64 20 62 65 63 61 75 73 65 20   failed because 
a150: 74 68 65 20 74 6f 6b 65 6e 20 69 73 0a 20 2a 20  the token is. * 
a160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
a180: 62 73 65 6e 74 0a 20 2a 20 20 20 20 20 43 41 43  bsent. *     CAC
a190: 4b 45 59 5f 50 43 53 43 5f 45 5f 52 45 54 52 59  KEY_PCSC_E_RETRY
a1a0: 20 20 20 20 20 20 20 20 49 66 20 73 6f 6d 65 74          If somet
a1b0: 68 69 6e 67 20 74 68 61 74 20 6c 6f 6f 6b 73 20  hing that looks 
a1c0: 72 65 74 72 79 27 61 62 6c 65 20 77 65 6e 74 0a  retry'able went.
a1d0: 20 2a 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 20 20 20                  
a1f0: 20 20 77 72 6f 6e 67 20 2d 2d 20 74 72 79 20 74    wrong -- try t
a200: 68 65 20 77 68 6f 6c 65 20 74 72 61 6e 73 61 63  he whole transac
a210: 74 69 6f 6e 20 6f 76 65 72 0a 20 2a 20 20 20 20  tion over. *    
a220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a230: 20 20 20 20 20 20 20 20 20 20 20 20 61 67 61 69              agai
a240: 6e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a  n. *. * NOTES. *
a250: 20 20 20 20 20 54 68 69 73 20 66 75 6e 63 74 69       This functi
a260: 6f 6e 20 77 69 6c 6c 20 63 6f 6e 6e 65 63 74 20  on will connect 
a270: 74 6f 20 74 68 65 20 50 43 2f 53 43 20 43 6f 6e  to the PC/SC Con
a280: 6e 65 63 74 69 6f 6e 20 4d 61 6e 61 67 65 72 20  nection Manager 
a290: 76 69 61 0a 20 2a 20 20 20 20 20 63 61 63 6b 65  via. *     cacke
a2a0: 79 5f 70 63 73 63 5f 63 6f 6e 6e 65 63 74 28 29  y_pcsc_connect()
a2b0: 20 69 66 20 6e 65 65 64 65 64 2e 0a 20 2a 0a 20   if needed.. *. 
a2c0: 2a 20 20 20 20 20 49 74 20 77 69 6c 6c 20 63 6f  *     It will co
a2d0: 6e 6e 65 63 74 20 74 6f 20 74 68 65 20 63 61 72  nnect to the car
a2e0: 64 20 69 6e 20 74 68 65 20 72 65 61 64 65 72 20  d in the reader 
a2f0: 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20  attached to the 
a300: 73 6c 6f 74 0a 20 2a 20 20 20 20 20 73 70 65 63  slot. *     spec
a310: 69 66 69 65 64 2e 20 20 49 74 20 77 69 6c 6c 20  ified.  It will 
a320: 72 65 63 6f 6e 6e 65 63 74 20 74 6f 20 74 68 65  reconnect to the
a330: 20 63 61 72 64 20 69 66 20 74 68 65 20 63 6f 6e   card if the con
a340: 6e 65 63 74 69 6f 6e 0a 20 2a 20 20 20 20 20 67  nection. *     g
a350: 6f 65 73 20 61 77 61 79 2e 0a 20 2a 0a 20 2a 2f  oes away.. *. */
a360: 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f 72  .static cackey_r
a370: 65 74 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61  et cackey_send_a
a380: 70 64 75 28 73 74 72 75 63 74 20 63 61 63 6b 65  pdu(struct cacke
a390: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e  y_slot *slot, un
a3a0: 73 69 67 6e 65 64 20 63 68 61 72 20 63 6c 61 73  signed char clas
a3b0: 73 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  s, unsigned char
a3c0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2c 20 75 6e   instruction, un
a3d0: 73 69 67 6e 65 64 20 63 68 61 72 20 70 31 2c 20  signed char p1, 
a3e0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 70 32  unsigned char p2
a3f0: 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 6c  , unsigned int l
a400: 63 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  c, unsigned char
a410: 20 2a 64 61 74 61 2c 20 75 6e 73 69 67 6e 65 64   *data, unsigned
a420: 20 69 6e 74 20 6c 65 2c 20 75 69 6e 74 31 36 5f   int le, uint16_
a430: 74 20 2a 72 65 73 70 63 6f 64 65 2c 20 75 6e 73  t *respcode, uns
a440: 69 67 6e 65 64 20 63 68 61 72 20 2a 72 65 73 70  igned char *resp
a450: 64 61 74 61 2c 20 73 69 7a 65 5f 74 20 2a 72 65  data, size_t *re
a460: 73 70 64 61 74 61 5f 6c 65 6e 29 20 7b 0a 09 75  spdata_len) {..u
a470: 69 6e 74 38 5f 74 20 6d 61 6a 6f 72 5f 72 63 2c  int8_t major_rc,
a480: 20 6d 69 6e 6f 72 5f 72 63 3b 0a 09 73 69 7a 65   minor_rc;..size
a490: 5f 74 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79  _t bytes_to_copy
a4a0: 2c 20 74 6d 70 5f 72 65 73 70 64 61 74 61 5f 6c  , tmp_respdata_l
a4b0: 65 6e 3b 0a 09 4c 50 43 53 43 41 52 44 5f 49 4f  en;..LPCSCARD_IO
a4c0: 5f 52 45 51 55 45 53 54 20 70 69 6f 53 65 6e 64  _REQUEST pioSend
a4d0: 50 63 69 3b 0a 09 53 43 41 52 44 5f 49 4f 5f 52  Pci;..SCARD_IO_R
a4e0: 45 51 55 45 53 54 20 70 69 6f 52 65 63 76 50 63  EQUEST pioRecvPc
a4f0: 69 3b 0a 09 44 57 4f 52 44 20 78 6d 69 74 5f 6c  i;..DWORD xmit_l
a500: 65 6e 2c 20 72 65 63 76 5f 6c 65 6e 3b 0a 09 4c  en, recv_len;..L
a510: 4f 4e 47 20 73 63 61 72 64 5f 78 6d 69 74 5f 72  ONG scard_xmit_r
a520: 65 74 2c 20 73 63 61 72 64 5f 72 65 63 6f 6e 6e  et, scard_reconn
a530: 5f 72 65 74 3b 0a 09 42 59 54 45 20 78 6d 69 74  _ret;..BYTE xmit
a540: 5f 62 75 66 5b 31 30 32 34 5d 2c 20 72 65 63 76  _buf[1024], recv
a550: 5f 62 75 66 5b 31 30 32 34 5d 3b 0a 09 69 6e 74  _buf[1024];..int
a560: 20 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65   pcsc_connect_re
a570: 74 2c 20 70 63 73 63 5f 67 65 74 72 65 73 70 5f  t, pcsc_getresp_
a580: 72 65 74 3b 0a 09 69 6e 74 20 69 64 78 3b 0a 0a  ret;..int idx;..
a590: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
a5a0: 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
a5b0: 0a 0a 09 69 66 20 28 21 73 6c 6f 74 29 20 7b 0a  ...if (!slot) {.
a5c0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
a5d0: 52 49 4e 54 46 28 22 49 6e 76 61 6c 69 64 20 73  RINTF("Invalid s
a5e0: 6c 6f 74 20 73 70 65 63 69 66 69 65 64 2e 22 29  lot specified.")
a5f0: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b  ;....return(CACK
a600: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49  EY_PCSC_E_GENERI
a610: 43 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 72 65 73  C);..}...if (res
a620: 70 63 6f 64 65 29 20 7b 0a 09 09 2a 72 65 73 70  pcode) {...*resp
a630: 63 6f 64 65 20 3d 20 30 78 66 66 66 66 3b 0a 09  code = 0xffff;..
a640: 7d 0a 0a 09 70 63 73 63 5f 63 6f 6e 6e 65 63 74  }...pcsc_connect
a650: 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 63 6f  _ret = cackey_co
a660: 6e 6e 65 63 74 5f 63 61 72 64 28 73 6c 6f 74 29  nnect_card(slot)
a670: 3b 0a 09 69 66 20 28 70 63 73 63 5f 63 6f 6e 6e  ;..if (pcsc_conn
a680: 65 63 74 5f 72 65 74 20 21 3d 20 43 41 43 4b 45  ect_ret != CACKE
a690: 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09  Y_PCSC_S_OK) {..
a6a0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
a6b0: 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20  INTF("Unable to 
a6c0: 63 6f 6e 6e 65 63 74 20 74 6f 20 63 61 72 64 2c  connect to card,
a6d0: 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61   returning in fa
a6e0: 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75  ilure");....retu
a6f0: 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  rn(CACKEY_PCSC_E
a700: 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09  _GENERIC);..}...
a710: 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 77 68 69  /* Determine whi
a720: 63 68 20 70 72 6f 74 6f 63 6f 6c 20 74 6f 20 73  ch protocol to s
a730: 65 6e 64 20 75 73 69 6e 67 20 2a 2f 0a 09 73 77  end using */..sw
a740: 69 74 63 68 20 28 73 6c 6f 74 2d 3e 70 72 6f 74  itch (slot->prot
a750: 6f 63 6f 6c 29 20 7b 0a 09 09 63 61 73 65 20 53  ocol) {...case S
a760: 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30  CARD_PROTOCOL_T0
a770: 3a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  :....CACKEY_DEBU
a780: 47 5f 50 52 49 4e 54 46 28 22 50 72 6f 74 6f 63  G_PRINTF("Protoc
a790: 6f 6c 20 74 6f 20 73 65 6e 64 20 64 61 74 61 67  ol to send datag
a7a0: 72 61 6d 20 69 73 20 54 3d 30 22 29 3b 0a 0a 09  ram is T=0");...
a7b0: 09 09 70 69 6f 53 65 6e 64 50 63 69 20 3d 20 53  ..pioSendPci = S
a7c0: 43 41 52 44 5f 50 43 49 5f 54 30 3b 0a 0a 09 09  CARD_PCI_T0;....
a7d0: 09 62 72 65 61 6b 3b 0a 09 09 63 61 73 65 20 53  .break;...case S
a7e0: 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31  CARD_PROTOCOL_T1
a7f0: 3a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  :....CACKEY_DEBU
a800: 47 5f 50 52 49 4e 54 46 28 22 50 72 6f 74 6f 63  G_PRINTF("Protoc
a810: 6f 6c 20 74 6f 20 73 65 6e 64 20 64 61 74 61 67  ol to send datag
a820: 72 61 6d 20 69 73 20 54 3d 31 22 29 3b 0a 0a 09  ram is T=1");...
a830: 09 09 70 69 6f 53 65 6e 64 50 63 69 20 3d 20 53  ..pioSendPci = S
a840: 43 41 52 44 5f 50 43 49 5f 54 31 3b 0a 0a 09 09  CARD_PCI_T1;....
a850: 09 62 72 65 61 6b 3b 0a 09 09 64 65 66 61 75 6c  .break;...defaul
a860: 74 3a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42  t:....CACKEY_DEB
a870: 55 47 5f 50 52 49 4e 54 46 28 22 49 6e 76 61 6c  UG_PRINTF("Inval
a880: 69 64 20 70 72 6f 74 6f 63 6f 6c 20 66 6f 75 6e  id protocol foun
a890: 64 2c 20 61 62 6f 72 74 69 6e 67 2e 22 29 3b 0a  d, aborting.");.
a8a0: 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ....return(CACKE
a8b0: 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43  Y_PCSC_E_GENERIC
a8c0: 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 54 72 61 6e 73  );..}.../* Trans
a8d0: 6d 69 74 20 2a 2f 0a 09 78 6d 69 74 5f 6c 65 6e  mit */..xmit_len
a8e0: 20 3d 20 30 3b 0a 09 78 6d 69 74 5f 62 75 66 5b   = 0;..xmit_buf[
a8f0: 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 63 6c  xmit_len++] = cl
a900: 61 73 73 3b 0a 09 78 6d 69 74 5f 62 75 66 5b 78  ass;..xmit_buf[x
a910: 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 69 6e 73  mit_len++] = ins
a920: 74 72 75 63 74 69 6f 6e 3b 0a 09 78 6d 69 74 5f  truction;..xmit_
a930: 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20  buf[xmit_len++] 
a940: 3d 20 70 31 3b 0a 09 78 6d 69 74 5f 62 75 66 5b  = p1;..xmit_buf[
a950: 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 70 32  xmit_len++] = p2
a960: 3b 0a 09 69 66 20 28 64 61 74 61 29 20 7b 0a 09  ;..if (data) {..
a970: 09 69 66 20 28 6c 63 20 3e 20 32 35 35 29 20 7b  .if (lc > 255) {
a980: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
a990: 5f 50 52 49 4e 54 46 28 22 43 41 55 54 49 4f 4e  _PRINTF("CAUTION
a9a0: 21 20 20 55 73 69 6e 67 20 61 6e 20 4c 63 20 67  !  Using an Lc g
a9b0: 72 65 61 74 65 72 20 74 68 61 6e 20 32 35 35 20  reater than 255 
a9c0: 69 73 20 75 6e 74 65 73 74 65 64 2e 20 20 4c 63  is untested.  Lc
a9d0: 20 3d 20 25 75 22 2c 20 6c 63 29 3b 0a 0a 09 09   = %u", lc);....
a9e0: 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c  .xmit_buf[xmit_l
a9f0: 65 6e 2b 2b 5d 20 3d 20 30 78 38 32 3b 20 2f 2a  en++] = 0x82; /*
aa00: 20 58 58 58 20 55 4e 54 45 53 54 45 44 20 2a 2f   XXX UNTESTED */
aa10: 0a 09 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69  ....xmit_buf[xmi
aa20: 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 28 6c 63 20 26  t_len++] = (lc &
aa30: 20 30 78 66 66 30 30 29 20 3e 3e 20 38 3b 0a 09   0xff00) >> 8;..
aa40: 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f  ..xmit_buf[xmit_
aa50: 6c 65 6e 2b 2b 5d 20 3d 20 6c 63 20 26 20 30 78  len++] = lc & 0x
aa60: 66 66 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09  ff;...} else {..
aa70: 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f  ..xmit_buf[xmit_
aa80: 6c 65 6e 2b 2b 5d 20 3d 20 6c 63 3b 0a 09 09 7d  len++] = lc;...}
aa90: 0a 09 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b  ...for (idx = 0;
aaa0: 20 69 64 78 20 3c 20 6c 63 3b 20 69 64 78 2b 2b   idx < lc; idx++
aab0: 29 20 7b 0a 09 09 09 78 6d 69 74 5f 62 75 66 5b  ) {....xmit_buf[
aac0: 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 64 61  xmit_len++] = da
aad0: 74 61 5b 69 64 78 5d 3b 0a 09 09 7d 0a 09 7d 0a  ta[idx];...}..}.
aae0: 0a 09 69 66 20 28 6c 65 20 21 3d 20 30 78 30 30  ..if (le != 0x00
aaf0: 29 20 7b 0a 09 09 69 66 20 28 6c 65 20 3e 20 32  ) {...if (le > 2
ab00: 35 36 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  56) {....CACKEY_
ab10: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 41  DEBUG_PRINTF("CA
ab20: 55 54 49 4f 4e 21 20 20 55 73 69 6e 67 20 61 6e  UTION!  Using an
ab30: 20 4c 65 20 67 72 65 61 74 65 72 20 74 68 61 6e   Le greater than
ab40: 20 32 35 36 20 69 73 20 75 6e 74 65 73 74 65 64   256 is untested
ab50: 2e 20 20 4c 65 20 3d 20 25 75 22 2c 20 6c 65 29  .  Le = %u", le)
ab60: 3b 0a 0a 09 09 09 78 6d 69 74 5f 62 75 66 5b 78  ;.....xmit_buf[x
ab70: 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 30 78 38  mit_len++] = 0x8
ab80: 32 3b 20 2f 2a 20 58 58 58 20 55 4e 54 45 53 54  2; /* XXX UNTEST
ab90: 45 44 20 2a 2f 0a 09 09 09 78 6d 69 74 5f 62 75  ED */....xmit_bu
aba0: 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20  f[xmit_len++] = 
abb0: 28 6c 65 20 26 20 30 78 66 66 30 30 29 20 3e 3e  (le & 0xff00) >>
abc0: 20 38 3b 0a 09 09 09 78 6d 69 74 5f 62 75 66 5b   8;....xmit_buf[
abd0: 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 6c 65  xmit_len++] = le
abe0: 20 26 20 30 78 66 66 3b 0a 09 09 7d 20 65 6c 73   & 0xff;...} els
abf0: 65 20 69 66 20 28 6c 65 20 3d 3d 20 32 35 36 29  e if (le == 256)
ac00: 20 7b 0a 09 09 09 78 6d 69 74 5f 62 75 66 5b 78   {....xmit_buf[x
ac10: 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 30 78 30  mit_len++] = 0x0
ac20: 30 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  0;...} else {...
ac30: 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c  .xmit_buf[xmit_l
ac40: 65 6e 2b 2b 5d 20 3d 20 6c 65 3b 0a 09 09 7d 0a  en++] = le;...}.
ac50: 09 7d 0a 0a 09 2f 2a 20 42 65 67 69 6e 20 53 6d  .}.../* Begin Sm
ac60: 61 72 74 63 61 72 64 20 54 72 61 6e 73 61 63 74  artcard Transact
ac70: 69 6f 6e 20 2a 2f 0a 09 63 61 63 6b 65 79 5f 62  ion */..cackey_b
ac80: 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e  egin_transaction
ac90: 28 73 6c 6f 74 29 3b 0a 0a 09 69 66 20 28 63 6c  (slot);...if (cl
aca0: 61 73 73 20 3d 3d 20 47 53 43 49 53 5f 43 4c 41  ass == GSCIS_CLA
acb0: 53 53 5f 49 53 4f 37 38 31 36 20 26 26 20 28 69  SS_ISO7816 && (i
acc0: 6e 73 74 72 75 63 74 69 6f 6e 20 3d 3d 20 47 53  nstruction == GS
acd0: 43 49 53 5f 49 4e 53 54 52 5f 56 45 52 49 46 59  CIS_INSTR_VERIFY
ace0: 20 7c 7c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20   || instruction 
acf0: 3d 3d 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 43  == GSCIS_INSTR_C
ad00: 48 41 4e 47 45 5f 52 45 46 45 52 45 4e 43 45 29  HANGE_REFERENCE)
ad10: 20 26 26 20 70 31 20 3d 3d 20 30 78 30 30 29 20   && p1 == 0x00) 
ad20: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
ad30: 5f 50 52 49 4e 54 46 28 22 53 65 6e 64 69 6e 67  _PRINTF("Sending
ad40: 20 41 50 44 55 3a 20 3c 3c 63 65 6e 73 6f 72 65   APDU: <<censore
ad50: 64 3e 3e 22 29 3b 0a 09 7d 20 65 6c 73 65 20 7b  d>>");..} else {
ad60: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
ad70: 50 52 49 4e 54 42 55 46 28 22 53 65 6e 64 69 6e  PRINTBUF("Sendin
ad80: 67 20 41 50 44 55 3a 22 2c 20 78 6d 69 74 5f 62  g APDU:", xmit_b
ad90: 75 66 2c 20 78 6d 69 74 5f 6c 65 6e 29 3b 0a 09  uf, xmit_len);..
ada0: 7d 0a 0a 09 72 65 63 76 5f 6c 65 6e 20 3d 20 73  }...recv_len = s
adb0: 69 7a 65 6f 66 28 72 65 63 76 5f 62 75 66 29 3b  izeof(recv_buf);
adc0: 0a 09 6d 65 6d 63 70 79 28 26 70 69 6f 52 65 63  ..memcpy(&pioRec
add0: 76 50 63 69 2c 20 70 69 6f 53 65 6e 64 50 63 69  vPci, pioSendPci
ade0: 2c 20 73 69 7a 65 6f 66 28 70 69 6f 52 65 63 76  , sizeof(pioRecv
adf0: 50 63 69 29 29 3b 0a 09 73 63 61 72 64 5f 78 6d  Pci));..scard_xm
ae00: 69 74 5f 72 65 74 20 3d 20 53 43 61 72 64 54 72  it_ret = SCardTr
ae10: 61 6e 73 6d 69 74 28 73 6c 6f 74 2d 3e 70 63 73  ansmit(slot->pcs
ae20: 63 5f 63 61 72 64 2c 20 70 69 6f 53 65 6e 64 50  c_card, pioSendP
ae30: 63 69 2c 20 78 6d 69 74 5f 62 75 66 2c 20 78 6d  ci, xmit_buf, xm
ae40: 69 74 5f 6c 65 6e 2c 20 26 70 69 6f 52 65 63 76  it_len, &pioRecv
ae50: 50 63 69 2c 20 72 65 63 76 5f 62 75 66 2c 20 26  Pci, recv_buf, &
ae60: 72 65 63 76 5f 6c 65 6e 29 3b 0a 0a 09 43 41 43  recv_len);...CAC
ae70: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
ae80: 28 22 53 43 61 72 64 54 72 61 6e 73 6d 69 74 28  ("SCardTransmit(
ae90: 29 20 63 6f 6d 70 6c 65 74 65 64 20 77 69 74 68  ) completed with
aea0: 20 76 61 6c 75 65 3a 20 25 73 2f 25 6c 78 22 2c   value: %s/%lx",
aeb0: 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55   CACKEY_DEBUG_FU
aec0: 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53  NC_SCARDERR_TO_S
aed0: 54 52 28 73 63 61 72 64 5f 78 6d 69 74 5f 72 65  TR(scard_xmit_re
aee0: 74 29 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  t), (unsigned lo
aef0: 6e 67 29 20 73 63 61 72 64 5f 78 6d 69 74 5f 72  ng) scard_xmit_r
af00: 65 74 29 3b 0a 0a 09 69 66 20 28 73 63 61 72 64  et);...if (scard
af10: 5f 78 6d 69 74 5f 72 65 74 20 3d 3d 20 53 43 41  _xmit_ret == SCA
af20: 52 44 5f 45 5f 4e 4f 54 5f 54 52 41 4e 53 41 43  RD_E_NOT_TRANSAC
af30: 54 45 44 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  TED) {...CACKEY_
af40: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 61  DEBUG_PRINTF("Fa
af50: 69 6c 65 64 20 74 6f 20 73 65 6e 64 20 41 50 44  iled to send APD
af60: 55 20 74 6f 20 63 61 72 64 20 28 53 43 61 72 64  U to card (SCard
af70: 54 72 61 6e 73 6d 69 74 28 29 20 3d 20 25 73 2f  Transmit() = %s/
af80: 25 6c 78 29 2c 20 77 69 6c 6c 20 61 73 6b 20 63  %lx), will ask c
af90: 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  alling function 
afa0: 74 6f 20 72 65 74 72 79 20 28 6e 6f 74 20 72 65  to retry (not re
afb0: 73 65 74 74 69 6e 67 20 63 61 72 64 29 2e 2e 2e  setting card)...
afc0: 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ", CACKEY_DEBUG_
afd0: 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f  FUNC_SCARDERR_TO
afe0: 5f 53 54 52 28 73 63 61 72 64 5f 78 6d 69 74 5f  _STR(scard_xmit_
aff0: 72 65 74 29 2c 20 28 75 6e 73 69 67 6e 65 64 20  ret), (unsigned 
b000: 6c 6f 6e 67 29 20 73 63 61 72 64 5f 78 6d 69 74  long) scard_xmit
b010: 5f 72 65 74 29 3b 0a 0a 09 09 2f 2a 20 45 6e 64  _ret);..../* End
b020: 20 53 6d 61 72 74 63 61 72 64 20 54 72 61 6e 73   Smartcard Trans
b030: 61 63 74 69 6f 6e 20 2a 2f 0a 09 09 63 61 63 6b  action */...cack
b040: 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  ey_end_transacti
b050: 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 63 61 63  on(slot);....cac
b060: 6b 65 79 5f 72 65 63 6f 6e 6e 65 63 74 5f 63 61  key_reconnect_ca
b070: 72 64 28 73 6c 6f 74 2c 20 73 6c 6f 74 2d 3e 70  rd(slot, slot->p
b080: 72 6f 74 6f 63 6f 6c 29 3b 0a 0a 09 09 72 65 74  rotocol);....ret
b090: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
b0a0: 45 5f 52 45 54 52 59 29 3b 0a 09 7d 0a 0a 09 69  E_RETRY);..}...i
b0b0: 66 20 28 73 63 61 72 64 5f 78 6d 69 74 5f 72 65  f (scard_xmit_re
b0c0: 74 20 3d 3d 20 53 43 41 52 44 5f 45 5f 4e 4f 5f  t == SCARD_E_NO_
b0d0: 53 45 52 56 49 43 45 29 20 7b 0a 09 09 43 41 43  SERVICE) {...CAC
b0e0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
b0f0: 28 22 46 61 69 6c 65 64 20 74 6f 20 73 65 6e 64  ("Failed to send
b100: 20 41 50 44 55 20 74 6f 20 63 61 72 64 2c 20 70   APDU to card, p
b110: 6f 73 73 69 62 6c 79 20 64 75 65 20 74 6f 20 50  ossibly due to P
b120: 43 2f 53 43 20 68 61 6e 64 6c 65 20 62 65 69 6e  C/SC handle bein
b130: 67 20 69 6e 76 61 6c 69 64 20 28 53 43 61 72 64  g invalid (SCard
b140: 54 72 61 6e 73 6d 69 74 28 29 20 3d 20 25 73 2f  Transmit() = %s/
b150: 25 6c 78 29 2c 20 77 69 6c 6c 20 61 73 6b 20 63  %lx), will ask c
b160: 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  alling function 
b170: 74 6f 20 72 65 74 72 79 2e 2e 2e 22 2c 20 43 41  to retry...", CA
b180: 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
b190: 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28  SCARDERR_TO_STR(
b1a0: 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 29 2c  scard_xmit_ret),
b1b0: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
b1c0: 20 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 29   scard_xmit_ret)
b1d0: 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 61 72 6b  ;....cackey_mark
b1e0: 5f 73 6c 6f 74 5f 72 65 73 65 74 28 73 6c 6f 74  _slot_reset(slot
b1f0: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43  );....return(CAC
b200: 4b 45 59 5f 50 43 53 43 5f 45 5f 52 45 54 52 59  KEY_PCSC_E_RETRY
b210: 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 63 61 72  );..}...if (scar
b220: 64 5f 78 6d 69 74 5f 72 65 74 20 21 3d 20 53 43  d_xmit_ret != SC
b230: 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b  ARD_S_SUCCESS) {
b240: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
b250: 50 52 49 4e 54 46 28 22 46 61 69 6c 65 64 20 74  PRINTF("Failed t
b260: 6f 20 73 65 6e 64 20 41 50 44 55 20 74 6f 20 63  o send APDU to c
b270: 61 72 64 20 28 53 43 61 72 64 54 72 61 6e 73 6d  ard (SCardTransm
b280: 69 74 28 29 20 3d 20 25 73 2f 25 6c 78 29 22 2c  it() = %s/%lx)",
b290: 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55   CACKEY_DEBUG_FU
b2a0: 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53  NC_SCARDERR_TO_S
b2b0: 54 52 28 73 63 61 72 64 5f 78 6d 69 74 5f 72 65  TR(scard_xmit_re
b2c0: 74 29 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  t), (unsigned lo
b2d0: 6e 67 29 20 73 63 61 72 64 5f 78 6d 69 74 5f 72  ng) scard_xmit_r
b2e0: 65 74 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  et);....CACKEY_D
b2f0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4d 61 72  EBUG_PRINTF("Mar
b300: 6b 69 6e 67 20 73 6c 6f 74 20 61 73 20 68 61 76  king slot as hav
b310: 69 6e 67 20 62 65 65 6e 20 72 65 73 65 74 22 29  ing been reset")
b320: 3b 0a 09 09 63 61 63 6b 65 79 5f 6d 61 72 6b 5f  ;...cackey_mark_
b330: 73 6c 6f 74 5f 72 65 73 65 74 28 73 6c 6f 74 29  slot_reset(slot)
b340: 3b 0a 0a 09 09 69 66 20 28 73 63 61 72 64 5f 78  ;....if (scard_x
b350: 6d 69 74 5f 72 65 74 20 3d 3d 20 53 43 41 52 44  mit_ret == SCARD
b360: 5f 57 5f 52 45 53 45 54 5f 43 41 52 44 29 20 7b  _W_RESET_CARD) {
b370: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
b380: 5f 50 52 49 4e 54 46 28 22 52 65 73 65 74 20 72  _PRINTF("Reset r
b390: 65 71 75 69 72 65 64 2c 20 70 6c 65 61 73 65 20  equired, please 
b3a0: 68 6f 6c 64 2e 2e 2e 22 29 3b 0a 0a 09 09 09 73  hold...");.....s
b3b0: 63 61 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 74 20  card_reconn_ret 
b3c0: 3d 20 63 61 63 6b 65 79 5f 72 65 63 6f 6e 6e 65  = cackey_reconne
b3d0: 63 74 5f 63 61 72 64 28 73 6c 6f 74 2c 20 53 43  ct_card(slot, SC
b3e0: 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 20  ARD_PROTOCOL_T0 
b3f0: 7c 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c  | SCARD_PROTOCOL
b400: 5f 54 31 29 3b 0a 0a 09 09 09 69 66 20 28 73 63  _T1);.....if (sc
b410: 61 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 74 20 3d  ard_reconn_ret =
b420: 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53  = SCARD_S_SUCCES
b430: 53 29 20 7b 0a 09 09 09 09 73 77 69 74 63 68 20  S) {.....switch 
b440: 28 73 6c 6f 74 2d 3e 70 72 6f 74 6f 63 6f 6c 29  (slot->protocol)
b450: 20 7b 0a 09 09 09 09 09 63 61 73 65 20 53 43 41   {......case SCA
b460: 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 3a 0a  RD_PROTOCOL_T0:.
b470: 09 09 09 09 09 09 70 69 6f 53 65 6e 64 50 63 69  ......pioSendPci
b480: 20 3d 20 53 43 41 52 44 5f 50 43 49 5f 54 30 3b   = SCARD_PCI_T0;
b490: 0a 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09  ........break;..
b4a0: 09 09 09 09 63 61 73 65 20 53 43 41 52 44 5f 50  ....case SCARD_P
b4b0: 52 4f 54 4f 43 4f 4c 5f 54 31 3a 0a 09 09 09 09  ROTOCOL_T1:.....
b4c0: 09 09 70 69 6f 53 65 6e 64 50 63 69 20 3d 20 53  ..pioSendPci = S
b4d0: 43 41 52 44 5f 50 43 49 5f 54 31 3b 0a 0a 09 09  CARD_PCI_T1;....
b4e0: 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09  ....break;......
b4f0: 64 65 66 61 75 6c 74 3a 0a 09 09 09 09 09 09 43  default:.......C
b500: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
b510: 54 46 28 22 49 6e 76 61 6c 69 64 20 70 72 6f 74  TF("Invalid prot
b520: 6f 63 6f 6c 20 66 6f 75 6e 64 2c 20 62 75 74 20  ocol found, but 
b530: 74 6f 6f 20 6c 61 74 65 20 74 6f 20 64 6f 20 61  too late to do a
b540: 6e 79 74 68 69 6e 67 20 61 62 6f 75 74 20 69 74  nything about it
b550: 20 6e 6f 77 20 2d 2d 20 74 72 79 69 6e 67 20 61   now -- trying a
b560: 6e 79 77 61 79 2e 22 29 3b 0a 0a 09 09 09 09 09  nyway.");.......
b570: 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09  .break;.....}...
b580: 09 09 09 2f 2a 20 52 65 2d 65 73 74 61 62 6c 69  .../* Re-establi
b590: 73 68 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  sh transaction, 
b5a0: 69 66 20 69 74 20 77 61 73 20 70 72 65 73 65 6e  if it was presen
b5b0: 74 20 2a 2f 0a 09 09 09 09 69 66 20 28 73 6c 6f  t */.....if (slo
b5c0: 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64  t->transaction_d
b5d0: 65 70 74 68 20 3e 20 30 29 20 7b 0a 09 09 09 09  epth > 0) {.....
b5e0: 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69  .slot->transacti
b5f0: 6f 6e 5f 64 65 70 74 68 2d 2d 3b 0a 09 09 09 09  on_depth--;.....
b600: 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69  .slot->transacti
b610: 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b 20  on_need_hw_lock 
b620: 3d 20 31 3b 0a 09 09 09 09 09 63 61 63 6b 65 79  = 1;......cackey
b630: 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69  _begin_transacti
b640: 6f 6e 28 73 6c 6f 74 29 3b 0a 09 09 09 09 7d 0a  on(slot);.....}.
b650: 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
b660: 47 5f 50 52 49 4e 54 46 28 22 52 65 73 65 74 20  G_PRINTF("Reset 
b670: 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74 72  successful, retr
b680: 61 6e 73 6d 69 74 74 69 6e 67 22 29 3b 0a 0a 09  ansmitting");...
b690: 09 09 09 72 65 63 76 5f 6c 65 6e 20 3d 20 73 69  ...recv_len = si
b6a0: 7a 65 6f 66 28 72 65 63 76 5f 62 75 66 29 3b 0a  zeof(recv_buf);.
b6b0: 09 09 09 09 6d 65 6d 63 70 79 28 26 70 69 6f 52  ....memcpy(&pioR
b6c0: 65 63 76 50 63 69 2c 20 70 69 6f 53 65 6e 64 50  ecvPci, pioSendP
b6d0: 63 69 2c 20 73 69 7a 65 6f 66 28 70 69 6f 52 65  ci, sizeof(pioRe
b6e0: 63 76 50 63 69 29 29 3b 0a 09 09 09 09 73 63 61  cvPci));.....sca
b6f0: 72 64 5f 78 6d 69 74 5f 72 65 74 20 3d 20 53 43  rd_xmit_ret = SC
b700: 61 72 64 54 72 61 6e 73 6d 69 74 28 73 6c 6f 74  ardTransmit(slot
b710: 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 70 69 6f  ->pcsc_card, pio
b720: 53 65 6e 64 50 63 69 2c 20 78 6d 69 74 5f 62 75  SendPci, xmit_bu
b730: 66 2c 20 78 6d 69 74 5f 6c 65 6e 2c 20 26 70 69  f, xmit_len, &pi
b740: 6f 52 65 63 76 50 63 69 2c 20 72 65 63 76 5f 62  oRecvPci, recv_b
b750: 75 66 2c 20 26 72 65 63 76 5f 6c 65 6e 29 3b 0a  uf, &recv_len);.
b760: 0a 09 09 09 09 69 66 20 28 73 63 61 72 64 5f 78  .....if (scard_x
b770: 6d 69 74 5f 72 65 74 20 21 3d 20 53 43 41 52 44  mit_ret != SCARD
b780: 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09  _S_SUCCESS) {...
b790: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
b7a0: 50 52 49 4e 54 46 28 22 52 65 74 72 61 6e 73 6d  PRINTF("Retransm
b7b0: 69 74 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72  it failed, retur
b7c0: 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 20  ning in failure 
b7d0: 61 66 74 65 72 20 64 69 73 63 6f 6e 6e 65 63 74  after disconnect
b7e0: 69 6e 67 20 74 68 65 20 63 61 72 64 20 28 53 43  ing the card (SC
b7f0: 61 72 64 54 72 61 6e 73 6d 69 74 20 3d 20 25 73  ardTransmit = %s
b800: 2f 25 6c 69 29 22 2c 20 43 41 43 4b 45 59 5f 44  /%li)", CACKEY_D
b810: 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45  EBUG_FUNC_SCARDE
b820: 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 5f  RR_TO_STR(scard_
b830: 78 6d 69 74 5f 72 65 74 29 2c 20 28 6c 6f 6e 67  xmit_ret), (long
b840: 29 20 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74  ) scard_xmit_ret
b850: 29 3b 0a 0a 09 09 09 09 09 53 43 61 72 64 44 69  );.......SCardDi
b860: 73 63 6f 6e 6e 65 63 74 28 73 6c 6f 74 2d 3e 70  sconnect(slot->p
b870: 63 73 63 5f 63 61 72 64 2c 20 53 43 41 52 44 5f  csc_card, SCARD_
b880: 4c 45 41 56 45 5f 43 41 52 44 29 3b 0a 09 09 09  LEAVE_CARD);....
b890: 09 09 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72  ..slot->pcsc_car
b8a0: 64 5f 63 6f 6e 6e 65 63 74 65 64 20 3d 20 30 3b  d_connected = 0;
b8b0: 0a 0a 09 09 09 09 09 2f 2a 20 45 6e 64 20 53 6d  ......./* End Sm
b8c0: 61 72 74 63 61 72 64 20 54 72 61 6e 73 61 63 74  artcard Transact
b8d0: 69 6f 6e 20 2a 2f 0a 09 09 09 09 09 73 6c 6f 74  ion */......slot
b8e0: 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65  ->transaction_de
b8f0: 70 74 68 20 3d 20 31 3b 0a 09 09 09 09 09 63 61  pth = 1;......ca
b900: 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ckey_end_transac
b910: 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 09  tion(slot);.....
b920: 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
b930: 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45  PCSC_E_TOKENABSE
b940: 4e 54 29 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 20  NT);.....}....} 
b950: 65 6c 73 65 20 7b 0a 09 09 09 09 43 41 43 4b 45  else {.....CACKE
b960: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
b970: 44 69 73 63 6f 6e 6e 65 63 74 69 6e 67 20 63 61  Disconnecting ca
b980: 72 64 22 29 3b 0a 0a 09 09 09 09 53 43 61 72 64  rd");......SCard
b990: 44 69 73 63 6f 6e 6e 65 63 74 28 73 6c 6f 74 2d  Disconnect(slot-
b9a0: 3e 70 63 73 63 5f 63 61 72 64 2c 20 53 43 41 52  >pcsc_card, SCAR
b9b0: 44 5f 4c 45 41 56 45 5f 43 41 52 44 29 3b 0a 09  D_LEAVE_CARD);..
b9c0: 09 09 09 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61  ...slot->pcsc_ca
b9d0: 72 64 5f 63 6f 6e 6e 65 63 74 65 64 20 3d 20 30  rd_connected = 0
b9e0: 3b 0a 0a 09 09 09 09 2f 2a 20 45 6e 64 20 53 6d  ;....../* End Sm
b9f0: 61 72 74 63 61 72 64 20 54 72 61 6e 73 61 63 74  artcard Transact
ba00: 69 6f 6e 20 2a 2f 0a 09 09 09 09 73 6c 6f 74 2d  ion */.....slot-
ba10: 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70  >transaction_dep
ba20: 74 68 20 3d 20 31 3b 0a 09 09 09 09 63 61 63 6b  th = 1;.....cack
ba30: 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  ey_end_transacti
ba40: 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 09 09 43  on(slot);......C
ba50: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
ba60: 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e  TF("Returning in
ba70: 20 66 61 69 6c 75 72 65 22 29 3b 0a 09 09 09 09   failure");.....
ba80: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
ba90: 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54  SC_E_TOKENABSENT
baa0: 29 3b 0a 09 09 09 7d 0a 09 09 7d 20 65 6c 73 65  );....}...} else
bab0: 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
bac0: 55 47 5f 50 52 49 4e 54 46 28 22 44 69 73 63 6f  UG_PRINTF("Disco
bad0: 6e 6e 65 63 74 69 6e 67 20 63 61 72 64 22 29 3b  nnecting card");
bae0: 0a 0a 09 09 09 53 43 61 72 64 44 69 73 63 6f 6e  .....SCardDiscon
baf0: 6e 65 63 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f  nect(slot->pcsc_
bb00: 63 61 72 64 2c 20 53 43 41 52 44 5f 4c 45 41 56  card, SCARD_LEAV
bb10: 45 5f 43 41 52 44 29 3b 0a 09 09 09 73 6c 6f 74  E_CARD);....slot
bb20: 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e  ->pcsc_card_conn
bb30: 65 63 74 65 64 20 3d 20 30 3b 0a 0a 09 09 09 2f  ected = 0;...../
bb40: 2a 20 45 6e 64 20 53 6d 61 72 74 63 61 72 64 20  * End Smartcard 
bb50: 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09  Transaction */..
bb60: 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74  ..slot->transact
bb70: 69 6f 6e 5f 64 65 70 74 68 20 3d 20 31 3b 0a 09  ion_depth = 1;..
bb80: 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61  ..cackey_end_tra
bb90: 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a  nsaction(slot);.
bba0: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
bbb0: 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
bbc0: 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b  ng in failure");
bbd0: 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ....return(CACKE
bbe0: 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42  Y_PCSC_E_TOKENAB
bbf0: 53 45 4e 54 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09  SENT);...}..}...
bc00: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
bc10: 4e 54 42 55 46 28 22 52 65 74 75 72 6e 65 64 20  NTBUF("Returned 
bc20: 56 61 6c 75 65 3a 22 2c 20 72 65 63 76 5f 62 75  Value:", recv_bu
bc30: 66 2c 20 72 65 63 76 5f 6c 65 6e 29 3b 0a 0a 09  f, recv_len);...
bc40: 69 66 20 28 72 65 63 76 5f 6c 65 6e 20 3c 20 32  if (recv_len < 2
bc50: 29 20 7b 0a 09 09 2f 2a 20 4d 69 6e 69 6d 61 6c  ) {.../* Minimal
bc60: 20 72 65 73 70 6f 6e 73 65 20 6c 65 6e 67 74 68   response length
bc70: 20 69 73 20 32 20 62 79 74 65 73 2c 20 72 65 74   is 2 bytes, ret
bc80: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
bc90: 65 20 2a 2f 0a 09 09 43 41 43 4b 45 59 5f 44 45  e */...CACKEY_DE
bca0: 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 73 70  BUG_PRINTF("Resp
bcb0: 6f 6e 73 65 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20  onse too small, 
bcc0: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  returning in fai
bcd0: 6c 75 72 65 20 28 72 65 63 76 5f 6c 65 6e 20 3d  lure (recv_len =
bce0: 20 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65   %lu)", (unsigne
bcf0: 64 20 6c 6f 6e 67 29 20 72 65 63 76 5f 6c 65 6e  d long) recv_len
bd00: 29 3b 0a 0a 09 09 2f 2a 20 45 6e 64 20 53 6d 61  );..../* End Sma
bd10: 72 74 63 61 72 64 20 54 72 61 6e 73 61 63 74 69  rtcard Transacti
bd20: 6f 6e 20 2a 2f 0a 09 09 63 61 63 6b 65 79 5f 65  on */...cackey_e
bd30: 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73  nd_transaction(s
bd40: 6c 6f 74 29 3b 0a 0a 09 09 2f 2a 20 53 75 70 70  lot);..../* Supp
bd50: 6c 79 20 61 6e 20 69 6e 76 61 6c 69 64 20 72 65  ly an invalid re
bd60: 73 70 6f 6e 73 65 20 63 6f 64 65 20 2a 2f 0a 09  sponse code */..
bd70: 09 69 66 20 28 72 65 73 70 63 6f 64 65 29 20 7b  .if (respcode) {
bd80: 0a 09 09 09 2a 72 65 73 70 63 6f 64 65 20 3d 20  ....*respcode = 
bd90: 30 3b 0a 09 09 7d 0a 0a 09 09 72 65 74 75 72 6e  0;...}....return
bda0: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4e  (CACKEY_PCSC_E_N
bdb0: 4f 44 41 54 41 29 3b 0a 09 7d 0a 0a 09 2f 2a 20  ODATA);..}.../* 
bdc0: 44 65 74 65 72 6d 69 6e 65 20 72 65 73 75 6c 74  Determine result
bdd0: 20 63 6f 64 65 20 2a 2f 0a 09 6d 61 6a 6f 72 5f   code */..major_
bde0: 72 63 20 3d 20 72 65 63 76 5f 62 75 66 5b 72 65  rc = recv_buf[re
bdf0: 63 76 5f 6c 65 6e 20 2d 20 32 5d 3b 0a 09 6d 69  cv_len - 2];..mi
be00: 6e 6f 72 5f 72 63 20 3d 20 72 65 63 76 5f 62 75  nor_rc = recv_bu
be10: 66 5b 72 65 63 76 5f 6c 65 6e 20 2d 20 31 5d 3b  f[recv_len - 1];
be20: 0a 09 69 66 20 28 72 65 73 70 63 6f 64 65 29 20  ..if (respcode) 
be30: 7b 0a 09 09 2a 72 65 73 70 63 6f 64 65 20 3d 20  {...*respcode = 
be40: 28 6d 61 6a 6f 72 5f 72 63 20 3c 3c 20 38 29 20  (major_rc << 8) 
be50: 7c 20 6d 69 6e 6f 72 5f 72 63 3b 0a 09 7d 0a 0a  | minor_rc;..}..
be60: 09 2f 2a 20 41 64 6a 75 73 74 20 6d 65 73 73 61  ./* Adjust messa
be70: 67 65 20 62 75 66 66 65 72 20 2a 2f 0a 09 72 65  ge buffer */..re
be80: 63 76 5f 6c 65 6e 20 2d 3d 20 32 3b 0a 0a 09 2f  cv_len -= 2;.../
be90: 2a 20 41 64 64 20 62 79 74 65 73 20 74 6f 20 72  * Add bytes to r
bea0: 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 09  eturn value */..
beb0: 74 6d 70 5f 72 65 73 70 64 61 74 61 5f 6c 65 6e  tmp_respdata_len
bec0: 20 3d 20 30 3b 0a 09 69 66 20 28 72 65 73 70 64   = 0;..if (respd
bed0: 61 74 61 20 26 26 20 72 65 73 70 64 61 74 61 5f  ata && respdata_
bee0: 6c 65 6e 29 20 7b 0a 09 09 74 6d 70 5f 72 65 73  len) {...tmp_res
bef0: 70 64 61 74 61 5f 6c 65 6e 20 3d 20 2a 72 65 73  pdata_len = *res
bf00: 70 64 61 74 61 5f 6c 65 6e 3b 0a 0a 09 09 62 79  pdata_len;....by
bf10: 74 65 73 5f 74 6f 5f 63 6f 70 79 20 3d 20 2a 72  tes_to_copy = *r
bf20: 65 73 70 64 61 74 61 5f 6c 65 6e 3b 0a 0a 09 09  espdata_len;....
bf30: 69 66 20 28 72 65 63 76 5f 6c 65 6e 20 3c 20 62  if (recv_len < b
bf40: 79 74 65 73 5f 74 6f 5f 63 6f 70 79 29 20 7b 0a  ytes_to_copy) {.
bf50: 09 09 09 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79  ...bytes_to_copy
bf60: 20 3d 20 72 65 63 76 5f 6c 65 6e 3b 0a 09 09 7d   = recv_len;...}
bf70: 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
bf80: 5f 50 52 49 4e 54 46 28 22 43 6f 70 79 69 6e 67  _PRINTF("Copying
bf90: 20 25 6c 75 20 62 79 74 65 73 20 74 6f 20 74 68   %lu bytes to th
bfa0: 65 20 62 75 66 66 65 72 20 28 72 65 63 76 27 64  e buffer (recv'd
bfb0: 20 25 6c 75 20 62 79 74 65 73 2c 20 62 75 74 20   %lu bytes, but 
bfc0: 6f 6e 6c 79 20 25 6c 75 20 62 79 74 65 73 20 6c  only %lu bytes l
bfd0: 65 66 74 20 69 6e 20 6f 75 72 20 62 75 66 66 65  eft in our buffe
bfe0: 72 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  r)", (unsigned l
bff0: 6f 6e 67 29 20 62 79 74 65 73 5f 74 6f 5f 63 6f  ong) bytes_to_co
c000: 70 79 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  py, (unsigned lo
c010: 6e 67 29 20 72 65 63 76 5f 6c 65 6e 2c 20 28 75  ng) recv_len, (u
c020: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 72  nsigned long) *r
c030: 65 73 70 64 61 74 61 5f 6c 65 6e 29 3b 0a 0a 09  espdata_len);...
c040: 09 6d 65 6d 63 70 79 28 72 65 73 70 64 61 74 61  .memcpy(respdata
c050: 2c 20 72 65 63 76 5f 62 75 66 2c 20 62 79 74 65  , recv_buf, byte
c060: 73 5f 74 6f 5f 63 6f 70 79 29 3b 0a 09 09 72 65  s_to_copy);...re
c070: 73 70 64 61 74 61 20 2b 3d 20 62 79 74 65 73 5f  spdata += bytes_
c080: 74 6f 5f 63 6f 70 79 3b 0a 0a 09 09 2a 72 65 73  to_copy;....*res
c090: 70 64 61 74 61 5f 6c 65 6e 20 3d 20 62 79 74 65  pdata_len = byte
c0a0: 73 5f 74 6f 5f 63 6f 70 79 3b 0a 09 09 74 6d 70  s_to_copy;...tmp
c0b0: 5f 72 65 73 70 64 61 74 61 5f 6c 65 6e 20 2d 3d  _respdata_len -=
c0c0: 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 3b 0a   bytes_to_copy;.
c0d0: 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69 66 20 28  .} else {...if (
c0e0: 72 65 63 76 5f 6c 65 6e 20 21 3d 20 30 29 20 7b  recv_len != 0) {
c0f0: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
c100: 5f 50 52 49 4e 54 46 28 22 54 68 72 6f 77 69 6e  _PRINTF("Throwin
c110: 67 20 61 77 61 79 20 25 6c 75 20 62 79 74 65 73  g away %lu bytes
c120: 2c 20 6e 6f 77 68 65 72 65 20 74 6f 20 70 75 74  , nowhere to put
c130: 20 74 68 65 6d 21 22 2c 20 28 75 6e 73 69 67 6e   them!", (unsign
c140: 65 64 20 6c 6f 6e 67 29 20 72 65 63 76 5f 6c 65  ed long) recv_le
c150: 6e 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20  n);...}..}...if 
c160: 28 6d 61 6a 6f 72 5f 72 63 20 3d 3d 20 30 78 36  (major_rc == 0x6
c170: 31 29 20 7b 0a 09 09 2f 2a 20 57 65 20 6e 65 65  1) {.../* We nee
c180: 64 20 74 6f 20 52 45 41 44 20 2a 2f 0a 09 09 43  d to READ */...C
c190: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
c1a0: 54 46 28 22 42 75 66 66 65 72 20 72 65 61 64 20  TF("Buffer read 
c1b0: 72 65 71 75 69 72 65 64 22 29 3b 0a 0a 09 09 69  required");....i
c1c0: 66 20 28 6d 69 6e 6f 72 5f 72 63 20 3d 3d 20 30  f (minor_rc == 0
c1d0: 78 30 30 29 20 7b 0a 09 09 09 6d 69 6e 6f 72 5f  x00) {....minor_
c1e0: 72 63 20 3d 20 43 41 43 4b 45 59 5f 41 50 44 55  rc = CACKEY_APDU
c1f0: 5f 4d 54 55 3b 0a 09 09 7d 0a 0a 09 09 70 63 73  _MTU;...}....pcs
c200: 63 5f 67 65 74 72 65 73 70 5f 72 65 74 20 3d 20  c_getresp_ret = 
c210: 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75  cackey_send_apdu
c220: 28 73 6c 6f 74 2c 20 47 53 43 49 53 5f 43 4c 41  (slot, GSCIS_CLA
c230: 53 53 5f 49 53 4f 37 38 31 36 2c 20 47 53 43 49  SS_ISO7816, GSCI
c240: 53 5f 49 4e 53 54 52 5f 47 45 54 5f 52 45 53 50  S_INSTR_GET_RESP
c250: 4f 4e 53 45 2c 20 30 78 30 30 2c 20 30 78 30 30  ONSE, 0x00, 0x00
c260: 2c 20 30 2c 20 4e 55 4c 4c 2c 20 6d 69 6e 6f 72  , 0, NULL, minor
c270: 5f 72 63 2c 20 72 65 73 70 63 6f 64 65 2c 20 72  _rc, respcode, r
c280: 65 73 70 64 61 74 61 2c 20 26 74 6d 70 5f 72 65  espdata, &tmp_re
c290: 73 70 64 61 74 61 5f 6c 65 6e 29 3b 0a 0a 09 09  spdata_len);....
c2a0: 69 66 20 28 70 63 73 63 5f 67 65 74 72 65 73 70  if (pcsc_getresp
c2b0: 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50  _ret != CACKEY_P
c2c0: 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 43  CSC_S_OK) {....C
c2d0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
c2e0: 54 46 28 22 42 75 66 66 65 72 20 72 65 61 64 20  TF("Buffer read 
c2f0: 66 61 69 6c 65 64 21 20 20 52 65 74 75 72 6e 69  failed!  Returni
c300: 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b  ng in failure");
c310: 0a 0a 09 09 09 2f 2a 20 45 6e 64 20 53 6d 61 72  ...../* End Smar
c320: 74 63 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f  tcard Transactio
c330: 6e 20 2a 2f 0a 09 09 09 63 61 63 6b 65 79 5f 65  n */....cackey_e
c340: 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73  nd_transaction(s
c350: 6c 6f 74 29 3b 0a 0a 09 09 09 69 66 20 28 70 63  lot);.....if (pc
c360: 73 63 5f 67 65 74 72 65 73 70 5f 72 65 74 20 3d  sc_getresp_ret =
c370: 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  = CACKEY_PCSC_E_
c380: 52 45 54 52 59 29 20 7b 0a 09 09 09 09 72 65 74  RETRY) {.....ret
c390: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
c3a0: 45 5f 52 45 54 52 59 29 3b 0a 09 09 09 7d 0a 0a  E_RETRY);....}..
c3b0: 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
c3c0: 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29  _PCSC_E_GENERIC)
c3d0: 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 72 65 73  ;...}....if (res
c3e0: 70 64 61 74 61 5f 6c 65 6e 29 20 7b 0a 09 09 09  pdata_len) {....
c3f0: 2a 72 65 73 70 64 61 74 61 5f 6c 65 6e 20 2b 3d  *respdata_len +=
c400: 20 74 6d 70 5f 72 65 73 70 64 61 74 61 5f 6c 65   tmp_respdata_le
c410: 6e 3b 0a 09 09 7d 0a 0a 09 09 2f 2a 20 45 6e 64  n;...}..../* End
c420: 20 53 6d 61 72 74 63 61 72 64 20 54 72 61 6e 73   Smartcard Trans
c430: 61 63 74 69 6f 6e 20 2a 2f 0a 09 09 63 61 63 6b  action */...cack
c440: 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  ey_end_transacti
c450: 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 43 41 43  on(slot);....CAC
c460: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
c470: 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 73  ("Returning in s
c480: 75 63 63 65 73 73 20 28 62 75 66 66 65 72 20 72  uccess (buffer r
c490: 65 61 64 20 63 6f 6d 70 6c 65 74 65 29 22 29 3b  ead complete)");
c4a0: 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
c4b0: 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 09 7d 0a  _PCSC_S_OK);..}.
c4c0: 0a 09 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63 61  ../* End Smartca
c4d0: 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a  rd Transaction *
c4e0: 2f 0a 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72  /..cackey_end_tr
c4f0: 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b  ansaction(slot);
c500: 0a 0a 09 69 66 20 28 6d 61 6a 6f 72 5f 72 63 20  ...if (major_rc 
c510: 3d 3d 20 30 78 39 30 29 20 7b 0a 09 09 2f 2a 20  == 0x90) {.../* 
c520: 53 75 63 63 65 73 73 20 2a 2f 0a 09 09 43 41 43  Success */...CAC
c530: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
c540: 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 73  ("Returning in s
c550: 75 63 63 65 73 73 20 28 6d 61 6a 6f 72 5f 72 63  uccess (major_rc
c560: 20 3d 20 30 78 39 30 29 22 29 3b 0a 0a 09 09 72   = 0x90)");....r
c570: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
c580: 43 5f 53 5f 4f 4b 29 3b 0a 09 7d 0a 0a 0a 09 43  C_S_OK);..}....C
c590: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
c5a0: 54 46 28 22 41 50 44 55 20 52 65 74 75 72 6e 65  TF("APDU Returne
c5b0: 64 20 61 6e 20 65 72 72 6f 72 2c 20 72 65 74 75  d an error, retu
c5c0: 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65  rning in failure
c5d0: 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41 43  ");...return(CAC
c5e0: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52  KEY_PCSC_E_GENER
c5f0: 49 43 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 75  IC);.}..static u
c600: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 63 61  nsigned char *ca
c610: 63 6b 65 79 5f 72 65 61 64 5f 62 65 72 74 6c 76  ckey_read_bertlv
c620: 5f 74 61 67 28 75 6e 73 69 67 6e 65 64 20 63 68  _tag(unsigned ch
c630: 61 72 20 2a 62 75 66 66 65 72 2c 20 73 69 7a 65  ar *buffer, size
c640: 5f 74 20 2a 62 75 66 66 65 72 5f 6c 65 6e 5f 70  _t *buffer_len_p
c650: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
c660: 74 61 67 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  tag, unsigned ch
c670: 61 72 20 2a 6f 75 74 62 75 66 66 65 72 2c 20 73  ar *outbuffer, s
c680: 69 7a 65 5f 74 20 2a 6f 75 74 62 75 66 66 65 72  ize_t *outbuffer
c690: 5f 6c 65 6e 5f 70 29 20 7b 0a 09 75 6e 73 69 67  _len_p) {..unsig
c6a0: 6e 65 64 20 63 68 61 72 20 2a 62 75 66 66 65 72  ned char *buffer
c6b0: 5f 70 3b 0a 09 73 69 7a 65 5f 74 20 6f 75 74 62  _p;..size_t outb
c6c0: 75 66 66 65 72 5f 6c 65 6e 2c 20 62 75 66 66 65  uffer_len, buffe
c6d0: 72 5f 6c 65 6e 3b 0a 09 73 69 7a 65 5f 74 20 73  r_len;..size_t s
c6e0: 69 7a 65 3b 0a 09 69 6e 74 20 69 64 78 3b 0a 0a  ize;..int idx;..
c6f0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
c700: 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
c710: 0a 0a 09 69 66 20 28 62 75 66 66 65 72 5f 6c 65  ...if (buffer_le
c720: 6e 5f 70 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  n_p == NULL) {..
c730: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
c740: 49 4e 54 46 28 22 62 75 66 66 65 72 5f 6c 65 6e  INTF("buffer_len
c750: 5f 70 20 69 73 20 4e 55 4c 4c 2e 20 20 52 65 74  _p is NULL.  Ret
c760: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
c770: 65 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  e.");....return(
c780: 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  NULL);..}...if (
c790: 6f 75 74 62 75 66 66 65 72 5f 6c 65 6e 5f 70 20  outbuffer_len_p 
c7a0: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43  == NULL) {...CAC
c7b0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
c7c0: 28 22 6f 75 74 62 75 66 66 65 72 5f 6c 65 6e 5f  ("outbuffer_len_
c7d0: 70 20 69 73 20 4e 55 4c 4c 2e 20 20 52 65 74 75  p is NULL.  Retu
c7e0: 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65  rning in failure
c7f0: 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e  .");....return(N
c800: 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 62 75 66 66 65  ULL);..}...buffe
c810: 72 5f 6c 65 6e 20 3d 20 2a 6f 75 74 62 75 66 66  r_len = *outbuff
c820: 65 72 5f 6c 65 6e 5f 70 3b 0a 09 6f 75 74 62 75  er_len_p;..outbu
c830: 66 66 65 72 5f 6c 65 6e 20 3d 20 2a 6f 75 74 62  ffer_len = *outb
c840: 75 66 66 65 72 5f 6c 65 6e 5f 70 3b 0a 0a 09 69  uffer_len_p;...i
c850: 66 20 28 62 75 66 66 65 72 5f 6c 65 6e 20 3c 20  f (buffer_len < 
c860: 32 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  2) {...CACKEY_DE
c870: 42 55 47 5f 50 52 49 4e 54 46 28 22 62 75 66 66  BUG_PRINTF("buff
c880: 65 72 5f 6c 65 6e 20 69 73 20 6c 65 73 73 20 74  er_len is less t
c890: 68 61 6e 20 32 2c 20 73 6f 20 77 65 20 63 61 6e  han 2, so we can
c8a0: 27 74 20 72 65 61 64 20 61 6e 79 20 74 61 67 2e  't read any tag.
c8b0: 20 20 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 66    Returning in f
c8c0: 61 69 6c 75 72 65 2e 22 29 3b 0a 0a 09 09 72 65  ailure.");....re
c8d0: 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a  turn(NULL);..}..
c8e0: 09 62 75 66 66 65 72 5f 70 20 3d 20 62 75 66 66  .buffer_p = buff
c8f0: 65 72 3b 0a 09 69 66 20 28 62 75 66 66 65 72 5f  er;..if (buffer_
c900: 70 5b 30 5d 20 21 3d 20 74 61 67 29 20 7b 0a 09  p[0] != tag) {..
c910: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
c920: 49 4e 54 46 28 22 54 61 67 20 66 6f 75 6e 64 20  INTF("Tag found 
c930: 77 61 73 20 6e 6f 74 20 74 61 67 20 65 78 70 65  was not tag expe
c940: 63 74 65 64 2e 20 20 54 61 67 20 3d 20 25 30 32  cted.  Tag = %02
c950: 78 2c 20 45 78 70 65 63 74 65 64 20 3d 20 25 30  x, Expected = %0
c960: 32 78 2e 20 20 52 65 74 75 72 6e 69 6e 67 20 69  2x.  Returning i
c970: 6e 20 66 61 69 6c 75 72 65 2e 22 2c 20 28 75 6e  n failure.", (un
c980: 73 69 67 6e 65 64 20 69 6e 74 29 20 62 75 66 66  signed int) buff
c990: 65 72 5f 70 5b 30 5d 2c 20 74 61 67 29 3b 0a 0a  er_p[0], tag);..
c9a0: 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a  ..return(NULL);.
c9b0: 09 7d 0a 0a 09 62 75 66 66 65 72 5f 70 2b 2b 3b  .}...buffer_p++;
c9c0: 0a 09 62 75 66 66 65 72 5f 6c 65 6e 2d 2d 3b 0a  ..buffer_len--;.
c9d0: 0a 09 69 66 20 28 28 62 75 66 66 65 72 5f 70 5b  ..if ((buffer_p[
c9e0: 30 5d 20 26 20 30 78 38 30 29 20 3d 3d 20 30 78  0] & 0x80) == 0x
c9f0: 38 30 29 20 7b 0a 09 09 73 69 7a 65 20 3d 20 30  80) {...size = 0
ca00: 3b 0a 09 09 69 64 78 20 3d 20 28 62 75 66 66 65  ;...idx = (buffe
ca10: 72 5f 70 5b 30 5d 20 26 20 30 78 37 66 29 3b 0a  r_p[0] & 0x7f);.
ca20: 0a 09 09 69 66 20 28 69 64 78 20 3e 20 62 75 66  ...if (idx > buf
ca30: 66 65 72 5f 6c 65 6e 29 20 7b 0a 09 09 09 43 41  fer_len) {....CA
ca40: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
ca50: 46 28 22 4d 61 6c 66 6f 72 6d 65 64 20 42 45 52  F("Malformed BER
ca60: 20 76 61 6c 75 65 20 2d 2d 20 6e 6f 74 20 65 6e   value -- not en
ca70: 6f 75 67 68 20 62 79 74 65 73 20 61 76 61 69 6c  ough bytes avail
ca80: 61 62 6c 65 20 74 6f 20 72 65 61 64 20 6c 65 6e  able to read len
ca90: 67 74 68 20 28 69 64 78 20 3d 20 25 69 2c 20 62  gth (idx = %i, b
caa0: 75 66 66 65 72 5f 6c 65 6e 20 3d 20 25 6c 75 29  uffer_len = %lu)
cab0: 22 2c 20 69 64 78 2c 20 28 75 6e 73 69 67 6e 65  ", idx, (unsigne
cac0: 64 20 6c 6f 6e 67 29 20 62 75 66 66 65 72 5f 6c  d long) buffer_l
cad0: 65 6e 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28  en);.....return(
cae0: 4e 55 4c 4c 29 3b 0a 09 09 7d 0a 0a 09 09 66 6f  NULL);...}....fo
caf0: 72 20 28 3b 20 69 64 78 20 3e 20 30 3b 20 69 64  r (; idx > 0; id
cb00: 78 2d 2d 29 20 7b 0a 09 09 09 62 75 66 66 65 72  x--) {....buffer
cb10: 5f 70 2b 2b 3b 0a 09 09 09 62 75 66 66 65 72 5f  _p++;....buffer_
cb20: 6c 65 6e 2d 2d 3b 0a 0a 09 09 09 73 69 7a 65 20  len--;.....size 
cb30: 3c 3c 3d 20 38 3b 0a 09 09 09 73 69 7a 65 20 7c  <<= 8;....size |
cb40: 3d 20 62 75 66 66 65 72 5f 70 5b 30 5d 3b 0a 09  = buffer_p[0];..
cb50: 09 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 73  .}..} else {...s
cb60: 69 7a 65 20 3d 20 62 75 66 66 65 72 5f 70 5b 30  ize = buffer_p[0
cb70: 5d 3b 0a 09 7d 0a 0a 09 62 75 66 66 65 72 5f 70  ];..}...buffer_p
cb80: 2b 2b 3b 0a 09 62 75 66 66 65 72 5f 6c 65 6e 2d  ++;..buffer_len-
cb90: 2d 3b 0a 0a 09 69 66 20 28 73 69 7a 65 20 3e 20  -;...if (size > 
cba0: 6f 75 74 62 75 66 66 65 72 5f 6c 65 6e 29 20 7b  outbuffer_len) {
cbb0: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
cbc0: 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74  PRINTF("Unable t
cbd0: 6f 20 63 6f 70 79 20 76 61 6c 75 65 20 62 75 66  o copy value buf
cbe0: 66 65 72 20 74 6f 20 6f 75 74 62 75 66 66 65 72  fer to outbuffer
cbf0: 2c 20 6e 6f 74 20 65 6e 6f 75 67 68 20 72 6f 6f  , not enough roo
cc00: 6d 2e 20 20 56 61 6c 75 65 20 62 75 66 66 65 72  m.  Value buffer
cc10: 20 6c 65 6e 67 74 68 20 3d 20 25 6c 75 2c 20 6f   length = %lu, o
cc20: 75 74 20 62 75 66 66 65 72 20 6c 65 6e 67 74 68  ut buffer length
cc30: 20 3d 20 25 6c 75 22 2c 20 28 75 6e 73 69 67 6e   = %lu", (unsign
cc40: 65 64 20 6c 6f 6e 67 29 20 73 69 7a 65 2c 20 28  ed long) size, (
cc50: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 6f  unsigned long) o
cc60: 75 74 62 75 66 66 65 72 5f 6c 65 6e 29 3b 0a 0a  utbuffer_len);..
cc70: 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a  ..return(NULL);.
cc80: 09 7d 0a 0a 09 2a 6f 75 74 62 75 66 66 65 72 5f  .}...*outbuffer_
cc90: 6c 65 6e 5f 70 20 3d 20 73 69 7a 65 3b 0a 09 69  len_p = size;..i
cca0: 66 20 28 6f 75 74 62 75 66 66 65 72 29 20 7b 0a  f (outbuffer) {.
ccb0: 09 09 6d 65 6d 63 70 79 28 6f 75 74 62 75 66 66  ..memcpy(outbuff
ccc0: 65 72 2c 20 62 75 66 66 65 72 5f 70 2c 20 73 69  er, buffer_p, si
ccd0: 7a 65 29 3b 0a 09 09 62 75 66 66 65 72 5f 70 20  ze);...buffer_p 
cce0: 2b 3d 20 73 69 7a 65 3b 0a 09 09 62 75 66 66 65  += size;...buffe
ccf0: 72 5f 6c 65 6e 20 2d 3d 20 73 69 7a 65 3b 0a 0a  r_len -= size;..
cd00: 09 09 2a 62 75 66 66 65 72 5f 6c 65 6e 5f 70 20  ..*buffer_len_p 
cd10: 3d 20 62 75 66 66 65 72 5f 6c 65 6e 3b 0a 0a 09  = buffer_len;...
cd20: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
cd30: 49 4e 54 42 55 46 28 22 42 45 52 2d 54 4c 56 20  INTBUF("BER-TLV 
cd40: 72 65 73 75 6c 74 73 3a 22 2c 20 6f 75 74 62 75  results:", outbu
cd50: 66 66 65 72 2c 20 73 69 7a 65 29 3b 0a 09 7d 20  ffer, size);..} 
cd60: 65 6c 73 65 20 7b 0a 09 09 6d 65 6d 6d 6f 76 65  else {...memmove
cd70: 28 62 75 66 66 65 72 2c 20 62 75 66 66 65 72 5f  (buffer, buffer_
cd80: 70 2c 20 73 69 7a 65 29 3b 0a 09 09 62 75 66 66  p, size);...buff
cd90: 65 72 5f 70 20 3d 20 62 75 66 66 65 72 3b 0a 0a  er_p = buffer;..
cda0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
cdb0: 52 49 4e 54 42 55 46 28 22 42 45 52 2d 54 4c 56  RINTBUF("BER-TLV
cdc0: 20 72 65 73 75 6c 74 73 3a 22 2c 20 62 75 66 66   results:", buff
cdd0: 65 72 2c 20 73 69 7a 65 29 3b 0a 09 7d 0a 0a 09  er, size);..}...
cde0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
cdf0: 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 69  NTF("Returning i
ce00: 6e 20 73 75 63 63 65 73 73 2e 20 20 53 69 7a 65  n success.  Size
ce10: 20 6f 66 20 63 6f 6e 74 65 6e 74 73 20 66 6f 72   of contents for
ce20: 20 74 61 67 20 25 30 32 78 20 69 73 20 25 6c 75   tag %02x is %lu
ce30: 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74  ", (unsigned int
ce40: 29 20 74 61 67 2c 20 28 75 6e 73 69 67 6e 65 64  ) tag, (unsigned
ce50: 20 6c 6f 6e 67 29 20 73 69 7a 65 29 3b 0a 0a 09   long) size);...
ce60: 72 65 74 75 72 6e 28 62 75 66 66 65 72 5f 70 29  return(buffer_p)
ce70: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f  ;.}../*. * SYNPO
ce80: 53 49 53 0a 20 2a 20 20 20 20 20 73 73 69 7a 65  SIS. *     ssize
ce90: 5f 74 20 63 61 63 6b 65 79 5f 67 65 74 5f 64 61  _t cackey_get_da
cea0: 74 61 28 73 74 72 75 63 74 20 63 61 63 6b 65 79  ta(struct cackey
ceb0: 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73  _slot *slot, uns
cec0: 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 66  igned char *buff
ced0: 65 72 2c 20 73 69 7a 65 5f 74 20 62 75 66 66 65  er, size_t buffe
cee0: 72 5f 6c 65 6e 2c 20 75 6e 73 69 67 6e 65 64 20  r_len, unsigned 
cef0: 63 68 61 72 20 6f 69 64 5b 33 5d 29 3b 0a 20 2a  char oid[3]);. *
cf00: 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a  . * ARGUMENTS. *
cf10: 20 20 20 20 20 73 74 72 75 63 74 20 63 61 63 6b       struct cack
cf20: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a  ey_slot *slot. *
cf30: 20 20 20 20 20 20 20 20 20 53 6c 6f 74 20 74 6f           Slot to
cf40: 20 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74   send commands t
cf50: 6f 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69  o. *. *     unsi
cf60: 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 66 65  gned char *buffe
cf70: 72 0a 20 2a 20 20 20 20 20 20 20 20 20 5b 4f 55  r. *         [OU
cf80: 54 5d 20 42 75 66 66 65 72 0a 20 2a 0a 20 2a 20  T] Buffer. *. * 
cf90: 20 20 20 20 73 69 7a 65 5f 74 20 62 75 66 66 65      size_t buffe
cfa0: 72 5f 6c 65 6e 0a 20 2a 20 20 20 20 20 20 20 20  r_len. *        
cfb0: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
cfc0: 20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 72   to attempt to r
cfd0: 65 61 64 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e  ead. *. *     un
cfe0: 73 69 67 6e 65 64 20 63 68 61 72 20 6f 69 64 5b  signed char oid[
cff0: 33 5d 0a 20 2a 20 20 20 20 20 20 20 20 20 33 2d  3]. *         3-
d000: 62 79 74 65 20 4f 49 44 20 74 6f 20 72 65 61 64  byte OID to read
d010: 0a 20 2a 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e  . *. *. * RETURN
d020: 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 54 68   VALUE. *     Th
d030: 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
d040: 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  rns the number o
d050: 66 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79  f bytes actually
d060: 20 72 65 61 64 2c 20 6f 72 20 2d 31 20 6f 6e 20   read, or -1 on 
d070: 65 72 72 6f 72 2e 0a 20 2a 0a 20 2a 20 4e 4f 54  error.. *. * NOT
d080: 45 53 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20  ES. *     None. 
d090: 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 73 73 69  *. */.static ssi
d0a0: 7a 65 5f 74 20 63 61 63 6b 65 79 5f 67 65 74 5f  ze_t cackey_get_
d0b0: 64 61 74 61 28 73 74 72 75 63 74 20 63 61 63 6b  data(struct cack
d0c0: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75  ey_slot *slot, u
d0d0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75  nsigned char *bu
d0e0: 66 66 65 72 2c 20 73 69 7a 65 5f 74 20 62 75 66  ffer, size_t buf
d0f0: 66 65 72 5f 6c 65 6e 2c 20 75 6e 73 69 67 6e 65  fer_len, unsigne
d100: 64 20 63 68 61 72 20 6f 69 64 5b 33 5d 29 20 7b  d char oid[3]) {
d110: 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  ..unsigned char 
d120: 63 6d 64 5b 5d 20 3d 20 7b 30 78 35 43 2c 20 30  cmd[] = {0x5C, 0
d130: 78 30 33 2c 20 30 78 30 30 2c 20 30 78 30 30 2c  x03, 0x00, 0x00,
d140: 20 30 78 30 30 7d 3b 0a 09 75 6e 73 69 67 6e 65   0x00};..unsigne
d150: 64 20 63 68 61 72 20 2a 62 75 66 66 65 72 5f 70  d char *buffer_p
d160: 3b 0a 09 73 69 7a 65 5f 74 20 69 6e 69 74 5f 62  ;..size_t init_b
d170: 75 66 66 65 72 5f 6c 65 6e 2c 20 73 69 7a 65 3b  uffer_len, size;
d180: 0a 09 75 69 6e 74 31 36 5f 74 20 72 65 73 70 63  ..uint16_t respc
d190: 6f 64 65 3b 0a 09 69 6e 74 20 73 65 6e 64 5f 72  ode;..int send_r
d1a0: 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  et;...CACKEY_DEB
d1b0: 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
d1c0: 64 2e 22 29 3b 0a 0a 09 69 6e 69 74 5f 62 75 66  d.");...init_buf
d1d0: 66 65 72 5f 6c 65 6e 20 3d 20 62 75 66 66 65 72  fer_len = buffer
d1e0: 5f 6c 65 6e 3b 0a 0a 09 63 6d 64 5b 32 5d 20 3d  _len;...cmd[2] =
d1f0: 20 6f 69 64 5b 30 5d 3b 0a 09 63 6d 64 5b 33 5d   oid[0];..cmd[3]
d200: 20 3d 20 6f 69 64 5b 31 5d 3b 0a 09 63 6d 64 5b   = oid[1];..cmd[
d210: 34 5d 20 3d 20 6f 69 64 5b 32 5d 3b 0a 0a 09 2f  4] = oid[2];.../
d220: 2a 20 32 35 36 20 74 6f 20 69 6e 64 69 63 61 74  * 256 to indicat
d230: 65 20 74 68 65 20 6c 61 72 67 65 73 74 20 6d 65  e the largest me
d240: 73 73 61 67 65 20 73 69 7a 65 20 2d 2d 20 6e 6f  ssage size -- no
d250: 74 20 63 6c 65 61 72 20 69 66 20 74 68 69 73 20  t clear if this 
d260: 77 69 6c 6c 20 77 6f 72 6b 20 77 69 74 68 20 61  will work with a
d270: 6c 6c 20 6d 65 73 73 61 67 65 73 20 2a 2f 0a 09  ll messages */..
d280: 73 65 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b 65  send_ret = cacke
d290: 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f 74  y_send_apdu(slot
d2a0: 2c 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 49 53  , GSCIS_CLASS_IS
d2b0: 4f 37 38 31 36 2c 20 4e 49 53 54 53 50 38 30 30  O7816, NISTSP800
d2c0: 5f 37 33 5f 33 5f 49 4e 53 54 52 5f 47 45 54 5f  _73_3_INSTR_GET_
d2d0: 44 41 54 41 2c 20 30 78 33 46 2c 20 30 78 46 46  DATA, 0x3F, 0xFF
d2e0: 2c 20 73 69 7a 65 6f 66 28 63 6d 64 29 2c 20 63  , sizeof(cmd), c
d2f0: 6d 64 2c 20 32 35 36 2c 20 26 72 65 73 70 63 6f  md, 256, &respco
d300: 64 65 2c 20 62 75 66 66 65 72 2c 20 26 62 75 66  de, buffer, &buf
d310: 66 65 72 5f 6c 65 6e 29 3b 0a 0a 09 69 66 20 28  fer_len);...if (
d320: 73 65 6e 64 5f 72 65 74 20 3d 3d 20 43 41 43 4b  send_ret == CACK
d330: 45 59 5f 50 43 53 43 5f 45 5f 52 45 54 52 59 29  EY_PCSC_E_RETRY)
d340: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
d350: 47 5f 50 52 49 4e 54 46 28 22 41 44 50 55 20 53  G_PRINTF("ADPU S
d360: 65 6e 64 69 6e 67 20 66 61 69 6c 65 64 2c 20 72  ending failed, r
d370: 65 74 72 79 69 6e 67 20 72 65 61 64 20 62 75 66  etrying read buf
d380: 66 65 72 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  fer");....return
d390: 28 63 61 63 6b 65 79 5f 67 65 74 5f 64 61 74 61  (cackey_get_data
d3a0: 28 73 6c 6f 74 2c 20 62 75 66 66 65 72 2c 20 69  (slot, buffer, i
d3b0: 6e 69 74 5f 62 75 66 66 65 72 5f 6c 65 6e 2c 20  nit_buffer_len, 
d3c0: 6f 69 64 29 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  oid));..}...if (
d3d0: 73 65 6e 64 5f 72 65 74 20 21 3d 20 43 41 43 4b  send_ret != CACK
d3e0: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a  EY_PCSC_S_OK) {.
d3f0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
d400: 52 49 4e 54 46 28 22 63 61 63 6b 65 79 5f 73 65  RINTF("cackey_se
d410: 6e 64 5f 61 70 64 75 28 29 20 66 61 69 6c 65 64  nd_apdu() failed
d420: 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66  , returning in f
d430: 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74  ailure");....ret
d440: 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 23 69 66  urn(-1);..}..#if
d450: 64 65 66 20 43 41 43 4b 45 59 5f 50 41 52 41 4e  def CACKEY_PARAN
d460: 4f 49 44 0a 23 20 20 69 66 64 65 66 20 5f 50 4f  OID.#  ifdef _PO
d470: 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58 0a 09 69  SIX_SSIZE_MAX..i
d480: 66 20 28 62 75 66 66 65 72 5f 6c 65 6e 20 3e 20  f (buffer_len > 
d490: 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58  _POSIX_SSIZE_MAX
d4a0: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
d4b0: 55 47 5f 50 52 49 4e 54 46 28 22 52 65 61 64 20  UG_PRINTF("Read 
d4c0: 62 79 74 65 73 20 28 62 75 66 66 65 72 5f 6c 65  bytes (buffer_le
d4d0: 6e 29 20 65 78 63 65 65 64 73 20 6d 61 78 69 6d  n) exceeds maxim
d4e0: 75 6d 20 76 61 6c 75 65 2c 20 72 65 74 75 72 6e  um value, return
d4f0: 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 2e 20  ing in failure. 
d500: 28 6d 61 78 20 3d 20 25 6c 69 2c 20 62 75 66 66  (max = %li, buff
d510: 65 72 5f 6c 65 6e 20 3d 20 25 6c 75 29 22 2c 20  er_len = %lu)", 
d520: 28 6c 6f 6e 67 29 20 5f 50 4f 53 49 58 5f 53 53  (long) _POSIX_SS
d530: 49 5a 45 5f 4d 41 58 2c 20 28 75 6e 73 69 67 6e  IZE_MAX, (unsign
d540: 65 64 20 6c 6f 6e 67 29 20 62 75 66 66 65 72 5f  ed long) buffer_
d550: 6c 65 6e 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  len);....return(
d560: 2d 31 29 3b 0a 09 7d 0a 23 20 20 65 6e 64 69 66  -1);..}.#  endif
d570: 0a 23 65 6e 64 69 66 0a 0a 09 69 66 20 28 62 75  .#endif...if (bu
d580: 66 66 65 72 5f 6c 65 6e 20 3c 20 32 29 20 7b 0a  ffer_len < 2) {.
d590: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
d5a0: 52 49 4e 54 46 28 22 41 50 44 55 20 47 45 54 20  RINTF("APDU GET 
d5b0: 44 41 54 41 20 72 65 74 75 72 6e 65 64 20 25 6c  DATA returned %l
d5c0: 75 20 62 79 74 65 73 2c 20 77 68 69 63 68 20 69  u bytes, which i
d5d0: 73 20 74 6f 6f 20 73 68 6f 72 74 20 66 6f 72 20  s too short for 
d5e0: 61 20 42 45 52 2d 54 4c 56 20 72 65 73 70 6f 6e  a BER-TLV respon
d5f0: 73 65 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  se", (unsigned l
d600: 6f 6e 67 29 20 62 75 66 66 65 72 5f 6c 65 6e 29  ong) buffer_len)
d610: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b  ;....return(-1);
d620: 0a 09 7d 0a 0a 09 73 69 7a 65 20 3d 20 62 75 66  ..}...size = buf
d630: 66 65 72 5f 6c 65 6e 3b 0a 09 62 75 66 66 65 72  fer_len;..buffer
d640: 5f 70 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64  _p = cackey_read
d650: 5f 62 65 72 74 6c 76 5f 74 61 67 28 62 75 66 66  _bertlv_tag(buff
d660: 65 72 2c 20 26 62 75 66 66 65 72 5f 6c 65 6e 2c  er, &buffer_len,
d670: 20 30 78 35 33 2c 20 4e 55 4c 4c 2c 20 26 73 69   0x53, NULL, &si
d680: 7a 65 29 3b 0a 0a 09 69 66 20 28 62 75 66 66 65  ze);...if (buffe
d690: 72 5f 70 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  r_p == NULL) {..
d6a0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
d6b0: 49 4e 54 46 28 22 54 61 67 20 64 65 63 6f 64 69  INTF("Tag decodi
d6c0: 6e 67 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72  ng failed, retur
d6d0: 6e 69 6e 67 20 69 6e 20 65 72 72 6f 72 2e 22 29  ning in error.")
d6e0: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b  ;....return(-1);
d6f0: 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
d700: 55 47 5f 50 52 49 4e 54 42 55 46 28 22 47 45 54  UG_PRINTBUF("GET
d710: 20 44 41 54 41 20 72 65 73 75 6c 74 22 2c 20 62   DATA result", b
d720: 75 66 66 65 72 2c 20 73 69 7a 65 29 3b 0a 0a 09  uffer, size);...
d730: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
d740: 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 69  NTF("Returning i
d750: 6e 20 73 75 63 63 65 73 73 2c 20 72 65 61 64 20  n success, read 
d760: 25 6c 75 20 62 79 74 65 73 22 2c 20 28 75 6e 73  %lu bytes", (uns
d770: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69 7a 65  igned long) size
d780: 29 3b 0a 0a 09 72 65 74 75 72 6e 28 73 69 7a 65  );...return(size
d790: 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50  );.}../*. * SYNP
d7a0: 4f 53 49 53 0a 20 2a 20 20 20 20 20 73 73 69 7a  OSIS. *     ssiz
d7b0: 65 5f 74 20 63 61 63 6b 65 79 5f 72 65 61 64 5f  e_t cackey_read_
d7c0: 62 75 66 66 65 72 28 73 74 72 75 63 74 20 63 61  buffer(struct ca
d7d0: 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c  ckey_slot *slot,
d7e0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
d7f0: 62 75 66 66 65 72 2c 20 73 69 7a 65 5f 74 20 63  buffer, size_t c
d800: 6f 75 6e 74 2c 20 75 6e 73 69 67 6e 65 64 20 63  ount, unsigned c
d810: 68 61 72 20 74 5f 6f 72 5f 76 2c 20 73 69 7a 65  har t_or_v, size
d820: 5f 74 20 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65  _t initial_offse
d830: 74 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45  t);. *. * ARGUME
d840: 4e 54 53 0a 20 2a 20 20 20 20 20 73 74 72 75 63  NTS. *     struc
d850: 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73  t cackey_slot *s
d860: 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20 53  lot. *         S
d870: 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d 6d  lot to send comm
d880: 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 20 20  ands to. *. *   
d890: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
d8a0: 2a 62 75 66 66 65 72 0a 20 2a 20 20 20 20 20 20  *buffer. *      
d8b0: 20 20 20 5b 4f 55 54 5d 20 42 75 66 66 65 72 0a     [OUT] Buffer.
d8c0: 20 2a 0a 20 2a 20 20 20 20 20 73 69 7a 65 5f 74   *. *     size_t
d8d0: 20 63 6f 75 6e 74 0a 20 2a 20 20 20 20 20 20 20   count. *       
d8e0: 20 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65    Number of byte
d8f0: 73 20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f 20  s to attempt to 
d900: 72 65 61 64 0a 20 2a 0a 20 2a 20 20 20 20 20 75  read. *. *     u
d910: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 74 5f 6f  nsigned char t_o
d920: 72 5f 76 0a 20 2a 20 20 20 20 20 20 20 20 20 53  r_v. *         S
d930: 65 6c 65 63 74 20 74 68 65 20 54 2d 62 75 66 66  elect the T-buff
d940: 65 72 20 28 30 31 29 20 6f 72 20 56 2d 62 75 66  er (01) or V-buf
d950: 66 65 72 20 28 30 32 29 20 74 6f 20 72 65 61 64  fer (02) to read
d960: 20 66 72 6f 6d 2e 20 20 0a 20 2a 0a 20 2a 20 20   from.  . *. *  
d970: 20 20 20 73 69 7a 65 5f 74 20 69 6e 69 74 69 61     size_t initia
d980: 6c 5f 6f 66 66 73 65 74 0a 20 2a 20 20 20 20 20  l_offset. *     
d990: 20 20 20 20 53 70 65 63 69 66 79 20 74 68 65 20      Specify the 
d9a0: 6f 66 66 73 65 74 20 74 6f 20 62 65 67 69 6e 20  offset to begin 
d9b0: 74 68 65 20 72 65 61 64 20 66 72 6f 6d 0a 20 2a  the read from. *
d9c0: 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41  . *. * RETURN VA
d9d0: 4c 55 45 0a 20 2a 20 20 20 20 20 54 68 69 73 20  LUE. *     This 
d9e0: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
d9f0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
da00: 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20 72 65  ytes actually re
da10: 61 64 2c 20 6f 72 20 2d 31 20 6f 6e 20 65 72 72  ad, or -1 on err
da20: 6f 72 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a  or.. *. * NOTES.
da30: 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20   *     None. *. 
da40: 2a 2f 0a 73 74 61 74 69 63 20 73 73 69 7a 65 5f  */.static ssize_
da50: 74 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 62 75  t cackey_read_bu
da60: 66 66 65 72 28 73 74 72 75 63 74 20 63 61 63 6b  ffer(struct cack
da70: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75  ey_slot *slot, u
da80: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75  nsigned char *bu
da90: 66 66 65 72 2c 20 73 69 7a 65 5f 74 20 63 6f 75  ffer, size_t cou
daa0: 6e 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nt, unsigned cha
dab0: 72 20 74 5f 6f 72 5f 76 2c 20 73 69 7a 65 5f 74  r t_or_v, size_t
dac0: 20 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65 74 29   initial_offset)
dad0: 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61   {..unsigned cha
dae0: 72 20 2a 69 6e 69 74 5f 62 75 66 66 65 72 3b 0a  r *init_buffer;.
daf0: 09 73 69 7a 65 5f 74 20 69 6e 69 74 5f 63 6f 75  .size_t init_cou
db00: 6e 74 3b 0a 09 73 69 7a 65 5f 74 20 69 6e 69 74  nt;..size_t init
db10: 5f 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65 74 3b  _initial_offset;
db20: 0a 0a 09 73 69 7a 65 5f 74 20 6f 66 66 73 65 74  ...size_t offset
db30: 20 3d 20 30 2c 20 6d 61 78 5f 6f 66 66 73 65 74   = 0, max_offset
db40: 2c 20 6d 61 78 5f 63 6f 75 6e 74 3b 0a 09 75 6e  , max_count;..un
db50: 73 69 67 6e 65 64 20 63 68 61 72 20 63 6d 64 5b  signed char cmd[
db60: 32 5d 3b 0a 09 75 69 6e 74 31 36 5f 74 20 72 65  2];..uint16_t re
db70: 73 70 63 6f 64 65 3b 0a 09 69 6e 74 20 73 65 6e  spcode;..int sen
db80: 64 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f  d_ret;...CACKEY_
db90: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
dba0: 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 6e 69 74 5f  lled.");...init_
dbb0: 62 75 66 66 65 72 20 3d 20 62 75 66 66 65 72 3b  buffer = buffer;
dbc0: 0a 09 69 6e 69 74 5f 63 6f 75 6e 74 20 3d 20 63  ..init_count = c
dbd0: 6f 75 6e 74 3b 0a 09 69 6e 69 74 5f 69 6e 69 74  ount;..init_init
dbe0: 69 61 6c 5f 6f 66 66 73 65 74 20 3d 20 69 6e 69  ial_offset = ini
dbf0: 74 69 61 6c 5f 6f 66 66 73 65 74 3b 0a 0a 09 6d  tial_offset;...m
dc00: 61 78 5f 6f 66 66 73 65 74 20 3d 20 63 6f 75 6e  ax_offset = coun
dc10: 74 3b 0a 09 6d 61 78 5f 63 6f 75 6e 74 20 3d 20  t;..max_count = 
dc20: 43 41 43 4b 45 59 5f 41 50 44 55 5f 4d 54 55 3b  CACKEY_APDU_MTU;
dc30: 0a 0a 09 69 66 20 28 74 5f 6f 72 5f 76 20 21 3d  ...if (t_or_v !=
dc40: 20 31 20 26 26 20 74 5f 6f 72 5f 76 20 21 3d 20   1 && t_or_v != 
dc50: 32 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  2) {...CACKEY_DE
dc60: 42 55 47 5f 50 52 49 4e 54 46 28 22 49 6e 76 61  BUG_PRINTF("Inva
dc70: 6c 69 64 20 54 20 6f 72 20 56 20 70 61 72 61 6d  lid T or V param
dc80: 65 74 65 72 20 73 70 65 63 69 66 69 65 64 2c 20  eter specified, 
dc90: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  returning in fai
dca0: 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72  lure");....retur
dcb0: 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 63 6d 64 5b  n(-1);..}...cmd[
dcc0: 30 5d 20 3d 20 74 5f 6f 72 5f 76 3b 0a 0a 09 77  0] = t_or_v;...w
dcd0: 68 69 6c 65 20 28 31 29 20 7b 0a 09 09 69 66 20  hile (1) {...if 
dce0: 28 6f 66 66 73 65 74 20 3e 3d 20 6d 61 78 5f 6f  (offset >= max_o
dcf0: 66 66 73 65 74 29 20 7b 0a 09 09 09 43 41 43 4b  ffset) {....CACK
dd00: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
dd10: 22 42 75 66 66 65 72 20 74 6f 6f 20 73 6d 61 6c  "Buffer too smal
dd20: 6c 2c 20 72 65 74 75 72 6e 69 6e 67 20 77 68 61  l, returning wha
dd30: 74 20 77 65 20 67 6f 74 2e 2e 2e 22 29 3b 0a 0a  t we got...");..
dd40: 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09  ...break;...}...
dd50: 09 63 6f 75 6e 74 20 3d 20 6d 61 78 5f 6f 66 66  .count = max_off
dd60: 73 65 74 20 2d 20 6f 66 66 73 65 74 3b 0a 09 09  set - offset;...
dd70: 69 66 20 28 63 6f 75 6e 74 20 3e 20 6d 61 78 5f  if (count > max_
dd80: 63 6f 75 6e 74 29 20 7b 0a 09 09 09 63 6f 75 6e  count) {....coun
dd90: 74 20 3d 20 6d 61 78 5f 63 6f 75 6e 74 3b 0a 09  t = max_count;..
dda0: 09 7d 0a 0a 09 09 63 6d 64 5b 31 5d 20 3d 20 63  .}....cmd[1] = c
ddb0: 6f 75 6e 74 3b 0a 0a 09 09 73 65 6e 64 5f 72 65  ount;....send_re
ddc0: 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f  t = cackey_send_
ddd0: 61 70 64 75 28 73 6c 6f 74 2c 20 47 53 43 49 53  apdu(slot, GSCIS
dde0: 5f 43 4c 41 53 53 5f 47 4c 4f 42 41 4c 5f 50 4c  _CLASS_GLOBAL_PL
ddf0: 41 54 46 4f 52 4d 2c 20 47 53 43 49 53 5f 49 4e  ATFORM, GSCIS_IN
de00: 53 54 52 5f 52 45 41 44 5f 42 55 46 46 45 52 2c  STR_READ_BUFFER,
de10: 20 28 28 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65   ((initial_offse
de20: 74 20 2b 20 6f 66 66 73 65 74 29 20 3e 3e 20 38  t + offset) >> 8
de30: 29 20 26 20 30 78 66 66 2c 20 28 69 6e 69 74 69  ) & 0xff, (initi
de40: 61 6c 5f 6f 66 66 73 65 74 20 2b 20 6f 66 66 73  al_offset + offs
de50: 65 74 29 20 26 20 30 78 66 66 2c 20 73 69 7a 65  et) & 0xff, size
de60: 6f 66 28 63 6d 64 29 2c 20 63 6d 64 2c 20 30 78  of(cmd), cmd, 0x
de70: 30 30 2c 20 26 72 65 73 70 63 6f 64 65 2c 20 62  00, &respcode, b
de80: 75 66 66 65 72 20 2b 20 6f 66 66 73 65 74 2c 20  uffer + offset, 
de90: 26 63 6f 75 6e 74 29 3b 0a 0a 09 09 69 66 20 28  &count);....if (
dea0: 73 65 6e 64 5f 72 65 74 20 3d 3d 20 43 41 43 4b  send_ret == CACK
deb0: 45 59 5f 50 43 53 43 5f 45 5f 52 45 54 52 59 29  EY_PCSC_E_RETRY)
dec0: 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
ded0: 55 47 5f 50 52 49 4e 54 46 28 22 41 44 50 55 20  UG_PRINTF("ADPU 
dee0: 53 65 6e 64 69 6e 67 20 66 61 69 6c 65 64 2c 20  Sending failed, 
def0: 72 65 74 72 79 69 6e 67 20 72 65 61 64 20 62 75  retrying read bu
df00: 66 66 65 72 22 29 3b 0a 0a 09 09 09 72 65 74 75  ffer");.....retu
df10: 72 6e 28 63 61 63 6b 65 79 5f 72 65 61 64 5f 62  rn(cackey_read_b
df20: 75 66 66 65 72 28 73 6c 6f 74 2c 20 69 6e 69 74  uffer(slot, init
df30: 5f 62 75 66 66 65 72 2c 20 69 6e 69 74 5f 63 6f  _buffer, init_co
df40: 75 6e 74 2c 20 74 5f 6f 72 5f 76 2c 20 69 6e 69  unt, t_or_v, ini
df50: 74 5f 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65 74  t_initial_offset
df60: 29 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 73  ));...}....if (s
df70: 65 6e 64 5f 72 65 74 20 21 3d 20 43 41 43 4b 45  end_ret != CACKE
df80: 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09  Y_PCSC_S_OK) {..
df90: 09 09 69 66 20 28 72 65 73 70 63 6f 64 65 20 3d  ..if (respcode =
dfa0: 3d 20 30 78 36 41 38 36 29 20 7b 0a 09 09 09 09  = 0x6A86) {.....
dfb0: 69 66 20 28 6d 61 78 5f 63 6f 75 6e 74 20 3d 3d  if (max_count ==
dfc0: 20 31 29 20 7b 0a 09 09 09 09 09 62 72 65 61 6b   1) {......break
dfd0: 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 6d 61 78  ;.....}......max
dfe0: 5f 63 6f 75 6e 74 20 3d 20 6d 61 78 5f 63 6f 75  _count = max_cou
dff0: 6e 74 20 2f 20 32 3b 0a 0a 09 09 09 09 63 6f 6e  nt / 2;......con
e000: 74 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a 09 09 09  tinue;....}.....
e010: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
e020: 4e 54 46 28 22 63 61 63 6b 65 79 5f 73 65 6e 64  NTF("cackey_send
e030: 5f 61 70 64 75 28 29 20 66 61 69 6c 65 64 2c 20  _apdu() failed, 
e040: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  returning in fai
e050: 6c 75 72 65 22 29 3b 0a 0a 09 09 09 72 65 74 75  lure");.....retu
e060: 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09 09 6f  rn(-1);...}....o
e070: 66 66 73 65 74 20 2b 3d 20 63 6f 75 6e 74 3b 0a  ffset += count;.
e080: 0a 09 09 69 66 20 28 63 6f 75 6e 74 20 3c 20 6d  ...if (count < m
e090: 61 78 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 09 43  ax_count) {....C
e0a0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
e0b0: 54 46 28 22 53 68 6f 72 74 20 72 65 61 64 20 2d  TF("Short read -
e0c0: 2d 20 63 6f 75 6e 74 20 3d 20 25 69 2c 20 63 6d  - count = %i, cm
e0d0: 64 5b 31 5d 20 3d 20 25 69 22 2c 20 28 69 6e 74  d[1] = %i", (int
e0e0: 29 20 63 6f 75 6e 74 2c 20 28 69 6e 74 29 20 63  ) count, (int) c
e0f0: 6d 64 5b 31 5d 29 3b 0a 0a 09 09 09 62 72 65 61  md[1]);.....brea
e100: 6b 3b 0a 09 09 7d 0a 09 7d 0a 0a 23 69 66 64 65  k;...}..}..#ifde
e110: 66 20 43 41 43 4b 45 59 5f 50 41 52 41 4e 4f 49  f CACKEY_PARANOI
e120: 44 0a 23 20 20 69 66 64 65 66 20 5f 50 4f 53 49  D.#  ifdef _POSI
e130: 58 5f 53 53 49 5a 45 5f 4d 41 58 0a 09 69 66 20  X_SSIZE_MAX..if 
e140: 28 6f 66 66 73 65 74 20 3e 20 5f 50 4f 53 49 58  (offset > _POSIX
e150: 5f 53 53 49 5a 45 5f 4d 41 58 29 20 7b 0a 09 09  _SSIZE_MAX) {...
e160: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
e170: 4e 54 46 28 22 4f 66 66 73 65 74 20 65 78 63 65  NTF("Offset exce
e180: 65 64 73 20 6d 61 78 69 6d 75 6d 20 76 61 6c 75  eds maximum valu
e190: 65 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20  e, returning in 
e1a0: 66 61 69 6c 75 72 65 2e 20 28 6d 61 78 20 3d 20  failure. (max = 
e1b0: 25 6c 69 2c 20 6f 66 66 73 65 74 20 3d 20 25 6c  %li, offset = %l
e1c0: 75 29 22 2c 20 28 6c 6f 6e 67 29 20 5f 50 4f 53  u)", (long) _POS
e1d0: 49 58 5f 53 53 49 5a 45 5f 4d 41 58 2c 20 28 75  IX_SSIZE_MAX, (u
e1e0: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 6f 66  nsigned long) of
e1f0: 66 73 65 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e  fset);....return
e200: 28 2d 31 29 3b 0a 09 7d 0a 23 20 20 65 6e 64 69  (-1);..}.#  endi
e210: 66 0a 23 65 6e 64 69 66 0a 0a 09 43 41 43 4b 45  f.#endif...CACKE
e220: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
e230: 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 73 75 63  Returning in suc
e240: 63 65 73 73 2c 20 72 65 61 64 20 25 6c 75 20 62  cess, read %lu b
e250: 79 74 65 73 22 2c 20 28 75 6e 73 69 67 6e 65 64  ytes", (unsigned
e260: 20 6c 6f 6e 67 29 20 6f 66 66 73 65 74 29 3b 0a   long) offset);.
e270: 0a 09 72 65 74 75 72 6e 28 6f 66 66 73 65 74 29  ..return(offset)
e280: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f  ;.}../*. * SYNPO
e290: 53 49 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65  SIS. *     cacke
e2a0: 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 73 65 6c  y_ret cackey_sel
e2b0: 65 63 74 5f 61 70 70 6c 65 74 28 73 74 72 75 63  ect_applet(struc
e2c0: 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73  t cackey_slot *s
e2d0: 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  lot, unsigned ch
e2e0: 61 72 20 2a 61 69 64 2c 20 73 69 7a 65 5f 74 20  ar *aid, size_t 
e2f0: 61 69 64 5f 6c 65 6e 29 3b 0a 20 2a 0a 20 2a 20  aid_len);. *. * 
e300: 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20  ARGUMENTS. *    
e310: 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73   struct cackey_s
e320: 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20  lot *slot. *    
e330: 20 20 20 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e       Slot to sen
e340: 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a  d commands to. *
e350: 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64  . *     unsigned
e360: 20 63 68 61 72 20 2a 61 69 64 0a 20 2a 20 20 20   char *aid. *   
e370: 20 20 20 20 20 20 42 75 66 66 65 72 20 63 6f 6e        Buffer con
e380: 74 61 69 6e 69 6e 67 20 41 70 70 6c 65 74 20 49  taining Applet I
e390: 44 20 74 6f 20 73 65 6c 65 63 74 0a 20 2a 0a 20  D to select. *. 
e3a0: 2a 20 20 20 20 20 73 69 7a 65 5f 74 20 61 69 64  *     size_t aid
e3b0: 5f 6c 65 6e 0a 20 2a 20 20 20 20 20 20 20 20 20  _len. *         
e3c0: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
e3d0: 69 6e 20 74 68 65 20 22 61 69 64 22 20 28 41 70  in the "aid" (Ap
e3e0: 70 6c 65 74 20 49 44 29 20 70 61 72 61 6d 65 74  plet ID) paramet
e3f0: 65 72 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20  er. *. * RETURN 
e400: 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 43 41 43  VALUE. *     CAC
e410: 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20  KEY_PCSC_S_OK   
e420: 20 20 20 20 20 20 4f 6e 20 73 75 63 63 65 73 73        On success
e430: 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50  . *     CACKEY_P
e440: 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 20 20 20  CSC_E_GENERIC   
e450: 20 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a 20 2a 20   On error. *. * 
e460: 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 4e 6f 6e  NOTES. *     Non
e470: 65 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20  e. *. */.static 
e480: 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65  cackey_ret cacke
e490: 79 5f 73 65 6c 65 63 74 5f 61 70 70 6c 65 74 28  y_select_applet(
e4a0: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c  struct cackey_sl
e4b0: 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e  ot *slot, unsign
e4c0: 65 64 20 63 68 61 72 20 2a 61 69 64 2c 20 73 69  ed char *aid, si
e4d0: 7a 65 5f 74 20 61 69 64 5f 6c 65 6e 29 20 7b 0a  ze_t aid_len) {.
e4e0: 09 69 6e 74 20 73 65 6e 64 5f 72 65 74 3b 0a 0a  .int send_ret;..
e4f0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
e500: 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
e510: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
e520: 50 52 49 4e 54 42 55 46 28 22 53 65 6c 65 63 74  PRINTBUF("Select
e530: 69 6e 67 20 61 70 70 6c 65 74 3a 22 2c 20 61 69  ing applet:", ai
e540: 64 2c 20 61 69 64 5f 6c 65 6e 29 3b 0a 0a 09 73  d, aid_len);...s
e550: 65 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79  end_ret = cackey
e560: 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f 74 2c  _send_apdu(slot,
e570: 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 49 53 4f   GSCIS_CLASS_ISO
e580: 37 38 31 36 2c 20 47 53 43 49 53 5f 49 4e 53 54  7816, GSCIS_INST
e590: 52 5f 53 45 4c 45 43 54 2c 20 47 53 43 49 53 5f  R_SELECT, GSCIS_
e5a0: 50 41 52 41 4d 5f 53 45 4c 45 43 54 5f 41 50 50  PARAM_SELECT_APP
e5b0: 4c 45 54 2c 20 30 78 30 30 2c 20 61 69 64 5f 6c  LET, 0x00, aid_l
e5c0: 65 6e 2c 20 61 69 64 2c 20 30 78 30 30 2c 20 4e  en, aid, 0x00, N
e5d0: 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29  ULL, NULL, NULL)
e5e0: 3b 0a 0a 09 69 66 20 28 73 65 6e 64 5f 72 65 74  ;...if (send_ret
e5f0: 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f   == CACKEY_PCSC_
e600: 45 5f 52 45 54 52 59 29 20 7b 0a 09 09 43 41 43  E_RETRY) {...CAC
e610: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
e620: 28 22 41 44 50 55 20 53 65 6e 64 69 6e 67 20 66  ("ADPU Sending f
e630: 61 69 6c 65 64 2c 20 72 65 74 72 79 69 6e 67 20  ailed, retrying 
e640: 73 65 6c 65 63 74 20 61 70 70 6c 65 74 22 29 3b  select applet");
e650: 0a 0a 09 09 72 65 74 75 72 6e 28 63 61 63 6b 65  ....return(cacke
e660: 79 5f 73 65 6c 65 63 74 5f 61 70 70 6c 65 74 28  y_select_applet(
e670: 73 6c 6f 74 2c 20 61 69 64 2c 20 61 69 64 5f 6c  slot, aid, aid_l
e680: 65 6e 29 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73  en));..}...if (s
e690: 65 6e 64 5f 72 65 74 20 21 3d 20 43 41 43 4b 45  end_ret != CACKE
e6a0: 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09  Y_PCSC_S_OK) {..
e6b0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
e6c0: 49 4e 54 46 28 22 46 61 69 6c 65 64 20 74 6f 20  INTF("Failed to 
e6d0: 6f 70 65 6e 20 61 70 70 6c 65 74 2c 20 72 65 74  open applet, ret
e6e0: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
e6f0: 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  e");....return(C
e700: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e  ACKEY_PCSC_E_GEN
e710: 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  ERIC);..}...CACK
e720: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
e730: 22 53 75 63 63 65 73 73 66 75 6c 6c 79 20 73 65  "Successfully se
e740: 6c 65 63 74 65 64 20 66 69 6c 65 22 29 3b 0a 0a  lected file");..
e750: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
e760: 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a  CSC_S_OK);.}../*
e770: 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20  . * SYNPOSIS. * 
e780: 20 20 20 20 63 61 63 6b 65 79 5f 70 63 73 63 5f      cackey_pcsc_
e790: 69 64 5f 74 79 70 65 20 63 61 63 6b 65 79 5f 64  id_type cackey_d
e7a0: 65 74 65 63 74 5f 61 6e 64 5f 73 65 6c 65 63 74  etect_and_select
e7b0: 5f 72 6f 6f 74 5f 61 70 70 6c 65 74 28 73 74 72  _root_applet(str
e7c0: 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20  uct cackey_slot 
e7d0: 2a 73 6c 6f 74 2c 20 63 61 63 6b 65 79 5f 70 63  *slot, cackey_pc
e7e0: 73 63 5f 69 64 5f 74 79 70 65 20 74 79 70 65 5f  sc_id_type type_
e7f0: 68 69 6e 74 29 3b 0a 20 2a 0a 20 2a 20 41 52 47  hint);. *. * ARG
e800: 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 73 74  UMENTS. *     st
e810: 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74  ruct cackey_slot
e820: 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20   *slot. *       
e830: 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63    Slot to send c
e840: 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a  ommands to. *. *
e850: 20 20 20 20 20 63 61 63 6b 65 79 5f 70 63 73 63       cackey_pcsc
e860: 5f 69 64 5f 74 79 70 65 20 74 79 70 65 5f 68 69  _id_type type_hi
e870: 6e 74 0a 20 2a 20 20 20 20 20 20 20 20 20 41 20  nt. *         A 
e880: 68 69 6e 74 20 61 73 20 74 6f 20 77 68 69 63 68  hint as to which
e890: 20 74 79 70 65 20 6f 66 20 63 61 72 64 20 6d 69   type of card mi
e8a0: 67 68 74 20 62 65 20 69 6e 20 74 68 69 73 20 73  ght be in this s
e8b0: 6c 6f 74 20 28 43 41 43 20 6f 72 20 50 49 56 29  lot (CAC or PIV)
e8c0: 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41  . *. * RETURN VA
e8d0: 4c 55 45 0a 20 2a 20 20 20 20 20 43 41 43 4b 45  LUE. *     CACKE
e8e0: 59 5f 49 44 5f 54 59 50 45 5f 50 49 56 20 20 20  Y_ID_TYPE_PIV   
e8f0: 20 20 20 20 49 66 20 74 68 65 20 63 61 72 64 20      If the card 
e900: 63 6f 6e 6e 65 63 74 65 64 20 69 73 20 61 20 50  connected is a P
e910: 49 56 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59  IV. *     CACKEY
e920: 5f 49 44 5f 54 59 50 45 5f 43 41 43 20 20 20 20  _ID_TYPE_CAC    
e930: 20 20 20 49 66 20 74 68 65 20 63 61 72 64 20 63     If the card c
e940: 6f 6e 6e 65 63 74 65 64 20 69 73 20 61 20 43 41  onnected is a CA
e950: 43 20 77 69 74 68 20 74 68 65 20 43 43 43 0a 20  C with the CCC. 
e960: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
e970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
e980: 70 70 6c 65 74 0a 20 2a 20 20 20 20 20 43 41 43  pplet. *     CAC
e990: 4b 45 59 5f 49 44 5f 54 59 50 45 5f 45 52 52 4f  KEY_ID_TYPE_ERRO
e9a0: 52 20 20 20 20 20 49 66 20 77 65 20 61 72 65 20  R     If we are 
e9b0: 75 6e 61 62 6c 65 20 74 6f 20 64 65 74 65 72 6d  unable to determ
e9c0: 69 6e 65 20 77 68 61 74 20 74 79 70 65 20 6f 66  ine what type of
e9d0: 20 63 61 72 64 0a 20 2a 20 20 20 20 20 20 20 20   card. *        
e9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e9f0: 20 20 20 20 20 20 69 73 20 63 6f 6e 6e 65 63 74        is connect
ea00: 65 64 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20  ed. *. * NOTES. 
ea10: 2a 20 20 20 20 20 54 68 69 73 20 66 75 6e 63 74  *     This funct
ea20: 69 6f 6e 20 72 65 73 65 6c 65 63 74 73 20 74 68  ion reselects th
ea30: 65 20 22 72 6f 6f 74 22 20 61 70 70 6c 65 74 2c  e "root" applet,
ea40: 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63   after this func
ea50: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 0a 20  tion is called. 
ea60: 2a 20 20 20 20 20 74 68 65 20 75 73 65 72 20 6d  *     the user m
ea70: 61 79 20 62 65 20 72 65 71 75 69 72 65 64 20 74  ay be required t
ea80: 6f 20 6c 6f 67 69 6e 20 61 67 61 69 6e 0a 20 2a  o login again. *
ea90: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 61 63 6b  . */.static cack
eaa0: 65 79 5f 70 63 73 63 5f 69 64 5f 74 79 70 65 20  ey_pcsc_id_type 
eab0: 63 61 63 6b 65 79 5f 64 65 74 65 63 74 5f 61 6e  cackey_detect_an
eac0: 64 5f 73 65 6c 65 63 74 5f 72 6f 6f 74 5f 61 70  d_select_root_ap
ead0: 70 6c 65 74 28 73 74 72 75 63 74 20 63 61 63 6b  plet(struct cack
eae0: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 63  ey_slot *slot, c
eaf0: 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 5f 74 79  ackey_pcsc_id_ty
eb00: 70 65 20 74 79 70 65 5f 68 69 6e 74 29 20 7b 0a  pe type_hint) {.
eb10: 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63  .unsigned char c
eb20: 61 63 5f 63 63 63 5f 61 69 64 5b 5d 20 3d 20 7b  ac_ccc_aid[] = {
eb30: 47 53 43 49 53 5f 41 49 44 5f 43 43 43 7d 3b 0a  GSCIS_AID_CCC};.
eb40: 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63  .unsigned char c
eb50: 61 63 5f 69 64 30 5f 61 69 64 5b 5d 20 3d 20 7b  ac_id0_aid[] = {
eb60: 47 53 43 49 53 5f 41 49 44 5f 49 44 30 7d 3b 0a  GSCIS_AID_ID0};.
eb70: 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 70  .unsigned char p
eb80: 69 76 5f 61 69 64 5b 5d 20 3d 20 7b 4e 49 53 54  iv_aid[] = {NIST
eb90: 53 50 38 30 30 5f 37 33 5f 33 5f 50 49 56 5f 41  SP800_73_3_PIV_A
eba0: 49 44 7d 3b 0a 09 63 61 63 6b 65 79 5f 70 63 73  ID};..cackey_pcs
ebb0: 63 5f 69 64 5f 74 79 70 65 20 74 72 79 5f 74 79  c_id_type try_ty
ebc0: 70 65 73 5b 32 5d 2c 20 74 72 79 5f 74 79 70 65  pes[2], try_type
ebd0: 3b 0a 09 69 6e 74 20 73 65 6e 64 5f 72 65 74 3b  ;..int send_ret;
ebe0: 0a 09 69 6e 74 20 69 64 78 3b 0a 0a 09 43 41 43  ..int idx;...CAC
ebf0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
ec00: 28 22 52 65 73 65 6c 65 63 74 69 6e 67 20 74 68  ("Reselecting th
ec10: 65 20 72 6f 6f 74 20 61 70 70 6c 65 74 22 29 3b  e root applet");
ec20: 0a 0a 09 69 66 20 28 74 79 70 65 5f 68 69 6e 74  ...if (type_hint
ec30: 20 3d 3d 20 43 41 43 4b 45 59 5f 49 44 5f 54 59   == CACKEY_ID_TY
ec40: 50 45 5f 55 4e 4b 4e 4f 57 4e 29 20 7b 0a 09 09  PE_UNKNOWN) {...
ec50: 74 79 70 65 5f 68 69 6e 74 20 3d 20 73 6c 6f 74  type_hint = slot
ec60: 2d 3e 69 64 5f 74 79 70 65 5f 68 69 6e 74 3b 0a  ->id_type_hint;.
ec70: 09 7d 0a 0a 09 73 6c 6f 74 2d 3e 69 64 5f 74 79  .}...slot->id_ty
ec80: 70 65 5f 68 69 6e 74 20 3d 20 43 41 43 4b 45 59  pe_hint = CACKEY
ec90: 5f 49 44 5f 54 59 50 45 5f 55 4e 4b 4e 4f 57 4e  _ID_TYPE_UNKNOWN
eca0: 3b 0a 0a 09 73 77 69 74 63 68 20 28 74 79 70 65  ;...switch (type
ecb0: 5f 68 69 6e 74 29 20 7b 0a 09 09 63 61 73 65 20  _hint) {...case 
ecc0: 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 50  CACKEY_ID_TYPE_P
ecd0: 49 56 3a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  IV:....CACKEY_DE
ece0: 42 55 47 5f 50 52 49 4e 54 46 28 22 54 72 79 69  BUG_PRINTF("Tryi
ecf0: 6e 67 20 74 6f 20 72 65 73 65 6c 65 63 74 20 74  ng to reselect t
ed00: 68 65 20 50 49 56 20 72 6f 6f 74 20 61 70 70 6c  he PIV root appl
ed10: 65 74 20 66 69 72 73 74 22 29 3b 0a 0a 09 09 09  et first");.....
ed20: 74 72 79 5f 74 79 70 65 73 5b 30 5d 20 3d 20 43  try_types[0] = C
ed30: 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 50 49  ACKEY_ID_TYPE_PI
ed40: 56 3b 0a 09 09 09 74 72 79 5f 74 79 70 65 73 5b  V;....try_types[
ed50: 31 5d 20 3d 20 43 41 43 4b 45 59 5f 49 44 5f 54  1] = CACKEY_ID_T
ed60: 59 50 45 5f 43 41 43 3b 0a 0a 09 09 09 62 72 65  YPE_CAC;.....bre
ed70: 61 6b 3b 0a 09 09 64 65 66 61 75 6c 74 3a 0a 09  ak;...default:..
ed80: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
ed90: 52 49 4e 54 46 28 22 54 72 79 69 6e 67 20 74 6f  RINTF("Trying to
eda0: 20 72 65 73 65 6c 65 63 74 20 74 68 65 20 43 41   reselect the CA
edb0: 43 20 43 43 43 20 61 70 70 6c 65 74 20 66 69 72  C CCC applet fir
edc0: 73 74 22 29 3b 0a 0a 09 09 09 74 72 79 5f 74 79  st");.....try_ty
edd0: 70 65 73 5b 30 5d 20 3d 20 43 41 43 4b 45 59 5f  pes[0] = CACKEY_
ede0: 49 44 5f 54 59 50 45 5f 43 41 43 3b 0a 09 09 09  ID_TYPE_CAC;....
edf0: 74 72 79 5f 74 79 70 65 73 5b 31 5d 20 3d 20 43  try_types[1] = C
ee00: 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 50 49  ACKEY_ID_TYPE_PI
ee10: 56 3b 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 7d  V;.....break;..}
ee20: 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b  ...for (idx = 0;
ee30: 20 69 64 78 20 3c 20 28 73 69 7a 65 6f 66 28 74   idx < (sizeof(t
ee40: 72 79 5f 74 79 70 65 73 29 20 2f 20 73 69 7a 65  ry_types) / size
ee50: 6f 66 28 74 72 79 5f 74 79 70 65 73 5b 30 5d 29  of(try_types[0])
ee60: 29 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 74 72  ); idx++) {...tr
ee70: 79 5f 74 79 70 65 20 3d 20 74 72 79 5f 74 79 70  y_type = try_typ
ee80: 65 73 5b 69 64 78 5d 3b 0a 0a 09 09 73 77 69 74  es[idx];....swit
ee90: 63 68 20 28 74 72 79 5f 74 79 70 65 29 20 7b 0a  ch (try_type) {.
eea0: 09 09 09 63 61 73 65 20 43 41 43 4b 45 59 5f 49  ...case CACKEY_I
eeb0: 44 5f 54 59 50 45 5f 43 41 43 3a 0a 09 09 09 09  D_TYPE_CAC:.....
eec0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
eed0: 4e 54 46 28 22 54 72 79 69 6e 67 20 74 6f 20 73  NTF("Trying to s
eee0: 65 6c 65 63 74 20 74 68 65 20 43 41 43 20 43 43  elect the CAC CC
eef0: 43 20 61 70 70 6c 65 74 22 29 3b 0a 0a 09 09 09  C applet");.....
ef00: 09 73 65 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b  .send_ret = cack
ef10: 65 79 5f 73 65 6c 65 63 74 5f 61 70 70 6c 65 74  ey_select_applet
ef20: 28 73 6c 6f 74 2c 20 63 61 63 5f 63 63 63 5f 61  (slot, cac_ccc_a
ef30: 69 64 2c 20 73 69 7a 65 6f 66 28 63 61 63 5f 63  id, sizeof(cac_c
ef40: 63 63 5f 61 69 64 29 29 3b 0a 09 09 09 09 69 66  cc_aid));.....if
ef50: 20 28 73 65 6e 64 5f 72 65 74 20 21 3d 20 43 41   (send_ret != CA
ef60: 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20  CKEY_PCSC_S_OK) 
ef70: 7b 0a 09 09 09 09 09 73 65 6e 64 5f 72 65 74 20  {......send_ret 
ef80: 3d 20 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f  = cackey_select_
ef90: 61 70 70 6c 65 74 28 73 6c 6f 74 2c 20 63 61 63  applet(slot, cac
efa0: 5f 69 64 30 5f 61 69 64 2c 20 73 69 7a 65 6f 66  _id0_aid, sizeof
efb0: 28 63 61 63 5f 69 64 30 5f 61 69 64 29 29 3b 0a  (cac_id0_aid));.
efc0: 09 09 09 09 7d 0a 0a 09 09 09 09 62 72 65 61 6b  ....}......break
efd0: 3b 0a 09 09 09 63 61 73 65 20 43 41 43 4b 45 59  ;....case CACKEY
efe0: 5f 49 44 5f 54 59 50 45 5f 50 49 56 3a 0a 09 09  _ID_TYPE_PIV:...
eff0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
f000: 52 49 4e 54 46 28 22 54 72 79 69 6e 67 20 74 6f  RINTF("Trying to
f010: 20 73 65 6c 65 63 74 20 74 68 65 20 50 49 56 20   select the PIV 
f020: 72 6f 6f 74 20 61 70 70 6c 65 74 22 29 3b 0a 0a  root applet");..
f030: 09 09 09 09 73 65 6e 64 5f 72 65 74 20 3d 20 63  ....send_ret = c
f040: 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 61 70 70  ackey_select_app
f050: 6c 65 74 28 73 6c 6f 74 2c 20 70 69 76 5f 61 69  let(slot, piv_ai
f060: 64 2c 20 73 69 7a 65 6f 66 28 70 69 76 5f 61 69  d, sizeof(piv_ai
f070: 64 29 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b  d));......break;
f080: 0a 09 09 7d 0a 0a 09 09 69 66 20 28 73 65 6e 64  ...}....if (send
f090: 5f 72 65 74 20 3d 3d 20 43 41 43 4b 45 59 5f 50  _ret == CACKEY_P
f0a0: 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 43  CSC_S_OK) {....C
f0b0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
f0c0: 54 46 28 22 53 75 63 63 65 73 73 66 75 6c 6c 79  TF("Successfully
f0d0: 20 73 65 6c 65 63 74 65 64 20 74 68 65 20 25 73   selected the %s
f0e0: 20 61 70 70 6c 65 74 20 2d 2d 20 73 65 74 74 69   applet -- setti
f0f0: 6e 67 20 74 68 65 20 5c 22 4c 4f 47 49 4e 20 52  ng the \"LOGIN R
f100: 45 51 55 49 52 45 44 5c 22 20 66 6c 61 67 20 6f  EQUIRED\" flag o
f110: 6e 20 74 68 65 20 74 6f 6b 65 6e 22 2c 0a 09 09  n the token",...
f120: 09 09 74 72 79 5f 74 79 70 65 20 3d 3d 20 43 41  ..try_type == CA
f130: 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43 41 43  CKEY_ID_TYPE_CAC
f140: 20 3f 20 22 43 41 43 22 20 3a 20 22 50 49 56 22   ? "CAC" : "PIV"
f150: 0a 09 09 09 29 3b 0a 0a 09 09 09 73 6c 6f 74 2d  ....);.....slot-
f160: 3e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 3d 20 43  >token_flags = C
f170: 4b 46 5f 4c 4f 47 49 4e 5f 52 45 51 55 49 52 45  KF_LOGIN_REQUIRE
f180: 44 3b 0a 0a 09 09 09 73 6c 6f 74 2d 3e 69 64 5f  D;.....slot->id_
f190: 74 79 70 65 5f 68 69 6e 74 20 3d 20 74 72 79 5f  type_hint = try_
f1a0: 74 79 70 65 3b 0a 0a 09 09 09 72 65 74 75 72 6e  type;.....return
f1b0: 28 74 72 79 5f 74 79 70 65 29 3b 0a 09 09 7d 0a  (try_type);...}.
f1c0: 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
f1d0: 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65  G_PRINTF("Unable
f1e0: 20 74 6f 20 73 65 6c 65 63 74 20 61 6e 79 20 61   to select any a
f1f0: 70 70 6c 65 74 2c 20 72 65 74 75 72 6e 69 6e 67  pplet, returning
f200: 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a   in failure");..
f210: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 49  .return(CACKEY_I
f220: 44 5f 54 59 50 45 5f 45 52 52 4f 52 29 3b 0a 7d  D_TYPE_ERROR);.}
f230: 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53  ../*. * SYNPOSIS
f240: 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 72  . *     cackey_r
f250: 65 74 20 63 61 63 6b 65 79 5f 73 65 6c 65 63 74  et cackey_select
f260: 5f 66 69 6c 65 28 73 74 72 75 63 74 20 63 61 63  _file(struct cac
f270: 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20  key_slot *slot, 
f280: 75 69 6e 74 31 36 5f 74 20 65 66 29 3b 0a 20 2a  uint16_t ef);. *
f290: 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a  . * ARGUMENTS. *
f2a0: 20 20 20 20 20 73 74 72 75 63 74 20 63 61 63 6b       struct cack
f2b0: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a  ey_slot *slot. *
f2c0: 20 20 20 20 20 20 20 20 20 53 6c 6f 74 20 74 6f           Slot to
f2d0: 20 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74   send commands t
f2e0: 6f 0a 20 2a 0a 20 2a 20 20 20 20 20 75 69 6e 74  o. *. *     uint
f2f0: 31 36 5f 74 20 65 66 0a 20 2a 20 20 20 20 20 20  16_t ef. *      
f300: 20 20 20 45 6c 65 6d 65 6e 74 61 6c 20 46 69 6c     Elemental Fil
f310: 65 20 74 6f 20 73 65 6c 65 63 74 0a 20 2a 0a 20  e to select. *. 
f320: 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20  * RETURN VALUE. 
f330: 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53  *     CACKEY_PCS
f340: 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 20 4f  C_S_OK         O
f350: 6e 20 73 75 63 63 65 73 73 0a 20 2a 20 20 20 20  n success. *    
f360: 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47   CACKEY_PCSC_E_G
f370: 45 4e 45 52 49 43 20 20 20 20 4f 6e 20 65 72 72  ENERIC    On err
f380: 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20  or. *. * NOTES. 
f390: 2a 20 20 20 20 20 54 68 69 73 20 73 65 6c 65 63  *     This selec
f3a0: 74 73 20 61 6e 20 45 6c 65 6d 65 6e 74 61 72 79  ts an Elementary
f3b0: 20 46 69 6c 65 20 28 45 46 29 20 75 6e 64 65 72   File (EF) under
f3c0: 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20 73   the currently s
f3d0: 65 6c 65 63 74 65 64 0a 20 2a 20 20 20 20 20 44  elected. *     D
f3e0: 65 64 69 63 61 74 65 64 20 46 69 6c 65 20 28 44  edicated File (D
f3f0: 46 29 0a 20 2a 0a 20 2a 20 20 20 20 20 54 79 70  F). *. *     Typ
f400: 69 63 61 6c 6c 79 20 74 68 69 73 20 69 73 20 63  ically this is c
f410: 61 6c 6c 65 64 20 61 66 74 65 72 20 73 65 6c 65  alled after sele
f420: 63 74 69 6e 67 20 74 68 65 20 63 6f 72 72 65 63  cting the correc
f430: 74 20 41 70 70 6c 65 74 20 28 75 73 69 6e 67 0a  t Applet (using.
f440: 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 73 65   *     cackey_se
f450: 6c 65 63 74 5f 61 70 70 6c 65 74 29 20 66 6f 72  lect_applet) for
f460: 20 56 4d 20 63 61 72 64 73 0a 20 2a 0a 20 2a 2f   VM cards. *. */
f470: 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f 72  .static cackey_r
f480: 65 74 20 63 61 63 6b 65 79 5f 73 65 6c 65 63 74  et cackey_select
f490: 5f 66 69 6c 65 28 73 74 72 75 63 74 20 63 61 63  _file(struct cac
f4a0: 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20  key_slot *slot, 
f4b0: 75 69 6e 74 31 36 5f 74 20 65 66 29 20 7b 0a 09  uint16_t ef) {..
f4c0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 66 69  unsigned char fi
f4d0: 64 5f 62 75 66 5b 32 5d 3b 0a 09 69 6e 74 20 73  d_buf[2];..int s
f4e0: 65 6e 64 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45  end_ret;...CACKE
f4f0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
f500: 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 2f 2a 20  Called.");.../* 
f510: 4f 70 65 6e 20 74 68 65 20 65 6c 65 6d 65 6e 74  Open the element
f520: 61 72 79 20 66 69 6c 65 20 2a 2f 0a 09 66 69 64  ary file */..fid
f530: 5f 62 75 66 5b 30 5d 20 3d 20 28 65 66 20 3e 3e  _buf[0] = (ef >>
f540: 20 38 29 20 26 20 30 78 66 66 3b 0a 09 66 69 64   8) & 0xff;..fid
f550: 5f 62 75 66 5b 31 5d 20 3d 20 65 66 20 26 20 30  _buf[1] = ef & 0
f560: 78 66 66 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  xff;...CACKEY_DE
f570: 42 55 47 5f 50 52 49 4e 54 46 28 22 53 65 6c 65  BUG_PRINTF("Sele
f580: 63 74 69 6e 67 20 66 69 6c 65 3a 20 25 30 34 6c  cting file: %04l
f590: 78 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  x", (unsigned lo
f5a0: 6e 67 29 20 65 66 29 3b 0a 0a 09 73 65 6e 64 5f  ng) ef);...send_
f5b0: 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e  ret = cackey_sen
f5c0: 64 5f 61 70 64 75 28 73 6c 6f 74 2c 20 47 53 43  d_apdu(slot, GSC
f5d0: 49 53 5f 43 4c 41 53 53 5f 49 53 4f 37 38 31 36  IS_CLASS_ISO7816
f5e0: 2c 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 53 45  , GSCIS_INSTR_SE
f5f0: 4c 45 43 54 2c 20 30 78 30 32 2c 20 30 78 30 43  LECT, 0x02, 0x0C
f600: 2c 20 73 69 7a 65 6f 66 28 66 69 64 5f 62 75 66  , sizeof(fid_buf
f610: 29 2c 20 66 69 64 5f 62 75 66 2c 20 30 78 30 30  ), fid_buf, 0x00
f620: 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55  , NULL, NULL, NU
f630: 4c 4c 29 3b 0a 09 69 66 20 28 73 65 6e 64 5f 72  LL);..if (send_r
f640: 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53  et != CACKEY_PCS
f650: 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b  C_S_OK) {...CACK
f660: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
f670: 22 46 61 69 6c 65 64 20 74 6f 20 6f 70 65 6e 20  "Failed to open 
f680: 66 69 6c 65 2c 20 72 65 74 75 72 6e 69 6e 67 20  file, returning 
f690: 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09  in failure");...
f6a0: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
f6b0: 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a  CSC_E_GENERIC);.
f6c0: 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
f6d0: 47 5f 50 52 49 4e 54 46 28 22 53 75 63 63 65 73  G_PRINTF("Succes
f6e0: 73 66 75 6c 6c 79 20 73 65 6c 65 63 74 65 64 20  sfully selected 
f6f0: 66 69 6c 65 22 29 3b 0a 0a 09 72 65 74 75 72 6e  file");...return
f700: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f  (CACKEY_PCSC_S_O
f710: 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e  K);.}../*. * SYN
f720: 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 76 6f 69  POSIS. *     voi
f730: 64 20 63 61 63 6b 65 79 5f 66 72 65 65 5f 74 6c  d cackey_free_tl
f740: 76 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  v(struct cackey_
f750: 74 6c 76 5f 65 6e 74 69 74 79 20 2a 72 6f 6f 74  tlv_entity *root
f760: 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e  );. *. * ARGUMEN
f770: 54 53 0a 20 2a 20 20 20 20 20 73 74 72 75 63 74  TS. *     struct
f780: 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69   cackey_tlv_enti
f790: 74 79 20 2a 72 6f 6f 74 0a 20 2a 20 20 20 20 20  ty *root. *     
f7a0: 20 20 20 20 52 6f 6f 74 20 6f 66 20 74 68 65 20      Root of the 
f7b0: 54 4c 56 20 6c 69 73 74 20 74 6f 20 73 74 61 72  TLV list to star
f7c0: 74 20 66 72 65 65 69 6e 67 0a 20 2a 0a 20 2a 20  t freeing. *. * 
f7d0: 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20  RETURN VALUE. * 
f7e0: 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 4e      None. *. * N
f7f0: 4f 54 45 53 0a 20 2a 20 20 20 20 20 54 68 69 73  OTES. *     This
f800: 20 66 75 6e 63 74 69 6f 6e 20 66 72 65 65 73 20   function frees 
f810: 74 68 65 20 54 4c 56 20 6c 69 6e 6b 65 64 20 6c  the TLV linked l
f820: 69 73 74 65 64 20 72 65 74 75 72 6e 65 64 20 66  isted returned f
f830: 72 6f 6d 0a 20 2a 20 20 20 20 20 22 63 61 63 6b  rom. *     "cack
f840: 65 79 5f 72 65 61 64 5f 74 6c 76 22 0a 20 2a 0a  ey_read_tlv". *.
f850: 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20   */.static void 
f860: 63 61 63 6b 65 79 5f 66 72 65 65 5f 74 6c 76 28  cackey_free_tlv(
f870: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c  struct cackey_tl
f880: 76 5f 65 6e 74 69 74 79 20 2a 72 6f 6f 74 29 20  v_entity *root) 
f890: 7b 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65 79  {..struct cackey
f8a0: 5f 74 6c 76 5f 65 6e 74 69 74 79 20 2a 63 75 72  _tlv_entity *cur
f8b0: 72 2c 20 2a 6e 65 78 74 3b 0a 0a 09 69 66 20 28  r, *next;...if (
f8c0: 72 6f 6f 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  root == NULL) {.
f8d0: 09 09 72 65 74 75 72 6e 3b 0a 09 7d 0a 0a 09 66  ..return;..}...f
f8e0: 6f 72 20 28 63 75 72 72 20 3d 20 72 6f 6f 74 3b  or (curr = root;
f8f0: 20 63 75 72 72 3b 20 63 75 72 72 20 3d 20 6e 65   curr; curr = ne
f900: 78 74 29 20 7b 0a 09 09 6e 65 78 74 20 3d 20 63  xt) {...next = c
f910: 75 72 72 2d 3e 5f 6e 65 78 74 3b 0a 0a 09 09 73  urr->_next;....s
f920: 77 69 74 63 68 20 28 63 75 72 72 2d 3e 74 61 67  witch (curr->tag
f930: 29 20 7b 0a 09 09 09 63 61 73 65 20 47 53 43 49  ) {....case GSCI
f940: 53 5f 54 41 47 5f 41 43 52 5f 54 41 42 4c 45 3a  S_TAG_ACR_TABLE:
f950: 0a 09 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ....case GSCIS_T
f960: 41 47 5f 43 45 52 54 49 46 49 43 41 54 45 3a 0a  AG_CERTIFICATE:.
f970: 09 09 09 09 69 66 20 28 63 75 72 72 2d 3e 76 61  ....if (curr->va
f980: 6c 75 65 29 20 7b 0a 09 09 09 09 09 66 72 65 65  lue) {......free
f990: 28 63 75 72 72 2d 3e 76 61 6c 75 65 29 3b 0a 09  (curr->value);..
f9a0: 09 09 09 7d 0a 09 09 09 09 62 72 65 61 6b 3b 0a  ...}.....break;.
f9b0: 09 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
f9c0: 47 5f 43 41 52 44 55 52 4c 3a 0a 09 09 09 09 69  G_CARDURL:.....i
f9d0: 66 20 28 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63  f (curr->value_c
f9e0: 61 72 64 75 72 6c 29 20 7b 0a 09 09 09 09 09 66  ardurl) {......f
f9f0: 72 65 65 28 63 75 72 72 2d 3e 76 61 6c 75 65 5f  ree(curr->value_
fa00: 63 61 72 64 75 72 6c 29 3b 0a 09 09 09 09 7d 0a  cardurl);.....}.
fa10: 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a  ....break;...}..
fa20: 09 09 66 72 65 65 28 63 75 72 72 29 3b 0a 09 7d  ..free(curr);..}
fa30: 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  ...return;.}../*
fa40: 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20  . * SYNPOSIS. * 
fa50: 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52      .... *. * AR
fa60: 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 2e  GUMENTS. *     .
fa70: 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20  ... *. * RETURN 
fa80: 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e 2e  VALUE. *     ...
fa90: 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20  . *. * NOTES. * 
faa0: 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73      .... *. */.s
fab0: 74 61 74 69 63 20 73 74 72 75 63 74 20 63 61 63  tatic struct cac
fac0: 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20 2a  key_tlv_entity *
fad0: 63 61 63 6b 65 79 5f 72 65 61 64 5f 74 6c 76 28  cackey_read_tlv(
fae0: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c  struct cackey_sl
faf0: 6f 74 20 2a 73 6c 6f 74 29 20 7b 0a 09 73 74 72  ot *slot) {..str
fb00: 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65  uct cackey_tlv_e
fb10: 6e 74 69 74 79 20 2a 63 75 72 72 5f 65 6e 74 69  ntity *curr_enti
fb20: 74 79 2c 20 2a 72 6f 6f 74 20 3d 20 4e 55 4c 4c  ty, *root = NULL
fb30: 2c 20 2a 6c 61 73 74 20 3d 20 4e 55 4c 4c 3b 0a  , *last = NULL;.
fb40: 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 74  .unsigned char t
fb50: 6c 65 6e 5f 62 75 66 5b 32 5d 2c 20 74 76 61 6c  len_buf[2], tval
fb60: 5f 62 75 66 5b 31 30 32 34 5d 2c 20 2a 74 76 61  _buf[1024], *tva
fb70: 6c 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61  l;..unsigned cha
fb80: 72 20 76 6c 65 6e 5f 62 75 66 5b 32 5d 2c 20 76  r vlen_buf[2], v
fb90: 76 61 6c 5f 62 75 66 5b 38 31 39 32 5d 2c 20 2a  val_buf[8192], *
fba0: 76 76 61 6c 3b 0a 09 75 6e 73 69 67 6e 65 64 20  vval;..unsigned 
fbb0: 63 68 61 72 20 2a 74 6d 70 62 75 66 3b 0a 09 75  char *tmpbuf;..u
fbc0: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 74 6d 70  nsigned long tmp
fbd0: 62 75 66 6c 65 6e 3b 0a 09 73 73 69 7a 65 5f 74  buflen;..ssize_t
fbe0: 20 74 6c 65 6e 2c 20 76 6c 65 6e 3b 0a 09 73 73   tlen, vlen;..ss
fbf0: 69 7a 65 5f 74 20 72 65 61 64 5f 72 65 74 3b 0a  ize_t read_ret;.
fc00: 09 73 69 7a 65 5f 74 20 6f 66 66 73 65 74 5f 74  .size_t offset_t
fc10: 20 3d 20 30 2c 20 6f 66 66 73 65 74 5f 76 20 3d   = 0, offset_v =
fc20: 20 30 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68   0;..unsigned ch
fc30: 61 72 20 74 61 67 3b 0a 09 73 69 7a 65 5f 74 20  ar tag;..size_t 
fc40: 6c 65 6e 67 74 68 3b 0a 23 69 66 64 65 66 20 48  length;.#ifdef H
fc50: 41 56 45 5f 4c 49 42 5a 0a 09 69 6e 74 20 75 6e  AVE_LIBZ..int un
fc60: 63 6f 6d 70 72 65 73 73 5f 72 65 74 3b 0a 23 65  compress_ret;.#e
fc70: 6e 64 69 66 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ndif...CACKEY_DE
fc80: 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
fc90: 65 64 2e 22 29 3b 0a 0a 09 72 65 61 64 5f 72 65  ed.");...read_re
fca0: 74 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f  t = cackey_read_
fcb0: 62 75 66 66 65 72 28 73 6c 6f 74 2c 20 74 6c 65  buffer(slot, tle
fcc0: 6e 5f 62 75 66 2c 20 73 69 7a 65 6f 66 28 74 6c  n_buf, sizeof(tl
fcd0: 65 6e 5f 62 75 66 29 2c 20 31 2c 20 6f 66 66 73  en_buf), 1, offs
fce0: 65 74 5f 74 29 3b 0a 09 69 66 20 28 72 65 61 64  et_t);..if (read
fcf0: 5f 72 65 74 20 21 3d 20 73 69 7a 65 6f 66 28 74  _ret != sizeof(t
fd00: 6c 65 6e 5f 62 75 66 29 29 20 7b 0a 09 09 43 41  len_buf)) {...CA
fd10: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
fd20: 46 28 22 52 65 61 64 20 66 61 69 6c 65 64 2c 20  F("Read failed, 
fd30: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  returning in fai
fd40: 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72  lure");....retur
fd50: 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 74 6c  n(NULL);..}...tl
fd60: 65 6e 20 3d 20 28 74 6c 65 6e 5f 62 75 66 5b 31  en = (tlen_buf[1
fd70: 5d 20 3c 3c 20 38 29 20 7c 20 74 6c 65 6e 5f 62  ] << 8) | tlen_b
fd80: 75 66 5b 30 5d 3b 0a 0a 09 72 65 61 64 5f 72 65  uf[0];...read_re
fd90: 74 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f  t = cackey_read_
fda0: 62 75 66 66 65 72 28 73 6c 6f 74 2c 20 76 6c 65  buffer(slot, vle
fdb0: 6e 5f 62 75 66 2c 20 73 69 7a 65 6f 66 28 76 6c  n_buf, sizeof(vl
fdc0: 65 6e 5f 62 75 66 29 2c 20 32 2c 20 6f 66 66 73  en_buf), 2, offs
fdd0: 65 74 5f 76 29 3b 0a 09 69 66 20 28 72 65 61 64  et_v);..if (read
fde0: 5f 72 65 74 20 21 3d 20 73 69 7a 65 6f 66 28 76  _ret != sizeof(v
fdf0: 6c 65 6e 5f 62 75 66 29 29 20 7b 0a 09 09 43 41  len_buf)) {...CA
fe00: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
fe10: 46 28 22 52 65 61 64 20 66 61 69 6c 65 64 2c 20  F("Read failed, 
fe20: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  returning in fai
fe30: 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72  lure");....retur
fe40: 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 76 6c  n(NULL);..}...vl
fe50: 65 6e 20 3d 20 28 76 6c 65 6e 5f 62 75 66 5b 31  en = (vlen_buf[1
fe60: 5d 20 3c 3c 20 38 29 20 7c 20 76 6c 65 6e 5f 62  ] << 8) | vlen_b
fe70: 75 66 5b 30 5d 3b 0a 0a 09 43 41 43 4b 45 59 5f  uf[0];...CACKEY_
fe80: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54 61  DEBUG_PRINTF("Ta
fe90: 67 20 4c 65 6e 67 74 68 20 3d 20 25 6c 75 2c 20  g Length = %lu, 
fea0: 56 61 6c 75 65 20 4c 65 6e 67 74 68 20 3d 20 25  Value Length = %
feb0: 6c 75 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  lu", (unsigned l
fec0: 6f 6e 67 29 20 74 6c 65 6e 2c 20 28 75 6e 73 69  ong) tlen, (unsi
fed0: 67 6e 65 64 20 6c 6f 6e 67 29 20 76 6c 65 6e 29  gned long) vlen)
fee0: 3b 0a 0a 09 6f 66 66 73 65 74 5f 74 20 2b 3d 20  ;...offset_t += 
fef0: 32 3b 0a 09 6f 66 66 73 65 74 5f 76 20 2b 3d 20  2;..offset_v += 
ff00: 32 3b 0a 0a 09 69 66 20 28 74 6c 65 6e 20 3e 20  2;...if (tlen > 
ff10: 73 69 7a 65 6f 66 28 74 76 61 6c 5f 62 75 66 29  sizeof(tval_buf)
ff20: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
ff30: 55 47 5f 50 52 49 4e 54 46 28 22 54 61 67 20 6c  UG_PRINTF("Tag l
ff40: 65 6e 67 74 68 20 69 73 20 74 6f 6f 20 6c 61 72  ength is too lar
ff50: 67 65 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e  ge, returning in
ff60: 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72   failure");....r
ff70: 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a  eturn(NULL);..}.
ff80: 0a 09 69 66 20 28 76 6c 65 6e 20 3e 20 73 69 7a  ..if (vlen > siz
ff90: 65 6f 66 28 76 76 61 6c 5f 62 75 66 29 29 20 7b  eof(vval_buf)) {
ffa0: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
ffb0: 50 52 49 4e 54 46 28 22 56 61 6c 75 65 20 6c 65  PRINTF("Value le
ffc0: 6e 67 74 68 20 69 73 20 74 6f 6f 20 6c 61 72 67  ngth is too larg
ffd0: 65 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20  e, returning in 
ffe0: 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65  failure");....re
fff0: 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a  turn(NULL);..}..
10000 09 72 65 61 64 5f 72 65 74 20 3d 20 63 61 63 6b  .read_ret = cack
10010 65 79 5f 72 65 61 64 5f 62 75 66 66 65 72 28 73  ey_read_buffer(s
10020 6c 6f 74 2c 20 74 76 61 6c 5f 62 75 66 2c 20 74  lot, tval_buf, t
10030 6c 65 6e 2c 20 31 2c 20 6f 66 66 73 65 74 5f 74  len, 1, offset_t
10040 29 3b 0a 09 69 66 20 28 72 65 61 64 5f 72 65 74  );..if (read_ret
10050 20 21 3d 20 74 6c 65 6e 29 20 7b 0a 09 09 43 41   != tlen) {...CA
10060 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
10070 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 72 65 61  F("Unable to rea
10080 64 20 65 6e 74 69 72 65 20 54 2d 62 75 66 66 65  d entire T-buffe
10090 72 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20  r, returning in 
100a0 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65  failure");....re
100b0 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a  turn(NULL);..}..
100c0 09 72 65 61 64 5f 72 65 74 20 3d 20 63 61 63 6b  .read_ret = cack
100d0 65 79 5f 72 65 61 64 5f 62 75 66 66 65 72 28 73  ey_read_buffer(s
100e0 6c 6f 74 2c 20 76 76 61 6c 5f 62 75 66 2c 20 76  lot, vval_buf, v
100f0 6c 65 6e 2c 20 32 2c 20 6f 66 66 73 65 74 5f 76  len, 2, offset_v
10100 29 3b 0a 09 69 66 20 28 72 65 61 64 5f 72 65 74  );..if (read_ret
10110 20 21 3d 20 76 6c 65 6e 29 20 7b 0a 09 09 43 41   != vlen) {...CA
10120 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
10130 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 72 65 61  F("Unable to rea
10140 64 20 65 6e 74 69 72 65 20 56 2d 62 75 66 66 65  d entire V-buffe
10150 72 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20  r, returning in 
10160 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65  failure");....re
10170 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a  turn(NULL);..}..
10180 09 74 76 61 6c 20 3d 20 74 76 61 6c 5f 62 75 66  .tval = tval_buf
10190 3b 0a 09 76 76 61 6c 20 3d 20 76 76 61 6c 5f 62  ;..vval = vval_b
101a0 75 66 3b 0a 09 77 68 69 6c 65 20 28 74 6c 65 6e  uf;..while (tlen
101b0 20 3e 20 30 20 26 26 20 76 6c 65 6e 20 3e 20 30   > 0 && vlen > 0
101c0 29 20 7b 0a 09 09 74 61 67 20 3d 20 2a 74 76 61  ) {...tag = *tva
101d0 6c 3b 0a 09 09 74 76 61 6c 2b 2b 3b 0a 09 09 74  l;...tval++;...t
101e0 6c 65 6e 2d 2d 3b 0a 0a 09 09 69 66 20 28 2a 74  len--;....if (*t
101f0 76 61 6c 20 3d 3d 20 30 78 66 66 29 20 7b 0a 09  val == 0xff) {..
10200 09 09 6c 65 6e 67 74 68 20 3d 20 28 74 76 61 6c  ..length = (tval
10210 5b 32 5d 20 3c 3c 20 38 29 20 7c 20 74 76 61 6c  [2] << 8) | tval
10220 5b 31 5d 3b 0a 09 09 09 74 76 61 6c 20 2b 3d 20  [1];....tval += 
10230 33 3b 0a 09 09 09 74 6c 65 6e 20 2d 3d 20 33 3b  3;....tlen -= 3;
10240 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 6c  ...} else {....l
10250 65 6e 67 74 68 20 3d 20 2a 74 76 61 6c 3b 0a 09  ength = *tval;..
10260 09 09 74 76 61 6c 2b 2b 3b 0a 09 09 09 74 6c 65  ..tval++;....tle
10270 6e 2d 2d 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b  n--;...}....CACK
10280 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
10290 22 54 61 67 3a 20 25 73 20 28 25 30 32 78 29 22  "Tag: %s (%02x)"
102a0 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46  , CACKEY_DEBUG_F
102b0 55 4e 43 5f 54 41 47 5f 54 4f 5f 53 54 52 28 74  UNC_TAG_TO_STR(t
102c0 61 67 29 2c 20 28 75 6e 73 69 67 6e 65 64 20 69  ag), (unsigned i
102d0 6e 74 29 20 74 61 67 29 3b 0a 09 09 43 41 43 4b  nt) tag);...CACK
102e0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55  EY_DEBUG_PRINTBU
102f0 46 28 22 56 61 6c 75 65 3a 22 2c 20 76 76 61 6c  F("Value:", vval
10300 2c 20 6c 65 6e 67 74 68 29 3b 0a 0a 09 09 63 75  , length);....cu
10310 72 72 5f 65 6e 74 69 74 79 20 3d 20 4e 55 4c 4c  rr_entity = NULL
10320 3b 0a 09 09 73 77 69 74 63 68 20 28 74 61 67 29  ;...switch (tag)
10330 20 7b 0a 09 09 09 63 61 73 65 20 47 53 43 49 53   {....case GSCIS
10340 5f 54 41 47 5f 43 41 52 44 55 52 4c 3a 0a 09 09  _TAG_CARDURL:...
10350 09 09 63 75 72 72 5f 65 6e 74 69 74 79 20 3d 20  ..curr_entity = 
10360 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63  malloc(sizeof(*c
10370 75 72 72 5f 65 6e 74 69 74 79 29 29 3b 0a 09 09  urr_entity));...
10380 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76  ..curr_entity->v
10390 61 6c 75 65 5f 63 61 72 64 75 72 6c 20 3d 20 6d  alue_cardurl = m
103a0 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63 75  alloc(sizeof(*cu
103b0 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65  rr_entity->value
103c0 5f 63 61 72 64 75 72 6c 29 29 3b 0a 0a 09 09 09  _cardurl));.....
103d0 09 6d 65 6d 63 70 79 28 63 75 72 72 5f 65 6e 74  .memcpy(curr_ent
103e0 69 74 79 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75  ity->value_cardu
103f0 72 6c 2d 3e 72 69 64 2c 20 76 76 61 6c 2c 20 35  rl->rid, vval, 5
10400 29 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69  );.....curr_enti
10410 74 79 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72  ty->value_cardur
10420 6c 2d 3e 61 70 70 74 79 70 65 20 3d 20 76 76 61  l->apptype = vva
10430 6c 5b 35 5d 3b 0a 09 09 09 09 63 75 72 72 5f 65  l[5];.....curr_e
10440 6e 74 69 74 79 2d 3e 76 61 6c 75 65 5f 63 61 72  ntity->value_car
10450 64 75 72 6c 2d 3e 6f 62 6a 65 63 74 69 64 20 3d  durl->objectid =
10460 20 28 76 76 61 6c 5b 36 5d 20 3c 3c 20 38 29 20   (vval[6] << 8) 
10470 7c 20 76 76 61 6c 5b 37 5d 3b 0a 09 09 09 09 63  | vval[7];.....c
10480 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75  urr_entity->valu
10490 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70 69 64  e_cardurl->appid
104a0 20 3d 20 28 76 76 61 6c 5b 38 5d 20 3c 3c 20 38   = (vval[8] << 8
104b0 29 20 7c 20 76 76 61 6c 5b 39 5d 3b 0a 0a 09 09  ) | vval[9];....
104c0 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 74  ..curr_entity->t
104d0 61 67 20 3d 20 74 61 67 3b 0a 09 09 09 09 63 75  ag = tag;.....cu
104e0 72 72 5f 65 6e 74 69 74 79 2d 3e 5f 6e 65 78 74  rr_entity->_next
104f0 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09 62 72   = NULL;......br
10500 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 47 53 43  eak;....case GSC
10510 49 53 5f 54 41 47 5f 41 43 52 5f 54 41 42 4c 45  IS_TAG_ACR_TABLE
10520 3a 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74  :.....curr_entit
10530 79 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f  y = malloc(sizeo
10540 66 28 2a 63 75 72 72 5f 65 6e 74 69 74 79 29 29  f(*curr_entity))
10550 3b 0a 09 09 09 09 74 6d 70 62 75 66 20 3d 20 6d  ;.....tmpbuf = m
10560 61 6c 6c 6f 63 28 6c 65 6e 67 74 68 29 3b 0a 0a  alloc(length);..
10570 09 09 09 09 6d 65 6d 63 70 79 28 74 6d 70 62 75  ....memcpy(tmpbu
10580 66 2c 20 76 76 61 6c 2c 20 6c 65 6e 67 74 68 29  f, vval, length)
10590 3b 0a 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69  ;......curr_enti
105a0 74 79 2d 3e 74 61 67 20 3d 20 74 61 67 3b 0a 09  ty->tag = tag;..
105b0 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e  ...curr_entity->
105c0 6c 65 6e 67 74 68 20 3d 20 6c 65 6e 67 74 68 3b  length = length;
105d0 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79  .....curr_entity
105e0 2d 3e 76 61 6c 75 65 20 3d 20 74 6d 70 62 75 66  ->value = tmpbuf
105f0 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74  ;.....curr_entit
10600 79 2d 3e 5f 6e 65 78 74 20 3d 20 4e 55 4c 4c 3b  y->_next = NULL;
10610 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
10620 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43  case GSCIS_TAG_C
10630 45 52 54 49 46 49 43 41 54 45 3a 0a 09 09 09 09  ERTIFICATE:.....
10640 63 75 72 72 5f 65 6e 74 69 74 79 20 3d 20 6d 61  curr_entity = ma
10650 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63 75 72  lloc(sizeof(*cur
10660 72 5f 65 6e 74 69 74 79 29 29 3b 0a 0a 23 69 66  r_entity));..#if
10670 64 65 66 20 48 41 56 45 5f 4c 49 42 5a 0a 09 09  def HAVE_LIBZ...
10680 09 09 74 6d 70 62 75 66 6c 65 6e 20 3d 20 6c 65  ..tmpbuflen = le
10690 6e 67 74 68 20 2a 20 32 3b 0a 09 09 09 09 74 6d  ngth * 2;.....tm
106a0 70 62 75 66 20 3d 20 6d 61 6c 6c 6f 63 28 74 6d  pbuf = malloc(tm
106b0 70 62 75 66 6c 65 6e 29 3b 0a 0a 09 09 09 09 75  pbuflen);......u
106c0 6e 63 6f 6d 70 72 65 73 73 5f 72 65 74 20 3d 20  ncompress_ret = 
106d0 75 6e 63 6f 6d 70 72 65 73 73 28 74 6d 70 62 75  uncompress(tmpbu
106e0 66 2c 20 26 74 6d 70 62 75 66 6c 65 6e 2c 20 76  f, &tmpbuflen, v
106f0 76 61 6c 2c 20 6c 65 6e 67 74 68 29 3b 0a 09 09  val, length);...
10700 09 09 69 66 20 28 75 6e 63 6f 6d 70 72 65 73 73  ..if (uncompress
10710 5f 72 65 74 20 21 3d 20 5a 5f 4f 4b 29 20 7b 0a  _ret != Z_OK) {.
10720 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
10730 47 5f 50 52 49 4e 54 46 28 22 46 61 69 6c 65 64  G_PRINTF("Failed
10740 20 74 6f 20 64 65 63 6f 6d 70 72 65 73 73 2c 20   to decompress, 
10750 75 6e 63 6f 6d 70 72 65 73 73 28 29 20 72 65 74  uncompress() ret
10760 75 72 6e 65 64 20 25 69 20 2d 2d 20 72 65 73 6f  urned %i -- reso
10770 72 74 69 6e 67 20 74 6f 20 64 69 72 65 63 74 20  rting to direct 
10780 63 6f 70 79 22 2c 20 75 6e 63 6f 6d 70 72 65 73  copy", uncompres
10790 73 5f 72 65 74 29 3b 0a 0a 09 09 09 09 09 74 6d  s_ret);.......tm
107a0 70 62 75 66 6c 65 6e 20 3d 20 6c 65 6e 67 74 68  pbuflen = length
107b0 3b 0a 09 09 09 09 09 6d 65 6d 63 70 79 28 74 6d  ;......memcpy(tm
107c0 70 62 75 66 2c 20 76 76 61 6c 2c 20 6c 65 6e 67  pbuf, vval, leng
107d0 74 68 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09  th);.....}......
107e0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
107f0 4e 54 42 55 46 28 22 44 65 63 6f 6d 70 72 65 73  NTBUF("Decompres
10800 73 65 64 20 74 6f 3a 22 2c 20 74 6d 70 62 75 66  sed to:", tmpbuf
10810 2c 20 74 6d 70 62 75 66 6c 65 6e 29 3b 0a 23 65  , tmpbuflen);.#e
10820 6c 73 65 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  lse.....CACKEY_D
10830 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4d 69 73  EBUG_PRINTF("Mis
10840 73 69 6e 67 20 5a 4c 49 42 20 53 75 70 70 6f 72  sing ZLIB Suppor
10850 74 2c 20 74 68 69 73 20 63 65 72 74 69 66 69 63  t, this certific
10860 61 74 65 20 69 73 20 6c 69 6b 65 6c 79 20 75 73  ate is likely us
10870 65 6c 65 73 73 2e 2e 2e 22 29 3b 0a 0a 09 09 09  eless...");.....
10880 09 74 6d 70 62 75 66 6c 65 6e 20 3d 20 6c 65 6e  .tmpbuflen = len
10890 67 74 68 3b 0a 09 09 09 09 6d 65 6d 63 70 79 28  gth;.....memcpy(
108a0 74 6d 70 62 75 66 2c 20 76 76 61 6c 2c 20 6c 65  tmpbuf, vval, le
108b0 6e 67 74 68 29 3b 0a 23 65 6e 64 69 66 0a 0a 09  ngth);.#endif...
108c0 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e  ...curr_entity->
108d0 74 61 67 20 3d 20 74 61 67 3b 0a 09 09 09 09 63  tag = tag;.....c
108e0 75 72 72 5f 65 6e 74 69 74 79 2d 3e 6c 65 6e 67  urr_entity->leng
108f0 74 68 20 3d 20 74 6d 70 62 75 66 6c 65 6e 3b 0a  th = tmpbuflen;.
10900 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d  ....curr_entity-
10910 3e 76 61 6c 75 65 20 3d 20 74 6d 70 62 75 66 3b  >value = tmpbuf;
10920 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79  .....curr_entity
10930 2d 3e 5f 6e 65 78 74 20 3d 20 4e 55 4c 4c 3b 0a  ->_next = NULL;.
10940 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
10950 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 50 4b  ase GSCIS_TAG_PK
10960 43 53 31 35 3a 0a 09 09 09 09 63 75 72 72 5f 65  CS15:.....curr_e
10970 6e 74 69 74 79 20 3d 20 6d 61 6c 6c 6f 63 28 73  ntity = malloc(s
10980 69 7a 65 6f 66 28 2a 63 75 72 72 5f 65 6e 74 69  izeof(*curr_enti
10990 74 79 29 29 3b 0a 0a 09 09 09 09 63 75 72 72 5f  ty));......curr_
109a0 65 6e 74 69 74 79 2d 3e 74 61 67 20 3d 20 74 61  entity->tag = ta
109b0 67 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69  g;.....curr_enti
109c0 74 79 2d 3e 76 61 6c 75 65 5f 62 79 74 65 20 3d  ty->value_byte =
109d0 20 76 76 61 6c 5b 30 5d 3b 0a 09 09 09 09 63 75   vval[0];.....cu
109e0 72 72 5f 65 6e 74 69 74 79 2d 3e 5f 6e 65 78 74  rr_entity->_next
109f0 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09 62 72   = NULL;......br
10a00 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09 76 76 61 6c  eak;...}....vval
10a10 20 2b 3d 20 6c 65 6e 67 74 68 3b 0a 09 09 76 6c   += length;...vl
10a20 65 6e 20 2d 3d 20 6c 65 6e 67 74 68 3b 0a 0a 09  en -= length;...
10a30 09 69 66 20 28 63 75 72 72 5f 65 6e 74 69 74 79  .if (curr_entity
10a40 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 69   != NULL) {....i
10a50 66 20 28 72 6f 6f 74 20 3d 3d 20 4e 55 4c 4c 29  f (root == NULL)
10a60 20 7b 0a 09 09 09 09 72 6f 6f 74 20 3d 20 63 75   {.....root = cu
10a70 72 72 5f 65 6e 74 69 74 79 3b 0a 09 09 09 7d 0a  rr_entity;....}.
10a80 0a 09 09 09 69 66 20 28 6c 61 73 74 20 21 3d 20  ....if (last != 
10a90 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 6c 61 73 74  NULL) {.....last
10aa0 2d 3e 5f 6e 65 78 74 20 3d 20 63 75 72 72 5f 65  ->_next = curr_e
10ab0 6e 74 69 74 79 3b 0a 09 09 09 7d 0a 0a 09 09 09  ntity;....}.....
10ac0 6c 61 73 74 20 3d 20 63 75 72 72 5f 65 6e 74 69  last = curr_enti
10ad0 74 79 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 72 65 74  ty;...}..}...ret
10ae0 75 72 6e 28 72 6f 6f 74 29 3b 0a 7d 0a 0a 2f 2a  urn(root);.}../*
10af0 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20  . * SYNPOSIS. * 
10b00 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52      .... *. * AR
10b10 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 2e  GUMENTS. *     .
10b20 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20  ... *. * RETURN 
10b30 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e 2e  VALUE. *     ...
10b40 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20  . *. * NOTES. * 
10b50 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73      .... *. */.s
10b60 74 61 74 69 63 20 76 6f 69 64 20 63 61 63 6b 65  tatic void cacke
10b70 79 5f 66 72 65 65 5f 63 65 72 74 73 28 73 74 72  y_free_certs(str
10b80 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f  uct cackey_pcsc_
10b90 69 64 65 6e 74 69 74 79 20 2a 73 74 61 72 74 2c  identity *start,
10ba0 20 73 69 7a 65 5f 74 20 63 6f 75 6e 74 2c 20 69   size_t count, i
10bb0 6e 74 20 66 72 65 65 5f 73 74 61 72 74 29 20 7b  nt free_start) {
10bc0 0a 09 73 69 7a 65 5f 74 20 69 64 78 3b 0a 0a 09  ..size_t idx;...
10bd0 69 66 20 28 73 74 61 72 74 20 3d 3d 20 4e 55 4c  if (start == NUL
10be0 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e 3b 0a 09  L) {...return;..
10bf0 7d 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 30  }...for (idx = 0
10c00 3b 20 69 64 78 20 3c 20 63 6f 75 6e 74 3b 20 69  ; idx < count; i
10c10 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28 73 74  dx++) {...if (st
10c20 61 72 74 5b 69 64 78 5d 2e 63 65 72 74 69 66 69  art[idx].certifi
10c30 63 61 74 65 29 20 7b 0a 09 09 09 66 72 65 65 28  cate) {....free(
10c40 73 74 61 72 74 5b 69 64 78 5d 2e 63 65 72 74 69  start[idx].certi
10c50 66 69 63 61 74 65 29 3b 0a 09 09 7d 0a 09 7d 0a  ficate);...}..}.
10c60 0a 09 69 66 20 28 66 72 65 65 5f 73 74 61 72 74  ..if (free_start
10c70 29 20 7b 0a 09 09 66 72 65 65 28 73 74 61 72 74  ) {...free(start
10c80 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 3b 0a  );..}...return;.
10c90 7d 0a 0a 73 74 61 74 69 63 20 73 74 72 75 63 74  }..static struct
10ca0 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65   cackey_pcsc_ide
10cb0 6e 74 69 74 79 20 2a 63 61 63 6b 65 79 5f 63 6f  ntity *cackey_co
10cc0 70 79 5f 63 65 72 74 73 28 73 74 72 75 63 74 20  py_certs(struct 
10cd0 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e  cackey_pcsc_iden
10ce0 74 69 74 79 20 2a 64 65 73 74 2c 20 73 74 72 75  tity *dest, stru
10cf0 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69  ct cackey_pcsc_i
10d00 64 65 6e 74 69 74 79 20 2a 73 74 61 72 74 2c 20  dentity *start, 
10d10 73 69 7a 65 5f 74 20 63 6f 75 6e 74 29 20 7b 0a  size_t count) {.
10d20 09 73 69 7a 65 5f 74 20 69 64 78 3b 0a 0a 09 69  .size_t idx;...i
10d30 66 20 28 73 74 61 72 74 20 3d 3d 20 4e 55 4c 4c  f (start == NULL
10d40 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c  ) {...return(NUL
10d50 4c 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 64 65 73  L);..}...if (des
10d60 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 64  t == NULL) {...d
10d70 65 73 74 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a  est = malloc(siz
10d80 65 6f 66 28 2a 64 65 73 74 29 20 2a 20 63 6f 75  eof(*dest) * cou
10d90 6e 74 29 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 69  nt);..}...for (i
10da0 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 63 6f  dx = 0; idx < co
10db0 75 6e 74 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09  unt; idx++) {...
10dc0 64 65 73 74 5b 69 64 78 5d 2e 69 64 5f 74 79 70  dest[idx].id_typ
10dd0 65 20 3d 20 73 74 61 72 74 5b 69 64 78 5d 2e 69  e = start[idx].i
10de0 64 5f 74 79 70 65 3b 0a 0a 09 09 73 77 69 74 63  d_type;....switc
10df0 68 20 28 64 65 73 74 5b 69 64 78 5d 2e 69 64 5f  h (dest[idx].id_
10e00 74 79 70 65 29 20 7b 0a 09 09 09 63 61 73 65 20  type) {....case 
10e10 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43  CACKEY_ID_TYPE_C
10e20 41 43 3a 0a 09 09 09 09 6d 65 6d 63 70 79 28 64  AC:.....memcpy(d
10e30 65 73 74 5b 69 64 78 5d 2e 63 61 72 64 2e 63 61  est[idx].card.ca
10e40 63 2e 61 70 70 6c 65 74 2c 20 73 74 61 72 74 5b  c.applet, start[
10e50 69 64 78 5d 2e 63 61 72 64 2e 63 61 63 2e 61 70  idx].card.cac.ap
10e60 70 6c 65 74 2c 20 73 69 7a 65 6f 66 28 64 65 73  plet, sizeof(des
10e70 74 5b 69 64 78 5d 2e 63 61 72 64 2e 63 61 63 2e  t[idx].card.cac.
10e80 61 70 70 6c 65 74 29 29 3b 0a 09 09 09 09 64 65  applet));.....de
10e90 73 74 5b 69 64 78 5d 2e 63 61 72 64 2e 63 61 63  st[idx].card.cac
10ea0 2e 66 69 6c 65 20 3d 20 73 74 61 72 74 5b 69 64  .file = start[id
10eb0 78 5d 2e 63 61 72 64 2e 63 61 63 2e 66 69 6c 65  x].card.cac.file
10ec0 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ;.....break;....
10ed0 63 61 73 65 20 43 41 43 4b 45 59 5f 49 44 5f 54  case CACKEY_ID_T
10ee0 59 50 45 5f 50 49 56 3a 0a 09 09 09 09 64 65 73  YPE_PIV:.....des
10ef0 74 5b 69 64 78 5d 2e 63 61 72 64 2e 70 69 76 2e  t[idx].card.piv.
10f00 6b 65 79 5f 69 64 20 3d 20 73 74 61 72 74 5b 69  key_id = start[i
10f10 64 78 5d 2e 63 61 72 64 2e 70 69 76 2e 6b 65 79  dx].card.piv.key
10f20 5f 69 64 3b 0a 09 09 09 09 6d 65 6d 63 70 79 28  _id;.....memcpy(
10f30 64 65 73 74 5b 69 64 78 5d 2e 63 61 72 64 2e 70  dest[idx].card.p
10f40 69 76 2e 6c 61 62 65 6c 2c 20 73 74 61 72 74 5b  iv.label, start[
10f50 69 64 78 5d 2e 63 61 72 64 2e 70 69 76 2e 6c 61  idx].card.piv.la
10f60 62 65 6c 2c 20 73 69 7a 65 6f 66 28 64 65 73 74  bel, sizeof(dest
10f70 5b 69 64 78 5d 2e 63 61 72 64 2e 70 69 76 2e 6c  [idx].card.piv.l
10f80 61 62 65 6c 29 29 3b 0a 09 09 09 09 62 72 65 61  abel));.....brea
10f90 6b 3b 0a 09 09 09 63 61 73 65 20 43 41 43 4b 45  k;....case CACKE
10fa0 59 5f 49 44 5f 54 59 50 45 5f 43 45 52 54 5f 4f  Y_ID_TYPE_CERT_O
10fb0 4e 4c 59 3a 0a 09 09 09 09 62 72 65 61 6b 3b 0a  NLY:.....break;.
10fc0 09 09 7d 0a 09 09 64 65 73 74 5b 69 64 78 5d 2e  ..}...dest[idx].
10fd0 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20  certificate_len 
10fe0 3d 20 73 74 61 72 74 5b 69 64 78 5d 2e 63 65 72  = start[idx].cer
10ff0 74 69 66 69 63 61 74 65 5f 6c 65 6e 3b 0a 09 09  tificate_len;...
11000 64 65 73 74 5b 69 64 78 5d 2e 6b 65 79 73 69 7a  dest[idx].keysiz
11010 65 20 3d 20 73 74 61 72 74 5b 69 64 78 5d 2e 6b  e = start[idx].k
11020 65 79 73 69 7a 65 3b 0a 0a 09 09 64 65 73 74 5b  eysize;....dest[
11030 69 64 78 5d 2e 63 65 72 74 69 66 69 63 61 74 65  idx].certificate
11040 20 3d 20 6d 61 6c 6c 6f 63 28 64 65 73 74 5b 69   = malloc(dest[i
11050 64 78 5d 2e 63 65 72 74 69 66 69 63 61 74 65 5f  dx].certificate_
11060 6c 65 6e 29 3b 0a 09 09 6d 65 6d 63 70 79 28 64  len);...memcpy(d
11070 65 73 74 5b 69 64 78 5d 2e 63 65 72 74 69 66 69  est[idx].certifi
11080 63 61 74 65 2c 20 73 74 61 72 74 5b 69 64 78 5d  cate, start[idx]
11090 2e 63 65 72 74 69 66 69 63 61 74 65 2c 20 64 65  .certificate, de
110a0 73 74 5b 69 64 78 5d 2e 63 65 72 74 69 66 69 63  st[idx].certific
110b0 61 74 65 5f 6c 65 6e 29 3b 0a 09 7d 0a 0a 09 72  ate_len);..}...r
110c0 65 74 75 72 6e 28 64 65 73 74 29 3b 0a 7d 0a 0a  eturn(dest);.}..
110d0 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20  /*. * SYNPOSIS. 
110e0 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20  *     .... *. * 
110f0 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20  ARGUMENTS. *    
11100 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52   .... *. * RETUR
11110 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 2e  N VALUE. *     .
11120 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20  ... *. * NOTES. 
11130 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f  *     .... *. */
11140 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 63  .static struct c
11150 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74  ackey_pcsc_ident
11160 69 74 79 20 2a 63 61 63 6b 65 79 5f 72 65 61 64  ity *cackey_read
11170 5f 63 65 72 74 73 28 73 74 72 75 63 74 20 63 61  _certs(struct ca
11180 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c  ckey_slot *slot,
11190 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70   struct cackey_p
111a0 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 63 65  csc_identity *ce
111b0 72 74 73 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f  rts, unsigned lo
111c0 6e 67 20 2a 63 6f 75 6e 74 29 20 7b 0a 09 63 61  ng *count) {..ca
111d0 63 6b 65 79 5f 70 63 73 63 5f 69 64 5f 74 79 70  ckey_pcsc_id_typ
111e0 65 20 63 68 65 63 6b 5f 69 64 5f 74 79 70 65 3b  e check_id_type;
111f0 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  ..struct cackey_
11200 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 63  pcsc_identity *c
11210 75 72 72 5f 69 64 3b 0a 09 73 74 72 75 63 74 20  urr_id;..struct 
11220 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74  cackey_tlv_entit
11230 79 20 2a 63 63 63 5f 74 6c 76 2c 20 2a 63 63 63  y *ccc_tlv, *ccc
11240 5f 63 75 72 72 2c 20 2a 61 70 70 5f 74 6c 76 2c  _curr, *app_tlv,
11250 20 2a 61 70 70 5f 63 75 72 72 3b 0a 09 75 6e 73   *app_curr;..uns
11260 69 67 6e 65 64 20 63 68 61 72 20 2a 70 69 76 5f  igned char *piv_
11270 6f 69 64 2c 20 70 69 76 5f 6f 69 64 5f 70 69 76  oid, piv_oid_piv
11280 61 75 74 68 5b 5d 20 3d 20 7b 4e 49 53 54 53 50  auth[] = {NISTSP
11290 38 30 30 5f 37 33 5f 33 5f 4f 49 44 5f 50 49 56  800_73_3_OID_PIV
112a0 41 55 54 48 7d 2c 20 70 69 76 5f 6f 69 64 5f 73  AUTH}, piv_oid_s
112b0 69 67 6e 61 74 75 72 65 5b 5d 20 3d 20 7b 4e 49  ignature[] = {NI
112c0 53 54 53 50 38 30 30 5f 37 33 5f 33 5f 4f 49 44  STSP800_73_3_OID
112d0 5f 53 49 47 4e 41 54 55 52 45 7d 2c 20 70 69 76  _SIGNATURE}, piv
112e0 5f 6f 69 64 5f 6b 65 79 6d 67 74 5b 5d 20 3d 20  _oid_keymgt[] = 
112f0 7b 4e 49 53 54 53 50 38 30 30 5f 37 33 5f 33 5f  {NISTSP800_73_3_
11300 4f 49 44 5f 4b 45 59 4d 47 54 7d 3b 0a 09 75 6e  OID_KEYMGT};..un
11310 73 69 67 6e 65 64 20 63 68 61 72 20 63 75 72 72  signed char curr
11320 5f 61 69 64 5b 37 5d 3b 0a 09 75 6e 73 69 67 6e  _aid[7];..unsign
11330 65 64 20 63 68 61 72 20 62 75 66 66 65 72 5b 38  ed char buffer[8
11340 31 39 32 5d 2c 20 2a 62 75 66 66 65 72 5f 70 2c  192], *buffer_p,
11350 20 2a 74 6d 70 62 75 66 3b 0a 09 75 6e 73 69 67   *tmpbuf;..unsig
11360 6e 65 64 20 6c 6f 6e 67 20 6f 75 74 69 64 78 20  ned long outidx 
11370 3d 20 30 3b 0a 09 63 68 61 72 20 2a 70 69 76 5f  = 0;..char *piv_
11380 6c 61 62 65 6c 3b 0a 09 63 61 63 6b 65 79 5f 72  label;..cackey_r
11390 65 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 5f 72  et transaction_r
113a0 65 74 3b 0a 09 73 73 69 7a 65 5f 74 20 72 65 61  et;..ssize_t rea
113b0 64 5f 72 65 74 3b 0a 09 73 69 7a 65 5f 74 20 62  d_ret;..size_t b
113c0 75 66 66 65 72 5f 6c 65 6e 2c 20 74 6d 70 62 75  uffer_len, tmpbu
113d0 66 6c 65 6e 3b 0a 09 69 6e 74 20 63 65 72 74 73  flen;..int certs
113e0 5f 72 65 73 69 7a 61 62 6c 65 3b 0a 09 69 6e 74  _resizable;..int
113f0 20 73 65 6e 64 5f 72 65 74 2c 20 73 65 6c 65 63   send_ret, selec
11400 74 5f 72 65 74 3b 0a 09 69 6e 74 20 70 69 76 5f  t_ret;..int piv_
11410 6b 65 79 2c 20 70 69 76 20 3d 20 30 3b 0a 09 69  key, piv = 0;..i
11420 6e 74 20 63 61 63 68 65 64 5f 63 65 72 74 73 5f  nt cached_certs_
11430 76 61 6c 69 64 3b 0a 09 69 6e 74 20 69 64 78 3b  valid;..int idx;
11440 0a 09 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64  ..cackey_pcsc_id
11450 5f 74 79 70 65 20 69 64 5f 74 79 70 65 3b 0a 23  _type id_type;.#
11460 69 66 64 65 66 20 48 41 56 45 5f 4c 49 42 5a 0a  ifdef HAVE_LIBZ.
11470 09 69 6e 74 20 75 6e 63 6f 6d 70 72 65 73 73 5f  .int uncompress_
11480 72 65 74 3b 0a 09 7a 5f 73 74 72 65 61 6d 20 67  ret;..z_stream g
11490 7a 69 70 5f 73 74 72 65 61 6d 3b 0a 23 65 6e 64  zip_stream;.#end
114a0 69 66 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  if...CACKEY_DEBU
114b0 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
114c0 2e 22 29 3b 0a 0a 09 69 66 20 28 63 6f 75 6e 74  .");...if (count
114d0 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
114e0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
114f0 46 28 22 63 6f 75 6e 74 20 69 73 20 4e 55 4c 4c  F("count is NULL
11500 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66  , returning in f
11510 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74  ailure");....ret
11520 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09  urn(NULL);..}...
11530 69 66 20 28 63 65 72 74 73 20 21 3d 20 4e 55 4c  if (certs != NUL
11540 4c 29 20 7b 0a 09 09 69 66 20 28 2a 63 6f 75 6e  L) {...if (*coun
11550 74 20 3d 3d 20 30 29 20 7b 0a 09 09 09 43 41 43  t == 0) {....CAC
11560 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
11570 28 22 52 65 71 75 65 73 74 65 64 20 77 65 20 72  ("Requested we r
11580 65 74 75 72 6e 20 30 20 6f 62 6a 65 63 74 73 2c  eturn 0 objects,
11590 20 73 68 6f 72 74 2d 63 69 72 63 75 69 74 22 29   short-circuit")
115a0 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 63 65 72  ;.....return(cer
115b0 74 73 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 63 61  ts);...}..}...ca
115c0 63 68 65 64 5f 63 65 72 74 73 5f 76 61 6c 69 64  ched_certs_valid
115d0 20 3d 20 30 3b 0a 09 69 66 20 28 21 73 6c 6f 74   = 0;..if (!slot
115e0 2d 3e 73 6c 6f 74 5f 72 65 73 65 74 29 20 7b 0a  ->slot_reset) {.
115f0 09 09 69 66 20 28 73 6c 6f 74 2d 3e 63 61 63 68  ..if (slot->cach
11600 65 64 5f 63 65 72 74 73 29 20 7b 0a 09 09 09 63  ed_certs) {....c
11610 61 63 68 65 64 5f 63 65 72 74 73 5f 76 61 6c 69  ached_certs_vali
11620 64 20 3d 20 31 3b 0a 0a 09 09 09 69 66 20 28 73  d = 1;.....if (s
11630 6c 6f 74 2d 3e 63 61 63 68 65 64 5f 63 65 72 74  lot->cached_cert
11640 73 5f 63 6f 75 6e 74 20 3e 20 30 29 20 7b 0a 09  s_count > 0) {..
11650 09 09 09 63 61 63 68 65 64 5f 63 65 72 74 73 5f  ...cached_certs_
11660 76 61 6c 69 64 20 3d 20 31 3b 0a 09 09 09 7d 0a  valid = 1;....}.
11670 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63  ..}..}...if (cac
11680 68 65 64 5f 63 65 72 74 73 5f 76 61 6c 69 64 29  hed_certs_valid)
11690 20 7b 0a 09 09 69 66 20 28 63 65 72 74 73 20 3d   {...if (certs =
116a0 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 63 65 72  = NULL) {....cer
116b0 74 73 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65  ts = malloc(size
116c0 6f 66 28 2a 63 65 72 74 73 29 20 2a 20 73 6c 6f  of(*certs) * slo
116d0 74 2d 3e 63 61 63 68 65 64 5f 63 65 72 74 73 5f  t->cached_certs_
116e0 63 6f 75 6e 74 29 3b 0a 09 09 09 2a 63 6f 75 6e  count);....*coun
116f0 74 20 3d 20 73 6c 6f 74 2d 3e 63 61 63 68 65 64  t = slot->cached
11700 5f 63 65 72 74 73 5f 63 6f 75 6e 74 3b 0a 09 09  _certs_count;...
11710 7d 20 65 6c 73 65 20 7b 0a 09 09 09 69 66 20 28  } else {....if (
11720 2a 63 6f 75 6e 74 20 3e 20 73 6c 6f 74 2d 3e 63  *count > slot->c
11730 61 63 68 65 64 5f 63 65 72 74 73 5f 63 6f 75 6e  ached_certs_coun
11740 74 29 20 7b 0a 09 09 09 09 2a 63 6f 75 6e 74 20  t) {.....*count 
11750 3d 20 73 6c 6f 74 2d 3e 63 61 63 68 65 64 5f 63  = slot->cached_c
11760 65 72 74 73 5f 63 6f 75 6e 74 3b 0a 09 09 09 7d  erts_count;....}
11770 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 63  ...}....cackey_c
11780 6f 70 79 5f 63 65 72 74 73 28 63 65 72 74 73 2c  opy_certs(certs,
11790 20 73 6c 6f 74 2d 3e 63 61 63 68 65 64 5f 63 65   slot->cached_ce
117a0 72 74 73 2c 20 2a 63 6f 75 6e 74 29 3b 0a 0a 09  rts, *count);...
117b0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
117c0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
117d0 63 61 63 68 65 64 20 63 65 72 74 69 66 69 63 61  cached certifica
117e0 74 65 73 20 66 6f 72 20 74 68 69 73 20 73 6c 6f  tes for this slo
117f0 74 20 28 63 61 72 64 20 68 61 73 20 6e 6f 74 20  t (card has not 
11800 62 65 65 6e 20 72 65 73 65 74 20 61 6e 64 20 74  been reset and t
11810 68 65 72 65 20 61 72 65 20 63 61 63 68 65 64 20  here are cached 
11820 63 65 72 74 73 20 61 76 61 69 6c 61 62 6c 65 29  certs available)
11830 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 63 65  ");....return(ce
11840 72 74 73 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73  rts);..}...if (s
11850 6c 6f 74 2d 3e 63 61 63 68 65 64 5f 63 65 72 74  lot->cached_cert
11860 73 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 66 72  s) {...cackey_fr
11870 65 65 5f 63 65 72 74 73 28 73 6c 6f 74 2d 3e 63  ee_certs(slot->c
11880 61 63 68 65 64 5f 63 65 72 74 73 2c 20 73 6c 6f  ached_certs, slo
11890 74 2d 3e 63 61 63 68 65 64 5f 63 65 72 74 73 5f  t->cached_certs_
118a0 63 6f 75 6e 74 2c 20 31 29 3b 0a 0a 09 09 73 6c  count, 1);....sl
118b0 6f 74 2d 3e 63 61 63 68 65 64 5f 63 65 72 74 73  ot->cached_certs
118c0 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 0a 09 2f 2a   = NULL;..}.../*
118d0 20 42 65 67 69 6e 20 61 20 53 6d 61 72 74 43 61   Begin a SmartCa
118e0 72 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a  rd transaction *
118f0 2f 0a 09 74 72 61 6e 73 61 63 74 69 6f 6e 5f 72  /..transaction_r
11900 65 74 20 3d 20 63 61 63 6b 65 79 5f 62 65 67 69  et = cackey_begi
11910 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c  n_transaction(sl
11920 6f 74 29 3b 0a 09 69 66 20 28 74 72 61 6e 73 61  ot);..if (transa
11930 63 74 69 6f 6e 5f 72 65 74 20 21 3d 20 43 41 43  ction_ret != CAC
11940 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b  KEY_PCSC_S_OK) {
11950 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
11960 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 62  PRINTF("Unable b
11970 65 67 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e  egin transaction
11980 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66  , returning in f
11990 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74  ailure");....ret
119a0 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09  urn(NULL);..}...
119b0 69 64 5f 74 79 70 65 20 3d 20 63 61 63 6b 65 79  id_type = cackey
119c0 5f 64 65 74 65 63 74 5f 61 6e 64 5f 73 65 6c 65  _detect_and_sele
119d0 63 74 5f 72 6f 6f 74 5f 61 70 70 6c 65 74 28 73  ct_root_applet(s
119e0 6c 6f 74 2c 20 43 41 43 4b 45 59 5f 49 44 5f 54  lot, CACKEY_ID_T
119f0 59 50 45 5f 55 4e 4b 4e 4f 57 4e 29 3b 0a 0a 09  YPE_UNKNOWN);...
11a00 73 77 69 74 63 68 20 28 69 64 5f 74 79 70 65 29  switch (id_type)
11a10 20 7b 0a 09 09 63 61 73 65 20 43 41 43 4b 45 59   {...case CACKEY
11a20 5f 49 44 5f 54 59 50 45 5f 43 41 43 3a 0a 09 09  _ID_TYPE_CAC:...
11a30 09 70 69 76 20 3d 20 30 3b 0a 0a 09 09 09 62 72  .piv = 0;.....br
11a40 65 61 6b 3b 0a 09 09 63 61 73 65 20 43 41 43 4b  eak;...case CACK
11a50 45 59 5f 49 44 5f 54 59 50 45 5f 50 49 56 3a 0a  EY_ID_TYPE_PIV:.
11a60 09 09 09 70 69 76 20 3d 20 31 3b 0a 0a 09 09 09  ...piv = 1;.....
11a70 62 72 65 61 6b 3b 0a 09 09 63 61 73 65 20 43 41  break;...case CA
11a80 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 45 52 52  CKEY_ID_TYPE_ERR
11a90 4f 52 3a 0a 09 09 09 2f 2a 20 54 65 72 6d 69 6e  OR:..../* Termin
11aa0 61 74 65 20 53 6d 61 72 74 43 61 72 64 20 54 72  ate SmartCard Tr
11ab0 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 09 09  ansaction */....
11ac0 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73  cackey_end_trans
11ad0 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09  action(slot);...
11ae0 09 09 69 66 20 28 63 65 72 74 73 20 3d 3d 20 4e  ..if (certs == N
11af0 55 4c 4c 29 20 7b 0a 09 09 09 09 2a 63 6f 75 6e  ULL) {.....*coun
11b00 74 20 3d 20 30 3b 0a 09 09 09 7d 0a 0a 09 09 09  t = 0;....}.....
11b10 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 0a 09  return(NULL);...
11b20 09 09 62 72 65 61 6b 3b 0a 09 09 63 61 73 65 20  ..break;...case 
11b30 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43  CACKEY_ID_TYPE_C
11b40 45 52 54 5f 4f 4e 4c 59 3a 0a 09 09 09 43 41 43  ERT_ONLY:....CAC
11b50 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
11b60 28 22 45 72 72 6f 72 2e 20 20 49 6d 70 6f 73 73  ("Error.  Imposs
11b70 69 62 6c 65 20 63 6f 6e 64 69 74 69 6f 6e 20 72  ible condition r
11b80 65 61 63 68 65 64 2e 22 29 3b 0a 0a 09 09 09 62  eached.");.....b
11b90 72 65 61 6b 3b 0a 09 7d 0a 0a 09 69 66 20 28 63  reak;..}...if (c
11ba0 65 72 74 73 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  erts == NULL) {.
11bb0 09 09 63 65 72 74 73 20 3d 20 6d 61 6c 6c 6f 63  ..certs = malloc
11bc0 28 73 69 7a 65 6f 66 28 2a 63 65 72 74 73 29 20  (sizeof(*certs) 
11bd0 2a 20 35 29 3b 0a 09 09 2a 63 6f 75 6e 74 20 3d  * 5);...*count =
11be0 20 35 3b 0a 09 09 63 65 72 74 73 5f 72 65 73 69   5;...certs_resi
11bf0 7a 61 62 6c 65 20 3d 20 31 3b 0a 09 7d 20 65 6c  zable = 1;..} el
11c00 73 65 20 7b 0a 09 09 63 65 72 74 73 5f 72 65 73  se {...certs_res
11c10 69 7a 61 62 6c 65 20 3d 20 30 3b 0a 09 7d 0a 0a  izable = 0;..}..
11c20 09 69 66 20 28 70 69 76 29 20 7b 0a 09 09 66 6f  .if (piv) {...fo
11c30 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20  r (idx = 0; idx 
11c40 3c 20 33 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09  < 3; idx++) {...
11c50 09 73 77 69 74 63 68 20 28 69 64 78 29 20 7b 0a  .switch (idx) {.
11c60 09 09 09 09 63 61 73 65 20 30 3a 0a 09 09 09 09  ....case 0:.....
11c70 09 70 69 76 5f 6f 69 64 20 3d 20 70 69 76 5f 6f  .piv_oid = piv_o
11c80 69 64 5f 70 69 76 61 75 74 68 3b 0a 09 09 09 09  id_pivauth;.....
11c90 09 70 69 76 5f 6b 65 79 20 3d 20 4e 49 53 54 53  .piv_key = NISTS
11ca0 50 38 30 30 5f 37 38 5f 33 5f 4b 45 59 5f 50 49  P800_78_3_KEY_PI
11cb0 56 41 55 54 48 3b 0a 09 09 09 09 09 70 69 76 5f  VAUTH;......piv_
11cc0 6c 61 62 65 6c 20 3d 20 22 41 75 74 68 65 6e 74  label = "Authent
11cd0 69 63 61 74 69 6f 6e 22 3b 0a 09 09 09 09 09 62  ication";......b
11ce0 72 65 61 6b 3b 0a 09 09 09 09 63 61 73 65 20 31  reak;.....case 1
11cf0 3a 0a 09 09 09 09 09 70 69 76 5f 6f 69 64 20 3d  :......piv_oid =
11d00 20 70 69 76 5f 6f 69 64 5f 73 69 67 6e 61 74 75   piv_oid_signatu
11d10 72 65 3b 0a 09 09 09 09 09 70 69 76 5f 6b 65 79  re;......piv_key
11d20 20 3d 20 4e 49 53 54 53 50 38 30 30 5f 37 38 5f   = NISTSP800_78_
11d30 33 5f 4b 45 59 5f 53 49 47 4e 41 54 55 52 45 3b  3_KEY_SIGNATURE;
11d40 0a 09 09 09 09 09 70 69 76 5f 6c 61 62 65 6c 20  ......piv_label 
11d50 3d 20 22 53 69 67 6e 61 74 75 72 65 22 3b 0a 09  = "Signature";..
11d60 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 63  ....break;.....c
11d70 61 73 65 20 32 3a 0a 09 09 09 09 09 70 69 76 5f  ase 2:......piv_
11d80 6f 69 64 20 3d 20 70 69 76 5f 6f 69 64 5f 6b 65  oid = piv_oid_ke
11d90 79 6d 67 74 3b 0a 09 09 09 09 09 70 69 76 5f 6b  ymgt;......piv_k
11da0 65 79 20 3d 20 4e 49 53 54 53 50 38 30 30 5f 37  ey = NISTSP800_7
11db0 38 5f 33 5f 4b 45 59 5f 4b 45 59 4d 47 54 3b 0a  8_3_KEY_KEYMGT;.
11dc0 09 09 09 09 09 70 69 76 5f 6c 61 62 65 6c 20 3d  .....piv_label =
11dd0 20 22 4b 65 79 20 4d 61 6e 61 67 65 6d 65 6e 74   "Key Management
11de0 22 3b 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09  ";......break;..
11df0 09 09 7d 0a 0a 09 09 09 72 65 61 64 5f 72 65 74  ..}.....read_ret
11e00 20 3d 20 63 61 63 6b 65 79 5f 67 65 74 5f 64 61   = cackey_get_da
11e10 74 61 28 73 6c 6f 74 2c 20 62 75 66 66 65 72 2c  ta(slot, buffer,
11e20 20 73 69 7a 65 6f 66 28 62 75 66 66 65 72 29 2c   sizeof(buffer),
11e30 20 70 69 76 5f 6f 69 64 29 3b 0a 0a 09 09 09 69   piv_oid);.....i
11e40 66 20 28 72 65 61 64 5f 72 65 74 20 3c 3d 20 30  f (read_ret <= 0
11e50 29 20 7b 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65  ) {.....continue
11e60 3b 0a 09 09 09 7d 0a 0a 09 09 09 63 75 72 72 5f  ;....}.....curr_
11e70 69 64 20 3d 20 26 63 65 72 74 73 5b 6f 75 74 69  id = &certs[outi
11e80 64 78 5d 3b 0a 09 09 09 6f 75 74 69 64 78 2b 2b  dx];....outidx++
11e90 3b 0a 0a 09 09 09 63 75 72 72 5f 69 64 2d 3e 6b  ;.....curr_id->k
11ea0 65 79 73 69 7a 65 20 3d 20 2d 31 3b 0a 09 09 09  eysize = -1;....
11eb0 63 75 72 72 5f 69 64 2d 3e 69 64 5f 74 79 70 65  curr_id->id_type
11ec0 20 3d 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50   = CACKEY_ID_TYP
11ed0 45 5f 50 49 56 3b 0a 09 09 09 63 75 72 72 5f 69  E_PIV;....curr_i
11ee0 64 2d 3e 63 61 72 64 2e 70 69 76 2e 6b 65 79 5f  d->card.piv.key_
11ef0 69 64 20 3d 20 70 69 76 5f 6b 65 79 3b 0a 09 09  id = piv_key;...
11f00 09 6d 65 6d 63 70 79 28 63 75 72 72 5f 69 64 2d  .memcpy(curr_id-
11f10 3e 63 61 72 64 2e 70 69 76 2e 6c 61 62 65 6c 2c  >card.piv.label,
11f20 20 70 69 76 5f 6c 61 62 65 6c 2c 20 73 74 72 6c   piv_label, strl
11f30 65 6e 28 70 69 76 5f 6c 61 62 65 6c 29 20 2b 20  en(piv_label) + 
11f40 31 29 3b 0a 0a 09 09 09 63 75 72 72 5f 69 64 2d  1);.....curr_id-
11f50 3e 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e  >certificate_len
11f60 20 3d 20 72 65 61 64 5f 72 65 74 3b 0a 09 09 09   = read_ret;....
11f70 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69  curr_id->certifi
11f80 63 61 74 65 20 3d 20 6d 61 6c 6c 6f 63 28 63 75  cate = malloc(cu
11f90 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61  rr_id->certifica
11fa0 74 65 5f 6c 65 6e 29 3b 0a 0a 09 09 09 62 75 66  te_len);.....buf
11fb0 66 65 72 5f 6c 65 6e 20 3d 20 73 69 7a 65 6f 66  fer_len = sizeof
11fc0 28 62 75 66 66 65 72 29 3b 0a 09 09 09 62 75 66  (buffer);....buf
11fd0 66 65 72 5f 70 20 3d 20 63 61 63 6b 65 79 5f 72  fer_p = cackey_r
11fe0 65 61 64 5f 62 65 72 74 6c 76 5f 74 61 67 28 62  ead_bertlv_tag(b
11ff0 75 66 66 65 72 2c 20 26 62 75 66 66 65 72 5f 6c  uffer, &buffer_l
12000 65 6e 2c 20 30 78 37 30 2c 20 63 75 72 72 5f 69  en, 0x70, curr_i
12010 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65 2c 20  d->certificate, 
12020 26 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66  &curr_id->certif
12030 69 63 61 74 65 5f 6c 65 6e 29 3b 0a 0a 09 09 09  icate_len);.....
12040 69 66 20 28 62 75 66 66 65 72 5f 70 20 3d 3d 20  if (buffer_p == 
12050 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 43 41 43 4b  NULL) {.....CACK
12060 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
12070 22 52 65 61 64 69 6e 67 20 63 65 72 74 69 66 69  "Reading certifi
12080 63 61 74 65 20 66 72 6f 6d 20 42 45 52 2d 54 4c  cate from BER-TL
12090 56 20 72 65 73 70 6f 6e 73 65 20 66 61 69 6c 65  V response faile
120a0 64 2c 20 73 6b 69 70 70 69 6e 67 20 6b 65 79 20  d, skipping key 
120b0 25 69 22 2c 20 69 64 78 29 3b 0a 0a 09 09 09 09  %i", idx);......
120c0 66 72 65 65 28 63 75 72 72 5f 69 64 2d 3e 63 65  free(curr_id->ce
120d0 72 74 69 66 69 63 61 74 65 29 3b 0a 0a 09 09 09  rtificate);.....
120e0 09 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66  .curr_id->certif
120f0 69 63 61 74 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 09  icate = NULL;...
12100 09 09 09 6f 75 74 69 64 78 2d 2d 3b 0a 0a 09 09  ...outidx--;....
12110 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 7d  ..continue;....}
12120 0a 0a 09 09 09 69 66 20 28 63 75 72 72 5f 69 64  .....if (curr_id
12130 2d 3e 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65  ->certificate_le
12140 6e 20 3e 20 34 29 20 7b 0a 09 09 09 09 69 66 20  n > 4) {.....if 
12150 28 6d 65 6d 63 6d 70 28 63 75 72 72 5f 69 64 2d  (memcmp(curr_id-
12160 3e 63 65 72 74 69 66 69 63 61 74 65 2c 20 22 5c  >certificate, "\
12170 78 31 66 5c 78 38 62 5c 78 30 38 5c 78 30 30 22  x1f\x8b\x08\x00"
12180 2c 20 34 29 20 3d 3d 20 30 29 20 7b 0a 23 69 66  , 4) == 0) {.#if
12190 64 65 66 20 48 41 56 45 5f 4c 49 42 5a 0a 09 09  def HAVE_LIBZ...
121a0 09 09 09 74 6d 70 62 75 66 6c 65 6e 20 3d 20 63  ...tmpbuflen = c
121b0 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63  urr_id->certific
121c0 61 74 65 5f 6c 65 6e 20 2a 20 32 3b 0a 09 09 09  ate_len * 2;....
121d0 09 09 74 6d 70 62 75 66 20 3d 20 6d 61 6c 6c 6f  ..tmpbuf = mallo
121e0 63 28 74 6d 70 62 75 66 6c 65 6e 29 3b 0a 0a 09  c(tmpbuflen);...
121f0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
12200 5f 50 52 49 4e 54 42 55 46 28 22 41 74 74 65 6d  _PRINTBUF("Attem
12210 70 74 69 6e 67 20 74 6f 20 64 65 63 6f 6d 70 72  pting to decompr
12220 65 73 73 3a 22 2c 20 63 75 72 72 5f 69 64 2d 3e  ess:", curr_id->
12230 63 65 72 74 69 66 69 63 61 74 65 2c 20 63 75 72  certificate, cur
12240 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74  r_id->certificat
12250 65 5f 6c 65 6e 29 3b 0a 0a 09 09 09 09 09 67 7a  e_len);.......gz
12260 69 70 5f 73 74 72 65 61 6d 2e 7a 61 6c 6c 6f 63  ip_stream.zalloc
12270 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 67 7a   = NULL;......gz
12280 69 70 5f 73 74 72 65 61 6d 2e 7a 66 72 65 65 20  ip_stream.zfree 
12290 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 67 7a 69  = NULL;......gzi
122a0 70 5f 73 74 72 65 61 6d 2e 6f 70 61 71 75 65 20  p_stream.opaque 
122b0 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09 09 67 7a  = NULL;.......gz
122c0 69 70 5f 73 74 72 65 61 6d 2e 6e 65 78 74 5f 69  ip_stream.next_i
122d0 6e 20 20 3d 20 63 75 72 72 5f 69 64 2d 3e 63 65  n  = curr_id->ce
122e0 72 74 69 66 69 63 61 74 65 3b 0a 09 09 09 09 09  rtificate;......
122f0 67 7a 69 70 5f 73 74 72 65 61 6d 2e 61 76 61 69  gzip_stream.avai
12300 6c 5f 69 6e 20 3d 20 63 75 72 72 5f 69 64 2d 3e  l_in = curr_id->
12310 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 3b  certificate_len;
12320 0a 09 09 09 09 09 67 7a 69 70 5f 73 74 72 65 61  ......gzip_strea
12330 6d 2e 6e 65 78 74 5f 6f 75 74 20 3d 20 74 6d 70  m.next_out = tmp
12340 62 75 66 3b 0a 09 09 09 09 09 67 7a 69 70 5f 73  buf;......gzip_s
12350 74 72 65 61 6d 2e 61 76 61 69 6c 5f 6f 75 74 20  tream.avail_out 
12360 3d 20 74 6d 70 62 75 66 6c 65 6e 3b 0a 0a 09 09  = tmpbuflen;....
12370 09 09 09 75 6e 63 6f 6d 70 72 65 73 73 5f 72 65  ...uncompress_re
12380 74 20 3d 20 69 6e 66 6c 61 74 65 49 6e 69 74 28  t = inflateInit(
12390 26 67 7a 69 70 5f 73 74 72 65 61 6d 29 3b 0a 09  &gzip_stream);..
123a0 09 09 09 09 69 66 20 28 75 6e 63 6f 6d 70 72 65  ....if (uncompre
123b0 73 73 5f 72 65 74 20 3d 3d 20 5a 5f 4f 4b 29 20  ss_ret == Z_OK) 
123c0 7b 0a 09 09 09 09 09 09 2f 2a 20 54 72 79 20 61  {......./* Try a
123d0 67 61 69 6e 20 61 73 20 61 20 67 7a 69 70 20 62  gain as a gzip b
123e0 75 66 66 65 72 20 2a 2f 0a 09 09 09 09 09 09 75  uffer */.......u
123f0 6e 63 6f 6d 70 72 65 73 73 5f 72 65 74 20 3d 20  ncompress_ret = 
12400 69 6e 66 6c 61 74 65 45 6e 64 28 26 67 7a 69 70  inflateEnd(&gzip
12410 5f 73 74 72 65 61 6d 29 3b 0a 09 09 09 09 09 09  _stream);.......
12420 69 66 20 28 75 6e 63 6f 6d 70 72 65 73 73 5f 72  if (uncompress_r
12430 65 74 20 3d 3d 20 5a 5f 4f 4b 29 20 7b 0a 09 09  et == Z_OK) {...
12440 09 09 09 09 09 67 7a 69 70 5f 73 74 72 65 61 6d  .....gzip_stream
12450 2e 7a 61 6c 6c 6f 63 20 3d 20 4e 55 4c 4c 3b 0a  .zalloc = NULL;.
12460 09 09 09 09 09 09 09 67 7a 69 70 5f 73 74 72 65  .......gzip_stre
12470 61 6d 2e 7a 66 72 65 65 20 3d 20 4e 55 4c 4c 3b  am.zfree = NULL;
12480 0a 09 09 09 09 09 09 09 67 7a 69 70 5f 73 74 72  ........gzip_str
12490 65 61 6d 2e 6f 70 61 71 75 65 20 3d 20 4e 55 4c  eam.opaque = NUL
124a0 4c 3b 0a 0a 09 09 09 09 09 09 09 67 7a 69 70 5f  L;.........gzip_
124b0 73 74 72 65 61 6d 2e 6e 65 78 74 5f 69 6e 20 20  stream.next_in  
124c0 3d 20 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69  = curr_id->certi
124d0 66 69 63 61 74 65 3b 0a 09 09 09 09 09 09 09 67  ficate;........g
124e0 7a 69 70 5f 73 74 72 65 61 6d 2e 61 76 61 69 6c  zip_stream.avail
124f0 5f 69 6e 20 3d 20 63 75 72 72 5f 69 64 2d 3e 63  _in = curr_id->c
12500 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 3b 0a  ertificate_len;.
12510 09 09 09 09 09 09 09 67 7a 69 70 5f 73 74 72 65  .......gzip_stre
12520 61 6d 2e 6e 65 78 74 5f 6f 75 74 20 3d 20 74 6d  am.next_out = tm
12530 70 62 75 66 3b 0a 09 09 09 09 09 09 09 67 7a 69  pbuf;........gzi
12540 70 5f 73 74 72 65 61 6d 2e 61 76 61 69 6c 5f 6f  p_stream.avail_o
12550 75 74 20 3d 20 74 6d 70 62 75 66 6c 65 6e 3b 0a  ut = tmpbuflen;.
12560 09 09 09 09 09 09 09 75 6e 63 6f 6d 70 72 65 73  .......uncompres
12570 73 5f 72 65 74 20 3d 20 69 6e 66 6c 61 74 65 49  s_ret = inflateI
12580 6e 69 74 32 28 26 67 7a 69 70 5f 73 74 72 65 61  nit2(&gzip_strea
12590 6d 2c 20 33 31 29 3b 0a 09 09 09 09 09 09 7d 0a  m, 31);.......}.
125a0 09 09 09 09 09 7d 0a 09 09 09 09 09 69 66 20 28  .....}......if (
125b0 75 6e 63 6f 6d 70 72 65 73 73 5f 72 65 74 20 3d  uncompress_ret =
125c0 3d 20 5a 5f 4f 4b 29 20 7b 0a 09 09 09 09 09 09  = Z_OK) {.......
125d0 75 6e 63 6f 6d 70 72 65 73 73 5f 72 65 74 20 3d  uncompress_ret =
125e0 20 69 6e 66 6c 61 74 65 28 26 67 7a 69 70 5f 73   inflate(&gzip_s
125f0 74 72 65 61 6d 2c 20 30 29 3b 0a 09 09 09 09 09  tream, 0);......
12600 7d 0a 09 09 09 09 09 69 66 20 28 75 6e 63 6f 6d  }......if (uncom
12610 70 72 65 73 73 5f 72 65 74 20 3d 3d 20 5a 5f 53  press_ret == Z_S
12620 54 52 45 41 4d 5f 45 4e 44 29 20 7b 0a 09 09 09  TREAM_END) {....
12630 09 09 09 75 6e 63 6f 6d 70 72 65 73 73 5f 72 65  ...uncompress_re
12640 74 20 3d 20 69 6e 66 6c 61 74 65 45 6e 64 28 26  t = inflateEnd(&
12650 67 7a 69 70 5f 73 74 72 65 61 6d 29 3b 0a 09 09  gzip_stream);...
12660 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09  ...} else {.....
12670 09 09 75 6e 63 6f 6d 70 72 65 73 73 5f 72 65 74  ..uncompress_ret
12680 20 3d 20 5a 5f 44 41 54 41 5f 45 52 52 4f 52 3b   = Z_DATA_ERROR;
12690 0a 09 09 09 09 09 7d 0a 09 09 09 09 09 69 66 20  ......}......if 
126a0 28 75 6e 63 6f 6d 70 72 65 73 73 5f 72 65 74 20  (uncompress_ret 
126b0 3d 3d 20 5a 5f 4f 4b 29 20 7b 0a 09 09 09 09 09  == Z_OK) {......
126c0 09 74 6d 70 62 75 66 6c 65 6e 20 3d 20 67 7a 69  .tmpbuflen = gzi
126d0 70 5f 73 74 72 65 61 6d 2e 74 6f 74 61 6c 5f 6f  p_stream.total_o
126e0 75 74 3b 0a 0a 09 09 09 09 09 09 43 41 43 4b 45  ut;........CACKE
126f0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46  Y_DEBUG_PRINTBUF
12700 28 22 44 65 63 6f 6d 70 72 65 73 73 65 64 20 74  ("Decompressed t
12710 6f 3a 22 2c 20 74 6d 70 62 75 66 2c 20 74 6d 70  o:", tmpbuf, tmp
12720 62 75 66 6c 65 6e 29 3b 0a 0a 09 09 09 09 09 09  buflen);........
12730 66 72 65 65 28 63 75 72 72 5f 69 64 2d 3e 63 65  free(curr_id->ce
12740 72 74 69 66 69 63 61 74 65 29 3b 0a 0a 09 09 09  rtificate);.....
12750 09 09 09 63 75 72 72 5f 69 64 2d 3e 63 65 72 74  ...curr_id->cert
12760 69 66 69 63 61 74 65 20 3d 20 74 6d 70 62 75 66  ificate = tmpbuf
12770 3b 0a 09 09 09 09 09 09 63 75 72 72 5f 69 64 2d  ;.......curr_id-
12780 3e 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e  >certificate_len
12790 20 3d 20 74 6d 70 62 75 66 6c 65 6e 3b 0a 09 09   = tmpbuflen;...
127a0 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09  ...} else {.....
127b0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
127c0 52 49 4e 54 46 28 22 44 65 63 6f 6d 70 72 65 73  RINTF("Decompres
127d0 73 69 6e 67 20 66 61 69 6c 65 64 21 20 75 6e 63  sing failed! unc
127e0 6f 6d 70 72 65 73 73 28 29 20 72 65 74 75 72 6e  ompress() return
127f0 65 64 20 25 69 22 2c 20 75 6e 63 6f 6d 70 72 65  ed %i", uncompre
12800 73 73 5f 72 65 74 29 3b 0a 0a 09 09 09 09 09 09  ss_ret);........
12810 66 72 65 65 28 74 6d 70 62 75 66 29 3b 0a 09 09  free(tmpbuf);...
12820 09 09 09 7d 0a 23 65 6c 73 65 0a 09 09 09 09 09  ...}.#else......
12830 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
12840 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 57 65 20  NTF("Error.  We 
12850 67 6f 74 20 61 20 63 6f 6d 70 72 65 73 73 65 64  got a compressed
12860 20 63 65 72 74 69 66 69 63 61 74 65 20 62 75 74   certificate but
12870 20 77 65 20 64 6f 20 6e 6f 74 20 68 61 76 65 20   we do not have 
12880 7a 6c 69 62 2e 20 20 48 6f 70 69 6e 67 20 66 6f  zlib.  Hoping fo
12890 72 20 74 68 65 20 62 65 73 74 2e 22 29 3b 0a 23  r the best.");.#
128a0 65 6e 64 69 66 0a 09 09 09 09 7d 0a 09 09 09 7d  endif.....}....}
128b0 0a 09 09 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09  ...}..} else {..
128c0 09 2f 2a 20 52 65 61 64 20 61 6c 6c 20 74 68 65  ./* Read all the
128d0 20 61 70 70 6c 65 74 73 20 66 72 6f 6d 20 74 68   applets from th
128e0 65 20 43 43 43 27 73 20 54 4c 56 20 2a 2f 0a 09  e CCC's TLV */..
128f0 09 63 63 63 5f 74 6c 76 20 3d 20 63 61 63 6b 65  .ccc_tlv = cacke
12900 79 5f 72 65 61 64 5f 74 6c 76 28 73 6c 6f 74 29  y_read_tlv(slot)
12910 3b 0a 0a 09 09 2f 2a 20 4c 6f 6f 6b 20 66 6f 72  ;..../* Look for
12920 20 43 41 52 44 55 52 4c 73 20 74 68 61 74 20 63   CARDURLs that c
12930 6f 6f 72 65 73 70 6f 6e 64 20 74 6f 20 50 4b 49  oorespond to PKI
12940 20 61 70 70 6c 65 74 73 20 2a 2f 0a 09 09 66 6f   applets */...fo
12950 72 20 28 63 63 63 5f 63 75 72 72 20 3d 20 63 63  r (ccc_curr = cc
12960 63 5f 74 6c 76 3b 20 63 63 63 5f 63 75 72 72 3b  c_tlv; ccc_curr;
12970 20 63 63 63 5f 63 75 72 72 20 3d 20 63 63 63 5f   ccc_curr = ccc_
12980 63 75 72 72 2d 3e 5f 6e 65 78 74 29 20 7b 0a 09  curr->_next) {..
12990 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
129a0 52 49 4e 54 46 28 22 46 6f 75 6e 64 20 74 61 67  RINTF("Found tag
129b0 3a 20 25 73 20 2e 2e 2e 20 22 2c 20 43 41 43 4b  : %s ... ", CACK
129c0 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 54 41  EY_DEBUG_FUNC_TA
129d0 47 5f 54 4f 5f 53 54 52 28 63 63 63 5f 63 75 72  G_TO_STR(ccc_cur
129e0 72 2d 3e 74 61 67 29 29 3b 0a 0a 09 09 09 69 66  r->tag));.....if
129f0 20 28 63 63 63 5f 63 75 72 72 2d 3e 74 61 67 20   (ccc_curr->tag 
12a00 21 3d 20 47 53 43 49 53 5f 54 41 47 5f 43 41 52  != GSCIS_TAG_CAR
12a10 44 55 52 4c 29 20 7b 0a 09 09 09 09 43 41 43 4b  DURL) {.....CACK
12a20 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
12a30 22 20 20 2e 2e 2e 20 73 6b 69 70 70 69 6e 67 20  "  ... skipping 
12a40 69 74 20 28 77 65 20 6f 6e 6c 79 20 63 61 72 65  it (we only care
12a50 20 61 62 6f 75 74 20 43 41 52 44 55 52 4c 73 29   about CARDURLs)
12a60 22 29 3b 0a 0a 09 09 09 09 63 6f 6e 74 69 6e 75  ");......continu
12a70 65 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28  e;....}.....if (
12a80 28 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65  (ccc_curr->value
12a90 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70 74 79 70  _cardurl->apptyp
12aa0 65 20 26 20 43 41 43 4b 45 59 5f 54 4c 56 5f 41  e & CACKEY_TLV_A
12ab0 50 50 5f 50 4b 49 29 20 21 3d 20 43 41 43 4b 45  PP_PKI) != CACKE
12ac0 59 5f 54 4c 56 5f 41 50 50 5f 50 4b 49 29 20 7b  Y_TLV_APP_PKI) {
12ad0 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
12ae0 47 5f 50 52 49 4e 54 46 28 22 20 20 2e 2e 2e 20  G_PRINTF("  ... 
12af0 73 6b 69 70 70 69 6e 67 20 69 74 20 28 77 65 20  skipping it (we 
12b00 6f 6e 6c 79 20 63 61 72 65 20 61 62 6f 75 74 20  only care about 
12b10 50 4b 49 20 61 70 70 6c 65 74 73 2c 20 74 68 69  PKI applets, thi
12b20 73 20 61 70 70 6c 65 74 20 73 75 70 70 6f 72 74  s applet support
12b30 73 3a 20 25 73 2f 25 30 32 78 29 22 2c 20 43 41  s: %s/%02x)", CA
12b40 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
12b50 41 50 50 54 59 50 45 5f 54 4f 5f 53 54 52 28 63  APPTYPE_TO_STR(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 61 70 70 74 79 70 65 29  ardurl->apptype)
12b80 2c 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29  , (unsigned int)
12b90 20 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65   ccc_curr->value
12ba0 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70 74 79 70  _cardurl->apptyp
12bb0 65 29 3b 0a 0a 09 09 09 09 63 6f 6e 74 69 6e 75  e);......continu
12bc0 65 3b 0a 09 09 09 7d 0a 0a 09 09 09 43 41 43 4b  e;....}.....CACK
12bd0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55  EY_DEBUG_PRINTBU
12be0 46 28 22 52 49 44 3a 22 2c 20 63 63 63 5f 63 75  F("RID:", ccc_cu
12bf0 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72  rr->value_cardur
12c00 6c 2d 3e 72 69 64 2c 20 73 69 7a 65 6f 66 28 63  l->rid, sizeof(c
12c10 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63  cc_curr->value_c
12c20 61 72 64 75 72 6c 2d 3e 72 69 64 29 29 3b 0a 09  ardurl->rid));..
12c30 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
12c40 52 49 4e 54 46 28 22 41 70 70 49 44 20 3d 20 25  RINTF("AppID = %
12c50 73 2f 25 30 34 6c 78 22 2c 20 43 41 43 4b 45 59  s/%04lx", CACKEY
12c60 5f 44 45 42 55 47 5f 46 55 4e 43 5f 4f 42 4a 49  _DEBUG_FUNC_OBJI
12c70 44 5f 54 4f 5f 53 54 52 28 63 63 63 5f 63 75 72  D_TO_STR(ccc_cur
12c80 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c  r->value_cardurl
12c90 2d 3e 61 70 70 69 64 29 2c 20 28 75 6e 73 69 67  ->appid), (unsig
12ca0 6e 65 64 20 6c 6f 6e 67 29 20 63 63 63 5f 63 75  ned long) ccc_cu
12cb0 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72  rr->value_cardur
12cc0 6c 2d 3e 61 70 70 69 64 29 3b 0a 09 09 09 43 41  l->appid);....CA
12cd0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
12ce0 46 28 22 4f 62 6a 65 63 74 49 44 20 3d 20 25 73  F("ObjectID = %s
12cf0 2f 25 30 34 6c 78 22 2c 20 43 41 43 4b 45 59 5f  /%04lx", CACKEY_
12d00 44 45 42 55 47 5f 46 55 4e 43 5f 4f 42 4a 49 44  DEBUG_FUNC_OBJID
12d10 5f 54 4f 5f 53 54 52 28 63 63 63 5f 63 75 72 72  _TO_STR(ccc_curr
12d20 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d  ->value_cardurl-
12d30 3e 6f 62 6a 65 63 74 69 64 29 2c 20 28 75 6e 73  >objectid), (uns
12d40 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 63 63 5f  igned long) ccc_
12d50 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64  curr->value_card
12d60 75 72 6c 2d 3e 6f 62 6a 65 63 74 69 64 29 3b 0a  url->objectid);.
12d70 0a 09 09 09 6d 65 6d 63 70 79 28 63 75 72 72 5f  ....memcpy(curr_
12d80 61 69 64 2c 20 63 63 63 5f 63 75 72 72 2d 3e 76  aid, ccc_curr->v
12d90 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 72 69  alue_cardurl->ri
12da0 64 2c 20 73 69 7a 65 6f 66 28 63 63 63 5f 63 75  d, sizeof(ccc_cu
12db0 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72  rr->value_cardur
12dc0 6c 2d 3e 72 69 64 29 29 3b 0a 09 09 09 63 75 72  l->rid));....cur
12dd0 72 5f 61 69 64 5b 73 69 7a 65 6f 66 28 63 75 72  r_aid[sizeof(cur
12de0 72 5f 61 69 64 29 20 2d 20 32 5d 20 3d 20 28 63  r_aid) - 2] = (c
12df0 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63  cc_curr->value_c
12e00 61 72 64 75 72 6c 2d 3e 61 70 70 69 64 20 3e 3e  ardurl->appid >>
12e10 20 38 29 20 26 20 30 78 66 66 3b 0a 09 09 09 63   8) & 0xff;....c
12e20 75 72 72 5f 61 69 64 5b 73 69 7a 65 6f 66 28 63  urr_aid[sizeof(c
12e30 75 72 72 5f 61 69 64 29 20 2d 20 31 5d 20 3d 20  urr_aid) - 1] = 
12e40 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f  ccc_curr->value_
12e50 63 61 72 64 75 72 6c 2d 3e 61 70 70 69 64 20 26  cardurl->appid &
12e60 20 30 78 66 66 3b 0a 0a 09 09 09 2f 2a 20 53 65   0xff;...../* Se
12e70 6c 65 63 74 20 66 6f 75 6e 64 20 61 70 70 6c 65  lect found apple
12e80 74 20 2e 2e 2e 20 2a 2f 0a 09 09 09 73 65 6c 65  t ... */....sele
12e90 63 74 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f  ct_ret = cackey_
12ea0 73 65 6c 65 63 74 5f 61 70 70 6c 65 74 28 73 6c  select_applet(sl
12eb0 6f 74 2c 20 63 75 72 72 5f 61 69 64 2c 20 73 69  ot, curr_aid, si
12ec0 7a 65 6f 66 28 63 75 72 72 5f 61 69 64 29 29 3b  zeof(curr_aid));
12ed0 0a 09 09 09 69 66 20 28 73 65 6c 65 63 74 5f 72  ....if (select_r
12ee0 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53  et != CACKEY_PCS
12ef0 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 09 43 41  C_S_OK) {.....CA
12f00 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
12f10 46 28 22 46 61 69 6c 65 64 20 74 6f 20 73 65 6c  F("Failed to sel
12f20 65 63 74 20 61 70 70 6c 65 74 2c 20 73 6b 69 70  ect applet, skip
12f30 70 69 6e 67 20 70 72 6f 63 65 73 73 69 6e 67 20  ping processing 
12f40 6f 66 20 74 68 69 73 20 6f 62 6a 65 63 74 22 29  of this object")
12f50 3b 0a 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b  ;......continue;
12f60 0a 09 09 09 7d 0a 0a 09 09 09 2f 2a 20 2e 2e 2e  ....}...../* ...
12f70 20 61 6e 64 20 6f 62 6a 65 63 74 20 28 66 69 6c   and object (fil
12f80 65 29 20 2a 2f 0a 09 09 09 73 65 6c 65 63 74 5f  e) */....select_
12f90 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6c  ret = cackey_sel
12fa0 65 63 74 5f 66 69 6c 65 28 73 6c 6f 74 2c 20 63  ect_file(slot, c
12fb0 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63  cc_curr->value_c
12fc0 61 72 64 75 72 6c 2d 3e 6f 62 6a 65 63 74 69 64  ardurl->objectid
12fd0 29 3b 0a 09 09 09 69 66 20 28 73 65 6c 65 63 74  );....if (select
12fe0 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50  _ret != CACKEY_P
12ff0 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 09  CSC_S_OK) {.....
13000 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
13010 4e 54 46 28 22 46 61 69 6c 65 64 20 74 6f 20 73  NTF("Failed to s
13020 65 6c 65 63 74 20 66 69 6c 65 2c 20 73 6b 69 70  elect file, skip
13030 70 69 6e 67 20 70 72 6f 63 65 73 73 69 6e 67 20  ping processing 
13040 6f 66 20 74 68 69 73 20 6f 62 6a 65 63 74 22 29  of this object")
13050 3b 0a 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b  ;......continue;
13060 0a 09 09 09 7d 0a 0a 09 09 09 2f 2a 20 50 72 6f  ....}...../* Pro
13070 63 65 73 73 20 74 68 69 73 20 66 69 6c 65 27 73  cess this file's
13080 20 54 4c 56 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72   TLV looking for
13090 20 63 65 72 74 69 66 69 63 61 74 65 73 20 2a 2f   certificates */
130a0 0a 09 09 09 61 70 70 5f 74 6c 76 20 3d 20 63 61  ....app_tlv = ca
130b0 63 6b 65 79 5f 72 65 61 64 5f 74 6c 76 28 73 6c  ckey_read_tlv(sl
130c0 6f 74 29 3b 0a 09 0a 09 09 09 66 6f 72 20 28 61  ot);......for (a
130d0 70 70 5f 63 75 72 72 20 3d 20 61 70 70 5f 74 6c  pp_curr = app_tl
130e0 76 3b 20 61 70 70 5f 63 75 72 72 3b 20 61 70 70  v; app_curr; app
130f0 5f 63 75 72 72 20 3d 20 61 70 70 5f 63 75 72 72  _curr = app_curr
13100 2d 3e 5f 6e 65 78 74 29 20 7b 0a 09 09 09 09 43  ->_next) {.....C
13110 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
13120 54 46 28 22 46 6f 75 6e 64 20 74 61 67 3a 20 25  TF("Found tag: %
13130 73 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47  s", CACKEY_DEBUG
13140 5f 46 55 4e 43 5f 54 41 47 5f 54 4f 5f 53 54 52  _FUNC_TAG_TO_STR
13150 28 61 70 70 5f 63 75 72 72 2d 3e 74 61 67 29 29  (app_curr->tag))
13160 3b 0a 09 09 09 09 69 66 20 28 61 70 70 5f 63 75  ;.....if (app_cu
13170 72 72 2d 3e 74 61 67 20 21 3d 20 47 53 43 49 53  rr->tag != GSCIS
13180 5f 54 41 47 5f 43 45 52 54 49 46 49 43 41 54 45  _TAG_CERTIFICATE
13190 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f  ) {......CACKEY_
131a0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 20  DEBUG_PRINTF("  
131b0 2e 2e 2e 20 73 6b 69 70 70 69 6e 67 20 69 74 20  ... skipping it 
131c0 28 77 65 20 6f 6e 6c 79 20 63 61 72 65 20 61 62  (we only care ab
131d0 6f 75 74 20 43 45 52 54 49 46 49 43 41 54 45 73  out CERTIFICATEs
131e0 29 22 29 3b 0a 0a 09 09 09 09 09 63 6f 6e 74 69  )");.......conti
131f0 6e 75 65 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09  nue;.....}......
13200 63 75 72 72 5f 69 64 20 3d 20 26 63 65 72 74 73  curr_id = &certs
13210 5b 6f 75 74 69 64 78 5d 3b 0a 09 09 09 09 6f 75  [outidx];.....ou
13220 74 69 64 78 2b 2b 3b 0a 0a 09 09 09 09 63 75 72  tidx++;......cur
13230 72 5f 69 64 2d 3e 69 64 5f 74 79 70 65 20 3d 20  r_id->id_type = 
13240 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43  CACKEY_ID_TYPE_C
13250 41 43 3b 0a 09 09 09 09 6d 65 6d 63 70 79 28 63  AC;.....memcpy(c
13260 75 72 72 5f 69 64 2d 3e 63 61 72 64 2e 63 61 63  urr_id->card.cac
13270 2e 61 70 70 6c 65 74 2c 20 63 75 72 72 5f 61 69  .applet, curr_ai
13280 64 2c 20 73 69 7a 65 6f 66 28 63 75 72 72 5f 69  d, sizeof(curr_i
13290 64 2d 3e 63 61 72 64 2e 63 61 63 2e 61 70 70 6c  d->card.cac.appl
132a0 65 74 29 29 3b 0a 09 09 09 09 63 75 72 72 5f 69  et));.....curr_i
132b0 64 2d 3e 63 61 72 64 2e 63 61 63 2e 66 69 6c 65  d->card.cac.file
132c0 20 3d 20 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c   = ccc_curr->val
132d0 75 65 5f 63 61 72 64 75 72 6c 2d 3e 6f 62 6a 65  ue_cardurl->obje
132e0 63 74 69 64 3b 0a 09 09 09 09 63 75 72 72 5f 69  ctid;.....curr_i
132f0 64 2d 3e 6b 65 79 73 69 7a 65 20 3d 20 2d 31 3b  d->keysize = -1;
13300 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
13310 55 47 5f 50 52 49 4e 54 46 28 22 46 69 6c 6c 69  UG_PRINTF("Filli
13320 6e 67 20 63 75 72 72 5f 69 64 2d 3e 63 61 72 64  ng curr_id->card
13330 2e 63 61 63 2e 61 70 70 6c 65 74 20 28 25 70 29  .cac.applet (%p)
13340 20 77 69 74 68 20 25 6c 75 20 62 79 74 65 73 3a   with %lu bytes:
13350 22 2c 20 63 75 72 72 5f 69 64 2d 3e 63 61 72 64  ", curr_id->card
13360 2e 63 61 63 2e 61 70 70 6c 65 74 2c 20 28 75 6e  .cac.applet, (un
13370 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69 7a  signed long) siz
13380 65 6f 66 28 63 75 72 72 5f 69 64 2d 3e 63 61 72  eof(curr_id->car
13390 64 2e 63 61 63 2e 61 70 70 6c 65 74 29 29 3b 0a  d.cac.applet));.
133a0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
133b0 5f 50 52 49 4e 54 42 55 46 28 22 56 41 4c 3a 22  _PRINTBUF("VAL:"
133c0 2c 20 63 75 72 72 5f 69 64 2d 3e 63 61 72 64 2e  , curr_id->card.
133d0 63 61 63 2e 61 70 70 6c 65 74 2c 20 73 69 7a 65  cac.applet, size
133e0 6f 66 28 63 75 72 72 5f 69 64 2d 3e 63 61 72 64  of(curr_id->card
133f0 2e 63 61 63 2e 61 70 70 6c 65 74 29 29 3b 0a 0a  .cac.applet));..
13400 09 09 09 09 63 75 72 72 5f 69 64 2d 3e 63 65 72  ....curr_id->cer
13410 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3d 20 61  tificate_len = a
13420 70 70 5f 63 75 72 72 2d 3e 6c 65 6e 67 74 68 3b  pp_curr->length;
13430 0a 0a 09 09 09 09 63 75 72 72 5f 69 64 2d 3e 63  ......curr_id->c
13440 65 72 74 69 66 69 63 61 74 65 20 3d 20 6d 61 6c  ertificate = mal
13450 6c 6f 63 28 63 75 72 72 5f 69 64 2d 3e 63 65 72  loc(curr_id->cer
13460 74 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a 09  tificate_len);..
13470 09 09 09 6d 65 6d 63 70 79 28 63 75 72 72 5f 69  ...memcpy(curr_i
13480 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65 2c 20  d->certificate, 
13490 61 70 70 5f 63 75 72 72 2d 3e 76 61 6c 75 65 2c  app_curr->value,
134a0 20 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66   curr_id->certif
134b0 69 63 61 74 65 5f 6c 65 6e 29 3b 0a 0a 09 09 09  icate_len);.....
134c0 09 69 66 20 28 6f 75 74 69 64 78 20 3e 3d 20 2a  .if (outidx >= *
134d0 63 6f 75 6e 74 29 20 7b 0a 09 09 09 09 09 69 66  count) {......if
134e0 20 28 63 65 72 74 73 5f 72 65 73 69 7a 61 62 6c   (certs_resizabl
134f0 65 29 20 7b 0a 09 09 09 09 09 09 2a 63 6f 75 6e  e) {.......*coun
13500 74 20 2a 3d 20 32 3b 0a 09 09 09 09 09 09 69 66  t *= 2;.......if
13510 20 28 2a 63 6f 75 6e 74 20 21 3d 20 30 29 20 7b   (*count != 0) {
13520 0a 09 09 09 09 09 09 09 63 65 72 74 73 20 3d 20  ........certs = 
13530 72 65 61 6c 6c 6f 63 28 63 65 72 74 73 2c 20 73  realloc(certs, s
13540 69 7a 65 6f 66 28 2a 63 65 72 74 73 29 20 2a 20  izeof(*certs) * 
13550 28 2a 63 6f 75 6e 74 29 29 3b 0a 09 09 09 09 09  (*count));......
13560 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09  .} else {.......
13570 09 63 65 72 74 73 20 3d 20 4e 55 4c 4c 3b 0a 09  .certs = NULL;..
13580 09 09 09 09 09 7d 0a 09 09 09 09 09 7d 20 65 6c  .....}......} el
13590 73 65 20 7b 0a 09 09 09 09 09 09 62 72 65 61 6b  se {.......break
135a0 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 09  ;......}.....}..
135b0 09 09 7d 0a 0a 09 09 09 63 61 63 6b 65 79 5f 66  ..}.....cackey_f
135c0 72 65 65 5f 74 6c 76 28 61 70 70 5f 74 6c 76 29  ree_tlv(app_tlv)
135d0 3b 0a 0a 09 09 09 69 66 20 28 6f 75 74 69 64 78  ;.....if (outidx
135e0 20 3e 3d 20 2a 63 6f 75 6e 74 29 20 7b 0a 09 09   >= *count) {...
135f0 09 09 62 72 65 61 6b 3b 0a 09 09 09 7d 0a 09 09  ..break;....}...
13600 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 66 72 65 65  }....cackey_free
13610 5f 74 6c 76 28 63 63 63 5f 74 6c 76 29 3b 0a 09  _tlv(ccc_tlv);..
13620 7d 0a 0a 09 2a 63 6f 75 6e 74 20 3d 20 6f 75 74  }...*count = out
13630 69 64 78 3b 0a 0a 09 69 66 20 28 63 65 72 74 73  idx;...if (certs
13640 5f 72 65 73 69 7a 61 62 6c 65 29 20 7b 0a 09 09  _resizable) {...
13650 69 66 20 28 2a 63 6f 75 6e 74 20 21 3d 20 30 29  if (*count != 0)
13660 20 7b 0a 09 09 09 63 65 72 74 73 20 3d 20 72 65   {....certs = re
13670 61 6c 6c 6f 63 28 63 65 72 74 73 2c 20 73 69 7a  alloc(certs, siz
13680 65 6f 66 28 2a 63 65 72 74 73 29 20 2a 20 28 2a  eof(*certs) * (*
13690 63 6f 75 6e 74 29 29 3b 0a 09 09 7d 20 65 6c 73  count));...} els
136a0 65 20 7b 0a 09 09 09 66 72 65 65 28 63 65 72 74  e {....free(cert
136b0 73 29 3b 0a 0a 09 09 09 63 65 72 74 73 20 3d 20  s);.....certs = 
136c0 4e 55 4c 4c 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 73  NULL;...}..}...s
136d0 6c 6f 74 2d 3e 63 61 63 68 65 64 5f 63 65 72 74  lot->cached_cert
136e0 73 20 3d 20 63 61 63 6b 65 79 5f 63 6f 70 79 5f  s = cackey_copy_
136f0 63 65 72 74 73 28 4e 55 4c 4c 2c 20 63 65 72 74  certs(NULL, cert
13700 73 2c 20 2a 63 6f 75 6e 74 29 3b 0a 09 73 6c 6f  s, *count);..slo
13710 74 2d 3e 63 61 63 68 65 64 5f 63 65 72 74 73 5f  t->cached_certs_
13720 63 6f 75 6e 74 20 3d 20 2a 63 6f 75 6e 74 3b 0a  count = *count;.
13730 0a 09 2f 2a 20 54 65 72 6d 69 6e 61 74 65 20 53  ../* Terminate S
13740 6d 61 72 74 43 61 72 64 20 54 72 61 6e 73 61 63  martCard Transac
13750 74 69 6f 6e 20 2a 2f 0a 09 63 61 63 6b 65 79 5f  tion */..cackey_
13760 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
13770 73 6c 6f 74 29 3b 0a 0a 09 72 65 74 75 72 6e 28  slot);...return(
13780 63 65 72 74 73 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a  certs);.}../*. *
13790 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20   SYNPOSIS. *    
137a0 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55 4d   .... *. * ARGUM
137b0 45 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a  ENTS. *     ....
137c0 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c   *. * RETURN VAL
137d0 55 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a  UE. *     .... *
137e0 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20  . * NOTES. *    
137f0 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74   .... *. */.stat
13800 69 63 20 73 73 69 7a 65 5f 74 20 63 61 63 6b 65  ic ssize_t cacke
13810 79 5f 73 69 67 6e 64 65 63 72 79 70 74 28 73 74  y_signdecrypt(st
13820 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74  ruct cackey_slot
13830 20 2a 73 6c 6f 74 2c 20 73 74 72 75 63 74 20 63   *slot, struct c
13840 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79 20 2a  ackey_identity *
13850 69 64 65 6e 74 69 74 79 2c 20 75 6e 73 69 67 6e  identity, unsign
13860 65 64 20 63 68 61 72 20 2a 62 75 66 2c 20 73 69  ed char *buf, si
13870 7a 65 5f 74 20 62 75 66 6c 65 6e 2c 20 75 6e 73  ze_t buflen, uns
13880 69 67 6e 65 64 20 63 68 61 72 20 2a 6f 75 74 62  igned char *outb
13890 75 66 2c 20 73 69 7a 65 5f 74 20 6f 75 74 62 75  uf, size_t outbu
138a0 66 6c 65 6e 2c 20 69 6e 74 20 70 61 64 49 6e 70  flen, int padInp
138b0 75 74 2c 20 69 6e 74 20 75 6e 70 61 64 4f 75 74  ut, int unpadOut
138c0 70 75 74 29 20 7b 0a 09 63 61 63 6b 65 79 5f 70  put) {..cackey_p
138d0 63 73 63 5f 69 64 5f 74 79 70 65 20 69 64 5f 74  csc_id_type id_t
138e0 79 70 65 2c 20 63 68 65 63 6b 5f 69 64 5f 74 79  ype, check_id_ty
138f0 70 65 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68  pe;..unsigned ch
13900 61 72 20 64 79 6e 5f 61 75 74 68 5f 74 65 6d 70  ar dyn_auth_temp
13910 6c 61 74 65 5b 31 30 5d 2c 20 2a 64 79 6e 5f 61  late[10], *dyn_a
13920 75 74 68 5f 74 6d 70 62 75 66 3b 0a 09 75 6e 73  uth_tmpbuf;..uns
13930 69 67 6e 65 64 20 63 68 61 72 20 2a 74 6d 70 62  igned char *tmpb
13940 75 66 2c 20 2a 74 6d 70 62 75 66 5f 73 2c 20 2a  uf, *tmpbuf_s, *
13950 6f 75 74 62 75 66 5f 73 2c 20 2a 6f 75 74 62 75  outbuf_s, *outbu
13960 66 5f 70 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63  f_p;..unsigned c
13970 68 61 72 20 62 79 74 65 73 5f 74 6f 5f 73 65 6e  har bytes_to_sen
13980 64 2c 20 70 31 2c 20 63 6c 61 73 73 3b 0a 09 75  d, p1, class;..u
13990 6e 73 69 67 6e 65 64 20 63 68 61 72 20 62 6c 6f  nsigned char blo
139a0 63 6b 74 79 70 65 3b 0a 09 63 61 63 6b 65 79 5f  cktype;..cackey_
139b0 72 65 74 20 73 65 6e 64 5f 72 65 74 3b 0a 09 75  ret send_ret;..u
139c0 69 6e 74 31 36 5f 74 20 72 65 73 70 63 6f 64 65  int16_t respcode
139d0 3b 0a 09 73 73 69 7a 65 5f 74 20 72 65 74 76 61  ;..ssize_t retva
139e0 6c 20 3d 20 30 2c 20 75 6e 70 61 64 6f 66 66 73  l = 0, unpadoffs
139f0 65 74 3b 0a 09 73 69 7a 65 5f 74 20 74 6d 70 62  et;..size_t tmpb
13a00 75 66 6c 65 6e 2c 20 70 61 64 6c 65 6e 2c 20 74  uflen, padlen, t
13a10 6d 70 6f 75 74 62 75 66 6c 65 6e 2c 20 6f 75 74  mpoutbuflen, out
13a20 62 75 66 5f 6c 65 6e 3b 0a 09 69 6e 74 20 66 72  buf_len;..int fr
13a30 65 65 5f 74 6d 70 62 75 66 20 3d 20 30 3b 0a 09  ee_tmpbuf = 0;..
13a40 69 6e 74 20 6c 65 3b 0a 0a 09 43 41 43 4b 45 59  int le;...CACKEY
13a50 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
13a60 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
13a70 73 6c 6f 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  slot == NULL) {.
13a80 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
13a90 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 73  RINTF("Error.  s
13aa0 6c 6f 74 20 69 73 20 4e 55 4c 4c 22 29 3b 0a 0a  lot is NULL");..
13ab0 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d  ..return(-1);..}
13ac0 0a 0a 09 69 66 20 28 62 75 66 20 3d 3d 20 4e 55  ...if (buf == NU
13ad0 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
13ae0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
13af0 6f 72 2e 20 20 62 75 66 20 69 73 20 4e 55 4c 4c  or.  buf is NULL
13b00 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31  ");....return(-1
13b10 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 6f 75 74 62  );..}...if (outb
13b20 75 66 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  uf == NULL) {...
13b30 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
13b40 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 6f 75 74  NTF("Error.  out
13b50 62 75 66 20 69 73 20 4e 55 4c 4c 22 29 3b 0a 0a  buf is NULL");..
13b60 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d  ..return(-1);..}
13b70 0a 0a 09 69 66 20 28 69 64 65 6e 74 69 74 79 20  ...if (identity 
13b80 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43  == NULL) {...CAC
13b90 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
13ba0 28 22 45 72 72 6f 72 2e 20 20 69 64 65 6e 74 69  ("Error.  identi
13bb0 74 79 20 69 73 20 4e 55 4c 4c 22 29 3b 0a 0a 09  ty is NULL");...
13bc0 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a  .return(-1);..}.
13bd0 0a 09 69 66 20 28 69 64 65 6e 74 69 74 79 2d 3e  ..if (identity->
13be0 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 3d 3d  pcsc_identity ==
13bf0 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
13c00 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
13c10 45 72 72 6f 72 2e 20 20 69 64 65 6e 74 69 74 79  Error.  identity
13c20 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20  ->pcsc_identity 
13c30 69 73 20 4e 55 4c 4c 22 29 3b 0a 0a 09 09 72 65  is NULL");....re
13c40 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 69  turn(-1);..}...i
13c50 64 5f 74 79 70 65 20 3d 20 69 64 65 6e 74 69 74  d_type = identit
13c60 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79  y->pcsc_identity
13c70 2d 3e 69 64 5f 74 79 70 65 3b 0a 09 69 66 20 28  ->id_type;..if (
13c80 69 64 5f 74 79 70 65 20 3d 3d 20 43 41 43 4b 45  id_type == CACKE
13c90 59 5f 49 44 5f 54 59 50 45 5f 43 45 52 54 5f 4f  Y_ID_TYPE_CERT_O
13ca0 4e 4c 59 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  NLY) {...CACKEY_
13cb0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
13cc0 72 6f 72 2e 20 20 69 64 65 6e 74 69 74 79 2d 3e  ror.  identity->
13cd0 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 69 73  pcsc_identity is
13ce0 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f   CACKEY_ID_TYPE_
13cf0 43 45 52 54 5f 4f 4e 4c 59 2c 20 77 68 69 63 68  CERT_ONLY, which
13d00 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 20   cannot be used 
13d10 66 6f 72 20 73 69 67 6e 2f 64 65 63 72 79 70 74  for sign/decrypt
13d20 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31  ");....return(-1
13d30 29 3b 0a 09 7d 0a 0a 09 73 77 69 74 63 68 20 28  );..}...switch (
13d40 69 64 5f 74 79 70 65 29 20 7b 0a 09 09 63 61 73  id_type) {...cas
13d50 65 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45  e CACKEY_ID_TYPE
13d60 5f 50 49 56 3a 0a 09 09 63 61 73 65 20 43 41 43  _PIV:...case CAC
13d70 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43 41 43 3a  KEY_ID_TYPE_CAC:
13d80 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 64 65 66  ....break;...def
13d90 61 75 6c 74 3a 0a 09 09 09 43 41 43 4b 45 59 5f  ault:....CACKEY_
13da0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
13db0 72 6f 72 2e 20 20 69 64 65 6e 74 69 74 79 2d 3e  ror.  identity->
13dc0 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 69 73  pcsc_identity is
13dd0 20 6e 6f 74 20 61 20 73 75 70 70 6f 72 74 65 64   not a supported
13de0 20 76 61 6c 75 65 2e 20 54 79 70 65 20 69 73 3a   value. Type is:
13df0 20 30 78 25 6c 78 20 28 50 49 56 20 3d 20 30 78   0x%lx (PIV = 0x
13e00 25 6c 78 2c 20 43 41 43 20 3d 20 30 78 25 6c 78  %lx, CAC = 0x%lx
13e10 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  )", (unsigned lo
13e20 6e 67 29 20 69 64 5f 74 79 70 65 2c 20 28 75 6e  ng) id_type, (un
13e30 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 43 41 43  signed long) CAC
13e40 4b 45 59 5f 49 44 5f 54 59 50 45 5f 50 49 56 2c  KEY_ID_TYPE_PIV,
13e50 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
13e60 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f   CACKEY_ID_TYPE_
13e70 43 41 43 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e  CAC);.....return
13e80 28 2d 31 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65  (-1);..}.../* De
13e90 74 65 72 6d 69 6e 65 20 69 64 65 6e 74 69 74 79  termine identity
13ea0 20 4b 65 79 20 73 69 7a 65 20 2a 2f 0a 09 69 66   Key size */..if
13eb0 20 28 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63   (identity->pcsc
13ec0 5f 69 64 65 6e 74 69 74 79 2d 3e 6b 65 79 73 69  _identity->keysi
13ed0 7a 65 20 3c 20 30 29 20 7b 0a 09 09 69 64 65 6e  ze < 0) {...iden
13ee0 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74  tity->pcsc_ident
13ef0 69 74 79 2d 3e 6b 65 79 73 69 7a 65 20 3d 20 78  ity->keysize = x
13f00 35 30 39 5f 74 6f 5f 6b 65 79 73 69 7a 65 28 69  509_to_keysize(i
13f10 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64  dentity->pcsc_id
13f20 65 6e 74 69 74 79 2d 3e 63 65 72 74 69 66 69 63  entity->certific
13f30 61 74 65 2c 20 69 64 65 6e 74 69 74 79 2d 3e 70  ate, identity->p
13f40 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 63 65  csc_identity->ce
13f50 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a  rtificate_len);.
13f60 09 7d 0a 0a 09 2f 2a 20 50 61 64 20 6d 65 73 73  .}.../* Pad mess
13f70 61 67 65 20 74 6f 20 6b 65 79 20 73 69 7a 65 20  age to key size 
13f80 2a 2f 0a 09 69 66 20 28 70 61 64 49 6e 70 75 74  */..if (padInput
13f90 29 20 7b 0a 09 09 69 66 20 28 69 64 65 6e 74 69  ) {...if (identi
13fa0 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74  ty->pcsc_identit
13fb0 79 2d 3e 6b 65 79 73 69 7a 65 20 3e 20 30 29 20  y->keysize > 0) 
13fc0 7b 0a 09 09 09 69 66 20 28 62 75 66 6c 65 6e 20  {....if (buflen 
13fd0 21 3d 20 69 64 65 6e 74 69 74 79 2d 3e 70 63 73  != identity->pcs
13fe0 63 5f 69 64 65 6e 74 69 74 79 2d 3e 6b 65 79 73  c_identity->keys
13ff0 69 7a 65 29 20 7b 0a 09 09 09 09 69 66 20 28 62  ize) {.....if (b
14000 75 66 6c 65 6e 20 3e 20 28 69 64 65 6e 74 69 74  uflen > (identit
14010 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79  y->pcsc_identity
14020 2d 3e 6b 65 79 73 69 7a 65 20 2d 20 33 29 29 20  ->keysize - 3)) 
14030 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45  {......CACKEY_DE
14040 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
14050 72 2e 20 20 4d 65 73 73 61 67 65 20 69 73 20 74  r.  Message is t
14060 6f 6f 20 6c 61 72 67 65 20 74 6f 20 73 69 67 6e  oo large to sign
14070 2f 64 65 63 72 79 70 74 22 29 3b 0a 0a 09 09 09  /decrypt");.....
14080 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09  ..return(-1);...
14090 09 09 7d 0a 0a 09 09 09 09 74 6d 70 62 75 66 6c  ..}......tmpbufl
140a0 65 6e 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e 70  en = identity->p
140b0 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 6b 65  csc_identity->ke
140c0 79 73 69 7a 65 3b 0a 09 09 09 09 74 6d 70 62 75  ysize;.....tmpbu
140d0 66 20 3d 20 6d 61 6c 6c 6f 63 28 74 6d 70 62 75  f = malloc(tmpbu
140e0 66 6c 65 6e 29 3b 0a 09 09 09 09 66 72 65 65 5f  flen);.....free_
140f0 74 6d 70 62 75 66 20 3d 20 31 3b 0a 0a 09 09 09  tmpbuf = 1;.....
14100 09 70 61 64 6c 65 6e 20 3d 20 74 6d 70 62 75 66  .padlen = tmpbuf
14110 6c 65 6e 20 2d 20 62 75 66 6c 65 6e 20 2d 20 33  len - buflen - 3
14120 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  ;......CACKEY_DE
14130 42 55 47 5f 50 52 49 4e 54 46 28 22 4e 65 65 64  BUG_PRINTF("Need
14140 20 74 6f 20 70 61 64 20 74 68 65 20 62 75 66 66   to pad the buff
14150 65 72 20 77 69 74 68 20 25 6c 6c 75 20 62 79 74  er with %llu byt
14160 65 73 20 28 74 6d 70 62 75 66 6c 65 6e 20 3d 20  es (tmpbuflen = 
14170 25 6c 6c 75 2c 20 62 75 66 6c 65 6e 20 3d 20 25  %llu, buflen = %
14180 6c 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64  llu)", (unsigned
14190 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20 70 61 64 6c   long long) padl
141a0 65 6e 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  en, (unsigned lo
141b0 6e 67 20 6c 6f 6e 67 29 20 74 6d 70 62 75 66 6c  ng long) tmpbufl
141c0 65 6e 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  en, (unsigned lo
141d0 6e 67 20 6c 6f 6e 67 29 20 62 75 66 6c 65 6e 29  ng long) buflen)
141e0 3b 0a 0a 09 09 09 09 2f 2a 20 52 53 41 20 50 4b  ;....../* RSA PK
141f0 43 53 23 31 20 45 4d 53 41 2d 50 4b 43 53 31 2d  CS#1 EMSA-PKCS1-
14200 76 31 5f 35 20 50 61 64 64 69 6e 67 20 2a 2f 0a  v1_5 Padding */.
14210 09 09 09 09 74 6d 70 62 75 66 5b 30 5d 20 3d 20  ....tmpbuf[0] = 
14220 30 78 30 30 3b 0a 09 09 09 09 74 6d 70 62 75 66  0x00;.....tmpbuf
14230 5b 31 5d 20 3d 20 30 78 30 31 3b 0a 09 09 09 09  [1] = 0x01;.....
14240 6d 65 6d 73 65 74 28 26 74 6d 70 62 75 66 5b 32  memset(&tmpbuf[2
14250 5d 2c 20 30 78 46 46 2c 20 70 61 64 6c 65 6e 29  ], 0xFF, padlen)
14260 3b 0a 09 09 09 09 74 6d 70 62 75 66 5b 70 61 64  ;.....tmpbuf[pad
14270 6c 65 6e 20 2b 20 32 5d 3d 20 30 78 30 30 3b 0a  len + 2]= 0x00;.
14280 09 09 09 09 6d 65 6d 63 70 79 28 26 74 6d 70 62  ....memcpy(&tmpb
14290 75 66 5b 70 61 64 6c 65 6e 20 2b 20 33 5d 2c 20  uf[padlen + 3], 
142a0 62 75 66 2c 20 62 75 66 6c 65 6e 29 3b 0a 0a 09  buf, buflen);...
142b0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
142c0 50 52 49 4e 54 42 55 46 28 22 55 6e 70 61 64 64  PRINTBUF("Unpadd
142d0 65 64 3a 22 2c 20 62 75 66 2c 20 62 75 66 6c 65  ed:", buf, bufle
142e0 6e 29 3b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  n);.....CACKEY_D
142f0 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22 50  EBUG_PRINTBUF("P
14300 61 64 64 65 64 3a 22 2c 20 74 6d 70 62 75 66 2c  added:", tmpbuf,
14310 20 74 6d 70 62 75 66 6c 65 6e 29 3b 0a 09 09 09   tmpbuflen);....
14320 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 74 6d 70  } else {.....tmp
14330 62 75 66 20 3d 20 62 75 66 3b 0a 09 09 09 09 74  buf = buf;.....t
14340 6d 70 62 75 66 6c 65 6e 20 3d 20 62 75 66 6c 65  mpbuflen = bufle
14350 6e 3b 0a 09 09 09 09 66 72 65 65 5f 74 6d 70 62  n;.....free_tmpb
14360 75 66 20 3d 20 30 3b 0a 09 09 09 09 70 61 64 6c  uf = 0;.....padl
14370 65 6e 20 3d 20 30 3b 0a 09 09 09 7d 0a 09 09 7d  en = 0;....}...}
14380 20 65 6c 73 65 20 7b 0a 09 09 09 43 41 43 4b 45   else {....CACKE
14390 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
143a0 55 6e 61 62 6c 65 20 74 6f 20 64 65 74 65 72 6d  Unable to determ
143b0 69 6e 65 20 6b 65 79 20 73 69 7a 65 2c 20 68 6f  ine key size, ho
143c0 70 69 6e 67 20 74 68 65 20 6d 65 73 73 61 67 65  ping the message
143d0 20 69 73 20 70 72 6f 70 65 72 6c 79 20 70 61 64   is properly pad
143e0 64 65 64 21 22 29 3b 0a 0a 09 09 09 74 6d 70 62  ded!");.....tmpb
143f0 75 66 20 3d 20 62 75 66 3b 0a 09 09 09 74 6d 70  uf = buf;....tmp
14400 62 75 66 6c 65 6e 20 3d 20 62 75 66 6c 65 6e 3b  buflen = buflen;
14410 0a 09 09 09 66 72 65 65 5f 74 6d 70 62 75 66 20  ....free_tmpbuf 
14420 3d 20 30 3b 0a 09 09 09 70 61 64 6c 65 6e 20 3d  = 0;....padlen =
14430 20 30 3b 0a 09 09 7d 0a 09 7d 20 65 6c 73 65 20   0;...}..} else 
14440 7b 0a 09 09 74 6d 70 62 75 66 20 3d 20 62 75 66  {...tmpbuf = buf
14450 3b 0a 09 09 74 6d 70 62 75 66 6c 65 6e 20 3d 20  ;...tmpbuflen = 
14460 62 75 66 6c 65 6e 3b 0a 09 09 66 72 65 65 5f 74  buflen;...free_t
14470 6d 70 62 75 66 20 3d 20 30 3b 0a 09 09 70 61 64  mpbuf = 0;...pad
14480 6c 65 6e 20 3d 20 30 3b 0a 09 7d 0a 0a 09 2f 2a  len = 0;..}.../*
14490 20 42 65 67 69 6e 20 74 72 61 6e 73 61 63 74 69   Begin transacti
144a0 6f 6e 20 2a 2f 0a 09 63 61 63 6b 65 79 5f 62 65  on */..cackey_be
144b0 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  gin_transaction(
144c0 73 6c 6f 74 29 3b 0a 0a 09 2f 2a 20 53 65 6c 65  slot);.../* Sele
144d0 63 74 20 63 6f 72 72 65 63 74 20 61 70 70 6c 65  ct correct apple
144e0 74 20 2a 2f 0a 09 73 77 69 74 63 68 20 28 69 64  t */..switch (id
144f0 5f 74 79 70 65 29 20 7b 0a 09 09 63 61 73 65 20  _type) {...case 
14500 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43  CACKEY_ID_TYPE_C
14510 41 43 3a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  AC:....CACKEY_DE
14520 42 55 47 5f 50 52 49 4e 54 46 28 22 53 65 6c 65  BUG_PRINTF("Sele
14530 63 74 69 6e 67 20 61 70 70 6c 65 74 20 66 6f 75  cting applet fou
14540 6e 64 20 61 74 20 25 70 20 2e 2e 2e 22 2c 20 69  nd at %p ...", i
14550 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64  dentity->pcsc_id
14560 65 6e 74 69 74 79 2d 3e 63 61 72 64 2e 63 61 63  entity->card.cac
14570 2e 61 70 70 6c 65 74 29 3b 0a 09 09 09 63 61 63  .applet);....cac
14580 6b 65 79 5f 73 65 6c 65 63 74 5f 61 70 70 6c 65  key_select_apple
14590 74 28 73 6c 6f 74 2c 20 69 64 65 6e 74 69 74 79  t(slot, identity
145a0 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d  ->pcsc_identity-
145b0 3e 63 61 72 64 2e 63 61 63 2e 61 70 70 6c 65 74  >card.cac.applet
145c0 2c 20 73 69 7a 65 6f 66 28 69 64 65 6e 74 69 74  , sizeof(identit
145d0 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79  y->pcsc_identity
145e0 2d 3e 63 61 72 64 2e 63 61 63 2e 61 70 70 6c 65  ->card.cac.apple
145f0 74 29 29 3b 0a 0a 09 09 09 2f 2a 20 53 65 6c 65  t));...../* Sele
14600 63 74 20 63 6f 72 72 65 63 74 20 66 69 6c 65 20  ct correct file 
14610 2a 2f 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 6c  */....cackey_sel
14620 65 63 74 5f 66 69 6c 65 28 73 6c 6f 74 2c 20 69  ect_file(slot, i
14630 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64  dentity->pcsc_id
14640 65 6e 74 69 74 79 2d 3e 63 61 72 64 2e 63 61 63  entity->card.cac
14650 2e 66 69 6c 65 29 3b 0a 09 09 09 62 72 65 61 6b  .file);....break
14660 3b 0a 09 09 63 61 73 65 20 43 41 43 4b 45 59 5f  ;...case CACKEY_
14670 49 44 5f 54 59 50 45 5f 50 49 56 3a 0a 09 09 09  ID_TYPE_PIV:....
14680 64 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74  dyn_auth_templat
14690 65 5b 30 5d 20 3d 20 30 78 37 43 3b 0a 09 09 09  e[0] = 0x7C;....
146a0 64 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74  dyn_auth_templat
146b0 65 5b 31 5d 20 3d 20 30 78 38 32 3b 0a 09 09 09  e[1] = 0x82;....
146c0 64 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74  dyn_auth_templat
146d0 65 5b 32 5d 20 3d 20 28 28 74 6d 70 62 75 66 6c  e[2] = ((tmpbufl
146e0 65 6e 20 2b 20 36 29 20 26 20 30 78 66 66 30 30  en + 6) & 0xff00
146f0 29 20 3e 3e 20 38 3b 0a 09 09 09 64 79 6e 5f 61  ) >> 8;....dyn_a
14700 75 74 68 5f 74 65 6d 70 6c 61 74 65 5b 33 5d 20  uth_template[3] 
14710 3d 20 28 74 6d 70 62 75 66 6c 65 6e 20 2b 20 36  = (tmpbuflen + 6
14720 29 20 26 20 30 78 30 30 66 66 3b 0a 09 09 09 64  ) & 0x00ff;....d
14730 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74 65  yn_auth_template
14740 5b 34 5d 20 3d 20 30 78 38 32 3b 0a 09 09 09 64  [4] = 0x82;....d
14750 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74 65  yn_auth_template
14760 5b 35 5d 20 3d 20 30 78 30 30 3b 0a 09 09 09 64  [5] = 0x00;....d
14770 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74 65  yn_auth_template
14780 5b 36 5d 20 3d 20 30 78 38 31 3b 0a 09 09 09 64  [6] = 0x81;....d
14790 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74 65  yn_auth_template
147a0 5b 37 5d 20 3d 20 30 78 38 32 3b 0a 09 09 09 64  [7] = 0x82;....d
147b0 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74 65  yn_auth_template
147c0 5b 38 5d 20 3d 20 28 74 6d 70 62 75 66 6c 65 6e  [8] = (tmpbuflen
147d0 20 26 20 30 78 66 66 30 30 29 20 3e 3e 20 38 3b   & 0xff00) >> 8;
147e0 0a 09 09 09 64 79 6e 5f 61 75 74 68 5f 74 65 6d  ....dyn_auth_tem
147f0 70 6c 61 74 65 5b 39 5d 20 3d 20 74 6d 70 62 75  plate[9] = tmpbu
14800 66 6c 65 6e 20 26 20 30 78 30 30 66 66 3b 0a 0a  flen & 0x00ff;..
14810 09 09 09 64 79 6e 5f 61 75 74 68 5f 74 6d 70 62  ...dyn_auth_tmpb
14820 75 66 20 3d 20 6d 61 6c 6c 6f 63 28 74 6d 70 62  uf = malloc(tmpb
14830 75 66 6c 65 6e 20 2b 20 73 69 7a 65 6f 66 28 64  uflen + sizeof(d
14840 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74 65  yn_auth_template
14850 29 29 3b 0a 09 09 09 6d 65 6d 63 70 79 28 64 79  ));....memcpy(dy
14860 6e 5f 61 75 74 68 5f 74 6d 70 62 75 66 2c 20 64  n_auth_tmpbuf, d
14870 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74 65  yn_auth_template
14880 2c 20 73 69 7a 65 6f 66 28 64 79 6e 5f 61 75 74  , sizeof(dyn_aut
14890 68 5f 74 65 6d 70 6c 61 74 65 29 29 3b 0a 09 09  h_template));...
148a0 09 6d 65 6d 63 70 79 28 64 79 6e 5f 61 75 74 68  .memcpy(dyn_auth
148b0 5f 74 6d 70 62 75 66 20 2b 20 73 69 7a 65 6f 66  _tmpbuf + sizeof
148c0 28 64 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61  (dyn_auth_templa
148d0 74 65 29 2c 20 74 6d 70 62 75 66 2c 20 74 6d 70  te), tmpbuf, tmp
148e0 62 75 66 6c 65 6e 29 3b 0a 0a 09 09 09 69 66 20  buflen);.....if 
148f0 28 66 72 65 65 5f 74 6d 70 62 75 66 29 20 7b 0a  (free_tmpbuf) {.
14900 09 09 09 09 66 72 65 65 28 74 6d 70 62 75 66 29  ....free(tmpbuf)
14910 3b 0a 09 09 09 7d 0a 0a 09 09 09 74 6d 70 62 75  ;....}.....tmpbu
14920 66 6c 65 6e 20 2b 3d 20 73 69 7a 65 6f 66 28 64  flen += sizeof(d
14930 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74 65  yn_auth_template
14940 29 3b 0a 09 09 09 74 6d 70 62 75 66 20 3d 20 64  );....tmpbuf = d
14950 79 6e 5f 61 75 74 68 5f 74 6d 70 62 75 66 3b 0a  yn_auth_tmpbuf;.
14960 09 09 09 66 72 65 65 5f 74 6d 70 62 75 66 20 3d  ...free_tmpbuf =
14970 20 31 3b 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09   1;.....break;..
14980 09 63 61 73 65 20 43 41 43 4b 45 59 5f 49 44 5f  .case CACKEY_ID_
14990 54 59 50 45 5f 43 45 52 54 5f 4f 4e 4c 59 3a 0a  TYPE_CERT_ONLY:.
149a0 09 09 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 74  ...break;..}...t
149b0 6d 70 62 75 66 5f 73 20 3d 20 74 6d 70 62 75 66  mpbuf_s = tmpbuf
149c0 3b 0a 09 6f 75 74 62 75 66 5f 73 20 3d 20 6f 75  ;..outbuf_s = ou
149d0 74 62 75 66 3b 0a 09 77 68 69 6c 65 20 28 74 6d  tbuf;..while (tm
149e0 70 62 75 66 6c 65 6e 29 20 7b 0a 09 09 74 6d 70  pbuflen) {...tmp
149f0 6f 75 74 62 75 66 6c 65 6e 20 3d 20 6f 75 74 62  outbuflen = outb
14a00 75 66 6c 65 6e 3b 0a 0a 09 09 69 66 20 28 74 6d  uflen;....if (tm
14a10 70 62 75 66 6c 65 6e 20 3e 20 43 41 43 4b 45 59  pbuflen > CACKEY
14a20 5f 41 50 44 55 5f 4d 54 55 29 20 7b 0a 09 09 09  _APDU_MTU) {....
14a30 62 79 74 65 73 5f 74 6f 5f 73 65 6e 64 20 3d 20  bytes_to_send = 
14a40 43 41 43 4b 45 59 5f 41 50 44 55 5f 4d 54 55 3b  CACKEY_APDU_MTU;
14a50 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 62  ...} else {....b
14a60 79 74 65 73 5f 74 6f 5f 73 65 6e 64 20 3d 20 74  ytes_to_send = t
14a70 6d 70 62 75 66 6c 65 6e 3b 0a 09 09 7d 0a 0a 09  mpbuflen;...}...
14a80 09 73 65 6e 64 5f 72 65 74 20 3d 20 43 41 43 4b  .send_ret = CACK
14a90 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49  EY_PCSC_E_GENERI
14aa0 43 3b 0a 09 09 73 77 69 74 63 68 20 28 69 64 5f  C;...switch (id_
14ab0 74 79 70 65 29 20 7b 0a 09 09 09 63 61 73 65 20  type) {....case 
14ac0 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43  CACKEY_ID_TYPE_C
14ad0 41 43 3a 0a 09 09 09 09 69 66 20 28 74 6d 70 62  AC:.....if (tmpb
14ae0 75 66 6c 65 6e 20 3e 20 43 41 43 4b 45 59 5f 41  uflen > CACKEY_A
14af0 50 44 55 5f 4d 54 55 29 20 7b 0a 09 09 09 09 09  PDU_MTU) {......
14b00 70 31 20 3d 20 30 78 38 30 3b 0a 09 09 09 09 09  p1 = 0x80;......
14b10 6c 65 20 3d 20 30 78 30 30 3b 0a 09 09 09 09 7d  le = 0x00;.....}
14b20 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 70 31 20   else {......p1 
14b30 3d 20 30 78 30 30 3b 0a 09 09 09 09 09 6c 65 20  = 0x00;......le 
14b40 3d 20 30 78 30 30 3b 0a 09 09 09 09 7d 0a 0a 09  = 0x00;.....}...
14b50 09 09 09 73 65 6e 64 5f 72 65 74 20 3d 20 63 61  ...send_ret = ca
14b60 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 73  ckey_send_apdu(s
14b70 6c 6f 74 2c 20 47 53 43 49 53 5f 43 4c 41 53 53  lot, GSCIS_CLASS
14b80 5f 47 4c 4f 42 41 4c 5f 50 4c 41 54 46 4f 52 4d  _GLOBAL_PLATFORM
14b90 2c 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 53 49  , GSCIS_INSTR_SI
14ba0 47 4e 44 45 43 52 59 50 54 2c 20 70 31 2c 20 30  GNDECRYPT, p1, 0
14bb0 78 30 30 2c 20 62 79 74 65 73 5f 74 6f 5f 73 65  x00, bytes_to_se
14bc0 6e 64 2c 20 74 6d 70 62 75 66 2c 20 6c 65 2c 20  nd, tmpbuf, le, 
14bd0 26 72 65 73 70 63 6f 64 65 2c 20 6f 75 74 62 75  &respcode, outbu
14be0 66 2c 20 26 74 6d 70 6f 75 74 62 75 66 6c 65 6e  f, &tmpoutbuflen
14bf0 29 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  );.....break;...
14c00 09 63 61 73 65 20 43 41 43 4b 45 59 5f 49 44 5f  .case CACKEY_ID_
14c10 54 59 50 45 5f 50 49 56 3a 0a 09 09 09 09 69 66  TYPE_PIV:.....if
14c20 20 28 74 6d 70 62 75 66 6c 65 6e 20 3e 20 43 41   (tmpbuflen > CA
14c30 43 4b 45 59 5f 41 50 44 55 5f 4d 54 55 29 20 7b  CKEY_APDU_MTU) {
14c40 0a 09 09 09 09 09 63 6c 61 73 73 20 3d 20 30 78  ......class = 0x
14c50 31 30 3b 0a 09 09 09 09 09 6c 65 20 3d 20 30 78  10;......le = 0x
14c60 30 30 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b  00;.....} else {
14c70 0a 09 09 09 09 09 63 6c 61 73 73 20 3d 20 47 53  ......class = GS
14c80 43 49 53 5f 43 4c 41 53 53 5f 49 53 4f 37 38 31  CIS_CLASS_ISO781
14c90 36 3b 0a 09 09 09 09 09 6c 65 20 3d 20 32 35 36  6;......le = 256
14ca0 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 73 65 6e  ;.....}......sen
14cb0 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73  d_ret = cackey_s
14cc0 65 6e 64 5f 61 70 64 75 28 73 6c 6f 74 2c 20 63  end_apdu(slot, c
14cd0 6c 61 73 73 2c 20 4e 49 53 54 53 50 38 30 30 5f  lass, NISTSP800_
14ce0 37 33 5f 33 5f 49 4e 53 54 52 5f 47 45 4e 41 55  73_3_INSTR_GENAU
14cf0 54 48 2c 20 4e 49 53 54 53 50 38 30 30 5f 37 38  TH, NISTSP800_78
14d00 5f 33 5f 41 4c 47 4f 5f 52 53 41 32 30 34 38 2c  _3_ALGO_RSA2048,
14d10 20 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f   identity->pcsc_
14d20 69 64 65 6e 74 69 74 79 2d 3e 63 61 72 64 2e 70  identity->card.p
14d30 69 76 2e 6b 65 79 5f 69 64 2c 20 62 79 74 65 73  iv.key_id, bytes
14d40 5f 74 6f 5f 73 65 6e 64 2c 20 74 6d 70 62 75 66  _to_send, tmpbuf
14d50 2c 20 6c 65 2c 20 26 72 65 73 70 63 6f 64 65 2c  , le, &respcode,
14d60 20 6f 75 74 62 75 66 2c 20 26 74 6d 70 6f 75 74   outbuf, &tmpout
14d70 62 75 66 6c 65 6e 29 3b 0a 09 09 09 09 62 72 65  buflen);.....bre
14d80 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 41 43 4b  ak;....case CACK
14d90 45 59 5f 49 44 5f 54 59 50 45 5f 43 45 52 54 5f  EY_ID_TYPE_CERT_
14da0 4f 4e 4c 59 3a 0a 09 09 09 09 62 72 65 61 6b 3b  ONLY:.....break;
14db0 0a 09 09 7d 0a 0a 09 09 69 66 20 28 73 65 6e 64  ...}....if (send
14dc0 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50  _ret != CACKEY_P
14dd0 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 69  CSC_S_OK) {....i
14de0 66 20 28 66 72 65 65 5f 74 6d 70 62 75 66 29 20  f (free_tmpbuf) 
14df0 7b 0a 09 09 09 09 69 66 20 28 74 6d 70 62 75 66  {.....if (tmpbuf
14e00 5f 73 29 20 7b 0a 09 09 09 09 09 66 72 65 65 28  _s) {......free(
14e10 74 6d 70 62 75 66 5f 73 29 3b 0a 09 09 09 09 7d  tmpbuf_s);.....}
14e20 0a 09 09 09 7d 0a 0a 09 09 09 2f 2a 20 45 6e 64  ....}...../* End
14e30 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a   transaction */.
14e40 09 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72  ...cackey_end_tr
14e50 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b  ansaction(slot);
14e60 0a 0a 09 09 09 69 66 20 28 73 65 6e 64 5f 72 65  .....if (send_re
14e70 74 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43  t == CACKEY_PCSC
14e80 5f 45 5f 52 45 54 52 59 29 20 7b 0a 09 09 09 09  _E_RETRY) {.....
14e90 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
14ea0 4e 54 46 28 22 41 44 50 55 20 53 65 6e 64 69 6e  NTF("ADPU Sendin
14eb0 67 20 46 61 69 6c 65 64 20 2d 2d 20 72 65 74 72  g Failed -- retr
14ec0 79 69 6e 67 2e 22 29 3b 0a 0a 09 09 09 09 72 65  ying.");......re
14ed0 74 75 72 6e 28 63 61 63 6b 65 79 5f 73 69 67 6e  turn(cackey_sign
14ee0 64 65 63 72 79 70 74 28 73 6c 6f 74 2c 20 69 64  decrypt(slot, id
14ef0 65 6e 74 69 74 79 2c 20 62 75 66 2c 20 62 75 66  entity, buf, buf
14f00 6c 65 6e 2c 20 6f 75 74 62 75 66 2c 20 6f 75 74  len, outbuf, out
14f10 62 75 66 6c 65 6e 2c 20 70 61 64 49 6e 70 75 74  buflen, padInput
14f20 2c 20 75 6e 70 61 64 4f 75 74 70 75 74 29 29 3b  , unpadOutput));
14f30 0a 09 09 09 7d 0a 0a 09 09 09 43 41 43 4b 45 59  ....}.....CACKEY
14f40 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 41  _DEBUG_PRINTF("A
14f50 44 50 55 20 53 65 6e 64 69 6e 67 20 46 61 69 6c  DPU Sending Fail
14f60 65 64 20 2d 2d 20 72 65 74 75 72 6e 69 6e 67 20  ed -- returning 
14f70 69 6e 20 65 72 72 6f 72 2e 22 29 3b 0a 0a 09 09  in error.");....
14f80 09 69 66 20 28 72 65 73 70 63 6f 64 65 20 3d 3d  .if (respcode ==
14f90 20 30 78 36 39 38 32 20 7c 7c 20 72 65 73 70 63   0x6982 || respc
14fa0 6f 64 65 20 3d 3d 20 30 78 36 65 30 30 20 7c 7c  ode == 0x6e00 ||
14fb0 20 72 65 73 70 63 6f 64 65 20 3d 3d 20 30 78 36   respcode == 0x6
14fc0 64 30 30 29 20 7b 0a 09 09 09 09 69 66 20 28 72  d00) {.....if (r
14fd0 65 73 70 63 6f 64 65 20 3d 3d 20 30 78 36 65 30  espcode == 0x6e0
14fe0 30 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59  0) {......CACKEY
14ff0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 47  _DEBUG_PRINTF("G
15000 6f 74 20 5c 22 57 52 4f 4e 47 20 43 4c 41 53 53  ot \"WRONG CLASS
15010 5c 22 2c 20 74 68 69 73 20 6d 65 61 6e 73 20 77  \", this means w
15020 65 20 61 72 65 20 74 61 6c 6b 69 6e 67 20 74 6f  e are talking to
15030 20 74 68 65 20 77 72 6f 6e 67 20 6f 62 6a 65 63   the wrong objec
15040 74 20 28 6c 69 6b 65 6c 79 20 62 65 63 61 75 73  t (likely becaus
15050 65 20 74 68 65 20 63 61 72 64 20 77 65 6e 74 20  e the card went 
15060 61 77 61 79 29 20 2d 2d 20 72 65 73 65 74 74 69  away) -- resetti
15070 6e 67 22 29 3b 0a 09 09 09 09 7d 20 65 6c 73 65  ng");.....} else
15080 20 69 66 20 28 72 65 73 70 63 6f 64 65 20 3d 3d   if (respcode ==
15090 20 30 78 36 64 30 30 29 20 7b 0a 09 09 09 09 09   0x6d00) {......
150a0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
150b0 4e 54 46 28 22 47 6f 74 20 5c 22 49 4e 56 41 4c  NTF("Got \"INVAL
150c0 49 44 20 49 4e 53 54 52 55 43 54 49 4f 4e 5c 22  ID INSTRUCTION\"
150d0 2c 20 74 68 69 73 20 6d 65 61 6e 73 20 77 65 20  , this means we 
150e0 61 72 65 20 74 61 6c 6b 69 6e 67 20 74 6f 20 74  are talking to t
150f0 68 65 20 77 72 6f 6e 67 20 6f 62 6a 65 63 74 20  he wrong object 
15100 28 6c 69 6b 65 6c 79 20 62 65 63 61 75 73 65 20  (likely because 
15110 74 68 65 20 63 61 72 64 20 77 65 6e 74 20 61 77  the card went aw
15120 61 79 29 20 2d 2d 20 72 65 73 65 74 74 69 6e 67  ay) -- resetting
15130 22 29 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b  ");.....} else {
15140 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
15150 55 47 5f 50 52 49 4e 54 46 28 22 53 65 63 75 72  UG_PRINTF("Secur
15160 69 74 79 20 73 74 61 74 75 73 20 6e 6f 74 20 73  ity status not s
15170 61 74 69 73 69 66 69 65 64 20 28 72 65 73 70 63  atisified (respc
15180 6f 64 65 20 3d 20 30 78 25 30 34 78 29 2e 20 20  ode = 0x%04x).  
15190 52 65 74 75 72 6e 69 6e 67 20 4e 45 45 44 4c 4f  Returning NEEDLO
151a0 47 49 4e 22 2c 20 28 69 6e 74 29 20 72 65 73 70  GIN", (int) resp
151b0 63 6f 64 65 29 3b 0a 09 09 09 09 7d 0a 0a 09 09  code);.....}....
151c0 09 09 63 61 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c  ..cackey_mark_sl
151d0 6f 74 5f 72 65 73 65 74 28 73 6c 6f 74 29 3b 0a  ot_reset(slot);.
151e0 0a 09 09 09 09 63 61 63 6b 65 79 5f 64 65 74 65  .....cackey_dete
151f0 63 74 5f 61 6e 64 5f 73 65 6c 65 63 74 5f 72 6f  ct_and_select_ro
15200 6f 74 5f 61 70 70 6c 65 74 28 73 6c 6f 74 2c 20  ot_applet(slot, 
15210 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 55  CACKEY_ID_TYPE_U
15220 4e 4b 4e 4f 57 4e 29 3b 0a 0a 09 09 09 09 73 6c  NKNOWN);......sl
15230 6f 74 2d 3e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20  ot->token_flags 
15240 3d 20 43 4b 46 5f 4c 4f 47 49 4e 5f 52 45 51 55  = CKF_LOGIN_REQU
15250 49 52 45 44 3b 0a 0a 09 09 09 09 72 65 74 75 72  IRED;......retur
15260 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  n(CACKEY_PCSC_E_
15270 4e 45 45 44 4c 4f 47 49 4e 29 3b 0a 09 09 09 7d  NEEDLOGIN);....}
15280 0a 0a 09 09 09 69 66 20 28 73 65 6e 64 5f 72 65  .....if (send_re
15290 74 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43  t == CACKEY_PCSC
152a0 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 20  _E_TOKENABSENT) 
152b0 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  {.....CACKEY_DEB
152c0 55 47 5f 50 52 49 4e 54 46 28 22 54 6f 6b 65 6e  UG_PRINTF("Token
152d0 20 61 62 73 65 6e 74 2e 20 20 52 65 74 75 72 6e   absent.  Return
152e0 69 6e 67 20 54 4f 4b 45 4e 41 42 53 45 4e 54 22  ing TOKENABSENT"
152f0 29 3b 0a 0a 09 09 09 09 63 61 63 6b 65 79 5f 6d  );......cackey_m
15300 61 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74 28 73  ark_slot_reset(s
15310 6c 6f 74 29 3b 0a 0a 09 09 09 09 72 65 74 75 72  lot);......retur
15320 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  n(CACKEY_PCSC_E_
15330 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b 0a 09 09  TOKENABSENT);...
15340 09 7d 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  .}.....CACKEY_DE
15350 42 55 47 5f 50 52 49 4e 54 46 28 22 53 6f 6d 65  BUG_PRINTF("Some
15360 74 68 69 6e 67 20 77 65 6e 74 20 77 72 6f 6e 67  thing went wrong
15370 20 64 75 72 69 6e 67 20 73 69 67 6e 69 6e 67 2c   during signing,
15380 20 72 65 73 65 74 74 69 6e 67 20 74 68 65 20 73   resetting the s
15390 6c 6f 74 20 61 6e 64 20 68 6f 70 69 6e 67 20 66  lot and hoping f
153a0 6f 72 20 74 68 65 20 62 65 73 74 2e 22 29 3b 0a  or the best.");.
153b0 0a 09 09 09 63 61 63 6b 65 79 5f 70 63 73 63 5f  ....cackey_pcsc_
153c0 64 69 73 63 6f 6e 6e 65 63 74 28 29 3b 0a 0a 09  disconnect();...
153d0 09 09 63 61 63 6b 65 79 5f 70 63 73 63 5f 63 6f  ..cackey_pcsc_co
153e0 6e 6e 65 63 74 28 29 3b 0a 0a 09 09 09 63 61 63  nnect();.....cac
153f0 6b 65 79 5f 64 65 74 65 63 74 5f 61 6e 64 5f 73  key_detect_and_s
15400 65 6c 65 63 74 5f 72 6f 6f 74 5f 61 70 70 6c 65  elect_root_apple
15410 74 28 73 6c 6f 74 2c 20 43 41 43 4b 45 59 5f 49  t(slot, CACKEY_I
15420 44 5f 54 59 50 45 5f 55 4e 4b 4e 4f 57 4e 29 3b  D_TYPE_UNKNOWN);
15430 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b  .....return(CACK
15440 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49  EY_PCSC_E_GENERI
15450 43 29 3b 0a 09 09 7d 0a 0a 09 09 74 6d 70 62 75  C);...}....tmpbu
15460 66 20 2b 3d 20 62 79 74 65 73 5f 74 6f 5f 73 65  f += bytes_to_se
15470 6e 64 3b 0a 09 09 74 6d 70 62 75 66 6c 65 6e 20  nd;...tmpbuflen 
15480 2d 3d 20 62 79 74 65 73 5f 74 6f 5f 73 65 6e 64  -= bytes_to_send
15490 3b 0a 0a 09 09 6f 75 74 62 75 66 20 2b 3d 20 74  ;....outbuf += t
154a0 6d 70 6f 75 74 62 75 66 6c 65 6e 3b 0a 09 09 6f  mpoutbuflen;...o
154b0 75 74 62 75 66 6c 65 6e 20 2d 3d 20 74 6d 70 6f  utbuflen -= tmpo
154c0 75 74 62 75 66 6c 65 6e 3b 0a 09 09 72 65 74 76  utbuflen;...retv
154d0 61 6c 20 2b 3d 20 74 6d 70 6f 75 74 62 75 66 6c  al += tmpoutbufl
154e0 65 6e 3b 0a 09 7d 0a 0a 09 69 66 20 28 66 72 65  en;..}...if (fre
154f0 65 5f 74 6d 70 62 75 66 29 20 7b 0a 09 09 69 66  e_tmpbuf) {...if
15500 20 28 74 6d 70 62 75 66 5f 73 29 20 7b 0a 09 09   (tmpbuf_s) {...
15510 09 66 72 65 65 28 74 6d 70 62 75 66 5f 73 29 3b  .free(tmpbuf_s);
15520 0a 09 09 7d 0a 09 7d 0a 0a 09 6f 75 74 62 75 66  ...}..}...outbuf
15530 20 3d 20 6f 75 74 62 75 66 5f 73 3b 0a 0a 09 2f   = outbuf_s;.../
15540 2a 20 45 6e 64 20 74 72 61 6e 73 61 63 74 69 6f  * End transactio
15550 6e 20 2a 2f 0a 09 63 61 63 6b 65 79 5f 65 6e 64  n */..cackey_end
15560 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f  _transaction(slo
15570 74 29 3b 0a 0a 23 69 66 64 65 66 20 43 41 43 4b  t);..#ifdef CACK
15580 45 59 5f 50 41 52 41 4e 4f 49 44 0a 23 20 20 69  EY_PARANOID.#  i
15590 66 64 65 66 20 5f 50 4f 53 49 58 5f 53 53 49 5a  fdef _POSIX_SSIZ
155a0 45 5f 4d 41 58 0a 09 69 66 20 28 6f 75 74 62 75  E_MAX..if (outbu
155b0 66 6c 65 6e 20 3e 20 5f 50 4f 53 49 58 5f 53 53  flen > _POSIX_SS
155c0 49 5a 45 5f 4d 41 58 29 20 7b 0a 09 09 43 41 43  IZE_MAX) {...CAC
155d0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
155e0 28 22 4f 75 74 62 75 66 6c 65 6e 20 65 78 63 65  ("Outbuflen exce
155f0 65 64 73 20 6d 61 78 69 6d 75 6d 20 76 61 6c 75  eds maximum valu
15600 65 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20  e, returning in 
15610 66 61 69 6c 75 72 65 2e 20 28 6d 61 78 20 3d 20  failure. (max = 
15620 25 6c 69 2c 20 6f 75 74 62 75 66 6c 65 6e 20 3d  %li, outbuflen =
15630 20 25 6c 75 29 22 2c 20 28 6c 6f 6e 67 29 20 5f   %lu)", (long) _
15640 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58 2c  POSIX_SSIZE_MAX,
15650 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
15660 20 6f 75 74 62 75 66 6c 65 6e 29 3b 0a 0a 09 09   outbuflen);....
15670 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 23  return(-1);..}.#
15680 20 20 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a    endif.#endif..
15690 09 2f 2a 20 57 65 20 6d 75 73 74 20 72 65 6d 6f  ./* We must remo
156a0 76 65 20 74 68 65 20 22 37 43 22 20 74 61 67 20  ve the "7C" tag 
156b0 74 6f 20 67 65 74 20 74 6f 20 74 68 65 20 73 69  to get to the si
156c0 67 6e 61 74 75 72 65 20 2a 2f 0a 09 73 77 69 74  gnature */..swit
156d0 63 68 20 28 69 64 5f 74 79 70 65 29 20 7b 0a 09  ch (id_type) {..
156e0 09 63 61 73 65 20 43 41 43 4b 45 59 5f 49 44 5f  .case CACKEY_ID_
156f0 54 59 50 45 5f 50 49 56 3a 0a 09 09 09 6f 75 74  TYPE_PIV:....out
15700 62 75 66 5f 6c 65 6e 20 3d 20 72 65 74 76 61 6c  buf_len = retval
15710 3b 0a 09 09 09 6f 75 74 62 75 66 5f 70 20 3d 20  ;....outbuf_p = 
15720 63 61 63 6b 65 79 5f 72 65 61 64 5f 62 65 72 74  cackey_read_bert
15730 6c 76 5f 74 61 67 28 6f 75 74 62 75 66 2c 20 26  lv_tag(outbuf, &
15740 6f 75 74 62 75 66 5f 6c 65 6e 2c 20 30 78 37 43  outbuf_len, 0x7C
15750 2c 20 4e 55 4c 4c 2c 20 20 26 6f 75 74 62 75 66  , NULL,  &outbuf
15760 5f 6c 65 6e 29 3b 0a 09 09 09 69 66 20 28 6f 75  _len);....if (ou
15770 74 62 75 66 5f 70 20 3d 3d 20 4e 55 4c 4c 29 20  tbuf_p == NULL) 
15780 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  {.....CACKEY_DEB
15790 55 47 5f 50 52 49 4e 54 46 28 22 52 65 73 70 6f  UG_PRINTF("Respo
157a0 6e 73 65 20 66 72 6f 6d 20 50 49 56 20 66 6f 72  nse from PIV for
157b0 20 47 45 4e 45 52 41 54 45 20 41 55 54 48 45 4e   GENERATE AUTHEN
157c0 54 49 43 41 54 49 4f 4e 20 77 61 73 20 6e 6f 74  TICATION was not
157d0 20 61 20 30 78 37 43 20 74 61 67 2c 20 72 65 74   a 0x7C tag, ret
157e0 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
157f0 65 22 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e  e");......return
15800 28 2d 31 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 72  (-1);....}.....r
15810 65 74 76 61 6c 20 3d 20 6f 75 74 62 75 66 5f 6c  etval = outbuf_l
15820 65 6e 3b 0a 0a 09 09 09 6f 75 74 62 75 66 5f 6c  en;.....outbuf_l
15830 65 6e 20 3d 20 72 65 74 76 61 6c 3b 0a 09 09 09  en = retval;....
15840 6f 75 74 62 75 66 5f 70 20 3d 20 63 61 63 6b 65  outbuf_p = cacke
15850 79 5f 72 65 61 64 5f 62 65 72 74 6c 76 5f 74 61  y_read_bertlv_ta
15860 67 28 6f 75 74 62 75 66 2c 20 26 6f 75 74 62 75  g(outbuf, &outbu
15870 66 5f 6c 65 6e 2c 20 30 78 38 32 2c 20 4e 55 4c  f_len, 0x82, NUL
15880 4c 2c 20 20 26 6f 75 74 62 75 66 5f 6c 65 6e 29  L,  &outbuf_len)
15890 3b 0a 09 09 09 69 66 20 28 6f 75 74 62 75 66 5f  ;....if (outbuf_
158a0 70 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09  p == NULL) {....
158b0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
158c0 49 4e 54 46 28 22 52 65 73 70 6f 6e 73 65 20 66  INTF("Response f
158d0 72 6f 6d 20 50 49 56 20 66 6f 72 20 47 45 4e 45  rom PIV for GENE
158e0 52 41 54 45 20 41 55 54 48 45 4e 54 49 43 41 54  RATE AUTHENTICAT
158f0 49 4f 4e 20 77 61 73 20 6e 6f 74 20 61 20 30 78  ION was not a 0x
15900 38 32 20 77 69 74 68 69 6e 20 61 20 30 78 37 43  82 within a 0x7C
15910 20 74 61 67 2c 20 72 65 74 75 72 6e 69 6e 67 20   tag, returning 
15920 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09  in failure");...
15930 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09  ...return(-1);..
15940 09 09 7d 0a 0a 09 09 09 72 65 74 76 61 6c 20 3d  ..}.....retval =
15950 20 6f 75 74 62 75 66 5f 6c 65 6e 3b 0a 0a 09 09   outbuf_len;....
15960 09 62 72 65 61 6b 3b 0a 09 09 63 61 73 65 20 43  .break;...case C
15970 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43 41  ACKEY_ID_TYPE_CA
15980 43 3a 0a 09 09 63 61 73 65 20 43 41 43 4b 45 59  C:...case CACKEY
15990 5f 49 44 5f 54 59 50 45 5f 43 45 52 54 5f 4f 4e  _ID_TYPE_CERT_ON
159a0 4c 59 3a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 7d  LY:....break;..}
159b0 0a 0a 09 2f 2a 20 55 6e 70 61 64 20 72 65 70 6c  .../* Unpad repl
159c0 79 20 2a 2f 0a 09 69 66 20 28 75 6e 70 61 64 4f  y */..if (unpadO
159d0 75 74 70 75 74 29 20 7b 0a 09 09 69 66 20 28 72  utput) {...if (r
159e0 65 74 76 61 6c 20 3c 20 33 29 20 7b 0a 09 09 09  etval < 3) {....
159f0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
15a00 4e 54 46 28 22 52 65 70 6c 79 20 69 73 20 74 6f  NTF("Reply is to
15a10 6f 20 73 6d 61 6c 6c 2c 20 77 65 20 61 72 65 20  o small, we are 
15a20 6e 6f 74 20 61 62 6c 65 20 74 6f 20 75 6e 70 61  not able to unpa
15a30 64 20 2d 2d 20 70 61 73 73 69 6e 67 20 62 61 63  d -- passing bac
15a40 6b 20 61 6e 64 20 68 6f 70 69 6e 67 20 66 6f 72  k and hoping for
15a50 20 74 68 65 20 62 65 73 74 21 22 29 3b 0a 0a 09   the best!");...
15a60 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
15a70 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
15a80 20 69 6e 20 73 75 63 63 65 73 73 2c 20 72 65 74   in success, ret
15a90 76 61 6c 20 3d 20 25 6c 69 20 28 62 79 74 65 73  val = %li (bytes
15aa0 29 22 2c 20 28 6c 6f 6e 67 29 20 72 65 74 76 61  )", (long) retva
15ab0 6c 29 3b 0a 09 09 09 72 65 74 75 72 6e 28 72 65  l);....return(re
15ac0 74 76 61 6c 29 3b 0a 09 09 7d 0a 0a 09 09 69 66  tval);...}....if
15ad0 20 28 6f 75 74 62 75 66 5b 30 5d 20 21 3d 20 30   (outbuf[0] != 0
15ae0 78 30 30 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  x00) {....CACKEY
15af0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55  _DEBUG_PRINTF("U
15b00 6e 72 65 63 6f 67 6e 69 7a 65 64 20 70 61 64 64  nrecognized padd
15b10 69 6e 67 20 73 63 68 65 6d 65 20 2d 2d 20 70 61  ing scheme -- pa
15b20 73 73 69 6e 67 20 62 61 63 6b 20 61 6e 64 20 68  ssing back and h
15b30 6f 70 69 6e 67 20 66 6f 72 20 74 68 65 20 62 65  oping for the be
15b40 73 74 21 22 29 3b 0a 0a 09 09 09 43 41 43 4b 45  st!");.....CACKE
15b50 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
15b60 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 73 75 63  Returning in suc
15b70 63 65 73 73 2c 20 72 65 74 76 61 6c 20 3d 20 25  cess, retval = %
15b80 6c 69 20 28 62 79 74 65 73 29 22 2c 20 28 6c 6f  li (bytes)", (lo
15b90 6e 67 29 20 72 65 74 76 61 6c 29 3b 0a 09 09 09  ng) retval);....
15ba0 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a  return(retval);.
15bb0 09 09 7d 0a 0a 09 09 62 6c 6f 63 6b 74 79 70 65  ..}....blocktype
15bc0 20 3d 20 6f 75 74 62 75 66 5b 31 5d 3b 0a 09 09   = outbuf[1];...
15bd0 75 6e 70 61 64 6f 66 66 73 65 74 20 3d 20 30 3b  unpadoffset = 0;
15be0 0a 0a 09 09 73 77 69 74 63 68 20 28 62 6c 6f 63  ....switch (bloc
15bf0 6b 74 79 70 65 29 20 7b 0a 09 09 09 63 61 73 65  ktype) {....case
15c00 20 30 78 30 30 3a 0a 09 09 09 09 2f 2a 20 50 61   0x00:...../* Pa
15c10 64 64 69 6e 67 20 53 63 68 65 6d 65 20 31 2c 20  dding Scheme 1, 
15c20 74 68 65 20 66 69 72 73 74 20 6e 6f 6e 2d 7a 65  the first non-ze
15c30 72 6f 20 62 79 74 65 20 69 73 20 74 68 65 20 73  ro byte is the s
15c40 74 61 72 74 20 6f 66 20 64 61 74 61 20 2a 2f 0a  tart of data */.
15c50 09 09 09 09 66 6f 72 20 28 75 6e 70 61 64 6f 66  ....for (unpadof
15c60 66 73 65 74 20 3d 20 32 3b 20 75 6e 70 61 64 6f  fset = 2; unpado
15c70 66 66 73 65 74 20 3c 20 72 65 74 76 61 6c 3b 20  ffset < retval; 
15c80 75 6e 70 61 64 6f 66 66 73 65 74 2b 2b 29 20 7b  unpadoffset++) {
15c90 0a 09 09 09 09 09 69 66 20 28 6f 75 74 62 75 66  ......if (outbuf
15ca0 5b 75 6e 70 61 64 6f 66 66 73 65 74 5d 20 21 3d  [unpadoffset] !=
15cb0 20 30 78 30 30 29 20 7b 0a 09 09 09 09 09 09 62   0x00) {.......b
15cc0 72 65 61 6b 3b 0a 09 09 09 09 09 7d 0a 09 09 09  reak;......}....
15cd0 09 7d 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .}.....break;...
15ce0 09 63 61 73 65 20 30 78 30 31 3a 0a 09 09 09 09  .case 0x01:.....
15cf0 2f 2a 20 50 61 64 64 69 6e 67 20 53 63 68 65 6d  /* Padding Schem
15d00 65 20 32 2c 20 70 61 64 20 62 79 74 65 73 20 61  e 2, pad bytes a
15d10 72 65 20 30 78 46 46 20 66 6f 6c 6c 6f 77 65 64  re 0xFF followed
15d20 20 62 79 20 30 78 30 30 20 2a 2f 0a 09 09 09 09   by 0x00 */.....
15d30 66 6f 72 20 28 75 6e 70 61 64 6f 66 66 73 65 74  for (unpadoffset
15d40 20 3d 20 32 3b 20 75 6e 70 61 64 6f 66 66 73 65   = 2; unpadoffse
15d50 74 20 3c 20 72 65 74 76 61 6c 3b 20 75 6e 70 61  t < retval; unpa
15d60 64 6f 66 66 73 65 74 2b 2b 29 20 7b 0a 09 09 09  doffset++) {....
15d70 09 09 69 66 20 28 6f 75 74 62 75 66 5b 75 6e 70  ..if (outbuf[unp
15d80 61 64 6f 66 66 73 65 74 5d 20 21 3d 20 30 78 46  adoffset] != 0xF
15d90 46 29 20 7b 0a 09 09 09 09 09 09 69 66 20 28 6f  F) {.......if (o
15da0 75 74 62 75 66 5b 75 6e 70 61 64 6f 66 66 73 65  utbuf[unpadoffse
15db0 74 5d 20 3d 3d 20 30 78 30 30 29 20 7b 0a 09 09  t] == 0x00) {...
15dc0 09 09 09 09 09 75 6e 70 61 64 6f 66 66 73 65 74  .....unpadoffset
15dd0 2b 2b 3b 0a 0a 09 09 09 09 09 09 09 62 72 65 61  ++;.........brea
15de0 6b 3b 0a 09 09 09 09 09 09 7d 20 65 6c 73 65 20  k;.......} else 
15df0 7b 0a 09 09 09 09 09 09 09 43 41 43 4b 45 59 5f  {........CACKEY_
15e00 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 49 6e  DEBUG_PRINTF("In
15e10 76 61 6c 69 64 20 70 61 64 64 69 6e 67 20 64 61  valid padding da
15e20 74 61 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e  ta found, return
15e30 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 2c 20  ing in failure, 
15e40 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e  should have been
15e50 20 30 78 30 30 20 66 6f 75 6e 64 20 30 78 25 30   0x00 found 0x%0
15e60 32 78 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 69  2x", (unsigned i
15e70 6e 74 29 20 6f 75 74 62 75 66 5b 75 6e 70 61 64  nt) outbuf[unpad
15e80 6f 66 66 73 65 74 5d 29 3b 0a 0a 09 09 09 09 09  offset]);.......
15e90 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09  ..return(-1);...
15ea0 09 09 09 09 7d 0a 09 09 09 09 09 7d 20 65 6c 73  ....}......} els
15eb0 65 20 7b 0a 09 09 09 09 09 09 43 41 43 4b 45 59  e {.......CACKEY
15ec0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 49  _DEBUG_PRINTF("I
15ed0 6e 76 61 6c 69 64 20 70 61 64 64 69 6e 67 20 64  nvalid padding d
15ee0 61 74 61 20 66 6f 75 6e 64 2c 20 72 65 74 75 72  ata found, retur
15ef0 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 2c  ning in failure,
15f00 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65   should have bee
15f10 6e 20 30 78 46 46 20 66 6f 75 6e 64 20 30 78 25  n 0xFF found 0x%
15f20 30 32 78 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  02x", (unsigned 
15f30 69 6e 74 29 20 6f 75 74 62 75 66 5b 75 6e 70 61  int) outbuf[unpa
15f40 64 6f 66 66 73 65 74 5d 29 3b 0a 0a 09 09 09 09  doffset]);......
15f50 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09  ..return(-1);...
15f60 09 09 09 7d 0a 09 09 09 09 7d 0a 09 09 09 09 62  ...}.....}.....b
15f70 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 30 78  reak;....case 0x
15f80 30 32 3a 0a 09 09 09 09 2f 2a 20 50 61 64 64 69  02:...../* Paddi
15f90 6e 67 20 53 63 68 65 6d 65 20 33 2c 20 70 61 64  ng Scheme 3, pad
15fa0 20 62 79 74 65 73 20 61 72 65 20 6e 6f 6e 2d 7a   bytes are non-z
15fb0 65 72 6f 20 66 69 72 73 74 20 7a 65 72 6f 20 62  ero first zero b
15fc0 79 74 65 20 66 6f 75 6e 64 20 69 73 20 74 68 65  yte found is the
15fd0 20 73 65 70 65 72 61 74 6f 72 20 62 79 74 65 20   seperator byte 
15fe0 2a 2f 0a 09 09 09 09 66 6f 72 20 28 75 6e 70 61  */.....for (unpa
15ff0 64 6f 66 66 73 65 74 20 3d 20 32 3b 20 75 6e 70  doffset = 2; unp
16000 61 64 6f 66 66 73 65 74 20 3c 20 72 65 74 76 61  adoffset < retva
16010 6c 3b 20 75 6e 70 61 64 6f 66 66 73 65 74 2b 2b  l; unpadoffset++
16020 29 20 7b 0a 09 09 09 09 09 69 66 20 28 6f 75 74  ) {......if (out
16030 62 75 66 5b 75 6e 70 61 64 6f 66 66 73 65 74 5d  buf[unpadoffset]
16040 20 3d 3d 20 30 78 30 30 29 20 7b 0a 09 09 09 09   == 0x00) {.....
16050 09 09 75 6e 70 61 64 6f 66 66 73 65 74 2b 2b 3b  ..unpadoffset++;
16060 0a 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09  ........break;..
16070 09 09 09 09 7d 0a 09 09 09 09 7d 0a 09 09 09 09  ....}.....}.....
16080 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09 69 66  break;...}....if
16090 20 28 75 6e 70 61 64 6f 66 66 73 65 74 20 3e 20   (unpadoffset > 
160a0 72 65 74 76 61 6c 29 20 7b 0a 09 09 09 43 41 43  retval) {....CAC
160b0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
160c0 28 22 4f 66 66 73 65 74 20 67 72 65 61 74 65 72  ("Offset greater
160d0 20 74 68 61 6e 20 72 65 70 6c 79 20 73 69 7a 65   than reply size
160e0 2c 20 61 62 6f 72 74 69 6e 67 2e 20 20 28 75 6e  , aborting.  (un
160f0 70 61 64 6f 66 66 73 65 74 20 3d 20 25 6c 75 2c  padoffset = %lu,
16100 20 72 65 74 76 61 6c 20 3d 20 25 6c 75 29 22 2c   retval = %lu)",
16110 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
16120 20 75 6e 70 61 64 6f 66 66 73 65 74 2c 20 28 75   unpadoffset, (u
16130 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 72 65  nsigned long) re
16140 74 76 61 6c 29 3b 0a 0a 09 09 09 72 65 74 75 72  tval);.....retur
16150 6e 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09 09 43 41  n(-1);...}....CA
16160 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
16170 42 55 46 28 22 50 61 64 64 65 64 3a 22 2c 20 6f  BUF("Padded:", o
16180 75 74 62 75 66 2c 20 72 65 74 76 61 6c 29 3b 0a  utbuf, retval);.
16190 0a 09 09 72 65 74 76 61 6c 20 2d 3d 20 75 6e 70  ...retval -= unp
161a0 61 64 6f 66 66 73 65 74 3b 0a 09 09 6d 65 6d 6d  adoffset;...memm
161b0 6f 76 65 28 6f 75 74 62 75 66 2c 20 6f 75 74 62  ove(outbuf, outb
161c0 75 66 20 2b 20 75 6e 70 61 64 6f 66 66 73 65 74  uf + unpadoffset
161d0 2c 20 72 65 74 76 61 6c 29 3b 0a 0a 09 09 43 41  , retval);....CA
161e0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
161f0 42 55 46 28 22 55 6e 70 61 64 64 65 64 3a 22 2c  BUF("Unpadded:",
16200 20 6f 75 74 62 75 66 2c 20 72 65 74 76 61 6c 29   outbuf, retval)
16210 3b 0a 09 7d 0a 0a 0a 09 43 41 43 4b 45 59 5f 44  ;..}....CACKEY_D
16220 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
16230 75 72 6e 69 6e 67 20 69 6e 20 73 75 63 63 65 73  urning in succes
16240 73 2c 20 72 65 74 76 61 6c 20 3d 20 25 6c 69 20  s, retval = %li 
16250 28 62 79 74 65 73 29 22 2c 20 28 6c 6f 6e 67 29  (bytes)", (long)
16260 20 72 65 74 76 61 6c 29 3b 0a 0a 09 72 65 74 75   retval);...retu
16270 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 2f  rn(retval);.}../
16280 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a  *. * SYNPOSIS. *
16290 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41       .... *. * A
162a0 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20  RGUMENTS. *     
162b0 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e  .... *. * RETURN
162c0 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e   VALUE. *     ..
162d0 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a  .. *. * NOTES. *
162e0 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a       .... *. */.
162f0 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65  static cackey_re
16300 74 20 63 61 63 6b 65 79 5f 74 6f 6b 65 6e 5f 70  t cackey_token_p
16310 72 65 73 65 6e 74 28 73 74 72 75 63 74 20 63 61  resent(struct ca
16320 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29  ckey_slot *slot)
16330 20 7b 0a 09 63 61 63 6b 65 79 5f 72 65 74 20 70   {..cackey_ret p
16340 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 3b  csc_connect_ret;
16350 0a 09 44 57 4f 52 44 20 72 65 61 64 65 72 5f 6c  ..DWORD reader_l
16360 65 6e 20 3d 20 30 2c 20 73 74 61 74 65 20 3d 20  en = 0, state = 
16370 30 2c 20 70 72 6f 74 6f 63 6f 6c 20 3d 20 30 2c  0, protocol = 0,
16380 20 61 74 72 5f 6c 65 6e 3b 0a 09 42 59 54 45 20   atr_len;..BYTE 
16390 61 74 72 5b 4d 41 58 5f 41 54 52 5f 53 49 5a 45  atr[MAX_ATR_SIZE
163a0 5d 3b 0a 09 4c 4f 4e 47 20 73 74 61 74 75 73 5f  ];..LONG status_
163b0 72 65 74 2c 20 73 63 61 72 64 5f 72 65 63 6f 6e  ret, scard_recon
163c0 6e 5f 72 65 74 3b 0a 09 4c 50 53 54 52 20 2a 72  n_ret;..LPSTR *r
163d0 65 61 64 65 72 5f 6e 61 6d 65 3b 0a 0a 09 43 41  eader_name;...CA
163e0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
163f0 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
16400 69 66 20 28 73 6c 6f 74 2d 3e 69 6e 74 65 72 6e  if (slot->intern
16410 61 6c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  al) {...CACKEY_D
16420 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
16430 75 72 6e 69 6e 67 20 74 6f 6b 65 6e 20 70 72 65  urning token pre
16440 73 65 6e 74 20 28 69 6e 74 65 72 6e 61 6c 20 74  sent (internal t
16450 6f 6b 65 6e 29 22 29 3b 0a 0a 09 09 72 65 74 75  oken)");....retu
16460 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  rn(CACKEY_PCSC_S
16470 5f 54 4f 4b 45 4e 50 52 45 53 45 4e 54 29 3b 0a  _TOKENPRESENT);.
16480 09 7d 0a 0a 09 70 63 73 63 5f 63 6f 6e 6e 65 63  .}...pcsc_connec
16490 74 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 63  t_ret = cackey_c
164a0 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73 6c 6f 74  onnect_card(slot
164b0 29 3b 0a 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 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
164f0 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f  RINTF("Unable to
16500 20 63 6f 6e 6e 65 63 74 20 74 6f 20 63 61 72 64   connect to card
16510 2c 20 72 65 74 75 72 6e 69 6e 67 20 74 6f 6b 65  , returning toke
16520 6e 20 61 62 73 65 6e 74 22 29 3b 0a 0a 09 09 72  n absent");....r
16530 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
16540 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29  C_E_TOKENABSENT)
16550 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
16560 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
16570 69 6e 67 20 53 43 61 72 64 53 74 61 74 75 73 28  ing SCardStatus(
16580 29 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 63  ) to determine c
16590 61 72 64 20 73 74 61 74 75 73 22 29 3b 0a 0a 09  ard status");...
165a0 61 74 72 5f 6c 65 6e 20 3d 20 73 69 7a 65 6f 66  atr_len = sizeof
165b0 28 61 74 72 29 3b 0a 09 73 74 61 74 75 73 5f 72  (atr);..status_r
165c0 65 74 20 3d 20 53 43 61 72 64 53 74 61 74 75 73  et = SCardStatus
165d0 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64  (slot->pcsc_card
165e0 2c 20 4e 55 4c 4c 2c 20 26 72 65 61 64 65 72 5f  , NULL, &reader_
165f0 6c 65 6e 2c 20 26 73 74 61 74 65 2c 20 26 70 72  len, &state, &pr
16600 6f 74 6f 63 6f 6c 2c 20 61 74 72 2c 20 26 61 74  otocol, atr, &at
16610 72 5f 6c 65 6e 29 3b 0a 20 0a 09 69 66 20 28 73  r_len);. ..if (s
16620 74 61 74 75 73 5f 72 65 74 20 3d 3d 20 53 43 41  tatus_ret == SCA
16630 52 44 5f 45 5f 49 4e 53 55 46 46 49 43 49 45 4e  RD_E_INSUFFICIEN
16640 54 5f 42 55 46 46 45 52 29 20 7b 0a 09 09 43 41  T_BUFFER) {...CA
16650 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
16660 46 28 22 53 63 61 72 64 53 74 61 74 75 73 28 29  F("ScardStatus()
16670 20 72 65 74 75 72 6e 65 64 20 53 43 41 52 44 5f   returned SCARD_
16680 45 5f 49 4e 53 55 46 46 49 43 49 45 4e 54 5f 42  E_INSUFFICIENT_B
16690 55 46 46 45 52 2c 20 61 73 73 75 6d 69 6e 67 20  UFFER, assuming 
166a0 74 68 69 73 20 69 73 20 61 20 62 75 67 20 28 65  this is a bug (e
166b0 2e 67 2e 2c 20 47 6f 6f 67 6c 65 20 50 43 53 43  .g., Google PCSC
166c0 29 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  ) implementation
166d0 20 61 6e 64 20 72 65 74 72 79 69 6e 67 22 29 3b   and retrying");
166e0 0a 0a 09 09 61 74 72 5f 6c 65 6e 20 3d 20 73 69  ....atr_len = si
166f0 7a 65 6f 66 28 61 74 72 29 3b 0a 0a 09 09 72 65  zeof(atr);....re
16700 61 64 65 72 5f 6c 65 6e 20 3d 20 33 32 37 36 38  ader_len = 32768
16710 3b 0a 09 09 72 65 61 64 65 72 5f 6e 61 6d 65 20  ;...reader_name 
16720 3d 20 6d 61 6c 6c 6f 63 28 72 65 61 64 65 72 5f  = malloc(reader_
16730 6c 65 6e 29 3b 0a 0a 09 09 73 74 61 74 75 73 5f  len);....status_
16740 72 65 74 20 3d 20 53 43 61 72 64 53 74 61 74 75  ret = SCardStatu
16750 73 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72  s(slot->pcsc_car
16760 64 2c 20 72 65 61 64 65 72 5f 6e 61 6d 65 2c 20  d, reader_name, 
16770 26 72 65 61 64 65 72 5f 6c 65 6e 2c 20 26 73 74  &reader_len, &st
16780 61 74 65 2c 20 26 70 72 6f 74 6f 63 6f 6c 2c 20  ate, &protocol, 
16790 61 74 72 2c 20 26 61 74 72 5f 6c 65 6e 29 3b 0a  atr, &atr_len);.
167a0 0a 09 09 66 72 65 65 28 72 65 61 64 65 72 5f 6e  ...free(reader_n
167b0 61 6d 65 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73  ame);..}...if (s
167c0 74 61 74 75 73 5f 72 65 74 20 3d 3d 20 53 43 41  tatus_ret == SCA
167d0 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 48 41 4e  RD_E_INVALID_HAN
167e0 44 4c 45 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  DLE) {...CACKEY_
167f0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43  DEBUG_PRINTF("SC
16800 61 72 64 53 74 61 74 75 73 28 29 20 72 65 74 75  ardStatus() retu
16810 72 6e 65 64 20 53 43 41 52 44 5f 45 5f 49 4e 56  rned SCARD_E_INV
16820 41 4c 49 44 5f 48 41 4e 44 4c 45 2c 20 6d 61 72  ALID_HANDLE, mar
16830 6b 69 6e 67 20 61 73 20 6e 6f 74 20 61 6c 72 65  king as not alre
16840 61 64 79 20 63 6f 6e 6e 65 63 74 65 64 20 61 6e  ady connected an
16850 64 20 74 72 79 69 6e 67 20 61 67 61 69 6e 22 29  d trying again")
16860 3b 0a 09 09 63 61 63 6b 65 79 5f 6d 61 72 6b 5f  ;...cackey_mark_
16870 73 6c 6f 74 5f 72 65 73 65 74 28 73 6c 6f 74 29  slot_reset(slot)
16880 3b 0a 0a 09 09 70 63 73 63 5f 63 6f 6e 6e 65 63  ;....pcsc_connec
16890 74 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 63  t_ret = cackey_c
168a0 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73 6c 6f 74  onnect_card(slot
168b0 29 3b 0a 09 09 69 66 20 28 70 63 73 63 5f 63 6f  );...if (pcsc_co
168c0 6e 6e 65 63 74 5f 72 65 74 20 21 3d 20 43 41 43  nnect_ret != CAC
168d0 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b  KEY_PCSC_S_OK) {
168e0 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
168f0 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20  _PRINTF("Unable 
16900 74 6f 20 63 6f 6e 6e 65 63 74 20 74 6f 20 63 61  to connect to ca
16910 72 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 74 6f  rd, returning to
16920 6b 65 6e 20 61 62 73 65 6e 74 22 29 3b 0a 0a 09  ken absent");...
16930 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
16940 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45  PCSC_E_TOKENABSE
16950 4e 54 29 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b  NT);...}....CACK
16960 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
16970 22 43 61 6c 6c 69 6e 67 20 53 43 61 72 64 53 74  "Calling SCardSt
16980 61 74 75 73 28 29 20 61 67 61 69 6e 22 29 3b 0a  atus() again");.
16990 0a 09 09 61 74 72 5f 6c 65 6e 20 3d 20 73 69 7a  ...atr_len = siz
169a0 65 6f 66 28 61 74 72 29 3b 0a 09 09 73 74 61 74  eof(atr);...stat
169b0 75 73 5f 72 65 74 20 3d 20 53 43 61 72 64 53 74  us_ret = SCardSt
169c0 61 74 75 73 28 73 6c 6f 74 2d 3e 70 63 73 63 5f  atus(slot->pcsc_
169d0 63 61 72 64 2c 20 4e 55 4c 4c 2c 20 26 72 65 61  card, NULL, &rea
169e0 64 65 72 5f 6c 65 6e 2c 20 26 73 74 61 74 65 2c  der_len, &state,
169f0 20 26 70 72 6f 74 6f 63 6f 6c 2c 20 61 74 72 2c   &protocol, atr,
16a00 20 26 61 74 72 5f 6c 65 6e 29 3b 0a 09 7d 0a 0a   &atr_len);..}..
16a10 09 69 66 20 28 73 74 61 74 75 73 5f 72 65 74 20  .if (status_ret 
16a20 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45  != SCARD_S_SUCCE
16a30 53 53 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d  SS) {...cackey_m
16a40 61 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74 28 73  ark_slot_reset(s
16a50 6c 6f 74 29 3b 0a 0a 09 09 69 66 20 28 73 74 61  lot);....if (sta
16a60 74 75 73 5f 72 65 74 20 3d 3d 20 53 43 41 52 44  tus_ret == SCARD
16a70 5f 57 5f 52 45 53 45 54 5f 43 41 52 44 29 20 7b  _W_RESET_CARD) {
16a80 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
16a90 5f 50 52 49 4e 54 46 28 22 52 65 73 65 74 20 72  _PRINTF("Reset r
16aa0 65 71 75 69 72 65 64 2c 20 70 6c 65 61 73 65 20  equired, please 
16ab0 68 6f 6c 64 2e 2e 2e 22 29 3b 0a 0a 09 09 09 73  hold...");.....s
16ac0 63 61 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 74 20  card_reconn_ret 
16ad0 3d 20 63 61 63 6b 65 79 5f 72 65 63 6f 6e 6e 65  = cackey_reconne
16ae0 63 74 5f 63 61 72 64 28 73 6c 6f 74 2c 20 53 43  ct_card(slot, SC
16af0 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 20  ARD_PROTOCOL_T0 
16b00 7c 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c  | SCARD_PROTOCOL
16b10 5f 54 31 29 3b 0a 09 09 09 69 66 20 28 73 63 61  _T1);....if (sca
16b20 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 74 20 3d 3d  rd_reconn_ret ==
16b30 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53   SCARD_S_SUCCESS
16b40 29 20 7b 0a 09 09 09 09 2f 2a 20 52 65 2d 65 73  ) {...../* Re-es
16b50 74 61 62 6c 69 73 68 20 74 72 61 6e 73 61 63 74  tablish transact
16b60 69 6f 6e 2c 20 69 66 20 69 74 20 77 61 73 20 70  ion, if it was p
16b70 72 65 73 65 6e 74 20 2a 2f 0a 09 09 09 09 69 66  resent */.....if
16b80 20 28 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74   (slot->transact
16b90 69 6f 6e 5f 64 65 70 74 68 20 3e 20 30 29 20 7b  ion_depth > 0) {
16ba0 0a 09 09 09 09 09 73 6c 6f 74 2d 3e 74 72 61 6e  ......slot->tran
16bb0 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 2d 2d 3b  saction_depth--;
16bc0 0a 09 09 09 09 09 73 6c 6f 74 2d 3e 74 72 61 6e  ......slot->tran
16bd0 73 61 63 74 69 6f 6e 5f 6e 65 65 64 5f 68 77 5f  saction_need_hw_
16be0 6c 6f 63 6b 20 3d 20 31 3b 0a 09 09 09 09 09 63  lock = 1;......c
16bf0 61 63 6b 65 79 5f 62 65 67 69 6e 5f 74 72 61 6e  ackey_begin_tran
16c00 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 09  saction(slot);..
16c10 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59  ...}......CACKEY
16c20 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
16c30 65 73 65 74 20 73 75 63 63 65 73 73 66 75 6c 2c  eset successful,
16c40 20 72 65 71 75 65 72 79 69 6e 67 22 29 3b 0a 09   requerying");..
16c50 09 09 09 73 74 61 74 75 73 5f 72 65 74 20 3d 20  ...status_ret = 
16c60 53 43 61 72 64 53 74 61 74 75 73 28 73 6c 6f 74  SCardStatus(slot
16c70 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 4e 55 4c  ->pcsc_card, NUL
16c80 4c 2c 20 26 72 65 61 64 65 72 5f 6c 65 6e 2c 20  L, &reader_len, 
16c90 26 73 74 61 74 65 2c 20 26 70 72 6f 74 6f 63 6f  &state, &protoco
16ca0 6c 2c 20 61 74 72 2c 20 26 61 74 72 5f 6c 65 6e  l, atr, &atr_len
16cb0 29 3b 0a 09 09 09 09 69 66 20 28 73 74 61 74 75  );.....if (statu
16cc0 73 5f 72 65 74 20 21 3d 20 53 43 41 52 44 5f 53  s_ret != SCARD_S
16cd0 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09 09 09  _SUCCESS) {.....
16ce0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
16cf0 49 4e 54 46 28 22 53 74 69 6c 6c 20 75 6e 61 62  INTF("Still unab
16d00 6c 65 20 74 6f 20 71 75 65 72 79 20 63 61 72 64  le to query card
16d10 20 73 74 61 74 75 73 2c 20 72 65 74 75 72 6e 69   status, returni
16d20 6e 67 20 74 6f 6b 65 6e 20 61 62 73 65 6e 74 2e  ng token absent.
16d30 20 20 53 43 61 72 64 53 74 61 74 75 73 28 29 20    SCardStatus() 
16d40 3d 20 25 73 22 2c 20 43 41 43 4b 45 59 5f 44 45  = %s", CACKEY_DE
16d50 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52  BUG_FUNC_SCARDER
16d60 52 5f 54 4f 5f 53 54 52 28 73 74 61 74 75 73 5f  R_TO_STR(status_
16d70 72 65 74 29 29 3b 0a 0a 09 09 09 09 09 72 65 74  ret));.......ret
16d80 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
16d90 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b 0a  E_TOKENABSENT);.
16da0 09 09 09 09 7d 0a 09 09 09 7d 20 65 6c 73 65 20  ....}....} else 
16db0 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  {.....CACKEY_DEB
16dc0 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c  UG_PRINTF("Unabl
16dd0 65 20 74 6f 20 72 65 63 6f 6e 6e 65 63 74 20 74  e to reconnect t
16de0 6f 20 63 61 72 64 2c 20 72 65 74 75 72 6e 69 6e  o card, returnin
16df0 67 20 74 6f 6b 65 6e 20 61 62 73 65 6e 74 2e 20  g token absent. 
16e00 20 53 43 61 72 64 52 65 63 6f 6e 6e 65 63 74 28   SCardReconnect(
16e10 29 20 3d 20 25 73 22 2c 20 43 41 43 4b 45 59 5f  ) = %s", CACKEY_
16e20 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44  DEBUG_FUNC_SCARD
16e30 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64  ERR_TO_STR(scard
16e40 5f 72 65 63 6f 6e 6e 5f 72 65 74 29 29 3b 0a 0a  _reconn_ret));..
16e50 09 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ....return(CACKE
16e60 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42  Y_PCSC_E_TOKENAB
16e70 53 45 4e 54 29 3b 0a 09 09 09 7d 0a 09 09 7d 20  SENT);....}...} 
16e80 65 6c 73 65 20 7b 0a 09 09 09 43 41 43 4b 45 59  else {....CACKEY
16e90 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55  _DEBUG_PRINTF("U
16ea0 6e 61 62 6c 65 20 74 6f 20 71 75 65 72 79 20 63  nable to query c
16eb0 61 72 64 20 73 74 61 74 75 73 2c 20 72 65 74 75  ard status, retu
16ec0 72 6e 69 6e 67 20 74 6f 6b 65 6e 20 61 62 73 65  rning token abse
16ed0 6e 74 2e 20 20 53 43 61 72 64 53 74 61 74 75 73  nt.  SCardStatus
16ee0 28 29 20 3d 20 25 73 22 2c 20 43 41 43 4b 45 59  () = %s", CACKEY
16ef0 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52  _DEBUG_FUNC_SCAR
16f00 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 74 61 74  DERR_TO_STR(stat
16f10 75 73 5f 72 65 74 29 29 3b 0a 0a 09 09 09 72 65  us_ret));.....re
16f20 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
16f30 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b  _E_TOKENABSENT);
16f40 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28 28 73  ...}..}...if ((s
16f50 74 61 74 65 20 26 20 53 43 41 52 44 5f 41 42 53  tate & SCARD_ABS
16f60 45 4e 54 29 20 3d 3d 20 53 43 41 52 44 5f 41 42  ENT) == SCARD_AB
16f70 53 45 4e 54 29 20 7b 0a 09 09 43 41 43 4b 45 59  SENT) {...CACKEY
16f80 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
16f90 61 72 64 20 69 73 20 61 62 73 65 6e 74 2c 20 72  ard is absent, r
16fa0 65 74 75 72 6e 69 6e 67 20 74 6f 6b 65 6e 20 61  eturning token a
16fb0 62 73 65 6e 74 22 29 3b 0a 0a 09 09 72 65 74 75  bsent");....retu
16fc0 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  rn(CACKEY_PCSC_E
16fd0 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b 0a 09  _TOKENABSENT);..
16fe0 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
16ff0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
17000 6e 67 20 74 6f 6b 65 6e 20 70 72 65 73 65 6e 74  ng token present
17010 2e 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41  .");...return(CA
17020 43 4b 45 59 5f 50 43 53 43 5f 53 5f 54 4f 4b 45  CKEY_PCSC_S_TOKE
17030 4e 50 52 45 53 45 4e 54 29 3b 0a 7d 0a 0a 2f 2a  NPRESENT);.}../*
17040 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20  . * SYNPOSIS. * 
17050 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52      .... *. * AR
17060 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 2e  GUMENTS. *     .
17070 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20  ... *. * RETURN 
17080 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e 2e  VALUE. *     ...
17090 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20  . *. * NOTES. * 
170a0 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73      .... *. */.s
170b0 74 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74  tatic cackey_ret
170c0 20 63 61 63 6b 65 79 5f 73 65 74 5f 70 69 6e 28   cackey_set_pin(
170d0 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c  struct cackey_sl
170e0 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e  ot *slot, unsign
170f0 65 64 20 63 68 61 72 20 2a 6f 6c 64 5f 70 69 6e  ed char *old_pin
17100 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  , unsigned long 
17110 6f 6c 64 5f 70 69 6e 5f 6c 65 6e 2c 20 75 6e 73  old_pin_len, uns
17120 69 67 6e 65 64 20 63 68 61 72 20 2a 70 69 6e 2c  igned char *pin,
17130 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 70   unsigned long p
17140 69 6e 5f 6c 65 6e 29 20 7b 0a 09 73 74 72 75 63  in_len) {..struc
17150 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64  t cackey_pcsc_id
17160 65 6e 74 69 74 79 20 2a 70 63 73 63 5f 69 64 65  entity *pcsc_ide
17170 6e 74 69 74 69 65 73 3b 0a 09 75 6e 73 69 67 6e  ntities;..unsign
17180 65 64 20 63 68 61 72 20 63 61 63 5f 70 69 6e 5b  ed char cac_pin[
17190 38 5d 20 3d 20 7b 30 78 46 46 2c 20 30 78 46 46  8] = {0xFF, 0xFF
171a0 2c 20 30 78 46 46 2c 20 30 78 46 46 2c 20 30 78  , 0xFF, 0xFF, 0x
171b0 46 46 2c 20 30 78 46 46 2c 20 30 78 46 46 2c 20  FF, 0xFF, 0xFF, 
171c0 30 78 46 46 7d 3b 0a 09 75 6e 73 69 67 6e 65 64  0xFF};..unsigned
171d0 20 63 68 61 72 20 6f 6c 64 5f 63 61 63 5f 70 69   char old_cac_pi
171e0 6e 5b 38 5d 20 3d 20 7b 30 78 46 46 2c 20 30 78  n[8] = {0xFF, 0x
171f0 46 46 2c 20 30 78 46 46 2c 20 30 78 46 46 2c 20  FF, 0xFF, 0xFF, 
17200 30 78 46 46 2c 20 30 78 46 46 2c 20 30 78 46 46  0xFF, 0xFF, 0xFF
17210 2c 20 30 78 46 46 7d 3b 0a 09 75 6e 73 69 67 6e  , 0xFF};..unsign
17220 65 64 20 63 68 61 72 20 70 69 6e 5f 75 70 64 61  ed char pin_upda
17230 74 65 5b 73 69 7a 65 6f 66 28 63 61 63 5f 70 69  te[sizeof(cac_pi
17240 6e 29 20 2b 20 73 69 7a 65 6f 66 28 6f 6c 64 5f  n) + sizeof(old_
17250 63 61 63 5f 70 69 6e 29 5d 3b 0a 09 75 6e 73 69  cac_pin)];..unsi
17260 67 6e 65 64 20 6c 6f 6e 67 20 6e 75 6d 5f 63 65  gned long num_ce
17270 72 74 73 3b 0a 09 75 69 6e 74 31 36 5f 74 20 72  rts;..uint16_t r
17280 65 73 70 6f 6e 73 65 5f 63 6f 64 65 3b 0a 09 69  esponse_code;..i
17290 6e 74 20 74 72 69 65 73 5f 72 65 6d 61 69 6e 69  nt tries_remaini
172a0 6e 67 3b 0a 09 69 6e 74 20 73 65 6e 64 5f 72 65  ng;..int send_re
172b0 74 3b 0a 09 69 6e 74 20 6b 65 79 5f 72 65 66 65  t;..int key_refe
172c0 72 65 6e 63 65 20 3d 20 30 78 30 30 3b 0a 0a 09  rence = 0x00;...
172d0 2f 2a 20 41 70 70 61 72 65 6e 74 6c 79 2c 20 43  /* Apparently, C
172e0 41 43 20 50 49 4e 73 20 61 72 65 20 2a 45 58 41  AC PINs are *EXA
172f0 43 54 4c 59 2a 20 38 20 62 79 74 65 73 20 6c 6f  CTLY* 8 bytes lo
17300 6e 67 20 2d 2d 20 70 61 64 20 77 69 74 68 20 30  ng -- pad with 0
17310 78 46 46 20 69 66 20 74 6f 6f 20 73 68 6f 72 74  xFF if too short
17320 20 2a 2f 0a 09 69 66 20 28 70 69 6e 5f 6c 65 6e   */..if (pin_len
17330 20 3e 3d 20 38 29 20 7b 0a 09 09 6d 65 6d 63 70   >= 8) {...memcp
17340 79 28 63 61 63 5f 70 69 6e 2c 20 70 69 6e 2c 20  y(cac_pin, pin, 
17350 38 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09  8);..} else {...
17360 6d 65 6d 63 70 79 28 63 61 63 5f 70 69 6e 2c 20  memcpy(cac_pin, 
17370 70 69 6e 2c 20 70 69 6e 5f 6c 65 6e 29 3b 0a 09  pin, pin_len);..
17380 7d 0a 0a 09 69 66 20 28 6f 6c 64 5f 70 69 6e 5f  }...if (old_pin_
17390 6c 65 6e 20 3e 3d 20 38 29 20 7b 0a 09 09 6d 65  len >= 8) {...me
173a0 6d 63 70 79 28 6f 6c 64 5f 63 61 63 5f 70 69 6e  mcpy(old_cac_pin
173b0 2c 20 6f 6c 64 5f 70 69 6e 2c 20 38 29 3b 0a 09  , old_pin, 8);..
173c0 7d 20 65 6c 73 65 20 7b 0a 09 09 6d 65 6d 63 70  } else {...memcp
173d0 79 28 6f 6c 64 5f 63 61 63 5f 70 69 6e 2c 20 6f  y(old_cac_pin, o
173e0 6c 64 5f 70 69 6e 2c 20 6f 6c 64 5f 70 69 6e 5f  ld_pin, old_pin_
173f0 6c 65 6e 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 43 6f  len);..}.../* Co
17400 6e 63 61 74 65 6e 61 74 65 20 62 6f 74 68 20 50  ncatenate both P
17410 49 4e 73 20 74 6f 67 65 74 68 65 72 20 74 6f 20  INs together to 
17420 73 65 6e 64 20 61 73 20 61 20 73 69 6e 67 6c 65  send as a single
17430 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a   instruction */.
17440 09 6d 65 6d 63 70 79 28 70 69 6e 5f 75 70 64 61  .memcpy(pin_upda
17450 74 65 2c 20 6f 6c 64 5f 63 61 63 5f 70 69 6e 2c  te, old_cac_pin,
17460 20 73 69 7a 65 6f 66 28 6f 6c 64 5f 63 61 63 5f   sizeof(old_cac_
17470 70 69 6e 29 29 3b 0a 09 6d 65 6d 63 70 79 28 70  pin));..memcpy(p
17480 69 6e 5f 75 70 64 61 74 65 20 2b 20 73 69 7a 65  in_update + size
17490 6f 66 28 6f 6c 64 5f 63 61 63 5f 70 69 6e 29 2c  of(old_cac_pin),
174a0 20 63 61 63 5f 70 69 6e 2c 20 73 69 7a 65 6f 66   cac_pin, sizeof
174b0 28 63 61 63 5f 70 69 6e 29 29 3b 0a 0a 09 2f 2a  (cac_pin));.../*
174c0 20 52 65 6a 65 63 74 20 50 49 4e 73 20 77 68 69   Reject PINs whi
174d0 63 68 20 61 72 65 20 74 6f 6f 20 73 68 6f 72 74  ch are too short
174e0 20 2a 2f 0a 09 69 66 20 28 70 69 6e 5f 6c 65 6e   */..if (pin_len
174f0 20 3c 20 35 29 20 7b 0a 09 09 43 41 43 4b 45 59   < 5) {...CACKEY
17500 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
17510 65 6a 65 63 74 69 6e 67 20 4e 65 77 20 50 49 4e  ejecting New PIN
17520 20 77 68 69 63 68 20 69 73 20 74 6f 6f 20 73 68   which is too sh
17530 6f 72 74 20 28 6c 65 6e 67 74 68 20 3d 20 25 6c  ort (length = %l
17540 75 2c 20 6d 75 73 74 20 62 65 20 61 74 6c 65 61  u, must be atlea
17550 73 74 20 35 29 22 2c 20 70 69 6e 5f 6c 65 6e 29  st 5)", pin_len)
17560 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b  ;....return(CACK
17570 45 59 5f 50 43 53 43 5f 45 5f 42 41 44 50 49 4e  EY_PCSC_E_BADPIN
17580 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 6f 6c 64 5f  );..}...if (old_
17590 70 69 6e 5f 6c 65 6e 20 3c 20 35 29 20 7b 0a 09  pin_len < 5) {..
175a0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
175b0 49 4e 54 46 28 22 52 65 6a 65 63 74 69 6e 67 20  INTF("Rejecting 
175c0 4f 6c 64 20 50 49 4e 20 77 68 69 63 68 20 69 73  Old PIN which is
175d0 20 74 6f 6f 20 73 68 6f 72 74 20 28 6c 65 6e 67   too short (leng
175e0 74 68 20 3d 20 25 6c 75 2c 20 6d 75 73 74 20 62  th = %lu, must b
175f0 65 20 61 74 6c 65 61 73 74 20 35 29 22 2c 20 6f  e atleast 5)", o
17600 6c 64 5f 70 69 6e 5f 6c 65 6e 29 3b 0a 0a 09 09  ld_pin_len);....
17610 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
17620 53 43 5f 45 5f 42 41 44 50 49 4e 29 3b 0a 09 7d  SC_E_BADPIN);..}
17630 0a 0a 09 2f 2a 20 50 49 56 20 61 75 74 68 65 6e  .../* PIV authen
17640 74 69 63 61 74 69 6f 6e 20 75 73 65 73 20 61 20  tication uses a 
17650 22 6b 65 79 5f 72 65 66 65 72 65 6e 63 65 22 20  "key_reference" 
17660 6f 66 20 30 78 38 30 20 2a 2f 0a 09 70 63 73 63  of 0x80 */..pcsc
17670 5f 69 64 65 6e 74 69 74 69 65 73 20 3d 20 63 61  _identities = ca
17680 63 6b 65 79 5f 72 65 61 64 5f 63 65 72 74 73 28  ckey_read_certs(
17690 73 6c 6f 74 2c 20 4e 55 4c 4c 2c 20 26 6e 75 6d  slot, NULL, &num
176a0 5f 63 65 72 74 73 29 3b 0a 09 69 66 20 28 6e 75  _certs);..if (nu
176b0 6d 5f 63 65 72 74 73 20 3e 20 30 20 26 26 20 70  m_certs > 0 && p
176c0 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 20 21  csc_identities !
176d0 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 73 77 69 74  = NULL) {...swit
176e0 63 68 20 28 70 63 73 63 5f 69 64 65 6e 74 69 74  ch (pcsc_identit
176f0 69 65 73 5b 30 5d 2e 69 64 5f 74 79 70 65 29 20  ies[0].id_type) 
17700 7b 0a 09 09 09 63 61 73 65 20 43 41 43 4b 45 59  {....case CACKEY
17710 5f 49 44 5f 54 59 50 45 5f 50 49 56 3a 0a 09 09  _ID_TYPE_PIV:...
17720 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
17730 52 49 4e 54 46 28 22 57 65 20 68 61 76 65 20 50  RINTF("We have P
17740 49 56 20 63 61 72 64 2c 20 73 6f 20 77 65 20 77  IV card, so we w
17750 69 6c 6c 20 61 74 74 65 6d 70 74 20 74 6f 20 61  ill attempt to a
17760 75 74 68 65 6e 74 69 63 61 74 65 20 75 73 69 6e  uthenticate usin
17770 67 20 74 68 65 20 50 49 56 20 41 70 70 6c 69 63  g the PIV Applic
17780 61 74 69 6f 6e 20 6b 65 79 20 72 65 66 65 72 65  ation key refere
17790 6e 63 65 22 29 3b 0a 0a 09 09 09 09 6b 65 79 5f  nce");......key_
177a0 72 65 66 65 72 65 6e 63 65 20 3d 20 30 78 38 30  reference = 0x80
177b0 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ;.....break;....
177c0 64 65 66 61 75 6c 74 3a 0a 09 09 09 09 62 72 65  default:.....bre
177d0 61 6b 3b 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65  ak;...}....cacke
177e0 79 5f 66 72 65 65 5f 63 65 72 74 73 28 70 63 73  y_free_certs(pcs
177f0 63 5f 69 64 65 6e 74 69 74 69 65 73 2c 20 6e 75  c_identities, nu
17800 6d 5f 63 65 72 74 73 2c 20 31 29 3b 0a 09 7d 0a  m_certs, 1);..}.
17810 0a 09 2f 2a 20 49 73 73 75 65 20 61 20 53 65 74  ../* Issue a Set
17820 20 50 49 4e 20 28 43 48 41 4e 47 45 20 52 45 46   PIN (CHANGE REF
17830 45 52 45 4e 43 45 29 20 2a 2f 0a 09 73 65 6e 64  ERENCE) */..send
17840 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65  _ret = cackey_se
17850 6e 64 5f 61 70 64 75 28 73 6c 6f 74 2c 20 47 53  nd_apdu(slot, GS
17860 43 49 53 5f 43 4c 41 53 53 5f 49 53 4f 37 38 31  CIS_CLASS_ISO781
17870 36 2c 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 43  6, GSCIS_INSTR_C
17880 48 41 4e 47 45 5f 52 45 46 45 52 45 4e 43 45 2c  HANGE_REFERENCE,
17890 20 30 78 30 30 2c 20 6b 65 79 5f 72 65 66 65 72   0x00, key_refer
178a0 65 6e 63 65 2c 20 73 69 7a 65 6f 66 28 70 69 6e  ence, sizeof(pin
178b0 5f 75 70 64 61 74 65 29 2c 20 70 69 6e 5f 75 70  _update), pin_up
178c0 64 61 74 65 2c 20 30 78 30 30 2c 20 26 72 65 73  date, 0x00, &res
178d0 70 6f 6e 73 65 5f 63 6f 64 65 2c 20 4e 55 4c 4c  ponse_code, NULL
178e0 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 69 66 20 28 73  , NULL);...if (s
178f0 65 6e 64 5f 72 65 74 20 21 3d 20 43 41 43 4b 45  end_ret != CACKE
17900 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09  Y_PCSC_S_OK) {..
17910 09 69 66 20 28 28 72 65 73 70 6f 6e 73 65 5f 63  .if ((response_c
17920 6f 64 65 20 26 20 30 78 36 33 43 30 29 20 3d 3d  ode & 0x63C0) ==
17930 20 30 78 36 33 43 30 29 20 7b 0a 09 09 09 74 72   0x63C0) {....tr
17940 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 20 3d 20  ies_remaining = 
17950 28 72 65 73 70 6f 6e 73 65 5f 63 6f 64 65 20 26  (response_code &
17960 20 30 78 46 29 3b 0a 0a 09 09 09 43 41 43 4b 45   0xF);.....CACKE
17970 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
17980 50 49 4e 20 56 65 72 69 66 69 63 61 74 69 6f 6e  PIN Verification
17990 20 66 61 69 6c 65 64 2c 20 25 69 20 74 72 69 65   failed, %i trie
179a0 73 20 72 65 6d 61 69 6e 69 6e 67 22 2c 20 74 72  s remaining", tr
179b0 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 29 3b 0a  ies_remaining);.
179c0 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ....return(CACKE
179d0 59 5f 50 43 53 43 5f 45 5f 42 41 44 50 49 4e 29  Y_PCSC_E_BADPIN)
179e0 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 72 65 73  ;...}....if (res
179f0 70 6f 6e 73 65 5f 63 6f 64 65 20 3d 3d 20 30 78  ponse_code == 0x
17a00 36 39 38 33 29 20 7b 0a 09 09 09 43 41 43 4b 45  6983) {....CACKE
17a10 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
17a20 55 6e 61 62 6c 65 20 74 6f 20 73 65 74 20 50 49  Unable to set PI
17a30 4e 2c 20 64 65 76 69 63 65 20 69 73 20 6c 6f 63  N, device is loc
17a40 6b 65 64 20 6f 72 20 63 68 61 6e 67 69 6e 67 20  ked or changing 
17a50 74 68 65 20 50 49 4e 20 69 73 20 64 69 73 61 62  the PIN is disab
17a60 6c 65 64 22 29 3b 0a 0a 09 09 09 72 65 74 75 72  led");.....retur
17a70 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  n(CACKEY_PCSC_E_
17a80 4c 4f 43 4b 45 44 29 3b 0a 09 09 7d 0a 0a 09 09  LOCKED);...}....
17a90 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
17aa0 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09  SC_E_GENERIC);..
17ab0 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
17ac0 5f 50 52 49 4e 54 46 28 22 50 49 4e 20 43 68 61  _PRINTF("PIN Cha
17ad0 6e 67 65 20 73 75 63 63 65 65 64 65 64 22 29 3b  nge succeeded");
17ae0 0a 0a 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
17af0 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 0a 09 2f  _PCSC_S_OK);.../
17b00 2a 20 44 69 73 61 62 6c 65 20 61 20 77 61 72 6e  * Disable a warn
17b10 69 6e 67 2c 20 73 69 6e 63 65 20 74 68 69 73 20  ing, since this 
17b20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 69 6e 20  is only used in 
17b30 64 65 62 75 67 20 6d 6f 64 65 20 2a 2f 0a 09 74  debug mode */..t
17b40 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 20 3d  ries_remaining =
17b50 20 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67   tries_remaining
17b60 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f  ;.}../*. * SYNPO
17b70 53 49 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20  SIS. *     .... 
17b80 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20  *. * ARGUMENTS. 
17b90 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20  *     .... *. * 
17ba0 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20  RETURN VALUE. * 
17bb0 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f      .... *. * NO
17bc0 54 45 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20  TES. *     .... 
17bd0 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 61 63  *. */.static cac
17be0 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 6c  key_ret cackey_l
17bf0 6f 67 69 6e 28 73 74 72 75 63 74 20 63 61 63 6b  ogin(struct cack
17c00 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75  ey_slot *slot, u
17c10 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 69  nsigned char *pi
17c20 6e 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  n, unsigned long
17c30 20 70 69 6e 5f 6c 65 6e 2c 20 69 6e 74 20 2a 74   pin_len, int *t
17c40 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 5f 70  ries_remaining_p
17c50 2c 20 69 6e 74 20 72 65 74 72 69 65 73 29 20 7b  , int retries) {
17c60 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  ..struct cackey_
17c70 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 70  pcsc_identity *p
17c80 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 3b 0a  csc_identities;.
17c90 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63  .unsigned char c
17ca0 61 63 5f 70 69 6e 5b 38 5d 20 3d 20 7b 30 78 46  ac_pin[8] = {0xF
17cb0 46 2c 20 30 78 46 46 2c 20 30 78 46 46 2c 20 30  F, 0xFF, 0xFF, 0
17cc0 78 46 46 2c 20 30 78 46 46 2c 20 30 78 46 46 2c  xFF, 0xFF, 0xFF,
17cd0 20 30 78 46 46 2c 20 30 78 46 46 7d 3b 0a 09 75   0xFF, 0xFF};..u
17ce0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6e 75 6d  nsigned long num
17cf0 5f 63 65 72 74 73 3b 0a 09 75 69 6e 74 31 36 5f  _certs;..uint16_
17d00 74 20 72 65 73 70 6f 6e 73 65 5f 63 6f 64 65 3b  t response_code;
17d10 0a 09 69 6e 74 20 74 72 69 65 73 5f 72 65 6d 61  ..int tries_rema
17d20 69 6e 69 6e 67 3b 0a 09 69 6e 74 20 73 65 6e 64  ining;..int send
17d30 5f 72 65 74 3b 0a 09 69 6e 74 20 6b 65 79 5f 72  _ret;..int key_r
17d40 65 66 65 72 65 6e 63 65 20 3d 20 30 78 30 30 2c  eference = 0x00,
17d50 20 68 61 76 65 5f 70 69 76 20 3d 20 30 3b 0a 09   have_piv = 0;..
17d60 63 61 63 6b 65 79 5f 72 65 74 20 63 6f 6e 6e 65  cackey_ret conne
17d70 63 74 5f 72 65 74 2c 20 74 6f 6b 65 6e 5f 72 65  ct_ret, token_re
17d80 74 3b 0a 0a 09 2f 2a 20 49 6e 64 69 63 61 74 65  t;.../* Indicate
17d90 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20   that we do not 
17da0 6b 6e 6f 77 20 61 62 6f 75 74 20 68 6f 77 20 6d  know about how m
17db0 61 6e 79 20 74 72 69 65 73 20 61 72 65 20 72 65  any tries are re
17dc0 6d 61 69 6e 69 6e 67 20 2a 2f 0a 09 69 66 20 28  maining */..if (
17dd0 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 5f  tries_remaining_
17de0 70 29 20 7b 0a 09 09 2a 74 72 69 65 73 5f 72 65  p) {...*tries_re
17df0 6d 61 69 6e 69 6e 67 5f 70 20 3d 20 2d 31 3b 0a  maining_p = -1;.
17e00 09 7d 0a 0a 09 2f 2a 20 41 70 70 61 72 65 6e 74  .}.../* Apparent
17e10 6c 79 2c 20 43 41 43 20 50 49 4e 73 20 61 72 65  ly, CAC PINs are
17e20 20 2a 45 58 41 43 54 4c 59 2a 20 38 20 62 79 74   *EXACTLY* 8 byt
17e30 65 73 20 6c 6f 6e 67 20 2d 2d 20 70 61 64 20 77  es long -- pad w
17e40 69 74 68 20 30 78 46 46 20 69 66 20 74 6f 6f 20  ith 0xFF if too 
17e50 73 68 6f 72 74 20 2a 2f 0a 09 69 66 20 28 70 69  short */..if (pi
17e60 6e 5f 6c 65 6e 20 3e 3d 20 38 29 20 7b 0a 09 09  n_len >= 8) {...
17e70 6d 65 6d 63 70 79 28 63 61 63 5f 70 69 6e 2c 20  memcpy(cac_pin, 
17e80 70 69 6e 2c 20 38 29 3b 0a 09 7d 20 65 6c 73 65  pin, 8);..} else
17e90 20 7b 0a 09 09 6d 65 6d 63 70 79 28 63 61 63 5f   {...memcpy(cac_
17ea0 70 69 6e 2c 20 70 69 6e 2c 20 70 69 6e 5f 6c 65  pin, pin, pin_le
17eb0 6e 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 52 65 6a 65  n);..}.../* Reje
17ec0 63 74 20 50 49 4e 73 20 77 68 69 63 68 20 61 72  ct PINs which ar
17ed0 65 20 74 6f 6f 20 73 68 6f 72 74 20 2a 2f 0a 09  e too short */..
17ee0 69 66 20 28 70 69 6e 5f 6c 65 6e 20 3c 20 35 29  if (pin_len < 5)
17ef0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
17f00 47 5f 50 52 49 4e 54 46 28 22 52 65 6a 65 63 74  G_PRINTF("Reject
17f10 69 6e 67 20 50 49 4e 20 77 68 69 63 68 20 69 73  ing PIN which is
17f20 20 74 6f 6f 20 73 68 6f 72 74 20 28 6c 65 6e 67   too short (leng
17f30 74 68 20 3d 20 25 6c 75 2c 20 6d 75 73 74 20 62  th = %lu, must b
17f40 65 20 61 74 6c 65 61 73 74 20 35 29 22 2c 20 70  e atleast 5)", p
17f50 69 6e 5f 6c 65 6e 29 3b 0a 0a 09 09 72 65 74 75  in_len);....retu
17f60 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  rn(CACKEY_PCSC_E
17f70 5f 42 41 44 50 49 4e 29 3b 0a 09 7d 0a 0a 09 2f  _BADPIN);..}.../
17f80 2a 20 50 49 56 20 61 75 74 68 65 6e 74 69 63 61  * PIV authentica
17f90 74 69 6f 6e 20 75 73 65 73 20 61 20 22 6b 65 79  tion uses a "key
17fa0 5f 72 65 66 65 72 65 6e 63 65 22 20 6f 66 20 30  _reference" of 0
17fb0 78 38 30 20 2a 2f 0a 09 70 63 73 63 5f 69 64 65  x80 */..pcsc_ide
17fc0 6e 74 69 74 69 65 73 20 3d 20 63 61 63 6b 65 79  ntities = cackey
17fd0 5f 72 65 61 64 5f 63 65 72 74 73 28 73 6c 6f 74  _read_certs(slot
17fe0 2c 20 4e 55 4c 4c 2c 20 26 6e 75 6d 5f 63 65 72  , NULL, &num_cer
17ff0 74 73 29 3b 0a 09 69 66 20 28 6e 75 6d 5f 63 65  ts);..if (num_ce
18000 72 74 73 20 3e 20 30 20 26 26 20 70 63 73 63 5f  rts > 0 && pcsc_
18010 69 64 65 6e 74 69 74 69 65 73 20 21 3d 20 4e 55  identities != NU
18020 4c 4c 29 20 7b 0a 09 09 73 77 69 74 63 68 20 28  LL) {...switch (
18030 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 5b  pcsc_identities[
18040 30 5d 2e 69 64 5f 74 79 70 65 29 20 7b 0a 09 09  0].id_type) {...
18050 09 63 61 73 65 20 43 41 43 4b 45 59 5f 49 44 5f  .case CACKEY_ID_
18060 54 59 50 45 5f 50 49 56 3a 0a 09 09 09 09 43 41  TYPE_PIV:.....CA
18070 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
18080 46 28 22 57 65 20 68 61 76 65 20 50 49 56 20 63  F("We have PIV c
18090 61 72 64 2c 20 73 6f 20 77 65 20 77 69 6c 6c 20  ard, so we will 
180a0 61 74 74 65 6d 70 74 20 74 6f 20 61 75 74 68 65  attempt to authe
180b0 6e 74 69 63 61 74 65 20 75 73 69 6e 67 20 74 68  nticate using th
180c0 65 20 50 49 56 20 41 70 70 6c 69 63 61 74 69 6f  e PIV Applicatio
180d0 6e 20 6b 65 79 20 72 65 66 65 72 65 6e 63 65 22  n key reference"
180e0 29 3b 0a 0a 09 09 09 09 68 61 76 65 5f 70 69 76  );......have_piv
180f0 20 3d 20 31 3b 0a 09 09 09 09 62 72 65 61 6b 3b   = 1;.....break;
18100 0a 09 09 09 64 65 66 61 75 6c 74 3a 0a 09 09 09  ....default:....
18110 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09 63  .break;...}....c
18120 61 63 6b 65 79 5f 66 72 65 65 5f 63 65 72 74 73  ackey_free_certs
18130 28 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73  (pcsc_identities
18140 2c 20 6e 75 6d 5f 63 65 72 74 73 2c 20 31 29 3b  , num_certs, 1);
18150 0a 09 7d 0a 0a 09 69 66 20 28 68 61 76 65 5f 70  ..}...if (have_p
18160 69 76 20 3d 3d 20 31 29 20 7b 0a 09 09 6b 65 79  iv == 1) {...key
18170 5f 72 65 66 65 72 65 6e 63 65 20 3d 20 30 78 38  _reference = 0x8
18180 30 3b 0a 09 7d 0a 0a 09 2f 2a 20 49 73 73 75 65  0;..}.../* Issue
18190 20 50 49 4e 20 56 65 72 69 66 79 20 2a 2f 0a 09   PIN Verify */..
181a0 73 65 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b 65  send_ret = cacke
181b0 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f 74  y_send_apdu(slot
181c0 2c 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 49 53  , GSCIS_CLASS_IS
181d0 4f 37 38 31 36 2c 20 47 53 43 49 53 5f 49 4e 53  O7816, GSCIS_INS
181e0 54 52 5f 56 45 52 49 46 59 2c 20 30 78 30 30 2c  TR_VERIFY, 0x00,
181f0 20 6b 65 79 5f 72 65 66 65 72 65 6e 63 65 2c 20   key_reference, 
18200 73 69 7a 65 6f 66 28 63 61 63 5f 70 69 6e 29 2c  sizeof(cac_pin),
18210 20 63 61 63 5f 70 69 6e 2c 20 30 78 30 30 2c 20   cac_pin, 0x00, 
18220 26 72 65 73 70 6f 6e 73 65 5f 63 6f 64 65 2c 20  &response_code, 
18230 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 69  NULL, NULL);...i
18240 66 20 28 73 65 6e 64 5f 72 65 74 20 21 3d 20 43  f (send_ret != C
18250 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29  ACKEY_PCSC_S_OK)
18260 20 7b 0a 09 09 69 66 20 28 28 72 65 73 70 6f 6e   {...if ((respon
18270 73 65 5f 63 6f 64 65 20 26 20 30 78 36 33 43 30  se_code & 0x63C0
18280 29 20 3d 3d 20 30 78 36 33 43 30 29 20 7b 0a 09  ) == 0x63C0) {..
18290 09 09 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e  ..tries_remainin
182a0 67 20 3d 20 28 72 65 73 70 6f 6e 73 65 5f 63 6f  g = (response_co
182b0 64 65 20 26 20 30 78 46 29 3b 0a 0a 09 09 09 43  de & 0xF);.....C
182c0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
182d0 54 46 28 22 50 49 4e 20 56 65 72 69 66 69 63 61  TF("PIN Verifica
182e0 74 69 6f 6e 20 66 61 69 6c 65 64 2c 20 25 69 20  tion failed, %i 
182f0 74 72 69 65 73 20 72 65 6d 61 69 6e 69 6e 67 22  tries remaining"
18300 2c 20 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e  , tries_remainin
18310 67 29 3b 0a 0a 09 09 09 69 66 20 28 74 72 69 65  g);.....if (trie
18320 73 5f 72 65 6d 61 69 6e 69 6e 67 5f 70 29 20 7b  s_remaining_p) {
18330 0a 09 09 09 09 2a 74 72 69 65 73 5f 72 65 6d 61  .....*tries_rema
18340 69 6e 69 6e 67 5f 70 20 3d 20 74 72 69 65 73 5f  ining_p = tries_
18350 72 65 6d 61 69 6e 69 6e 67 3b 0a 09 09 09 7d 0a  remaining;....}.
18360 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ....return(CACKE
18370 59 5f 50 43 53 43 5f 45 5f 42 41 44 50 49 4e 29  Y_PCSC_E_BADPIN)
18380 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 72 65 73  ;...}....if (res
18390 70 6f 6e 73 65 5f 63 6f 64 65 20 3d 3d 20 30 78  ponse_code == 0x
183a0 36 39 38 33 29 20 7b 0a 09 09 09 43 41 43 4b 45  6983) {....CACKE
183b0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
183c0 50 49 4e 20 56 65 72 69 66 69 63 61 74 69 6f 6e  PIN Verification
183d0 20 66 61 69 6c 65 64 2c 20 64 65 76 69 63 65 20   failed, device 
183e0 69 73 20 6c 6f 63 6b 65 64 22 29 3b 0a 0a 09 09  is locked");....
183f0 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
18400 43 53 43 5f 45 5f 4c 4f 43 4b 45 44 29 3b 0a 09  CSC_E_LOCKED);..
18410 09 7d 0a 0a 09 09 69 66 20 28 72 65 73 70 6f 6e  .}....if (respon
18420 73 65 5f 63 6f 64 65 20 3d 3d 20 30 78 36 64 30  se_code == 0x6d0
18430 30 29 20 7b 0a 09 09 09 69 66 20 28 72 65 74 72  0) {....if (retr
18440 69 65 73 20 3e 20 30 29 20 7b 0a 09 09 09 09 43  ies > 0) {.....C
18450 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
18460 54 46 28 22 47 6f 74 20 49 53 4f 20 37 38 31 36  TF("Got ISO 7816
18470 20 52 65 73 70 6f 6e 73 65 20 5c 22 36 44 20 30   Response \"6D 0
18480 30 5c 22 20 69 6e 20 72 65 73 70 6f 6e 73 65 20  0\" in response 
18490 74 6f 20 61 20 56 45 52 49 46 59 20 72 65 71 75  to a VERIFY requ
184a0 65 73 74 2e 22 29 3b 0a 09 09 09 09 43 41 43 4b  est.");.....CACK
184b0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
184c0 22 57 65 20 64 69 64 20 6e 6f 74 20 65 78 70 65  "We did not expe
184d0 63 74 20 74 68 69 73 20 62 65 63 61 75 73 65 20  ct this because 
184e0 69 74 20 69 73 20 6e 6f 74 20 6d 65 6e 74 69 6f  it is not mentio
184f0 6e 65 64 20 69 6e 20 4e 49 53 54 20 53 50 20 38  ned in NIST SP 8
18500 30 30 2d 37 33 2d 33 20 50 61 72 74 20 32 20 53  00-73-3 Part 2 S
18510 65 63 74 69 6f 6e 20 33 2e 32 2e 31 20 6f 72 20  ection 3.2.1 or 
18520 47 53 43 2d 49 53 20 76 32 2e 31 22 29 3b 0a 09  GSC-IS v2.1");..
18530 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
18540 50 52 49 4e 54 46 28 22 57 65 20 61 72 65 20 67  PRINTF("We are g
18550 6f 69 6e 67 20 74 6f 20 74 72 79 20 74 6f 20 72  oing to try to r
18560 65 73 65 74 20 74 68 65 20 63 61 72 64 20 61 6e  eset the card an
18570 64 20 73 65 6c 65 63 74 20 74 68 65 20 61 70 70  d select the app
18580 6c 65 74 20 61 67 61 69 6e 2e 22 29 3b 0a 0a 09  let again.");...
18590 09 09 09 69 66 20 28 6e 75 6d 5f 63 65 72 74 73  ...if (num_certs
185a0 20 3e 20 30 20 26 26 20 70 63 73 63 5f 69 64 65   > 0 && pcsc_ide
185b0 6e 74 69 74 69 65 73 20 21 3d 20 4e 55 4c 4c 29  ntities != NULL)
185c0 20 7b 0a 09 09 09 09 09 63 61 63 6b 65 79 5f 64   {......cackey_d
185d0 65 74 65 63 74 5f 61 6e 64 5f 73 65 6c 65 63 74  etect_and_select
185e0 5f 72 6f 6f 74 5f 61 70 70 6c 65 74 28 73 6c 6f  _root_applet(slo
185f0 74 2c 20 70 63 73 63 5f 69 64 65 6e 74 69 74 69  t, pcsc_identiti
18600 65 73 5b 30 5d 2e 69 64 5f 74 79 70 65 29 3b 0a  es[0].id_type);.
18610 09 09 09 09 7d 0a 0a 09 09 09 09 63 61 63 6b 65  ....}......cacke
18620 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65 73 65  y_mark_slot_rese
18630 74 28 73 6c 6f 74 29 3b 0a 0a 09 09 09 09 63 6f  t(slot);......co
18640 6e 6e 65 63 74 5f 72 65 74 20 3d 20 63 61 63 6b  nnect_ret = cack
18650 65 79 5f 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28  ey_connect_card(
18660 73 6c 6f 74 29 3b 0a 09 09 09 09 69 66 20 28 63  slot);.....if (c
18670 6f 6e 6e 65 63 74 5f 72 65 74 20 21 3d 20 43 41  onnect_ret != CA
18680 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20  CKEY_PCSC_S_OK) 
18690 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45  {......CACKEY_DE
186a0 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62  BUG_PRINTF("Unab
186b0 6c 65 20 74 6f 20 72 65 63 6f 6e 6e 65 63 74 20  le to reconnect 
186c0 61 66 74 65 72 20 72 65 73 65 74 74 69 6e 67 20  after resetting 
186d0 74 68 65 20 63 61 72 64 2c 20 72 65 74 75 72 6e  the card, return
186e0 69 6e 67 20 69 6e 20 65 72 72 6f 72 2e 22 29 3b  ing in error.");
186f0 0a 0a 09 09 09 09 09 72 65 74 75 72 6e 28 63 6f  .......return(co
18700 6e 6e 65 63 74 5f 72 65 74 29 3b 0a 09 09 09 09  nnect_ret);.....
18710 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  }......CACKEY_DE
18720 42 55 47 5f 50 52 49 4e 54 46 28 22 56 65 72 69  BUG_PRINTF("Veri
18730 66 79 69 6e 67 20 77 65 20 73 74 69 6c 6c 20 68  fying we still h
18740 61 76 65 20 61 20 74 6f 6b 65 6e 2e 22 29 3b 0a  ave a token.");.
18750 09 09 09 09 74 6f 6b 65 6e 5f 72 65 74 20 3d 20  ....token_ret = 
18760 63 61 63 6b 65 79 5f 74 6f 6b 65 6e 5f 70 72 65  cackey_token_pre
18770 73 65 6e 74 28 73 6c 6f 74 29 3b 0a 09 09 09 09  sent(slot);.....
18780 69 66 20 28 74 6f 6b 65 6e 5f 72 65 74 20 21 3d  if (token_ret !=
18790 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 54   CACKEY_PCSC_S_T
187a0 4f 4b 45 4e 50 52 45 53 45 4e 54 29 20 7b 0a 09  OKENPRESENT) {..
187b0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
187c0 5f 50 52 49 4e 54 46 28 22 54 6f 6b 65 6e 20 6e  _PRINTF("Token n
187d0 6f 74 20 70 72 65 73 65 6e 74 2c 20 72 65 74 75  ot present, retu
187e0 72 6e 69 6e 67 20 69 6e 20 65 72 72 6f 72 2e 22  rning in error."
187f0 29 3b 0a 0a 09 09 09 09 09 72 65 74 75 72 6e 28  );.......return(
18800 74 6f 6b 65 6e 5f 72 65 74 29 3b 0a 09 09 09 09  token_ret);.....
18810 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  }......CACKEY_DE
18820 42 55 47 5f 50 52 49 4e 54 46 28 22 54 72 79 69  BUG_PRINTF("Tryi
18830 6e 67 20 74 6f 20 6c 6f 67 69 6e 20 61 67 61 69  ng to login agai
18840 6e 22 29 3b 0a 09 09 09 09 72 65 74 75 72 6e 28  n");.....return(
18850 63 61 63 6b 65 79 5f 6c 6f 67 69 6e 28 73 6c 6f  cackey_login(slo
18860 74 2c 20 70 69 6e 2c 20 70 69 6e 5f 6c 65 6e 2c  t, pin, pin_len,
18870 20 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67   tries_remaining
18880 5f 70 2c 20 72 65 74 72 69 65 73 20 2d 20 31 29  _p, retries - 1)
18890 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 72  );....}...}....r
188a0 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
188b0 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d  C_E_GENERIC);..}
188c0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
188d0 50 52 49 4e 54 46 28 22 50 49 4e 20 56 65 72 69  PRINTF("PIN Veri
188e0 66 69 63 61 74 69 6f 6e 20 73 75 63 63 65 65 64  fication succeed
188f0 65 64 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  ed");...return(C
18900 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29  ACKEY_PCSC_S_OK)
18910 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f  ;.}../*. * SYNPO
18920 53 49 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20  SIS. *     .... 
18930 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20  *. * ARGUMENTS. 
18940 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20  *     .... *. * 
18950 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20  RETURN VALUE. * 
18960 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f      .... *. * NO
18970 54 45 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20  TES. *     .... 
18980 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 73 73 69  *. */.static ssi
18990 7a 65 5f 74 20 63 61 63 6b 65 79 5f 70 63 73 63  ze_t cackey_pcsc
189a0 5f 69 64 65 6e 74 69 74 79 5f 74 6f 5f 6c 61 62  _identity_to_lab
189b0 65 6c 28 73 74 72 75 63 74 20 63 61 63 6b 65 79  el(struct cackey
189c0 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a  _pcsc_identity *
189d0 69 64 65 6e 74 69 74 79 2c 20 75 6e 73 69 67 6e  identity, unsign
189e0 65 64 20 63 68 61 72 20 2a 6c 61 62 65 6c 5f 62  ed char *label_b
189f0 75 66 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  uf, unsigned lon
18a00 67 20 6c 61 62 65 6c 5f 62 75 66 5f 6c 65 6e 29  g label_buf_len)
18a10 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e   {..unsigned lon
18a20 67 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65  g certificate_le
18a30 6e 3b 0a 09 76 6f 69 64 20 2a 6c 61 62 65 6c 5f  n;..void *label_
18a40 61 73 6e 31 3b 0a 09 76 6f 69 64 20 2a 63 65 72  asn1;..void *cer
18a50 74 69 66 69 63 61 74 65 3b 0a 09 69 6e 74 20 78  tificate;..int x
18a60 35 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a 0a 09  509_read_ret;...
18a70 63 65 72 74 69 66 69 63 61 74 65 20 3d 20 69 64  certificate = id
18a80 65 6e 74 69 74 79 2d 3e 63 65 72 74 69 66 69 63  entity->certific
18a90 61 74 65 3b 0a 09 63 65 72 74 69 66 69 63 61 74  ate;..certificat
18aa0 65 5f 6c 65 6e 20 3d 20 69 64 65 6e 74 69 74 79  e_len = identity
18ab0 2d 3e 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65  ->certificate_le
18ac0 6e 3b 0a 0a 09 69 66 20 28 63 65 72 74 69 66 69  n;...if (certifi
18ad0 63 61 74 65 5f 6c 65 6e 20 3c 20 30 29 20 7b 0a  cate_len < 0) {.
18ae0 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d  ..return(-1);..}
18af0 0a 0a 09 78 35 30 39 5f 72 65 61 64 5f 72 65 74  ...x509_read_ret
18b00 20 3d 20 78 35 30 39 5f 74 6f 5f 73 75 62 6a 65   = x509_to_subje
18b10 63 74 28 63 65 72 74 69 66 69 63 61 74 65 2c 20  ct(certificate, 
18b20 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c  certificate_len,
18b30 20 28 76 6f 69 64 20 2a 2a 29 20 26 6c 61 62 65   (void **) &labe
18b40 6c 5f 61 73 6e 31 29 3b 0a 09 69 66 20 28 78 35  l_asn1);..if (x5
18b50 30 39 5f 72 65 61 64 5f 72 65 74 20 3c 20 30 29  09_read_ret < 0)
18b60 20 7b 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b   {...return(-1);
18b70 0a 09 7d 0a 0a 09 78 35 30 39 5f 72 65 61 64 5f  ..}...x509_read_
18b80 72 65 74 20 3d 20 78 35 30 39 5f 64 6e 5f 74 6f  ret = x509_dn_to
18b90 5f 73 74 72 69 6e 67 28 6c 61 62 65 6c 5f 61 73  _string(label_as
18ba0 6e 31 2c 20 78 35 30 39 5f 72 65 61 64 5f 72 65  n1, x509_read_re
18bb0 74 2c 20 28 63 68 61 72 20 2a 29 20 6c 61 62 65  t, (char *) labe
18bc0 6c 5f 62 75 66 2c 20 6c 61 62 65 6c 5f 62 75 66  l_buf, label_buf
18bd0 5f 6c 65 6e 2c 20 22 43 4e 22 29 3b 0a 09 69 66  _len, "CN");..if
18be0 20 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20   (x509_read_ret 
18bf0 3c 3d 20 30 29 20 7b 0a 09 09 78 35 30 39 5f 72  <= 0) {...x509_r
18c00 65 61 64 5f 72 65 74 20 3d 20 78 35 30 39 5f 64  ead_ret = x509_d
18c10 6e 5f 74 6f 5f 73 74 72 69 6e 67 28 6c 61 62 65  n_to_string(labe
18c20 6c 5f 61 73 6e 31 2c 20 78 35 30 39 5f 72 65 61  l_asn1, x509_rea
18c30 64 5f 72 65 74 2c 20 28 63 68 61 72 20 2a 29 20  d_ret, (char *) 
18c40 6c 61 62 65 6c 5f 62 75 66 2c 20 6c 61 62 65 6c  label_buf, label
18c50 5f 62 75 66 5f 6c 65 6e 2c 20 4e 55 4c 4c 29 3b  _buf_len, NULL);
18c60 0a 0a 09 09 69 66 20 28 78 35 30 39 5f 72 65 61  ....if (x509_rea
18c70 64 5f 72 65 74 20 3c 3d 20 30 29 20 7b 0a 09 09  d_ret <= 0) {...
18c80 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d  .return(-1);...}
18c90 0a 09 7d 0a 0a 23 69 66 64 65 66 20 43 41 43 4b  ..}..#ifdef CACK
18ca0 45 59 5f 50 41 52 41 4e 4f 49 44 0a 23 20 20 69  EY_PARANOID.#  i
18cb0 66 64 65 66 20 5f 50 4f 53 49 58 5f 53 53 49 5a  fdef _POSIX_SSIZ
18cc0 45 5f 4d 41 58 0a 09 69 66 20 28 78 35 30 39 5f  E_MAX..if (x509_
18cd0 72 65 61 64 5f 72 65 74 20 3e 20 5f 50 4f 53 49  read_ret > _POSI
18ce0 58 5f 53 53 49 5a 45 5f 4d 41 58 29 20 7b 0a 09  X_SSIZE_MAX) {..
18cf0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
18d00 49 4e 54 46 28 22 78 35 30 39 5f 72 65 61 64 5f  INTF("x509_read_
18d10 72 65 74 20 65 78 63 65 65 64 73 20 6d 61 78 69  ret exceeds maxi
18d20 6d 75 6d 20 76 61 6c 75 65 2c 20 72 65 74 75 72  mum value, retur
18d30 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 2e  ning in failure.
18d40 20 28 6d 61 78 20 3d 20 25 6c 69 2c 20 78 35 30   (max = %li, x50
18d50 39 5f 72 65 61 64 5f 72 65 74 20 3d 20 25 6c 75  9_read_ret = %lu
18d60 29 22 2c 20 28 6c 6f 6e 67 29 20 5f 50 4f 53 49  )", (long) _POSI
18d70 58 5f 53 53 49 5a 45 5f 4d 41 58 2c 20 28 75 6e  X_SSIZE_MAX, (un
18d80 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 78 35 30  signed long) x50
18d90 39 5f 72 65 61 64 5f 72 65 74 29 3b 0a 0a 09 09  9_read_ret);....
18da0 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 23  return(-1);..}.#
18db0 20 20 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a    endif.#endif..
18dc0 09 72 65 74 75 72 6e 28 78 35 30 39 5f 72 65 61  .return(x509_rea
18dd0 64 5f 72 65 74 29 3b 0a 7d 0a 0a 2f 2a 20 52 65  d_ret);.}../* Re
18de0 74 75 72 6e 73 20 30 20 6f 6e 20 73 75 63 63 65  turns 0 on succe
18df0 73 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ss */.static int
18e00 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 63 72   cackey_mutex_cr
18e10 65 61 74 65 28 76 6f 69 64 20 2a 2a 6d 75 74 65  eate(void **mute
18e20 78 29 20 7b 0a 09 70 74 68 72 65 61 64 5f 6d 75  x) {..pthread_mu
18e30 74 65 78 5f 74 20 2a 70 74 68 72 65 61 64 5f 6d  tex_t *pthread_m
18e40 75 74 65 78 3b 0a 09 69 6e 74 20 70 74 68 72 65  utex;..int pthre
18e50 61 64 5f 72 65 74 76 61 6c 3b 0a 09 43 4b 5f 52  ad_retval;..CK_R
18e60 56 20 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 3b  V custom_retval;
18e70 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
18e80 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
18e90 29 3b 0a 0a 09 69 66 20 28 28 63 61 63 6b 65 79  );...if ((cackey
18ea0 5f 61 72 67 73 2e 66 6c 61 67 73 20 26 20 43 4b  _args.flags & CK
18eb0 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29  F_OS_LOCKING_OK)
18ec0 20 3d 3d 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49   == CKF_OS_LOCKI
18ed0 4e 47 5f 4f 4b 29 20 7b 0a 09 09 70 74 68 72 65  NG_OK) {...pthre
18ee0 61 64 5f 6d 75 74 65 78 20 3d 20 6d 61 6c 6c 6f  ad_mutex = mallo
18ef0 63 28 73 69 7a 65 6f 66 28 2a 70 74 68 72 65 61  c(sizeof(*pthrea
18f00 64 5f 6d 75 74 65 78 29 29 3b 0a 09 09 69 66 20  d_mutex));...if 
18f10 28 21 70 74 68 72 65 61 64 5f 6d 75 74 65 78 29  (!pthread_mutex)
18f20 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
18f30 55 47 5f 50 52 49 4e 54 46 28 22 46 61 69 6c 65  UG_PRINTF("Faile
18f40 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65  d to allocate me
18f50 6d 6f 72 79 2e 22 29 3b 0a 0a 09 09 09 72 65 74  mory.");.....ret
18f60 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09 09  urn(-1);...}....
18f70 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c 20 3d  pthread_retval =
18f80 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 69   pthread_mutex_i
18f90 6e 69 74 28 70 74 68 72 65 61 64 5f 6d 75 74 65  nit(pthread_mute
18fa0 78 2c 20 4e 55 4c 4c 29 3b 0a 09 09 69 66 20 28  x, NULL);...if (
18fb0 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c 20 21  pthread_retval !
18fc0 3d 20 30 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  = 0) {....CACKEY
18fd0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 70  _DEBUG_PRINTF("p
18fe0 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 69 6e 69  thread_mutex_ini
18ff0 74 28 29 20 72 65 74 75 72 6e 65 64 20 65 72 72  t() returned err
19000 6f 72 20 28 25 69 29 2e 22 2c 20 70 74 68 72 65  or (%i).", pthre
19010 61 64 5f 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09  ad_retval);.....
19020 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a  return(-1);...}.
19030 0a 09 09 2a 6d 75 74 65 78 20 3d 20 70 74 68 72  ...*mutex = pthr
19040 65 61 64 5f 6d 75 74 65 78 3b 0a 09 7d 20 65 6c  ead_mutex;..} el
19050 73 65 20 7b 0a 09 09 69 66 20 28 63 61 63 6b 65  se {...if (cacke
19060 79 5f 61 72 67 73 2e 43 72 65 61 74 65 4d 75 74  y_args.CreateMut
19070 65 78 29 20 7b 0a 09 09 09 63 75 73 74 6f 6d 5f  ex) {....custom_
19080 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
19090 61 72 67 73 2e 43 72 65 61 74 65 4d 75 74 65 78  args.CreateMutex
190a0 28 6d 75 74 65 78 29 3b 0a 0a 09 09 09 69 66 20  (mutex);.....if 
190b0 28 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 20 21  (custom_retval !
190c0 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 09 09  = CKR_OK) {.....
190d0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
190e0 4e 54 46 28 22 63 61 63 6b 65 79 5f 61 72 67 73  NTF("cackey_args
190f0 2e 43 72 65 61 74 65 4d 75 74 65 78 28 29 20 72  .CreateMutex() r
19100 65 74 75 72 6e 65 64 20 65 72 72 6f 72 20 28 25  eturned error (%
19110 6c 69 29 2e 22 2c 20 28 6c 6f 6e 67 29 20 63 75  li).", (long) cu
19120 73 74 6f 6d 5f 72 65 74 76 61 6c 29 3b 0a 0a 09  stom_retval);...
19130 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09  ...return(-1);..
19140 09 09 7d 0a 09 09 7d 0a 09 7d 0a 0a 09 43 41 43  ..}...}..}...CAC
19150 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
19160 28 22 52 65 74 75 72 6e 69 6e 67 20 73 75 63 65  ("Returning suce
19170 73 73 66 75 6c 6c 79 20 28 30 29 22 29 3b 0a 0a  ssfully (0)");..
19180 09 72 65 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a 2f  .return(0);.}../
19190 2a 20 52 65 74 75 72 6e 73 20 30 20 6f 6e 20 73  * Returns 0 on s
191a0 75 63 63 65 73 73 20 2a 2f 0a 73 74 61 74 69 63  uccess */.static
191b0 20 69 6e 74 20 63 61 63 6b 65 79 5f 6d 75 74 65   int cackey_mute
191c0 78 5f 6c 6f 63 6b 28 76 6f 69 64 20 2a 6d 75 74  x_lock(void *mut
191d0 65 78 29 20 7b 0a 09 70 74 68 72 65 61 64 5f 6d  ex) {..pthread_m
191e0 75 74 65 78 5f 74 20 2a 70 74 68 72 65 61 64 5f  utex_t *pthread_
191f0 6d 75 74 65 78 3b 0a 09 69 6e 74 20 70 74 68 72  mutex;..int pthr
19200 65 61 64 5f 72 65 74 76 61 6c 3b 0a 09 43 4b 5f  ead_retval;..CK_
19210 52 56 20 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c  RV custom_retval
19220 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
19230 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
19240 22 29 3b 0a 0a 09 69 66 20 28 28 63 61 63 6b 65  ");...if ((cacke
19250 79 5f 61 72 67 73 2e 66 6c 61 67 73 20 26 20 43  y_args.flags & C
19260 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b  KF_OS_LOCKING_OK
19270 29 20 3d 3d 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b  ) == CKF_OS_LOCK
19280 49 4e 47 5f 4f 4b 29 20 7b 0a 09 09 70 74 68 72  ING_OK) {...pthr
19290 65 61 64 5f 6d 75 74 65 78 20 3d 20 6d 75 74 65  ead_mutex = mute
192a0 78 3b 0a 0a 09 09 70 74 68 72 65 61 64 5f 72 65  x;....pthread_re
192b0 74 76 61 6c 20 3d 20 70 74 68 72 65 61 64 5f 6d  tval = pthread_m
192c0 75 74 65 78 5f 6c 6f 63 6b 28 70 74 68 72 65 61  utex_lock(pthrea
192d0 64 5f 6d 75 74 65 78 29 3b 0a 09 09 69 66 20 28  d_mutex);...if (
192e0 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c 20 21  pthread_retval !
192f0 3d 20 30 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  = 0) {....CACKEY
19300 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 70  _DEBUG_PRINTF("p
19310 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 6c 6f 63  thread_mutex_loc
19320 6b 28 29 20 72 65 74 75 72 6e 65 64 20 65 72 72  k() returned err
19330 6f 72 20 28 25 69 29 2e 22 2c 20 70 74 68 72 65  or (%i).", pthre
19340 61 64 5f 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09  ad_retval);.....
19350 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a  return(-1);...}.
19360 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69 66 20 28  .} else {...if (
19370 63 61 63 6b 65 79 5f 61 72 67 73 2e 4c 6f 63 6b  cackey_args.Lock
19380 4d 75 74 65 78 29 20 7b 0a 09 09 09 63 75 73 74  Mutex) {....cust
19390 6f 6d 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  om_retval = cack
193a0 65 79 5f 61 72 67 73 2e 4c 6f 63 6b 4d 75 74 65  ey_args.LockMute
193b0 78 28 6d 75 74 65 78 29 3b 0a 0a 09 09 09 69 66  x(mutex);.....if
193c0 20 28 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 20   (custom_retval 
193d0 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 09  != CKR_OK) {....
193e0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
193f0 49 4e 54 46 28 22 63 61 63 6b 65 79 5f 61 72 67  INTF("cackey_arg
19400 73 2e 4c 6f 63 6b 4d 75 74 65 78 28 29 20 72 65  s.LockMutex() re
19410 74 75 72 6e 65 64 20 65 72 72 6f 72 20 28 25 6c  turned error (%l
19420 69 29 2e 22 2c 20 28 6c 6f 6e 67 29 20 63 75 73  i).", (long) cus
19430 74 6f 6d 5f 72 65 74 76 61 6c 29 3b 0a 0a 09 09  tom_retval);....
19440 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09  ..return(-1);...
19450 09 7d 0a 09 09 7d 0a 09 7d 0a 0a 09 43 41 43 4b  .}...}..}...CACK
19460 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
19470 22 52 65 74 75 72 6e 69 6e 67 20 73 75 63 65 73  "Returning suces
19480 73 66 75 6c 6c 79 20 28 30 29 22 29 3b 0a 0a 09  sfully (0)");...
19490 72 65 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a 2f 2a  return(0);.}../*
194a0 20 52 65 74 75 72 6e 73 20 30 20 6f 6e 20 73 75   Returns 0 on su
194b0 63 63 65 73 73 20 2a 2f 0a 73 74 61 74 69 63 20  ccess */.static 
194c0 69 6e 74 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  int cackey_mutex
194d0 5f 75 6e 6c 6f 63 6b 28 76 6f 69 64 20 2a 6d 75  _unlock(void *mu
194e0 74 65 78 29 20 7b 0a 09 70 74 68 72 65 61 64 5f  tex) {..pthread_
194f0 6d 75 74 65 78 5f 74 20 2a 70 74 68 72 65 61 64  mutex_t *pthread
19500 5f 6d 75 74 65 78 3b 0a 09 69 6e 74 20 70 74 68  _mutex;..int pth
19510 72 65 61 64 5f 72 65 74 76 61 6c 3b 0a 09 43 4b  read_retval;..CK
19520 5f 52 56 20 63 75 73 74 6f 6d 5f 72 65 74 76 61  _RV custom_retva
19530 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  l;...CACKEY_DEBU
19540 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
19550 2e 22 29 3b 0a 0a 09 69 66 20 28 28 63 61 63 6b  .");...if ((cack
19560 65 79 5f 61 72 67 73 2e 66 6c 61 67 73 20 26 20  ey_args.flags & 
19570 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f  CKF_OS_LOCKING_O
19580 4b 29 20 3d 3d 20 43 4b 46 5f 4f 53 5f 4c 4f 43  K) == CKF_OS_LOC
19590 4b 49 4e 47 5f 4f 4b 29 20 7b 0a 09 09 70 74 68  KING_OK) {...pth
195a0 72 65 61 64 5f 6d 75 74 65 78 20 3d 20 6d 75 74  read_mutex = mut
195b0 65 78 3b 0a 0a 09 09 70 74 68 72 65 61 64 5f 72  ex;....pthread_r
195c0 65 74 76 61 6c 20 3d 20 70 74 68 72 65 61 64 5f  etval = pthread_
195d0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 70 74 68  mutex_unlock(pth
195e0 72 65 61 64 5f 6d 75 74 65 78 29 3b 0a 09 09 69  read_mutex);...i
195f0 66 20 28 70 74 68 72 65 61 64 5f 72 65 74 76 61  f (pthread_retva
19600 6c 20 21 3d 20 30 29 20 7b 0a 09 09 09 43 41 43  l != 0) {....CAC
19610 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
19620 28 22 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f  ("pthread_mutex_
19630 75 6e 6c 6f 63 6b 28 29 20 72 65 74 75 72 6e 65  unlock() returne
19640 64 20 65 72 72 6f 72 20 28 25 69 29 2e 22 2c 20  d error (%i).", 
19650 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c 29 3b  pthread_retval);
19660 0a 0a 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b  .....return(-1);
19670 0a 09 09 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09  ...}..} else {..
19680 09 69 66 20 28 63 61 63 6b 65 79 5f 61 72 67 73  .if (cackey_args
19690 2e 55 6e 6c 6f 63 6b 4d 75 74 65 78 29 20 7b 0a  .UnlockMutex) {.
196a0 09 09 09 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c  ...custom_retval
196b0 20 3d 20 63 61 63 6b 65 79 5f 61 72 67 73 2e 55   = cackey_args.U
196c0 6e 6c 6f 63 6b 4d 75 74 65 78 28 6d 75 74 65 78  nlockMutex(mutex
196d0 29 3b 0a 0a 09 09 09 69 66 20 28 63 75 73 74 6f  );.....if (custo
196e0 6d 5f 72 65 74 76 61 6c 20 21 3d 20 43 4b 52 5f  m_retval != CKR_
196f0 4f 4b 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59  OK) {.....CACKEY
19700 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 63  _DEBUG_PRINTF("c
19710 61 63 6b 65 79 5f 61 72 67 73 2e 55 6e 6c 6f 63  ackey_args.Unloc
19720 6b 4d 75 74 65 78 28 29 20 72 65 74 75 72 6e 65  kMutex() returne
19730 64 20 65 72 72 6f 72 20 28 25 6c 69 29 2e 22 2c  d error (%li).",
19740 20 28 6c 6f 6e 67 29 20 63 75 73 74 6f 6d 5f 72   (long) custom_r
19750 65 74 76 61 6c 29 3b 0a 0a 09 09 09 09 72 65 74  etval);......ret
19760 75 72 6e 28 2d 31 29 3b 0a 09 09 09 7d 0a 09 09  urn(-1);....}...
19770 7d 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  }..}...CACKEY_DE
19780 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
19790 72 6e 69 6e 67 20 73 75 63 65 73 73 66 75 6c 6c  rning sucessfull
197a0 79 20 28 30 29 22 29 3b 0a 0a 09 72 65 74 75 72  y (0)");...retur
197b0 6e 28 30 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  n(0);.}..static 
197c0 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52  CK_ATTRIBUTE_PTR
197d0 20 63 61 63 6b 65 79 5f 67 65 74 5f 61 74 74 72   cackey_get_attr
197e0 69 62 75 74 65 73 28 43 4b 5f 4f 42 4a 45 43 54  ibutes(CK_OBJECT
197f0 5f 43 4c 41 53 53 20 6f 62 6a 65 63 74 63 6c 61  _CLASS objectcla
19800 73 73 2c 20 73 74 72 75 63 74 20 63 61 63 6b 65  ss, struct cacke
19810 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20  y_pcsc_identity 
19820 2a 69 64 65 6e 74 69 74 79 2c 20 75 6e 73 69 67  *identity, unsig
19830 6e 65 64 20 6c 6f 6e 67 20 69 64 65 6e 74 69 74  ned long identit
19840 79 5f 6e 75 6d 2c 20 43 4b 5f 55 4c 4f 4e 47 5f  y_num, CK_ULONG_
19850 50 54 52 20 70 75 6c 43 6f 75 6e 74 29 20 7b 0a  PTR pulCount) {.
19860 09 73 74 61 74 69 63 20 43 4b 5f 42 42 4f 4f 4c  .static CK_BBOOL
19870 20 63 6b 5f 74 72 75 65 20 3d 20 31 3b 0a 09 73   ck_true = 1;..s
19880 74 61 74 69 63 20 43 4b 5f 42 42 4f 4f 4c 20 63  tatic CK_BBOOL c
19890 6b 5f 66 61 6c 73 65 20 3d 20 30 3b 0a 09 73 74  k_false = 0;..st
198a0 61 74 69 63 20 43 4b 5f 54 52 55 53 54 20 63 6b  atic CK_TRUST ck
198b0 5f 74 72 75 73 74 65 64 20 3d 20 43 4b 5f 54 52  _trusted = CK_TR
198c0 55 53 54 45 44 5f 44 45 4c 45 47 41 54 4f 52 3b  USTED_DELEGATOR;
198d0 0a 09 43 4b 5f 55 4c 4f 4e 47 20 6e 75 6d 61 74  ..CK_ULONG numat
198e0 74 72 73 20 3d 20 30 2c 20 72 65 74 76 61 6c 5f  trs = 0, retval_
198f0 63 6f 75 6e 74 3b 0a 09 43 4b 5f 41 54 54 52 49  count;..CK_ATTRI
19900 42 55 54 45 5f 54 59 50 45 20 63 75 72 72 5f 61  BUTE_TYPE curr_a
19910 74 74 72 5f 74 79 70 65 3b 0a 09 43 4b 5f 41 54  ttr_type;..CK_AT
19920 54 52 49 42 55 54 45 20 63 75 72 72 5f 61 74 74  TRIBUTE curr_att
19930 72 2c 20 2a 72 65 74 76 61 6c 3b 0a 09 43 4b 5f  r, *retval;..CK_
19940 56 4f 49 44 5f 50 54 52 20 70 56 61 6c 75 65 3b  VOID_PTR pValue;
19950 0a 09 43 4b 5f 55 4c 4f 4e 47 20 75 6c 56 61 6c  ..CK_ULONG ulVal
19960 75 65 4c 65 6e 3b 0a 09 43 4b 5f 4f 42 4a 45 43  ueLen;..CK_OBJEC
19970 54 5f 43 4c 41 53 53 20 63 6b 5f 6f 62 6a 65 63  T_CLASS ck_objec
19980 74 5f 63 6c 61 73 73 3b 0a 09 43 4b 5f 43 45 52  t_class;..CK_CER
19990 54 49 46 49 43 41 54 45 5f 54 59 50 45 20 63 6b  TIFICATE_TYPE ck
199a0 5f 63 65 72 74 69 66 69 63 61 74 65 5f 74 79 70  _certificate_typ
199b0 65 3b 0a 09 43 4b 5f 4b 45 59 5f 54 59 50 45 20  e;..CK_KEY_TYPE 
199c0 63 6b 5f 6b 65 79 5f 74 79 70 65 3b 0a 09 43 4b  ck_key_type;..CK
199d0 5f 55 54 46 38 43 48 41 52 20 75 63 54 6d 70 42  _UTF8CHAR ucTmpB
199e0 75 66 5b 31 30 32 34 5d 3b 0a 09 53 48 41 31 43  uf[1024];..SHA1C
199f0 6f 6e 74 65 78 74 20 73 68 61 31 5f 63 74 78 3b  ontext sha1_ctx;
19a00 0a 09 4d 44 35 5f 43 54 58 20 6d 64 35 5f 63 74  ..MD5_CTX md5_ct
19a10 78 3b 0a 09 75 69 6e 74 38 5f 74 20 73 68 61 31  x;..uint8_t sha1
19a20 5f 68 61 73 68 5b 53 48 41 31 48 61 73 68 53 69  _hash[SHA1HashSi
19a30 7a 65 5d 3b 0a 09 75 69 6e 74 38 5f 74 20 6d 64  ze];..uint8_t md
19a40 35 5f 68 61 73 68 5b 4d 44 35 48 61 73 68 53 69  5_hash[MD5HashSi
19a50 7a 65 5d 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63  ze];..unsigned c
19a60 68 61 72 20 2a 63 65 72 74 69 66 69 63 61 74 65  har *certificate
19a70 3b 0a 09 73 73 69 7a 65 5f 74 20 63 65 72 74 69  ;..ssize_t certi
19a80 66 69 63 61 74 65 5f 6c 65 6e 20 3d 20 2d 31 2c  ficate_len = -1,
19a90 20 78 35 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a   x509_read_ret;.
19aa0 09 69 6e 74 20 70 56 61 6c 75 65 5f 66 72 65 65  .int pValue_free
19ab0 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
19ac0 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 20  _PRINTF("Called 
19ad0 28 6f 62 6a 65 63 74 43 6c 61 73 73 20 3d 20 25  (objectClass = %
19ae0 6c 75 2c 20 69 64 65 6e 74 69 74 79 5f 6e 75 6d  lu, identity_num
19af0 20 3d 20 25 6c 75 29 2e 22 2c 20 28 75 6e 73 69   = %lu).", (unsi
19b00 67 6e 65 64 20 6c 6f 6e 67 29 20 6f 62 6a 65 63  gned long) objec
19b10 74 63 6c 61 73 73 2c 20 69 64 65 6e 74 69 74 79  tclass, identity
19b20 5f 6e 75 6d 29 3b 0a 0a 09 2a 70 75 6c 43 6f 75  _num);...*pulCou
19b30 6e 74 20 3d 20 30 3b 0a 0a 09 69 66 20 28 6f 62  nt = 0;...if (ob
19b40 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f  jectclass != CKO
19b50 5f 43 45 52 54 49 46 49 43 41 54 45 20 26 26 20  _CERTIFICATE && 
19b60 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43  objectclass != C
19b70 4b 4f 5f 50 55 42 4c 49 43 5f 4b 45 59 20 26 26  KO_PUBLIC_KEY &&
19b80 20 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20   objectclass != 
19b90 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b 45 59 20  CKO_PRIVATE_KEY 
19ba0 26 26 20 6f 62 6a 65 63 74 63 6c 61 73 73 20 21  && objectclass !
19bb0 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54  = CKO_NETSCAPE_T
19bc0 52 55 53 54 29 20 7b 0a 09 09 43 41 43 4b 45 59  RUST) {...CACKEY
19bd0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
19be0 65 74 75 72 6e 69 6e 67 20 30 20 6f 62 6a 65 63  eturning 0 objec
19bf0 74 73 20 28 4e 55 4c 4c 29 2c 20 69 6e 76 61 6c  ts (NULL), inval
19c00 69 64 20 6f 62 6a 65 63 74 20 63 6c 61 73 73 22  id object class"
19c10 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c  );....return(NUL
19c20 4c 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 47 65 74 20  L);..}.../* Get 
19c30 43 65 72 74 20 2a 2f 0a 09 69 66 20 28 69 64 65  Cert */..if (ide
19c40 6e 74 69 74 79 20 3d 3d 20 4e 55 4c 4c 29 20 7b  ntity == NULL) {
19c50 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
19c60 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
19c70 67 20 30 20 6f 62 6a 65 63 74 73 20 28 4e 55 4c  g 0 objects (NUL
19c80 4c 29 2c 20 69 6e 76 61 6c 69 64 20 69 64 65 6e  L), invalid iden
19c90 74 69 79 20 70 72 6f 76 69 64 65 64 22 29 3b 0a  tiy provided");.
19ca0 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b  ...return(NULL);
19cb0 0a 09 7d 0a 0a 09 63 65 72 74 69 66 69 63 61 74  ..}...certificat
19cc0 65 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e 63 65  e = identity->ce
19cd0 72 74 69 66 69 63 61 74 65 3b 0a 09 63 65 72 74  rtificate;..cert
19ce0 69 66 69 63 61 74 65 5f 6c 65 6e 20 3d 20 69 64  ificate_len = id
19cf0 65 6e 74 69 74 79 2d 3e 63 65 72 74 69 66 69 63  entity->certific
19d00 61 74 65 5f 6c 65 6e 3b 0a 0a 09 69 66 20 28 63  ate_len;...if (c
19d10 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3d  ertificate_len =
19d20 3d 20 2d 31 20 7c 7c 20 63 65 72 74 69 66 69 63  = -1 || certific
19d30 61 74 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ate == NULL) {..
19d40 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
19d50 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
19d60 30 20 6f 62 6a 65 63 74 73 20 28 4e 55 4c 4c 29  0 objects (NULL)
19d70 2c 20 74 68 69 73 20 69 64 65 6e 74 69 74 79 20  , this identity 
19d80 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 61 6e  does not have an
19d90 20 58 2e 35 30 39 20 63 65 72 74 69 66 69 63 61   X.509 certifica
19da0 74 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  te associated wi
19db0 74 68 20 69 74 20 61 6e 64 20 77 69 6c 6c 20 6e  th it and will n
19dc0 6f 74 20 77 6f 72 6b 22 29 3b 0a 0a 09 09 72 65  ot work");....re
19dd0 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a  turn(NULL);..}..
19de0 09 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20  ./* Verify that 
19df0 63 65 72 74 69 66 69 63 61 74 65 20 69 73 20 41  certificate is A
19e00 53 4e 2e 31 20 65 6e 63 6f 64 65 64 20 58 2e 35  SN.1 encoded X.5
19e10 30 39 20 63 65 72 74 69 66 69 63 61 74 65 20 2a  09 certificate *
19e20 2f 0a 09 69 66 20 28 78 35 30 39 5f 74 6f 5f 73  /..if (x509_to_s
19e30 65 72 69 61 6c 28 63 65 72 74 69 66 69 63 61 74  erial(certificat
19e40 65 2c 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c  e, certificate_l
19e50 65 6e 2c 20 4e 55 4c 4c 29 20 3c 20 30 29 20 7b  en, NULL) < 0) {
19e60 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
19e70 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
19e80 67 20 30 20 6f 62 6a 65 63 74 73 20 28 4e 55 4c  g 0 objects (NUL
19e90 4c 29 2c 20 74 68 65 20 58 2e 35 30 39 20 63 65  L), the X.509 ce
19ea0 72 74 69 66 69 63 61 74 65 20 61 73 73 6f 63 69  rtificate associ
19eb0 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20 69  ated with this i
19ec0 64 65 6e 74 69 74 79 20 69 73 20 6e 6f 74 20 76  dentity is not v
19ed0 61 6c 69 64 22 29 3b 0a 0a 09 09 72 65 74 75 72  alid");....retur
19ee0 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 72 65  n(NULL);..}...re
19ef0 74 76 61 6c 5f 63 6f 75 6e 74 20 3d 20 36 34 3b  tval_count = 64;
19f00 0a 09 72 65 74 76 61 6c 20 3d 20 6d 61 6c 6c 6f  ..retval = mallo
19f10 63 28 72 65 74 76 61 6c 5f 63 6f 75 6e 74 20 2a  c(retval_count *
19f20 20 73 69 7a 65 6f 66 28 2a 72 65 74 76 61 6c 29   sizeof(*retval)
19f30 29 3b 0a 0a 09 66 6f 72 20 28 63 75 72 72 5f 61  );...for (curr_a
19f40 74 74 72 5f 74 79 70 65 20 3d 20 30 3b 20 63 75  ttr_type = 0; cu
19f50 72 72 5f 61 74 74 72 5f 74 79 70 65 20 3c 20 30  rr_attr_type < 0
19f60 78 63 65 35 33 36 33 62 66 3b 20 63 75 72 72 5f  xce5363bf; curr_
19f70 61 74 74 72 5f 74 79 70 65 2b 2b 29 20 7b 0a 09  attr_type++) {..
19f80 09 69 66 20 28 63 75 72 72 5f 61 74 74 72 5f 74  .if (curr_attr_t
19f90 79 70 65 20 3d 3d 20 30 78 38 30 30 29 20 7b 0a  ype == 0x800) {.
19fa0 09 09 09 63 75 72 72 5f 61 74 74 72 5f 74 79 70  ...curr_attr_typ
19fb0 65 20 3d 20 30 78 63 65 35 33 36 33 30 30 3b 0a  e = 0xce536300;.
19fc0 09 09 7d 0a 0a 09 09 70 56 61 6c 75 65 5f 66 72  ..}....pValue_fr
19fd0 65 65 20 3d 20 30 3b 0a 09 09 70 56 61 6c 75 65  ee = 0;...pValue
19fe0 20 3d 20 4e 55 4c 4c 3b 0a 09 09 75 6c 56 61 6c   = NULL;...ulVal
19ff0 75 65 4c 65 6e 20 3d 20 28 43 4b 5f 4c 4f 4e 47  ueLen = (CK_LONG
1a000 29 20 2d 31 3b 0a 0a 09 09 73 77 69 74 63 68 20  ) -1;....switch 
1a010 28 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29  (curr_attr_type)
1a020 20 7b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 43   {....case CKA_C
1a030 4c 41 53 53 3a 0a 09 09 09 09 43 41 43 4b 45 59  LASS:.....CACKEY
1a040 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
1a050 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62  equesting attrib
1a060 75 74 65 20 43 4b 41 5f 43 4c 41 53 53 20 28 30  ute CKA_CLASS (0
1a070 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75  x%08lx) ...", (u
1a080 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75  nsigned long) cu
1a090 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a  rr_attr_type);..
1a0a0 09 09 09 09 63 6b 5f 6f 62 6a 65 63 74 5f 63 6c  ....ck_object_cl
1a0b0 61 73 73 20 3d 20 6f 62 6a 65 63 74 63 6c 61 73  ass = objectclas
1a0c0 73 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d  s;......pValue =
1a0d0 20 26 63 6b 5f 6f 62 6a 65 63 74 5f 63 6c 61 73   &ck_object_clas
1a0e0 73 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65  s;.....ulValueLe
1a0f0 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 6f 62  n = sizeof(ck_ob
1a100 6a 65 63 74 5f 63 6c 61 73 73 29 3b 0a 0a 09 09  ject_class);....
1a110 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1a120 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75  RINTF(" ... retu
1a130 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c  rning %lu (%p/%l
1a140 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  u)", (unsigned l
1a150 6f 6e 67 29 20 2a 28 28 43 4b 5f 4f 42 4a 45 43  ong) *((CK_OBJEC
1a160 54 5f 43 4c 41 53 53 20 2a 29 20 70 56 61 6c 75  T_CLASS *) pValu
1a170 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73  e), pValue, (uns
1a180 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61  igned long) ulVa
1a190 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72  lueLen);......br
1a1a0 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41  eak;....case CKA
1a1b0 5f 54 4f 4b 45 4e 3a 0a 09 09 09 09 43 41 43 4b  _TOKEN:.....CACK
1a1c0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1a1d0 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72  "Requesting attr
1a1e0 69 62 75 74 65 20 43 4b 41 5f 54 4f 4b 45 4e 20  ibute CKA_TOKEN 
1a1f0 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20  (0x%08lx) ...", 
1a200 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
1a210 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b  curr_attr_type);
1a220 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26  ......pValue = &
1a230 63 6b 5f 74 72 75 65 3b 0a 09 09 09 09 75 6c 56  ck_true;.....ulV
1a240 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66  alueLen = sizeof
1a250 28 63 6b 5f 74 72 75 65 29 3b 0a 0a 09 09 09 09  (ck_true);......
1a260 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1a270 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e  NTF(" ... return
1a280 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29  ing %lu (%p/%lu)
1a290 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
1a2a0 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a  g) *((CK_BBOOL *
1a2b0 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75  ) pValue), pValu
1a2c0 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  e, (unsigned lon
1a2d0 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a  g) ulValueLen);.
1a2e0 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
1a2f0 61 73 65 20 43 4b 41 5f 50 52 49 56 41 54 45 3a  ase CKA_PRIVATE:
1a300 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
1a310 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73  G_PRINTF("Reques
1a320 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43  ting attribute C
1a330 4b 41 5f 50 52 49 56 41 54 45 20 28 30 78 25 30  KA_PRIVATE (0x%0
1a340 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69  8lx) ...", (unsi
1a350 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f  gned long) curr_
1a360 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09  attr_type);.....
1a370 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73  .if (objectclass
1a380 20 21 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45   != CKO_NETSCAPE
1a390 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 09 09 43  _TRUST) {......C
1a3a0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1a3b0 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74  TF(" ... but not
1a3c0 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 61   getting it beca
1a3d0 75 73 65 20 77 65 20 61 72 65 20 6e 6f 74 20 61  use we are not a
1a3e0 20 4e 65 74 73 63 61 70 65 20 74 72 75 73 74 20   Netscape trust 
1a3f0 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09  object");.......
1a400 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09  break;.....}....
1a410 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 66  ..pValue = &ck_f
1a420 61 6c 73 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75  alse;.....ulValu
1a430 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b  eLen = sizeof(ck
1a440 5f 66 61 6c 73 65 29 3b 0a 0a 09 09 09 09 43 41  _false);......CA
1a450 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1a460 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e  F(" ... returnin
1a470 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c  g %lu (%p/%lu)",
1a480 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
1a490 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20   *((CK_BBOOL *) 
1a4a0 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c  pValue), pValue,
1a4b0 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
1a4c0 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09   ulValueLen);...
1a4d0 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
1a4e0 65 20 43 4b 41 5f 54 52 55 53 54 45 44 3a 0a 09  e CKA_TRUSTED:..
1a4f0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1a500 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69  PRINTF("Requesti
1a510 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41  ng attribute CKA
1a520 5f 54 52 55 53 54 45 44 20 28 30 78 25 30 38 6c  _TRUSTED (0x%08l
1a530 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e  x) ...", (unsign
1a540 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74  ed long) curr_at
1a550 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69  tr_type);......i
1a560 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d  f (objectclass =
1a570 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54  = CKO_NETSCAPE_T
1a580 52 55 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43  RUST) {......CAC
1a590 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1a5a0 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67  (" ... but not g
1a5b0 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73  etting it becaus
1a5c0 65 20 77 65 20 61 72 65 20 61 20 4e 65 74 73 63  e we are a Netsc
1a5d0 61 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74  ape trust object
1a5e0 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b  ");.......break;
1a5f0 0a 09 09 09 09 7d 0a 0a 09 09 09 09 70 56 61 6c  .....}......pVal
1a600 75 65 20 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09  ue = &ck_true;..
1a610 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  ...ulValueLen = 
1a620 73 69 7a 65 6f 66 28 63 6b 5f 74 72 75 65 29 3b  sizeof(ck_true);
1a630 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
1a640 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
1a650 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25  returning %lu (%
1a660 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e  p/%lu)", (unsign
1a670 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42  ed long) *((CK_B
1a680 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c  BOOL *) pValue),
1a690 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e   pValue, (unsign
1a6a0 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65  ed long) ulValue
1a6b0 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b  Len);......break
1a6c0 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 4d 4f  ;....case CKA_MO
1a6d0 44 49 46 49 41 42 4c 45 3a 0a 09 09 09 09 43 41  DIFIABLE:.....CA
1a6e0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1a6f0 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74  F("Requesting at
1a700 74 72 69 62 75 74 65 20 43 4b 41 5f 4d 4f 44 49  tribute CKA_MODI
1a710 46 49 41 42 4c 45 20 28 30 78 25 30 38 6c 78 29  FIABLE (0x%08lx)
1a720 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64   ...", (unsigned
1a730 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72   long) curr_attr
1a740 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 70 56 61  _type);......pVa
1a750 6c 75 65 20 3d 20 26 63 6b 5f 66 61 6c 73 65 3b  lue = &ck_false;
1a760 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20  .....ulValueLen 
1a770 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 66 61 6c 73  = sizeof(ck_fals
1a780 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f  e);......CACKEY_
1a790 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
1a7a0 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75  .. returning %lu
1a7b0 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73   (%p/%lu)", (uns
1a7c0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43  igned long) *((C
1a7d0 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75  K_BBOOL *) pValu
1a7e0 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73  e), pValue, (uns
1a7f0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61  igned long) ulVa
1a800 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72  lueLen);......br
1a810 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41  eak;....case CKA
1a820 5f 4c 41 42 45 4c 3a 0a 09 09 09 09 43 41 43 4b  _LABEL:.....CACK
1a830 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1a840 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72  "Requesting attr
1a850 69 62 75 74 65 20 43 4b 41 5f 4c 41 42 45 4c 20  ibute CKA_LABEL 
1a860 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20  (0x%08lx) ...", 
1a870 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
1a880 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b  curr_attr_type);
1a890 0a 0a 09 09 09 09 69 66 20 28 69 64 65 6e 74 69  ......if (identi
1a8a0 74 79 2d 3e 69 64 5f 74 79 70 65 20 3d 3d 20 43  ty->id_type == C
1a8b0 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 50 49  ACKEY_ID_TYPE_PI
1a8c0 56 29 20 7b 0a 09 09 09 09 09 70 56 61 6c 75 65  V) {......pValue
1a8d0 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e 63 61 72   = identity->car
1a8e0 64 2e 70 69 76 2e 6c 61 62 65 6c 3b 0a 09 09 09  d.piv.label;....
1a8f0 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73  ..ulValueLen = s
1a900 74 72 6c 65 6e 28 70 56 61 6c 75 65 29 3b 0a 09  trlen(pValue);..
1a910 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09  ...} else {.....
1a920 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 6e  .ulValueLen = sn
1a930 70 72 69 6e 74 66 28 28 63 68 61 72 20 2a 29 20  printf((char *) 
1a940 75 63 54 6d 70 42 75 66 2c 20 73 69 7a 65 6f 66  ucTmpBuf, sizeof
1a950 28 75 63 54 6d 70 42 75 66 29 2c 20 22 49 64 65  (ucTmpBuf), "Ide
1a960 6e 74 69 74 79 20 23 25 6c 75 22 2c 20 28 75 6e  ntity #%lu", (un
1a970 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 69 64 65  signed long) ide
1a980 6e 74 69 74 79 5f 6e 75 6d 29 3b 0a 09 09 09 09  ntity_num);.....
1a990 09 70 56 61 6c 75 65 20 3d 20 75 63 54 6d 70 42  .pValue = ucTmpB
1a9a0 75 66 3b 0a 0a 09 09 09 09 09 69 66 20 28 75 6c  uf;.......if (ul
1a9b0 56 61 6c 75 65 4c 65 6e 20 3e 3d 20 73 69 7a 65  ValueLen >= size
1a9c0 6f 66 28 75 63 54 6d 70 42 75 66 29 29 20 7b 0a  of(ucTmpBuf)) {.
1a9d0 09 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e  ......ulValueLen
1a9e0 20 3d 20 30 3b 0a 09 09 09 09 09 09 70 56 61 6c   = 0;.......pVal
1a9f0 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 09  ue = NULL;......
1aa00 7d 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43  }.....}......CAC
1aa10 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1aa20 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67  (" ... returning
1aa30 20 28 25 70 2f 25 6c 75 29 22 2c 20 70 56 61 6c   (%p/%lu)", pVal
1aa40 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  ue, (unsigned lo
1aa50 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b  ng) ulValueLen);
1aa60 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
1aa70 63 61 73 65 20 43 4b 41 5f 56 41 4c 55 45 3a 0a  case CKA_VALUE:.
1aa80 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
1aa90 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74  _PRINTF("Request
1aaa0 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b  ing attribute CK
1aab0 41 5f 56 41 4c 55 45 20 28 30 78 25 30 38 6c 78  A_VALUE (0x%08lx
1aac0 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65  ) ...", (unsigne
1aad0 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74  d long) curr_att
1aae0 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 73 77  r_type);......sw
1aaf0 69 74 63 68 20 28 6f 62 6a 65 63 74 63 6c 61 73  itch (objectclas
1ab00 73 29 20 7b 0a 09 09 09 09 09 63 61 73 65 20 43  s) {......case C
1ab10 4b 4f 5f 50 52 49 56 41 54 45 5f 4b 45 59 3a 0a  KO_PRIVATE_KEY:.
1ab20 09 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
1ab30 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
1ab40 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20  but not getting 
1ab50 69 74 20 62 65 63 61 75 73 65 20 77 65 20 61 72  it because we ar
1ab60 65 20 61 20 70 72 69 76 61 74 65 20 6b 65 79 2e  e a private key.
1ab70 22 29 3b 0a 0a 09 09 09 09 09 09 62 72 65 61 6b  ");........break
1ab80 3b 0a 09 09 09 09 09 63 61 73 65 20 43 4b 4f 5f  ;......case CKO_
1ab90 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54 3a 0a  NETSCAPE_TRUST:.
1aba0 09 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
1abb0 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
1abc0 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20  but not getting 
1abd0 69 74 20 62 65 63 61 75 73 65 20 77 65 20 61 72  it because we ar
1abe0 65 20 61 20 4e 65 74 73 63 61 70 65 20 74 72 75  e a Netscape tru
1abf0 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09  st object");....
1ac00 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09  ....break;......
1ac10 63 61 73 65 20 43 4b 4f 5f 50 55 42 4c 49 43 5f  case CKO_PUBLIC_
1ac20 4b 45 59 3a 0a 09 09 09 09 09 09 69 66 20 28 63  KEY:.......if (c
1ac30 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3e  ertificate_len >
1ac40 3d 20 30 29 20 7b 0a 09 09 09 09 09 09 09 78 35  = 0) {........x5
1ac50 30 39 5f 72 65 61 64 5f 72 65 74 20 3d 20 78 35  09_read_ret = x5
1ac60 30 39 5f 74 6f 5f 70 75 62 6b 65 79 28 63 65 72  09_to_pubkey(cer
1ac70 74 69 66 69 63 61 74 65 2c 20 63 65 72 74 69 66  tificate, certif
1ac80 69 63 61 74 65 5f 6c 65 6e 2c 20 26 70 56 61 6c  icate_len, &pVal
1ac90 75 65 29 3b 0a 09 09 09 09 09 09 09 69 66 20 28  ue);........if (
1aca0 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3c 20  x509_read_ret < 
1acb0 30 29 20 7b 20 0a 09 09 09 09 09 09 09 09 70 56  0) { .........pV
1acc0 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09  alue = NULL;....
1acd0 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ....} else {....
1ace0 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20  .....ulValueLen 
1acf0 3d 20 78 35 30 39 5f 72 65 61 64 5f 72 65 74 3b  = x509_read_ret;
1ad00 0a 09 09 09 09 09 09 09 7d 0a 09 09 09 09 09 09  ........}.......
1ad10 7d 0a 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a  }........break;.
1ad20 09 09 09 09 09 63 61 73 65 20 43 4b 4f 5f 43 45  .....case CKO_CE
1ad30 52 54 49 46 49 43 41 54 45 3a 0a 09 09 09 09 09  RTIFICATE:......
1ad40 09 70 56 61 6c 75 65 20 3d 20 63 65 72 74 69 66  .pValue = certif
1ad50 69 63 61 74 65 3b 0a 09 09 09 09 09 09 75 6c 56  icate;.......ulV
1ad60 61 6c 75 65 4c 65 6e 20 3d 20 63 65 72 74 69 66  alueLen = certif
1ad70 69 63 61 74 65 5f 6c 65 6e 3b 0a 0a 09 09 09 09  icate_len;......
1ad80 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a  ..break;.....}..
1ad90 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
1ada0 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65  _PRINTF(" ... re
1adb0 74 75 72 6e 69 6e 67 20 25 70 2f 25 6c 75 22 2c  turning %p/%lu",
1adc0 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e   pValue, (unsign
1add0 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65  ed long) ulValue
1ade0 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b  Len);......break
1adf0 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 49 53  ;....case CKA_IS
1ae00 53 55 45 52 3a 0a 09 09 09 09 43 41 43 4b 45 59  SUER:.....CACKEY
1ae10 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
1ae20 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62  equesting attrib
1ae30 75 74 65 20 43 4b 41 5f 49 53 53 55 45 52 20 28  ute CKA_ISSUER (
1ae40 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28  0x%08lx) ...", (
1ae50 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63  unsigned long) c
1ae60 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a  urr_attr_type);.
1ae70 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63  .....if (objectc
1ae80 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 43 45 52 54  lass != CKO_CERT
1ae90 49 46 49 43 41 54 45 20 26 26 20 6f 62 6a 65 63  IFICATE && objec
1aea0 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 4e 45  tclass != CKO_NE
1aeb0 54 53 43 41 50 45 5f 54 52 55 53 54 29 20 7b 0a  TSCAPE_TRUST) {.
1aec0 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
1aed0 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62  G_PRINTF(" ... b
1aee0 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69  ut not getting i
1aef0 74 20 62 65 63 61 75 73 65 20 77 65 20 61 72 65  t because we are
1af00 20 6e 6f 74 20 61 20 63 65 72 74 69 66 69 63 61   not a certifica
1af10 74 65 20 6f 72 20 4e 65 74 73 63 61 70 65 20 74  te or Netscape t
1af20 72 75 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a  rust object");..
1af30 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09  .....break;.....
1af40 7d 0a 0a 09 09 09 09 69 66 20 28 63 65 72 74 69  }......if (certi
1af50 66 69 63 61 74 65 5f 6c 65 6e 20 3e 3d 20 30 29  ficate_len >= 0)
1af60 20 7b 0a 09 09 09 09 09 78 35 30 39 5f 72 65 61   {......x509_rea
1af70 64 5f 72 65 74 20 3d 20 78 35 30 39 5f 74 6f 5f  d_ret = x509_to_
1af80 69 73 73 75 65 72 28 63 65 72 74 69 66 69 63 61  issuer(certifica
1af90 74 65 2c 20 63 65 72 74 69 66 69 63 61 74 65 5f  te, certificate_
1afa0 6c 65 6e 2c 20 26 70 56 61 6c 75 65 29 3b 0a 09  len, &pValue);..
1afb0 09 09 09 09 69 66 20 28 78 35 30 39 5f 72 65 61  ....if (x509_rea
1afc0 64 5f 72 65 74 20 3c 20 30 29 20 7b 0a 09 09 09  d_ret < 0) {....
1afd0 09 09 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c  ...pValue = NULL
1afe0 3b 0a 09 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a  ;......} else {.
1aff0 09 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e  ......ulValueLen
1b000 20 3d 20 78 35 30 39 5f 72 65 61 64 5f 72 65 74   = x509_read_ret
1b010 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 0a  ;......}.....}..
1b020 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
1b030 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65  _PRINTF(" ... re
1b040 74 75 72 6e 69 6e 67 20 25 70 2f 25 6c 75 22 2c  turning %p/%lu",
1b050 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e   pValue, (unsign
1b060 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65  ed long) ulValue
1b070 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b  Len);......break
1b080 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 53 45  ;....case CKA_SE
1b090 52 49 41 4c 5f 4e 55 4d 42 45 52 3a 0a 09 09 09  RIAL_NUMBER:....
1b0a0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1b0b0 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67  INTF("Requesting
1b0c0 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 53   attribute CKA_S
1b0d0 45 52 49 41 4c 5f 4e 55 4d 42 45 52 20 28 30 78  ERIAL_NUMBER (0x
1b0e0 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e  %08lx) ...", (un
1b0f0 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72  signed long) cur
1b100 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09  r_attr_type);...
1b110 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61  ...if (objectcla
1b120 73 73 20 21 3d 20 43 4b 4f 5f 43 45 52 54 49 46  ss != CKO_CERTIF
1b130 49 43 41 54 45 20 26 26 20 6f 62 6a 65 63 74 63  ICATE && objectc
1b140 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 4e 45 54 53  lass != CKO_NETS
1b150 43 41 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 09  CAPE_TRUST) {...
1b160 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1b170 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74  PRINTF(" ... but
1b180 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20   not getting it 
1b190 62 65 63 61 75 73 65 20 77 65 20 61 72 65 20 6e  because we are n
1b1a0 6f 74 20 61 20 63 65 72 74 69 66 69 63 61 74 65  ot a certificate
1b1b0 20 6f 72 20 4e 65 74 73 63 61 70 65 20 74 72 75   or Netscape tru
1b1c0 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09  st object");....
1b1d0 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a  ...break;.....}.
1b1e0 0a 09 09 09 09 69 66 20 28 63 65 72 74 69 66 69  .....if (certifi
1b1f0 63 61 74 65 5f 6c 65 6e 20 3e 3d 20 30 29 20 7b  cate_len >= 0) {
1b200 0a 09 09 09 09 09 78 35 30 39 5f 72 65 61 64 5f  ......x509_read_
1b210 72 65 74 20 3d 20 78 35 30 39 5f 74 6f 5f 73 65  ret = x509_to_se
1b220 72 69 61 6c 28 63 65 72 74 69 66 69 63 61 74 65  rial(certificate
1b230 2c 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65  , certificate_le
1b240 6e 2c 20 26 70 56 61 6c 75 65 29 3b 0a 09 09 09  n, &pValue);....
1b250 09 09 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f  ..if (x509_read_
1b260 72 65 74 20 3c 20 30 29 20 7b 0a 09 09 09 09 09  ret < 0) {......
1b270 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a  .pValue = NULL;.
1b280 09 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  .....} else {...
1b290 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ....ulValueLen =
1b2a0 20 78 35 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a   x509_read_ret;.
1b2b0 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 0a 09 09  .....}.....}....
1b2c0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1b2d0 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75  RINTF(" ... retu
1b2e0 72 6e 69 6e 67 20 28 25 70 2f 25 6c 75 29 22 2c  rning (%p/%lu)",
1b2f0 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e   pValue, (unsign
1b300 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65  ed long) ulValue
1b310 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b  Len);......break
1b320 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 53 55  ;....case CKA_SU
1b330 42 4a 45 43 54 3a 0a 09 09 09 09 43 41 43 4b 45  BJECT:.....CACKE
1b340 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1b350 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69  Requesting attri
1b360 62 75 74 65 20 43 4b 41 5f 53 55 42 4a 45 43 54  bute CKA_SUBJECT
1b370 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c   (0x%08lx) ...",
1b380 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
1b390 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29   curr_attr_type)
1b3a0 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63  ;......if (objec
1b3b0 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 43 45  tclass != CKO_CE
1b3c0 52 54 49 46 49 43 41 54 45 29 20 7b 0a 09 09 09  RTIFICATE) {....
1b3d0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1b3e0 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20  RINTF(" ... but 
1b3f0 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 62  not getting it b
1b400 65 63 61 75 73 65 20 77 65 20 61 72 65 20 6e 6f  ecause we are no
1b410 74 20 61 20 63 65 72 74 69 66 69 63 61 74 65 22  t a certificate"
1b420 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a  );.......break;.
1b430 09 09 09 09 7d 0a 0a 09 09 09 09 69 66 20 28 63  ....}......if (c
1b440 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3e  ertificate_len >
1b450 3d 20 30 29 20 7b 0a 09 09 09 09 09 78 35 30 39  = 0) {......x509
1b460 5f 72 65 61 64 5f 72 65 74 20 3d 20 78 35 30 39  _read_ret = x509
1b470 5f 74 6f 5f 73 75 62 6a 65 63 74 28 63 65 72 74  _to_subject(cert
1b480 69 66 69 63 61 74 65 2c 20 63 65 72 74 69 66 69  ificate, certifi
1b490 63 61 74 65 5f 6c 65 6e 2c 20 26 70 56 61 6c 75  cate_len, &pValu
1b4a0 65 29 3b 0a 09 09 09 09 09 69 66 20 28 78 35 30  e);......if (x50
1b4b0 39 5f 72 65 61 64 5f 72 65 74 20 3c 20 30 29 20  9_read_ret < 0) 
1b4c0 7b 0a 09 09 09 09 09 09 70 56 61 6c 75 65 20 3d  {.......pValue =
1b4d0 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 7d 20 65 6c   NULL;......} el
1b4e0 73 65 20 7b 0a 09 09 09 09 09 09 75 6c 56 61 6c  se {.......ulVal
1b4f0 75 65 4c 65 6e 20 3d 20 78 35 30 39 5f 72 65 61  ueLen = x509_rea
1b500 64 5f 72 65 74 3b 0a 09 09 09 09 09 7d 0a 09 09  d_ret;......}...
1b510 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f  ..}......CACKEY_
1b520 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
1b530 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 70 2f  .. returning %p/
1b540 25 6c 75 22 2c 20 70 56 61 6c 75 65 2c 20 28 75  %lu", pValue, (u
1b550 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c  nsigned long) ul
1b560 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09  ValueLen);......
1b570 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43  break;....case C
1b580 4b 41 5f 49 44 3a 0a 09 09 09 09 43 41 43 4b 45  KA_ID:.....CACKE
1b590 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1b5a0 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69  Requesting attri
1b5b0 62 75 74 65 20 43 4b 41 5f 49 44 20 28 30 78 25  bute CKA_ID (0x%
1b5c0 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73  08lx) ...", (uns
1b5d0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72  igned long) curr
1b5e0 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09  _attr_type);....
1b5f0 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73  ..if (objectclas
1b600 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50  s == CKO_NETSCAP
1b610 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 09 09  E_TRUST) {......
1b620 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1b630 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f  NTF(" ... but no
1b640 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63  t getting it bec
1b650 61 75 73 65 20 77 65 20 61 72 65 20 61 20 4e 65  ause we are a Ne
1b660 74 73 63 61 70 65 20 74 72 75 73 74 20 6f 62 6a  tscape trust obj
1b670 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62 72 65  ect");.......bre
1b680 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 75  ak;.....}......u
1b690 63 54 6d 70 42 75 66 5b 30 5d 20 3d 20 28 28 69  cTmpBuf[0] = ((i
1b6a0 64 65 6e 74 69 74 79 5f 6e 75 6d 20 2b 20 31 29  dentity_num + 1)
1b6b0 20 3e 3e 20 38 29 20 26 20 30 78 66 66 3b 0a 09   >> 8) & 0xff;..
1b6c0 09 09 09 75 63 54 6d 70 42 75 66 5b 31 5d 20 3d  ...ucTmpBuf[1] =
1b6d0 20 20 28 69 64 65 6e 74 69 74 79 5f 6e 75 6d 20    (identity_num 
1b6e0 2b 20 31 29 20 26 20 30 78 66 66 3b 0a 0a 09 09  + 1) & 0xff;....
1b6f0 09 09 70 56 61 6c 75 65 20 3d 20 26 75 63 54 6d  ..pValue = &ucTm
1b700 70 42 75 66 3b 0a 09 09 09 09 75 6c 56 61 6c 75  pBuf;.....ulValu
1b710 65 4c 65 6e 20 3d 20 32 3b 0a 0a 09 09 09 09 43  eLen = 2;......C
1b720 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1b730 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69  TF(" ... returni
1b740 6e 67 20 25 70 2f 25 6c 75 22 2c 20 70 56 61 6c  ng %p/%lu", pVal
1b750 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  ue, (unsigned lo
1b760 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b  ng) ulValueLen);
1b770 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
1b780 63 61 73 65 20 43 4b 41 5f 43 45 52 54 49 46 49  case CKA_CERTIFI
1b790 43 41 54 45 5f 54 59 50 45 3a 0a 09 09 09 09 43  CATE_TYPE:.....C
1b7a0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1b7b0 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61  TF("Requesting a
1b7c0 74 74 72 69 62 75 74 65 20 43 4b 41 5f 43 45 52  ttribute CKA_CER
1b7d0 54 49 46 49 43 41 54 45 5f 54 59 50 45 20 28 30  TIFICATE_TYPE (0
1b7e0 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75  x%08lx) ...", (u
1b7f0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75  nsigned long) cu
1b800 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a  rr_attr_type);..
1b810 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c  ....if (objectcl
1b820 61 73 73 20 21 3d 20 43 4b 4f 5f 43 45 52 54 49  ass != CKO_CERTI
1b830 46 49 43 41 54 45 29 20 7b 0a 09 09 09 09 09 43  FICATE) {......C
1b840 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1b850 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74  TF(" ... but not
1b860 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 61   getting it beca
1b870 75 73 65 20 77 65 20 61 72 65 20 6e 6f 74 20 61  use we are not a
1b880 20 63 65 72 74 69 66 69 63 61 74 65 2e 22 29 3b   certificate.");
1b890 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .......break;...
1b8a0 09 09 7d 0a 0a 09 09 09 09 2f 2a 20 57 65 20 6f  ..}....../* We o
1b8b0 6e 6c 79 20 73 75 70 70 6f 72 74 20 6f 6e 65 20  nly support one 
1b8c0 63 65 72 74 69 66 69 63 61 74 65 20 74 79 70 65  certificate type
1b8d0 20 2a 2f 0a 09 09 09 09 63 6b 5f 63 65 72 74 69   */.....ck_certi
1b8e0 66 69 63 61 74 65 5f 74 79 70 65 20 3d 20 43 4b  ficate_type = CK
1b8f0 43 5f 58 5f 35 30 39 3b 0a 0a 09 09 09 09 70 56  C_X_509;......pV
1b900 61 6c 75 65 20 3d 20 26 63 6b 5f 63 65 72 74 69  alue = &ck_certi
1b910 66 69 63 61 74 65 5f 74 79 70 65 3b 0a 09 09 09  ficate_type;....
1b920 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69  .ulValueLen = si
1b930 7a 65 6f 66 28 63 6b 5f 63 65 72 74 69 66 69 63  zeof(ck_certific
1b940 61 74 65 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09  ate_type);......
1b950 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1b960 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e  NTF(" ... return
1b970 69 6e 67 20 43 4b 43 5f 58 5f 35 30 39 20 28 25  ing CKC_X_509 (%
1b980 6c 75 29 20 28 25 70 2f 25 6c 75 29 22 2c 20 28  lu) (%p/%lu)", (
1b990 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a  unsigned long) *
1b9a0 28 28 43 4b 5f 43 45 52 54 49 46 49 43 41 54 45  ((CK_CERTIFICATE
1b9b0 5f 54 59 50 45 20 2a 29 20 70 56 61 6c 75 65 29  _TYPE *) pValue)
1b9c0 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67  , pValue, (unsig
1b9d0 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75  ned long) ulValu
1b9e0 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61  eLen);......brea
1b9f0 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 4b  k;....case CKA_K
1ba00 45 59 5f 54 59 50 45 3a 0a 09 09 09 09 43 41 43  EY_TYPE:.....CAC
1ba10 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1ba20 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74  ("Requesting att
1ba30 72 69 62 75 74 65 20 43 4b 41 5f 4b 45 59 5f 54  ribute CKA_KEY_T
1ba40 59 50 45 20 28 30 78 25 30 38 6c 78 29 20 2e 2e  YPE (0x%08lx) ..
1ba50 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  .", (unsigned lo
1ba60 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79  ng) curr_attr_ty
1ba70 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62  pe);......if (ob
1ba80 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f  jectclass != CKO
1ba90 5f 50 52 49 56 41 54 45 5f 4b 45 59 20 26 26 20  _PRIVATE_KEY && 
1baa0 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43  objectclass != C
1bab0 4b 4f 5f 50 55 42 4c 49 43 5f 4b 45 59 29 20 7b  KO_PUBLIC_KEY) {
1bac0 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
1bad0 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
1bae0 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20  but not getting 
1baf0 69 74 20 62 65 63 61 75 73 65 20 77 65 20 61 72  it because we ar
1bb00 65 20 6e 6f 74 20 61 20 6b 65 79 2e 22 29 3b 0a  e not a key.");.
1bb10 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
1bb20 09 7d 0a 0a 09 09 09 09 2f 2a 20 57 65 20 6f 6e  .}....../* We on
1bb30 6c 79 20 73 75 70 70 6f 72 74 20 6f 6e 65 20 6b  ly support one k
1bb40 65 79 20 74 79 70 65 20 2a 2f 0a 09 09 09 09 63  ey type */.....c
1bb50 6b 5f 6b 65 79 5f 74 79 70 65 20 3d 20 43 4b 4b  k_key_type = CKK
1bb60 5f 52 53 41 3b 0a 0a 09 09 09 09 70 56 61 6c 75  _RSA;......pValu
1bb70 65 20 3d 20 26 63 6b 5f 6b 65 79 5f 74 79 70 65  e = &ck_key_type
1bb80 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e  ;.....ulValueLen
1bb90 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 6b 65 79   = sizeof(ck_key
1bba0 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 43 41 43  _type);......CAC
1bbb0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1bbc0 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67  (" ... returning
1bbd0 20 43 4b 4b 5f 52 53 41 20 28 25 6c 75 29 20 28   CKK_RSA (%lu) (
1bbe0 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67  %p/%lu)", (unsig
1bbf0 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f  ned long) *((CK_
1bc00 43 45 52 54 49 46 49 43 41 54 45 5f 54 59 50 45  CERTIFICATE_TYPE
1bc10 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61   *) pValue), pVa
1bc20 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  lue, (unsigned l
1bc30 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29  ong) ulValueLen)
1bc40 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  ;......break;...
1bc50 09 63 61 73 65 20 43 4b 41 5f 53 49 47 4e 3a 0a  .case CKA_SIGN:.
1bc60 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
1bc70 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74  _PRINTF("Request
1bc80 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b  ing attribute CK
1bc90 41 5f 53 49 47 4e 20 28 30 78 25 30 38 6c 78 29  A_SIGN (0x%08lx)
1bca0 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64   ...", (unsigned
1bcb0 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72   long) curr_attr
1bcc0 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20  _type);......if 
1bcd0 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20  (objectclass == 
1bce0 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55  CKO_NETSCAPE_TRU
1bcf0 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45  ST) {......CACKE
1bd00 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1bd10 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74   ... but not get
1bd20 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20  ting it because 
1bd30 77 65 20 61 72 65 20 61 20 4e 65 74 73 63 61 70  we are a Netscap
1bd40 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29  e trust object")
1bd50 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09  ;.......break;..
1bd60 09 09 09 7d 0a 0a 09 09 09 09 69 66 20 28 6f 62  ...}......if (ob
1bd70 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f  jectclass == CKO
1bd80 5f 50 52 49 56 41 54 45 5f 4b 45 59 29 20 7b 0a  _PRIVATE_KEY) {.
1bd90 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63  .....pValue = &c
1bda0 6b 5f 74 72 75 65 3b 0a 09 09 09 09 09 75 6c 56  k_true;......ulV
1bdb0 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66  alueLen = sizeof
1bdc0 28 63 6b 5f 74 72 75 65 29 3b 0a 09 09 09 09 7d  (ck_true);.....}
1bdd0 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 70 56 61   else {......pVa
1bde0 6c 75 65 20 3d 20 26 63 6b 5f 66 61 6c 73 65 3b  lue = &ck_false;
1bdf0 0a 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e  ......ulValueLen
1be00 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 66 61 6c   = sizeof(ck_fal
1be10 73 65 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09  se);.....}......
1be20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1be30 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e  NTF(" ... return
1be40 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29  ing %lu (%p/%lu)
1be50 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
1be60 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a  g) *((CK_BBOOL *
1be70 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75  ) pValue), pValu
1be80 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  e, (unsigned lon
1be90 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a  g) ulValueLen);.
1bea0 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
1beb0 61 73 65 20 43 4b 41 5f 53 49 47 4e 5f 52 45 43  ase CKA_SIGN_REC
1bec0 4f 56 45 52 3a 0a 09 09 09 09 43 41 43 4b 45 59  OVER:.....CACKEY
1bed0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
1bee0 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62  equesting attrib
1bef0 75 74 65 20 43 4b 41 5f 53 49 47 4e 5f 52 45 43  ute CKA_SIGN_REC
1bf00 4f 56 45 52 20 28 30 78 25 30 38 6c 78 29 20 2e  OVER (0x%08lx) .
1bf10 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ..", (unsigned l
1bf20 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74  ong) curr_attr_t
1bf30 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f  ype);......if (o
1bf40 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b  bjectclass == CK
1bf50 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54  O_NETSCAPE_TRUST
1bf60 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f  ) {......CACKEY_
1bf70 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
1bf80 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69  .. but not getti
1bf90 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77 65  ng it because we
1bfa0 20 61 72 65 20 61 20 4e 65 74 73 63 61 70 65 20   are a Netscape 
1bfb0 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a  trust object");.
1bfc0 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
1bfd0 09 7d 0a 0a 09 09 09 09 2f 2a 20 57 65 20 63 75  .}....../* We cu
1bfe0 72 72 65 6e 74 6c 79 20 6f 6e 6c 79 20 73 75 70  rrently only sup
1bff0 70 6f 72 74 20 22 53 69 67 6e 20 77 69 74 68 20  port "Sign with 
1c000 41 70 70 65 6e 64 69 78 22 20 2a 2f 0a 09 09 09  Appendix" */....
1c010 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 66 61  .pValue = &ck_fa
1c020 6c 73 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65  lse;.....ulValue
1c030 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f  Len = sizeof(ck_
1c040 66 61 6c 73 65 29 3b 0a 0a 09 09 09 09 43 41 43  false);......CAC
1c050 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1c060 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67  (" ... returning
1c070 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20   %lu (%p/%lu)", 
1c080 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
1c090 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70  *((CK_BBOOL *) p
1c0a0 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20  Value), pValue, 
1c0b0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
1c0c0 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09  ulValueLen);....
1c0d0 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
1c0e0 20 43 4b 41 5f 44 45 43 52 59 50 54 3a 0a 09 09   CKA_DECRYPT:...
1c0f0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1c100 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e  RINTF("Requestin
1c110 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f  g attribute CKA_
1c120 44 45 43 52 59 50 54 20 28 30 78 25 30 38 6c 78  DECRYPT (0x%08lx
1c130 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65  ) ...", (unsigne
1c140 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74  d long) curr_att
1c150 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66  r_type);......if
1c160 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d   (objectclass ==
1c170 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52   CKO_NETSCAPE_TR
1c180 55 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b  UST) {......CACK
1c190 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1c1a0 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65  " ... but not ge
1c1b0 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65  tting it because
1c1c0 20 77 65 20 61 72 65 20 61 20 4e 65 74 73 63 61   we are a Netsca
1c1d0 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22  pe trust object"
1c1e0 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a  );.......break;.
1c1f0 09 09 09 09 7d 0a 0a 09 09 09 09 69 66 20 28 6f  ....}......if (o
1c200 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b  bjectclass == CK
1c210 4f 5f 50 52 49 56 41 54 45 5f 4b 45 59 20 7c 7c  O_PRIVATE_KEY ||
1c220 20 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20   objectclass == 
1c230 43 4b 4f 5f 50 55 42 4c 49 43 5f 4b 45 59 29 20  CKO_PUBLIC_KEY) 
1c240 7b 0a 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20  {......pValue = 
1c250 26 63 6b 5f 74 72 75 65 3b 0a 09 09 09 09 09 75  &ck_true;......u
1c260 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65  lValueLen = size
1c270 6f 66 28 63 6b 5f 74 72 75 65 29 3b 0a 09 09 09  of(ck_true);....
1c280 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 70  .} else {......p
1c290 56 61 6c 75 65 20 3d 20 26 63 6b 5f 66 61 6c 73  Value = &ck_fals
1c2a0 65 3b 0a 09 09 09 09 09 75 6c 56 61 6c 75 65 4c  e;......ulValueL
1c2b0 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 66  en = sizeof(ck_f
1c2c0 61 6c 73 65 29 3b 0a 09 09 09 09 7d 0a 0a 09 09  alse);.....}....
1c2d0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1c2e0 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75  RINTF(" ... retu
1c2f0 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c  rning %lu (%p/%l
1c300 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  u)", (unsigned l
1c310 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c  ong) *((CK_BBOOL
1c320 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61   *) pValue), pVa
1c330 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  lue, (unsigned l
1c340 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29  ong) ulValueLen)
1c350 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  ;......break;...
1c360 09 63 61 73 65 20 43 4b 41 5f 53 45 4e 53 49 54  .case CKA_SENSIT
1c370 49 56 45 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f  IVE:.....CACKEY_
1c380 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
1c390 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75  questing attribu
1c3a0 74 65 20 43 4b 41 5f 53 45 4e 53 49 54 49 56 45  te CKA_SENSITIVE
1c3b0 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c   (0x%08lx) ...",
1c3c0 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
1c3d0 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29   curr_attr_type)
1c3e0 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63  ;......if (objec
1c3f0 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 4e 45  tclass == CKO_NE
1c400 54 53 43 41 50 45 5f 54 52 55 53 54 29 20 7b 0a  TSCAPE_TRUST) {.
1c410 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
1c420 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62  G_PRINTF(" ... b
1c430 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69  ut not getting i
1c440 74 20 62 65 63 61 75 73 65 20 77 65 20 61 72 65  t because we are
1c450 20 61 20 4e 65 74 73 63 61 70 65 20 74 72 75 73   a Netscape trus
1c460 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09  t object");.....
1c470 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a  ..break;.....}..
1c480 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c  ....if (objectcl
1c490 61 73 73 20 3d 3d 20 43 4b 4f 5f 50 52 49 56 41  ass == CKO_PRIVA
1c4a0 54 45 5f 4b 45 59 29 20 7b 0a 09 09 09 09 09 70  TE_KEY) {......p
1c4b0 56 61 6c 75 65 20 3d 20 26 63 6b 5f 74 72 75 65  Value = &ck_true
1c4c0 3b 0a 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65  ;......ulValueLe
1c4d0 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 74 72  n = sizeof(ck_tr
1c4e0 75 65 29 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20  ue);.....} else 
1c4f0 7b 0a 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20  {......pValue = 
1c500 26 63 6b 5f 66 61 6c 73 65 3b 0a 09 09 09 09 09  &ck_false;......
1c510 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a  ulValueLen = siz
1c520 65 6f 66 28 63 6b 5f 66 61 6c 73 65 29 3b 0a 09  eof(ck_false);..
1c530 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59  ...}......CACKEY
1c540 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
1c550 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 6c  ... returning %l
1c560 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e  u (%p/%lu)", (un
1c570 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28  signed long) *((
1c580 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c  CK_BBOOL *) pVal
1c590 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e  ue), pValue, (un
1c5a0 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56  signed long) ulV
1c5b0 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62  alueLen);......b
1c5c0 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b  reak;....case CK
1c5d0 41 5f 45 58 54 52 41 43 54 41 42 4c 45 3a 0a 09  A_EXTRACTABLE:..
1c5e0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1c5f0 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69  PRINTF("Requesti
1c600 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41  ng attribute CKA
1c610 5f 45 58 54 52 41 43 54 41 42 4c 45 20 28 30 78  _EXTRACTABLE (0x
1c620 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e  %08lx) ...", (un
1c630 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72  signed long) cur
1c640 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09  r_attr_type);...
1c650 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61  ...if (objectcla
1c660 73 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43 41  ss == CKO_NETSCA
1c670 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 09  PE_TRUST) {.....
1c680 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1c690 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e  INTF(" ... but n
1c6a0 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65  ot getting it be
1c6b0 63 61 75 73 65 20 77 65 20 61 72 65 20 61 20 4e  cause we are a N
1c6c0 65 74 73 63 61 70 65 20 74 72 75 73 74 20 6f 62  etscape trust ob
1c6d0 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62 72  ject");.......br
1c6e0 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09  eak;.....}......
1c6f0 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20  if (objectclass 
1c700 3d 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b  == CKO_PRIVATE_K
1c710 45 59 29 20 7b 0a 09 09 09 09 09 70 56 61 6c 75  EY) {......pValu
1c720 65 20 3d 20 26 63 6b 5f 66 61 6c 73 65 3b 0a 09  e = &ck_false;..
1c730 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ....ulValueLen =
1c740 20 73 69 7a 65 6f 66 28 63 6b 5f 74 72 75 65 29   sizeof(ck_true)
1c750 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09  ;.....} else {..
1c760 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b  ....pValue = &ck
1c770 5f 74 72 75 65 3b 0a 09 09 09 09 09 75 6c 56 61  _true;......ulVa
1c780 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28  lueLen = sizeof(
1c790 63 6b 5f 66 61 6c 73 65 29 3b 0a 09 09 09 09 7d  ck_false);.....}
1c7a0 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
1c7b0 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
1c7c0 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25  returning %lu (%
1c7d0 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e  p/%lu)", (unsign
1c7e0 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42  ed long) *((CK_B
1c7f0 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c  BOOL *) pValue),
1c800 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e   pValue, (unsign
1c810 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65  ed long) ulValue
1c820 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b  Len);......break
1c830 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 4d 4f  ;....case CKA_MO
1c840 44 55 4c 55 53 3a 0a 09 09 09 09 43 41 43 4b 45  DULUS:.....CACKE
1c850 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1c860 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69  Requesting attri
1c870 62 75 74 65 20 43 4b 41 5f 4d 4f 44 55 4c 55 53  bute CKA_MODULUS
1c880 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c   (0x%08lx) ...",
1c890 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
1c8a0 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29   curr_attr_type)
1c8b0 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63  ;......if (objec
1c8c0 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 4e 45  tclass == CKO_NE
1c8d0 54 53 43 41 50 45 5f 54 52 55 53 54 29 20 7b 0a  TSCAPE_TRUST) {.
1c8e0 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
1c8f0 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62  G_PRINTF(" ... b
1c900 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69  ut not getting i
1c910 74 20 62 65 63 61 75 73 65 20 77 65 20 61 72 65  t because we are
1c920 20 61 20 4e 65 74 73 63 61 70 65 20 74 72 75 73   a Netscape trus
1c930 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09  t object");.....
1c940 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a  ..break;.....}..
1c950 09 09 09 09 69 66 20 28 63 65 72 74 69 66 69 63  ....if (certific
1c960 61 74 65 5f 6c 65 6e 20 3e 3d 20 30 29 20 7b 0a  ate_len >= 0) {.
1c970 09 09 09 09 09 78 35 30 39 5f 72 65 61 64 5f 72  .....x509_read_r
1c980 65 74 20 3d 20 78 35 30 39 5f 74 6f 5f 6d 6f 64  et = x509_to_mod
1c990 75 6c 75 73 28 63 65 72 74 69 66 69 63 61 74 65  ulus(certificate
1c9a0 2c 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65  , certificate_le
1c9b0 6e 2c 20 26 70 56 61 6c 75 65 29 3b 0a 09 09 09  n, &pValue);....
1c9c0 09 09 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f  ..if (x509_read_
1c9d0 72 65 74 20 3c 20 30 29 20 7b 0a 09 09 09 09 09  ret < 0) {......
1c9e0 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a  .pValue = NULL;.
1c9f0 09 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  .....} else {...
1ca00 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ....ulValueLen =
1ca10 20 78 35 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a   x509_read_ret;.
1ca20 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 0a 09 09  .....}.....}....
1ca30 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1ca40 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75  RINTF(" ... retu
1ca50 72 6e 69 6e 67 20 28 25 70 2f 25 6c 75 29 22 2c  rning (%p/%lu)",
1ca60 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e   pValue, (unsign
1ca70 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65  ed long) ulValue
1ca80 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b  Len);......break
1ca90 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 50 55  ;....case CKA_PU
1caa0 42 4c 49 43 5f 45 58 50 4f 4e 45 4e 54 3a 0a 09  BLIC_EXPONENT:..
1cab0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1cac0 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69  PRINTF("Requesti
1cad0 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41  ng attribute CKA
1cae0 5f 50 55 42 4c 49 43 5f 45 58 50 4f 4e 45 4e 54  _PUBLIC_EXPONENT
1caf0 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c   (0x%08lx) ...",
1cb00 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
1cb10 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29   curr_attr_type)
1cb20 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63  ;......if (objec
1cb30 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 4e 45  tclass == CKO_NE
1cb40 54 53 43 41 50 45 5f 54 52 55 53 54 29 20 7b 0a  TSCAPE_TRUST) {.
1cb50 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
1cb60 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62  G_PRINTF(" ... b
1cb70 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69  ut not getting i
1cb80 74 20 62 65 63 61 75 73 65 20 77 65 20 61 72 65  t because we are
1cb90 20 61 20 4e 65 74 73 63 61 70 65 20 74 72 75 73   a Netscape trus
1cba0 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09  t object");.....
1cbb0 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a  ..break;.....}..
1cbc0 09 09 09 09 69 66 20 28 63 65 72 74 69 66 69 63  ....if (certific
1cbd0 61 74 65 5f 6c 65 6e 20 3e 3d 20 30 29 20 7b 0a  ate_len >= 0) {.
1cbe0 09 09 09 09 09 78 35 30 39 5f 72 65 61 64 5f 72  .....x509_read_r
1cbf0 65 74 20 3d 20 78 35 30 39 5f 74 6f 5f 65 78 70  et = x509_to_exp
1cc00 6f 6e 65 6e 74 28 63 65 72 74 69 66 69 63 61 74  onent(certificat
1cc10 65 2c 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c  e, certificate_l
1cc20 65 6e 2c 20 26 70 56 61 6c 75 65 29 3b 0a 09 09  en, &pValue);...
1cc30 09 09 09 69 66 20 28 78 35 30 39 5f 72 65 61 64  ...if (x509_read
1cc40 5f 72 65 74 20 3c 20 30 29 20 7b 0a 09 09 09 09  _ret < 0) {.....
1cc50 09 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b  ..pValue = NULL;
1cc60 0a 09 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09  ......} else {..
1cc70 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20  .....ulValueLen 
1cc80 3d 20 78 35 30 39 5f 72 65 61 64 5f 72 65 74 3b  = x509_read_ret;
1cc90 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 0a 09  ......}.....}...
1cca0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1ccb0 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74  PRINTF(" ... ret
1ccc0 75 72 6e 69 6e 67 20 28 25 70 2f 25 6c 75 29 22  urning (%p/%lu)"
1ccd0 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67  , pValue, (unsig
1cce0 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75  ned long) ulValu
1ccf0 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61  eLen);......brea
1cd00 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 54  k;....case CKA_T
1cd10 52 55 53 54 5f 44 49 47 49 54 41 4c 5f 53 49 47  RUST_DIGITAL_SIG
1cd20 4e 41 54 55 52 45 3a 0a 09 09 09 63 61 73 65 20  NATURE:....case 
1cd30 43 4b 41 5f 54 52 55 53 54 5f 4e 4f 4e 5f 52 45  CKA_TRUST_NON_RE
1cd40 50 55 44 49 41 54 49 4f 4e 3a 0a 09 09 09 63 61  PUDIATION:....ca
1cd50 73 65 20 43 4b 41 5f 54 52 55 53 54 5f 4b 45 59  se CKA_TRUST_KEY
1cd60 5f 45 4e 43 49 50 48 45 52 4d 45 4e 54 3a 0a 09  _ENCIPHERMENT:..
1cd70 09 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54  ..case CKA_TRUST
1cd80 5f 44 41 54 41 5f 45 4e 43 49 50 48 45 52 4d 45  _DATA_ENCIPHERME
1cd90 4e 54 3a 0a 09 09 09 63 61 73 65 20 43 4b 41 5f  NT:....case CKA_
1cda0 54 52 55 53 54 5f 4b 45 59 5f 41 47 52 45 45 4d  TRUST_KEY_AGREEM
1cdb0 45 4e 54 3a 0a 09 09 09 63 61 73 65 20 43 4b 41  ENT:....case CKA
1cdc0 5f 54 52 55 53 54 5f 4b 45 59 5f 43 45 52 54 5f  _TRUST_KEY_CERT_
1cdd0 53 49 47 4e 3a 0a 09 09 09 63 61 73 65 20 43 4b  SIGN:....case CK
1cde0 41 5f 54 52 55 53 54 5f 43 52 4c 5f 53 49 47 4e  A_TRUST_CRL_SIGN
1cdf0 3a 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 54 52  :....case CKA_TR
1ce00 55 53 54 5f 53 45 52 56 45 52 5f 41 55 54 48 3a  UST_SERVER_AUTH:
1ce10 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 54 52 55  ....case CKA_TRU
1ce20 53 54 5f 43 4c 49 45 4e 54 5f 41 55 54 48 3a 0a  ST_CLIENT_AUTH:.
1ce30 09 09 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53  ...case CKA_TRUS
1ce40 54 5f 43 4f 44 45 5f 53 49 47 4e 49 4e 47 3a 0a  T_CODE_SIGNING:.
1ce50 09 09 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53  ...case CKA_TRUS
1ce60 54 5f 45 4d 41 49 4c 5f 50 52 4f 54 45 43 54 49  T_EMAIL_PROTECTI
1ce70 4f 4e 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  ON:.....CACKEY_D
1ce80 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71  EBUG_PRINTF("Req
1ce90 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74  uesting attribut
1cea0 65 20 43 4b 41 5f 54 52 55 53 54 5f 2e 2e 2e 20  e CKA_TRUST_... 
1ceb0 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20  (0x%08lx) ...", 
1cec0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
1ced0 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b  curr_attr_type);
1cee0 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26  ......pValue = &
1cef0 63 6b 5f 74 72 75 73 74 65 64 3b 0a 09 09 09 09  ck_trusted;.....
1cf00 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a  ulValueLen = siz
1cf10 65 6f 66 28 63 6b 5f 74 72 75 73 74 65 64 29 3b  eof(ck_trusted);
1cf20 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
1cf30 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
1cf40 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25  returning %lu (%
1cf50 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e  p/%lu)", (unsign
1cf60 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 54  ed long) *((CK_T
1cf70 52 55 53 54 20 2a 29 20 70 56 61 6c 75 65 29 2c  RUST *) pValue),
1cf80 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e   pValue, (unsign
1cf90 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65  ed long) ulValue
1cfa0 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b  Len);......break
1cfb0 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 43 45  ;....case CKA_CE
1cfc0 52 54 5f 53 48 41 31 5f 48 41 53 48 3a 0a 09 09  RT_SHA1_HASH:...
1cfd0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1cfe0 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e  RINTF("Requestin
1cff0 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f  g attribute CKA_
1d000 43 45 52 54 5f 53 48 41 31 5f 48 41 53 48 20 28  CERT_SHA1_HASH (
1d010 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28  0x%08lx) ...", (
1d020 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63  unsigned long) c
1d030 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a  urr_attr_type);.
1d040 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63  .....if (objectc
1d050 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 4e 45 54 53  lass != CKO_NETS
1d060 43 41 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 09  CAPE_TRUST) {...
1d070 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1d080 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74  PRINTF(" ... but
1d090 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20   not getting it 
1d0a0 62 65 63 61 75 73 65 20 77 65 20 61 72 65 20 6e  because we are n
1d0b0 6f 74 20 61 20 4e 65 74 73 63 61 70 65 20 74 72  ot a Netscape tr
1d0c0 75 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09  ust object");...
1d0d0 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d  ....break;.....}
1d0e0 0a 0a 09 09 09 09 53 48 41 31 52 65 73 65 74 28  ......SHA1Reset(
1d0f0 26 73 68 61 31 5f 63 74 78 29 3b 0a 09 09 09 09  &sha1_ctx);.....
1d100 53 48 41 31 49 6e 70 75 74 28 26 73 68 61 31 5f  SHA1Input(&sha1_
1d110 63 74 78 2c 20 63 65 72 74 69 66 69 63 61 74 65  ctx, certificate
1d120 2c 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65  , certificate_le
1d130 6e 29 3b 0a 09 09 09 09 53 48 41 31 52 65 73 75  n);.....SHA1Resu
1d140 6c 74 28 26 73 68 61 31 5f 63 74 78 2c 20 73 68  lt(&sha1_ctx, sh
1d150 61 31 5f 68 61 73 68 29 3b 0a 0a 09 09 09 09 70  a1_hash);......p
1d160 56 61 6c 75 65 20 3d 20 73 68 61 31 5f 68 61 73  Value = sha1_has
1d170 68 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65  h;.....ulValueLe
1d180 6e 20 3d 20 73 69 7a 65 6f 66 28 73 68 61 31 5f  n = sizeof(sha1_
1d190 68 61 73 68 29 3b 0a 0a 09 09 09 09 43 41 43 4b  hash);......CACK
1d1a0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1d1b0 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20  " ... returning 
1d1c0 25 70 2f 25 6c 75 22 2c 20 70 56 61 6c 75 65 2c  %p/%lu", pValue,
1d1d0 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
1d1e0 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09   ulValueLen);...
1d1f0 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
1d200 65 20 43 4b 41 5f 43 45 52 54 5f 4d 44 35 5f 48  e CKA_CERT_MD5_H
1d210 41 53 48 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f  ASH:.....CACKEY_
1d220 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
1d230 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75  questing attribu
1d240 74 65 20 43 4b 41 5f 43 45 52 54 5f 4d 44 35 5f  te CKA_CERT_MD5_
1d250 48 41 53 48 20 28 30 78 25 30 38 6c 78 29 20 2e  HASH (0x%08lx) .
1d260 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ..", (unsigned l
1d270 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74  ong) curr_attr_t
1d280 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f  ype);......if (o
1d290 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b  bjectclass != CK
1d2a0 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54  O_NETSCAPE_TRUST
1d2b0 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f  ) {......CACKEY_
1d2c0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
1d2d0 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69  .. but not getti
1d2e0 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77 65  ng it because we
1d2f0 20 61 72 65 20 6e 6f 74 20 61 20 4e 65 74 73 63   are not a Netsc
1d300 61 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74  ape trust object
1d310 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b  ");.......break;
1d320 0a 09 09 09 09 7d 0a 0a 09 09 09 09 4d 44 35 49  .....}......MD5I
1d330 6e 69 74 28 26 6d 64 35 5f 63 74 78 29 3b 0a 09  nit(&md5_ctx);..
1d340 09 09 09 4d 44 35 55 70 64 61 74 65 28 26 6d 64  ...MD5Update(&md
1d350 35 5f 63 74 78 2c 20 63 65 72 74 69 66 69 63 61  5_ctx, certifica
1d360 74 65 2c 20 63 65 72 74 69 66 69 63 61 74 65 5f  te, certificate_
1d370 6c 65 6e 29 3b 0a 09 09 09 09 4d 44 35 46 69 6e  len);.....MD5Fin
1d380 61 6c 28 6d 64 35 5f 68 61 73 68 2c 20 26 6d 64  al(md5_hash, &md
1d390 35 5f 63 74 78 29 3b 0a 0a 09 09 09 09 70 56 61  5_ctx);......pVa
1d3a0 6c 75 65 20 3d 20 6d 64 35 5f 68 61 73 68 3b 0a  lue = md5_hash;.
1d3b0 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ....ulValueLen =
1d3c0 20 73 69 7a 65 6f 66 28 6d 64 35 5f 68 61 73 68   sizeof(md5_hash
1d3d0 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  );......CACKEY_D
1d3e0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
1d3f0 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 70 2f 25  . returning %p/%
1d400 6c 75 22 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e  lu", pValue, (un
1d410 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56  signed long) ulV
1d420 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62  alueLen);......b
1d430 72 65 61 6b 3b 0a 09 09 09 64 65 66 61 75 6c 74  reak;....default
1d440 3a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 4e  :.....pValue = N
1d450 55 4c 4c 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65  ULL;.....ulValue
1d460 4c 65 6e 20 3d 20 28 43 4b 5f 4c 4f 4e 47 29 20  Len = (CK_LONG) 
1d470 2d 31 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  -1;.....break;..
1d480 09 7d 0a 0a 09 09 69 66 20 28 28 28 43 4b 5f 4c  .}....if (((CK_L
1d490 4f 4e 47 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29  ONG) ulValueLen)
1d4a0 20 21 3d 20 28 28 43 4b 5f 4c 4f 4e 47 29 20 2d   != ((CK_LONG) -
1d4b0 31 29 29 20 7b 0a 09 09 09 2f 2a 20 50 75 73 68  1)) {..../* Push
1d4c0 20 63 75 72 72 5f 61 74 74 72 20 6f 6e 74 6f 20   curr_attr onto 
1d4d0 74 68 65 20 73 74 61 63 6b 20 2a 2f 0a 09 09 09  the stack */....
1d4e0 63 75 72 72 5f 61 74 74 72 2e 74 79 70 65 20 3d  curr_attr.type =
1d4f0 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 3b   curr_attr_type;
1d500 0a 09 09 09 63 75 72 72 5f 61 74 74 72 2e 75 6c  ....curr_attr.ul
1d510 56 61 6c 75 65 4c 65 6e 20 3d 20 75 6c 56 61 6c  ValueLen = ulVal
1d520 75 65 4c 65 6e 3b 0a 0a 09 09 09 63 75 72 72 5f  ueLen;.....curr_
1d530 61 74 74 72 2e 70 56 61 6c 75 65 20 3d 20 6d 61  attr.pValue = ma
1d540 6c 6c 6f 63 28 63 75 72 72 5f 61 74 74 72 2e 75  lloc(curr_attr.u
1d550 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 09 09 09 6d  lValueLen);....m
1d560 65 6d 63 70 79 28 63 75 72 72 5f 61 74 74 72 2e  emcpy(curr_attr.
1d570 70 56 61 6c 75 65 2c 20 70 56 61 6c 75 65 2c 20  pValue, pValue, 
1d580 63 75 72 72 5f 61 74 74 72 2e 75 6c 56 61 6c 75  curr_attr.ulValu
1d590 65 4c 65 6e 29 3b 0a 0a 09 09 09 69 66 20 28 70  eLen);.....if (p
1d5a0 56 61 6c 75 65 5f 66 72 65 65 20 26 26 20 70 56  Value_free && pV
1d5b0 61 6c 75 65 29 20 7b 0a 09 09 09 09 66 72 65 65  alue) {.....free
1d5c0 28 70 56 61 6c 75 65 29 3b 0a 09 09 09 7d 0a 0a  (pValue);....}..
1d5d0 09 09 09 69 66 20 28 6e 75 6d 61 74 74 72 73 20  ...if (numattrs 
1d5e0 3e 3d 20 72 65 74 76 61 6c 5f 63 6f 75 6e 74 29  >= retval_count)
1d5f0 20 7b 0a 09 09 09 09 72 65 74 76 61 6c 20 3d 20   {.....retval = 
1d600 72 65 61 6c 6c 6f 63 28 72 65 74 76 61 6c 2c 20  realloc(retval, 
1d610 72 65 74 76 61 6c 5f 63 6f 75 6e 74 20 2a 20 73  retval_count * s
1d620 69 7a 65 6f 66 28 2a 72 65 74 76 61 6c 29 29 3b  izeof(*retval));
1d630 0a 09 09 09 7d 0a 0a 09 09 09 6d 65 6d 63 70 79  ....}.....memcpy
1d640 28 26 72 65 74 76 61 6c 5b 6e 75 6d 61 74 74 72  (&retval[numattr
1d650 73 5d 2c 20 26 63 75 72 72 5f 61 74 74 72 2c 20  s], &curr_attr, 
1d660 73 69 7a 65 6f 66 28 63 75 72 72 5f 61 74 74 72  sizeof(curr_attr
1d670 29 29 3b 0a 09 09 09 6e 75 6d 61 74 74 72 73 2b  ));....numattrs+
1d680 2b 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28  +;...}..}...if (
1d690 6e 75 6d 61 74 74 72 73 20 21 3d 20 30 29 20 7b  numattrs != 0) {
1d6a0 0a 09 09 72 65 74 76 61 6c 5f 63 6f 75 6e 74 20  ...retval_count 
1d6b0 3d 20 6e 75 6d 61 74 74 72 73 3b 0a 09 09 72 65  = numattrs;...re
1d6c0 74 76 61 6c 20 3d 20 72 65 61 6c 6c 6f 63 28 72  tval = realloc(r
1d6d0 65 74 76 61 6c 2c 20 72 65 74 76 61 6c 5f 63 6f  etval, retval_co
1d6e0 75 6e 74 20 2a 20 73 69 7a 65 6f 66 28 2a 72 65  unt * sizeof(*re
1d6f0 74 76 61 6c 29 29 3b 0a 09 7d 20 65 6c 73 65 20  tval));..} else 
1d700 7b 0a 09 09 66 72 65 65 28 72 65 74 76 61 6c 29  {...free(retval)
1d710 3b 0a 0a 09 09 72 65 74 76 61 6c 20 3d 20 4e 55  ;....retval = NU
1d720 4c 4c 3b 0a 09 7d 0a 0a 09 2a 70 75 6c 43 6f 75  LL;..}...*pulCou
1d730 6e 74 20 3d 20 6e 75 6d 61 74 74 72 73 3b 0a 0a  nt = numattrs;..
1d740 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1d750 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
1d760 25 6c 75 20 6f 62 6a 65 63 74 73 20 28 25 70 29  %lu objects (%p)
1d770 2e 22 2c 20 6e 75 6d 61 74 74 72 73 2c 20 28 76  .", numattrs, (v
1d780 6f 69 64 20 2a 29 20 72 65 74 76 61 6c 29 3b 0a  oid *) retval);.
1d790 0a 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29  ..return(retval)
1d7a0 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
1d7b0 20 63 61 63 6b 65 79 5f 66 72 65 65 5f 69 64 65   cackey_free_ide
1d7c0 6e 74 69 74 69 65 73 28 73 74 72 75 63 74 20 63  ntities(struct c
1d7d0 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79 20 2a  ackey_identity *
1d7e0 69 64 65 6e 74 69 74 69 65 73 2c 20 75 6e 73 69  identities, unsi
1d7f0 67 6e 65 64 20 6c 6f 6e 67 20 69 64 65 6e 74 69  gned long identi
1d800 74 69 65 73 5f 63 6f 75 6e 74 29 20 7b 0a 09 43  ties_count) {..C
1d810 4b 5f 41 54 54 52 49 42 55 54 45 20 2a 63 75 72  K_ATTRIBUTE *cur
1d820 72 5f 61 74 74 72 3b 0a 09 75 6e 73 69 67 6e 65  r_attr;..unsigne
1d830 64 20 6c 6f 6e 67 20 69 64 5f 69 64 78 2c 20 61  d long id_idx, a
1d840 74 74 72 5f 69 64 78 3b 0a 0a 09 69 66 20 28 69  ttr_idx;...if (i
1d850 64 65 6e 74 69 74 69 65 73 20 3d 3d 20 4e 55 4c  dentities == NUL
1d860 4c 20 7c 7c 20 69 64 65 6e 74 69 74 69 65 73 5f  L || identities_
1d870 63 6f 75 6e 74 20 3d 3d 20 30 29 20 7b 0a 09 09  count == 0) {...
1d880 72 65 74 75 72 6e 3b 0a 09 7d 0a 0a 09 66 6f 72  return;..}...for
1d890 20 28 69 64 5f 69 64 78 20 3d 20 30 3b 20 69 64   (id_idx = 0; id
1d8a0 5f 69 64 78 20 3c 20 69 64 65 6e 74 69 74 69 65  _idx < identitie
1d8b0 73 5f 63 6f 75 6e 74 3b 20 69 64 5f 69 64 78 2b  s_count; id_idx+
1d8c0 2b 29 20 7b 0a 09 09 69 66 20 28 69 64 65 6e 74  +) {...if (ident
1d8d0 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74  ities[id_idx].at
1d8e0 74 72 69 62 75 74 65 73 29 20 7b 0a 09 09 09 66  tributes) {....f
1d8f0 6f 72 20 28 61 74 74 72 5f 69 64 78 20 3d 20 30  or (attr_idx = 0
1d900 3b 20 61 74 74 72 5f 69 64 78 20 3c 20 69 64 65  ; attr_idx < ide
1d910 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e  ntities[id_idx].
1d920 61 74 74 72 69 62 75 74 65 73 5f 63 6f 75 6e 74  attributes_count
1d930 3b 20 61 74 74 72 5f 69 64 78 2b 2b 29 20 7b 0a  ; attr_idx++) {.
1d940 09 09 09 09 63 75 72 72 5f 61 74 74 72 20 3d 20  ....curr_attr = 
1d950 26 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69  &identities[id_i
1d960 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73 5b 61  dx].attributes[a
1d970 74 74 72 5f 69 64 78 5d 3b 0a 0a 09 09 09 09 69  ttr_idx];......i
1d980 66 20 28 63 75 72 72 5f 61 74 74 72 2d 3e 70 56  f (curr_attr->pV
1d990 61 6c 75 65 29 20 7b 0a 09 09 09 09 09 66 72 65  alue) {......fre
1d9a0 65 28 63 75 72 72 5f 61 74 74 72 2d 3e 70 56 61  e(curr_attr->pVa
1d9b0 6c 75 65 29 3b 0a 09 09 09 09 7d 0a 09 09 09 7d  lue);.....}....}
1d9c0 0a 0a 09 09 09 69 66 20 28 69 64 65 6e 74 69 74  .....if (identit
1d9d0 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72  ies[id_idx].attr
1d9e0 69 62 75 74 65 73 29 20 7b 0a 09 09 09 09 66 72  ibutes) {.....fr
1d9f0 65 65 28 69 64 65 6e 74 69 74 69 65 73 5b 69 64  ee(identities[id
1da00 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73  _idx].attributes
1da10 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 63 61 63 6b  );....}.....cack
1da20 65 79 5f 66 72 65 65 5f 63 65 72 74 73 28 69 64  ey_free_certs(id
1da30 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d  entities[id_idx]
1da40 2e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2c 20  .pcsc_identity, 
1da50 31 2c 20 31 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09  1, 1);...}..}...
1da60 66 72 65 65 28 69 64 65 6e 74 69 74 69 65 73 29  free(identities)
1da70 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 75 6e 73 69  ;.}..static unsi
1da80 67 6e 65 64 20 6c 6f 6e 67 20 63 61 63 6b 65 79  gned long cackey
1da90 5f 72 65 61 64 5f 64 6f 64 5f 69 64 65 6e 74 69  _read_dod_identi
1daa0 74 69 65 73 28 73 74 72 75 63 74 20 63 61 63 6b  ties(struct cack
1dab0 65 79 5f 69 64 65 6e 74 69 74 79 20 2a 69 64 65  ey_identity *ide
1dac0 6e 74 69 74 69 65 73 2c 20 75 6e 73 69 67 6e 65  ntities, unsigne
1dad0 64 20 6c 6f 6e 67 20 6e 75 6d 5f 64 6f 64 5f 63  d long num_dod_c
1dae0 65 72 74 73 29 20 7b 0a 09 75 6e 73 69 67 6e 65  erts) {..unsigne
1daf0 64 20 6c 6f 6e 67 20 63 65 72 74 5f 69 64 78 2c  d long cert_idx,
1db00 20 69 64 5f 69 64 78 20 3d 20 30 3b 0a 0a 09 69   id_idx = 0;...i
1db10 66 20 28 69 64 65 6e 74 69 74 69 65 73 20 3d 3d  f (identities ==
1db20 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72   NULL) {...retur
1db30 6e 28 6e 75 6d 5f 64 6f 64 5f 63 65 72 74 73 20  n(num_dod_certs 
1db40 2a 20 33 29 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28  * 3);..}...for (
1db50 63 65 72 74 5f 69 64 78 20 3d 20 30 3b 20 63 65  cert_idx = 0; ce
1db60 72 74 5f 69 64 78 20 3c 20 6e 75 6d 5f 64 6f 64  rt_idx < num_dod
1db70 5f 63 65 72 74 73 3b 20 63 65 72 74 5f 69 64 78  _certs; cert_idx
1db80 2b 2b 29 20 7b 0a 09 09 69 64 65 6e 74 69 74 69  ++) {...identiti
1db90 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f  es[id_idx].pcsc_
1dba0 69 64 65 6e 74 69 74 79 20 3d 20 4e 55 4c 4c 3b  identity = NULL;
1dbb0 0a 09 09 69 64 65 6e 74 69 74 69 65 73 5b 69 64  ...identities[id
1dbc0 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73  _idx].attributes
1dbd0 20 3d 20 63 61 63 6b 65 79 5f 67 65 74 5f 61 74   = cackey_get_at
1dbe0 74 72 69 62 75 74 65 73 28 43 4b 4f 5f 43 45 52  tributes(CKO_CER
1dbf0 54 49 46 49 43 41 54 45 2c 20 26 65 78 74 72 61  TIFICATE, &extra
1dc00 5f 63 65 72 74 73 5b 63 65 72 74 5f 69 64 78 5d  _certs[cert_idx]
1dc10 2c 20 30 78 66 30 30 30 20 7c 20 63 65 72 74 5f  , 0xf000 | cert_
1dc20 69 64 78 2c 20 26 69 64 65 6e 74 69 74 69 65 73  idx, &identities
1dc30 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75  [id_idx].attribu
1dc40 74 65 73 5f 63 6f 75 6e 74 29 3b 0a 09 09 69 64  tes_count);...id
1dc50 5f 69 64 78 2b 2b 3b 0a 0a 09 09 69 64 65 6e 74  _idx++;....ident
1dc60 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63  ities[id_idx].pc
1dc70 73 63 5f 69 64 65 6e 74 69 74 79 20 3d 20 4e 55  sc_identity = NU
1dc80 4c 4c 3b 0a 09 09 69 64 65 6e 74 69 74 69 65 73  LL;...identities
1dc90 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75  [id_idx].attribu
1dca0 74 65 73 20 3d 20 63 61 63 6b 65 79 5f 67 65 74  tes = cackey_get
1dcb0 5f 61 74 74 72 69 62 75 74 65 73 28 43 4b 4f 5f  _attributes(CKO_
1dcc0 50 55 42 4c 49 43 5f 4b 45 59 2c 20 26 65 78 74  PUBLIC_KEY, &ext
1dcd0 72 61 5f 63 65 72 74 73 5b 63 65 72 74 5f 69 64  ra_certs[cert_id
1dce0 78 5d 2c 20 30 78 66 30 30 30 20 7c 20 63 65 72  x], 0xf000 | cer
1dcf0 74 5f 69 64 78 2c 20 26 69 64 65 6e 74 69 74 69  t_idx, &identiti
1dd00 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69  es[id_idx].attri
1dd10 62 75 74 65 73 5f 63 6f 75 6e 74 29 3b 0a 09 09  butes_count);...
1dd20 69 64 5f 69 64 78 2b 2b 3b 0a 0a 09 09 69 64 65  id_idx++;....ide
1dd30 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e  ntities[id_idx].
1dd40 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 3d 20  pcsc_identity = 
1dd50 4e 55 4c 4c 3b 0a 09 09 69 64 65 6e 74 69 74 69  NULL;...identiti
1dd60 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69  es[id_idx].attri
1dd70 62 75 74 65 73 20 3d 20 63 61 63 6b 65 79 5f 67  butes = cackey_g
1dd80 65 74 5f 61 74 74 72 69 62 75 74 65 73 28 43 4b  et_attributes(CK
1dd90 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54  O_NETSCAPE_TRUST
1dda0 2c 20 26 65 78 74 72 61 5f 63 65 72 74 73 5b 63  , &extra_certs[c
1ddb0 65 72 74 5f 69 64 78 5d 2c 20 30 78 66 30 30 30  ert_idx], 0xf000
1ddc0 20 7c 20 63 65 72 74 5f 69 64 78 2c 20 26 69 64   | cert_idx, &id
1ddd0 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d  entities[id_idx]
1dde0 2e 61 74 74 72 69 62 75 74 65 73 5f 63 6f 75 6e  .attributes_coun
1ddf0 74 29 3b 0a 09 09 69 64 5f 69 64 78 2b 2b 3b 0a  t);...id_idx++;.
1de00 09 7d 0a 0a 09 72 65 74 75 72 6e 28 69 64 5f 69  .}...return(id_i
1de10 64 78 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 73  dx);.}..static s
1de20 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65  truct cackey_ide
1de30 6e 74 69 74 79 20 2a 63 61 63 6b 65 79 5f 72 65  ntity *cackey_re
1de40 61 64 5f 69 64 65 6e 74 69 74 69 65 73 28 73 74  ad_identities(st
1de50 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74  ruct cackey_slot
1de60 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64   *slot, unsigned
1de70 20 6c 6f 6e 67 20 2a 69 64 73 5f 66 6f 75 6e 64   long *ids_found
1de80 29 20 7b 0a 09 73 74 72 75 63 74 20 63 61 63 6b  ) {..struct cack
1de90 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79  ey_pcsc_identity
1dea0 20 2a 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65   *pcsc_identitie
1deb0 73 3b 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65  s;..struct cacke
1dec0 79 5f 69 64 65 6e 74 69 74 79 20 2a 69 64 65 6e  y_identity *iden
1ded0 74 69 74 69 65 73 3b 0a 09 75 6e 73 69 67 6e 65  tities;..unsigne
1dee0 64 20 6c 6f 6e 67 20 6e 75 6d 5f 69 64 73 2c 20  d long num_ids, 
1def0 69 64 5f 69 64 78 2c 20 63 75 72 72 5f 69 64 5f  id_idx, curr_id_
1df00 74 79 70 65 3b 0a 09 75 6e 73 69 67 6e 65 64 20  type;..unsigned 
1df10 6c 6f 6e 67 20 6e 75 6d 5f 63 65 72 74 73 2c 20  long num_certs, 
1df20 6e 75 6d 5f 64 6f 64 5f 63 65 72 74 73 2c 20 63  num_dod_certs, c
1df30 65 72 74 5f 69 64 78 3b 0a 09 69 6e 74 20 69 6e  ert_idx;..int in
1df40 63 6c 75 64 65 5f 65 78 74 72 61 5f 63 65 72 74  clude_extra_cert
1df50 73 20 3d 20 30 2c 20 69 6e 63 6c 75 64 65 5f 64  s = 0, include_d
1df60 6f 64 5f 63 65 72 74 73 3b 0a 0a 09 43 41 43 4b  od_certs;...CACK
1df70 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1df80 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
1df90 20 28 69 64 73 5f 66 6f 75 6e 64 20 3d 3d 20 4e   (ids_found == N
1dfa0 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
1dfb0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1dfc0 72 6f 72 2e 20 20 69 64 73 5f 66 6f 75 6e 64 20  ror.  ids_found 
1dfd0 69 73 20 4e 55 4c 4c 22 29 3b 0a 0a 09 09 72 65  is NULL");....re
1dfe0 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a  turn(NULL);..}..
1dff0 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f 43 41  #ifdef CACKEY_CA
1e000 52 44 5f 53 4c 4f 54 5f 49 4e 43 4c 55 44 45 5f  RD_SLOT_INCLUDE_
1e010 45 58 54 52 41 5f 43 45 52 54 53 0a 09 69 6e 63  EXTRA_CERTS..inc
1e020 6c 75 64 65 5f 65 78 74 72 61 5f 63 65 72 74 73  lude_extra_certs
1e030 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 0a 09 69   = 1;.#endif...i
1e040 66 20 28 67 65 74 65 6e 76 28 22 43 41 43 4b 45  f (getenv("CACKE
1e050 59 5f 44 4f 44 5f 43 45 52 54 53 5f 4f 4e 5f 48  Y_DOD_CERTS_ON_H
1e060 57 5f 53 4c 4f 54 53 22 29 20 21 3d 20 4e 55 4c  W_SLOTS") != NUL
1e070 4c 29 20 7b 0a 09 09 69 6e 63 6c 75 64 65 5f 65  L) {...include_e
1e080 78 74 72 61 5f 63 65 72 74 73 20 3d 20 31 3b 0a  xtra_certs = 1;.
1e090 09 7d 0a 0a 09 69 66 20 28 67 65 74 65 6e 76 28  .}...if (getenv(
1e0a0 22 43 41 43 4b 45 59 5f 4e 4f 5f 44 4f 44 5f 43  "CACKEY_NO_DOD_C
1e0b0 45 52 54 53 5f 4f 4e 5f 48 57 5f 53 4c 4f 54 53  ERTS_ON_HW_SLOTS
1e0c0 22 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  ") != NULL) {...
1e0d0 69 6e 63 6c 75 64 65 5f 65 78 74 72 61 5f 63 65  include_extra_ce
1e0e0 72 74 73 20 3d 20 30 3b 0a 09 7d 0a 0a 23 69 66  rts = 0;..}..#if
1e0f0 64 65 66 20 43 41 43 4b 45 59 5f 4e 4f 5f 45 58  def CACKEY_NO_EX
1e100 54 52 41 5f 43 45 52 54 53 0a 09 69 66 20 28 67  TRA_CERTS..if (g
1e110 65 74 65 6e 76 28 22 43 41 43 4b 45 59 5f 45 58  etenv("CACKEY_EX
1e120 54 52 41 5f 43 45 52 54 53 22 29 20 21 3d 20 4e  TRA_CERTS") != N
1e130 55 4c 4c 29 20 7b 0a 09 09 69 6e 63 6c 75 64 65  ULL) {...include
1e140 5f 64 6f 64 5f 63 65 72 74 73 20 3d 20 31 3b 0a  _dod_certs = 1;.
1e150 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69 6e 63 6c  .} else {...incl
1e160 75 64 65 5f 64 6f 64 5f 63 65 72 74 73 20 3d 20  ude_dod_certs = 
1e170 30 3b 0a 09 7d 0a 23 65 6c 73 65 0a 09 69 66 20  0;..}.#else..if 
1e180 28 67 65 74 65 6e 76 28 22 43 41 43 4b 45 59 5f  (getenv("CACKEY_
1e190 4e 4f 5f 45 58 54 52 41 5f 43 45 52 54 53 22 29  NO_EXTRA_CERTS")
1e1a0 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 69 6e   != NULL) {...in
1e1b0 63 6c 75 64 65 5f 64 6f 64 5f 63 65 72 74 73 20  clude_dod_certs 
1e1c0 3d 20 30 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09  = 0;..} else {..
1e1d0 09 69 6e 63 6c 75 64 65 5f 64 6f 64 5f 63 65 72  .include_dod_cer
1e1e0 74 73 20 3d 20 31 3b 0a 09 7d 0a 23 65 6e 64 69  ts = 1;..}.#endi
1e1f0 66 0a 0a 09 69 66 20 28 69 6e 63 6c 75 64 65 5f  f...if (include_
1e200 64 6f 64 5f 63 65 72 74 73 29 20 7b 0a 09 09 6e  dod_certs) {...n
1e210 75 6d 5f 64 6f 64 5f 63 65 72 74 73 20 3d 20 73  um_dod_certs = s
1e220 69 7a 65 6f 66 28 65 78 74 72 61 5f 63 65 72 74  izeof(extra_cert
1e230 73 29 20 2f 20 73 69 7a 65 6f 66 28 65 78 74 72  s) / sizeof(extr
1e240 61 5f 63 65 72 74 73 5b 30 5d 29 3b 0a 09 7d 20  a_certs[0]);..} 
1e250 65 6c 73 65 20 7b 0a 09 09 6e 75 6d 5f 64 6f 64  else {...num_dod
1e260 5f 63 65 72 74 73 20 3d 20 30 3b 0a 09 7d 0a 0a  _certs = 0;..}..
1e270 09 69 66 20 28 73 6c 6f 74 2d 3e 69 6e 74 65 72  .if (slot->inter
1e280 6e 61 6c 29 20 7b 0a 09 09 6e 75 6d 5f 69 64 73  nal) {...num_ids
1e290 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 64   = cackey_read_d
1e2a0 6f 64 5f 69 64 65 6e 74 69 74 69 65 73 28 4e 55  od_identities(NU
1e2b0 4c 4c 2c 20 6e 75 6d 5f 64 6f 64 5f 63 65 72 74  LL, num_dod_cert
1e2c0 73 29 3b 0a 0a 09 09 69 66 20 28 6e 75 6d 5f 69  s);....if (num_i
1e2d0 64 73 20 21 3d 20 30 29 20 7b 0a 09 09 09 69 64  ds != 0) {....id
1e2e0 65 6e 74 69 74 69 65 73 20 3d 20 6d 61 6c 6c 6f  entities = mallo
1e2f0 63 28 6e 75 6d 5f 69 64 73 20 2a 20 73 69 7a 65  c(num_ids * size
1e300 6f 66 28 2a 69 64 65 6e 74 69 74 69 65 73 29 29  of(*identities))
1e310 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 72 65 61  ;.....cackey_rea
1e320 64 5f 64 6f 64 5f 69 64 65 6e 74 69 74 69 65 73  d_dod_identities
1e330 28 69 64 65 6e 74 69 74 69 65 73 2c 20 6e 75 6d  (identities, num
1e340 5f 64 6f 64 5f 63 65 72 74 73 29 3b 0a 09 09 7d  _dod_certs);...}
1e350 20 65 6c 73 65 20 7b 0a 09 09 09 69 64 65 6e 74   else {....ident
1e360 69 74 69 65 73 20 3d 20 4e 55 4c 4c 3b 0a 09 09  ities = NULL;...
1e370 7d 0a 0a 09 09 2a 69 64 73 5f 66 6f 75 6e 64 20  }....*ids_found 
1e380 3d 20 6e 75 6d 5f 69 64 73 3b 0a 0a 09 09 72 65  = num_ids;....re
1e390 74 75 72 6e 28 69 64 65 6e 74 69 74 69 65 73 29  turn(identities)
1e3a0 3b 0a 09 7d 0a 0a 09 70 63 73 63 5f 69 64 65 6e  ;..}...pcsc_iden
1e3b0 74 69 74 69 65 73 20 3d 20 63 61 63 6b 65 79 5f  tities = cackey_
1e3c0 72 65 61 64 5f 63 65 72 74 73 28 73 6c 6f 74 2c  read_certs(slot,
1e3d0 20 4e 55 4c 4c 2c 20 26 6e 75 6d 5f 63 65 72 74   NULL, &num_cert
1e3e0 73 29 3b 0a 09 69 66 20 28 70 63 73 63 5f 69 64  s);..if (pcsc_id
1e3f0 65 6e 74 69 74 69 65 73 20 21 3d 20 4e 55 4c 4c  entities != NULL
1e400 29 20 7b 0a 09 09 2f 2a 20 43 6f 6e 76 65 72 74  ) {.../* Convert
1e410 20 6e 75 6d 62 65 72 20 6f 66 20 43 65 72 74 73   number of Certs
1e420 20 74 6f 20 6e 75 6d 62 65 72 20 6f 66 20 6f 62   to number of ob
1e430 6a 65 63 74 73 20 2a 2f 0a 09 09 6e 75 6d 5f 69  jects */...num_i
1e440 64 73 20 3d 20 28 43 4b 4f 5f 50 52 49 56 41 54  ds = (CKO_PRIVAT
1e450 45 5f 4b 45 59 20 2d 20 43 4b 4f 5f 43 45 52 54  E_KEY - CKO_CERT
1e460 49 46 49 43 41 54 45 20 2b 20 31 29 20 2a 20 6e  IFICATE + 1) * n
1e470 75 6d 5f 63 65 72 74 73 3b 0a 0a 09 09 69 66 20  um_certs;....if 
1e480 28 69 6e 63 6c 75 64 65 5f 65 78 74 72 61 5f 63  (include_extra_c
1e490 65 72 74 73 29 20 7b 0a 09 09 09 6e 75 6d 5f 69  erts) {....num_i
1e4a0 64 73 20 2b 3d 20 63 61 63 6b 65 79 5f 72 65 61  ds += cackey_rea
1e4b0 64 5f 64 6f 64 5f 69 64 65 6e 74 69 74 69 65 73  d_dod_identities
1e4c0 28 4e 55 4c 4c 2c 20 6e 75 6d 5f 64 6f 64 5f 63  (NULL, num_dod_c
1e4d0 65 72 74 73 29 3b 0a 09 09 7d 0a 0a 09 09 69 64  erts);...}....id
1e4e0 65 6e 74 69 74 69 65 73 20 3d 20 6d 61 6c 6c 6f  entities = mallo
1e4f0 63 28 6e 75 6d 5f 69 64 73 20 2a 20 73 69 7a 65  c(num_ids * size
1e500 6f 66 28 2a 69 64 65 6e 74 69 74 69 65 73 29 29  of(*identities))
1e510 3b 0a 0a 09 09 2f 2a 20 41 64 64 20 63 65 72 74  ;..../* Add cert
1e520 69 66 69 63 61 74 65 73 2c 20 70 75 62 6c 69 63  ificates, public
1e530 20 6b 65 79 73 2c 20 61 6e 64 20 70 72 69 76 61   keys, and priva
1e540 74 65 20 6b 65 79 73 20 66 72 6f 6d 20 74 68 65  te keys from the
1e550 20 73 6d 61 72 74 63 61 72 64 20 2a 2f 0a 09 09   smartcard */...
1e560 69 64 5f 69 64 78 20 3d 20 30 3b 0a 09 09 66 6f  id_idx = 0;...fo
1e570 72 20 28 63 65 72 74 5f 69 64 78 20 3d 20 30 3b  r (cert_idx = 0;
1e580 20 63 65 72 74 5f 69 64 78 20 3c 20 6e 75 6d 5f   cert_idx < num_
1e590 63 65 72 74 73 3b 20 63 65 72 74 5f 69 64 78 2b  certs; cert_idx+
1e5a0 2b 29 20 7b 0a 09 09 09 66 6f 72 20 28 63 75 72  +) {....for (cur
1e5b0 72 5f 69 64 5f 74 79 70 65 20 3d 20 43 4b 4f 5f  r_id_type = CKO_
1e5c0 43 45 52 54 49 46 49 43 41 54 45 3b 20 63 75 72  CERTIFICATE; cur
1e5d0 72 5f 69 64 5f 74 79 70 65 20 3c 3d 20 43 4b 4f  r_id_type <= CKO
1e5e0 5f 50 52 49 56 41 54 45 5f 4b 45 59 3b 20 63 75  _PRIVATE_KEY; cu
1e5f0 72 72 5f 69 64 5f 74 79 70 65 2b 2b 29 20 7b 0a  rr_id_type++) {.
1e600 09 09 09 09 69 64 65 6e 74 69 74 69 65 73 5b 69  ....identities[i
1e610 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65  d_idx].attribute
1e620 73 20 3d 20 63 61 63 6b 65 79 5f 67 65 74 5f 61  s = cackey_get_a
1e630 74 74 72 69 62 75 74 65 73 28 63 75 72 72 5f 69  ttributes(curr_i
1e640 64 5f 74 79 70 65 2c 20 26 70 63 73 63 5f 69 64  d_type, &pcsc_id
1e650 65 6e 74 69 74 69 65 73 5b 63 65 72 74 5f 69 64  entities[cert_id
1e660 78 5d 2c 20 63 65 72 74 5f 69 64 78 2c 20 26 69  x], cert_idx, &i
1e670 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78  dentities[id_idx
1e680 5d 2e 61 74 74 72 69 62 75 74 65 73 5f 63 6f 75  ].attributes_cou
1e690 6e 74 29 3b 0a 0a 09 09 09 09 69 64 65 6e 74 69  nt);......identi
1e6a0 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73  ties[id_idx].pcs
1e6b0 63 5f 69 64 65 6e 74 69 74 79 20 3d 20 6d 61 6c  c_identity = mal
1e6c0 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 69 64 65 6e  loc(sizeof(*iden
1e6d0 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70  tities[id_idx].p
1e6e0 63 73 63 5f 69 64 65 6e 74 69 74 79 29 29 3b 0a  csc_identity));.
1e6f0 09 09 09 09 6d 65 6d 63 70 79 28 69 64 65 6e 74  ....memcpy(ident
1e700 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63  ities[id_idx].pc
1e710 73 63 5f 69 64 65 6e 74 69 74 79 2c 20 26 70 63  sc_identity, &pc
1e720 73 63 5f 69 64 65 6e 74 69 74 69 65 73 5b 63 65  sc_identities[ce
1e730 72 74 5f 69 64 78 5d 2c 20 73 69 7a 65 6f 66 28  rt_idx], sizeof(
1e740 2a 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69  *identities[id_i
1e750 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69 74  dx].pcsc_identit
1e760 79 29 29 3b 0a 0a 09 09 09 09 69 64 65 6e 74 69  y));......identi
1e770 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73  ties[id_idx].pcs
1e780 63 5f 69 64 65 6e 74 69 74 79 2d 3e 63 65 72 74  c_identity->cert
1e790 69 66 69 63 61 74 65 20 3d 20 6d 61 6c 6c 6f 63  ificate = malloc
1e7a0 28 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73  (pcsc_identities
1e7b0 5b 63 65 72 74 5f 69 64 78 5d 2e 63 65 72 74 69  [cert_idx].certi
1e7c0 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a 09 09 09  ficate_len);....
1e7d0 09 6d 65 6d 63 70 79 28 69 64 65 6e 74 69 74 69  .memcpy(identiti
1e7e0 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f  es[id_idx].pcsc_
1e7f0 69 64 65 6e 74 69 74 79 2d 3e 63 65 72 74 69 66  identity->certif
1e800 69 63 61 74 65 2c 20 70 63 73 63 5f 69 64 65 6e  icate, pcsc_iden
1e810 74 69 74 69 65 73 5b 63 65 72 74 5f 69 64 78 5d  tities[cert_idx]
1e820 2e 63 65 72 74 69 66 69 63 61 74 65 2c 20 70 63  .certificate, pc
1e830 73 63 5f 69 64 65 6e 74 69 74 69 65 73 5b 63 65  sc_identities[ce
1e840 72 74 5f 69 64 78 5d 2e 63 65 72 74 69 66 69 63  rt_idx].certific
1e850 61 74 65 5f 6c 65 6e 29 3b 0a 0a 09 09 09 09 69  ate_len);......i
1e860 64 5f 69 64 78 2b 2b 3b 0a 09 09 09 7d 0a 09 09  d_idx++;....}...
1e870 7d 0a 0a 09 09 69 66 20 28 69 6e 63 6c 75 64 65  }....if (include
1e880 5f 65 78 74 72 61 5f 63 65 72 74 73 29 20 7b 0a  _extra_certs) {.
1e890 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1e8a0 50 52 49 4e 54 46 28 22 49 6e 63 6c 75 64 69 6e  PRINTF("Includin
1e8b0 67 20 55 53 20 47 6f 76 65 72 6e 6d 65 6e 74 20  g US Government 
1e8c0 43 65 72 74 69 66 69 63 61 74 65 73 20 6f 6e 20  Certificates on 
1e8d0 68 61 72 64 77 61 72 65 20 73 6c 6f 74 22 29 3b  hardware slot");
1e8e0 0a 0a 09 09 09 63 61 63 6b 65 79 5f 72 65 61 64  .....cackey_read
1e8f0 5f 64 6f 64 5f 69 64 65 6e 74 69 74 69 65 73 28  _dod_identities(
1e900 69 64 65 6e 74 69 74 69 65 73 20 2b 20 69 64 5f  identities + id_
1e910 69 64 78 2c 20 6e 75 6d 5f 64 6f 64 5f 63 65 72  idx, num_dod_cer
1e920 74 73 29 3b 0a 09 09 7d 0a 0a 09 09 63 61 63 6b  ts);...}....cack
1e930 65 79 5f 66 72 65 65 5f 63 65 72 74 73 28 70 63  ey_free_certs(pc
1e940 73 63 5f 69 64 65 6e 74 69 74 69 65 73 2c 20 6e  sc_identities, n
1e950 75 6d 5f 63 65 72 74 73 2c 20 31 29 3b 0a 0a 09  um_certs, 1);...
1e960 09 2a 69 64 73 5f 66 6f 75 6e 64 20 3d 20 6e 75  .*ids_found = nu
1e970 6d 5f 69 64 73 3b 0a 0a 09 09 72 65 74 75 72 6e  m_ids;....return
1e980 28 69 64 65 6e 74 69 74 69 65 73 29 3b 0a 09 7d  (identities);..}
1e990 0a 0a 09 2a 69 64 73 5f 66 6f 75 6e 64 20 3d 20  ...*ids_found = 
1e9a0 30 3b 0a 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29  0;..return(NULL)
1e9b0 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 63 61 63 6b  ;.}..static cack
1e9c0 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 67 65  ey_ret cackey_ge
1e9d0 74 5f 70 69 6e 28 63 68 61 72 20 2a 70 69 6e 62  t_pin(char *pinb
1e9e0 75 66 29 20 7b 0a 09 46 49 4c 45 20 2a 70 69 6e  uf) {..FILE *pin
1e9f0 66 64 3b 0a 09 63 68 61 72 20 2a 66 67 65 74 73  fd;..char *fgets
1ea00 5f 72 65 74 3b 0a 09 69 6e 74 20 70 63 6c 6f 73  _ret;..int pclos
1ea10 65 5f 72 65 74 3b 0a 0a 09 69 66 20 28 63 61 63  e_ret;...if (cac
1ea20 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20  key_pin_command 
1ea30 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74  == NULL) {...ret
1ea40 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
1ea50 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a  E_GENERIC);..}..
1ea60 09 69 66 20 28 70 69 6e 62 75 66 20 3d 3d 20 4e  .if (pinbuf == N
1ea70 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e 28  ULL) {...return(
1ea80 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45  CACKEY_PCSC_E_GE
1ea90 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 43 41 43  NERIC);..}...CAC
1eaa0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1eab0 28 22 43 41 43 4b 45 59 5f 50 49 4e 5f 43 4f 4d  ("CACKEY_PIN_COM
1eac0 4d 41 4e 44 20 3d 20 25 73 22 2c 20 63 61 63 6b  MAND = %s", cack
1ead0 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 29 3b  ey_pin_command);
1eae0 0a 0a 09 70 69 6e 66 64 20 3d 20 70 6f 70 65 6e  ...pinfd = popen
1eaf0 28 63 61 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d  (cackey_pin_comm
1eb00 61 6e 64 2c 20 22 72 22 29 3b 0a 09 69 66 20 28  and, "r");..if (
1eb10 70 69 6e 66 64 20 3d 3d 20 4e 55 4c 4c 29 20 7b  pinfd == NULL) {
1eb20 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1eb30 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
1eb40 25 73 3a 20 55 6e 61 62 6c 65 20 74 6f 20 72 75  %s: Unable to ru
1eb50 6e 22 2c 20 63 61 63 6b 65 79 5f 70 69 6e 5f 63  n", cackey_pin_c
1eb60 6f 6d 6d 61 6e 64 29 3b 0a 0a 09 09 72 65 74 75  ommand);....retu
1eb70 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  rn(CACKEY_PCSC_E
1eb80 5f 42 41 44 50 49 4e 29 3b 0a 09 7d 0a 0a 09 66  _BADPIN);..}...f
1eb90 67 65 74 73 5f 72 65 74 20 3d 20 66 67 65 74 73  gets_ret = fgets
1eba0 28 70 69 6e 62 75 66 2c 20 33 32 2c 20 70 69 6e  (pinbuf, 32, pin
1ebb0 66 64 29 3b 0a 09 69 66 20 28 66 67 65 74 73 5f  fd);..if (fgets_
1ebc0 72 65 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ret == NULL) {..
1ebd0 09 70 69 6e 62 75 66 5b 30 5d 20 3d 20 27 5c 30  .pinbuf[0] = '\0
1ebe0 27 3b 0a 09 7d 0a 0a 09 70 63 6c 6f 73 65 5f 72  ';..}...pclose_r
1ebf0 65 74 20 3d 20 70 63 6c 6f 73 65 28 70 69 6e 66  et = pclose(pinf
1ec00 64 29 3b 0a 09 69 66 20 28 70 63 6c 6f 73 65 5f  d);..if (pclose_
1ec10 72 65 74 20 3d 3d 20 2d 31 20 26 26 20 65 72 72  ret == -1 && err
1ec20 6e 6f 20 3d 3d 20 45 43 48 49 4c 44 29 20 7b 0a  no == ECHILD) {.
1ec30 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1ec40 52 49 4e 54 46 28 22 4e 6f 74 69 63 65 2e 20 20  RINTF("Notice.  
1ec50 70 63 6c 6f 73 65 28 29 20 69 6e 64 69 63 61 74  pclose() indicat
1ec60 65 64 20 69 74 20 63 6f 75 6c 64 20 6e 6f 74 20  ed it could not 
1ec70 67 65 74 20 74 68 65 20 73 74 61 74 75 73 20 6f  get the status o
1ec80 66 20 74 68 65 20 63 68 69 6c 64 2c 20 61 73 73  f the child, ass
1ec90 75 6d 69 6e 67 20 69 74 20 73 75 63 63 65 65 65  uming it succeee
1eca0 64 65 64 20 21 22 29 3b 0a 0a 09 09 70 63 6c 6f  ded !");....pclo
1ecb0 73 65 5f 72 65 74 20 3d 20 30 3b 0a 09 7d 0a 0a  se_ret = 0;..}..
1ecc0 09 69 66 20 28 70 63 6c 6f 73 65 5f 72 65 74 20  .if (pclose_ret 
1ecd0 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
1ece0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1ecf0 72 72 6f 72 2e 20 20 25 73 3a 20 65 78 69 74 65  rror.  %s: exite
1ed00 64 20 77 69 74 68 20 6e 6f 6e 2d 7a 65 72 6f 20  d with non-zero 
1ed10 73 74 61 74 75 73 20 6f 66 20 25 69 22 2c 20 63  status of %i", c
1ed20 61 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e  ackey_pin_comman
1ed30 64 2c 20 70 63 6c 6f 73 65 5f 72 65 74 29 3b 0a  d, pclose_ret);.
1ed40 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
1ed50 5f 50 43 53 43 5f 45 5f 42 41 44 50 49 4e 29 3b  _PCSC_E_BADPIN);
1ed60 0a 09 7d 0a 0a 09 69 66 20 28 73 74 72 6c 65 6e  ..}...if (strlen
1ed70 28 70 69 6e 62 75 66 29 20 3c 20 31 29 20 7b 0a  (pinbuf) < 1) {.
1ed80 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1ed90 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 25  RINTF("Error.  %
1eda0 73 3a 20 72 65 74 75 72 6e 65 64 20 6e 6f 20 64  s: returned no d
1edb0 61 74 61 22 2c 20 63 61 63 6b 65 79 5f 70 69 6e  ata", cackey_pin
1edc0 5f 63 6f 6d 6d 61 6e 64 29 3b 0a 0a 09 09 72 65  _command);....re
1edd0 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
1ede0 5f 45 5f 42 41 44 50 49 4e 29 3b 0a 09 7d 0a 0a  _E_BADPIN);..}..
1edf0 09 69 66 20 28 70 69 6e 62 75 66 5b 73 74 72 6c  .if (pinbuf[strl
1ee00 65 6e 28 70 69 6e 62 75 66 29 20 2d 20 31 5d 20  en(pinbuf) - 1] 
1ee10 3d 3d 20 27 5c 6e 27 29 20 7b 0a 09 09 70 69 6e  == '\n') {...pin
1ee20 62 75 66 5b 73 74 72 6c 65 6e 28 70 69 6e 62 75  buf[strlen(pinbu
1ee30 66 29 20 2d 20 31 5d 20 3d 20 27 5c 30 27 3b 0a  f) - 1] = '\0';.
1ee40 09 7d 0a 0a 09 72 65 74 75 72 6e 28 43 41 43 4b  .}...return(CACK
1ee50 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d  EY_PCSC_S_OK);.}
1ee60 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
1ee70 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 49 6e  TION(CK_RV, C_In
1ee80 69 74 69 61 6c 69 7a 65 29 28 43 4b 5f 56 4f 49  itialize)(CK_VOI
1ee90 44 5f 50 54 52 20 70 49 6e 69 74 41 72 67 73 29  D_PTR pInitArgs)
1eea0 20 7b 0a 09 43 4b 5f 43 5f 49 4e 49 54 49 41 4c   {..CK_C_INITIAL
1eeb0 49 5a 45 5f 41 52 47 53 20 43 4b 5f 50 54 52 20  IZE_ARGS CK_PTR 
1eec0 61 72 67 73 3b 0a 09 75 69 6e 74 33 32 5f 74 20  args;..uint32_t 
1eed0 69 64 78 2c 20 68 69 67 68 65 73 74 5f 73 6c 6f  idx, highest_slo
1eee0 74 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 69 6e  t;..int mutex_in
1eef0 69 74 5f 72 65 74 3b 0a 09 69 6e 74 20 69 6e 63  it_ret;..int inc
1ef00 6c 75 64 65 5f 64 6f 64 5f 63 65 72 74 73 3b 0a  lude_dod_certs;.
1ef10 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1ef20 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
1ef30 3b 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 69  ;...if (cackey_i
1ef40 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
1ef50 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1ef60 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 41 6c 72  NTF("Error.  Alr
1ef70 65 61 64 79 20 69 6e 69 74 69 61 6c 69 7a 65 64  eady initialized
1ef80 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
1ef90 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 41 4c 52 45  KR_CRYPTOKI_ALRE
1efa0 41 44 59 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  ADY_INITIALIZED)
1efb0 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 49 6e 69 74  ;..}...if (pInit
1efc0 41 72 67 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  Args != NULL) {.
1efd0 09 09 61 72 67 73 20 3d 20 70 49 6e 69 74 41 72  ..args = pInitAr
1efe0 67 73 3b 0a 09 09 6d 65 6d 63 70 79 28 26 63 61  gs;...memcpy(&ca
1eff0 63 6b 65 79 5f 61 72 67 73 2c 20 61 72 67 73 2c  ckey_args, args,
1f000 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 61   sizeof(cackey_a
1f010 72 67 73 29 29 3b 0a 0a 09 09 69 66 20 28 61 72  rgs));....if (ar
1f020 67 73 2d 3e 43 72 65 61 74 65 4d 75 74 65 78 20  gs->CreateMutex 
1f030 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 73 2d  == NULL || args-
1f040 3e 44 65 73 74 72 6f 79 4d 75 74 65 78 20 3d 3d  >DestroyMutex ==
1f050 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 73 2d 3e 4c   NULL || args->L
1f060 6f 63 6b 4d 75 74 65 78 20 3d 3d 20 4e 55 4c 4c  ockMutex == NULL
1f070 20 7c 7c 20 61 72 67 73 2d 3e 55 6e 6c 6f 63 6b   || args->Unlock
1f080 4d 75 74 65 78 20 3d 3d 20 4e 55 4c 4c 29 20 7b  Mutex == NULL) {
1f090 0a 09 09 09 69 66 20 28 61 72 67 73 2d 3e 43 72  ....if (args->Cr
1f0a0 65 61 74 65 4d 75 74 65 78 20 21 3d 20 4e 55 4c  eateMutex != NUL
1f0b0 4c 20 7c 7c 20 61 72 67 73 2d 3e 44 65 73 74 72  L || args->Destr
1f0c0 6f 79 4d 75 74 65 78 20 21 3d 20 4e 55 4c 4c 20  oyMutex != NULL 
1f0d0 7c 7c 20 61 72 67 73 2d 3e 4c 6f 63 6b 4d 75 74  || args->LockMut
1f0e0 65 78 20 21 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72  ex != NULL || ar
1f0f0 67 73 2d 3e 55 6e 6c 6f 63 6b 4d 75 74 65 78 20  gs->UnlockMutex 
1f100 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 43  != NULL) {.....C
1f110 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1f120 54 46 28 22 45 72 72 6f 72 2e 20 53 6f 6d 65 2c  TF("Error. Some,
1f130 20 62 75 74 20 6e 6f 74 20 41 6c 6c 20 74 68 72   but not All thr
1f140 65 61 64 69 6e 67 20 70 72 69 6d 69 74 69 76 65  eading primitive
1f150 73 20 70 72 6f 76 69 64 65 64 2e 22 29 3b 0a 0a  s provided.");..
1f160 09 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41  ....return(CKR_A
1f170 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09  RGUMENTS_BAD);..
1f180 09 09 7d 0a 09 09 7d 0a 09 7d 20 65 6c 73 65 20  ..}...}..} else 
1f190 7b 0a 09 09 63 61 63 6b 65 79 5f 61 72 67 73 2e  {...cackey_args.
1f1a0 43 72 65 61 74 65 4d 75 74 65 78 20 3d 20 4e 55  CreateMutex = NU
1f1b0 4c 4c 3b 0a 09 09 63 61 63 6b 65 79 5f 61 72 67  LL;...cackey_arg
1f1c0 73 2e 44 65 73 74 72 6f 79 4d 75 74 65 78 20 3d  s.DestroyMutex =
1f1d0 20 4e 55 4c 4c 3b 0a 09 09 63 61 63 6b 65 79 5f   NULL;...cackey_
1f1e0 61 72 67 73 2e 4c 6f 63 6b 4d 75 74 65 78 20 3d  args.LockMutex =
1f1f0 20 4e 55 4c 4c 3b 0a 09 09 63 61 63 6b 65 79 5f   NULL;...cackey_
1f200 61 72 67 73 2e 55 6e 6c 6f 63 6b 4d 75 74 65 78  args.UnlockMutex
1f210 20 3d 20 4e 55 4c 4c 3b 0a 09 09 63 61 63 6b 65   = NULL;...cacke
1f220 79 5f 61 72 67 73 2e 66 6c 61 67 73 20 3d 20 30  y_args.flags = 0
1f230 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 64 78 20  ;..}...for (idx 
1f240 3d 20 30 3b 20 69 64 78 20 3c 20 28 73 69 7a 65  = 0; idx < (size
1f250 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
1f260 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63  ns) / sizeof(cac
1f270 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29  key_sessions[0])
1f280 29 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 63 61  ); idx++) {...ca
1f290 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64  ckey_sessions[id
1f2a0 78 5d 2e 61 63 74 69 76 65 20 3d 20 30 3b 0a 09  x].active = 0;..
1f2b0 7d 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 30  }...for (idx = 0
1f2c0 3b 20 69 64 78 20 3c 20 28 73 69 7a 65 6f 66 28  ; idx < (sizeof(
1f2d0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20  cackey_slots) / 
1f2e0 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
1f2f0 6f 74 73 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29  ots[0])); idx++)
1f300 20 7b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74   {...cackey_slot
1f310 73 5b 69 64 78 5d 2e 61 63 74 69 76 65 20 3d 20  s[idx].active = 
1f320 30 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  0;...cackey_slot
1f330 73 5b 69 64 78 5d 2e 70 63 73 63 5f 72 65 61 64  s[idx].pcsc_read
1f340 65 72 20 3d 20 4e 55 4c 4c 3b 0a 09 09 63 61 63  er = NULL;...cac
1f350 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 74  key_slots[idx].t
1f360 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68  ransaction_depth
1f370 20 3d 20 30 3b 0a 09 09 63 61 63 6b 65 79 5f 73   = 0;...cackey_s
1f380 6c 6f 74 73 5b 69 64 78 5d 2e 74 72 61 6e 73 61  lots[idx].transa
1f390 63 74 69 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f  ction_need_hw_lo
1f3a0 63 6b 20 3d 20 30 3b 0a 09 09 63 61 63 6b 65 79  ck = 0;...cackey
1f3b0 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 73 6c 6f 74  _slots[idx].slot
1f3c0 5f 72 65 73 65 74 20 3d 20 30 3b 0a 09 09 63 61  _reset = 0;...ca
1f3d0 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e  ckey_slots[idx].
1f3e0 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 3d 20 30 3b  token_flags = 0;
1f3f0 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ...cackey_slots[
1f400 69 64 78 5d 2e 6c 61 62 65 6c 20 3d 20 4e 55 4c  idx].label = NUL
1f410 4c 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  L;...cackey_slot
1f420 73 5b 69 64 78 5d 2e 69 6e 74 65 72 6e 61 6c 20  s[idx].internal 
1f430 3d 20 30 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c  = 0;...cackey_sl
1f440 6f 74 73 5b 69 64 78 5d 2e 69 64 5f 74 79 70 65  ots[idx].id_type
1f450 5f 68 69 6e 74 20 3d 20 43 41 43 4b 45 59 5f 49  _hint = CACKEY_I
1f460 44 5f 54 59 50 45 5f 55 4e 4b 4e 4f 57 4e 3b 0a  D_TYPE_UNKNOWN;.
1f470 09 7d 0a 0a 23 69 66 64 65 66 20 43 41 43 4b 45  .}..#ifdef CACKE
1f480 59 5f 4e 4f 5f 45 58 54 52 41 5f 43 45 52 54 53  Y_NO_EXTRA_CERTS
1f490 0a 09 69 66 20 28 67 65 74 65 6e 76 28 22 43 41  ..if (getenv("CA
1f4a0 43 4b 45 59 5f 45 58 54 52 41 5f 43 45 52 54 53  CKEY_EXTRA_CERTS
1f4b0 22 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  ") != NULL) {...
1f4c0 69 6e 63 6c 75 64 65 5f 64 6f 64 5f 63 65 72 74  include_dod_cert
1f4d0 73 20 3d 20 31 3b 0a 09 7d 20 65 6c 73 65 20 7b  s = 1;..} else {
1f4e0 0a 09 09 69 6e 63 6c 75 64 65 5f 64 6f 64 5f 63  ...include_dod_c
1f4f0 65 72 74 73 20 3d 20 30 3b 0a 09 7d 0a 23 65 6c  erts = 0;..}.#el
1f500 73 65 0a 09 69 66 20 28 67 65 74 65 6e 76 28 22  se..if (getenv("
1f510 43 41 43 4b 45 59 5f 4e 4f 5f 45 58 54 52 41 5f  CACKEY_NO_EXTRA_
1f520 43 45 52 54 53 22 29 20 21 3d 20 4e 55 4c 4c 29  CERTS") != NULL)
1f530 20 7b 0a 09 09 69 6e 63 6c 75 64 65 5f 64 6f 64   {...include_dod
1f540 5f 63 65 72 74 73 20 3d 20 30 3b 0a 09 7d 20 65  _certs = 0;..} e
1f550 6c 73 65 20 7b 0a 09 09 69 6e 63 6c 75 64 65 5f  lse {...include_
1f560 64 6f 64 5f 63 65 72 74 73 20 3d 20 31 3b 0a 09  dod_certs = 1;..
1f570 7d 0a 23 65 6e 64 69 66 0a 0a 09 69 66 20 28 69  }.#endif...if (i
1f580 6e 63 6c 75 64 65 5f 64 6f 64 5f 63 65 72 74 73  nclude_dod_certs
1f590 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   == 0) {...CACKE
1f5a0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1f5b0 41 73 6b 65 64 20 6e 6f 74 20 74 6f 20 69 6e 63  Asked not to inc
1f5c0 6c 75 64 65 20 44 6f 44 20 63 65 72 74 69 66 69  lude DoD certifi
1f5d0 63 61 74 65 73 22 29 3b 0a 09 7d 20 65 6c 73 65  cates");..} else
1f5e0 20 7b 0a 09 09 68 69 67 68 65 73 74 5f 73 6c 6f   {...highest_slo
1f5f0 74 20 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b  t = (sizeof(cack
1f600 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65  ey_slots) / size
1f610 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  of(cackey_slots[
1f620 30 5d 29 29 20 2d 20 31 3b 0a 0a 09 09 43 41 43  0])) - 1;....CAC
1f630 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1f640 28 22 49 6e 63 6c 75 64 69 6e 67 20 44 6f 44 20  ("Including DoD 
1f650 63 65 72 74 73 20 69 6e 20 73 6c 6f 74 20 25 6c  certs in slot %l
1f660 75 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  u", (unsigned lo
1f670 6e 67 29 20 68 69 67 68 65 73 74 5f 73 6c 6f 74  ng) highest_slot
1f680 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f  );....cackey_slo
1f690 74 73 5b 68 69 67 68 65 73 74 5f 73 6c 6f 74 5d  ts[highest_slot]
1f6a0 2e 61 63 74 69 76 65 20 3d 20 31 3b 0a 09 09 63  .active = 1;...c
1f6b0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 68 69 67 68  ackey_slots[high
1f6c0 65 73 74 5f 73 6c 6f 74 5d 2e 69 6e 74 65 72 6e  est_slot].intern
1f6d0 61 6c 20 3d 20 31 3b 0a 09 09 63 61 63 6b 65 79  al = 1;...cackey
1f6e0 5f 73 6c 6f 74 73 5b 68 69 67 68 65 73 74 5f 73  _slots[highest_s
1f6f0 6c 6f 74 5d 2e 6c 61 62 65 6c 20 3d 20 28 75 6e  lot].label = (un
1f700 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 22  signed char *) "
1f710 55 53 20 47 6f 76 65 72 6e 6d 65 6e 74 20 43 65  US Government Ce
1f720 72 74 69 66 69 63 61 74 65 73 22 3b 0a 09 09 63  rtificates";...c
1f730 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 68 69 67 68  ackey_slots[high
1f740 65 73 74 5f 73 6c 6f 74 5d 2e 70 63 73 63 5f 72  est_slot].pcsc_r
1f750 65 61 64 65 72 20 3d 20 22 43 41 43 4b 65 79 22  eader = "CACKey"
1f760 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ;...cackey_slots
1f770 5b 68 69 67 68 65 73 74 5f 73 6c 6f 74 5d 2e 74  [highest_slot].t
1f780 6f 6b 65 6e 5f 66 6c 61 67 73 20 3d 20 30 3b 0a  oken_flags = 0;.
1f790 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 69 6e 69 74  .}...cackey_init
1f7a0 69 61 6c 69 7a 65 64 20 3d 20 31 3b 0a 0a 09 69  ialized = 1;...i
1f7b0 66 20 28 21 63 61 63 6b 65 79 5f 62 69 67 6c 6f  f (!cackey_biglo
1f7c0 63 6b 5f 69 6e 69 74 29 20 7b 0a 09 09 6d 75 74  ck_init) {...mut
1f7d0 65 78 5f 69 6e 69 74 5f 72 65 74 20 3d 20 63 61  ex_init_ret = ca
1f7e0 63 6b 65 79 5f 6d 75 74 65 78 5f 63 72 65 61 74  ckey_mutex_creat
1f7f0 65 28 26 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  e(&cackey_bigloc
1f800 6b 29 3b 0a 0a 09 09 69 66 20 28 6d 75 74 65 78  k);....if (mutex
1f810 5f 69 6e 69 74 5f 72 65 74 20 21 3d 20 30 29 20  _init_ret != 0) 
1f820 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
1f830 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1f840 20 20 4d 75 74 65 78 20 69 6e 69 74 69 61 6c 69    Mutex initiali
1f850 7a 61 74 69 6f 6e 20 66 61 69 6c 65 64 2e 22 29  zation failed.")
1f860 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 4b 52  ;.....return(CKR
1f870 5f 43 41 4e 54 5f 4c 4f 43 4b 29 3b 0a 09 09 7d  _CANT_LOCK);...}
1f880 0a 0a 09 09 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ....cackey_biglo
1f890 63 6b 5f 69 6e 69 74 20 3d 20 31 3b 0a 09 7d 0a  ck_init = 1;..}.
1f8a0 0a 09 2f 2a 20 44 65 66 69 6e 65 20 61 20 63 6f  ../* Define a co
1f8b0 6d 6d 61 6e 64 20 74 6f 20 70 72 6f 6d 70 74 20  mmand to prompt 
1f8c0 75 73 65 72 20 66 6f 72 20 61 20 50 49 4e 20 2a  user for a PIN *
1f8d0 2f 0a 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f  /.#ifdef CACKEY_
1f8e0 50 49 4e 5f 43 4f 4d 4d 41 4e 44 5f 44 45 46 41  PIN_COMMAND_DEFA
1f8f0 55 4c 54 0a 09 63 61 63 6b 65 79 5f 70 69 6e 5f  ULT..cackey_pin_
1f900 63 6f 6d 6d 61 6e 64 20 3d 20 73 74 72 64 75 70  command = strdup
1f910 28 43 41 43 4b 45 59 5f 4d 41 43 52 4f 5f 44 45  (CACKEY_MACRO_DE
1f920 46 41 55 4c 54 5f 58 53 54 52 28 43 41 43 4b 45  FAULT_XSTR(CACKE
1f930 59 5f 50 49 4e 5f 43 4f 4d 4d 41 4e 44 5f 44 45  Y_PIN_COMMAND_DE
1f940 46 41 55 4c 54 29 29 3b 0a 23 65 6e 64 69 66 0a  FAULT));.#endif.
1f950 0a 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f 50  .#ifdef CACKEY_P
1f960 49 4e 5f 43 4f 4d 4d 41 4e 44 5f 58 4f 4e 4c 59  IN_COMMAND_XONLY
1f970 5f 44 45 46 41 55 4c 54 0a 09 69 66 20 28 67 65  _DEFAULT..if (ge
1f980 74 65 6e 76 28 22 44 49 53 50 4c 41 59 22 29 20  tenv("DISPLAY") 
1f990 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 63 61 63  != NULL) {...cac
1f9a0 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20  key_pin_command 
1f9b0 3d 20 73 74 72 64 75 70 28 43 41 43 4b 45 59 5f  = strdup(CACKEY_
1f9c0 4d 41 43 52 4f 5f 44 45 46 41 55 4c 54 5f 58 53  MACRO_DEFAULT_XS
1f9d0 54 52 28 43 41 43 4b 45 59 5f 50 49 4e 5f 43 4f  TR(CACKEY_PIN_CO
1f9e0 4d 4d 41 4e 44 5f 58 4f 4e 4c 59 5f 44 45 46 41  MMAND_XONLY_DEFA
1f9f0 55 4c 54 29 29 3b 0a 09 7d 0a 23 65 6e 64 69 66  ULT));..}.#endif
1fa00 0a 0a 09 69 66 20 28 67 65 74 65 6e 76 28 22 43  ...if (getenv("C
1fa10 41 43 4b 45 59 5f 50 49 4e 5f 43 4f 4d 4d 41 4e  ACKEY_PIN_COMMAN
1fa20 44 22 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  D") != NULL) {..
1fa30 09 63 61 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d  .cackey_pin_comm
1fa40 61 6e 64 20 3d 20 73 74 72 64 75 70 28 67 65 74  and = strdup(get
1fa50 65 6e 76 28 22 43 41 43 4b 45 59 5f 50 49 4e 5f  env("CACKEY_PIN_
1fa60 43 4f 4d 4d 41 4e 44 22 29 29 3b 0a 09 7d 0a 0a  COMMAND"));..}..
1fa70 09 69 66 20 28 67 65 74 65 6e 76 28 22 43 41 43  .if (getenv("CAC
1fa80 4b 45 59 5f 50 49 4e 5f 43 4f 4d 4d 41 4e 44 5f  KEY_PIN_COMMAND_
1fa90 58 4f 4e 4c 59 22 29 20 21 3d 20 4e 55 4c 4c 20  XONLY") != NULL 
1faa0 26 26 20 67 65 74 65 6e 76 28 22 44 49 53 50 4c  && getenv("DISPL
1fab0 41 59 22 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  AY") != NULL) {.
1fac0 09 09 63 61 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d  ..cackey_pin_com
1fad0 6d 61 6e 64 20 3d 20 73 74 72 64 75 70 28 67 65  mand = strdup(ge
1fae0 74 65 6e 76 28 22 43 41 43 4b 45 59 5f 50 49 4e  tenv("CACKEY_PIN
1faf0 5f 43 4f 4d 4d 41 4e 44 5f 58 4f 4e 4c 59 22 29  _COMMAND_XONLY")
1fb00 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 74 72 63  );..}...if (strc
1fb10 6d 70 28 63 61 63 6b 65 79 5f 70 69 6e 5f 63 6f  mp(cackey_pin_co
1fb20 6d 6d 61 6e 64 2c 20 22 22 29 20 3d 3d 20 30 29  mmand, "") == 0)
1fb30 20 7b 0a 09 09 66 72 65 65 28 63 61 63 6b 65 79   {...free(cackey
1fb40 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 29 3b 0a 09  _pin_command);..
1fb50 09 63 61 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d  .cackey_pin_comm
1fb60 61 6e 64 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 0a  and = NULL;..}..
1fb70 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f 52 45  #ifdef CACKEY_RE
1fb80 41 44 45 52 53 5f 49 4e 43 4c 55 44 45 5f 4f 4e  ADERS_INCLUDE_ON
1fb90 4c 59 5f 44 45 46 41 55 4c 54 0a 09 63 61 63 6b  LY_DEFAULT..cack
1fba0 65 79 5f 72 65 61 64 65 72 73 5f 69 6e 63 6c 75  ey_readers_inclu
1fbb0 64 65 5f 6f 6e 6c 79 20 3d 20 73 74 72 64 75 70  de_only = strdup
1fbc0 28 43 41 43 4b 45 59 5f 4d 41 43 52 4f 5f 44 45  (CACKEY_MACRO_DE
1fbd0 46 41 55 4c 54 5f 58 53 54 52 28 43 41 43 4b 45  FAULT_XSTR(CACKE
1fbe0 59 5f 52 45 41 44 45 52 53 5f 49 4e 43 4c 55 44  Y_READERS_INCLUD
1fbf0 45 5f 4f 4e 4c 59 5f 44 45 46 41 55 4c 54 29 29  E_ONLY_DEFAULT))
1fc00 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  ;.#endif..#ifdef
1fc10 20 43 41 43 4b 45 59 5f 52 45 41 44 45 52 53 5f   CACKEY_READERS_
1fc20 45 58 43 4c 55 44 45 5f 44 45 46 41 55 4c 54 0a  EXCLUDE_DEFAULT.
1fc30 09 63 61 63 6b 65 79 5f 72 65 61 64 65 72 73 5f  .cackey_readers_
1fc40 65 78 63 6c 75 64 65 20 3d 20 73 74 72 64 75 70  exclude = strdup
1fc50 28 43 41 43 4b 45 59 5f 4d 41 43 52 4f 5f 44 45  (CACKEY_MACRO_DE
1fc60 46 41 55 4c 54 5f 58 53 54 52 28 43 41 43 4b 45  FAULT_XSTR(CACKE
1fc70 59 5f 52 45 41 44 45 52 53 5f 45 58 43 4c 55 44  Y_READERS_EXCLUD
1fc80 45 5f 44 45 46 41 55 4c 54 29 29 3b 0a 23 65 6e  E_DEFAULT));.#en
1fc90 64 69 66 0a 0a 09 69 66 20 28 67 65 74 65 6e 76  dif...if (getenv
1fca0 28 22 43 41 43 4b 45 59 5f 52 45 41 44 45 52 53  ("CACKEY_READERS
1fcb0 5f 49 4e 43 4c 55 44 45 5f 4f 4e 4c 59 22 29 20  _INCLUDE_ONLY") 
1fcc0 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 63 61 63  != NULL) {...cac
1fcd0 6b 65 79 5f 72 65 61 64 65 72 73 5f 69 6e 63 6c  key_readers_incl
1fce0 75 64 65 5f 6f 6e 6c 79 20 3d 20 73 74 72 64 75  ude_only = strdu
1fcf0 70 28 67 65 74 65 6e 76 28 22 43 41 43 4b 45 59  p(getenv("CACKEY
1fd00 5f 52 45 41 44 45 52 53 5f 49 4e 43 4c 55 44 45  _READERS_INCLUDE
1fd10 5f 4f 4e 4c 59 22 29 29 3b 0a 0a 09 09 69 66 20  _ONLY"));....if 
1fd20 28 63 61 63 6b 65 79 5f 72 65 61 64 65 72 73 5f  (cackey_readers_
1fd30 69 6e 63 6c 75 64 65 5f 6f 6e 6c 79 5b 30 5d 20  include_only[0] 
1fd40 3d 3d 20 27 5c 30 27 29 20 7b 0a 09 09 09 66 72  == '\0') {....fr
1fd50 65 65 28 63 61 63 6b 65 79 5f 72 65 61 64 65 72  ee(cackey_reader
1fd60 73 5f 69 6e 63 6c 75 64 65 5f 6f 6e 6c 79 29 3b  s_include_only);
1fd70 0a 0a 09 09 09 63 61 63 6b 65 79 5f 72 65 61 64  .....cackey_read
1fd80 65 72 73 5f 69 6e 63 6c 75 64 65 5f 6f 6e 6c 79  ers_include_only
1fd90 20 3d 20 4e 55 4c 4c 3b 0a 09 09 7d 0a 09 7d 0a   = NULL;...}..}.
1fda0 0a 09 69 66 20 28 67 65 74 65 6e 76 28 22 43 41  ..if (getenv("CA
1fdb0 43 4b 45 59 5f 52 45 41 44 45 52 53 5f 45 58 43  CKEY_READERS_EXC
1fdc0 4c 55 44 45 22 29 20 21 3d 20 4e 55 4c 4c 29 20  LUDE") != NULL) 
1fdd0 7b 0a 09 09 63 61 63 6b 65 79 5f 72 65 61 64 65  {...cackey_reade
1fde0 72 73 5f 65 78 63 6c 75 64 65 20 3d 20 73 74 72  rs_exclude = str
1fdf0 64 75 70 28 67 65 74 65 6e 76 28 22 43 41 43 4b  dup(getenv("CACK
1fe00 45 59 5f 52 45 41 44 45 52 53 5f 45 58 43 4c 55  EY_READERS_EXCLU
1fe10 44 45 22 29 29 3b 0a 0a 09 09 69 66 20 28 63 61  DE"));....if (ca
1fe20 63 6b 65 79 5f 72 65 61 64 65 72 73 5f 65 78 63  ckey_readers_exc
1fe30 6c 75 64 65 5b 30 5d 20 3d 3d 20 27 5c 30 27 29  lude[0] == '\0')
1fe40 20 7b 0a 09 09 09 66 72 65 65 28 63 61 63 6b 65   {....free(cacke
1fe50 79 5f 72 65 61 64 65 72 73 5f 65 78 63 6c 75 64  y_readers_exclud
1fe60 65 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 72  e);.....cackey_r
1fe70 65 61 64 65 72 73 5f 65 78 63 6c 75 64 65 20 3d  eaders_exclude =
1fe80 20 4e 55 4c 4c 3b 0a 09 09 7d 0a 09 7d 0a 0a 09   NULL;...}..}...
1fe90 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1fea0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
1feb0 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52  KR_OK (%i)", CKR
1fec0 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  _OK);...return(C
1fed0 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  KR_OK);.}..CK_DE
1fee0 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
1fef0 5f 52 56 2c 20 43 5f 46 69 6e 61 6c 69 7a 65 29  _RV, C_Finalize)
1ff00 28 43 4b 5f 56 4f 49 44 5f 50 54 52 20 70 52 65  (CK_VOID_PTR pRe
1ff10 73 65 72 76 65 64 29 20 7b 0a 09 75 69 6e 74 33  served) {..uint3
1ff20 32 5f 74 20 69 64 78 3b 0a 0a 09 43 41 43 4b 45  2_t idx;...CACKE
1ff30 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1ff40 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
1ff50 28 70 52 65 73 65 72 76 65 64 20 21 3d 20 4e 55  (pReserved != NU
1ff60 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
1ff70 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1ff80 6f 72 2e 20 70 52 65 73 65 72 76 65 64 20 69 73  or. pReserved is
1ff90 20 6e 6f 74 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09   not NULL.");...
1ffa0 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55  .return(CKR_ARGU
1ffb0 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a  MENTS_BAD);..}..
1ffc0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
1ffd0 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
1ffe0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1fff0 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
20000 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
20010 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
20020 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
20030 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 66 6f 72  LIZED);..}...for
20040 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c   (idx = 0; idx <
20050 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
20060 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65  sessions) / size
20070 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
20080 6e 73 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29 20  ns[0])); idx++) 
20090 7b 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73  {...if (cackey_s
200a0 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 61 63 74  essions[idx].act
200b0 69 76 65 29 20 7b 0a 09 09 09 43 5f 43 6c 6f 73  ive) {....C_Clos
200c0 65 53 65 73 73 69 6f 6e 28 69 64 78 29 3b 0a 09  eSession(idx);..
200d0 09 7d 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73  .}..}...cackey_s
200e0 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e 65 63 74 5f  lots_disconnect_
200f0 61 6c 6c 28 31 29 3b 0a 0a 09 66 6f 72 20 28 69  all(1);...for (i
20100 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 28 73  dx = 0; idx < (s
20110 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f  izeof(cackey_slo
20120 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63  ts) / sizeof(cac
20130 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b 20  key_slots[0])); 
20140 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28 63  idx++) {...if (c
20150 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d  ackey_slots[idx]
20160 2e 69 6e 74 65 72 6e 61 6c 29 20 7b 0a 09 09 09  .internal) {....
20170 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 7d 0a 0a 09  continue;...}...
20180 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74  .if (cackey_slot
20190 73 5b 69 64 78 5d 2e 63 61 63 68 65 64 5f 63 65  s[idx].cached_ce
201a0 72 74 73 29 20 7b 0a 09 09 09 63 61 63 6b 65 79  rts) {....cackey
201b0 5f 66 72 65 65 5f 63 65 72 74 73 28 63 61 63 6b  _free_certs(cack
201c0 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 63 61  ey_slots[idx].ca
201d0 63 68 65 64 5f 63 65 72 74 73 2c 20 63 61 63 6b  ched_certs, cack
201e0 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 63 61  ey_slots[idx].ca
201f0 63 68 65 64 5f 63 65 72 74 73 5f 63 6f 75 6e 74  ched_certs_count
20200 2c 20 31 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79  , 1);.....cackey
20210 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 63 61 63 68  _slots[idx].cach
20220 65 64 5f 63 65 72 74 73 20 3d 20 4e 55 4c 4c 3b  ed_certs = NULL;
20230 0a 09 09 7d 0a 09 7d 0a 0a 09 63 61 63 6b 65 79  ...}..}...cackey
20240 5f 70 63 73 63 5f 64 69 73 63 6f 6e 6e 65 63 74  _pcsc_disconnect
20250 28 29 3b 0a 0a 09 69 66 20 28 63 61 63 6b 65 79  ();...if (cackey
20260 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20 21 3d 20  _pin_command != 
20270 4e 55 4c 4c 29 20 7b 0a 09 09 66 72 65 65 28 63  NULL) {...free(c
20280 61 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e  ackey_pin_comman
20290 64 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 70 69  d);....cackey_pi
202a0 6e 5f 63 6f 6d 6d 61 6e 64 20 3d 20 4e 55 4c 4c  n_command = NULL
202b0 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65  ;..}...if (cacke
202c0 79 5f 72 65 61 64 65 72 73 5f 69 6e 63 6c 75 64  y_readers_includ
202d0 65 5f 6f 6e 6c 79 20 21 3d 20 4e 55 4c 4c 29 20  e_only != NULL) 
202e0 7b 0a 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f  {...free(cackey_
202f0 72 65 61 64 65 72 73 5f 69 6e 63 6c 75 64 65 5f  readers_include_
20300 6f 6e 6c 79 29 3b 0a 0a 09 09 63 61 63 6b 65 79  only);....cackey
20310 5f 72 65 61 64 65 72 73 5f 69 6e 63 6c 75 64 65  _readers_include
20320 5f 6f 6e 6c 79 20 3d 20 4e 55 4c 4c 3b 0a 09 7d  _only = NULL;..}
20330 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 72 65  ...if (cackey_re
20340 61 64 65 72 73 5f 65 78 63 6c 75 64 65 20 21 3d  aders_exclude !=
20350 20 4e 55 4c 4c 29 20 7b 0a 09 09 66 72 65 65 28   NULL) {...free(
20360 63 61 63 6b 65 79 5f 72 65 61 64 65 72 73 5f 65  cackey_readers_e
20370 78 63 6c 75 64 65 29 3b 0a 0a 09 09 63 61 63 6b  xclude);....cack
20380 65 79 5f 72 65 61 64 65 72 73 5f 65 78 63 6c 75  ey_readers_exclu
20390 64 65 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 0a 09  de = NULL;..}...
203a0 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
203b0 65 64 20 3d 20 30 3b 0a 0a 09 43 41 43 4b 45 59  ed = 0;...CACKEY
203c0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
203d0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20  eturning CKR_OK 
203e0 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a  (%i)", CKR_OK);.
203f0 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29  ..return(CKR_OK)
20400 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
20410 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
20420 5f 47 65 74 49 6e 66 6f 29 28 43 4b 5f 49 4e 46  _GetInfo)(CK_INF
20430 4f 5f 50 54 52 20 70 49 6e 66 6f 29 20 7b 0a 09  O_PTR pInfo) {..
20440 73 74 61 74 69 63 20 43 4b 5f 55 54 46 38 43 48  static CK_UTF8CH
20450 41 52 20 6d 61 6e 75 66 61 63 74 75 72 65 72 49  AR manufacturerI
20460 44 5b 5d 20 3d 20 22 55 2e 53 2e 20 47 6f 76 65  D[] = "U.S. Gove
20470 72 6e 6d 65 6e 74 22 3b 0a 09 73 74 61 74 69 63  rnment";..static
20480 20 43 4b 5f 55 54 46 38 43 48 41 52 20 6c 69 62   CK_UTF8CHAR lib
20490 72 61 72 79 44 65 73 63 72 69 70 74 69 6f 6e 5b  raryDescription[
204a0 5d 20 3d 20 22 43 41 43 4b 65 79 22 3b 0a 0a 09  ] = "CACKey";...
204b0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
204c0 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
204d0 0a 09 69 66 20 28 70 49 6e 66 6f 20 3d 3d 20 4e  ..if (pInfo == N
204e0 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
204f0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
20500 72 6f 72 2e 20 70 49 6e 66 6f 20 69 73 20 4e 55  ror. pInfo is NU
20510 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  LL.");....return
20520 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42  (CKR_ARGUMENTS_B
20530 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63  AD);..}...if (!c
20540 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
20550 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
20560 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
20570 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
20580 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
20590 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
205a0 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
205b0 0a 09 7d 0a 0a 09 70 49 6e 66 6f 2d 3e 63 72 79  ..}...pInfo->cry
205c0 70 74 6f 6b 69 56 65 72 73 69 6f 6e 2e 6d 61 6a  ptokiVersion.maj
205d0 6f 72 20 3d 20 28 28 43 41 43 4b 45 59 5f 43 52  or = ((CACKEY_CR
205e0 59 50 54 4f 4b 49 5f 56 45 52 53 49 4f 4e 5f 43  YPTOKI_VERSION_C
205f0 4f 44 45 29 20 3e 3e 20 31 36 29 20 26 20 30 78  ODE) >> 16) & 0x
20600 66 66 3b 0a 09 70 49 6e 66 6f 2d 3e 63 72 79 70  ff;..pInfo->cryp
20610 74 6f 6b 69 56 65 72 73 69 6f 6e 2e 6d 69 6e 6f  tokiVersion.mino
20620 72 20 3d 20 28 28 43 41 43 4b 45 59 5f 43 52 59  r = ((CACKEY_CRY
20630 50 54 4f 4b 49 5f 56 45 52 53 49 4f 4e 5f 43 4f  PTOKI_VERSION_CO
20640 44 45 29 20 3e 3e 20 38 29 20 26 20 30 78 66 66  DE) >> 8) & 0xff
20650 3b 0a 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f  ;...memset(pInfo
20660 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44  ->manufacturerID
20670 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 28 70 49  , ' ', sizeof(pI
20680 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65  nfo->manufacture
20690 72 49 44 29 29 3b 0a 09 6d 65 6d 63 70 79 28 70  rID));..memcpy(p
206a0 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72  Info->manufactur
206b0 65 72 49 44 2c 20 6d 61 6e 75 66 61 63 74 75 72  erID, manufactur
206c0 65 72 49 44 2c 20 73 69 7a 65 6f 66 28 6d 61 6e  erID, sizeof(man
206d0 75 66 61 63 74 75 72 65 72 49 44 29 20 2d 20 31  ufacturerID) - 1
206e0 29 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 66 6c 61 67  );...pInfo->flag
206f0 73 20 3d 20 30 78 30 30 3b 0a 0a 09 6d 65 6d 73  s = 0x00;...mems
20700 65 74 28 70 49 6e 66 6f 2d 3e 6c 69 62 72 61 72  et(pInfo->librar
20710 79 44 65 73 63 72 69 70 74 69 6f 6e 2c 20 27 20  yDescription, ' 
20720 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d  ', sizeof(pInfo-
20730 3e 6c 69 62 72 61 72 79 44 65 73 63 72 69 70 74  >libraryDescript
20740 69 6f 6e 29 29 3b 0a 09 6d 65 6d 63 70 79 28 70  ion));..memcpy(p
20750 49 6e 66 6f 2d 3e 6c 69 62 72 61 72 79 44 65 73  Info->libraryDes
20760 63 72 69 70 74 69 6f 6e 2c 20 6c 69 62 72 61 72  cription, librar
20770 79 44 65 73 63 72 69 70 74 69 6f 6e 2c 20 73 69  yDescription, si
20780 7a 65 6f 66 28 6c 69 62 72 61 72 79 44 65 73 63  zeof(libraryDesc
20790 72 69 70 74 69 6f 6e 29 20 2d 20 31 29 3b 0a 0a  ription) - 1);..
207a0 09 70 49 6e 66 6f 2d 3e 6c 69 62 72 61 72 79 56  .pInfo->libraryV
207b0 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 28  ersion.major = (
207c0 63 61 63 6b 65 79 5f 67 65 74 76 65 72 73 69 6f  cackey_getversio
207d0 6e 28 29 20 3e 3e 20 31 36 29 20 26 20 30 78 66  n() >> 16) & 0xf
207e0 66 3b 0a 09 70 49 6e 66 6f 2d 3e 6c 69 62 72 61  f;..pInfo->libra
207f0 72 79 56 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20  ryVersion.minor 
20800 3d 20 28 63 61 63 6b 65 79 5f 67 65 74 76 65 72  = (cackey_getver
20810 73 69 6f 6e 28 29 20 3e 3e 20 38 29 20 26 20 30  sion() >> 8) & 0
20820 78 66 66 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  xff;...CACKEY_DE
20830 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
20840 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69  rning CKR_OK (%i
20850 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72  )", CKR_OK);...r
20860 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d  eturn(CKR_OK);.}
20870 0a 0a 2f 2a 0a 20 2a 20 50 72 6f 63 65 73 73 20  ../*. * Process 
20880 6c 69 73 74 20 6f 66 20 72 65 61 64 65 72 73 2c  list of readers,
20890 20 61 6e 64 20 63 72 65 61 74 65 20 6d 61 70 70   and create mapp
208a0 69 6e 67 20 62 65 74 77 65 65 6e 20 72 65 61 64  ing between read
208b0 65 72 20 6e 61 6d 65 20 61 6e 64 20 73 6c 6f 74  er name and slot
208c0 20 49 44 0a 20 2a 2f 0a 43 4b 5f 44 45 46 49 4e   ID. */.CK_DEFIN
208d0 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
208e0 2c 20 43 5f 47 65 74 53 6c 6f 74 4c 69 73 74 29  , C_GetSlotList)
208f0 28 43 4b 5f 42 42 4f 4f 4c 20 74 6f 6b 65 6e 50  (CK_BBOOL tokenP
20900 72 65 73 65 6e 74 2c 20 43 4b 5f 53 4c 4f 54 5f  resent, CK_SLOT_
20910 49 44 5f 50 54 52 20 70 53 6c 6f 74 4c 69 73 74  ID_PTR pSlotList
20920 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70  , CK_ULONG_PTR p
20930 75 6c 43 6f 75 6e 74 29 20 7b 0a 09 73 74 61 74  ulCount) {..stat
20940 69 63 20 69 6e 74 20 66 69 72 73 74 5f 63 61 6c  ic int first_cal
20950 6c 20 3d 20 31 3b 0a 09 69 6e 74 20 6d 75 74 65  l = 1;..int mute
20960 78 5f 72 65 74 76 61 6c 3b 0a 09 69 6e 74 20 70  x_retval;..int p
20970 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 3b  csc_connect_ret;
20980 0a 09 43 4b 5f 55 4c 4f 4e 47 20 63 6f 75 6e 74  ..CK_ULONG count
20990 2c 20 73 6c 6f 74 5f 63 6f 75 6e 74 20 3d 20 30  , slot_count = 0
209a0 2c 20 63 75 72 72 73 6c 6f 74 2c 20 73 6c 6f 74  , currslot, slot
209b0 5f 69 64 78 3b 0a 09 63 68 61 72 20 2a 70 63 73  _idx;..char *pcs
209c0 63 5f 72 65 61 64 65 72 73 2c 20 2a 70 63 73 63  c_readers, *pcsc
209d0 5f 72 65 61 64 65 72 73 5f 73 2c 20 2a 70 63 73  _readers_s, *pcs
209e0 63 5f 72 65 61 64 65 72 73 5f 65 3b 0a 09 63 68  c_readers_e;..ch
209f0 61 72 20 2a 72 65 61 64 65 72 5f 63 68 65 63 6b  ar *reader_check
20a00 5f 70 61 74 74 65 72 6e 3b 0a 09 44 57 4f 52 44  _pattern;..DWORD
20a10 20 70 63 73 63 5f 72 65 61 64 65 72 73 5f 6c 65   pcsc_readers_le
20a20 6e 3b 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f 6c  n;..LONG scard_l
20a30 69 73 74 72 65 61 64 65 72 73 5f 72 65 74 3b 0a  istreaders_ret;.
20a40 09 73 69 7a 65 5f 74 20 63 75 72 72 5f 72 65 61  .size_t curr_rea
20a50 64 65 72 5f 6c 65 6e 3b 0a 09 69 6e 74 20 73 6c  der_len;..int sl
20a60 6f 74 5f 72 65 73 65 74 3b 0a 09 69 6e 74 20 69  ot_reset;..int i
20a70 6e 63 6c 75 64 65 5f 72 65 61 64 65 72 3b 0a 0a  nclude_reader;..
20a80 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
20a90 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
20aa0 0a 0a 09 69 66 20 28 70 75 6c 43 6f 75 6e 74 20  ...if (pulCount 
20ab0 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43  == NULL) {...CAC
20ac0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
20ad0 28 22 45 72 72 6f 72 2e 20 70 75 6c 43 6f 75 6e  ("Error. pulCoun
20ae0 74 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09  t is NULL.");...
20af0 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55  .return(CKR_ARGU
20b00 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a  MENTS_BAD);..}..
20b10 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
20b20 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
20b30 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
20b40 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
20b50 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
20b60 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
20b70 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
20b80 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74  LIZED);..}...mut
20b90 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
20ba0 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61  ey_mutex_lock(ca
20bb0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
20bc0 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
20bd0 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
20be0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
20bf0 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20  Error.  Locking 
20c00 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
20c10 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
20c20 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 2f 2a  _ERROR);..}.../*
20c30 20 43 6c 65 61 72 20 6c 69 73 74 20 6f 66 20 73   Clear list of s
20c40 6c 6f 74 73 20 2a 2f 0a 09 73 6c 6f 74 5f 72 65  lots */..slot_re
20c50 73 65 74 20 3d 20 30 3b 0a 09 69 66 20 28 70 53  set = 0;..if (pS
20c60 6c 6f 74 4c 69 73 74 29 20 7b 0a 09 09 69 66 20  lotList) {...if 
20c70 28 66 69 72 73 74 5f 63 61 6c 6c 29 20 7b 0a 09  (first_call) {..
20c80 09 09 66 69 72 73 74 5f 63 61 6c 6c 20 3d 20 30  ..first_call = 0
20c90 3b 0a 0a 09 09 09 73 6c 6f 74 5f 72 65 73 65 74  ;.....slot_reset
20ca0 20 3d 20 31 3b 0a 09 09 7d 0a 0a 09 09 2f 2a 20   = 1;...}..../* 
20cb0 49 66 20 61 6e 79 20 6f 66 20 74 68 65 20 73 6c  If any of the sl
20cc0 6f 74 73 20 68 61 76 65 20 62 65 65 6e 20 72 65  ots have been re
20cd0 73 65 74 20 74 68 65 6e 20 70 75 72 67 65 20 61  set then purge a
20ce0 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  ll information a
20cf0 6e 64 20 63 68 65 63 6b 20 61 67 61 69 6e 20 2a  nd check again *
20d00 2f 0a 09 09 66 6f 72 20 28 63 75 72 72 73 6c 6f  /...for (currslo
20d10 74 20 3d 20 30 3b 20 63 75 72 72 73 6c 6f 74 20  t = 0; currslot 
20d20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  < (sizeof(cackey
20d30 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66  _slots) / sizeof
20d40 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d  (cackey_slots[0]
20d50 29 29 3b 20 63 75 72 72 73 6c 6f 74 2b 2b 29 20  )); currslot++) 
20d60 7b 0a 09 09 09 69 66 20 28 63 61 63 6b 65 79 5f  {....if (cackey_
20d70 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e  slots[currslot].
20d80 69 6e 74 65 72 6e 61 6c 29 20 7b 0a 09 09 09 09  internal) {.....
20d90 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a  continue;....}..
20da0 09 09 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73  ...if (!cackey_s
20db0 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 61  lots[currslot].a
20dc0 63 74 69 76 65 29 20 7b 0a 09 09 09 09 63 6f 6e  ctive) {.....con
20dd0 74 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a 09 09 09  tinue;....}.....
20de0 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  if (cackey_slots
20df0 5b 63 75 72 72 73 6c 6f 74 5d 2e 73 6c 6f 74 5f  [currslot].slot_
20e00 72 65 73 65 74 29 20 7b 0a 09 09 09 09 73 6c 6f  reset) {.....slo
20e10 74 5f 72 65 73 65 74 20 3d 20 31 3b 0a 0a 09 09  t_reset = 1;....
20e20 09 09 62 72 65 61 6b 3b 0a 09 09 09 7d 0a 09 09  ..break;....}...
20e30 7d 0a 0a 09 09 69 66 20 28 73 6c 6f 74 5f 72 65  }....if (slot_re
20e40 73 65 74 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  set) {....CACKEY
20e50 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 50  _DEBUG_PRINTF("P
20e60 75 72 67 69 6e 67 20 61 6c 6c 20 73 6c 6f 74 20  urging all slot 
20e70 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 22 29 3b 0a  information.");.
20e80 0a 09 09 09 2f 2a 20 4f 6e 6c 79 20 75 70 64 61  ..../* Only upda
20e90 74 65 20 74 68 65 20 6c 69 73 74 20 6f 66 20 73  te the list of s
20ea0 6c 6f 74 73 20 69 66 20 77 65 20 61 72 65 20 61  lots if we are a
20eb0 63 74 75 61 6c 6c 79 20 62 65 69 6e 67 20 73 75  ctually being su
20ec0 70 70 6c 79 20 74 68 65 20 73 6c 6f 74 20 69 6e  pply the slot in
20ed0 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 09 09 09  formation */....
20ee0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5f 64 69 73  cackey_slots_dis
20ef0 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28 31 29 3b 0a  connect_all(1);.
20f00 0a 09 09 09 66 6f 72 20 28 63 75 72 72 73 6c 6f  ....for (currslo
20f10 74 20 3d 20 30 3b 20 63 75 72 72 73 6c 6f 74 20  t = 0; currslot 
20f20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  < (sizeof(cackey
20f30 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66  _slots) / sizeof
20f40 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d  (cackey_slots[0]
20f50 29 29 3b 20 63 75 72 72 73 6c 6f 74 2b 2b 29 20  )); currslot++) 
20f60 7b 0a 09 09 09 09 69 66 20 28 63 61 63 6b 65 79  {.....if (cackey
20f70 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d  _slots[currslot]
20f80 2e 69 6e 74 65 72 6e 61 6c 29 20 7b 0a 09 09 09  .internal) {....
20f90 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 09  ..continue;.....
20fa0 7d 0a 0a 09 09 09 09 63 61 63 6b 65 79 5f 73 6c  }......cackey_sl
20fb0 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 61 63  ots[currslot].ac
20fc0 74 69 76 65 20 3d 20 30 3b 0a 09 09 09 7d 0a 09  tive = 0;....}..
20fd0 09 7d 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74 65 72  .}..}.../* Deter
20fe0 6d 69 6e 65 20 6c 69 73 74 20 6f 66 20 72 65 61  mine list of rea
20ff0 64 65 72 73 20 2a 2f 0a 09 70 63 73 63 5f 63 6f  ders */..pcsc_co
21000 6e 6e 65 63 74 5f 72 65 74 20 3d 20 63 61 63 6b  nnect_ret = cack
21010 65 79 5f 70 63 73 63 5f 63 6f 6e 6e 65 63 74 28  ey_pcsc_connect(
21020 29 3b 0a 09 69 66 20 28 70 63 73 63 5f 63 6f 6e  );..if (pcsc_con
21030 6e 65 63 74 5f 72 65 74 20 21 3d 20 43 41 43 4b  nect_ret != CACK
21040 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a  EY_PCSC_S_OK) {.
21050 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
21060 52 49 4e 54 46 28 22 43 6f 6e 6e 65 63 74 69 6f  RINTF("Connectio
21070 6e 20 74 6f 20 50 43 2f 53 43 20 66 61 69 6c 65  n to PC/SC faile
21080 64 2c 20 61 73 73 75 6d 69 6e 67 20 6e 6f 20 68  d, assuming no h
21090 61 72 64 77 61 72 65 20 73 6c 6f 74 73 22 29 3b  ardware slots");
210a0 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 70 63 73  ..} else {...pcs
210b0 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e 20 3d 20  c_readers_len = 
210c0 30 3b 0a 0a 09 09 73 63 61 72 64 5f 6c 69 73 74  0;....scard_list
210d0 72 65 61 64 65 72 73 5f 72 65 74 20 3d 20 53 43  readers_ret = SC
210e0 61 72 64 4c 69 73 74 52 65 61 64 65 72 73 28 2a  ardListReaders(*
210f0 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64  cackey_pcsc_hand
21100 6c 65 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20  le, NULL, NULL, 
21110 26 70 63 73 63 5f 72 65 61 64 65 72 73 5f 6c 65  &pcsc_readers_le
21120 6e 29 3b 0a 0a 09 09 69 66 20 28 73 63 61 72 64  n);....if (scard
21130 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65 74  _listreaders_ret
21140 20 3d 3d 20 53 43 41 52 44 5f 46 5f 43 4f 4d 4d   == SCARD_F_COMM
21150 5f 45 52 52 4f 52 29 20 7b 0a 09 09 09 43 41 43  _ERROR) {....CAC
21160 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
21170 28 22 45 72 72 6f 72 2e 20 53 43 61 72 64 4c 69  ("Error. SCardLi
21180 73 74 52 65 61 64 65 72 73 28 29 20 72 65 74 75  stReaders() retu
21190 72 6e 65 64 20 53 43 41 52 44 5f 46 5f 43 4f 4d  rned SCARD_F_COM
211a0 4d 5f 45 52 52 4f 52 2c 20 61 73 73 75 6d 69 6e  M_ERROR, assumin
211b0 67 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  g Connection to 
211c0 50 43 2f 53 43 20 77 65 6e 74 20 61 77 61 79 2e  PC/SC went away.
211d0 20 52 65 63 6f 6e 6e 65 63 74 69 6e 67 2e 22 29   Reconnecting.")
211e0 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 70 63 73  ;.....cackey_pcs
211f0 63 5f 64 69 73 63 6f 6e 6e 65 63 74 28 29 3b 0a  c_disconnect();.
21200 09 09 09 63 61 63 6b 65 79 5f 70 63 73 63 5f 63  ...cackey_pcsc_c
21210 6f 6e 6e 65 63 74 28 29 3b 0a 0a 09 09 09 43 41  onnect();.....CA
21220 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
21230 46 28 22 54 72 79 69 6e 67 20 53 43 61 72 64 4c  F("Trying SCardL
21240 69 73 74 52 65 61 64 65 72 73 28 29 20 61 67 61  istReaders() aga
21250 69 6e 22 29 3b 0a 09 09 09 73 63 61 72 64 5f 6c  in");....scard_l
21260 69 73 74 72 65 61 64 65 72 73 5f 72 65 74 20 3d  istreaders_ret =
21270 20 53 43 61 72 64 4c 69 73 74 52 65 61 64 65 72   SCardListReader
21280 73 28 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f 68  s(*cackey_pcsc_h
21290 61 6e 64 6c 65 2c 20 4e 55 4c 4c 2c 20 4e 55 4c  andle, NULL, NUL
212a0 4c 2c 20 26 70 63 73 63 5f 72 65 61 64 65 72 73  L, &pcsc_readers
212b0 5f 6c 65 6e 29 3b 0a 09 09 7d 0a 0a 09 09 69 66  _len);...}....if
212c0 20 28 73 63 61 72 64 5f 6c 69 73 74 72 65 61 64   (scard_listread
212d0 65 72 73 5f 72 65 74 20 3d 3d 20 53 43 41 52 44  ers_ret == SCARD
212e0 5f 45 5f 49 4e 53 55 46 46 49 43 49 45 4e 54 5f  _E_INSUFFICIENT_
212f0 42 55 46 46 45 52 29 20 7b 0a 09 09 09 43 41 43  BUFFER) {....CAC
21300 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
21310 28 22 45 72 72 6f 72 2e 20 53 43 61 72 64 4c 69  ("Error. SCardLi
21320 73 74 52 65 61 64 65 72 73 28 29 20 72 65 74 75  stReaders() retu
21330 72 6e 65 64 20 53 43 41 52 44 5f 45 5f 49 4e 53  rned SCARD_E_INS
21340 55 46 46 49 43 49 45 4e 54 5f 42 55 46 46 45 52  UFFICIENT_BUFFER
21350 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 69 73 20  , assuming this 
21360 69 73 20 61 20 62 75 67 20 28 65 2e 67 2e 2c 20  is a bug (e.g., 
21370 47 6f 6f 67 6c 65 20 50 43 53 43 29 20 61 6e 64  Google PCSC) and
21380 20 61 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6d 61   allocating a ma
21390 73 73 69 76 65 20 61 6d 6f 75 6e 74 20 6f 66 20  ssive amount of 
213a0 73 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68  space to hold th
213b0 65 20 72 65 61 64 65 72 20 6c 69 73 74 2e 22 29  e reader list.")
213c0 3b 0a 0a 09 09 09 70 63 73 63 5f 72 65 61 64 65  ;.....pcsc_reade
213d0 72 73 5f 6c 65 6e 20 3d 20 33 32 37 36 38 3b 0a  rs_len = 32768;.
213e0 09 09 09 73 63 61 72 64 5f 6c 69 73 74 72 65 61  ...scard_listrea
213f0 64 65 72 73 5f 72 65 74 20 3d 20 53 43 41 52 44  ders_ret = SCARD
21400 5f 53 5f 53 55 43 43 45 53 53 3b 0a 09 09 7d 0a  _S_SUCCESS;...}.
21410 0a 09 09 69 66 20 28 73 63 61 72 64 5f 6c 69 73  ...if (scard_lis
21420 74 72 65 61 64 65 72 73 5f 72 65 74 20 3d 3d 20  treaders_ret == 
21430 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 20  SCARD_S_SUCCESS 
21440 26 26 20 70 63 73 63 5f 72 65 61 64 65 72 73 5f  && pcsc_readers_
21450 6c 65 6e 20 21 3d 20 30 29 20 7b 0a 09 09 09 70  len != 0) {....p
21460 63 73 63 5f 72 65 61 64 65 72 73 20 3d 20 6d 61  csc_readers = ma
21470 6c 6c 6f 63 28 70 63 73 63 5f 72 65 61 64 65 72  lloc(pcsc_reader
21480 73 5f 6c 65 6e 29 3b 0a 09 09 09 70 63 73 63 5f  s_len);....pcsc_
21490 72 65 61 64 65 72 73 5f 73 20 3d 20 70 63 73 63  readers_s = pcsc
214a0 5f 72 65 61 64 65 72 73 3b 0a 0a 09 09 09 73 63  _readers;.....sc
214b0 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f  ard_listreaders_
214c0 72 65 74 20 3d 20 53 43 61 72 64 4c 69 73 74 52  ret = SCardListR
214d0 65 61 64 65 72 73 28 2a 63 61 63 6b 65 79 5f 70  eaders(*cackey_p
214e0 63 73 63 5f 68 61 6e 64 6c 65 2c 20 4e 55 4c 4c  csc_handle, NULL
214f0 2c 20 70 63 73 63 5f 72 65 61 64 65 72 73 2c 20  , pcsc_readers, 
21500 26 70 63 73 63 5f 72 65 61 64 65 72 73 5f 6c 65  &pcsc_readers_le
21510 6e 29 3b 0a 09 09 09 69 66 20 28 73 63 61 72 64  n);....if (scard
21520 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65 74  _listreaders_ret
21530 20 3d 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43   == SCARD_S_SUCC
21540 45 53 53 29 20 7b 0a 09 09 09 09 70 63 73 63 5f  ESS) {.....pcsc_
21550 72 65 61 64 65 72 73 5f 65 20 3d 20 70 63 73 63  readers_e = pcsc
21560 5f 72 65 61 64 65 72 73 20 2b 20 70 63 73 63 5f  _readers + pcsc_
21570 72 65 61 64 65 72 73 5f 6c 65 6e 3b 0a 0a 09 09  readers_len;....
21580 09 09 2f 2a 20 53 74 61 72 74 20 77 69 74 68 20  ../* Start with 
21590 53 6c 6f 74 20 49 44 20 31 2c 20 74 6f 20 61 76  Slot ID 1, to av
215a0 6f 69 64 20 61 20 62 75 67 20 69 6e 20 47 44 4d  oid a bug in GDM
215b0 20 6f 6e 20 52 48 45 4c 20 2a 2f 0a 09 09 09 09   on RHEL */.....
215c0 2f 2a 20 42 75 67 20 35 39 34 39 31 31 3a 20 68  /* Bug 594911: h
215d0 74 74 70 73 3a 2f 2f 62 75 67 7a 69 6c 6c 61 2e  ttps://bugzilla.
215e0 72 65 64 68 61 74 2e 63 6f 6d 2f 73 68 6f 77 5f  redhat.com/show_
215f0 62 75 67 2e 63 67 69 3f 69 64 3d 35 39 34 39 31  bug.cgi?id=59491
21600 31 20 2a 2f 0a 09 09 09 09 63 75 72 72 73 6c 6f  1 */.....currslo
21610 74 20 3d 20 31 3b 0a 09 09 09 09 77 68 69 6c 65  t = 1;.....while
21620 20 28 70 63 73 63 5f 72 65 61 64 65 72 73 20 3c   (pcsc_readers <
21630 20 70 63 73 63 5f 72 65 61 64 65 72 73 5f 65 29   pcsc_readers_e)
21640 20 7b 0a 09 09 09 09 09 2f 2a 20 46 69 6e 64 20   {....../* Find 
21650 6e 65 78 74 20 61 76 61 69 6c 61 62 6c 65 20 73  next available s
21660 6c 6f 74 20 2a 2f 0a 09 09 09 09 09 66 6f 72 20  lot */......for 
21670 28 3b 20 63 75 72 72 73 6c 6f 74 20 3c 20 28 73  (; currslot < (s
21680 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f  izeof(cackey_slo
21690 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63  ts) / sizeof(cac
216a0 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b 20  key_slots[0])); 
216b0 63 75 72 72 73 6c 6f 74 2b 2b 29 20 7b 0a 09 09  currslot++) {...
216c0 09 09 09 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ....if (!cackey_
216d0 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e  slots[currslot].
216e0 61 63 74 69 76 65 29 20 7b 0a 09 09 09 09 09 09  active) {.......
216f0 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 09 7d 0a  .break;.......}.
21700 09 09 09 09 09 7d 0a 0a 09 09 09 09 09 63 75 72  .....}.......cur
21710 72 5f 72 65 61 64 65 72 5f 6c 65 6e 20 3d 20 73  r_reader_len = s
21720 74 72 6c 65 6e 28 70 63 73 63 5f 72 65 61 64 65  trlen(pcsc_reade
21730 72 73 29 3b 0a 0a 09 09 09 09 09 69 66 20 28 28  rs);.......if ((
21740 70 63 73 63 5f 72 65 61 64 65 72 73 20 2b 20 63  pcsc_readers + c
21750 75 72 72 5f 72 65 61 64 65 72 5f 6c 65 6e 29 20  urr_reader_len) 
21760 3e 20 70 63 73 63 5f 72 65 61 64 65 72 73 5f 65  > pcsc_readers_e
21770 29 20 7b 0a 09 09 09 09 09 09 62 72 65 61 6b 3b  ) {.......break;
21780 0a 09 09 09 09 09 7d 0a 0a 09 09 09 09 09 69 66  ......}.......if
21790 20 28 63 75 72 72 5f 72 65 61 64 65 72 5f 6c 65   (curr_reader_le
217a0 6e 20 3d 3d 20 30 29 20 7b 0a 09 09 09 09 09 09  n == 0) {.......
217b0 62 72 65 61 6b 3b 0a 09 09 09 09 09 7d 0a 0a 09  break;......}...
217c0 09 09 09 09 69 66 20 28 63 75 72 72 73 6c 6f 74  ....if (currslot
217d0 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b   >= (sizeof(cack
217e0 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65  ey_slots) / size
217f0 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  of(cackey_slots[
21800 30 5d 29 29 29 20 7b 0a 09 09 09 09 09 09 43 41  0]))) {.......CA
21810 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
21820 46 28 22 46 6f 75 6e 64 20 6d 6f 72 65 20 72 65  F("Found more re
21830 61 64 65 72 73 20 74 68 61 6e 20 73 6c 6f 74 73  aders than slots
21840 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 21 22   are available!"
21850 29 3b 0a 0a 09 09 09 09 09 09 62 72 65 61 6b 3b  );........break;
21860 0a 09 09 09 09 09 7d 0a 0a 09 09 09 09 09 43 41  ......}.......CA
21870 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
21880 46 28 22 46 6f 75 6e 64 20 72 65 61 64 65 72 3a  F("Found reader:
21890 20 25 73 20 28 63 75 72 72 73 6c 6f 74 20 3d 20   %s (currslot = 
218a0 25 6c 75 29 22 2c 20 70 63 73 63 5f 72 65 61 64  %lu)", pcsc_read
218b0 65 72 73 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ers, (unsigned l
218c0 6f 6e 67 29 20 63 75 72 72 73 6c 6f 74 29 3b 0a  ong) currslot);.
218d0 0a 09 09 09 09 09 69 66 20 28 63 61 63 6b 65 79  ......if (cackey
218e0 5f 72 65 61 64 65 72 73 5f 69 6e 63 6c 75 64 65  _readers_include
218f0 5f 6f 6e 6c 79 20 21 3d 20 4e 55 4c 4c 29 20 7b  _only != NULL) {
21900 0a 09 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45  .......CACKEY_DE
21910 42 55 47 5f 50 52 49 4e 54 46 28 22 41 73 6b 65  BUG_PRINTF("Aske
21920 64 20 74 6f 20 69 6e 63 6c 75 64 65 20 6f 6e 6c  d to include onl
21930 79 20 72 65 61 64 65 72 73 20 6d 61 74 63 68 69  y readers matchi
21940 6e 67 3a 20 25 73 22 2c 20 63 61 63 6b 65 79 5f  ng: %s", cackey_
21950 72 65 61 64 65 72 73 5f 69 6e 63 6c 75 64 65 5f  readers_include_
21960 6f 6e 6c 79 29 3b 0a 0a 09 09 09 09 09 09 69 6e  only);........in
21970 63 6c 75 64 65 5f 72 65 61 64 65 72 20 3d 20 30  clude_reader = 0
21980 3b 0a 09 09 09 09 09 09 72 65 61 64 65 72 5f 63  ;.......reader_c
21990 68 65 63 6b 5f 70 61 74 74 65 72 6e 20 3d 20 63  heck_pattern = c
219a0 61 63 6b 65 79 5f 72 65 61 64 65 72 73 5f 69 6e  ackey_readers_in
219b0 63 6c 75 64 65 5f 6f 6e 6c 79 3b 0a 09 09 09 09  clude_only;.....
219c0 09 7d 20 65 6c 73 65 20 69 66 20 28 63 61 63 6b  .} else if (cack
219d0 65 79 5f 72 65 61 64 65 72 73 5f 65 78 63 6c 75  ey_readers_exclu
219e0 64 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  de != NULL) {...
219f0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
21a00 5f 50 52 49 4e 54 46 28 22 41 73 6b 65 64 20 74  _PRINTF("Asked t
21a10 6f 20 65 78 63 6c 75 64 65 20 72 65 61 64 65 72  o exclude reader
21a20 73 20 6d 61 74 63 68 69 6e 67 3a 20 25 73 22 2c  s matching: %s",
21a30 20 63 61 63 6b 65 79 5f 72 65 61 64 65 72 73 5f   cackey_readers_
21a40 65 78 63 6c 75 64 65 29 3b 0a 0a 09 09 09 09 09  exclude);.......
21a50 09 69 6e 63 6c 75 64 65 5f 72 65 61 64 65 72 20  .include_reader 
21a60 3d 20 31 3b 0a 09 09 09 09 09 09 72 65 61 64 65  = 1;.......reade
21a70 72 5f 63 68 65 63 6b 5f 70 61 74 74 65 72 6e 20  r_check_pattern 
21a80 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 65 72 73  = cackey_readers
21a90 5f 65 78 63 6c 75 64 65 3b 0a 09 09 09 09 09 7d  _exclude;......}
21aa0 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09 69 6e   else {.......in
21ab0 63 6c 75 64 65 5f 72 65 61 64 65 72 20 3d 20 31  clude_reader = 1
21ac0 3b 0a 09 09 09 09 09 09 72 65 61 64 65 72 5f 63  ;.......reader_c
21ad0 68 65 63 6b 5f 70 61 74 74 65 72 6e 20 3d 20 4e  heck_pattern = N
21ae0 55 4c 4c 3b 0a 09 09 09 09 09 7d 0a 0a 09 09 09  ULL;......}.....
21af0 09 09 69 66 20 28 72 65 61 64 65 72 5f 63 68 65  ..if (reader_che
21b00 63 6b 5f 70 61 74 74 65 72 6e 20 21 3d 20 4e 55  ck_pattern != NU
21b10 4c 4c 29 20 7b 0a 09 09 09 09 09 09 69 66 20 28  LL) {.......if (
21b20 73 74 72 73 74 72 28 70 63 73 63 5f 72 65 61 64  strstr(pcsc_read
21b30 65 72 73 2c 20 72 65 61 64 65 72 5f 63 68 65 63  ers, reader_chec
21b40 6b 5f 70 61 74 74 65 72 6e 29 20 21 3d 20 4e 55  k_pattern) != NU
21b50 4c 4c 29 20 7b 0a 09 09 09 09 09 09 09 43 41 43  LL) {........CAC
21b60 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
21b70 28 22 54 68 69 73 20 72 65 61 64 65 72 20 6d 61  ("This reader ma
21b80 74 63 68 65 64 20 74 68 65 20 70 61 74 74 65 72  tched the patter
21b90 6e 2e 22 29 3b 0a 09 09 09 09 09 09 0a 09 09 09  n.");...........
21ba0 09 09 09 09 69 6e 63 6c 75 64 65 5f 72 65 61 64  ....include_read
21bb0 65 72 20 3d 20 21 69 6e 63 6c 75 64 65 5f 72 65  er = !include_re
21bc0 61 64 65 72 3b 0a 09 09 09 09 09 09 7d 0a 09 09  ader;.......}...
21bd0 09 09 09 7d 0a 0a 09 09 09 09 09 69 66 20 28 69  ...}.......if (i
21be0 6e 63 6c 75 64 65 5f 72 65 61 64 65 72 20 21 3d  nclude_reader !=
21bf0 20 31 29 20 7b 0a 09 09 09 09 09 09 43 41 43 4b   1) {.......CACK
21c00 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
21c10 22 53 6b 69 70 70 69 6e 67 20 74 68 69 73 20 72  "Skipping this r
21c20 65 61 64 65 72 2e 22 29 3b 0a 0a 09 09 09 09 09  eader.");.......
21c30 09 70 63 73 63 5f 72 65 61 64 65 72 73 20 2b 3d  .pcsc_readers +=
21c40 20 63 75 72 72 5f 72 65 61 64 65 72 5f 6c 65 6e   curr_reader_len
21c50 20 2b 20 31 3b 0a 0a 09 09 09 09 09 09 63 6f 6e   + 1;........con
21c60 74 69 6e 75 65 3b 0a 09 09 09 09 09 7d 0a 0a 09  tinue;......}...
21c70 09 09 09 09 2f 2a 20 4f 6e 6c 79 20 75 70 64 61  ..../* Only upda
21c80 74 65 20 74 68 65 20 6c 69 73 74 20 6f 66 20 73  te the list of s
21c90 6c 6f 74 73 20 69 66 20 77 65 20 61 72 65 20 61  lots if we are a
21ca0 63 74 75 61 6c 6c 79 20 62 65 69 6e 67 20 61 73  ctually being as
21cb0 6b 65 64 20 73 75 70 70 6c 79 20 74 68 65 20 73  ked supply the s
21cc0 6c 6f 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  lot information 
21cd0 2a 2f 0a 09 09 09 09 09 69 66 20 28 70 53 6c 6f  */......if (pSlo
21ce0 74 4c 69 73 74 29 20 7b 0a 09 09 09 09 09 09 69  tList) {.......i
21cf0 66 20 28 73 6c 6f 74 5f 72 65 73 65 74 29 20 7b  f (slot_reset) {
21d00 0a 09 09 09 09 09 09 09 63 61 63 6b 65 79 5f 73  ........cackey_s
21d10 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 61  lots[currslot].a
21d20 63 74 69 76 65 20 3d 20 31 3b 0a 09 09 09 09 09  ctive = 1;......
21d30 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63  ..cackey_slots[c
21d40 75 72 72 73 6c 6f 74 5d 2e 69 6e 74 65 72 6e 61  urrslot].interna
21d50 6c 20 3d 20 30 3b 0a 09 09 09 09 09 09 09 63 61  l = 0;........ca
21d60 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73  ckey_slots[currs
21d70 6c 6f 74 5d 2e 70 63 73 63 5f 72 65 61 64 65 72  lot].pcsc_reader
21d80 20 3d 20 73 74 72 64 75 70 28 70 63 73 63 5f 72   = strdup(pcsc_r
21d90 65 61 64 65 72 73 29 3b 0a 09 09 09 09 09 09 09  eaders);........
21da0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72  cackey_slots[cur
21db0 72 73 6c 6f 74 5d 2e 70 63 73 63 5f 63 61 72 64  rslot].pcsc_card
21dc0 5f 63 6f 6e 6e 65 63 74 65 64 20 3d 20 30 3b 0a  _connected = 0;.
21dd0 09 09 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c  .......cackey_sl
21de0 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 74 72  ots[currslot].tr
21df0 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20  ansaction_depth 
21e00 3d 20 30 3b 0a 09 09 09 09 09 09 09 63 61 63 6b  = 0;........cack
21e10 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f  ey_slots[currslo
21e20 74 5d 2e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 6e  t].transaction_n
21e30 65 65 64 5f 68 77 5f 6c 6f 63 6b 20 3d 20 30 3b  eed_hw_lock = 0;
21e40 0a 09 09 09 09 09 09 09 69 66 20 28 63 61 63 6b  ........if (cack
21e50 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20 3d  ey_pin_command =
21e60 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 09 09  = NULL) {.......
21e70 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63  ..cackey_slots[c
21e80 75 72 72 73 6c 6f 74 5d 2e 74 6f 6b 65 6e 5f 66  urrslot].token_f
21e90 6c 61 67 73 20 3d 20 43 4b 46 5f 4c 4f 47 49 4e  lags = CKF_LOGIN
21ea0 5f 52 45 51 55 49 52 45 44 3b 0a 09 09 09 09 09  _REQUIRED;......
21eb0 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09  ..} else {......
21ec0 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ...cackey_slots[
21ed0 63 75 72 72 73 6c 6f 74 5d 2e 74 6f 6b 65 6e 5f  currslot].token_
21ee0 66 6c 61 67 73 20 3d 20 30 3b 0a 09 09 09 09 09  flags = 0;......
21ef0 09 09 7d 0a 09 09 09 09 09 09 09 63 61 63 6b 65  ..}........cacke
21f00 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74  y_slots[currslot
21f10 5d 2e 6c 61 62 65 6c 20 3d 20 4e 55 4c 4c 3b 0a  ].label = NULL;.
21f20 0a 09 09 09 09 09 09 09 63 61 63 6b 65 79 5f 6d  ........cackey_m
21f30 61 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74 28 26  ark_slot_reset(&
21f40 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72  cackey_slots[cur
21f50 72 73 6c 6f 74 5d 29 3b 0a 09 09 09 09 09 09 7d  rslot]);.......}
21f60 0a 09 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09  ......} else {..
21f70 09 09 09 09 09 69 66 20 28 21 63 61 63 6b 65 79  .....if (!cackey
21f80 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d  _slots[currslot]
21f90 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 09 09 09  .active) {......
21fa0 09 09 2f 2a 20 41 72 74 69 66 69 63 69 61 6c 6c  ../* Artificiall
21fb0 79 20 69 6e 63 72 65 61 73 65 20 74 68 65 20 6e  y increase the n
21fc0 75 6d 62 65 72 20 6f 66 20 61 63 74 69 76 65 20  umber of active 
21fd0 73 6c 6f 74 73 20 62 79 20 77 68 61 74 20 77 69  slots by what wi
21fe0 6c 6c 20 62 65 63 6f 6d 65 20 61 63 74 69 76 65  ll become active
21ff0 20 2a 2f 0a 09 09 09 09 09 09 09 43 41 43 4b 45   */........CACKE
22000 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
22010 46 6f 75 6e 64 20 69 6e 2d 61 63 74 69 76 65 20  Found in-active 
22020 73 6c 6f 74 20 25 6c 75 2c 20 62 75 74 20 69 74  slot %lu, but it
22030 20 77 69 6c 6c 20 62 65 20 61 63 74 69 76 65 20   will be active 
22040 61 66 74 65 72 20 61 20 72 65 73 65 74 20 2d 2d  after a reset --
22050 20 6d 61 72 6b 69 6e 67 20 61 73 20 61 63 74 69   marking as acti
22060 76 65 20 66 6f 72 20 61 63 63 6f 75 6e 74 69 6e  ve for accountin
22070 67 20 70 75 72 70 6f 73 65 73 22 2c 20 28 75 6e  g purposes", (un
22080 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72  signed long) cur
22090 72 73 6c 6f 74 29 3b 0a 0a 09 09 09 09 09 09 09  rslot);.........
220a0 73 6c 6f 74 5f 63 6f 75 6e 74 2b 2b 3b 0a 09 09  slot_count++;...
220b0 09 09 09 09 7d 0a 09 09 09 09 09 7d 0a 09 09 09  ....}......}....
220c0 09 09 63 75 72 72 73 6c 6f 74 2b 2b 3b 0a 0a 09  ..currslot++;...
220d0 09 09 09 09 70 63 73 63 5f 72 65 61 64 65 72 73  ....pcsc_readers
220e0 20 2b 3d 20 63 75 72 72 5f 72 65 61 64 65 72 5f   += curr_reader_
220f0 6c 65 6e 20 2b 20 31 3b 0a 09 09 09 09 7d 0a 09  len + 1;.....}..
22100 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 43  ..} else {.....C
22110 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
22120 54 46 28 22 53 65 63 6f 6e 64 20 63 61 6c 6c 20  TF("Second call 
22130 74 6f 20 53 43 61 72 64 4c 69 73 74 52 65 61 64  to SCardListRead
22140 65 72 73 20 66 61 69 6c 65 64 2c 20 72 65 74 75  ers failed, retu
22150 72 6e 20 25 73 2f 25 6c 69 22 2c 20 43 41 43 4b  rn %s/%li", CACK
22160 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43  EY_DEBUG_FUNC_SC
22170 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 63  ARDERR_TO_STR(sc
22180 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f  ard_listreaders_
22190 72 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61  ret), (long) sca
221a0 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72  rd_listreaders_r
221b0 65 74 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 66 72  et);....}.....fr
221c0 65 65 28 70 63 73 63 5f 72 65 61 64 65 72 73 5f  ee(pcsc_readers_
221d0 73 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09  s);...} else {..
221e0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
221f0 52 49 4e 54 46 28 22 46 69 72 73 74 20 63 61 6c  RINTF("First cal
22200 6c 20 74 6f 20 53 43 61 72 64 4c 69 73 74 52 65  l to SCardListRe
22210 61 64 65 72 73 20 66 61 69 6c 65 64 2c 20 72 65  aders failed, re
22220 74 75 72 6e 20 25 73 2f 25 6c 69 22 2c 20 43 41  turn %s/%li", CA
22230 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
22240 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28  SCARDERR_TO_STR(
22250 73 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72  scard_listreader
22260 73 5f 72 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73  s_ret), (long) s
22270 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73  card_listreaders
22280 5f 72 65 74 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09  _ret);...}..}...
22290 66 6f 72 20 28 63 75 72 72 73 6c 6f 74 20 3d 20  for (currslot = 
222a0 30 3b 20 63 75 72 72 73 6c 6f 74 20 3c 20 28 73  0; currslot < (s
222b0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f  izeof(cackey_slo
222c0 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63  ts) / sizeof(cac
222d0 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b 20  key_slots[0])); 
222e0 63 75 72 72 73 6c 6f 74 2b 2b 29 20 7b 0a 09 09  currslot++) {...
222f0 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  if (cackey_slots
22300 5b 63 75 72 72 73 6c 6f 74 5d 2e 61 63 74 69 76  [currslot].activ
22310 65 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  e) {....CACKEY_D
22320 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 6f 75  EBUG_PRINTF("Fou
22330 6e 64 20 61 63 74 69 76 65 20 73 6c 6f 74 20 25  nd active slot %
22340 6c 75 2c 20 72 65 61 64 65 72 20 3d 20 25 73 22  lu, reader = %s"
22350 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
22360 29 20 63 75 72 72 73 6c 6f 74 2c 20 63 61 63 6b  ) currslot, cack
22370 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f  ey_slots[currslo
22380 74 5d 2e 70 63 73 63 5f 72 65 61 64 65 72 29 3b  t].pcsc_reader);
22390 0a 0a 09 09 09 73 6c 6f 74 5f 63 6f 75 6e 74 2b  .....slot_count+
223a0 2b 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 6d 75 74 65  +;...}..}...mute
223b0 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
223c0 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
223d0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
223e0 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
223f0 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
22400 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
22410 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69  "Error.  Unlocki
22420 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
22430 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
22440 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
22450 09 69 66 20 28 70 53 6c 6f 74 4c 69 73 74 20 3d  .if (pSlotList =
22460 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 2a 70 75 6c  = NULL) {...*pul
22470 43 6f 75 6e 74 20 3d 20 73 6c 6f 74 5f 63 6f 75  Count = slot_cou
22480 6e 74 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  nt;....CACKEY_DE
22490 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
224a0 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69  rning CKR_OK (%i
224b0 29 2e 20 20 46 6f 75 6e 64 20 25 6c 75 20 72 65  ).  Found %lu re
224c0 61 64 65 72 73 2c 20 62 75 74 20 6e 6f 74 20 73  aders, but not s
224d0 74 6f 72 69 6e 67 20 49 44 73 20 28 70 53 6c 6f  toring IDs (pSlo
224e0 74 4c 69 73 74 20 3d 3d 20 4e 55 4c 4c 29 22 2c  tList == NULL)",
224f0 20 43 4b 52 5f 4f 4b 2c 20 28 75 6e 73 69 67 6e   CKR_OK, (unsign
22500 65 64 20 6c 6f 6e 67 29 20 73 6c 6f 74 5f 63 6f  ed long) slot_co
22510 75 6e 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  unt);....return(
22520 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 63 6f  CKR_OK);..}...co
22530 75 6e 74 20 3d 20 2a 70 75 6c 43 6f 75 6e 74 3b  unt = *pulCount;
22540 0a 09 69 66 20 28 63 6f 75 6e 74 20 3c 20 73 6c  ..if (count < sl
22550 6f 74 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 43 41  ot_count) {...CA
22560 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
22570 46 28 22 45 72 72 6f 72 2e 20 55 73 65 72 20 61  F("Error. User a
22580 6c 6c 6f 63 61 74 65 64 20 25 6c 75 20 65 6e 74  llocated %lu ent
22590 72 69 65 73 2c 20 62 75 74 20 77 65 20 68 61 76  ries, but we hav
225a0 65 20 25 6c 75 20 65 6e 74 72 69 65 73 2e 22 2c  e %lu entries.",
225b0 20 63 6f 75 6e 74 2c 20 73 6c 6f 74 5f 63 6f 75   count, slot_cou
225c0 6e 74 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  nt);....CACKEY_D
225d0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
225e0 75 72 6e 69 6e 67 20 43 4b 52 5f 42 55 46 46 45  urning CKR_BUFFE
225f0 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 22 29 3b 0a 0a  R_TOO_SMALL");..
22600 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 42 55 46  ..return(CKR_BUF
22610 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 3b 09  FER_TOO_SMALL);.
22620 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  ..}...mutex_retv
22630 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
22640 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  x_lock(cackey_bi
22650 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
22660 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
22670 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
22680 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
22690 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e   Locking failed.
226a0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
226b0 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
226c0 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 5f 69 64 78 20  ;..}...slot_idx 
226d0 3d 20 30 3b 0a 09 66 6f 72 20 28 63 75 72 72 73  = 0;..for (currs
226e0 6c 6f 74 20 3d 20 30 3b 20 28 63 75 72 72 73 6c  lot = 0; (currsl
226f0 6f 74 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63  ot < (sizeof(cac
22700 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a  key_slots) / siz
22710 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
22720 5b 30 5d 29 29 29 3b 20 63 75 72 72 73 6c 6f 74  [0]))); currslot
22730 2b 2b 29 20 7b 0a 09 09 69 66 20 28 21 63 61 63  ++) {...if (!cac
22740 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c  key_slots[currsl
22750 6f 74 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09  ot].active) {...
22760 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 7d 0a 0a  .continue;...}..
22770 09 09 69 66 20 28 73 6c 6f 74 5f 69 64 78 20 3e  ..if (slot_idx >
22780 3d 20 63 6f 75 6e 74 29 20 7b 0a 09 09 09 43 41  = count) {....CA
22790 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
227a0 46 28 22 45 72 72 6f 72 2e 20 55 73 65 72 20 61  F("Error. User a
227b0 6c 6c 6f 63 61 74 65 64 20 25 6c 75 20 65 6e 74  llocated %lu ent
227c0 72 69 65 73 2c 20 62 75 74 20 77 65 20 6a 75 73  ries, but we jus
227d0 74 20 74 72 69 65 64 20 74 6f 20 77 72 69 74 65  t tried to write
227e0 20 74 6f 20 74 68 65 20 25 6c 75 20 69 6e 64 65   to the %lu inde
227f0 78 20 2d 2d 20 69 67 6e 6f 72 69 6e 67 22 2c 20  x -- ignoring", 
22800 63 6f 75 6e 74 2c 20 73 6c 6f 74 5f 69 64 78 29  count, slot_idx)
22810 3b 0a 0a 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a  ;.....continue;.
22820 09 09 7d 0a 0a 09 09 70 53 6c 6f 74 4c 69 73 74  ..}....pSlotList
22830 5b 73 6c 6f 74 5f 69 64 78 5d 20 3d 20 63 75 72  [slot_idx] = cur
22840 72 73 6c 6f 74 3b 0a 09 09 73 6c 6f 74 5f 69 64  rslot;...slot_id
22850 78 2b 2b 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f  x++;..}...mutex_
22860 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
22870 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
22880 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
22890 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
228a0 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
228b0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
228c0 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67  rror.  Unlocking
228d0 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
228e0 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
228f0 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 2a  L_ERROR);..}...*
22900 70 75 6c 43 6f 75 6e 74 20 3d 20 73 6c 6f 74 5f  pulCount = slot_
22910 63 6f 75 6e 74 3b 0a 0a 09 43 41 43 4b 45 59 5f  count;...CACKEY_
22920 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
22930 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28  turning CKR_OK (
22940 25 69 29 2e 20 20 46 6f 75 6e 64 20 25 6c 75 20  %i).  Found %lu 
22950 72 65 61 64 65 72 73 2e 22 2c 20 43 4b 52 5f 4f  readers.", CKR_O
22960 4b 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  K, (unsigned lon
22970 67 29 20 73 6c 6f 74 5f 63 6f 75 6e 74 29 3b 0a  g) slot_count);.
22980 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29  ..return(CKR_OK)
22990 3b 0a 0a 09 74 6f 6b 65 6e 50 72 65 73 65 6e 74  ;...tokenPresent
229a0 20 3d 20 74 6f 6b 65 6e 50 72 65 73 65 6e 74 3b   = tokenPresent;
229b0 20 2f 2a 20 53 75 70 72 65 73 73 20 75 6e 75 73   /* Supress unus
229c0 65 64 20 76 61 72 69 61 62 6c 65 20 77 61 72 6e  ed variable warn
229d0 69 6e 67 20 2a 2f 0a 7d 0a 0a 43 4b 5f 44 45 46  ing */.}..CK_DEF
229e0 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
229f0 52 56 2c 20 43 5f 47 65 74 53 6c 6f 74 49 6e 66  RV, C_GetSlotInf
22a00 6f 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c  o)(CK_SLOT_ID sl
22a10 6f 74 49 44 2c 20 43 4b 5f 53 4c 4f 54 5f 49 4e  otID, CK_SLOT_IN
22a20 46 4f 5f 50 54 52 20 70 49 6e 66 6f 29 20 7b 0a  FO_PTR pInfo) {.
22a30 09 73 74 61 74 69 63 20 43 4b 5f 55 54 46 38 43  .static CK_UTF8C
22a40 48 41 52 20 73 6c 6f 74 44 65 73 63 72 69 70 74  HAR slotDescript
22a50 69 6f 6e 5b 5d 20 3d 20 22 43 41 43 4b 65 79 20  ion[] = "CACKey 
22a60 53 6c 6f 74 22 3b 0a 09 69 6e 74 20 6d 75 74 65  Slot";..int mute
22a70 78 5f 72 65 74 76 61 6c 3b 0a 09 69 6e 74 20 62  x_retval;..int b
22a80 79 74 65 73 5f 74 6f 5f 63 6f 70 79 3b 0a 0a 09  ytes_to_copy;...
22a90 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
22aa0 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
22ab0 0a 09 69 66 20 28 70 49 6e 66 6f 20 3d 3d 20 4e  ..if (pInfo == N
22ac0 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
22ad0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
22ae0 72 6f 72 2e 20 70 49 6e 66 6f 20 69 73 20 4e 55  ror. pInfo is NU
22af0 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  LL.");....return
22b00 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42  (CKR_ARGUMENTS_B
22b10 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63  AD);..}...if (!c
22b20 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
22b30 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
22b40 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
22b50 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
22b60 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
22b70 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
22b80 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
22b90 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44  ..}...if (slotID
22ba0 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e   < 0 || slotID >
22bb0 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  = (sizeof(cackey
22bc0 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66  _slots) / sizeof
22bd0 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d  (cackey_slots[0]
22be0 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ))) {...CACKEY_D
22bf0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
22c00 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74  or. Invalid slot
22c10 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29   requested (%lu)
22c20 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 76 61 6c  , outside of val
22c30 69 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49  id range", slotI
22c40 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  D);....return(CK
22c50 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49  R_SLOT_ID_INVALI
22c60 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  D);..}...mutex_r
22c70 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
22c80 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79  utex_lock(cackey
22c90 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
22ca0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
22cb0 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
22cc0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
22cd0 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c  r.  Locking fail
22ce0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
22cf0 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
22d00 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61  OR);..}...if (ca
22d10 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
22d20 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 29 20  D].active == 0) 
22d30 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
22d40 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
22d50 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71  Invalid slot req
22d60 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 73 6c  uested (%lu), sl
22d70 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79  ot not currently
22d80 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 49 44   active", slotID
22d90 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  );....cackey_mut
22da0 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
22db0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65  _biglock);....re
22dc0 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44  turn(CKR_SLOT_ID
22dd0 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
22de0 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20 3d 20 43  pInfo->flags = C
22df0 4b 46 5f 48 57 5f 53 4c 4f 54 3b 0a 0a 09 69 66  KF_HW_SLOT;...if
22e00 20 28 21 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b   (!cackey_slots[
22e10 73 6c 6f 74 49 44 5d 2e 69 6e 74 65 72 6e 61 6c  slotID].internal
22e20 29 20 7b 0a 09 09 70 49 6e 66 6f 2d 3e 66 6c 61  ) {...pInfo->fla
22e30 67 73 20 7c 3d 20 43 4b 46 5f 52 45 4d 4f 56 41  gs |= CKF_REMOVA
22e40 42 4c 45 5f 44 45 56 49 43 45 3b 0a 09 7d 0a 0a  BLE_DEVICE;..}..
22e50 09 69 66 20 28 63 61 63 6b 65 79 5f 74 6f 6b 65  .if (cackey_toke
22e60 6e 5f 70 72 65 73 65 6e 74 28 26 63 61 63 6b 65  n_present(&cacke
22e70 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 29  y_slots[slotID])
22e80 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f   == CACKEY_PCSC_
22e90 53 5f 54 4f 4b 45 4e 50 52 45 53 45 4e 54 29 20  S_TOKENPRESENT) 
22ea0 7b 0a 09 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73  {...pInfo->flags
22eb0 20 7c 3d 20 43 4b 46 5f 54 4f 4b 45 4e 5f 50 52   |= CKF_TOKEN_PR
22ec0 45 53 45 4e 54 3b 0a 09 7d 0a 0a 09 62 79 74 65  ESENT;..}...byte
22ed0 73 5f 74 6f 5f 63 6f 70 79 20 3d 20 73 74 72 6c  s_to_copy = strl
22ee0 65 6e 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  en(cackey_slots[
22ef0 73 6c 6f 74 49 44 5d 2e 70 63 73 63 5f 72 65 61  slotID].pcsc_rea
22f00 64 65 72 29 3b 0a 09 69 66 20 28 73 69 7a 65 6f  der);..if (sizeo
22f10 66 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63  f(pInfo->manufac
22f20 74 75 72 65 72 49 44 29 20 3c 20 62 79 74 65 73  turerID) < bytes
22f30 5f 74 6f 5f 63 6f 70 79 29 20 7b 0a 09 09 62 79  _to_copy) {...by
22f40 74 65 73 5f 74 6f 5f 63 6f 70 79 20 3d 20 73 69  tes_to_copy = si
22f50 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75  zeof(pInfo->manu
22f60 66 61 63 74 75 72 65 72 49 44 29 3b 0a 09 7d 0a  facturerID);..}.
22f70 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 6d  .memcpy(pInfo->m
22f80 61 6e 75 66 61 63 74 75 72 65 72 49 44 2c 20 63  anufacturerID, c
22f90 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
22fa0 49 44 5d 2e 70 63 73 63 5f 72 65 61 64 65 72 2c  ID].pcsc_reader,
22fb0 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 29 3b   bytes_to_copy);
22fc0 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
22fd0 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  = cackey_mutex_u
22fe0 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
22ff0 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
23000 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
23010 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
23020 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
23030 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64  Unlocking failed
23040 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
23050 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
23060 29 3b 0a 09 7d 0a 0a 09 6d 65 6d 73 65 74 28 70  );..}...memset(p
23070 49 6e 66 6f 2d 3e 73 6c 6f 74 44 65 73 63 72 69  Info->slotDescri
23080 70 74 69 6f 6e 2c 20 27 20 27 2c 20 73 69 7a 65  ption, ' ', size
23090 6f 66 28 70 49 6e 66 6f 2d 3e 73 6c 6f 74 44 65  of(pInfo->slotDe
230a0 73 63 72 69 70 74 69 6f 6e 29 29 3b 0a 09 6d 65  scription));..me
230b0 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 73 6c 6f 74  mcpy(pInfo->slot
230c0 44 65 73 63 72 69 70 74 69 6f 6e 2c 20 73 6c 6f  Description, slo
230d0 74 44 65 73 63 72 69 70 74 69 6f 6e 2c 20 73 69  tDescription, si
230e0 7a 65 6f 66 28 73 6c 6f 74 44 65 73 63 72 69 70  zeof(slotDescrip
230f0 74 69 6f 6e 29 20 2d 20 31 29 3b 0a 0a 09 6d 65  tion) - 1);...me
23100 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75  mset(pInfo->manu
23110 66 61 63 74 75 72 65 72 49 44 2c 20 27 20 27 2c  facturerID, ' ',
23120 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d   sizeof(pInfo->m
23130 61 6e 75 66 61 63 74 75 72 65 72 49 44 29 29 3b  anufacturerID));
23140 0a 0a 09 70 49 6e 66 6f 2d 3e 68 61 72 64 77 61  ...pInfo->hardwa
23150 72 65 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20  reVersion.major 
23160 3d 20 28 63 61 63 6b 65 79 5f 67 65 74 76 65 72  = (cackey_getver
23170 73 69 6f 6e 28 29 20 3e 3e 20 31 36 29 20 26 20  sion() >> 16) & 
23180 30 78 66 66 3b 0a 09 70 49 6e 66 6f 2d 3e 68 61  0xff;..pInfo->ha
23190 72 64 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d 69  rdwareVersion.mi
231a0 6e 6f 72 20 3d 20 28 63 61 63 6b 65 79 5f 67 65  nor = (cackey_ge
231b0 74 76 65 72 73 69 6f 6e 28 29 20 3e 3e 20 38 29  tversion() >> 8)
231c0 20 26 20 30 78 66 66 3b 0a 0a 09 70 49 6e 66 6f   & 0xff;...pInfo
231d0 2d 3e 66 69 72 6d 77 61 72 65 56 65 72 73 69 6f  ->firmwareVersio
231e0 6e 2e 6d 61 6a 6f 72 20 3d 20 30 78 30 30 3b 0a  n.major = 0x00;.
231f0 09 70 49 6e 66 6f 2d 3e 66 69 72 6d 77 61 72 65  .pInfo->firmware
23200 56 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20  Version.minor = 
23210 30 78 30 30 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  0x00;...CACKEY_D
23220 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
23230 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25  urning CKR_OK (%
23240 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09  i)", CKR_OK);...
23250 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a  return(CKR_OK);.
23260 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
23270 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47  CTION(CK_RV, C_G
23280 65 74 54 6f 6b 65 6e 49 6e 66 6f 29 28 43 4b 5f  etTokenInfo)(CK_
23290 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 2c 20  SLOT_ID slotID, 
232a0 43 4b 5f 54 4f 4b 45 4e 5f 49 4e 46 4f 5f 50 54  CK_TOKEN_INFO_PT
232b0 52 20 70 49 6e 66 6f 29 20 7b 0a 09 73 74 61 74  R pInfo) {..stat
232c0 69 63 20 43 4b 5f 55 54 46 38 43 48 41 52 20 6d  ic CK_UTF8CHAR m
232d0 61 6e 75 66 61 63 74 75 72 65 72 49 44 5b 5d 20  anufacturerID[] 
232e0 3d 20 22 55 2e 53 2e 20 47 6f 76 65 72 6e 6d 65  = "U.S. Governme
232f0 6e 74 22 3b 0a 09 73 74 61 74 69 63 20 43 4b 5f  nt";..static CK_
23300 55 54 46 38 43 48 41 52 20 64 65 66 61 75 6c 74  UTF8CHAR default
23310 4c 61 62 65 6c 5b 5d 20 3d 20 22 55 6e 6b 6e 6f  Label[] = "Unkno
23320 77 6e 20 54 6f 6b 65 6e 22 3b 0a 09 73 74 61 74  wn Token";..stat
23330 69 63 20 43 4b 5f 55 54 46 38 43 48 41 52 20 6d  ic CK_UTF8CHAR m
23340 6f 64 65 6c 5b 5d 20 3d 20 22 43 41 43 20 54 6f  odel[] = "CAC To
23350 6b 65 6e 22 3b 0a 09 73 74 72 75 63 74 20 63 61  ken";..struct ca
23360 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69  ckey_pcsc_identi
23370 74 79 20 2a 70 63 73 63 5f 69 64 65 6e 74 69 74  ty *pcsc_identit
23380 69 65 73 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c  ies;..unsigned l
23390 6f 6e 67 20 6e 75 6d 5f 63 65 72 74 73 3b 0a 09  ong num_certs;..
233a0 73 73 69 7a 65 5f 74 20 6c 61 62 65 6c 5f 72 65  ssize_t label_re
233b0 74 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65  t;..int mutex_re
233c0 74 76 61 6c 3b 0a 09 69 6e 74 20 75 73 65 5f 64  tval;..int use_d
233d0 65 66 61 75 6c 74 5f 6c 61 62 65 6c 3b 0a 0a 09  efault_label;...
233e0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
233f0 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
23400 0a 09 69 66 20 28 70 49 6e 66 6f 20 3d 3d 20 4e  ..if (pInfo == N
23410 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
23420 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
23430 72 6f 72 2e 20 70 49 6e 66 6f 20 69 73 20 4e 55  ror. pInfo is NU
23440 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  LL.");....return
23450 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42  (CKR_ARGUMENTS_B
23460 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63  AD);..}...if (!c
23470 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
23480 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
23490 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
234a0 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
234b0 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
234c0 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
234d0 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
234e0 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44  ..}...if (slotID
234f0 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e   < 0 || slotID >
23500 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  = (sizeof(cackey
23510 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66  _slots) / sizeof
23520 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d  (cackey_slots[0]
23530 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ))) {...CACKEY_D
23540 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
23550 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74  or. Invalid slot
23560 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29   requested (%lu)
23570 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 76 61 6c  , outside of val
23580 69 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49  id range", slotI
23590 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  D);....return(CK
235a0 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49  R_SLOT_ID_INVALI
235b0 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  D);..}...mutex_r
235c0 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
235d0 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79  utex_lock(cackey
235e0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
235f0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
23600 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
23610 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
23620 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c  r.  Locking fail
23630 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
23640 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
23650 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61  OR);..}...if (ca
23660 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
23670 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 29 20  D].active == 0) 
23680 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
23690 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
236a0 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71  Invalid slot req
236b0 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 73 6c  uested (%lu), sl
236c0 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79  ot not currently
236d0 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 49 44   active", slotID
236e0 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  );....cackey_mut
236f0 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
23700 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65  _biglock);....re
23710 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44  turn(CKR_SLOT_ID
23720 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
23730 69 66 20 28 63 61 63 6b 65 79 5f 74 6f 6b 65 6e  if (cackey_token
23740 5f 70 72 65 73 65 6e 74 28 26 63 61 63 6b 65 79  _present(&cackey
23750 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 29 20  _slots[slotID]) 
23760 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  != CACKEY_PCSC_S
23770 5f 54 4f 4b 45 4e 50 52 45 53 45 4e 54 29 20 7b  _TOKENPRESENT) {
23780 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
23790 50 52 49 4e 54 46 28 22 4e 6f 20 74 6f 6b 65 6e  PRINTF("No token
237a0 20 69 73 20 70 72 65 73 65 6e 74 20 69 6e 20 73   is present in s
237b0 6c 6f 74 49 44 20 3d 20 25 6c 75 22 2c 20 73 6c  lotID = %lu", sl
237c0 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79  otID);....cackey
237d0 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
237e0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
237f0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 54 4f 4b  ..return(CKR_TOK
23800 45 4e 5f 4e 4f 54 5f 50 52 45 53 45 4e 54 29 3b  EN_NOT_PRESENT);
23810 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74 65 72 6d 69  ..}.../* Determi
23820 6e 65 20 74 6f 6b 65 6e 20 6c 61 62 65 6c 20 66  ne token label f
23830 72 6f 6d 20 63 65 72 74 69 66 69 63 61 74 65 73  rom certificates
23840 20 2a 2f 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66   */..memset(pInf
23850 6f 2d 3e 6c 61 62 65 6c 2c 20 27 20 27 2c 20 73  o->label, ' ', s
23860 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6c 61 62  izeof(pInfo->lab
23870 65 6c 29 29 3b 0a 09 75 73 65 5f 64 65 66 61 75  el));..use_defau
23880 6c 74 5f 6c 61 62 65 6c 20 3d 20 31 3b 0a 0a 09  lt_label = 1;...
23890 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  if (cackey_slots
238a0 5b 73 6c 6f 74 49 44 5d 2e 6c 61 62 65 6c 20 3d  [slotID].label =
238b0 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 70 63 73 63  = NULL) {...pcsc
238c0 5f 69 64 65 6e 74 69 74 69 65 73 20 3d 20 63 61  _identities = ca
238d0 63 6b 65 79 5f 72 65 61 64 5f 63 65 72 74 73 28  ckey_read_certs(
238e0 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c  &cackey_slots[sl
238f0 6f 74 49 44 5d 2c 20 4e 55 4c 4c 2c 20 26 6e 75  otID], NULL, &nu
23900 6d 5f 63 65 72 74 73 29 3b 0a 09 09 69 66 20 28  m_certs);...if (
23910 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 20  pcsc_identities 
23920 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 69 66  != NULL) {....if
23930 20 28 6e 75 6d 5f 63 65 72 74 73 20 3e 20 30 29   (num_certs > 0)
23940 20 7b 0a 09 09 09 09 6c 61 62 65 6c 5f 72 65 74   {.....label_ret
23950 20 3d 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69   = cackey_pcsc_i
23960 64 65 6e 74 69 74 79 5f 74 6f 5f 6c 61 62 65 6c  dentity_to_label
23970 28 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73  (pcsc_identities
23980 2c 20 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 2c 20  , pInfo->label, 
23990 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6c 61  sizeof(pInfo->la
239a0 62 65 6c 29 29 3b 0a 09 09 09 09 69 66 20 28 6c  bel));.....if (l
239b0 61 62 65 6c 5f 72 65 74 20 3e 20 30 29 20 7b 0a  abel_ret > 0) {.
239c0 09 09 09 09 09 75 73 65 5f 64 65 66 61 75 6c 74  .....use_default
239d0 5f 6c 61 62 65 6c 20 3d 20 30 3b 0a 0a 09 09 09  _label = 0;.....
239e0 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73  ..cackey_slots[s
239f0 6c 6f 74 49 44 5d 2e 6c 61 62 65 6c 20 3d 20 6d  lotID].label = m
23a00 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 70 49 6e  alloc(sizeof(pIn
23a10 66 6f 2d 3e 6c 61 62 65 6c 29 29 3b 0a 0a 09 09  fo->label));....
23a20 09 09 09 6d 65 6d 63 70 79 28 63 61 63 6b 65 79  ...memcpy(cackey
23a30 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c  _slots[slotID].l
23a40 61 62 65 6c 2c 20 70 49 6e 66 6f 2d 3e 6c 61 62  abel, pInfo->lab
23a50 65 6c 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f  el, sizeof(pInfo
23a60 2d 3e 6c 61 62 65 6c 29 29 3b 0a 09 09 09 09 7d  ->label));.....}
23a70 0a 09 09 09 7d 0a 0a 09 09 09 63 61 63 6b 65 79  ....}.....cackey
23a80 5f 66 72 65 65 5f 63 65 72 74 73 28 70 63 73 63  _free_certs(pcsc
23a90 5f 69 64 65 6e 74 69 74 69 65 73 2c 20 6e 75 6d  _identities, num
23aa0 5f 63 65 72 74 73 2c 20 31 29 3b 0a 09 09 7d 0a  _certs, 1);...}.
23ab0 09 7d 20 65 6c 73 65 20 7b 0a 09 09 6d 65 6d 63  .} else {...memc
23ac0 70 79 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 2c  py(pInfo->label,
23ad0 20 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c   cackey_slots[sl
23ae0 6f 74 49 44 5d 2e 6c 61 62 65 6c 2c 20 73 69 7a  otID].label, siz
23af0 65 6f 66 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c  eof(pInfo->label
23b00 29 29 3b 0a 0a 09 09 75 73 65 5f 64 65 66 61 75  ));....use_defau
23b10 6c 74 5f 6c 61 62 65 6c 20 3d 20 30 3b 0a 09 7d  lt_label = 0;..}
23b20 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
23b30 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  = cackey_mutex_u
23b40 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
23b50 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
23b60 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
23b70 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
23b80 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
23b90 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64  Unlocking failed
23ba0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
23bb0 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
23bc0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 73 65 5f  );..}...if (use_
23bd0 64 65 66 61 75 6c 74 5f 6c 61 62 65 6c 29 20 7b  default_label) {
23be0 0a 09 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d  ...memcpy(pInfo-
23bf0 3e 6c 61 62 65 6c 2c 20 64 65 66 61 75 6c 74 4c  >label, defaultL
23c00 61 62 65 6c 2c 20 73 69 7a 65 6f 66 28 64 65 66  abel, sizeof(def
23c10 61 75 6c 74 4c 61 62 65 6c 29 20 2d 20 31 29 3b  aultLabel) - 1);
23c20 0a 09 7d 0a 0a 09 6d 65 6d 73 65 74 28 70 49 6e  ..}...memset(pIn
23c30 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 72  fo->manufacturer
23c40 49 44 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 28  ID, ' ', sizeof(
23c50 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75  pInfo->manufactu
23c60 72 65 72 49 44 29 29 3b 0a 09 6d 65 6d 63 70 79  rerID));..memcpy
23c70 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74  (pInfo->manufact
23c80 75 72 65 72 49 44 2c 20 6d 61 6e 75 66 61 63 74  urerID, manufact
23c90 75 72 65 72 49 44 2c 20 73 69 7a 65 6f 66 28 6d  urerID, sizeof(m
23ca0 61 6e 75 66 61 63 74 75 72 65 72 49 44 29 20 2d  anufacturerID) -
23cb0 20 31 29 3b 0a 0a 09 6d 65 6d 73 65 74 28 70 49   1);...memset(pI
23cc0 6e 66 6f 2d 3e 6d 6f 64 65 6c 2c 20 27 20 27 2c  nfo->model, ' ',
23cd0 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d   sizeof(pInfo->m
23ce0 6f 64 65 6c 29 29 3b 0a 09 6d 65 6d 63 70 79 28  odel));..memcpy(
23cf0 70 49 6e 66 6f 2d 3e 6d 6f 64 65 6c 2c 20 6d 6f  pInfo->model, mo
23d00 64 65 6c 2c 20 73 69 7a 65 6f 66 28 6d 6f 64 65  del, sizeof(mode
23d10 6c 29 20 2d 20 31 29 3b 0a 0a 09 6d 65 6d 73 65  l) - 1);...memse
23d20 74 28 70 49 6e 66 6f 2d 3e 73 65 72 69 61 6c 4e  t(pInfo->serialN
23d30 75 6d 62 65 72 2c 20 27 20 27 2c 20 73 69 7a 65  umber, ' ', size
23d40 6f 66 28 70 49 6e 66 6f 2d 3e 73 65 72 69 61 6c  of(pInfo->serial
23d50 4e 75 6d 62 65 72 29 29 3b 0a 0a 09 6d 65 6d 73  Number));...mems
23d60 65 74 28 70 49 6e 66 6f 2d 3e 75 74 63 54 69 6d  et(pInfo->utcTim
23d70 65 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 28 70  e, ' ', sizeof(p
23d80 49 6e 66 6f 2d 3e 75 74 63 54 69 6d 65 29 29 3b  Info->utcTime));
23d90 0a 0a 09 70 49 6e 66 6f 2d 3e 68 61 72 64 77 61  ...pInfo->hardwa
23da0 72 65 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20  reVersion.major 
23db0 3d 20 28 63 61 63 6b 65 79 5f 67 65 74 76 65 72  = (cackey_getver
23dc0 73 69 6f 6e 28 29 20 3e 3e 20 31 36 29 20 26 20  sion() >> 16) & 
23dd0 30 78 66 66 3b 0a 09 70 49 6e 66 6f 2d 3e 68 61  0xff;..pInfo->ha
23de0 72 64 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d 69  rdwareVersion.mi
23df0 6e 6f 72 20 3d 20 28 63 61 63 6b 65 79 5f 67 65  nor = (cackey_ge
23e00 74 76 65 72 73 69 6f 6e 28 29 20 3e 3e 20 38 29  tversion() >> 8)
23e10 20 26 20 30 78 66 66 3b 0a 0a 09 70 49 6e 66 6f   & 0xff;...pInfo
23e20 2d 3e 66 69 72 6d 77 61 72 65 56 65 72 73 69 6f  ->firmwareVersio
23e30 6e 2e 6d 61 6a 6f 72 20 3d 20 30 78 30 30 3b 0a  n.major = 0x00;.
23e40 09 70 49 6e 66 6f 2d 3e 66 69 72 6d 77 61 72 65  .pInfo->firmware
23e50 56 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20  Version.minor = 
23e60 30 78 30 30 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 66  0x00;...pInfo->f
23e70 6c 61 67 73 20 3d 20 43 4b 46 5f 57 52 49 54 45  lags = CKF_WRITE
23e80 5f 50 52 4f 54 45 43 54 45 44 20 7c 20 43 4b 46  _PROTECTED | CKF
23e90 5f 55 53 45 52 5f 50 49 4e 5f 49 4e 49 54 49 41  _USER_PIN_INITIA
23ea0 4c 49 5a 45 44 20 7c 20 43 4b 46 5f 54 4f 4b 45  LIZED | CKF_TOKE
23eb0 4e 5f 49 4e 49 54 49 41 4c 49 5a 45 44 20 7c 20  N_INITIALIZED | 
23ec0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f  cackey_slots[slo
23ed0 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73  tID].token_flags
23ee0 3b 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 70  ;...if (cackey_p
23ef0 69 6e 5f 63 6f 6d 6d 61 6e 64 20 21 3d 20 4e 55  in_command != NU
23f00 4c 4c 29 20 7b 0a 09 09 70 49 6e 66 6f 2d 3e 66  LL) {...pInfo->f
23f10 6c 61 67 73 20 7c 3d 20 43 4b 46 5f 50 52 4f 54  lags |= CKF_PROT
23f20 45 43 54 45 44 5f 41 55 54 48 45 4e 54 49 43 41  ECTED_AUTHENTICA
23f30 54 49 4f 4e 5f 50 41 54 48 3b 0a 09 7d 0a 0a 09  TION_PATH;..}...
23f40 70 49 6e 66 6f 2d 3e 75 6c 4d 61 78 53 65 73 73  pInfo->ulMaxSess
23f50 69 6f 6e 43 6f 75 6e 74 20 3d 20 28 73 69 7a 65  ionCount = (size
23f60 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
23f70 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63  ns) / sizeof(cac
23f80 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29  key_sessions[0])
23f90 29 20 2d 20 31 3b 0a 09 70 49 6e 66 6f 2d 3e 75  ) - 1;..pInfo->u
23fa0 6c 53 65 73 73 69 6f 6e 43 6f 75 6e 74 20 3d 20  lSessionCount = 
23fb0 43 4b 5f 55 4e 41 56 41 49 4c 41 42 4c 45 5f 49  CK_UNAVAILABLE_I
23fc0 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a 09 70 49 6e  NFORMATION;..pIn
23fd0 66 6f 2d 3e 75 6c 4d 61 78 52 77 53 65 73 73 69  fo->ulMaxRwSessi
23fe0 6f 6e 43 6f 75 6e 74 20 3d 20 30 3b 0a 09 70 49  onCount = 0;..pI
23ff0 6e 66 6f 2d 3e 75 6c 52 77 53 65 73 73 69 6f 6e  nfo->ulRwSession
24000 43 6f 75 6e 74 20 3d 20 43 4b 5f 55 4e 41 56 41  Count = CK_UNAVA
24010 49 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d 41 54 49  ILABLE_INFORMATI
24020 4f 4e 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 4d 61  ON;..pInfo->ulMa
24030 78 50 69 6e 4c 65 6e 20 3d 20 31 32 38 3b 0a 09  xPinLen = 128;..
24040 70 49 6e 66 6f 2d 3e 75 6c 4d 69 6e 50 69 6e 4c  pInfo->ulMinPinL
24050 65 6e 20 3d 20 30 3b 0a 09 70 49 6e 66 6f 2d 3e  en = 0;..pInfo->
24060 75 6c 54 6f 74 61 6c 50 75 62 6c 69 63 4d 65 6d  ulTotalPublicMem
24070 6f 72 79 20 3d 20 43 4b 5f 55 4e 41 56 41 49 4c  ory = CK_UNAVAIL
24080 41 42 4c 45 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e  ABLE_INFORMATION
24090 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 46 72 65 65  ;..pInfo->ulFree
240a0 50 75 62 6c 69 63 4d 65 6d 6f 72 79 20 3d 20 43  PublicMemory = C
240b0 4b 5f 55 4e 41 56 41 49 4c 41 42 4c 45 5f 49 4e  K_UNAVAILABLE_IN
240c0 46 4f 52 4d 41 54 49 4f 4e 3b 0a 09 70 49 6e 66  FORMATION;..pInf
240d0 6f 2d 3e 75 6c 54 6f 74 61 6c 50 72 69 76 61 74  o->ulTotalPrivat
240e0 65 4d 65 6d 6f 72 79 20 3d 20 43 4b 5f 55 4e 41  eMemory = CK_UNA
240f0 56 41 49 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d 41  VAILABLE_INFORMA
24100 54 49 4f 4e 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c  TION;..pInfo->ul
24110 46 72 65 65 50 72 69 76 61 74 65 4d 65 6d 6f 72  FreePrivateMemor
24120 79 20 3d 20 43 4b 5f 55 4e 41 56 41 49 4c 41 42  y = CK_UNAVAILAB
24130 4c 45 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a  LE_INFORMATION;.
24140 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
24150 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
24160 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43   CKR_OK (%i)", C
24170 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e  KR_OK);...return
24180 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f  (CKR_OK);.}..CK_
24190 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
241a0 43 4b 5f 52 56 2c 20 43 5f 57 61 69 74 46 6f 72  CK_RV, C_WaitFor
241b0 53 6c 6f 74 45 76 65 6e 74 29 28 43 4b 5f 46 4c  SlotEvent)(CK_FL
241c0 41 47 53 20 66 6c 61 67 73 2c 20 43 4b 5f 53 4c  AGS flags, CK_SL
241d0 4f 54 5f 49 44 5f 50 54 52 20 70 53 6c 6f 74 49  OT_ID_PTR pSlotI
241e0 44 2c 20 43 4b 5f 56 4f 49 44 5f 50 54 52 20 70  D, CK_VOID_PTR p
241f0 52 65 73 65 72 76 65 64 29 20 7b 0a 09 43 41 43  Reserved) {..CAC
24200 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
24210 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
24220 66 20 28 70 52 65 73 65 72 76 65 64 20 21 3d 20  f (pReserved != 
24230 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
24240 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
24250 72 72 6f 72 2e 20 70 52 65 73 65 72 76 65 64 20  rror. pReserved 
24260 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 22 29 3b 0a  is not NULL.");.
24270 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52  ...return(CKR_AR
24280 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d  GUMENTS_BAD);..}
24290 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
242a0 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
242b0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
242c0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
242d0 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
242e0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
242f0 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
24300 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 2f  IALIZED);..}.../
24310 2a 20 58 58 58 3a 20 54 4f 44 4f 3a 20 49 6d 70  * XXX: TODO: Imp
24320 6c 65 6d 65 6e 74 20 74 68 69 73 2e 2e 2e 20 2a  lement this... *
24330 2f 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  /..CACKEY_DEBUG_
24340 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
24350 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
24360 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
24370 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
24380 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
24390 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
243a0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
243b0 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
243c0 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
243d0 52 56 2c 20 43 5f 47 65 74 4d 65 63 68 61 6e 69  RV, C_GetMechani
243e0 73 6d 4c 69 73 74 29 28 43 4b 5f 53 4c 4f 54 5f  smList)(CK_SLOT_
243f0 49 44 20 73 6c 6f 74 49 44 2c 20 43 4b 5f 4d 45  ID slotID, CK_ME
24400 43 48 41 4e 49 53 4d 5f 54 59 50 45 5f 50 54 52  CHANISM_TYPE_PTR
24410 20 70 4d 65 63 68 61 6e 69 73 6d 4c 69 73 74 2c   pMechanismList,
24420 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75   CK_ULONG_PTR pu
24430 6c 43 6f 75 6e 74 29 20 7b 0a 09 43 41 43 4b 45  lCount) {..CACKE
24440 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
24450 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
24460 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
24470 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
24480 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
24490 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
244a0 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
244b0 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
244c0 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
244d0 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 75 6c  D);..}...if (pul
244e0 43 6f 75 6e 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b  Count == NULL) {
244f0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
24500 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
24510 70 75 6c 43 6f 75 6e 74 20 69 73 20 4e 55 4c 4c  pulCount is NULL
24520 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
24530 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44  KR_ARGUMENTS_BAD
24540 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 4d 65 63  );..}...if (pMec
24550 68 61 6e 69 73 6d 4c 69 73 74 20 3d 3d 20 4e 55  hanismList == NU
24560 4c 4c 29 20 7b 0a 09 09 2a 70 75 6c 43 6f 75 6e  LL) {...*pulCoun
24570 74 20 3d 20 31 3b 0a 0a 09 09 43 41 43 4b 45 59  t = 1;....CACKEY
24580 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
24590 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20  eturning CKR_OK 
245a0 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a  (%i)", CKR_OK);.
245b0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b  ...return(CKR_OK
245c0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 2a 70 75 6c  );..}...if (*pul
245d0 43 6f 75 6e 74 20 3c 20 31 29 20 7b 0a 09 09 43  Count < 1) {...C
245e0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
245f0 54 46 28 22 45 72 72 6f 72 2e 20 20 42 75 66 66  TF("Error.  Buff
24600 65 72 20 74 6f 6f 20 73 6d 61 6c 6c 2e 22 29 3b  er too small.");
24610 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 42  ....return(CKR_B
24620 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 29  UFFER_TOO_SMALL)
24630 3b 0a 09 7d 0a 0a 09 70 4d 65 63 68 61 6e 69 73  ;..}...pMechanis
24640 6d 4c 69 73 74 5b 30 5d 20 3d 20 43 4b 4d 5f 52  mList[0] = CKM_R
24650 53 41 5f 50 4b 43 53 3b 0a 09 2a 70 75 6c 43 6f  SA_PKCS;..*pulCo
24660 75 6e 74 20 3d 20 31 3b 0a 0a 09 43 41 43 4b 45  unt = 1;...CACKE
24670 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
24680 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b  Returning CKR_OK
24690 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b   (%i)", CKR_OK);
246a0 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b  ...return(CKR_OK
246b0 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
246c0 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
246d0 43 5f 47 65 74 4d 65 63 68 61 6e 69 73 6d 49 6e  C_GetMechanismIn
246e0 66 6f 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20 73  fo)(CK_SLOT_ID s
246f0 6c 6f 74 49 44 2c 20 43 4b 5f 4d 45 43 48 41 4e  lotID, CK_MECHAN
24700 49 53 4d 5f 54 59 50 45 20 74 79 70 65 2c 20 43  ISM_TYPE type, C
24710 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 49 4e 46 4f  K_MECHANISM_INFO
24720 5f 50 54 52 20 70 49 6e 66 6f 29 20 7b 0a 09 69  _PTR pInfo) {..i
24730 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b  nt mutex_retval;
24740 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
24750 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
24760 29 3b 0a 0a 09 69 66 20 28 70 49 6e 66 6f 20 3d  );...if (pInfo =
24770 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
24780 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
24790 22 45 72 72 6f 72 2e 20 70 49 6e 66 6f 20 69 73  "Error. pInfo is
247a0 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74   NULL.");....ret
247b0 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54  urn(CKR_ARGUMENT
247c0 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  S_BAD);..}...if 
247d0 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
247e0 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
247f0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
24800 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
24810 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
24820 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
24830 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
24840 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f  D);..}...if (slo
24850 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49  tID < 0 || slotI
24860 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63  D >= (sizeof(cac
24870 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a  key_slots) / siz
24880 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
24890 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45  [0]))) {...CACKE
248a0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
248b0 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73  Error. Invalid s
248c0 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25  lot requested (%
248d0 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20  lu), outside of 
248e0 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c  valid range", sl
248f0 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e  otID);....return
24900 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56  (CKR_SLOT_ID_INV
24910 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65  ALID);..}...mute
24920 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
24930 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63  y_mutex_lock(cac
24940 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
24950 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
24960 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
24970 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
24980 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66  rror.  Locking f
24990 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
249a0 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
249b0 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20  ERROR);..}...if 
249c0 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c  (cackey_slots[sl
249d0 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20  otID].active == 
249e0 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
249f0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
24a00 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20  r. Invalid slot 
24a10 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c  requested (%lu),
24a20 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e   slot not curren
24a30 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f  tly active", slo
24a40 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f  tID);....cackey_
24a50 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
24a60 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
24a70 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54  .return(CKR_SLOT
24a80 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  _ID_INVALID);..}
24a90 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
24aa0 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  = cackey_mutex_u
24ab0 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
24ac0 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
24ad0 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
24ae0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
24af0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
24b00 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64  Unlocking failed
24b10 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
24b20 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
24b30 29 3b 0a 09 7d 0a 0a 09 73 77 69 74 63 68 20 28  );..}...switch (
24b40 74 79 70 65 29 20 7b 0a 09 09 63 61 73 65 20 43  type) {...case C
24b50 4b 4d 5f 52 53 41 5f 50 4b 43 53 3a 0a 09 09 09  KM_RSA_PKCS:....
24b60 70 49 6e 66 6f 2d 3e 75 6c 4d 69 6e 4b 65 79 53  pInfo->ulMinKeyS
24b70 69 7a 65 20 3d 20 35 31 32 3b 0a 09 09 09 70 49  ize = 512;....pI
24b80 6e 66 6f 2d 3e 75 6c 4d 61 78 4b 65 79 53 69 7a  nfo->ulMaxKeySiz
24b90 65 20 3d 20 38 31 39 32 3b 0a 09 09 09 70 49 6e  e = 8192;....pIn
24ba0 66 6f 2d 3e 66 6c 61 67 73 20 3d 20 43 4b 46 5f  fo->flags = CKF_
24bb0 48 57 20 7c 20 43 4b 46 5f 45 4e 43 52 59 50 54  HW | CKF_ENCRYPT
24bc0 20 7c 20 43 4b 46 5f 44 45 43 52 59 50 54 20 7c   | CKF_DECRYPT |
24bd0 20 43 4b 46 5f 53 49 47 4e 20 7c 20 43 4b 46 5f   CKF_SIGN | CKF_
24be0 56 45 52 49 46 59 3b 0a 09 09 09 62 72 65 61 6b  VERIFY;....break
24bf0 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
24c00 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
24c10 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69  rning CKR_OK (%i
24c20 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72  )", CKR_OK);...r
24c30 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d  eturn(CKR_OK);.}
24c40 0a 0a 2f 2a 20 57 65 20 64 6f 6e 27 74 20 73 75  ../* We don't su
24c50 70 70 6f 72 74 20 74 68 69 73 20 6d 65 74 68 6f  pport this metho
24c60 64 2e 20 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45 5f  d. */.CK_DEFINE_
24c70 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
24c80 43 5f 49 6e 69 74 54 6f 6b 65 6e 29 28 43 4b 5f  C_InitToken)(CK_
24c90 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 2c 20  SLOT_ID slotID, 
24ca0 43 4b 5f 55 54 46 38 43 48 41 52 5f 50 54 52 20  CK_UTF8CHAR_PTR 
24cb0 70 50 69 6e 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  pPin, CK_ULONG u
24cc0 6c 50 69 6e 4c 65 6e 2c 20 43 4b 5f 55 54 46 38  lPinLen, CK_UTF8
24cd0 43 48 41 52 5f 50 54 52 20 70 4c 61 62 65 6c 29  CHAR_PTR pLabel)
24ce0 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
24cf0 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
24d00 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
24d10 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
24d20 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
24d30 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
24d40 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
24d50 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
24d60 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
24d70 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
24d80 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
24d90 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
24da0 20 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49 54 45   CKR_TOKEN_WRITE
24db0 5f 50 52 4f 54 45 43 54 45 44 20 28 25 69 29 22  _PROTECTED (%i)"
24dc0 2c 20 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49 54  , CKR_TOKEN_WRIT
24dd0 45 5f 50 52 4f 54 45 43 54 45 44 29 3b 0a 0a 09  E_PROTECTED);...
24de0 72 65 74 75 72 6e 28 43 4b 52 5f 54 4f 4b 45 4e  return(CKR_TOKEN
24df0 5f 57 52 49 54 45 5f 50 52 4f 54 45 43 54 45 44  _WRITE_PROTECTED
24e00 29 3b 0a 7d 0a 0a 2f 2a 20 57 65 20 64 6f 6e 27  );.}../* We don'
24e10 74 20 73 75 70 70 6f 72 74 20 74 68 69 73 20 6d  t support this m
24e20 65 74 68 6f 64 2e 20 2a 2f 0a 43 4b 5f 44 45 46  ethod. */.CK_DEF
24e30 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
24e40 52 56 2c 20 43 5f 49 6e 69 74 50 49 4e 29 28 43  RV, C_InitPIN)(C
24e50 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
24e60 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 55 54   hSession, CK_UT
24e70 46 38 43 48 41 52 5f 50 54 52 20 70 50 69 6e 2c  F8CHAR_PTR pPin,
24e80 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 69 6e 4c   CK_ULONG ulPinL
24e90 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  en) {..CACKEY_DE
24ea0 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
24eb0 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
24ec0 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
24ed0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
24ee0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
24ef0 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
24f00 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
24f10 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
24f20 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
24f30 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
24f40 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
24f50 69 6e 67 20 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52  ing CKR_TOKEN_WR
24f60 49 54 45 5f 50 52 4f 54 45 43 54 45 44 20 28 25  ITE_PROTECTED (%
24f70 69 29 22 2c 20 43 4b 52 5f 54 4f 4b 45 4e 5f 57  i)", CKR_TOKEN_W
24f80 52 49 54 45 5f 50 52 4f 54 45 43 54 45 44 29 3b  RITE_PROTECTED);
24f90 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 54 4f  ...return(CKR_TO
24fa0 4b 45 4e 5f 57 52 49 54 45 5f 50 52 4f 54 45 43  KEN_WRITE_PROTEC
24fb0 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  TED);.}..CK_DEFI
24fc0 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
24fd0 56 2c 20 43 5f 53 65 74 50 49 4e 29 28 43 4b 5f  V, C_SetPIN)(CK_
24fe0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
24ff0 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 55 54 46 38  Session, CK_UTF8
25000 43 48 41 52 5f 50 54 52 20 70 4f 6c 64 50 69 6e  CHAR_PTR pOldPin
25010 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 4f 6c 64  , CK_ULONG ulOld
25020 50 69 6e 4c 65 6e 2c 20 43 4b 5f 55 54 46 38 43  PinLen, CK_UTF8C
25030 48 41 52 5f 50 54 52 20 70 4e 65 77 50 69 6e 2c  HAR_PTR pNewPin,
25040 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 4e 65 77 50   CK_ULONG ulNewP
25050 69 6e 4c 65 6e 29 20 7b 0a 09 63 68 61 72 20 6f  inLen) {..char o
25060 6c 64 70 69 6e 62 75 66 5b 36 34 5d 2c 20 6e 65  ldpinbuf[64], ne
25070 77 70 69 6e 62 75 66 5b 36 34 5d 3b 0a 09 63 61  wpinbuf[64];..ca
25080 63 6b 65 79 5f 72 65 74 20 73 65 74 5f 70 69 6e  ckey_ret set_pin
25090 5f 72 65 74 2c 20 67 65 74 5f 70 69 6e 5f 72 65  _ret, get_pin_re
250a0 74 3b 0a 09 43 4b 5f 53 4c 4f 54 5f 49 44 20 73  t;..CK_SLOT_ID s
250b0 6c 6f 74 49 44 3b 0a 09 69 6e 74 20 6d 75 74 65  lotID;..int mute
250c0 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b  x_retval;...CACK
250d0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
250e0 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
250f0 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
25100 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
25110 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
25120 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
25130 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
25140 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
25150 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
25160 45 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f  ED);..}...mutex_
25170 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
25180 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65  mutex_lock(cacke
25190 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
251a0 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
251b0 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
251c0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
251d0 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69  or.  Locking fai
251e0 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
251f0 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
25200 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21  ROR);..}...if (!
25210 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
25220 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65  hSession].active
25230 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  ) {...cackey_mut
25240 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
25250 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41  _biglock);....CA
25260 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
25270 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69  F("Error.  Sessi
25280 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29  on not active.")
25290 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
252a0 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  R_SESSION_HANDLE
252b0 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
252c0 73 6c 6f 74 49 44 20 3d 20 63 61 63 6b 65 79 5f  slotID = cackey_
252d0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
252e0 6e 5d 2e 73 6c 6f 74 49 44 3b 0a 0a 09 69 66 20  n].slotID;...if 
252f0 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73  (slotID < 0 || s
25300 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66  lotID >= (sizeof
25310 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f  (cackey_slots) /
25320 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73   sizeof(cackey_s
25330 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43  lots[0]))) {...C
25340 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
25350 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c  TF("Error. Inval
25360 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65  id slot requeste
25370 64 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 65  d (%lu), outside
25380 20 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 65 22   of valid range"
25390 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61  , slotID);....ca
253a0 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
253b0 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
253c0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
253d0 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
253e0 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79  ..}...if (cackey
253f0 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61  _slots[slotID].a
25400 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09  ctive == 0) {...
25410 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
25420 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61  NTF("Error. Inva
25430 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74  lid slot request
25440 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e  ed (%lu), slot n
25450 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74  ot currently act
25460 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a  ive", slotID);..
25470 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
25480 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
25490 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e  lock);....return
254a0 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
254b0 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61  OR);..}...if (ca
254c0 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64  ckey_pin_command
254d0 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 2f 2a   != NULL) {.../*
254e0 20 47 65 74 20 6f 6c 64 20 50 49 4e 20 2a 2f 0a   Get old PIN */.
254f0 09 09 67 65 74 5f 70 69 6e 5f 72 65 74 20 3d 20  ..get_pin_ret = 
25500 63 61 63 6b 65 79 5f 67 65 74 5f 70 69 6e 28 6f  cackey_get_pin(o
25510 6c 64 70 69 6e 62 75 66 29 3b 0a 0a 09 09 69 66  ldpinbuf);....if
25520 20 28 67 65 74 5f 70 69 6e 5f 72 65 74 20 21 3d   (get_pin_ret !=
25530 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f   CACKEY_PCSC_S_O
25540 4b 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  K) {....CACKEY_D
25550 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
25560 6f 72 20 77 68 69 6c 65 20 67 65 74 74 69 6e 67  or while getting
25570 20 4f 6c 64 20 50 49 4e 2c 20 72 65 74 75 72 6e   Old PIN, return
25580 69 6e 67 20 43 4b 52 5f 50 49 4e 5f 49 4e 43 4f  ing CKR_PIN_INCO
25590 52 52 45 43 54 2e 22 29 3b 0a 0a 09 09 09 63 61  RRECT.");.....ca
255a0 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
255b0 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
255c0 29 3b 0a 09 09 09 0a 09 09 09 72 65 74 75 72 6e  );........return
255d0 28 43 4b 52 5f 50 49 4e 5f 49 4e 43 4f 52 52 45  (CKR_PIN_INCORRE
255e0 43 54 29 3b 0a 09 09 7d 0a 0a 09 09 70 4f 6c 64  CT);...}....pOld
255f0 50 69 6e 20 3d 20 28 43 4b 5f 55 54 46 38 43 48  Pin = (CK_UTF8CH
25600 41 52 5f 50 54 52 29 20 6f 6c 64 70 69 6e 62 75  AR_PTR) oldpinbu
25610 66 3b 0a 09 09 75 6c 4f 6c 64 50 69 6e 4c 65 6e  f;...ulOldPinLen
25620 20 3d 20 73 74 72 6c 65 6e 28 6f 6c 64 70 69 6e   = strlen(oldpin
25630 62 75 66 29 3b 0a 0a 09 09 2f 2a 20 47 65 74 20  buf);..../* Get 
25640 6e 65 77 20 50 49 4e 20 2a 2f 0a 09 09 67 65 74  new PIN */...get
25650 5f 70 69 6e 5f 72 65 74 20 3d 20 63 61 63 6b 65  _pin_ret = cacke
25660 79 5f 67 65 74 5f 70 69 6e 28 6e 65 77 70 69 6e  y_get_pin(newpin
25670 62 75 66 29 3b 0a 0a 09 09 69 66 20 28 67 65 74  buf);....if (get
25680 5f 70 69 6e 5f 72 65 74 20 21 3d 20 43 41 43 4b  _pin_ret != CACK
25690 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a  EY_PCSC_S_OK) {.
256a0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
256b0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 20 77 68  PRINTF("Error wh
256c0 69 6c 65 20 67 65 74 74 69 6e 67 20 4e 65 77 20  ile getting New 
256d0 50 49 4e 2c 20 72 65 74 75 72 6e 69 6e 67 20 43  PIN, returning C
256e0 4b 52 5f 50 49 4e 5f 49 4e 56 41 4c 49 44 2e 22  KR_PIN_INVALID."
256f0 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 6d 75  );.....cackey_mu
25700 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
25710 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 09 0a  y_biglock);.....
25720 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 50 49  ...return(CKR_PI
25730 4e 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 09 7d 0a  N_INVALID);...}.
25740 0a 09 09 70 4e 65 77 50 69 6e 20 3d 20 28 43 4b  ...pNewPin = (CK
25750 5f 55 54 46 38 43 48 41 52 5f 50 54 52 29 20 6e  _UTF8CHAR_PTR) n
25760 65 77 70 69 6e 62 75 66 3b 0a 09 09 75 6c 4e 65  ewpinbuf;...ulNe
25770 77 50 69 6e 4c 65 6e 20 3d 20 73 74 72 6c 65 6e  wPinLen = strlen
25780 28 6e 65 77 70 69 6e 62 75 66 29 3b 0a 09 7d 0a  (newpinbuf);..}.
25790 0a 09 69 66 20 28 70 4f 6c 64 50 69 6e 20 3d 3d  ..if (pOldPin ==
257a0 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
257b0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
257c0 4f 6c 64 20 50 49 4e 20 76 61 6c 75 65 20 69 73  Old PIN value is
257d0 20 77 72 6f 6e 67 20 28 6e 75 6c 6c 29 2e 22 29   wrong (null).")
257e0 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65  ;....cackey_mute
257f0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
25800 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74  biglock);....ret
25810 75 72 6e 28 43 4b 52 5f 50 49 4e 5f 49 4e 43 4f  urn(CKR_PIN_INCO
25820 52 52 45 43 54 29 3b 0a 09 7d 0a 0a 09 69 66 20  RRECT);..}...if 
25830 28 75 6c 4f 6c 64 50 69 6e 4c 65 6e 20 3d 3d 20  (ulOldPinLen == 
25840 30 20 7c 7c 20 75 6c 4f 6c 64 50 69 6e 4c 65 6e  0 || ulOldPinLen
25850 20 3e 20 38 29 20 7b 0a 09 09 43 41 43 4b 45 59   > 8) {...CACKEY
25860 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4f  _DEBUG_PRINTF("O
25870 6c 64 20 50 49 4e 20 6c 65 6e 67 74 68 20 69 73  ld PIN length is
25880 20 77 72 6f 6e 67 3a 20 25 6c 75 2e 22 2c 20 28   wrong: %lu.", (
25890 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75  unsigned long) u
258a0 6c 4f 6c 64 50 69 6e 4c 65 6e 29 3b 0a 0a 09 09  lOldPinLen);....
258b0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
258c0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
258d0 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  ck);....return(C
258e0 4b 52 5f 50 49 4e 5f 49 4e 43 4f 52 52 45 43 54  KR_PIN_INCORRECT
258f0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 4e 65 77  );..}...if (pNew
25900 50 69 6e 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  Pin == NULL) {..
25910 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
25920 49 4e 54 46 28 22 4e 65 77 20 50 49 4e 20 76 61  INTF("New PIN va
25930 6c 75 65 20 69 73 20 77 72 6f 6e 67 20 28 65 69  lue is wrong (ei
25940 74 68 65 72 20 4e 55 4c 4c 2c 20 6f 72 20 74 6f  ther NULL, or to
25950 6f 20 6c 6f 6e 67 2f 73 68 6f 72 74 29 2e 22 29  o long/short).")
25960 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65  ;....cackey_mute
25970 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
25980 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74  biglock);....ret
25990 75 72 6e 28 43 4b 52 5f 50 49 4e 5f 49 4e 56 41  urn(CKR_PIN_INVA
259a0 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75  LID);..}...if (u
259b0 6c 4e 65 77 50 69 6e 4c 65 6e 20 3c 20 35 20 7c  lNewPinLen < 5 |
259c0 7c 20 75 6c 4e 65 77 50 69 6e 4c 65 6e 20 3e 20  | ulNewPinLen > 
259d0 38 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  8) {...CACKEY_DE
259e0 42 55 47 5f 50 52 49 4e 54 46 28 22 4e 65 77 20  BUG_PRINTF("New 
259f0 50 49 4e 20 6c 65 6e 67 74 68 20 69 73 20 77 72  PIN length is wr
25a00 6f 6e 67 3a 20 25 6c 75 2c 20 6d 75 73 74 20 62  ong: %lu, must b
25a10 65 20 61 74 6c 65 61 73 74 20 35 20 61 6e 64 20  e atleast 5 and 
25a20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 38 2e 22  no more than 8."
25a30 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
25a40 29 20 75 6c 4e 65 77 50 69 6e 4c 65 6e 29 3b 0a  ) ulNewPinLen);.
25a50 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
25a60 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
25a70 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72  glock);....retur
25a80 6e 28 43 4b 52 5f 50 49 4e 5f 4c 45 4e 5f 52 41  n(CKR_PIN_LEN_RA
25a90 4e 47 45 29 3b 0a 09 7d 0a 0a 09 73 65 74 5f 70  NGE);..}...set_p
25aa0 69 6e 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f  in_ret = cackey_
25ab0 73 65 74 5f 70 69 6e 28 26 63 61 63 6b 65 79 5f  set_pin(&cackey_
25ac0 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c 20 70  slots[slotID], p
25ad0 4f 6c 64 50 69 6e 2c 20 75 6c 4f 6c 64 50 69 6e  OldPin, ulOldPin
25ae0 4c 65 6e 2c 20 70 4e 65 77 50 69 6e 2c 20 75 6c  Len, pNewPin, ul
25af0 4e 65 77 50 69 6e 4c 65 6e 29 3b 0a 0a 09 69 66  NewPinLen);...if
25b00 20 28 73 65 74 5f 70 69 6e 5f 72 65 74 20 21 3d   (set_pin_ret !=
25b10 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f   CACKEY_PCSC_S_O
25b20 4b 29 20 7b 0a 09 09 69 66 20 28 63 61 63 6b 65  K) {...if (cacke
25b30 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20 3d 3d  y_pin_command ==
25b40 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 63 61 63 6b   NULL) {....cack
25b50 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
25b60 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 7c 3d 20  .token_flags |= 
25b70 43 4b 46 5f 4c 4f 47 49 4e 5f 52 45 51 55 49 52  CKF_LOGIN_REQUIR
25b80 45 44 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 73  ED;...}....if (s
25b90 65 74 5f 70 69 6e 5f 72 65 74 20 3d 3d 20 43 41  et_pin_ret == CA
25ba0 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4c 4f 43 4b  CKEY_PCSC_E_LOCK
25bb0 45 44 29 20 7b 0a 09 09 09 63 61 63 6b 65 79 5f  ED) {....cackey_
25bc0 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 74 6f  slots[slotID].to
25bd0 6b 65 6e 5f 66 6c 61 67 73 20 7c 3d 20 43 4b 46  ken_flags |= CKF
25be0 5f 55 53 45 52 5f 50 49 4e 5f 4c 4f 43 4b 45 44  _USER_PIN_LOCKED
25bf0 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 6d 75 74 65 78  ;...}..}...mutex
25c00 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
25c10 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
25c20 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
25c30 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
25c40 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
25c50 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
25c60 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e  Error.  Unlockin
25c70 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
25c80 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
25c90 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
25ca0 73 77 69 74 63 68 20 28 73 65 74 5f 70 69 6e 5f  switch (set_pin_
25cb0 72 65 74 29 20 7b 0a 09 09 63 61 73 65 20 43 41  ret) {...case CA
25cc0 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 3a 0a  CKEY_PCSC_S_OK:.
25cd0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
25ce0 50 52 49 4e 54 46 28 22 53 75 63 63 65 73 73 66  PRINTF("Successf
25cf0 75 6c 6c 79 20 73 65 74 20 50 49 4e 2e 22 29 3b  ully set PIN.");
25d00 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
25d10 4f 4b 29 3b 0a 09 09 63 61 73 65 20 43 41 43 4b  OK);...case CACK
25d20 45 59 5f 50 43 53 43 5f 45 5f 42 41 44 50 49 4e  EY_PCSC_E_BADPIN
25d30 3a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  :....CACKEY_DEBU
25d40 47 5f 50 52 49 4e 54 46 28 22 50 49 4e 20 77 61  G_PRINTF("PIN wa
25d50 73 20 69 6e 76 61 6c 69 64 2e 22 29 3b 0a 0a 09  s invalid.");...
25d60 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 50 49 4e  ..return(CKR_PIN
25d70 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 09 63 61 73  _INVALID);...cas
25d80 65 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  e CACKEY_PCSC_E_
25d90 4c 4f 43 4b 45 44 3a 0a 09 09 09 43 41 43 4b 45  LOCKED:....CACKE
25da0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
25db0 54 6f 6b 65 6e 20 69 73 20 6c 6f 63 6b 65 64 20  Token is locked 
25dc0 6f 72 20 74 68 69 73 20 63 68 61 6e 67 65 20 69  or this change i
25dd0 73 20 6e 6f 74 20 70 65 72 6d 69 74 74 65 64 2e  s not permitted.
25de0 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43  ");.....return(C
25df0 4b 52 5f 50 49 4e 5f 4c 4f 43 4b 45 44 29 3b 0a  KR_PIN_LOCKED);.
25e00 09 09 64 65 66 61 75 6c 74 3a 0a 09 09 09 43 41  ..default:....CA
25e10 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
25e20 46 28 22 53 6f 6d 65 74 68 69 6e 67 20 65 6c 73  F("Something els
25e30 65 20 77 65 6e 74 20 77 72 6f 6e 67 20 63 68 61  e went wrong cha
25e40 6e 67 69 6e 67 20 74 68 65 20 50 49 4e 3a 20 25  nging the PIN: %
25e50 69 22 2c 20 73 65 74 5f 70 69 6e 5f 72 65 74 29  i", set_pin_ret)
25e60 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 4b 52  ;.....return(CKR
25e70 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
25e80 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  ..}...return(CKR
25e90 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
25ea0 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
25eb0 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
25ec0 4f 70 65 6e 53 65 73 73 69 6f 6e 29 28 43 4b 5f  OpenSession)(CK_
25ed0 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 2c 20  SLOT_ID slotID, 
25ee0 43 4b 5f 46 4c 41 47 53 20 66 6c 61 67 73 2c 20  CK_FLAGS flags, 
25ef0 43 4b 5f 56 4f 49 44 5f 50 54 52 20 70 41 70 70  CK_VOID_PTR pApp
25f00 6c 69 63 61 74 69 6f 6e 2c 20 43 4b 5f 4e 4f 54  lication, CK_NOT
25f10 49 46 59 20 6e 6f 74 69 66 79 2c 20 43 4b 5f 53  IFY notify, CK_S
25f20 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 50 54  ESSION_HANDLE_PT
25f30 52 20 70 68 53 65 73 73 69 6f 6e 29 20 7b 0a 09  R phSession) {..
25f40 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 69 64  unsigned long id
25f50 78 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65  x;..int mutex_re
25f60 74 76 61 6c 3b 0a 09 69 6e 74 20 66 6f 75 6e 64  tval;..int found
25f70 5f 73 65 73 73 69 6f 6e 20 3d 20 30 3b 0a 0a 09  _session = 0;...
25f80 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
25f90 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
25fa0 0a 09 69 66 20 28 28 66 6c 61 67 73 20 26 20 43  ..if ((flags & C
25fb0 4b 46 5f 53 45 52 49 41 4c 5f 53 45 53 53 49 4f  KF_SERIAL_SESSIO
25fc0 4e 29 20 21 3d 20 43 4b 46 5f 53 45 52 49 41 4c  N) != CKF_SERIAL
25fd0 5f 53 45 53 53 49 4f 4e 29 20 7b 0a 09 09 72 65  _SESSION) {...re
25fe0 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e  turn(CKR_SESSION
25ff0 5f 50 41 52 41 4c 4c 45 4c 5f 4e 4f 54 5f 53 55  _PARALLEL_NOT_SU
26000 50 50 4f 52 54 45 44 29 3b 0a 09 7d 0a 0a 09 69  PPORTED);..}...i
26010 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
26020 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
26030 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
26040 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
26050 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
26060 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
26070 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
26080 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73  ZED);..}...if (s
26090 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f  lotID < 0 || slo
260a0 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63  tID >= (sizeof(c
260b0 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73  ackey_slots) / s
260c0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f  izeof(cackey_slo
260d0 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43  ts[0]))) {...CAC
260e0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
260f0 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64  ("Error. Invalid
26100 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20   slot requested 
26110 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f  (%lu), outside o
26120 66 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20  f valid range", 
26130 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 75  slotID);....retu
26140 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49  rn(CKR_SLOT_ID_I
26150 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75  NVALID);..}...mu
26160 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
26170 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63  key_mutex_lock(c
26180 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
26190 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
261a0 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
261b0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
261c0 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67  "Error.  Locking
261d0 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
261e0 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
261f0 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69  L_ERROR);..}...i
26200 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  f (cackey_slots[
26210 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d  slotID].active =
26220 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
26230 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
26240 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f  ror. Invalid slo
26250 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75  t requested (%lu
26260 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72  ), slot not curr
26270 65 6e 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73  ently active", s
26280 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65  lotID);....cacke
26290 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
262a0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
262b0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c  ...return(CKR_SL
262c0 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a  OT_ID_INVALID);.
262d0 09 7d 0a 0a 09 2f 2a 20 56 65 72 69 66 79 20 74  .}.../* Verify t
262e0 68 61 74 20 74 68 65 20 63 61 72 64 20 69 73 20  hat the card is 
262f0 61 63 74 75 61 6c 6c 79 20 69 6e 20 74 68 65 20  actually in the 
26300 73 6c 6f 74 2e 20 2a 2f 0a 09 2f 2a 20 58 58 58  slot. */../* XXX
26310 3a 20 43 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20  : Check to make 
26320 73 75 72 65 20 74 68 69 73 20 69 73 20 69 6e 20  sure this is in 
26330 74 68 65 20 50 4b 43 53 23 31 31 20 73 70 65 63  the PKCS#11 spec
26340 69 66 69 63 61 74 69 6f 6e 20 2a 2f 0a 09 69 66  ification */..if
26350 20 28 63 61 63 6b 65 79 5f 74 6f 6b 65 6e 5f 70   (cackey_token_p
26360 72 65 73 65 6e 74 28 26 63 61 63 6b 65 79 5f 73  resent(&cackey_s
26370 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 29 20 21 3d  lots[slotID]) !=
26380 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 54   CACKEY_PCSC_S_T
26390 4f 4b 45 4e 50 52 45 53 45 4e 54 29 20 7b 0a 09  OKENPRESENT) {..
263a0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
263b0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 43 61  INTF("Error.  Ca
263c0 72 64 20 6e 6f 74 20 70 72 65 73 65 6e 74 2e 20  rd not present. 
263d0 20 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 44   Returning CKR_D
263e0 45 56 49 43 45 5f 52 45 4d 4f 56 45 44 22 29 3b  EVICE_REMOVED");
263f0 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  ....cackey_mutex
26400 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
26410 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75  iglock);....retu
26420 72 6e 28 43 4b 52 5f 44 45 56 49 43 45 5f 52 45  rn(CKR_DEVICE_RE
26430 4d 4f 56 45 44 29 3b 0a 09 7d 0a 0a 09 66 6f 72  MOVED);..}...for
26440 20 28 69 64 78 20 3d 20 31 3b 20 69 64 78 20 3c   (idx = 1; idx <
26450 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
26460 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65  sessions) / size
26470 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
26480 6e 73 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29 20  ns[0])); idx++) 
26490 7b 0a 09 09 69 66 20 28 21 63 61 63 6b 65 79 5f  {...if (!cackey_
264a0 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 61 63  sessions[idx].ac
264b0 74 69 76 65 29 20 7b 0a 09 09 09 66 6f 75 6e 64  tive) {....found
264c0 5f 73 65 73 73 69 6f 6e 20 3d 20 31 3b 0a 0a 09  _session = 1;...
264d0 09 09 2a 70 68 53 65 73 73 69 6f 6e 20 3d 20 69  ..*phSession = i
264e0 64 78 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73  dx;.....cackey_s
264f0 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 61 63 74  essions[idx].act
26500 69 76 65 20 3d 20 31 3b 0a 09 09 09 63 61 63 6b  ive = 1;....cack
26510 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d  ey_sessions[idx]
26520 2e 73 6c 6f 74 49 44 20 3d 20 73 6c 6f 74 49 44  .slotID = slotID
26530 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73  ;....cackey_sess
26540 69 6f 6e 73 5b 69 64 78 5d 2e 73 74 61 74 65 20  ions[idx].state 
26550 3d 20 43 4b 53 5f 52 4f 5f 50 55 42 4c 49 43 5f  = CKS_RO_PUBLIC_
26560 53 45 53 53 49 4f 4e 3b 0a 09 09 09 63 61 63 6b  SESSION;....cack
26570 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d  ey_sessions[idx]
26580 2e 66 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a  .flags = flags;.
26590 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
265a0 6e 73 5b 69 64 78 5d 2e 75 6c 44 65 76 69 63 65  ns[idx].ulDevice
265b0 45 72 72 6f 72 20 3d 20 30 3b 0a 09 09 09 63 61  Error = 0;....ca
265c0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64  ckey_sessions[id
265d0 78 5d 2e 70 41 70 70 6c 69 63 61 74 69 6f 6e 20  x].pApplication 
265e0 3d 20 70 41 70 70 6c 69 63 61 74 69 6f 6e 3b 0a  = pApplication;.
265f0 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
26600 6e 73 5b 69 64 78 5d 2e 4e 6f 74 69 66 79 20 3d  ns[idx].Notify =
26610 20 6e 6f 74 69 66 79 3b 0a 0a 09 09 09 63 61 63   notify;.....cac
26620 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78  key_sessions[idx
26630 5d 2e 69 64 65 6e 74 69 74 69 65 73 20 3d 20 4e  ].identities = N
26640 55 4c 4c 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73  ULL;....cackey_s
26650 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 69 64 65  essions[idx].ide
26660 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 20 3d 20  ntities_count = 
26670 30 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65  0;.....cackey_se
26680 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 73 65 61 72  ssions[idx].sear
26690 63 68 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a 0a  ch_active = 0;..
266a0 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
266b0 6e 73 5b 69 64 78 5d 2e 73 69 67 6e 5f 61 63 74  ns[idx].sign_act
266c0 69 76 65 20 3d 20 30 3b 0a 0a 09 09 09 63 61 63  ive = 0;.....cac
266d0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78  key_sessions[idx
266e0 5d 2e 64 65 63 72 79 70 74 5f 61 63 74 69 76 65  ].decrypt_active
266f0 20 3d 20 30 3b 0a 0a 09 09 09 63 61 63 6b 65 79   = 0;.....cackey
26700 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 69  _sessions[idx].i
26710 64 65 6e 74 69 74 69 65 73 20 3d 20 63 61 63 6b  dentities = cack
26720 65 79 5f 72 65 61 64 5f 69 64 65 6e 74 69 74 69  ey_read_identiti
26730 65 73 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73  es(&cackey_slots
26740 5b 73 6c 6f 74 49 44 5d 2c 20 26 63 61 63 6b 65  [slotID], &cacke
26750 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e  y_sessions[idx].
26760 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74  identities_count
26770 29 3b 0a 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09  );......break;..
26780 09 7d 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65  .}..}...mutex_re
26790 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
267a0 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
267b0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
267c0 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
267d0 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
267e0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
267f0 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66  or.  Unlocking f
26800 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
26810 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
26820 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20  ERROR);..}...if 
26830 28 21 66 6f 75 6e 64 5f 73 65 73 73 69 6f 6e 29  (!found_session)
26840 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
26850 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
26860 69 6e 67 20 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  ing CKR_SESSION_
26870 43 4f 55 4e 54 20 28 25 69 29 22 2c 20 43 4b 52  COUNT (%i)", CKR
26880 5f 53 45 53 53 49 4f 4e 5f 43 4f 55 4e 54 29 3b  _SESSION_COUNT);
26890 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
268a0 45 53 53 49 4f 4e 5f 43 4f 55 4e 54 29 3b 0a 09  ESSION_COUNT);..
268b0 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
268c0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
268d0 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c  ng CKR_OK (%i)",
268e0 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75   CKR_OK);...retu
268f0 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43  rn(CKR_OK);.}..C
26900 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
26910 4e 28 43 4b 5f 52 56 2c 20 43 5f 43 6c 6f 73 65  N(CK_RV, C_Close
26920 53 65 73 73 69 6f 6e 29 28 43 4b 5f 53 45 53 53  Session)(CK_SESS
26930 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
26940 69 6f 6e 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65  ion) {..int mute
26950 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b  x_retval;...CACK
26960 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
26970 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
26980 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
26990 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
269a0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
269b0 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
269c0 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
269d0 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
269e0 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
269f0 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53  ED);..}...if (hS
26a00 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68  ession == 0 || h
26a10 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65  Session >= (size
26a20 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
26a30 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63  ns) / sizeof(cac
26a40 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29  key_sessions[0])
26a50 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  )) {...CACKEY_DE
26a60 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
26a70 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20  r.  Session out 
26a80 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a  of range.");....
26a90 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53  ..return(CKR_SES
26aa0 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41  SION_HANDLE_INVA
26ab0 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78  LID);..}...mutex
26ac0 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
26ad0 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b  _mutex_lock(cack
26ae0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
26af0 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
26b00 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
26b10 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
26b20 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61  ror.  Locking fa
26b30 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
26b40 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
26b50 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  RROR);..}...if (
26b60 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  !cackey_sessions
26b70 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76  [hSession].activ
26b80 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75  e) {...cackey_mu
26b90 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
26ba0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43  y_biglock);....C
26bb0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
26bc0 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73  TF("Error.  Sess
26bd0 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22  ion not active."
26be0 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
26bf0 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  KR_SESSION_HANDL
26c00 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
26c10 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
26c20 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76  [hSession].activ
26c30 65 20 3d 20 30 3b 0a 09 63 61 63 6b 65 79 5f 66  e = 0;..cackey_f
26c40 72 65 65 5f 69 64 65 6e 74 69 74 69 65 73 28 63  ree_identities(c
26c50 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
26c60 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74  Session].identit
26c70 69 65 73 2c 20 63 61 63 6b 65 79 5f 73 65 73 73  ies, cackey_sess
26c80 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69  ions[hSession].i
26c90 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 29  dentities_count)
26ca0 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  ;...mutex_retval
26cb0 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
26cc0 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
26cd0 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
26ce0 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
26cf0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
26d00 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
26d10 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65   Unlocking faile
26d20 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
26d30 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
26d40 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  R);..}...CACKEY_
26d50 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
26d60 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28  turning CKR_OK (
26d70 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a  %i)", CKR_OK);..
26d80 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b  .return(CKR_OK);
26d90 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
26da0 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
26db0 43 6c 6f 73 65 41 6c 6c 53 65 73 73 69 6f 6e 73  CloseAllSessions
26dc0 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f  )(CK_SLOT_ID slo
26dd0 74 49 44 29 20 7b 0a 09 75 69 6e 74 33 32 5f 74  tID) {..uint32_t
26de0 20 69 64 78 3b 0a 09 69 6e 74 20 6d 75 74 65 78   idx;..int mutex
26df0 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45  _retval;...CACKE
26e00 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
26e10 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
26e20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
26e30 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
26e40 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
26e50 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
26e60 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
26e70 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
26e80 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
26e90 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f  D);..}...if (slo
26ea0 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49  tID < 0 || slotI
26eb0 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63  D >= (sizeof(cac
26ec0 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a  key_slots) / siz
26ed0 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
26ee0 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45  [0]))) {...CACKE
26ef0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
26f00 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73  Error. Invalid s
26f10 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25  lot requested (%
26f20 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20  lu), outside of 
26f30 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c  valid range", sl
26f40 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e  otID);....return
26f50 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56  (CKR_SLOT_ID_INV
26f60 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65  ALID);..}...mute
26f70 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
26f80 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63  y_mutex_lock(cac
26f90 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
26fa0 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
26fb0 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
26fc0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
26fd0 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66  rror.  Locking f
26fe0 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
26ff0 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
27000 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20  ERROR);..}...if 
27010 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c  (cackey_slots[sl
27020 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20  otID].active == 
27030 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
27040 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
27050 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20  r. Invalid slot 
27060 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c  requested (%lu),
27070 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e   slot not curren
27080 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f  tly active", slo
27090 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f  tID);....cackey_
270a0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
270b0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
270c0 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54  .return(CKR_SLOT
270d0 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  _ID_INVALID);..}
270e0 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b  ...for (idx = 0;
270f0 20 69 64 78 20 3c 20 28 73 69 7a 65 6f 66 28 63   idx < (sizeof(c
27100 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20  ackey_sessions) 
27110 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f  / sizeof(cackey_
27120 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 3b 20 69  sessions[0])); i
27130 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28 63 61  dx++) {...if (ca
27140 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64  ckey_sessions[id
27150 78 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 09  x].active) {....
27160 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69  if (cackey_sessi
27170 6f 6e 73 5b 69 64 78 5d 2e 73 6c 6f 74 49 44 20  ons[idx].slotID 
27180 21 3d 20 73 6c 6f 74 49 44 29 20 7b 0a 09 09 09  != slotID) {....
27190 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 7d 0a  .continue;....}.
271a0 0a 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  ....cackey_mutex
271b0 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
271c0 69 67 6c 6f 63 6b 29 3b 0a 09 09 09 43 5f 43 6c  iglock);....C_Cl
271d0 6f 73 65 53 65 73 73 69 6f 6e 28 69 64 78 29 3b  oseSession(idx);
271e0 0a 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  ....cackey_mutex
271f0 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  _lock(cackey_big
27200 6c 6f 63 6b 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09  lock);...}..}...
27210 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
27220 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
27230 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
27240 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
27250 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
27260 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
27270 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c  NTF("Error.  Unl
27280 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
27290 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
272a0 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
272b0 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
272c0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
272d0 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22  ing CKR_OK (%i)"
272e0 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74  , CKR_OK);...ret
272f0 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a  urn(CKR_OK);.}..
27300 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
27310 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 53  ON(CK_RV, C_GetS
27320 65 73 73 69 6f 6e 49 6e 66 6f 29 28 43 4b 5f 53  essionInfo)(CK_S
27330 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
27340 65 73 73 69 6f 6e 2c 20 43 4b 5f 53 45 53 53 49  ession, CK_SESSI
27350 4f 4e 5f 49 4e 46 4f 5f 50 54 52 20 70 49 6e 66  ON_INFO_PTR pInf
27360 6f 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f  o) {..int mutex_
27370 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59  retval;...CACKEY
27380 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
27390 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
273a0 70 49 6e 66 6f 20 3d 3d 20 4e 55 4c 4c 29 20 7b  pInfo == NULL) {
273b0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
273c0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70  PRINTF("Error. p
273d0 49 6e 66 6f 20 69 73 20 4e 55 4c 4c 2e 22 29 3b  Info is NULL.");
273e0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41  ....return(CKR_A
273f0 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09  RGUMENTS_BAD);..
27400 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  }...if (!cackey_
27410 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
27420 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
27430 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
27440 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
27450 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
27460 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
27470 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
27480 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20  if (hSession == 
27490 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d  0 || hSession >=
274a0 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
274b0 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65  sessions) / size
274c0 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
274d0 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43  ns[0]))) {...CAC
274e0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
274f0 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f  ("Error.  Sessio
27500 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22  n out of range."
27510 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
27520 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  KR_SESSION_HANDL
27530 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
27540 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
27550 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63  cackey_mutex_loc
27560 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
27570 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
27580 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
27590 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
275a0 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b  TF("Error.  Lock
275b0 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
275c0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
275d0 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
275e0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65  ..if (!cackey_se
275f0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
27600 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63  .active) {...cac
27610 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
27620 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
27630 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  ;....CACKEY_DEBU
27640 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
27650 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63    Session not ac
27660 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  tive.");......re
27670 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e  turn(CKR_SESSION
27680 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29  _HANDLE_INVALID)
27690 3b 0a 09 7d 0a 0a 09 70 49 6e 66 6f 2d 3e 73 6c  ;..}...pInfo->sl
276a0 6f 74 49 44 20 3d 20 63 61 63 6b 65 79 5f 73 65  otID = cackey_se
276b0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
276c0 2e 73 6c 6f 74 49 44 3b 0a 09 70 49 6e 66 6f 2d  .slotID;..pInfo-
276d0 3e 73 74 61 74 65 20 3d 20 63 61 63 6b 65 79 5f  >state = cackey_
276e0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
276f0 6e 5d 2e 73 74 61 74 65 3b 0a 09 70 49 6e 66 6f  n].state;..pInfo
27700 2d 3e 66 6c 61 67 73 20 3d 20 63 61 63 6b 65 79  ->flags = cackey
27710 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
27720 6f 6e 5d 2e 66 6c 61 67 73 3b 0a 09 70 49 6e 66  on].flags;..pInf
27730 6f 2d 3e 75 6c 44 65 76 69 63 65 45 72 72 6f 72  o->ulDeviceError
27740 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   = cackey_sessio
27750 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 75 6c 44  ns[hSession].ulD
27760 65 76 69 63 65 45 72 72 6f 72 3b 0a 0a 09 6d 75  eviceError;...mu
27770 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
27780 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
27790 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
277a0 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
277b0 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
277c0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
277d0 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63  F("Error.  Unloc
277e0 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
277f0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
27800 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
27810 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
27820 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
27830 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20  g CKR_OK (%i)", 
27840 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72  CKR_OK);...retur
27850 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b  n(CKR_OK);.}..CK
27860 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
27870 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 4f 70 65  (CK_RV, C_GetOpe
27880 72 61 74 69 6f 6e 53 74 61 74 65 29 28 43 4b 5f  rationState)(CK_
27890 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
278a0 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45  Session, CK_BYTE
278b0 5f 50 54 52 20 70 4f 70 65 72 61 74 69 6f 6e 53  _PTR pOperationS
278c0 74 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50  tate, CK_ULONG_P
278d0 54 52 20 70 75 6c 4f 70 65 72 61 74 69 6f 6e 53  TR pulOperationS
278e0 74 61 74 65 4c 65 6e 29 20 7b 0a 09 43 41 43 4b  tateLen) {..CACK
278f0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
27900 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
27910 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
27920 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
27930 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
27940 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
27950 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
27960 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
27970 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
27980 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
27990 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
279a0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
279b0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
279c0 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
279d0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
279e0 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
279f0 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
27a00 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
27a10 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
27a20 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 65 74  ION(CK_RV, C_Set
27a30 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 65 29 28  OperationState)(
27a40 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
27a50 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42  E hSession, CK_B
27a60 59 54 45 5f 50 54 52 20 70 4f 70 65 72 61 74 69  YTE_PTR pOperati
27a70 6f 6e 53 74 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e  onState, CK_ULON
27a80 47 20 75 6c 4f 70 65 72 61 74 69 6f 6e 53 74 61  G ulOperationSta
27a90 74 65 4c 65 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54  teLen, CK_OBJECT
27aa0 5f 48 41 4e 44 4c 45 20 68 45 6e 63 72 79 70 74  _HANDLE hEncrypt
27ab0 69 6f 6e 4b 65 79 2c 20 43 4b 5f 4f 42 4a 45 43  ionKey, CK_OBJEC
27ac0 54 5f 48 41 4e 44 4c 45 20 68 41 75 74 68 65 6e  T_HANDLE hAuthen
27ad0 74 69 63 61 74 69 6f 6e 4b 65 79 29 20 7b 0a 09  ticationKey) {..
27ae0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
27af0 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
27b00 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
27b10 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
27b20 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
27b30 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
27b40 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
27b50 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
27b60 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
27b70 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
27b80 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
27b90 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
27ba0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
27bb0 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
27bc0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
27bd0 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
27be0 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
27bf0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
27c00 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
27c10 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
27c20 5f 4c 6f 67 69 6e 4d 75 74 65 78 41 72 67 29 28  _LoginMutexArg)(
27c30 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
27c40 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 55  E hSession, CK_U
27c50 53 45 52 5f 54 59 50 45 20 75 73 65 72 54 79 70  SER_TYPE userTyp
27c60 65 2c 20 43 4b 5f 55 54 46 38 43 48 41 52 5f 50  e, CK_UTF8CHAR_P
27c70 54 52 20 70 50 69 6e 2c 20 43 4b 5f 55 4c 4f 4e  TR pPin, CK_ULON
27c80 47 20 75 6c 50 69 6e 4c 65 6e 2c 20 69 6e 74 20  G ulPinLen, int 
27c90 6c 6f 63 6b 5f 6d 75 74 65 78 29 20 7b 0a 09 43  lock_mutex) {..C
27ca0 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44  K_SLOT_ID slotID
27cb0 3b 0a 09 63 61 63 6b 65 79 5f 72 65 74 20 67 65  ;..cackey_ret ge
27cc0 74 5f 70 69 6e 5f 72 65 74 3b 0a 09 63 68 61 72  t_pin_ret;..char
27cd0 20 70 69 6e 62 75 66 5b 36 34 5d 3b 0a 09 69 6e   pinbuf[64];..in
27ce0 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a  t mutex_retval;.
27cf0 09 69 6e 74 20 74 72 69 65 73 5f 72 65 6d 61 69  .int tries_remai
27d00 6e 69 6e 67 3b 0a 09 69 6e 74 20 6c 6f 67 69 6e  ning;..int login
27d10 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  _ret;...CACKEY_D
27d20 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
27d30 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
27d40 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
27d50 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
27d60 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
27d70 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
27d80 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
27d90 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
27da0 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
27db0 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69  ..}...if (hSessi
27dc0 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73  on == 0 || hSess
27dd0 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63  ion >= (sizeof(c
27de0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20  ackey_sessions) 
27df0 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f  / sizeof(cackey_
27e00 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b  sessions[0]))) {
27e10 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
27e20 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
27e30 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72  Session out of r
27e40 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  ange.");......re
27e50 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e  turn(CKR_SESSION
27e60 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29  _HANDLE_INVALID)
27e70 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 73 65 72 54  ;..}...if (userT
27e80 79 70 65 20 21 3d 20 43 4b 55 5f 55 53 45 52 29  ype != CKU_USER)
27e90 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
27ea0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
27eb0 20 20 57 65 20 6f 6e 6c 79 20 73 75 70 70 6f 72    We only suppor
27ec0 74 20 55 53 45 52 20 6d 6f 64 65 2c 20 61 73 6b  t USER mode, ask
27ed0 65 64 20 66 6f 72 20 25 6c 75 20 6d 6f 64 65 2e  ed for %lu mode.
27ee0 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
27ef0 67 29 20 75 73 65 72 54 79 70 65 29 0a 0a 09 09  g) userType)....
27f00 72 65 74 75 72 6e 28 43 4b 52 5f 55 53 45 52 5f  return(CKR_USER_
27f10 54 59 50 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  TYPE_INVALID);..
27f20 7d 0a 0a 09 69 66 20 28 6c 6f 63 6b 5f 6d 75 74  }...if (lock_mut
27f30 65 78 29 20 7b 0a 09 09 6d 75 74 65 78 5f 72 65  ex) {...mutex_re
27f40 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
27f50 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  tex_lock(cackey_
27f60 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 69 66 20 28  biglock);...if (
27f70 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
27f80 30 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  0) {....CACKEY_D
27f90 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
27fa0 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69  or.  Locking fai
27fb0 6c 65 64 2e 22 29 3b 0a 0a 09 09 09 72 65 74 75  led.");.....retu
27fc0 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
27fd0 52 52 4f 52 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09  RROR);...}..}...
27fe0 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73  if (!cackey_sess
27ff0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61  ions[hSession].a
28000 63 74 69 76 65 29 20 7b 0a 09 09 69 66 20 28 6c  ctive) {...if (l
28010 6f 63 6b 5f 6d 75 74 65 78 29 20 7b 0a 09 09 09  ock_mutex) {....
28020 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
28030 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
28040 63 6b 29 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b  ck);...}....CACK
28050 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
28060 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e  "Error.  Session
28070 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a   not active.");.
28080 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
28090 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49  SESSION_HANDLE_I
280a0 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 73 6c  NVALID);..}...sl
280b0 6f 74 49 44 20 3d 20 63 61 63 6b 65 79 5f 73 65  otID = cackey_se
280c0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
280d0 2e 73 6c 6f 74 49 44 3b 0a 0a 09 69 66 20 28 73  .slotID;...if (s
280e0 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f  lotID < 0 || slo
280f0 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63  tID >= (sizeof(c
28100 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73  ackey_slots) / s
28110 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f  izeof(cackey_slo
28120 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43  ts[0]))) {...CAC
28130 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
28140 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64  ("Error. Invalid
28150 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20   slot requested 
28160 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f  (%lu), outside o
28170 66 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20  f valid range", 
28180 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 69 66 20 28  slotID);....if (
28190 6c 6f 63 6b 5f 6d 75 74 65 78 29 20 7b 0a 09 09  lock_mutex) {...
281a0 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
281b0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
281c0 6f 63 6b 29 3b 0a 09 09 7d 0a 0a 09 09 72 65 74  ock);...}....ret
281d0 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
281e0 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20  ERROR);..}...if 
281f0 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c  (cackey_slots[sl
28200 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20  otID].active == 
28210 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
28220 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
28230 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20  r. Invalid slot 
28240 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c  requested (%lu),
28250 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e   slot not curren
28260 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f  tly active", slo
28270 74 49 44 29 3b 0a 0a 09 09 69 66 20 28 6c 6f 63  tID);....if (loc
28280 6b 5f 6d 75 74 65 78 29 20 7b 0a 09 09 09 63 61  k_mutex) {....ca
28290 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
282a0 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
282b0 29 3b 0a 09 09 7d 0a 0a 09 09 72 65 74 75 72 6e  );...}....return
282c0 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
282d0 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61  OR);..}...if (ca
282e0 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64  ckey_pin_command
282f0 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 69 66   != NULL) {...if
28300 20 28 70 50 69 6e 20 21 3d 20 4e 55 4c 4c 29 20   (pPin != NULL) 
28310 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
28320 47 5f 50 52 49 4e 54 46 28 22 50 72 6f 74 65 63  G_PRINTF("Protec
28330 74 65 64 20 61 75 74 68 65 6e 74 69 63 61 74 69  ted authenticati
28340 6f 6e 20 70 61 74 68 20 69 6e 20 65 66 66 65 63  on path in effec
28350 74 20 61 6e 64 20 50 49 4e 20 70 72 6f 76 69 64  t and PIN provid
28360 65 64 20 21 3f 22 29 3b 0a 09 09 7d 0a 0a 09 09  ed !?");...}....
28370 67 65 74 5f 70 69 6e 5f 72 65 74 20 3d 20 63 61  get_pin_ret = ca
28380 63 6b 65 79 5f 67 65 74 5f 70 69 6e 28 70 69 6e  ckey_get_pin(pin
28390 62 75 66 29 3b 0a 0a 09 09 69 66 20 28 67 65 74  buf);....if (get
283a0 5f 70 69 6e 5f 72 65 74 20 21 3d 20 43 41 43 4b  _pin_ret != CACK
283b0 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a  EY_PCSC_S_OK) {.
283c0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
283d0 50 52 49 4e 54 46 28 22 63 61 63 6b 65 79 5f 67  PRINTF("cackey_g
283e0 65 74 5f 70 69 6e 28 29 20 72 65 74 75 72 6e 65  et_pin() returne
283f0 64 20 69 6e 20 66 61 69 6c 75 72 65 2c 20 61 73  d in failure, as
28400 73 75 6d 69 6e 67 20 74 68 65 20 50 49 4e 20 77  suming the PIN w
28410 61 73 20 69 6e 63 6f 72 72 65 63 74 2e 22 29 3b  as incorrect.");
28420 0a 0a 09 09 09 69 66 20 28 6c 6f 63 6b 5f 6d 75  .....if (lock_mu
28430 74 65 78 29 20 7b 0a 09 09 09 09 63 61 63 6b 65  tex) {.....cacke
28440 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
28450 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
28460 09 09 09 7d 0a 0a 09 09 09 72 65 74 75 72 6e 28  ...}.....return(
28470 43 4b 52 5f 50 49 4e 5f 49 4e 43 4f 52 52 45 43  CKR_PIN_INCORREC
28480 54 29 3b 0a 09 09 7d 0a 0a 09 09 70 50 69 6e 20  T);...}....pPin 
28490 3d 20 28 43 4b 5f 55 54 46 38 43 48 41 52 5f 50  = (CK_UTF8CHAR_P
284a0 54 52 29 20 70 69 6e 62 75 66 3b 0a 09 09 75 6c  TR) pinbuf;...ul
284b0 50 69 6e 4c 65 6e 20 3d 20 73 74 72 6c 65 6e 28  PinLen = strlen(
284c0 70 69 6e 62 75 66 29 3b 0a 09 7d 0a 0a 09 6c 6f  pinbuf);..}...lo
284d0 67 69 6e 5f 72 65 74 20 3d 20 63 61 63 6b 65 79  gin_ret = cackey
284e0 5f 6c 6f 67 69 6e 28 26 63 61 63 6b 65 79 5f 73  _login(&cackey_s
284f0 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c 20 70 50  lots[slotID], pP
28500 69 6e 2c 20 75 6c 50 69 6e 4c 65 6e 2c 20 26 74  in, ulPinLen, &t
28510 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 2c 20  ries_remaining, 
28520 33 29 3b 0a 09 69 66 20 28 6c 6f 67 69 6e 5f 72  3);..if (login_r
28530 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53  et != CACKEY_PCS
28540 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 69 66 20 28  C_S_OK) {...if (
28550 6c 6f 63 6b 5f 6d 75 74 65 78 29 20 7b 0a 09 09  lock_mutex) {...
28560 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
28570 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
28580 6f 63 6b 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 20  ock);...}....if 
28590 28 6c 6f 67 69 6e 5f 72 65 74 20 3d 3d 20 43 41  (login_ret == CA
285a0 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4c 4f 43 4b  CKEY_PCSC_E_LOCK
285b0 45 44 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  ED) {....CACKEY_
285c0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
285d0 72 6f 72 2e 20 20 54 6f 6b 65 6e 20 69 73 20 6c  ror.  Token is l
285e0 6f 63 6b 65 64 2e 22 29 3b 0a 0a 09 09 09 63 61  ocked.");.....ca
285f0 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
28600 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 7c  D].token_flags |
28610 3d 20 43 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 4c  = CKF_USER_PIN_L
28620 4f 43 4b 45 44 3b 0a 0a 09 09 09 43 41 43 4b 45  OCKED;.....CACKE
28630 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
28640 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 50 49  Returning CKR_PI
28650 4e 5f 4c 4f 43 4b 45 44 20 28 25 69 29 22 2c 20  N_LOCKED (%i)", 
28660 28 69 6e 74 29 20 43 4b 52 5f 50 49 4e 5f 4c 4f  (int) CKR_PIN_LO
28670 43 4b 45 44 29 3b 0a 0a 09 09 09 72 65 74 75 72  CKED);.....retur
28680 6e 28 43 4b 52 5f 50 49 4e 5f 4c 4f 43 4b 45 44  n(CKR_PIN_LOCKED
28690 29 3b 0a 09 09 7d 20 65 6c 73 65 20 69 66 20 28  );...} else if (
286a0 6c 6f 67 69 6e 5f 72 65 74 20 3d 3d 20 43 41 43  login_ret == CAC
286b0 4b 45 59 5f 50 43 53 43 5f 45 5f 42 41 44 50 49  KEY_PCSC_E_BADPI
286c0 4e 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  N) {....CACKEY_D
286d0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
286e0 6f 72 2e 20 20 49 6e 76 61 6c 69 64 20 50 49 4e  or.  Invalid PIN
286f0 2e 22 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f  .");.....cackey_
28700 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 74 6f  slots[slotID].to
28710 6b 65 6e 5f 66 6c 61 67 73 20 7c 3d 20 43 4b 46  ken_flags |= CKF
28720 5f 55 53 45 52 5f 50 49 4e 5f 43 4f 55 4e 54 5f  _USER_PIN_COUNT_
28730 4c 4f 57 3b 0a 0a 09 09 09 69 66 20 28 74 72 69  LOW;.....if (tri
28740 65 73 5f 72 65 6d 61 69 6e 69 6e 67 20 3d 3d 20  es_remaining == 
28750 31 29 20 7b 0a 09 09 09 09 63 61 63 6b 65 79 5f  1) {.....cackey_
28760 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 74 6f  slots[slotID].to
28770 6b 65 6e 5f 66 6c 61 67 73 20 7c 3d 20 43 4b 46  ken_flags |= CKF
28780 5f 55 53 45 52 5f 50 49 4e 5f 46 49 4e 41 4c 5f  _USER_PIN_FINAL_
28790 54 52 59 3b 0a 09 09 09 7d 0a 0a 09 09 09 43 41  TRY;....}.....CA
287a0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
287b0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
287c0 5f 50 49 4e 5f 49 4e 43 4f 52 52 45 43 54 20 28  _PIN_INCORRECT (
287d0 25 69 29 22 2c 20 28 69 6e 74 29 20 43 4b 52 5f  %i)", (int) CKR_
287e0 50 49 4e 5f 49 4e 43 4f 52 52 45 43 54 29 3b 0a  PIN_INCORRECT);.
287f0 0a 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 50  ....return(CKR_P
28800 49 4e 5f 49 4e 43 4f 52 52 45 43 54 29 3b 0a 09  IN_INCORRECT);..
28810 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  .}....CACKEY_DEB
28820 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
28830 2e 20 20 55 6e 6b 6e 6f 77 6e 20 65 72 72 6f 72  .  Unknown error
28840 20 72 65 74 75 72 6e 65 64 20 66 72 6f 6d 20 63   returned from c
28850 61 63 6b 65 79 5f 6c 6f 67 69 6e 28 29 20 28 25  ackey_login() (%
28860 69 29 22 2c 20 6c 6f 67 69 6e 5f 72 65 74 29 3b  i)", login_ret);
28870 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
28880 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
28890 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  }...cackey_slots
288a0 5b 73 6c 6f 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66  [slotID].token_f
288b0 6c 61 67 73 20 26 3d 20 7e 28 43 4b 46 5f 55 53  lags &= ~(CKF_US
288c0 45 52 5f 50 49 4e 5f 4c 4f 43 4b 45 44 20 7c 20  ER_PIN_LOCKED | 
288d0 43 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 43 4f 55  CKF_USER_PIN_COU
288e0 4e 54 5f 4c 4f 57 20 7c 20 43 4b 46 5f 4c 4f 47  NT_LOW | CKF_LOG
288f0 49 4e 5f 52 45 51 55 49 52 45 44 20 7c 20 43 4b  IN_REQUIRED | CK
28900 46 5f 55 53 45 52 5f 50 49 4e 5f 46 49 4e 41 4c  F_USER_PIN_FINAL
28910 5f 54 52 59 29 3b 0a 0a 09 63 61 63 6b 65 79 5f  _TRY);...cackey_
28920 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
28930 6e 5d 2e 73 74 61 74 65 20 3d 20 43 4b 53 5f 52  n].state = CKS_R
28940 4f 5f 55 53 45 52 5f 46 55 4e 43 54 49 4f 4e 53  O_USER_FUNCTIONS
28950 3b 0a 0a 09 69 66 20 28 6c 6f 63 6b 5f 6d 75 74  ;...if (lock_mut
28960 65 78 29 20 7b 0a 09 09 6d 75 74 65 78 5f 72 65  ex) {...mutex_re
28970 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
28980 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
28990 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 69 66  y_biglock);...if
289a0 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
289b0 3d 20 30 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  = 0) {....CACKEY
289c0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
289d0 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67  rror.  Unlocking
289e0 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 09   failed.");.....
289f0 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
28a00 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 09 7d 0a 09  AL_ERROR);...}..
28a10 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
28a20 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
28a30 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c  ng CKR_OK (%i)",
28a40 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75   CKR_OK);...retu
28a50 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43  rn(CKR_OK);.}..C
28a60 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
28a70 4e 28 43 4b 5f 52 56 2c 20 43 5f 4c 6f 67 69 6e  N(CK_RV, C_Login
28a80 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
28a90 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
28aa0 5f 55 53 45 52 5f 54 59 50 45 20 75 73 65 72 54  _USER_TYPE userT
28ab0 79 70 65 2c 20 43 4b 5f 55 54 46 38 43 48 41 52  ype, CK_UTF8CHAR
28ac0 5f 50 54 52 20 70 50 69 6e 2c 20 43 4b 5f 55 4c  _PTR pPin, CK_UL
28ad0 4f 4e 47 20 75 6c 50 69 6e 4c 65 6e 29 20 7b 0a  ONG ulPinLen) {.
28ae0 09 72 65 74 75 72 6e 28 43 5f 4c 6f 67 69 6e 4d  .return(C_LoginM
28af0 75 74 65 78 41 72 67 28 68 53 65 73 73 69 6f 6e  utexArg(hSession
28b00 2c 20 75 73 65 72 54 79 70 65 2c 20 70 50 69 6e  , userType, pPin
28b10 2c 20 75 6c 50 69 6e 4c 65 6e 2c 20 31 29 29 3b  , ulPinLen, 1));
28b20 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
28b30 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
28b40 4c 6f 67 6f 75 74 29 28 43 4b 5f 53 45 53 53 49  Logout)(CK_SESSI
28b50 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
28b60 6f 6e 29 20 7b 0a 09 43 4b 5f 53 4c 4f 54 5f 49  on) {..CK_SLOT_I
28b70 44 20 73 6c 6f 74 49 44 3b 0a 09 69 6e 74 20 6d  D slotID;..int m
28b80 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43  utex_retval;...C
28b90 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
28ba0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
28bb0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
28bc0 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
28bd0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
28be0 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
28bf0 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
28c00 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
28c10 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
28c20 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  LIZED);..}...if 
28c30 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c  (hSession == 0 |
28c40 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73  | hSession >= (s
28c50 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
28c60 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28  sions) / sizeof(
28c70 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
28c80 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59  0]))) {...CACKEY
28c90 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
28ca0 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f  rror.  Session o
28cb0 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a  ut of range.");.
28cc0 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
28cd0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49  SESSION_HANDLE_I
28ce0 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75  NVALID);..}...mu
28cf0 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
28d00 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63  key_mutex_lock(c
28d10 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
28d20 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
28d30 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
28d40 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
28d50 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67  "Error.  Locking
28d60 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
28d70 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
28d80 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69  L_ERROR);..}...i
28d90 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69  f (!cackey_sessi
28da0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63  ons[hSession].ac
28db0 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79  tive) {...cackey
28dc0 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
28dd0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
28de0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
28df0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
28e00 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76  ession not activ
28e10 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
28e20 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41  n(CKR_SESSION_HA
28e30 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
28e40 7d 0a 0a 09 73 6c 6f 74 49 44 20 3d 20 63 61 63  }...slotID = cac
28e50 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
28e60 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44 3b 0a 0a  ssion].slotID;..
28e70 09 69 66 20 28 73 6c 6f 74 49 44 20 3c 20 30 20  .if (slotID < 0 
28e80 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69  || slotID >= (si
28e90 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
28ea0 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
28eb0 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b  ey_slots[0]))) {
28ec0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
28ed0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49  PRINTF("Error. I
28ee0 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75  nvalid slot requ
28ef0 65 73 74 65 64 20 28 25 6c 75 29 2c 20 6f 75 74  ested (%lu), out
28f00 73 69 64 65 20 6f 66 20 76 61 6c 69 64 20 72 61  side of valid ra
28f10 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a  nge", slotID);..
28f20 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
28f30 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
28f40 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f  ..if (cackey_slo
28f50 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76  ts[slotID].activ
28f60 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  e == 0) {...CACK
28f70 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
28f80 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20  "Error. Invalid 
28f90 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28  slot requested (
28fa0 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63  %lu), slot not c
28fb0 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 22  urrently active"
28fc0 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61  , slotID);....ca
28fd0 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
28fe0 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
28ff0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
29000 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
29010 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73  ..}...cackey_ses
29020 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
29030 73 74 61 74 65 20 3d 20 43 4b 53 5f 52 4f 5f 50  state = CKS_RO_P
29040 55 42 4c 49 43 5f 53 45 53 53 49 4f 4e 3b 0a 0a  UBLIC_SESSION;..
29050 09 69 66 20 28 63 61 63 6b 65 79 5f 70 69 6e 5f  .if (cackey_pin_
29060 63 6f 6d 6d 61 6e 64 20 3d 3d 20 4e 55 4c 4c 29  command == NULL)
29070 20 7b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74   {...cackey_slot
29080 73 5b 73 6c 6f 74 49 44 5d 2e 74 6f 6b 65 6e 5f  s[slotID].token_
29090 66 6c 61 67 73 20 3d 20 43 4b 46 5f 4c 4f 47 49  flags = CKF_LOGI
290a0 4e 5f 52 45 51 55 49 52 45 44 3b 0a 09 7d 20 65  N_REQUIRED;..} e
290b0 6c 73 65 20 7b 0a 09 09 63 61 63 6b 65 79 5f 73  lse {...cackey_s
290c0 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 74 6f 6b  lots[slotID].tok
290d0 65 6e 5f 66 6c 61 67 73 20 3d 20 30 3b 0a 09 7d  en_flags = 0;..}
290e0 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
290f0 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  = cackey_mutex_u
29100 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
29110 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
29120 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
29130 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
29140 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
29150 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64  Unlocking failed
29160 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
29170 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
29180 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
29190 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
291a0 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25  urning CKR_OK (%
291b0 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09  i)", CKR_OK);...
291c0 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a  return(CKR_OK);.
291d0 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
291e0 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 43  CTION(CK_RV, C_C
291f0 72 65 61 74 65 4f 62 6a 65 63 74 29 28 43 4b 5f  reateObject)(CK_
29200 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
29210 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 41 54 54 52  Session, CK_ATTR
29220 49 42 55 54 45 5f 50 54 52 20 70 54 65 6d 70 6c  IBUTE_PTR pTempl
29230 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  ate, CK_ULONG ul
29240 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43 54  Count, CK_OBJECT
29250 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 4f 62  _HANDLE_PTR phOb
29260 6a 65 63 74 29 20 7b 0a 09 43 41 43 4b 45 59 5f  ject) {..CACKEY_
29270 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
29280 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
29290 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
292a0 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
292b0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
292c0 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
292d0 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
292e0 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
292f0 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
29300 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
29310 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
29320 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
29330 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
29340 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
29350 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
29360 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
29370 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
29380 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
29390 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
293a0 28 43 4b 5f 52 56 2c 20 43 5f 43 6f 70 79 4f 62  (CK_RV, C_CopyOb
293b0 6a 65 63 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e  ject)(CK_SESSION
293c0 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
293d0 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44  , CK_OBJECT_HAND
293e0 4c 45 20 68 4f 62 6a 65 63 74 2c 20 43 4b 5f 41  LE hObject, CK_A
293f0 54 54 52 49 42 55 54 45 5f 50 54 52 20 70 54 65  TTRIBUTE_PTR pTe
29400 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47  mplate, CK_ULONG
29410 20 75 6c 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a   ulCount, CK_OBJ
29420 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70  ECT_HANDLE_PTR p
29430 68 4e 65 77 4f 62 6a 65 63 74 29 20 7b 0a 09 43  hNewObject) {..C
29440 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
29450 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
29460 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
29470 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
29480 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
29490 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
294a0 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
294b0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
294c0 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
294d0 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
294e0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
294f0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
29500 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
29510 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
29520 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
29530 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
29540 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
29550 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
29560 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
29570 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
29580 44 65 73 74 72 6f 79 4f 62 6a 65 63 74 29 28 43  DestroyObject)(C
29590 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
295a0 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42   hSession, CK_OB
295b0 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4f 62 6a  JECT_HANDLE hObj
295c0 65 63 74 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  ect) {..CACKEY_D
295d0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
295e0 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
295f0 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
29600 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
29610 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
29620 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
29630 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
29640 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
29650 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
29660 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
29670 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
29680 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
29690 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
296a0 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
296b0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
296c0 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
296d0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
296e0 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
296f0 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
29700 43 4b 5f 52 56 2c 20 43 5f 47 65 74 4f 62 6a 65  CK_RV, C_GetObje
29710 63 74 53 69 7a 65 29 28 43 4b 5f 53 45 53 53 49  ctSize)(CK_SESSI
29720 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
29730 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41  on, CK_OBJECT_HA
29740 4e 44 4c 45 20 68 4f 62 6a 65 63 74 2c 20 43 4b  NDLE hObject, CK
29750 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 53 69  _ULONG_PTR pulSi
29760 7a 65 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  ze) {..CACKEY_DE
29770 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
29780 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
29790 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
297a0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
297b0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
297c0 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
297d0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
297e0 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
297f0 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
29800 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
29810 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
29820 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
29830 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
29840 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
29850 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
29860 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
29870 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
29880 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
29890 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
298a0 4b 5f 52 56 2c 20 43 5f 47 65 74 41 74 74 72 69  K_RV, C_GetAttri
298b0 62 75 74 65 56 61 6c 75 65 29 28 43 4b 5f 53 45  buteValue)(CK_SE
298c0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
298d0 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54  ssion, CK_OBJECT
298e0 5f 48 41 4e 44 4c 45 20 68 4f 62 6a 65 63 74 2c  _HANDLE hObject,
298f0 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54   CK_ATTRIBUTE_PT
29900 52 20 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f  R pTemplate, CK_
29910 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e 74 29 20 7b  ULONG ulCount) {
29920 0a 09 43 4b 5f 41 54 54 52 49 42 55 54 45 20 2a  ..CK_ATTRIBUTE *
29930 63 75 72 72 5f 61 74 74 72 3b 0a 09 73 74 72 75  curr_attr;..stru
29940 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69  ct cackey_identi
29950 74 79 20 2a 69 64 65 6e 74 69 74 79 3b 0a 09 75  ty *identity;..u
29960 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 69 64 65  nsigned long ide
29970 6e 74 69 74 79 5f 69 64 78 2c 20 61 74 74 72 5f  ntity_idx, attr_
29980 69 64 78 2c 20 73 65 73 73 5f 61 74 74 72 5f 69  idx, sess_attr_i
29990 64 78 2c 20 6e 75 6d 5f 69 64 73 3b 0a 09 69 6e  dx, num_ids;..in
299a0 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a  t mutex_retval;.
299b0 09 43 4b 5f 52 56 20 72 65 74 76 61 6c 20 3d 20  .CK_RV retval = 
299c0 43 4b 52 5f 4f 4b 3b 0a 09 43 4b 5f 56 4f 49 44  CKR_OK;..CK_VOID
299d0 5f 50 54 52 20 70 56 61 6c 75 65 3b 0a 09 43 4b  _PTR pValue;..CK
299e0 5f 55 4c 4f 4e 47 20 75 6c 56 61 6c 75 65 4c 65  _ULONG ulValueLe
299f0 6e 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  n;...CACKEY_DEBU
29a00 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
29a10 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
29a20 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
29a30 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
29a40 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
29a50 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
29a60 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
29a70 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
29a80 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
29a90 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20  ...if (hSession 
29aa0 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e  == 0 || hSession
29ab0 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b   >= (sizeof(cack
29ac0 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73  ey_sessions) / s
29ad0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
29ae0 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09  sions[0]))) {...
29af0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
29b00 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73  NTF("Error.  Ses
29b10 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67  sion out of rang
29b20 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
29b30 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41  n(CKR_SESSION_HA
29b40 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
29b50 7d 0a 0a 09 69 66 20 28 68 4f 62 6a 65 63 74 20  }...if (hObject 
29b60 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  == 0) {...CACKEY
29b70 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
29b80 72 72 6f 72 2e 20 20 4f 62 6a 65 63 74 20 68 61  rror.  Object ha
29b90 6e 64 6c 65 20 6f 75 74 20 6f 66 20 72 61 6e 67  ndle out of rang
29ba0 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
29bb0 6e 28 43 4b 52 5f 4f 42 4a 45 43 54 5f 48 41 4e  n(CKR_OBJECT_HAN
29bc0 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  DLE_INVALID);..}
29bd0 0a 0a 09 69 66 20 28 75 6c 43 6f 75 6e 74 20 3d  ...if (ulCount =
29be0 3d 20 30 29 20 7b 0a 09 09 2f 2a 20 53 68 6f 72  = 0) {.../* Shor
29bf0 74 20 63 69 72 63 75 69 74 2c 20 69 66 20 7a 65  t circuit, if ze
29c00 72 6f 20 6f 62 6a 65 63 74 73 20 77 65 72 65 20  ro objects were 
29c10 73 70 65 63 69 66 69 65 64 20 72 65 74 75 72 6e  specified return
29c20 20 7a 65 72 6f 20 69 74 65 6d 73 20 69 6d 6d 65   zero items imme
29c30 64 69 61 74 65 6c 79 20 2a 2f 0a 09 09 43 41 43  diately */...CAC
29c40 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
29c50 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
29c60 4f 4b 20 28 25 69 29 20 28 73 68 6f 72 74 20 63  OK (%i) (short c
29c70 69 72 63 75 69 74 29 22 2c 20 43 4b 52 5f 4f 4b  ircuit)", CKR_OK
29c80 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
29c90 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70  _OK);..}...if (p
29ca0 54 65 6d 70 6c 61 74 65 20 3d 3d 20 4e 55 4c 4c  Template == NULL
29cb0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
29cc0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
29cd0 2e 20 20 70 54 65 6d 70 6c 61 74 65 20 69 73 20  .  pTemplate is 
29ce0 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75  NULL.");....retu
29cf0 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53  rn(CKR_ARGUMENTS
29d00 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 64 65 6e  _BAD);..}...iden
29d10 74 69 74 79 5f 69 64 78 20 3d 20 68 4f 62 6a 65  tity_idx = hObje
29d20 63 74 20 2d 20 31 3b 0a 0a 09 6d 75 74 65 78 5f  ct - 1;...mutex_
29d30 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
29d40 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65  mutex_lock(cacke
29d50 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
29d60 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
29d70 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
29d80 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
29d90 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69  or.  Locking fai
29da0 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
29db0 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
29dc0 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21  ROR);..}...if (!
29dd0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
29de0 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65  hSession].active
29df0 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  ) {...cackey_mut
29e00 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
29e10 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41  _biglock);....CA
29e20 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
29e30 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69  F("Error.  Sessi
29e40 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29  on not active.")
29e50 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
29e60 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  R_SESSION_HANDLE
29e70 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
29e80 6e 75 6d 5f 69 64 73 20 3d 20 63 61 63 6b 65 79  num_ids = cackey
29e90 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
29ea0 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63  on].identities_c
29eb0 6f 75 6e 74 3b 0a 0a 09 69 66 20 28 69 64 65 6e  ount;...if (iden
29ec0 74 69 74 79 5f 69 64 78 20 3e 3d 20 6e 75 6d 5f  tity_idx >= num_
29ed0 69 64 73 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  ids) {...cackey_
29ee0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
29ef0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
29f00 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
29f10 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4f 62  INTF("Error.  Ob
29f20 6a 65 63 74 20 68 61 6e 64 6c 65 20 6f 75 74 20  ject handle out 
29f30 6f 66 20 72 61 6e 67 65 2e 20 20 69 64 65 6e 74  of range.  ident
29f40 69 74 79 5f 69 64 78 20 3d 20 25 6c 75 2c 20 6e  ity_idx = %lu, n
29f50 75 6d 5f 69 64 73 20 3d 20 25 6c 75 2e 22 2c 20  um_ids = %lu.", 
29f60 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
29f70 69 64 65 6e 74 69 74 79 5f 69 64 78 2c 20 28 75  identity_idx, (u
29f80 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 6e 75  nsigned long) nu
29f90 6d 5f 69 64 73 29 3b 0a 0a 09 09 72 65 74 75 72  m_ids);....retur
29fa0 6e 28 43 4b 52 5f 4f 42 4a 45 43 54 5f 48 41 4e  n(CKR_OBJECT_HAN
29fb0 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  DLE_INVALID);..}
29fc0 0a 0a 09 69 64 65 6e 74 69 74 79 20 3d 20 26 63  ...identity = &c
29fd0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
29fe0 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74  Session].identit
29ff0 69 65 73 5b 69 64 65 6e 74 69 74 79 5f 69 64 78  ies[identity_idx
2a000 5d 3b 0a 0a 09 66 6f 72 20 28 61 74 74 72 5f 69  ];...for (attr_i
2a010 64 78 20 3d 20 30 3b 20 61 74 74 72 5f 69 64 78  dx = 0; attr_idx
2a020 20 3c 20 75 6c 43 6f 75 6e 74 3b 20 61 74 74 72   < ulCount; attr
2a030 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 63 75 72 72  _idx++) {...curr
2a040 5f 61 74 74 72 20 3d 20 26 70 54 65 6d 70 6c 61  _attr = &pTempla
2a050 74 65 5b 61 74 74 72 5f 69 64 78 5d 3b 0a 0a 09  te[attr_idx];...
2a060 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a  .pValue = NULL;.
2a070 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 28  ..ulValueLen = (
2a080 43 4b 5f 4c 4f 4e 47 29 20 2d 31 3b 0a 0a 09 09  CK_LONG) -1;....
2a090 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2a0a0 4e 54 46 28 22 4c 6f 6f 6b 69 6e 67 20 66 6f 72  NTF("Looking for
2a0b0 20 61 74 74 72 69 62 75 74 65 20 30 78 25 30 38   attribute 0x%08
2a0c0 6c 78 20 28 69 64 65 6e 74 69 74 79 3a 25 6c 75  lx (identity:%lu
2a0d0 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65  ) ...", (unsigne
2a0e0 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74  d long) curr_att
2a0f0 72 2d 3e 74 79 70 65 2c 20 28 75 6e 73 69 67 6e  r->type, (unsign
2a100 65 64 20 6c 6f 6e 67 29 20 69 64 65 6e 74 69 74  ed long) identit
2a110 79 5f 69 64 78 29 3b 0a 0a 09 09 66 6f 72 20 28  y_idx);....for (
2a120 73 65 73 73 5f 61 74 74 72 5f 69 64 78 20 3d 20  sess_attr_idx = 
2a130 30 3b 20 73 65 73 73 5f 61 74 74 72 5f 69 64 78  0; sess_attr_idx
2a140 20 3c 20 69 64 65 6e 74 69 74 79 2d 3e 61 74 74   < identity->att
2a150 72 69 62 75 74 65 73 5f 63 6f 75 6e 74 3b 20 73  ributes_count; s
2a160 65 73 73 5f 61 74 74 72 5f 69 64 78 2b 2b 29 20  ess_attr_idx++) 
2a170 7b 0a 09 09 09 69 66 20 28 69 64 65 6e 74 69 74  {....if (identit
2a180 79 2d 3e 61 74 74 72 69 62 75 74 65 73 5b 73 65  y->attributes[se
2a190 73 73 5f 61 74 74 72 5f 69 64 78 5d 2e 74 79 70  ss_attr_idx].typ
2a1a0 65 20 3d 3d 20 63 75 72 72 5f 61 74 74 72 2d 3e  e == curr_attr->
2a1b0 74 79 70 65 29 20 7b 0a 09 09 09 09 43 41 43 4b  type) {.....CACK
2a1c0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2a1d0 22 20 2e 2e 2e 20 66 6f 75 6e 64 20 69 74 2c 20  " ... found it, 
2a1e0 70 56 61 6c 75 65 20 3d 20 25 70 2c 20 75 6c 56  pValue = %p, ulV
2a1f0 61 6c 75 65 4c 65 6e 20 3d 20 25 6c 75 22 2c 20  alueLen = %lu", 
2a200 69 64 65 6e 74 69 74 79 2d 3e 61 74 74 72 69 62  identity->attrib
2a210 75 74 65 73 5b 73 65 73 73 5f 61 74 74 72 5f 69  utes[sess_attr_i
2a220 64 78 5d 2e 70 56 61 6c 75 65 2c 20 69 64 65 6e  dx].pValue, iden
2a230 74 69 74 79 2d 3e 61 74 74 72 69 62 75 74 65 73  tity->attributes
2a240 5b 73 65 73 73 5f 61 74 74 72 5f 69 64 78 5d 2e  [sess_attr_idx].
2a250 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 09 09 09  ulValueLen);....
2a260 09 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 69  ......pValue = i
2a270 64 65 6e 74 69 74 79 2d 3e 61 74 74 72 69 62 75  dentity->attribu
2a280 74 65 73 5b 73 65 73 73 5f 61 74 74 72 5f 69 64  tes[sess_attr_id
2a290 78 5d 2e 70 56 61 6c 75 65 3b 0a 09 09 09 09 75  x].pValue;.....u
2a2a0 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 69 64 65 6e  lValueLen = iden
2a2b0 74 69 74 79 2d 3e 61 74 74 72 69 62 75 74 65 73  tity->attributes
2a2c0 5b 73 65 73 73 5f 61 74 74 72 5f 69 64 78 5d 2e  [sess_attr_idx].
2a2d0 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 09 09 09 7d  ulValueLen;....}
2a2e0 0a 09 09 7d 0a 0a 09 09 69 66 20 28 63 75 72 72  ...}....if (curr
2a2f0 5f 61 74 74 72 2d 3e 70 56 61 6c 75 65 20 26 26  _attr->pValue &&
2a300 20 70 56 61 6c 75 65 29 20 7b 0a 09 09 09 69 66   pValue) {....if
2a310 20 28 63 75 72 72 5f 61 74 74 72 2d 3e 75 6c 56   (curr_attr->ulV
2a320 61 6c 75 65 4c 65 6e 20 3e 3d 20 75 6c 56 61 6c  alueLen >= ulVal
2a330 75 65 4c 65 6e 29 20 7b 0a 09 09 09 09 6d 65 6d  ueLen) {.....mem
2a340 63 70 79 28 63 75 72 72 5f 61 74 74 72 2d 3e 70  cpy(curr_attr->p
2a350 56 61 6c 75 65 2c 20 70 56 61 6c 75 65 2c 20 75  Value, pValue, u
2a360 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 09 09 09 7d  lValueLen);....}
2a370 20 65 6c 73 65 20 7b 0a 09 09 09 09 75 6c 56 61   else {.....ulVa
2a380 6c 75 65 4c 65 6e 20 3d 20 28 43 4b 5f 4c 4f 4e  lueLen = (CK_LON
2a390 47 29 20 2d 31 3b 0a 0a 09 09 09 09 72 65 74 76  G) -1;......retv
2a3a0 61 6c 20 3d 20 43 4b 52 5f 42 55 46 46 45 52 5f  al = CKR_BUFFER_
2a3b0 54 4f 4f 5f 53 4d 41 4c 4c 3b 0a 09 09 09 7d 0a  TOO_SMALL;....}.
2a3c0 09 09 7d 0a 0a 09 09 63 75 72 72 5f 61 74 74 72  ..}....curr_attr
2a3d0 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 75  ->ulValueLen = u
2a3e0 6c 56 61 6c 75 65 4c 65 6e 3b 0a 09 7d 0a 0a 09  lValueLen;..}...
2a3f0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
2a400 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
2a410 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
2a420 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
2a430 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
2a440 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2a450 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c  NTF("Error.  Unl
2a460 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
2a470 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
2a480 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
2a490 09 7d 0a 0a 09 69 66 20 28 72 65 74 76 61 6c 20  .}...if (retval 
2a4a0 3d 3d 20 43 4b 52 5f 41 54 54 52 49 42 55 54 45  == CKR_ATTRIBUTE
2a4b0 5f 54 59 50 45 5f 49 4e 56 41 4c 49 44 29 20 7b  _TYPE_INVALID) {
2a4c0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2a4d0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
2a4e0 67 20 43 4b 52 5f 41 54 54 52 49 42 55 54 45 5f  g CKR_ATTRIBUTE_
2a4f0 54 59 50 45 5f 49 4e 56 41 4c 49 44 20 28 25 69  TYPE_INVALID (%i
2a500 29 22 2c 20 28 69 6e 74 29 20 72 65 74 76 61 6c  )", (int) retval
2a510 29 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 72  );..} else if (r
2a520 65 74 76 61 6c 20 3d 3d 20 43 4b 52 5f 42 55 46  etval == CKR_BUF
2a530 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 20 7b  FER_TOO_SMALL) {
2a540 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2a550 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
2a560 67 20 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f  g CKR_BUFFER_TOO
2a570 5f 53 4d 41 4c 4c 20 28 25 69 29 22 2c 20 28 69  _SMALL (%i)", (i
2a580 6e 74 29 20 72 65 74 76 61 6c 29 3b 0a 09 7d 20  nt) retval);..} 
2a590 65 6c 73 65 20 69 66 20 28 72 65 74 76 61 6c 20  else if (retval 
2a5a0 3d 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 43  == CKR_OK) {...C
2a5b0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2a5c0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
2a5d0 52 5f 4f 4b 20 28 25 69 29 22 2c 20 28 69 6e 74  R_OK (%i)", (int
2a5e0 29 20 72 65 74 76 61 6c 29 3b 0a 09 7d 20 65 6c  ) retval);..} el
2a5f0 73 65 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  se {...CACKEY_DE
2a600 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
2a610 72 6e 69 6e 67 20 25 69 22 2c 20 28 69 6e 74 29  rning %i", (int)
2a620 20 72 65 74 76 61 6c 29 3b 0a 09 7d 0a 0a 09 72   retval);..}...r
2a630 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d  eturn(retval);.}
2a640 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
2a650 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 65  TION(CK_RV, C_Se
2a660 74 41 74 74 72 69 62 75 74 65 56 61 6c 75 65 29  tAttributeValue)
2a670 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
2a680 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
2a690 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4f  OBJECT_HANDLE hO
2a6a0 62 6a 65 63 74 2c 20 43 4b 5f 41 54 54 52 49 42  bject, CK_ATTRIB
2a6b0 55 54 45 5f 50 54 52 20 70 54 65 6d 70 6c 61 74  UTE_PTR pTemplat
2a6c0 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f  e, CK_ULONG ulCo
2a6d0 75 6e 74 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  unt) {..CACKEY_D
2a6e0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
2a6f0 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
2a700 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
2a710 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
2a720 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2a730 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
2a740 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
2a750 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
2a760 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
2a770 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
2a780 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
2a790 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
2a7a0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
2a7b0 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
2a7c0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
2a7d0 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
2a7e0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
2a7f0 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
2a800 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
2a810 43 4b 5f 52 56 2c 20 43 5f 46 69 6e 64 4f 62 6a  CK_RV, C_FindObj
2a820 65 63 74 73 49 6e 69 74 29 28 43 4b 5f 53 45 53  ectsInit)(CK_SES
2a830 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
2a840 73 69 6f 6e 2c 20 43 4b 5f 41 54 54 52 49 42 55  sion, CK_ATTRIBU
2a850 54 45 5f 50 54 52 20 70 54 65 6d 70 6c 61 74 65  TE_PTR pTemplate
2a860 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f 75  , CK_ULONG ulCou
2a870 6e 74 29 20 7b 0a 09 43 4b 5f 53 4c 4f 54 5f 49  nt) {..CK_SLOT_I
2a880 44 20 73 6c 6f 74 49 44 3b 0a 09 43 4b 5f 55 4c  D slotID;..CK_UL
2a890 4f 4e 47 20 69 64 78 3b 0a 09 69 6e 74 20 6d 75  ONG idx;..int mu
2a8a0 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41  tex_retval;...CA
2a8b0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2a8c0 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
2a8d0 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
2a8e0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
2a8f0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2a900 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
2a910 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
2a920 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
2a930 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
2a940 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  IZED);..}...if (
2a950 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c  hSession == 0 ||
2a960 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69   hSession >= (si
2a970 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
2a980 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  ions) / sizeof(c
2a990 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30  ackey_sessions[0
2a9a0 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ]))) {...CACKEY_
2a9b0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2a9c0 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75  ror.  Session ou
2a9d0 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09  t of range.");..
2a9e0 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
2a9f0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e  ESSION_HANDLE_IN
2aa00 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74  VALID);..}...mut
2aa10 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
2aa20 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61  ey_mutex_lock(ca
2aa30 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
2aa40 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
2aa50 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
2aa60 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2aa70 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20  Error.  Locking 
2aa80 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
2aa90 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
2aaa0 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66  _ERROR);..}...if
2aab0 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   (!cackey_sessio
2aac0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74  ns[hSession].act
2aad0 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  ive) {...cackey_
2aae0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
2aaf0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
2ab00 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2ab10 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65  INTF("Error.  Se
2ab20 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65  ssion not active
2ab30 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
2ab40 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  (CKR_SESSION_HAN
2ab50 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  DLE_INVALID);..}
2ab60 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65  ...if (cackey_se
2ab70 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
2ab80 2e 73 65 61 72 63 68 5f 61 63 74 69 76 65 29 20  .search_active) 
2ab90 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  {...cackey_mutex
2aba0 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
2abb0 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b  iglock);....CACK
2abc0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2abd0 22 45 72 72 6f 72 2e 20 20 53 65 61 72 63 68 20  "Error.  Search 
2abe0 61 6c 72 65 61 64 79 20 61 63 74 69 76 65 2e 22  already active."
2abf0 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
2ac00 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 41 43 54  KR_OPERATION_ACT
2ac10 49 56 45 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 49  IVE);..}...slotI
2ac20 44 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69  D = cackey_sessi
2ac30 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 6c  ons[hSession].sl
2ac40 6f 74 49 44 3b 0a 0a 09 69 66 20 28 73 6c 6f 74  otID;...if (slot
2ac50 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44  ID < 0 || slotID
2ac60 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b   >= (sizeof(cack
2ac70 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65  ey_slots) / size
2ac80 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  of(cackey_slots[
2ac90 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59  0]))) {...CACKEY
2aca0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2acb0 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c  rror. Invalid sl
2acc0 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c  ot requested (%l
2acd0 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 76  u), outside of v
2ace0 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f  alid range", slo
2acf0 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  tID);....return(
2ad00 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
2ad10 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63  R);..}...if (cac
2ad20 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44  key_slots[slotID
2ad30 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 29 20 7b  ].active == 0) {
2ad40 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2ad50 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49  PRINTF("Error. I
2ad60 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75  nvalid slot requ
2ad70 65 73 74 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f  ested (%lu), slo
2ad80 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20  t not currently 
2ad90 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 29  active", slotID)
2ada0 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65  ;....cackey_mute
2adb0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
2adc0 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74  biglock);....ret
2add0 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
2ade0 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20  ERROR);..}...if 
2adf0 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c  (cackey_slots[sl
2ae00 6f 74 49 44 5d 2e 73 6c 6f 74 5f 72 65 73 65 74  otID].slot_reset
2ae10 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
2ae20 55 47 5f 50 52 49 4e 54 46 28 22 54 68 65 20 73  UG_PRINTF("The s
2ae30 6c 6f 74 20 68 61 73 20 62 65 65 6e 20 72 65 73  lot has been res
2ae40 65 74 20 73 69 6e 63 65 20 77 65 20 6c 61 73 74  et since we last
2ae50 20 6c 6f 6f 6b 65 64 20 66 6f 72 20 69 64 65 6e   looked for iden
2ae60 74 69 74 69 65 73 20 2d 2d 20 72 65 73 63 61 6e  tities -- rescan
2ae70 6e 69 6e 67 22 29 3b 0a 0a 09 09 69 66 20 28 63  ning");....if (c
2ae80 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
2ae90 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74  Session].identit
2aea0 69 65 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ies != NULL) {..
2aeb0 09 09 63 61 63 6b 65 79 5f 66 72 65 65 5f 69 64  ..cackey_free_id
2aec0 65 6e 74 69 74 69 65 73 28 63 61 63 6b 65 79 5f  entities(cackey_
2aed0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
2aee0 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 2c 20 63  n].identities, c
2aef0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
2af00 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74  Session].identit
2af10 69 65 73 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09 09  ies_count);.....
2af20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2af30 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69  hSession].identi
2af40 74 69 65 73 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09  ties = NULL;....
2af50 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2af60 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69  hSession].identi
2af70 74 69 65 73 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a  ties_count = 0;.
2af80 09 09 7d 0a 0a 09 09 69 66 20 28 63 61 63 6b 65  ..}....if (cacke
2af90 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e  y_slots[slotID].
2afa0 6c 61 62 65 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b  label != NULL) {
2afb0 0a 09 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f  ....free(cackey_
2afc0 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61  slots[slotID].la
2afd0 62 65 6c 29 3b 0a 09 09 09 63 61 63 6b 65 79 5f  bel);....cackey_
2afe0 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61  slots[slotID].la
2aff0 62 65 6c 20 3d 20 4e 55 4c 4c 3b 0a 09 09 7d 0a  bel = NULL;...}.
2b000 0a 09 09 63 61 63 6b 65 79 5f 6d 61 72 6b 5f 73  ...cackey_mark_s
2b010 6c 6f 74 5f 72 65 73 65 74 28 26 63 61 63 6b 65  lot_reset(&cacke
2b020 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 29  y_slots[slotID])
2b030 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ;...cackey_slots
2b040 5b 73 6c 6f 74 49 44 5d 2e 73 6c 6f 74 5f 72 65  [slotID].slot_re
2b050 73 65 74 20 3d 20 30 3b 0a 09 7d 0a 0a 09 69 66  set = 0;..}...if
2b060 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e   (cackey_session
2b070 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e  s[hSession].iden
2b080 74 69 74 69 65 73 20 3d 3d 20 4e 55 4c 4c 29 20  tities == NULL) 
2b090 7b 0a 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69  {...cackey_sessi
2b0a0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64  ons[hSession].id
2b0b0 65 6e 74 69 74 69 65 73 20 3d 20 63 61 63 6b 65  entities = cacke
2b0c0 79 5f 72 65 61 64 5f 69 64 65 6e 74 69 74 69 65  y_read_identitie
2b0d0 73 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  s(&cackey_slots[
2b0e0 73 6c 6f 74 49 44 5d 2c 20 26 63 61 63 6b 65 79  slotID], &cackey
2b0f0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
2b100 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63  on].identities_c
2b110 6f 75 6e 74 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  ount);..}...if (
2b120 70 54 65 6d 70 6c 61 74 65 20 21 3d 20 4e 55 4c  pTemplate != NUL
2b130 4c 29 20 7b 0a 09 09 69 66 20 28 75 6c 43 6f 75  L) {...if (ulCou
2b140 6e 74 20 21 3d 20 30 29 20 7b 0a 09 09 09 63 61  nt != 0) {....ca
2b150 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
2b160 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71  ession].search_q
2b170 75 65 72 79 5f 63 6f 75 6e 74 20 3d 20 75 6c 43  uery_count = ulC
2b180 6f 75 6e 74 3b 0a 09 09 09 63 61 63 6b 65 79 5f  ount;....cackey_
2b190 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
2b1a0 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 20  n].search_query 
2b1b0 3d 20 6d 61 6c 6c 6f 63 28 75 6c 43 6f 75 6e 74  = malloc(ulCount
2b1c0 20 2a 20 73 69 7a 65 6f 66 28 2a 70 54 65 6d 70   * sizeof(*pTemp
2b1d0 6c 61 74 65 29 29 3b 0a 0a 09 09 09 6d 65 6d 63  late));.....memc
2b1e0 70 79 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  py(cackey_sessio
2b1f0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61  ns[hSession].sea
2b200 72 63 68 5f 71 75 65 72 79 2c 20 70 54 65 6d 70  rch_query, pTemp
2b210 6c 61 74 65 2c 20 75 6c 43 6f 75 6e 74 20 2a 20  late, ulCount * 
2b220 73 69 7a 65 6f 66 28 2a 70 54 65 6d 70 6c 61 74  sizeof(*pTemplat
2b230 65 29 29 3b 0a 09 09 09 66 6f 72 20 28 69 64 78  e));....for (idx
2b240 20 3d 20 30 3b 20 69 64 78 20 3c 20 75 6c 43 6f   = 0; idx < ulCo
2b250 75 6e 74 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09  unt; idx++) {...
2b260 09 09 69 66 20 28 70 54 65 6d 70 6c 61 74 65 5b  ..if (pTemplate[
2b270 69 64 78 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e 20  idx].ulValueLen 
2b280 3d 3d 20 30 29 20 7b 0a 09 09 09 09 09 63 61 63  == 0) {......cac
2b290 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
2b2a0 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75  ssion].search_qu
2b2b0 65 72 79 5b 69 64 78 5d 2e 70 56 61 6c 75 65 20  ery[idx].pValue 
2b2c0 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09 09 63 6f  = NULL;.......co
2b2d0 6e 74 69 6e 75 65 3b 0a 09 09 09 09 7d 0a 0a 09  ntinue;.....}...
2b2e0 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
2b2f0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61  ns[hSession].sea
2b300 72 63 68 5f 71 75 65 72 79 5b 69 64 78 5d 2e 70  rch_query[idx].p
2b310 56 61 6c 75 65 20 3d 20 6d 61 6c 6c 6f 63 28 70  Value = malloc(p
2b320 54 65 6d 70 6c 61 74 65 5b 69 64 78 5d 2e 75 6c  Template[idx].ul
2b330 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09  ValueLen);......
2b340 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69  if (cackey_sessi
2b350 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65  ons[hSession].se
2b360 61 72 63 68 5f 71 75 65 72 79 5b 69 64 78 5d 2e  arch_query[idx].
2b370 70 56 61 6c 75 65 29 20 7b 0a 09 09 09 09 09 6d  pValue) {......m
2b380 65 6d 63 70 79 28 63 61 63 6b 65 79 5f 73 65 73  emcpy(cackey_ses
2b390 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
2b3a0 73 65 61 72 63 68 5f 71 75 65 72 79 5b 69 64 78  search_query[idx
2b3b0 5d 2e 70 56 61 6c 75 65 2c 20 70 54 65 6d 70 6c  ].pValue, pTempl
2b3c0 61 74 65 5b 69 64 78 5d 2e 70 56 61 6c 75 65 2c  ate[idx].pValue,
2b3d0 20 70 54 65 6d 70 6c 61 74 65 5b 69 64 78 5d 2e   pTemplate[idx].
2b3e0 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 09 09 09  ulValueLen);....
2b3f0 09 7d 0a 09 09 09 7d 0a 09 09 7d 20 65 6c 73 65  .}....}...} else
2b400 20 7b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73   {....cackey_ses
2b410 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
2b420 73 65 61 72 63 68 5f 71 75 65 72 79 5f 63 6f 75  search_query_cou
2b430 6e 74 20 3d 20 30 3b 0a 09 09 09 63 61 63 6b 65  nt = 0;....cacke
2b440 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
2b450 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72  ion].search_quer
2b460 79 20 3d 20 4e 55 4c 4c 3b 0a 09 09 7d 0a 09 7d  y = NULL;...}..}
2b470 20 65 6c 73 65 20 7b 0a 09 09 69 66 20 28 75 6c   else {...if (ul
2b480 43 6f 75 6e 74 20 21 3d 20 30 29 20 7b 0a 09 09  Count != 0) {...
2b490 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
2b4a0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
2b4b0 6f 63 6b 29 3b 0a 0a 09 09 09 43 41 43 4b 45 59  ock);.....CACKEY
2b4c0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2b4d0 72 72 6f 72 2e 20 20 53 65 61 72 63 68 20 71 75  rror.  Search qu
2b4e0 65 72 79 20 73 70 65 63 69 66 69 65 64 20 61 73  ery specified as
2b4f0 20 4e 55 4c 4c 2c 20 62 75 74 20 6e 75 6d 62 65   NULL, but numbe
2b500 72 20 6f 66 20 71 75 65 72 79 20 74 65 72 6d 73  r of query terms
2b510 20 6e 6f 74 20 73 70 65 63 69 66 69 65 64 20 61   not specified a
2b520 73 20 30 2e 22 29 3b 0a 0a 09 09 09 72 65 74 75  s 0.");.....retu
2b530 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53  rn(CKR_ARGUMENTS
2b540 5f 42 41 44 29 3b 0a 09 09 7d 0a 0a 09 09 63 61  _BAD);...}....ca
2b550 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
2b560 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71  ession].search_q
2b570 75 65 72 79 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a  uery_count = 0;.
2b580 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
2b590 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72  s[hSession].sear
2b5a0 63 68 5f 71 75 65 72 79 20 3d 20 4e 55 4c 4c 3b  ch_query = NULL;
2b5b0 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73  ..}...cackey_ses
2b5c0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
2b5d0 73 65 61 72 63 68 5f 61 63 74 69 76 65 20 3d 20  search_active = 
2b5e0 31 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69  1;..cackey_sessi
2b5f0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65  ons[hSession].se
2b600 61 72 63 68 5f 63 75 72 72 5f 69 64 20 3d 20 30  arch_curr_id = 0
2b610 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  ;...mutex_retval
2b620 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
2b630 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
2b640 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
2b650 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
2b660 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
2b670 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2b680 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65   Unlocking faile
2b690 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
2b6a0 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
2b6b0 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  R);..}...CACKEY_
2b6c0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
2b6d0 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28  turning CKR_OK (
2b6e0 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a  %i)", CKR_OK);..
2b6f0 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b  .return(CKR_OK);
2b700 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .}..static int c
2b710 61 63 6b 65 79 5f 70 6b 63 73 31 31 5f 63 6f 6d  ackey_pkcs11_com
2b720 70 61 72 65 5f 61 74 74 72 69 62 75 74 65 73 28  pare_attributes(
2b730 43 4b 5f 41 54 54 52 49 42 55 54 45 20 2a 61 2c  CK_ATTRIBUTE *a,
2b740 20 43 4b 5f 41 54 54 52 49 42 55 54 45 20 2a 62   CK_ATTRIBUTE *b
2b750 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68  ) {..unsigned ch
2b760 61 72 20 2a 73 6d 61 6c 6c 62 75 66 2c 20 2a 6c  ar *smallbuf, *l
2b770 61 72 67 65 62 75 66 3b 0a 09 73 69 7a 65 5f 74  argebuf;..size_t
2b780 20 73 6d 61 6c 6c 62 75 66 5f 6c 65 6e 2c 20 6c   smallbuf_len, l
2b790 61 72 67 65 62 75 66 5f 6c 65 6e 3b 0a 0a 09 69  argebuf_len;...i
2b7a0 66 20 28 61 2d 3e 74 79 70 65 20 21 3d 20 62 2d  f (a->type != b-
2b7b0 3e 74 79 70 65 29 20 7b 0a 09 09 72 65 74 75 72  >type) {...retur
2b7c0 6e 28 30 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  n(0);..}...CACKE
2b7d0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2b7e0 20 20 20 20 2e 2e 2e 20 66 6f 75 6e 64 20 6d 61      ... found ma
2b7f0 74 63 68 69 6e 67 20 74 79 70 65 20 2e 2e 2e 22  tching type ..."
2b800 29 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  );...CACKEY_DEBU
2b810 47 5f 50 52 49 4e 54 42 55 46 28 22 20 20 20 20  G_PRINTBUF("    
2b820 2e 2e 2e 20 6f 75 72 20 76 61 6c 75 65 3a 22 2c  ... our value:",
2b830 20 61 2d 3e 70 56 61 6c 75 65 2c 20 61 2d 3e 75   a->pValue, a->u
2b840 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 69 66  lValueLen);...if
2b850 20 28 62 2d 3e 70 56 61 6c 75 65 20 3d 3d 20 4e   (b->pValue == N
2b860 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
2b870 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 20  DEBUG_PRINTF("  
2b880 20 20 20 20 20 2e 2e 2e 20 66 6f 75 6e 64 20 77       ... found w
2b890 69 6c 64 63 61 72 64 20 6d 61 74 63 68 22 29 3b  ildcard match");
2b8a0 0a 0a 09 09 72 65 74 75 72 6e 28 31 29 3b 0a 09  ....return(1);..
2b8b0 7d 0a 0a 09 69 66 20 28 61 2d 3e 70 56 61 6c 75  }...if (a->pValu
2b8c0 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72  e == NULL) {...r
2b8d0 65 74 75 72 6e 28 30 29 3b 0a 09 7d 0a 0a 20 09  eturn(0);..}.. .
2b8e0 69 66 20 28 62 2d 3e 75 6c 56 61 6c 75 65 4c 65  if (b->ulValueLe
2b8f0 6e 20 3d 3d 20 61 2d 3e 75 6c 56 61 6c 75 65 4c  n == a->ulValueL
2b900 65 6e 20 26 26 20 6d 65 6d 63 6d 70 28 61 2d 3e  en && memcmp(a->
2b910 70 56 61 6c 75 65 2c 20 62 2d 3e 70 56 61 6c 75  pValue, b->pValu
2b920 65 2c 20 62 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e  e, b->ulValueLen
2b930 29 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  ) == 0) {...CACK
2b940 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2b950 22 20 20 20 20 20 20 20 2e 2e 2e 20 66 6f 75 6e  "       ... foun
2b960 64 20 65 78 61 63 74 20 6d 61 74 63 68 22 29 3b  d exact match");
2b970 0a 0a 09 09 72 65 74 75 72 6e 28 31 29 3b 0a 09  ....return(1);..
2b980 7d 0a 0a 09 73 77 69 74 63 68 20 28 61 2d 3e 74  }...switch (a->t
2b990 79 70 65 29 20 7b 0a 09 09 63 61 73 65 20 43 4b  ype) {...case CK
2b9a0 41 5f 4d 4f 44 55 4c 55 53 3a 0a 09 09 09 69 66  A_MODULUS:....if
2b9b0 20 28 61 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 20   (a->ulValueLen 
2b9c0 3d 3d 20 62 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e  == b->ulValueLen
2b9d0 29 20 7b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  ) {.....break;..
2b9e0 09 09 7d 0a 0a 09 09 09 69 66 20 28 61 2d 3e 75  ..}.....if (a->u
2b9f0 6c 56 61 6c 75 65 4c 65 6e 20 3e 20 62 2d 3e 75  lValueLen > b->u
2ba00 6c 56 61 6c 75 65 4c 65 6e 29 20 7b 0a 09 09 09  lValueLen) {....
2ba10 09 73 6d 61 6c 6c 62 75 66 20 3d 20 62 2d 3e 70  .smallbuf = b->p
2ba20 56 61 6c 75 65 3b 0a 09 09 09 09 73 6d 61 6c 6c  Value;.....small
2ba30 62 75 66 5f 6c 65 6e 20 3d 20 62 2d 3e 75 6c 56  buf_len = b->ulV
2ba40 61 6c 75 65 4c 65 6e 3b 0a 0a 09 09 09 09 6c 61  alueLen;......la
2ba50 72 67 65 62 75 66 20 3d 20 61 2d 3e 70 56 61 6c  rgebuf = a->pVal
2ba60 75 65 3b 0a 09 09 09 09 6c 61 72 67 65 62 75 66  ue;.....largebuf
2ba70 5f 6c 65 6e 20 3d 20 61 2d 3e 75 6c 56 61 6c 75  _len = a->ulValu
2ba80 65 4c 65 6e 3b 0a 09 09 09 7d 20 65 6c 73 65 20  eLen;....} else 
2ba90 7b 0a 09 09 09 09 73 6d 61 6c 6c 62 75 66 20 3d  {.....smallbuf =
2baa0 20 61 2d 3e 70 56 61 6c 75 65 3b 0a 09 09 09 09   a->pValue;.....
2bab0 73 6d 61 6c 6c 62 75 66 5f 6c 65 6e 20 3d 20 61  smallbuf_len = a
2bac0 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 0a 09  ->ulValueLen;...
2bad0 09 09 09 6c 61 72 67 65 62 75 66 20 3d 20 62 2d  ...largebuf = b-
2bae0 3e 70 56 61 6c 75 65 3b 0a 09 09 09 09 6c 61 72  >pValue;.....lar
2baf0 67 65 62 75 66 5f 6c 65 6e 20 3d 20 62 2d 3e 75  gebuf_len = b->u
2bb00 6c 56 61 6c 75 65 4c 65 6e 3b 0a 09 09 09 7d 0a  lValueLen;....}.
2bb10 0a 09 09 09 66 6f 72 20 28 3b 20 6c 61 72 67 65  ....for (; large
2bb20 62 75 66 5f 6c 65 6e 20 21 3d 20 73 6d 61 6c 6c  buf_len != small
2bb30 62 75 66 5f 6c 65 6e 3b 20 6c 61 72 67 65 62 75  buf_len; largebu
2bb40 66 2b 2b 2c 6c 61 72 67 65 62 75 66 5f 6c 65 6e  f++,largebuf_len
2bb50 2d 2d 29 20 7b 0a 09 09 09 09 69 66 20 28 6c 61  --) {.....if (la
2bb60 72 67 65 62 75 66 5b 30 5d 20 21 3d 20 30 29 20  rgebuf[0] != 0) 
2bb70 7b 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  {......break;...
2bb80 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20  ..}....}.....if 
2bb90 28 6c 61 72 67 65 62 75 66 5f 6c 65 6e 20 21 3d  (largebuf_len !=
2bba0 20 73 6d 61 6c 6c 62 75 66 5f 6c 65 6e 29 20 7b   smallbuf_len) {
2bbb0 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 7d  .....break;....}
2bbc0 0a 0a 09 09 09 69 66 20 28 6d 65 6d 63 6d 70 28  .....if (memcmp(
2bbd0 6c 61 72 67 65 62 75 66 2c 20 73 6d 61 6c 6c 62  largebuf, smallb
2bbe0 75 66 2c 20 73 6d 61 6c 6c 62 75 66 5f 6c 65 6e  uf, smallbuf_len
2bbf0 29 20 3d 3d 20 30 29 20 7b 0a 09 09 09 09 43 41  ) == 0) {.....CA
2bc00 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2bc10 46 28 22 20 20 20 20 20 20 20 2e 2e 2e 20 66 6f  F("       ... fo
2bc20 75 6e 64 20 61 70 70 72 6f 78 69 6d 61 74 65 20  und approximate 
2bc30 6d 61 74 63 68 22 29 3b 0a 0a 09 09 09 09 72 65  match");......re
2bc40 74 75 72 6e 28 31 29 3b 0a 09 09 09 7d 0a 0a 09  turn(1);....}...
2bc50 09 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 72 65  ..break;..}...re
2bc60 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a 43 4b 5f 44  turn(0);.}..CK_D
2bc70 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
2bc80 4b 5f 52 56 2c 20 43 5f 46 69 6e 64 4f 62 6a 65  K_RV, C_FindObje
2bc90 63 74 73 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  cts)(CK_SESSION_
2bca0 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
2bcb0 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c   CK_OBJECT_HANDL
2bcc0 45 5f 50 54 52 20 70 68 4f 62 6a 65 63 74 2c 20  E_PTR phObject, 
2bcd0 43 4b 5f 55 4c 4f 4e 47 20 75 6c 4d 61 78 4f 62  CK_ULONG ulMaxOb
2bce0 6a 65 63 74 43 6f 75 6e 74 2c 20 43 4b 5f 55 4c  jectCount, CK_UL
2bcf0 4f 4e 47 5f 50 54 52 20 70 75 6c 4f 62 6a 65 63  ONG_PTR pulObjec
2bd00 74 43 6f 75 6e 74 29 20 7b 0a 09 73 74 72 75 63  tCount) {..struc
2bd10 74 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 74  t cackey_identit
2bd20 79 20 2a 63 75 72 72 5f 69 64 3b 0a 09 43 4b 5f  y *curr_id;..CK_
2bd30 41 54 54 52 49 42 55 54 45 20 2a 63 75 72 72 5f  ATTRIBUTE *curr_
2bd40 61 74 74 72 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20  attr;..CK_ULONG 
2bd50 63 75 72 72 5f 69 64 5f 69 64 78 2c 20 63 75 72  curr_id_idx, cur
2bd60 72 5f 6f 75 74 5f 69 64 5f 69 64 78 2c 20 63 75  r_out_id_idx, cu
2bd70 72 72 5f 61 74 74 72 5f 69 64 78 2c 20 73 65 73  rr_attr_idx, ses
2bd80 73 5f 61 74 74 72 5f 69 64 78 3b 0a 09 43 4b 5f  s_attr_idx;..CK_
2bd90 55 4c 4f 4e 47 20 6d 61 74 63 68 65 64 5f 63 6f  ULONG matched_co
2bda0 75 6e 74 2c 20 70 72 65 76 5f 6d 61 74 63 68 65  unt, prev_matche
2bdb0 64 5f 63 6f 75 6e 74 3b 0a 09 69 6e 74 20 6d 75  d_count;..int mu
2bdc0 74 65 78 5f 72 65 74 76 61 6c 3b 0a 23 69 66 64  tex_retval;.#ifd
2bdd0 65 66 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ef CACKEY_DEBUG_
2bde0 53 45 41 52 43 48 5f 53 50 45 45 44 54 45 53 54  SEARCH_SPEEDTEST
2bdf0 0a 09 73 74 72 75 63 74 20 74 69 6d 65 76 61 6c  ..struct timeval
2be00 20 73 74 61 72 74 2c 20 65 6e 64 3b 0a 09 75 69   start, end;..ui
2be10 6e 74 36 34 5f 74 20 73 74 61 72 74 5f 69 6e 74  nt64_t start_int
2be20 2c 20 65 6e 64 5f 69 6e 74 3b 0a 23 65 6e 64 69  , end_int;.#endi
2be30 66 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  f...CACKEY_DEBUG
2be40 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
2be50 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
2be60 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
2be70 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2be80 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
2be90 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
2bea0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
2beb0 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
2bec0 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
2bed0 0a 09 69 66 20 28 70 75 6c 4f 62 6a 65 63 74 43  ..if (pulObjectC
2bee0 6f 75 6e 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  ount == NULL) {.
2bef0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2bf00 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 70  RINTF("Error.  p
2bf10 75 6c 4f 62 6a 65 63 74 43 6f 75 6e 74 20 69 73  ulObjectCount is
2bf20 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74   NULL.");....ret
2bf30 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54  urn(CKR_ARGUMENT
2bf40 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  S_BAD);..}...if 
2bf50 28 70 68 4f 62 6a 65 63 74 20 3d 3d 20 4e 55 4c  (phObject == NUL
2bf60 4c 20 26 26 20 75 6c 4d 61 78 4f 62 6a 65 63 74  L && ulMaxObject
2bf70 43 6f 75 6e 74 20 3d 3d 20 30 29 20 7b 0a 09 09  Count == 0) {...
2bf80 2f 2a 20 53 68 6f 72 74 20 63 69 72 63 75 69 74  /* Short circuit
2bf90 2c 20 69 66 20 7a 65 72 6f 20 6f 62 6a 65 63 74  , if zero object
2bfa0 73 20 77 65 72 65 20 73 70 65 63 69 66 69 65 64  s were specified
2bfb0 20 72 65 74 75 72 6e 20 7a 65 72 6f 20 69 74 65   return zero ite
2bfc0 6d 73 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 2a  ms immediately *
2bfd0 2f 0a 09 09 2a 70 75 6c 4f 62 6a 65 63 74 43 6f  /...*pulObjectCo
2bfe0 75 6e 74 20 3d 20 30 3b 0a 0a 09 09 43 41 43 4b  unt = 0;....CACK
2bff0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2c000 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
2c010 4b 20 28 25 69 29 20 28 73 68 6f 72 74 20 63 69  K (%i) (short ci
2c020 72 63 75 69 74 29 22 2c 20 43 4b 52 5f 4f 4b 29  rcuit)", CKR_OK)
2c030 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
2c040 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 68  OK);..}...if (ph
2c050 4f 62 6a 65 63 74 20 3d 3d 20 4e 55 4c 4c 29 20  Object == NULL) 
2c060 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
2c070 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2c080 20 70 68 4f 62 6a 65 63 74 20 69 73 20 4e 55 4c   phObject is NUL
2c090 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  L.");....return(
2c0a0 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41  CKR_ARGUMENTS_BA
2c0b0 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 6c 4d  D);..}...if (ulM
2c0c0 61 78 4f 62 6a 65 63 74 43 6f 75 6e 74 20 3d 3d  axObjectCount ==
2c0d0 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
2c0e0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2c0f0 6f 72 2e 20 20 4d 61 78 69 6d 75 6d 20 6e 75 6d  or.  Maximum num
2c100 62 65 72 20 6f 66 20 6f 62 6a 65 63 74 73 20 73  ber of objects s
2c110 70 65 63 69 66 69 65 64 20 61 73 20 7a 65 72 6f  pecified as zero
2c120 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
2c130 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44  KR_ARGUMENTS_BAD
2c140 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73  );..}...if (hSes
2c150 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65  sion == 0 || hSe
2c160 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66  ssion >= (sizeof
2c170 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
2c180 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
2c190 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29  y_sessions[0])))
2c1a0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
2c1b0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2c1c0 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66    Session out of
2c1d0 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09   range.");......
2c1e0 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
2c1f0 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  ON_HANDLE_INVALI
2c200 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  D);..}...mutex_r
2c210 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
2c220 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79  utex_lock(cackey
2c230 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
2c240 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
2c250 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
2c260 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2c270 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c  r.  Locking fail
2c280 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
2c290 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
2c2a0 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63  OR);..}...if (!c
2c2b0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
2c2c0 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29  Session].active)
2c2d0 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65   {...cackey_mute
2c2e0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
2c2f0 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43  biglock);....CAC
2c300 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2c310 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f  ("Error.  Sessio
2c320 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b  n not active.");
2c330 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
2c340 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
2c350 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69  INVALID);..}...i
2c360 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69  f (!cackey_sessi
2c370 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65  ons[hSession].se
2c380 61 72 63 68 5f 61 63 74 69 76 65 29 20 7b 0a 09  arch_active) {..
2c390 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
2c3a0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
2c3b0 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f  ock);....CACKEY_
2c3c0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2c3d0 72 6f 72 2e 20 20 53 65 61 72 63 68 20 6e 6f 74  ror.  Search not
2c3e0 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09   active.");.....
2c3f0 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52  .return(CKR_OPER
2c400 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41  ATION_NOT_INITIA
2c410 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 23 69 66 64  LIZED);..}..#ifd
2c420 65 66 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ef CACKEY_DEBUG_
2c430 53 45 41 52 43 48 5f 53 50 45 45 44 54 45 53 54  SEARCH_SPEEDTEST
2c440 0a 09 67 65 74 74 69 6d 65 6f 66 64 61 79 28 26  ..gettimeofday(&
2c450 73 74 61 72 74 2c 20 4e 55 4c 4c 29 3b 0a 23 65  start, NULL);.#e
2c460 6e 64 69 66 0a 0a 09 63 75 72 72 5f 6f 75 74 5f  ndif...curr_out_
2c470 69 64 5f 69 64 78 20 3d 20 30 3b 0a 09 66 6f 72  id_idx = 0;..for
2c480 20 28 63 75 72 72 5f 69 64 5f 69 64 78 20 3d 20   (curr_id_idx = 
2c490 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2c4a0 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68  hSession].search
2c4b0 5f 63 75 72 72 5f 69 64 3b 20 63 75 72 72 5f 69  _curr_id; curr_i
2c4c0 64 5f 69 64 78 20 3c 20 63 61 63 6b 65 79 5f 73  d_idx < cackey_s
2c4d0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
2c4e0 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75  ].identities_cou
2c4f0 6e 74 20 26 26 20 75 6c 4d 61 78 4f 62 6a 65 63  nt && ulMaxObjec
2c500 74 43 6f 75 6e 74 3b 20 63 75 72 72 5f 69 64 5f  tCount; curr_id_
2c510 69 64 78 2b 2b 29 20 7b 0a 09 09 63 75 72 72 5f  idx++) {...curr_
2c520 69 64 20 3d 20 26 63 61 63 6b 65 79 5f 73 65 73  id = &cackey_ses
2c530 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
2c540 69 64 65 6e 74 69 74 69 65 73 5b 63 75 72 72 5f  identities[curr_
2c550 69 64 5f 69 64 78 5d 3b 0a 0a 09 09 43 41 43 4b  id_idx];....CACK
2c560 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2c570 22 50 72 6f 63 65 73 73 69 6e 67 20 69 64 65 6e  "Processing iden
2c580 74 69 74 79 3a 25 6c 75 22 2c 20 28 75 6e 73 69  tity:%lu", (unsi
2c590 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f  gned long) curr_
2c5a0 69 64 5f 69 64 78 29 3b 0a 0a 09 09 6d 61 74 63  id_idx);....matc
2c5b0 68 65 64 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 0a  hed_count = 0;..
2c5c0 09 09 66 6f 72 20 28 63 75 72 72 5f 61 74 74 72  ..for (curr_attr
2c5d0 5f 69 64 78 20 3d 20 30 3b 20 63 75 72 72 5f 61  _idx = 0; curr_a
2c5e0 74 74 72 5f 69 64 78 20 3c 20 63 61 63 6b 65 79  ttr_idx < cackey
2c5f0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
2c600 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79  on].search_query
2c610 5f 63 6f 75 6e 74 3b 20 63 75 72 72 5f 61 74 74  _count; curr_att
2c620 72 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 09 70 72  r_idx++) {....pr
2c630 65 76 5f 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74  ev_matched_count
2c640 20 3d 20 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74   = matched_count
2c650 3b 0a 0a 09 09 09 63 75 72 72 5f 61 74 74 72 20  ;.....curr_attr 
2c660 3d 20 26 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  = &cackey_sessio
2c670 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61  ns[hSession].sea
2c680 72 63 68 5f 71 75 65 72 79 5b 63 75 72 72 5f 61  rch_query[curr_a
2c690 74 74 72 5f 69 64 78 5d 3b 0a 0a 09 09 09 43 41  ttr_idx];.....CA
2c6a0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2c6b0 46 28 22 20 20 43 68 65 63 6b 69 6e 67 20 66 6f  F("  Checking fo
2c6c0 72 20 61 74 74 72 69 62 75 74 65 20 25 73 20 28  r attribute %s (
2c6d0 30 78 25 30 38 6c 78 29 20 69 6e 20 69 64 65 6e  0x%08lx) in iden
2c6e0 74 69 74 79 3a 25 69 2e 2e 2e 22 2c 20 43 41 43  tity:%i...", CAC
2c6f0 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 41  KEY_DEBUG_FUNC_A
2c700 54 54 52 49 42 55 54 45 5f 54 4f 5f 53 54 52 28  TTRIBUTE_TO_STR(
2c710 63 75 72 72 5f 61 74 74 72 2d 3e 74 79 70 65 29  curr_attr->type)
2c720 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
2c730 29 20 63 75 72 72 5f 61 74 74 72 2d 3e 74 79 70  ) curr_attr->typ
2c740 65 2c 20 28 69 6e 74 29 20 63 75 72 72 5f 69 64  e, (int) curr_id
2c750 5f 69 64 78 29 3b 0a 09 09 09 43 41 43 4b 45 59  _idx);....CACKEY
2c760 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28  _DEBUG_PRINTBUF(
2c770 22 20 20 20 20 56 61 6c 75 65 20 6c 6f 6f 6b 69  "    Value looki
2c780 6e 67 20 66 6f 72 3a 22 2c 20 63 75 72 72 5f 61  ng for:", curr_a
2c790 74 74 72 2d 3e 70 56 61 6c 75 65 2c 20 63 75 72  ttr->pValue, cur
2c7a0 72 5f 61 74 74 72 2d 3e 75 6c 56 61 6c 75 65 4c  r_attr->ulValueL
2c7b0 65 6e 29 3b 0a 0a 09 09 09 66 6f 72 20 28 73 65  en);.....for (se
2c7c0 73 73 5f 61 74 74 72 5f 69 64 78 20 3d 20 30 3b  ss_attr_idx = 0;
2c7d0 20 73 65 73 73 5f 61 74 74 72 5f 69 64 78 20 3c   sess_attr_idx <
2c7e0 20 63 75 72 72 5f 69 64 2d 3e 61 74 74 72 69 62   curr_id->attrib
2c7f0 75 74 65 73 5f 63 6f 75 6e 74 3b 20 73 65 73 73  utes_count; sess
2c800 5f 61 74 74 72 5f 69 64 78 2b 2b 29 20 7b 0a 09  _attr_idx++) {..
2c810 09 09 09 69 66 20 28 63 61 63 6b 65 79 5f 70 6b  ...if (cackey_pk
2c820 63 73 31 31 5f 63 6f 6d 70 61 72 65 5f 61 74 74  cs11_compare_att
2c830 72 69 62 75 74 65 73 28 26 63 75 72 72 5f 69 64  ributes(&curr_id
2c840 2d 3e 61 74 74 72 69 62 75 74 65 73 5b 73 65 73  ->attributes[ses
2c850 73 5f 61 74 74 72 5f 69 64 78 5d 2c 20 63 75 72  s_attr_idx], cur
2c860 72 5f 61 74 74 72 29 29 20 7b 0a 09 09 09 09 09  r_attr)) {......
2c870 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 2b 2b 3b  matched_count++;
2c880 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .......break;...
2c890 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 09 2f 2a 20  ..}....}...../* 
2c8a0 49 66 20 74 68 65 20 61 74 74 72 69 62 75 74 65  If the attribute
2c8b0 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 6d 61   could not be ma
2c8c0 74 63 68 65 64 2c 20 64 6f 20 6e 6f 74 20 74 72  tched, do not tr
2c8d0 79 20 74 6f 20 6d 61 74 63 68 20 61 64 64 69 74  y to match addit
2c8e0 69 6f 6e 61 6c 20 61 74 74 72 69 62 75 74 65 73  ional attributes
2c8f0 20 2a 2f 0a 09 09 09 69 66 20 28 70 72 65 76 5f   */....if (prev_
2c900 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 20 3d 3d  matched_count ==
2c910 20 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 29 20   matched_count) 
2c920 7b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  {.....break;....
2c930 7d 0a 09 09 7d 0a 0a 09 09 69 66 20 28 6d 61 74  }...}....if (mat
2c940 63 68 65 64 5f 63 6f 75 6e 74 20 3d 3d 20 63 61  ched_count == ca
2c950 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
2c960 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71  ession].search_q
2c970 75 65 72 79 5f 63 6f 75 6e 74 29 20 7b 0a 09 09  uery_count) {...
2c980 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2c990 49 4e 54 46 28 22 20 20 2e 2e 2e 20 41 6c 6c 20  INTF("  ... All 
2c9a0 25 69 20 61 74 74 72 69 62 75 74 65 73 20 63 68  %i attributes ch
2c9b0 65 63 6b 65 64 20 66 6f 72 20 66 6f 75 6e 64 2c  ecked for found,
2c9c0 20 61 64 64 69 6e 67 20 69 64 65 6e 74 69 74 79   adding identity
2c9d0 3a 25 69 20 74 6f 20 72 65 74 75 72 6e 65 64 20  :%i to returned 
2c9e0 6c 69 73 74 22 2c 20 28 69 6e 74 29 20 63 61 63  list", (int) cac
2c9f0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
2ca00 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75  ssion].search_qu
2ca10 65 72 79 5f 63 6f 75 6e 74 2c 20 28 69 6e 74 29  ery_count, (int)
2ca20 20 63 75 72 72 5f 69 64 5f 69 64 78 29 3b 0a 0a   curr_id_idx);..
2ca30 09 09 09 70 68 4f 62 6a 65 63 74 5b 63 75 72 72  ...phObject[curr
2ca40 5f 6f 75 74 5f 69 64 5f 69 64 78 5d 20 3d 20 63  _out_id_idx] = c
2ca50 75 72 72 5f 69 64 5f 69 64 78 20 2b 20 31 3b 0a  urr_id_idx + 1;.
2ca60 0a 09 09 09 75 6c 4d 61 78 4f 62 6a 65 63 74 43  ....ulMaxObjectC
2ca70 6f 75 6e 74 2d 2d 3b 0a 0a 09 09 09 63 75 72 72  ount--;.....curr
2ca80 5f 6f 75 74 5f 69 64 5f 69 64 78 2b 2b 3b 0a 09  _out_id_idx++;..
2ca90 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 43 41 43  .} else {....CAC
2caa0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2cab0 28 22 20 20 2e 2e 2e 20 4e 6f 74 20 61 6c 6c 20  ("  ... Not all 
2cac0 25 69 20 28 6f 6e 6c 79 20 66 6f 75 6e 64 20 25  %i (only found %
2cad0 69 29 20 61 74 74 72 69 62 75 74 65 73 20 63 68  i) attributes ch
2cae0 65 63 6b 65 64 20 66 6f 72 20 66 6f 75 6e 64 2c  ecked for found,
2caf0 20 6e 6f 74 20 61 64 64 69 6e 67 20 69 64 65 6e   not adding iden
2cb00 74 69 74 79 3a 25 69 22 2c 20 28 69 6e 74 29 20  tity:%i", (int) 
2cb10 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2cb20 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68  hSession].search
2cb30 5f 71 75 65 72 79 5f 63 6f 75 6e 74 2c 20 28 69  _query_count, (i
2cb40 6e 74 29 20 6d 61 74 63 68 65 64 5f 63 6f 75 6e  nt) matched_coun
2cb50 74 2c 20 28 69 6e 74 29 20 63 75 72 72 5f 69 64  t, (int) curr_id
2cb60 5f 69 64 78 29 3b 0a 09 09 7d 0a 09 7d 0a 09 63  _idx);...}..}..c
2cb70 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
2cb80 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f  Session].search_
2cb90 63 75 72 72 5f 69 64 20 3d 20 63 75 72 72 5f 69  curr_id = curr_i
2cba0 64 5f 69 64 78 3b 0a 09 2a 70 75 6c 4f 62 6a 65  d_idx;..*pulObje
2cbb0 63 74 43 6f 75 6e 74 20 3d 20 63 75 72 72 5f 6f  ctCount = curr_o
2cbc0 75 74 5f 69 64 5f 69 64 78 3b 0a 0a 23 69 66 64  ut_id_idx;..#ifd
2cbd0 65 66 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ef CACKEY_DEBUG_
2cbe0 53 45 41 52 43 48 5f 53 50 45 45 44 54 45 53 54  SEARCH_SPEEDTEST
2cbf0 0a 09 67 65 74 74 69 6d 65 6f 66 64 61 79 28 26  ..gettimeofday(&
2cc00 65 6e 64 2c 20 4e 55 4c 4c 29 3b 0a 09 73 74 61  end, NULL);..sta
2cc10 72 74 5f 69 6e 74 20 3d 20 28 73 74 61 72 74 2e  rt_int = (start.
2cc20 74 76 5f 73 65 63 20 2a 20 31 30 30 30 30 30 30  tv_sec * 1000000
2cc30 29 20 2b 20 73 74 61 72 74 2e 74 76 5f 75 73 65  ) + start.tv_use
2cc40 63 3b 0a 09 65 6e 64 5f 69 6e 74 20 3d 20 28 65  c;..end_int = (e
2cc50 6e 64 2e 74 76 5f 73 65 63 20 2a 20 31 30 30 30  nd.tv_sec * 1000
2cc60 30 30 30 29 20 2b 20 65 6e 64 2e 74 76 5f 75 73  000) + end.tv_us
2cc70 65 63 3b 0a 09 66 70 72 69 6e 74 66 28 73 74 64  ec;..fprintf(std
2cc80 65 72 72 2c 20 22 53 65 61 72 63 68 20 74 6f 6f  err, "Search too
2cc90 6b 20 25 6c 75 20 6d 69 63 72 6f 73 65 63 6f 6e  k %lu microsecon
2cca0 64 73 5c 6e 22 2c 20 28 75 6e 73 69 67 6e 65 64  ds\n", (unsigned
2ccb0 20 6c 6f 6e 67 29 20 28 65 6e 64 5f 69 6e 74 20   long) (end_int 
2ccc0 2d 20 73 74 61 72 74 5f 69 6e 74 29 29 3b 0a 23  - start_int));.#
2ccd0 65 6e 64 69 66 0a 0a 09 6d 75 74 65 78 5f 72 65  endif...mutex_re
2cce0 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
2ccf0 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
2cd00 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
2cd10 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
2cd20 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
2cd30 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2cd40 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66  or.  Unlocking f
2cd50 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
2cd60 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
2cd70 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43  ERROR);..}...CAC
2cd80 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2cd90 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
2cda0 4f 4b 20 28 25 69 29 2c 20 6e 75 6d 20 6f 62 6a  OK (%i), num obj
2cdb0 65 63 74 73 20 3d 20 25 6c 75 22 2c 20 43 4b 52  ects = %lu", CKR
2cdc0 5f 4f 4b 2c 20 2a 70 75 6c 4f 62 6a 65 63 74 43  _OK, *pulObjectC
2cdd0 6f 75 6e 74 29 3b 0a 0a 09 72 65 74 75 72 6e 28  ount);...return(
2cde0 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44  CKR_OK);.}..CK_D
2cdf0 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
2ce00 4b 5f 52 56 2c 20 43 5f 46 69 6e 64 4f 62 6a 65  K_RV, C_FindObje
2ce10 63 74 73 46 69 6e 61 6c 29 28 43 4b 5f 53 45 53  ctsFinal)(CK_SES
2ce20 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
2ce30 73 69 6f 6e 29 20 7b 0a 09 43 4b 5f 55 4c 4f 4e  sion) {..CK_ULON
2ce40 47 20 69 64 78 3b 0a 09 69 6e 74 20 6d 75 74 65  G idx;..int mute
2ce50 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b  x_retval;...CACK
2ce60 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2ce70 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
2ce80 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
2ce90 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
2cea0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2ceb0 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
2cec0 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
2ced0 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
2cee0 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
2cef0 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53  ED);..}...if (hS
2cf00 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68  ession == 0 || h
2cf10 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65  Session >= (size
2cf20 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
2cf30 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63  ns) / sizeof(cac
2cf40 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29  key_sessions[0])
2cf50 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  )) {...CACKEY_DE
2cf60 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2cf70 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20  r.  Session out 
2cf80 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a  of range.");....
2cf90 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53  ..return(CKR_SES
2cfa0 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41  SION_HANDLE_INVA
2cfb0 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78  LID);..}...mutex
2cfc0 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
2cfd0 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b  _mutex_lock(cack
2cfe0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
2cff0 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
2d000 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
2d010 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2d020 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61  ror.  Locking fa
2d030 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
2d040 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
2d050 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  RROR);..}...if (
2d060 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  !cackey_sessions
2d070 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76  [hSession].activ
2d080 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75  e) {...cackey_mu
2d090 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
2d0a0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43  y_biglock);....C
2d0b0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2d0c0 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73  TF("Error.  Sess
2d0d0 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22  ion not active."
2d0e0 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
2d0f0 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  KR_SESSION_HANDL
2d100 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
2d110 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73  .if (!cackey_ses
2d120 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
2d130 73 65 61 72 63 68 5f 61 63 74 69 76 65 29 20 7b  search_active) {
2d140 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
2d150 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
2d160 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45  glock);....CACKE
2d170 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2d180 45 72 72 6f 72 2e 20 20 53 65 61 72 63 68 20 6e  Error.  Search n
2d190 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09  ot active.");...
2d1a0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50  ...return(CKR_OP
2d1b0 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54  ERATION_NOT_INIT
2d1c0 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 63  IALIZED);..}...c
2d1d0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
2d1e0 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f  Session].search_
2d1f0 61 63 74 69 76 65 20 3d 20 30 3b 0a 0a 09 66 6f  active = 0;...fo
2d200 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20  r (idx = 0; idx 
2d210 3c 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  < cackey_session
2d220 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72  s[hSession].sear
2d230 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74 3b 20  ch_query_count; 
2d240 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28 63  idx++) {...if (c
2d250 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
2d260 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f  Session].search_
2d270 71 75 65 72 79 5b 69 64 78 5d 2e 70 56 61 6c 75  query[idx].pValu
2d280 65 29 20 7b 0a 09 09 09 66 72 65 65 28 63 61 63  e) {....free(cac
2d290 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
2d2a0 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75  ssion].search_qu
2d2b0 65 72 79 5b 69 64 78 5d 2e 70 56 61 6c 75 65 29  ery[idx].pValue)
2d2c0 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28 63  ;...}..}...if (c
2d2d0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
2d2e0 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f  Session].search_
2d2f0 71 75 65 72 79 29 20 7b 0a 09 09 66 72 65 65 28  query) {...free(
2d300 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2d310 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68  hSession].search
2d320 5f 71 75 65 72 79 29 3b 0a 09 7d 0a 0a 09 6d 75  _query);..}...mu
2d330 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
2d340 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
2d350 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
2d360 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
2d370 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
2d380 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2d390 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63  F("Error.  Unloc
2d3a0 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
2d3b0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
2d3c0 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
2d3d0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2d3e0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
2d3f0 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20  g CKR_OK (%i)", 
2d400 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72  CKR_OK);...retur
2d410 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b  n(CKR_OK);.}..CK
2d420 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
2d430 28 43 4b 5f 52 56 2c 20 43 5f 45 6e 63 72 79 70  (CK_RV, C_Encryp
2d440 74 49 6e 69 74 29 28 43 4b 5f 53 45 53 53 49 4f  tInit)(CK_SESSIO
2d450 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
2d460 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f  n, CK_MECHANISM_
2d470 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20  PTR pMechanism, 
2d480 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45  CK_OBJECT_HANDLE
2d490 20 68 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59   hKey) {..CACKEY
2d4a0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
2d4b0 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
2d4c0 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
2d4d0 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
2d4e0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2d4f0 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
2d500 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
2d510 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
2d520 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
2d530 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
2d540 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
2d550 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
2d560 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
2d570 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
2d580 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
2d590 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
2d5a0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
2d5b0 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
2d5c0 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
2d5d0 4e 28 43 4b 5f 52 56 2c 20 43 5f 45 6e 63 72 79  N(CK_RV, C_Encry
2d5e0 70 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  pt)(CK_SESSION_H
2d5f0 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
2d600 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 44 61 74  CK_BYTE_PTR pDat
2d610 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 44 61  a, CK_ULONG ulDa
2d620 74 61 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  taLen, CK_BYTE_P
2d630 54 52 20 70 45 6e 63 72 79 70 74 65 64 44 61 74  TR pEncryptedDat
2d640 61 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20  a, CK_ULONG_PTR 
2d650 70 75 6c 45 6e 63 72 79 70 74 65 64 44 61 74 61  pulEncryptedData
2d660 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  Len) {..CACKEY_D
2d670 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
2d680 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
2d690 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
2d6a0 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
2d6b0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2d6c0 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
2d6d0 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
2d6e0 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
2d6f0 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
2d700 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
2d710 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
2d720 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
2d730 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
2d740 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
2d750 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
2d760 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
2d770 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
2d780 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
2d790 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
2d7a0 43 4b 5f 52 56 2c 20 43 5f 45 6e 63 72 79 70 74  CK_RV, C_Encrypt
2d7b0 55 70 64 61 74 65 29 28 43 4b 5f 53 45 53 53 49  Update)(CK_SESSI
2d7c0 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
2d7d0 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  on, CK_BYTE_PTR 
2d7e0 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20  pPart, CK_ULONG 
2d7f0 75 6c 50 61 72 74 4c 65 6e 2c 20 43 4b 5f 42 59  ulPartLen, CK_BY
2d800 54 45 5f 50 54 52 20 70 45 6e 63 72 79 70 74 65  TE_PTR pEncrypte
2d810 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f  dPart, CK_ULONG_
2d820 50 54 52 20 70 75 6c 45 6e 63 72 79 70 74 65 64  PTR pulEncrypted
2d830 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b  PartLen) {..CACK
2d840 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2d850 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
2d860 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
2d870 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
2d880 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2d890 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
2d8a0 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
2d8b0 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
2d8c0 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
2d8d0 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
2d8e0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
2d8f0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
2d900 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
2d910 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
2d920 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
2d930 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
2d940 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
2d950 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
2d960 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
2d970 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 45 6e 63  ION(CK_RV, C_Enc
2d980 72 79 70 74 46 69 6e 61 6c 29 28 43 4b 5f 53 45  ryptFinal)(CK_SE
2d990 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
2d9a0 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  ssion, CK_BYTE_P
2d9b0 54 52 20 70 4c 61 73 74 45 6e 63 72 79 70 74 65  TR pLastEncrypte
2d9c0 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f  dPart, CK_ULONG_
2d9d0 50 54 52 20 70 75 6c 4c 61 73 74 45 6e 63 72 79  PTR pulLastEncry
2d9e0 70 74 65 64 50 61 72 74 4c 65 6e 29 20 7b 0a 09  ptedPartLen) {..
2d9f0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2da00 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
2da10 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
2da20 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
2da30 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2da40 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
2da50 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
2da60 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
2da70 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
2da80 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
2da90 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2daa0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
2dab0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
2dac0 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
2dad0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
2dae0 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
2daf0 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
2db00 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
2db10 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
2db20 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
2db30 5f 44 65 63 72 79 70 74 49 6e 69 74 29 28 43 4b  _DecryptInit)(CK
2db40 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
2db50 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43  hSession, CK_MEC
2db60 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68  HANISM_PTR pMech
2db70 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54  anism, CK_OBJECT
2db80 5f 48 41 4e 44 4c 45 20 68 4b 65 79 29 20 7b 0a  _HANDLE hKey) {.
2db90 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61  .int mutex_retva
2dba0 6c 3b 0a 0a 09 68 4b 65 79 2d 2d 3b 0a 0a 09 43  l;...hKey--;...C
2dbb0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2dbc0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
2dbd0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
2dbe0 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
2dbf0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2dc00 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
2dc10 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
2dc20 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
2dc30 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
2dc40 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  LIZED);..}...if 
2dc50 28 70 4d 65 63 68 61 6e 69 73 6d 20 3d 3d 20 4e  (pMechanism == N
2dc60 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
2dc70 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2dc80 72 6f 72 2e 20 70 4d 65 63 68 61 6e 69 73 6d 20  ror. pMechanism 
2dc90 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72  is NULL.");....r
2dca0 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45  eturn(CKR_ARGUME
2dcb0 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69  NTS_BAD);..}...i
2dcc0 66 20 28 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d  f (pMechanism->m
2dcd0 65 63 68 61 6e 69 73 6d 20 21 3d 20 43 4b 4d 5f  echanism != CKM_
2dce0 52 53 41 5f 50 4b 43 53 29 20 7b 0a 09 09 43 41  RSA_PKCS) {...CA
2dcf0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2dd00 46 28 22 45 72 72 6f 72 2e 20 70 4d 65 63 68 61  F("Error. pMecha
2dd10 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d 20  nism->mechanism 
2dd20 6e 6f 74 20 73 70 65 63 69 66 69 65 64 20 61 73  not specified as
2dd30 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 22 29 3b   CKM_RSA_PKCS");
2dd40 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4d  ....return(CKR_M
2dd50 45 43 48 41 4e 49 53 4d 5f 50 41 52 41 4d 5f 49  ECHANISM_PARAM_I
2dd60 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66  NVALID);..}...if
2dd70 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20   (hSession == 0 
2dd80 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28  || hSession >= (
2dd90 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
2dda0 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66  ssions) / sizeof
2ddb0 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
2ddc0 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45  [0]))) {...CACKE
2ddd0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2dde0 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20  Error.  Session 
2ddf0 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b  out of range.");
2de00 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
2de10 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
2de20 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d  INVALID);..}...m
2de30 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
2de40 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28  ckey_mutex_lock(
2de50 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
2de60 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
2de70 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
2de80 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2de90 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e  ("Error.  Lockin
2dea0 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
2deb0 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
2dec0 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
2ded0 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73  if (!cackey_sess
2dee0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61  ions[hSession].a
2def0 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65  ctive) {...cacke
2df00 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
2df10 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
2df20 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2df30 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
2df40 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69  Session not acti
2df50 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ve.");......retu
2df60 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48  rn(CKR_SESSION_H
2df70 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a  ANDLE_INVALID);.
2df80 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f  .}...if (cackey_
2df90 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
2dfa0 6e 5d 2e 64 65 63 72 79 70 74 5f 61 63 74 69 76  n].decrypt_activ
2dfb0 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75  e) {...cackey_mu
2dfc0 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
2dfd0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43  y_biglock);....C
2dfe0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2dff0 54 46 28 22 45 72 72 6f 72 2e 20 20 44 65 63 72  TF("Error.  Decr
2e000 79 70 74 20 61 6c 72 65 61 64 79 20 69 6e 20 70  ypt already in p
2e010 72 6f 67 72 65 73 73 2e 22 29 3b 0a 09 09 0a 09  rogress.");.....
2e020 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52  .return(CKR_OPER
2e030 41 54 49 4f 4e 5f 41 43 54 49 56 45 29 3b 0a 09  ATION_ACTIVE);..
2e040 7d 0a 0a 09 69 66 20 28 68 4b 65 79 20 3e 3d 20  }...if (hKey >= 
2e050 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2e060 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69  hSession].identi
2e070 74 69 65 73 5f 63 6f 75 6e 74 29 20 7b 0a 09 09  ties_count) {...
2e080 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
2e090 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
2e0a0 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ck);....CACKEY_D
2e0b0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2e0c0 6f 72 2e 20 20 4b 65 79 20 68 61 6e 64 6c 65 20  or.  Key handle 
2e0d0 6f 75 74 20 6f 66 20 72 61 6e 67 65 20 28 72 65  out of range (re
2e0e0 71 75 65 73 74 65 64 20 6b 65 79 20 25 6c 75 2c  quested key %lu,
2e0f0 20 6f 6e 6c 79 20 25 6c 75 20 69 64 65 6e 74 69   only %lu identi
2e100 74 69 65 73 20 61 76 61 69 6c 61 62 6c 65 29 2e  ties available).
2e110 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
2e120 67 29 20 68 4b 65 79 2c 20 28 75 6e 73 69 67 6e  g) hKey, (unsign
2e130 65 64 20 6c 6f 6e 67 29 20 63 61 63 6b 65 79 5f  ed long) cackey_
2e140 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
2e150 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 6f  n].identities_co
2e160 75 6e 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  unt);....return(
2e170 43 4b 52 5f 4b 45 59 5f 48 41 4e 44 4c 45 5f 49  CKR_KEY_HANDLE_I
2e180 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 63 61  NVALID);..}...ca
2e190 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
2e1a0 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f  ession].decrypt_
2e1b0 61 63 74 69 76 65 20 3d 20 31 3b 0a 0a 09 63 61  active = 1;...ca
2e1c0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
2e1d0 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f  ession].decrypt_
2e1e0 6d 65 63 68 61 6e 69 73 6d 20 3d 20 70 4d 65 63  mechanism = pMec
2e1f0 68 61 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e 69 73  hanism->mechanis
2e200 6d 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69  m;..cackey_sessi
2e210 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65  ons[hSession].de
2e220 63 72 79 70 74 5f 6d 65 63 68 5f 70 61 72 6d 20  crypt_mech_parm 
2e230 3d 20 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 70 50  = pMechanism->pP
2e240 61 72 61 6d 65 74 65 72 3b 0a 09 63 61 63 6b 65  arameter;..cacke
2e250 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
2e260 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 6d 65 63  ion].decrypt_mec
2e270 68 5f 70 61 72 6d 6c 65 6e 20 3d 20 70 4d 65 63  h_parmlen = pMec
2e280 68 61 6e 69 73 6d 2d 3e 75 6c 50 61 72 61 6d 65  hanism->ulParame
2e290 74 65 72 4c 65 6e 3b 0a 09 63 61 63 6b 65 79 5f  terLen;..cackey_
2e2a0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
2e2b0 6e 5d 2e 64 65 63 72 79 70 74 5f 69 64 65 6e 74  n].decrypt_ident
2e2c0 69 74 79 20 3d 20 26 63 61 63 6b 65 79 5f 73 65  ity = &cackey_se
2e2d0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
2e2e0 2e 69 64 65 6e 74 69 74 69 65 73 5b 68 4b 65 79  .identities[hKey
2e2f0 5d 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  ];...mutex_retva
2e300 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
2e310 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
2e320 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
2e330 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
2e340 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
2e350 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2e360 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c    Unlocking fail
2e370 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
2e380 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
2e390 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  OR);..}...CACKEY
2e3a0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
2e3b0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20  eturning CKR_OK 
2e3c0 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a  (%i)", CKR_OK);.
2e3d0 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29  ..return(CKR_OK)
2e3e0 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
2e3f0 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
2e400 5f 44 65 63 72 79 70 74 29 28 43 4b 5f 53 45 53  _Decrypt)(CK_SES
2e410 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
2e420 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  sion, CK_BYTE_PT
2e430 52 20 70 45 6e 63 72 79 70 74 65 64 44 61 74 61  R pEncryptedData
2e440 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 45 6e 63  , CK_ULONG ulEnc
2e450 72 79 70 74 65 64 44 61 74 61 4c 65 6e 2c 20 43  ryptedDataLen, C
2e460 4b 5f 42 59 54 45 5f 50 54 52 20 70 44 61 74 61  K_BYTE_PTR pData
2e470 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70  , CK_ULONG_PTR p
2e480 75 6c 44 61 74 61 4c 65 6e 29 20 7b 0a 09 43 4b  ulDataLen) {..CK
2e490 5f 55 4c 4f 4e 47 20 64 61 74 61 6c 65 6e 5f 75  _ULONG datalen_u
2e4a0 70 64 61 74 65 2c 20 64 61 74 61 6c 65 6e 5f 66  pdate, datalen_f
2e4b0 69 6e 61 6c 3b 0a 09 43 4b 5f 52 56 20 64 65 63  inal;..CK_RV dec
2e4c0 72 79 70 74 5f 72 65 74 3b 0a 09 69 6e 74 20 6d  rypt_ret;..int m
2e4d0 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43  utex_retval;...C
2e4e0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2e4f0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
2e500 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
2e510 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
2e520 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2e530 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
2e540 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
2e550 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
2e560 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
2e570 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  LIZED);..}...if 
2e580 28 70 75 6c 44 61 74 61 4c 65 6e 20 3d 3d 20 4e  (pulDataLen == N
2e590 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
2e5a0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2e5b0 72 6f 72 2e 20 70 75 6c 44 61 74 61 4c 65 6e 20  ror. pulDataLen 
2e5c0 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72  is NULL.");....r
2e5d0 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45  eturn(CKR_ARGUME
2e5e0 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 64  NTS_BAD);..}...d
2e5f0 61 74 61 6c 65 6e 5f 75 70 64 61 74 65 20 3d 20  atalen_update = 
2e600 2a 70 75 6c 44 61 74 61 4c 65 6e 3b 0a 0a 09 64  *pulDataLen;...d
2e610 65 63 72 79 70 74 5f 72 65 74 20 3d 20 43 5f 44  ecrypt_ret = C_D
2e620 65 63 72 79 70 74 55 70 64 61 74 65 28 68 53 65  ecryptUpdate(hSe
2e630 73 73 69 6f 6e 2c 20 70 45 6e 63 72 79 70 74 65  ssion, pEncrypte
2e640 64 44 61 74 61 2c 20 75 6c 45 6e 63 72 79 70 74  dData, ulEncrypt
2e650 65 64 44 61 74 61 4c 65 6e 2c 20 70 44 61 74 61  edDataLen, pData
2e660 2c 20 26 64 61 74 61 6c 65 6e 5f 75 70 64 61 74  , &datalen_updat
2e670 65 29 3b 0a 09 69 66 20 28 64 65 63 72 79 70 74  e);..if (decrypt
2e680 5f 72 65 74 20 21 3d 20 43 4b 52 5f 4f 4b 29 20  _ret != CKR_OK) 
2e690 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
2e6a0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2e6b0 20 44 65 63 72 79 70 74 55 70 64 61 74 65 28 29   DecryptUpdate()
2e6c0 20 72 65 74 75 72 6e 65 64 20 66 61 69 6c 75 72   returned failur
2e6d0 65 20 28 72 76 20 3d 20 25 6c 75 29 2e 22 2c 20  e (rv = %lu).", 
2e6e0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
2e6f0 64 65 63 72 79 70 74 5f 72 65 74 29 3b 0a 0a 09  decrypt_ret);...
2e700 09 69 66 20 28 64 65 63 72 79 70 74 5f 72 65 74  .if (decrypt_ret
2e710 20 21 3d 20 43 4b 52 5f 42 55 46 46 45 52 5f 54   != CKR_BUFFER_T
2e720 4f 4f 5f 53 4d 41 4c 4c 29 20 7b 0a 09 09 09 2f  OO_SMALL) {..../
2e730 2a 20 54 65 72 6d 69 6e 61 74 65 20 64 65 63 72  * Terminate decr
2e740 79 70 74 69 6f 6e 20 6f 70 65 72 61 74 69 6f 6e  yption operation
2e750 20 2a 2f 0a 0a 09 09 09 6d 75 74 65 78 5f 72 65   */.....mutex_re
2e760 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
2e770 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  tex_lock(cackey_
2e780 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 09 69 66 20  biglock);....if 
2e790 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
2e7a0 20 30 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59   0) {.....CACKEY
2e7b0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2e7c0 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66  rror.  Locking f
2e7d0 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 09 09 72  ailed.");......r
2e7e0 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
2e7f0 4c 5f 45 52 52 4f 52 29 3b 0a 09 09 09 7d 0a 0a  L_ERROR);....}..
2e800 09 09 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73  ...if (!cackey_s
2e810 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
2e820 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 09 09  ].active) {.....
2e830 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
2e840 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
2e850 63 6b 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59  ck);......CACKEY
2e860 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2e870 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e  rror.  Session n
2e880 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09  ot active.");...
2e890 0a 09 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
2e8a0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49  SESSION_HANDLE_I
2e8b0 4e 56 41 4c 49 44 29 3b 0a 09 09 09 7d 0a 0a 09  NVALID);....}...
2e8c0 09 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65  ..if (!cackey_se
2e8d0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
2e8e0 2e 64 65 63 72 79 70 74 5f 61 63 74 69 76 65 29  .decrypt_active)
2e8f0 20 7b 0a 09 09 09 09 63 61 63 6b 65 79 5f 6d 75   {.....cackey_mu
2e900 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
2e910 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 09  y_biglock);.....
2e920 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2e930 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 44 65  INTF("Error.  De
2e940 63 72 79 70 74 20 6e 6f 74 20 61 63 74 69 76 65  crypt not active
2e950 2e 22 29 3b 0a 09 09 0a 09 09 09 09 72 65 74 75  .");........retu
2e960 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e  rn(CKR_OPERATION
2e970 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
2e980 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 63 61 63 6b  );....}.....cack
2e990 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
2e9a0 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 61 63  sion].decrypt_ac
2e9b0 74 69 76 65 20 3d 20 30 3b 0a 0a 09 09 09 6d 75  tive = 0;.....mu
2e9c0 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
2e9d0 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
2e9e0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
2e9f0 3b 0a 09 09 09 69 66 20 28 6d 75 74 65 78 5f 72  ;....if (mutex_r
2ea00 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
2ea10 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2ea20 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55  RINTF("Error.  U
2ea30 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e  nlocking failed.
2ea40 22 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28  ");......return(
2ea50 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
2ea60 52 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09  R);....}...}....
2ea70 72 65 74 75 72 6e 28 64 65 63 72 79 70 74 5f 72  return(decrypt_r
2ea80 65 74 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 44  et);..}...if (pD
2ea90 61 74 61 29 20 7b 0a 09 09 70 44 61 74 61 20 2b  ata) {...pData +
2eaa0 3d 20 64 61 74 61 6c 65 6e 5f 75 70 64 61 74 65  = datalen_update
2eab0 3b 0a 09 7d 0a 09 64 61 74 61 6c 65 6e 5f 66 69  ;..}..datalen_fi
2eac0 6e 61 6c 20 3d 20 2a 70 75 6c 44 61 74 61 4c 65  nal = *pulDataLe
2ead0 6e 20 2d 20 64 61 74 61 6c 65 6e 5f 75 70 64 61  n - datalen_upda
2eae0 74 65 3b 0a 0a 09 64 65 63 72 79 70 74 5f 72 65  te;...decrypt_re
2eaf0 74 20 3d 20 43 5f 44 65 63 72 79 70 74 46 69 6e  t = C_DecryptFin
2eb00 61 6c 28 68 53 65 73 73 69 6f 6e 2c 20 70 44 61  al(hSession, pDa
2eb10 74 61 2c 20 26 64 61 74 61 6c 65 6e 5f 66 69 6e  ta, &datalen_fin
2eb20 61 6c 29 3b 0a 09 69 66 20 28 64 65 63 72 79 70  al);..if (decryp
2eb30 74 5f 72 65 74 20 21 3d 20 43 4b 52 5f 4f 4b 29  t_ret != CKR_OK)
2eb40 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
2eb50 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2eb60 20 20 44 65 63 72 79 70 74 46 69 6e 61 6c 28 29    DecryptFinal()
2eb70 20 72 65 74 75 72 6e 65 64 20 66 61 69 6c 75 72   returned failur
2eb80 65 20 28 72 76 20 3d 20 25 6c 75 29 2e 22 2c 20  e (rv = %lu).", 
2eb90 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
2eba0 64 65 63 72 79 70 74 5f 72 65 74 29 3b 0a 0a 09  decrypt_ret);...
2ebb0 09 72 65 74 75 72 6e 28 64 65 63 72 79 70 74 5f  .return(decrypt_
2ebc0 72 65 74 29 3b 0a 09 7d 0a 0a 09 2a 70 75 6c 44  ret);..}...*pulD
2ebd0 61 74 61 4c 65 6e 20 3d 20 64 61 74 61 6c 65 6e  ataLen = datalen
2ebe0 5f 75 70 64 61 74 65 20 2b 20 64 61 74 61 6c 65  _update + datale
2ebf0 6e 5f 66 69 6e 61 6c 3b 0a 0a 09 43 41 43 4b 45  n_final;...CACKE
2ec00 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2ec10 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b  Returning CKR_OK
2ec20 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b   (%i)", CKR_OK);
2ec30 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b  ...return(CKR_OK
2ec40 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
2ec50 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
2ec60 43 5f 44 65 63 72 79 70 74 55 70 64 61 74 65 29  C_DecryptUpdate)
2ec70 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
2ec80 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
2ec90 42 59 54 45 5f 50 54 52 20 70 45 6e 63 72 79 70  BYTE_PTR pEncryp
2eca0 74 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e  tedPart, CK_ULON
2ecb0 47 20 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72  G ulEncryptedPar
2ecc0 74 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  tLen, CK_BYTE_PT
2ecd0 52 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e  R pPart, CK_ULON
2ece0 47 5f 50 54 52 20 70 75 6c 50 61 72 74 4c 65 6e  G_PTR pulPartLen
2ecf0 29 20 7b 0a 09 73 74 61 74 69 63 20 43 4b 5f 42  ) {..static CK_B
2ed00 59 54 45 20 62 75 66 5b 31 36 33 38 34 5d 3b 0a  YTE buf[16384];.
2ed10 09 73 73 69 7a 65 5f 74 20 62 75 66 6c 65 6e 3b  .ssize_t buflen;
2ed20 0a 09 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f  ..CK_SLOT_ID slo
2ed30 74 49 44 3b 0a 09 43 4b 5f 52 56 20 72 65 74 76  tID;..CK_RV retv
2ed40 61 6c 20 3d 20 43 4b 52 5f 47 45 4e 45 52 41 4c  al = CKR_GENERAL
2ed50 5f 45 52 52 4f 52 3b 0a 09 69 6e 74 20 6d 75 74  _ERROR;..int mut
2ed60 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43  ex_retval;...CAC
2ed70 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2ed80 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
2ed90 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
2eda0 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
2edb0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2edc0 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
2edd0 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
2ede0 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
2edf0 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
2ee00 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68  ZED);..}...if (h
2ee10 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20  Session == 0 || 
2ee20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a  hSession >= (siz
2ee30 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
2ee40 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ons) / sizeof(ca
2ee50 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d  ckey_sessions[0]
2ee60 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ))) {...CACKEY_D
2ee70 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2ee80 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74  or.  Session out
2ee90 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09   of range.");...
2eea0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
2eeb0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56  SSION_HANDLE_INV
2eec0 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  ALID);..}...if (
2eed0 70 45 6e 63 72 79 70 74 65 64 50 61 72 74 20 3d  pEncryptedPart =
2eee0 3d 20 4e 55 4c 4c 20 26 26 20 75 6c 45 6e 63 72  = NULL && ulEncr
2eef0 79 70 74 65 64 50 61 72 74 4c 65 6e 20 3d 3d 20  yptedPartLen == 
2ef00 30 29 20 7b 0a 09 09 2f 2a 20 53 68 6f 72 74 20  0) {.../* Short 
2ef10 63 69 72 63 75 69 74 20 69 66 20 77 65 20 61 72  circuit if we ar
2ef20 65 20 61 73 6b 65 64 20 74 6f 20 64 65 63 72 79  e asked to decry
2ef30 70 74 20 6e 6f 74 68 69 6e 67 2e 2e 2e 20 2a 2f  pt nothing... */
2ef40 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2ef50 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
2ef60 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 20 28 73  g CKR_OK (%i) (s
2ef70 68 6f 72 74 20 63 69 72 63 75 69 74 29 22 2c 20  hort circuit)", 
2ef80 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74 75  CKR_OK);....retu
2ef90 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a  rn(CKR_OK);..}..
2efa0 09 69 66 20 28 70 45 6e 63 72 79 70 74 65 64 50  .if (pEncryptedP
2efb0 61 72 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  art == NULL) {..
2efc0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2efd0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 45 6e  INTF("Error. pEn
2efe0 63 72 79 70 74 65 64 50 61 72 74 20 69 73 20 4e  cryptedPart is N
2eff0 55 4c 4c 2c 20 62 75 74 20 75 6c 45 6e 63 72 79  ULL, but ulEncry
2f000 70 74 65 64 50 61 72 74 4c 65 6e 20 69 73 20 6e  ptedPartLen is n
2f010 6f 74 20 30 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ot 0.");....retu
2f020 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53  rn(CKR_ARGUMENTS
2f030 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  _BAD);..}...if (
2f040 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c  ulEncryptedPartL
2f050 65 6e 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43  en == 0) {...CAC
2f060 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2f070 28 22 45 72 72 6f 72 2e 20 75 6c 45 6e 63 72 79  ("Error. ulEncry
2f080 70 74 65 64 50 61 72 74 4c 65 6e 20 69 73 20 30  ptedPartLen is 0
2f090 2c 20 62 75 74 20 70 50 61 72 74 20 69 73 20 6e  , but pPart is n
2f0a0 6f 74 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72  ot NULL.");....r
2f0b0 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45  eturn(CKR_ARGUME
2f0c0 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69  NTS_BAD);..}...i
2f0d0 66 20 28 70 75 6c 50 61 72 74 4c 65 6e 20 3d 3d  f (pulPartLen ==
2f0e0 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
2f0f0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2f100 45 72 72 6f 72 2e 20 70 75 6c 50 61 72 74 4c 65  Error. pulPartLe
2f110 6e 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09  n is NULL.");...
2f120 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55  .return(CKR_ARGU
2f130 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a  MENTS_BAD);..}..
2f140 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
2f150 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63  cackey_mutex_loc
2f160 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
2f170 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
2f180 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
2f190 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2f1a0 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b  TF("Error.  Lock
2f1b0 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
2f1c0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
2f1d0 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
2f1e0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65  ..if (!cackey_se
2f1f0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
2f200 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63  .active) {...cac
2f210 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
2f220 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
2f230 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  ;....CACKEY_DEBU
2f240 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2f250 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63    Session not ac
2f260 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  tive.");......re
2f270 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e  turn(CKR_SESSION
2f280 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29  _HANDLE_INVALID)
2f290 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b  ;..}...if (!cack
2f2a0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
2f2b0 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 61 63  sion].decrypt_ac
2f2c0 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79  tive) {...cackey
2f2d0 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
2f2e0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
2f2f0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2f300 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 44  RINTF("Error.  D
2f310 65 63 72 79 70 74 20 6e 6f 74 20 61 63 74 69 76  ecrypt not activ
2f320 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
2f330 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f  n(CKR_OPERATION_
2f340 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
2f350 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 49 44 20 3d 20  ;..}...slotID = 
2f360 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2f370 68 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44  hSession].slotID
2f380 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44 20 3c  ;...if (slotID <
2f390 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20   0 || slotID >= 
2f3a0 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
2f3b0 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  lots) / sizeof(c
2f3c0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29  ackey_slots[0]))
2f3d0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
2f3e0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2f3f0 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72  . Invalid slot r
2f400 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20  equested (%lu), 
2f410 6f 75 74 73 69 64 65 20 6f 66 20 76 61 6c 69 64  outside of valid
2f420 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29   range", slotID)
2f430 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
2f440 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
2f450 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f  .}...if (cackey_
2f460 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63  slots[slotID].ac
2f470 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43  tive == 0) {...C
2f480 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2f490 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c  TF("Error. Inval
2f4a0 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65  id slot requeste
2f4b0 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f  d (%lu), slot no
2f4c0 74 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69  t currently acti
2f4d0 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09  ve", slotID);...
2f4e0 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
2f4f0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
2f500 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  ock);....return(
2f510 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
2f520 52 29 3b 0a 09 7d 0a 0a 09 73 77 69 74 63 68 20  R);..}...switch 
2f530 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
2f540 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79  [hSession].decry
2f550 70 74 5f 6d 65 63 68 61 6e 69 73 6d 29 20 7b 0a  pt_mechanism) {.
2f560 09 09 63 61 73 65 20 43 4b 4d 5f 52 53 41 5f 50  ..case CKM_RSA_P
2f570 4b 43 53 3a 0a 09 09 09 2f 2a 20 41 73 6b 20 63  KCS:..../* Ask c
2f580 61 72 64 20 74 6f 20 64 65 63 72 79 70 74 20 2a  ard to decrypt *
2f590 2f 0a 09 09 09 62 75 66 6c 65 6e 20 3d 20 63 61  /....buflen = ca
2f5a0 63 6b 65 79 5f 73 69 67 6e 64 65 63 72 79 70 74  ckey_signdecrypt
2f5b0 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73  (&cackey_slots[s
2f5c0 6c 6f 74 49 44 5d 2c 20 63 61 63 6b 65 79 5f 73  lotID], cackey_s
2f5d0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
2f5e0 5d 2e 64 65 63 72 79 70 74 5f 69 64 65 6e 74 69  ].decrypt_identi
2f5f0 74 79 2c 20 70 45 6e 63 72 79 70 74 65 64 50 61  ty, pEncryptedPa
2f600 72 74 2c 20 75 6c 45 6e 63 72 79 70 74 65 64 50  rt, ulEncryptedP
2f610 61 72 74 4c 65 6e 2c 20 62 75 66 2c 20 73 69 7a  artLen, buf, siz
2f620 65 6f 66 28 62 75 66 29 2c 20 30 2c 20 31 29 3b  eof(buf), 0, 1);
2f630 0a 0a 09 09 09 69 66 20 28 62 75 66 6c 65 6e 20  .....if (buflen 
2f640 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  == CACKEY_PCSC_E
2f650 5f 4e 45 45 44 4c 4f 47 49 4e 20 26 26 20 63 61  _NEEDLOGIN && ca
2f660 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64  ckey_pin_command
2f670 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09   != NULL) {.....
2f680 69 66 20 28 43 5f 4c 6f 67 69 6e 4d 75 74 65 78  if (C_LoginMutex
2f690 41 72 67 28 68 53 65 73 73 69 6f 6e 2c 20 43 4b  Arg(hSession, CK
2f6a0 55 5f 55 53 45 52 2c 20 4e 55 4c 4c 2c 20 30 2c  U_USER, NULL, 0,
2f6b0 20 30 29 20 3d 3d 20 43 4b 52 5f 4f 4b 29 20 7b   0) == CKR_OK) {
2f6c0 0a 09 09 09 09 09 62 75 66 6c 65 6e 20 3d 20 63  ......buflen = c
2f6d0 61 63 6b 65 79 5f 73 69 67 6e 64 65 63 72 79 70  ackey_signdecryp
2f6e0 74 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  t(&cackey_slots[
2f6f0 73 6c 6f 74 49 44 5d 2c 20 63 61 63 6b 65 79 5f  slotID], cackey_
2f700 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
2f710 6e 5d 2e 64 65 63 72 79 70 74 5f 69 64 65 6e 74  n].decrypt_ident
2f720 69 74 79 2c 20 70 45 6e 63 72 79 70 74 65 64 50  ity, pEncryptedP
2f730 61 72 74 2c 20 75 6c 45 6e 63 72 79 70 74 65 64  art, ulEncrypted
2f740 50 61 72 74 4c 65 6e 2c 20 62 75 66 2c 20 73 69  PartLen, buf, si
2f750 7a 65 6f 66 28 62 75 66 29 2c 20 30 2c 20 31 29  zeof(buf), 0, 1)
2f760 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09  ;.....}....}....
2f770 09 69 66 20 28 62 75 66 6c 65 6e 20 3c 20 30 29  .if (buflen < 0)
2f780 20 7b 0a 09 09 09 09 2f 2a 20 44 65 63 72 79 70   {...../* Decryp
2f790 74 69 6f 6e 20 66 61 69 6c 65 64 2e 20 2a 2f 0a  tion failed. */.
2f7a0 09 09 09 09 69 66 20 28 62 75 66 6c 65 6e 20 3d  ....if (buflen =
2f7b0 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  = CACKEY_PCSC_E_
2f7c0 4e 45 45 44 4c 4f 47 49 4e 29 20 7b 0a 09 09 09  NEEDLOGIN) {....
2f7d0 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 55  ..retval = CKR_U
2f7e0 53 45 52 5f 4e 4f 54 5f 4c 4f 47 47 45 44 5f 49  SER_NOT_LOGGED_I
2f7f0 4e 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 69 66  N;.....} else if
2f800 20 28 62 75 66 6c 65 6e 20 3d 3d 20 43 41 43 4b   (buflen == CACK
2f810 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41  EY_PCSC_E_TOKENA
2f820 42 53 45 4e 54 29 20 7b 0a 09 09 09 09 09 72 65  BSENT) {......re
2f830 74 76 61 6c 20 3d 20 43 4b 52 5f 44 45 56 49 43  tval = CKR_DEVIC
2f840 45 5f 52 45 4d 4f 56 45 44 3b 0a 09 09 09 09 7d  E_REMOVED;.....}
2f850 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 43 41 43   else {......CAC
2f860 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2f870 28 22 46 61 69 6c 65 64 20 74 6f 20 73 65 6e 64  ("Failed to send
2f880 20 41 50 44 55 2c 20 65 72 72 6f 72 20 3d 20 25   APDU, error = %
2f890 6c 69 22 2c 20 28 6c 6f 6e 67 20 69 6e 74 29 20  li", (long int) 
2f8a0 62 75 66 6c 65 6e 29 3b 0a 0a 09 09 09 09 09 72  buflen);.......r
2f8b0 65 74 76 61 6c 20 3d 20 43 4b 52 5f 47 45 4e 45  etval = CKR_GENE
2f8c0 52 41 4c 5f 45 52 52 4f 52 3b 0a 09 09 09 09 7d  RAL_ERROR;.....}
2f8d0 0a 09 09 09 7d 20 65 6c 73 65 20 69 66 20 28 28  ....} else if ((
2f8e0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
2f8f0 62 75 66 6c 65 6e 29 20 3e 20 2a 70 75 6c 50 61  buflen) > *pulPa
2f900 72 74 4c 65 6e 20 26 26 20 70 50 61 72 74 29 20  rtLen && pPart) 
2f910 7b 0a 09 09 09 09 2f 2a 20 44 65 63 72 79 70 74  {...../* Decrypt
2f920 65 64 20 64 61 74 61 20 74 6f 6f 20 6c 61 72 67  ed data too larg
2f930 65 20 2a 2f 0a 09 09 09 09 72 65 74 76 61 6c 20  e */.....retval 
2f940 3d 20 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f  = CKR_BUFFER_TOO
2f950 5f 53 4d 41 4c 4c 3b 0a 09 09 09 7d 20 65 6c 73  _SMALL;....} els
2f960 65 20 7b 0a 09 09 09 09 69 66 20 28 70 50 61 72  e {.....if (pPar
2f970 74 29 20 7b 0a 09 09 09 09 09 6d 65 6d 63 70 79  t) {......memcpy
2f980 28 70 50 61 72 74 2c 20 62 75 66 2c 20 62 75 66  (pPart, buf, buf
2f990 6c 65 6e 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09  len);.....}.....
2f9a0 09 2a 70 75 6c 50 61 72 74 4c 65 6e 20 3d 20 62  .*pulPartLen = b
2f9b0 75 66 6c 65 6e 3b 0a 0a 09 09 09 09 72 65 74 76  uflen;......retv
2f9c0 61 6c 20 3d 20 43 4b 52 5f 4f 4b 3b 0a 09 09 09  al = CKR_OK;....
2f9d0 7d 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 7d 0a  }.....break;..}.
2f9e0 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
2f9f0 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e   cackey_mutex_un
2fa00 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
2fa10 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
2fa20 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
2fa30 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2fa40 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55  RINTF("Error.  U
2fa50 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e  nlocking failed.
2fa60 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
2fa70 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
2fa80 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
2fa90 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
2faa0 72 6e 69 6e 67 20 25 69 22 2c 20 28 69 6e 74 29  rning %i", (int)
2fab0 20 72 65 74 76 61 6c 29 3b 0a 0a 09 72 65 74 75   retval);...retu
2fac0 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 43  rn(retval);.}..C
2fad0 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
2fae0 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65 63 72 79  N(CK_RV, C_Decry
2faf0 70 74 46 69 6e 61 6c 29 28 43 4b 5f 53 45 53 53  ptFinal)(CK_SESS
2fb00 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
2fb10 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  ion, CK_BYTE_PTR
2fb20 20 70 4c 61 73 74 50 61 72 74 2c 20 43 4b 5f 55   pLastPart, CK_U
2fb30 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 4c 61 73 74  LONG_PTR pulLast
2fb40 50 61 72 74 4c 65 6e 29 20 7b 0a 09 69 6e 74 20  PartLen) {..int 
2fb50 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09 69  mutex_retval;..i
2fb60 6e 74 20 74 65 72 6d 69 6e 61 74 65 5f 64 65 63  nt terminate_dec
2fb70 72 79 70 74 20 3d 20 31 3b 0a 0a 09 43 41 43 4b  rypt = 1;...CACK
2fb80 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2fb90 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
2fba0 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
2fbb0 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
2fbc0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2fbd0 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
2fbe0 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
2fbf0 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
2fc00 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
2fc10 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53  ED);..}...if (hS
2fc20 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68  ession == 0 || h
2fc30 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65  Session >= (size
2fc40 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
2fc50 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63  ns) / sizeof(cac
2fc60 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29  key_sessions[0])
2fc70 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  )) {...CACKEY_DE
2fc80 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2fc90 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20  r.  Session out 
2fca0 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a  of range.");....
2fcb0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53  ..return(CKR_SES
2fcc0 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41  SION_HANDLE_INVA
2fcd0 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70  LID);..}...if (p
2fce0 75 6c 4c 61 73 74 50 61 72 74 4c 65 6e 20 3d 3d  ulLastPartLen ==
2fcf0 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
2fd00 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2fd10 45 72 72 6f 72 2e 20 70 75 6c 4c 61 73 74 50 61  Error. pulLastPa
2fd20 72 74 4c 65 6e 20 69 73 20 4e 55 4c 4c 2e 22 29  rtLen is NULL.")
2fd30 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
2fd40 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a  ARGUMENTS_BAD);.
2fd50 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  .}...mutex_retva
2fd60 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
2fd70 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  _lock(cackey_big
2fd80 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
2fd90 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
2fda0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2fdb0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
2fdc0 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  Locking failed."
2fdd0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
2fde0 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
2fdf0 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ..}...if (!cacke
2fe00 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
2fe10 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09  ion].active) {..
2fe20 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
2fe30 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
2fe40 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f  ock);....CACKEY_
2fe50 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2fe60 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f  ror.  Session no
2fe70 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a  t active.");....
2fe80 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53  ..return(CKR_SES
2fe90 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41  SION_HANDLE_INVA
2fea0 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21  LID);..}...if (!
2feb0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2fec0 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70  hSession].decryp
2fed0 74 5f 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61  t_active) {...ca
2fee0 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
2fef0 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
2ff00 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  );....CACKEY_DEB
2ff10 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2ff20 2e 20 20 44 65 63 72 79 70 74 20 6e 6f 74 20 61  .  Decrypt not a
2ff30 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72  ctive.");......r
2ff40 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54  eturn(CKR_OPERAT
2ff50 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  ION_NOT_INITIALI
2ff60 5a 45 44 29 3b 0a 09 7d 0a 0a 09 2a 70 75 6c 4c  ZED);..}...*pulL
2ff70 61 73 74 50 61 72 74 4c 65 6e 20 3d 20 30 3b 0a  astPartLen = 0;.
2ff80 0a 09 69 66 20 28 70 4c 61 73 74 50 61 72 74 20  ..if (pLastPart 
2ff90 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 74 65 72  == NULL) {...ter
2ffa0 6d 69 6e 61 74 65 5f 64 65 63 72 79 70 74 20 3d  minate_decrypt =
2ffb0 20 30 3b 0a 09 7d 0a 0a 09 69 66 20 28 74 65 72   0;..}...if (ter
2ffc0 6d 69 6e 61 74 65 5f 64 65 63 72 79 70 74 29 20  minate_decrypt) 
2ffd0 7b 0a 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69  {...cackey_sessi
2ffe0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65  ons[hSession].de
2fff0 63 72 79 70 74 5f 61 63 74 69 76 65 20 3d 20 30  crypt_active = 0
30000 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74  ;..}...mutex_ret
30010 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
30020 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
30030 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
30040 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
30050 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
30060 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
30070 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61  r.  Unlocking fa
30080 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
30090 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
300a0 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  RROR);..}...CACK
300b0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
300c0 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
300d0 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29  K (%i)", CKR_OK)
300e0 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ;...return(CKR_O
300f0 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  K);.}..CK_DEFINE
30100 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
30110 20 43 5f 44 69 67 65 73 74 49 6e 69 74 29 28 43   C_DigestInit)(C
30120 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
30130 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45   hSession, CK_ME
30140 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63  CHANISM_PTR pMec
30150 68 61 6e 69 73 6d 29 20 7b 0a 09 43 41 43 4b 45  hanism) {..CACKE
30160 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
30170 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
30180 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
30190 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
301a0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
301b0 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
301c0 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
301d0 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
301e0 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
301f0 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
30200 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
30210 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
30220 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
30230 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
30240 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
30250 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
30260 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
30270 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
30280 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
30290 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 69 67 65  ON(CK_RV, C_Dige
302a0 73 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  st)(CK_SESSION_H
302b0 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
302c0 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 44 61 74  CK_BYTE_PTR pDat
302d0 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 44 61  a, CK_ULONG ulDa
302e0 74 61 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  taLen, CK_BYTE_P
302f0 54 52 20 70 44 69 67 65 73 74 2c 20 43 4b 5f 55  TR pDigest, CK_U
30300 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 44 69 67 65  LONG_PTR pulDige
30310 73 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59  stLen) {..CACKEY
30320 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
30330 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
30340 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
30350 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
30360 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
30370 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
30380 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
30390 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
303a0 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
303b0 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
303c0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
303d0 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
303e0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
303f0 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
30400 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
30410 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
30420 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
30430 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
30440 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
30450 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 69 67 65 73  N(CK_RV, C_Diges
30460 74 55 70 64 61 74 65 29 28 43 4b 5f 53 45 53 53  tUpdate)(CK_SESS
30470 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
30480 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  ion, CK_BYTE_PTR
30490 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47   pPart, CK_ULONG
304a0 20 75 6c 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43   ulPartLen) {..C
304b0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
304c0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
304d0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
304e0 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
304f0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
30500 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
30510 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
30520 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
30530 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
30540 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
30550 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
30560 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
30570 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
30580 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
30590 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
305a0 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
305b0 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
305c0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
305d0 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
305e0 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
305f0 44 69 67 65 73 74 4b 65 79 29 28 43 4b 5f 53 45  DigestKey)(CK_SE
30600 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
30610 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54  ssion, CK_OBJECT
30620 5f 48 41 4e 44 4c 45 20 68 4b 65 79 29 20 7b 0a  _HANDLE hKey) {.
30630 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
30640 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
30650 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
30660 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
30670 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
30680 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
30690 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
306a0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
306b0 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
306c0 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
306d0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
306e0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
306f0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
30700 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20  UPPORTED (%i)", 
30710 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
30720 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72  _SUPPORTED);...r
30730 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
30740 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
30750 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
30760 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
30770 43 5f 44 69 67 65 73 74 46 69 6e 61 6c 29 28 43  C_DigestFinal)(C
30780 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
30790 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59   hSession, CK_BY
307a0 54 45 5f 50 54 52 20 70 44 69 67 65 73 74 2c 20  TE_PTR pDigest, 
307b0 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c  CK_ULONG_PTR pul
307c0 44 69 67 65 73 74 4c 65 6e 29 20 7b 0a 09 43 41  DigestLen) {..CA
307d0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
307e0 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
307f0 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
30800 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
30810 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
30820 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
30830 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
30840 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
30850 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
30860 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
30870 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
30880 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
30890 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
308a0 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
308b0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
308c0 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
308d0 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
308e0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
308f0 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
30900 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53  CTION(CK_RV, C_S
30910 69 67 6e 49 6e 69 74 29 28 43 4b 5f 53 45 53 53  ignInit)(CK_SESS
30920 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
30930 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53  ion, CK_MECHANIS
30940 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d  M_PTR pMechanism
30950 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44  , CK_OBJECT_HAND
30960 4c 45 20 68 4b 65 79 29 20 7b 0a 09 69 6e 74 20  LE hKey) {..int 
30970 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09  mutex_retval;...
30980 68 4b 65 79 2d 2d 3b 0a 0a 09 43 41 43 4b 45 59  hKey--;...CACKEY
30990 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
309a0 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
309b0 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
309c0 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
309d0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
309e0 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
309f0 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
30a00 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
30a10 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
30a20 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 4d 65 63  );..}...if (pMec
30a30 68 61 6e 69 73 6d 20 3d 3d 20 4e 55 4c 4c 29 20  hanism == NULL) 
30a40 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
30a50 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
30a60 70 4d 65 63 68 61 6e 69 73 6d 20 69 73 20 4e 55  pMechanism is NU
30a70 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  LL.");....return
30a80 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42  (CKR_ARGUMENTS_B
30a90 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 4d  AD);..}...if (pM
30aa0 65 63 68 61 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e  echanism->mechan
30ab0 69 73 6d 20 21 3d 20 43 4b 4d 5f 52 53 41 5f 50  ism != CKM_RSA_P
30ac0 4b 43 53 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  KCS) {...CACKEY_
30ad0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
30ae0 72 6f 72 2e 20 70 4d 65 63 68 61 6e 69 73 6d 2d  ror. pMechanism-
30af0 3e 6d 65 63 68 61 6e 69 73 6d 20 6e 6f 74 20 73  >mechanism not s
30b00 70 65 63 69 66 69 65 64 20 61 73 20 43 4b 4d 5f  pecified as CKM_
30b10 52 53 41 5f 50 4b 43 53 22 29 3b 0a 0a 09 09 72  RSA_PKCS");....r
30b20 65 74 75 72 6e 28 43 4b 52 5f 4d 45 43 48 41 4e  eturn(CKR_MECHAN
30b30 49 53 4d 5f 50 41 52 41 4d 5f 49 4e 56 41 4c 49  ISM_PARAM_INVALI
30b40 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65  D);..}...if (hSe
30b50 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53  ssion == 0 || hS
30b60 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f  ession >= (sizeo
30b70 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
30b80 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
30b90 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29  ey_sessions[0]))
30ba0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
30bb0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
30bc0 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f  .  Session out o
30bd0 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09  f range.");.....
30be0 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
30bf0 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
30c00 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f  ID);..}...mutex_
30c10 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
30c20 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65  mutex_lock(cacke
30c30 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
30c40 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
30c50 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
30c60 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
30c70 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69  or.  Locking fai
30c80 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
30c90 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
30ca0 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21  ROR);..}...if (!
30cb0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
30cc0 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65  hSession].active
30cd0 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  ) {...cackey_mut
30ce0 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
30cf0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41  _biglock);....CA
30d00 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
30d10 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69  F("Error.  Sessi
30d20 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29  on not active.")
30d30 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
30d40 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  R_SESSION_HANDLE
30d50 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
30d60 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69  if (cackey_sessi
30d70 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
30d80 67 6e 5f 61 63 74 69 76 65 29 20 7b 0a 09 09 63  gn_active) {...c
30d90 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
30da0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
30db0 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  k);....CACKEY_DE
30dc0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
30dd0 72 2e 20 20 53 69 67 6e 20 61 6c 72 65 61 64 79  r.  Sign already
30de0 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 22 29 3b   in progress.");
30df0 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
30e00 5f 4f 50 45 52 41 54 49 4f 4e 5f 41 43 54 49 56  _OPERATION_ACTIV
30e10 45 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 4b 65  E);..}...if (hKe
30e20 79 20 3e 3d 20 63 61 63 6b 65 79 5f 73 65 73 73  y >= cackey_sess
30e30 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69  ions[hSession].i
30e40 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 29  dentities_count)
30e50 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65   {...cackey_mute
30e60 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
30e70 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43  biglock);....CAC
30e80 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
30e90 28 22 45 72 72 6f 72 2e 20 20 4b 65 79 20 68 61  ("Error.  Key ha
30ea0 6e 64 6c 65 20 6f 75 74 20 6f 66 20 72 61 6e 67  ndle out of rang
30eb0 65 20 28 72 65 71 75 65 73 74 65 64 20 6b 65 79  e (requested key
30ec0 20 25 6c 75 2c 20 6f 6e 6c 79 20 25 6c 75 20 69   %lu, only %lu i
30ed0 64 65 6e 74 69 74 69 65 73 20 61 76 61 69 6c 61  dentities availa
30ee0 62 6c 65 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65  ble).", (unsigne
30ef0 64 20 6c 6f 6e 67 29 20 68 4b 65 79 2c 20 28 75  d long) hKey, (u
30f00 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 61  nsigned long) ca
30f10 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
30f20 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69  ession].identiti
30f30 65 73 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09 72 65  es_count);....re
30f40 74 75 72 6e 28 43 4b 52 5f 4b 45 59 5f 48 41 4e  turn(CKR_KEY_HAN
30f50 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  DLE_INVALID);..}
30f60 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
30f70 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
30f80 6e 5f 61 63 74 69 76 65 20 3d 20 31 3b 0a 0a 09  n_active = 1;...
30f90 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
30fa0 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 6d  hSession].sign_m
30fb0 65 63 68 61 6e 69 73 6d 20 3d 20 70 4d 65 63 68  echanism = pMech
30fc0 61 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d  anism->mechanism
30fd0 3b 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ;...cackey_sessi
30fe0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
30ff0 67 6e 5f 62 75 66 6c 65 6e 20 3d 20 31 32 38 3b  gn_buflen = 128;
31000 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
31010 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
31020 5f 62 75 66 75 73 65 64 20 3d 20 30 3b 0a 09 63  _bufused = 0;..c
31030 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
31040 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75  Session].sign_bu
31050 66 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f  f = malloc(sizeo
31060 66 28 2a 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  f(*cackey_sessio
31070 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
31080 6e 5f 62 75 66 29 20 2a 20 63 61 63 6b 65 79 5f  n_buf) * cackey_
31090 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
310a0 6e 5d 2e 73 69 67 6e 5f 62 75 66 6c 65 6e 29 3b  n].sign_buflen);
310b0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
310c0 50 52 49 4e 54 46 28 22 53 65 73 73 69 6f 6e 20  PRINTF("Session 
310d0 25 6c 75 20 73 69 67 6e 5f 69 64 65 6e 74 69 74  %lu sign_identit
310e0 79 20 69 73 20 25 70 20 28 69 64 65 6e 74 69 74  y is %p (identit
310f0 79 20 23 25 6c 75 29 22 2c 20 28 75 6e 73 69 67  y #%lu)", (unsig
31100 6e 65 64 20 6c 6f 6e 67 29 20 68 53 65 73 73 69  ned long) hSessi
31110 6f 6e 2c 20 28 76 6f 69 64 20 2a 29 20 26 63 61  on, (void *) &ca
31120 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
31130 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69  ession].identiti
31140 65 73 5b 68 4b 65 79 5d 2c 20 28 75 6e 73 69 67  es[hKey], (unsig
31150 6e 65 64 20 6c 6f 6e 67 29 20 68 4b 65 79 29 3b  ned long) hKey);
31160 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
31170 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
31180 5f 69 64 65 6e 74 69 74 79 20 3d 20 26 63 61 63  _identity = &cac
31190 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
311a0 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65  ssion].identitie
311b0 73 5b 68 4b 65 79 5d 3b 0a 0a 09 6d 75 74 65 78  s[hKey];...mutex
311c0 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
311d0 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
311e0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
311f0 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
31200 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
31210 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
31220 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e  Error.  Unlockin
31230 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
31240 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
31250 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
31260 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
31270 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
31280 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52  KR_OK (%i)", CKR
31290 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  _OK);...return(C
312a0 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  KR_OK);.}..CK_DE
312b0 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
312c0 5f 52 56 2c 20 43 5f 53 69 67 6e 29 28 43 4b 5f  _RV, C_Sign)(CK_
312d0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
312e0 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45  Session, CK_BYTE
312f0 5f 50 54 52 20 70 44 61 74 61 2c 20 43 4b 5f 55  _PTR pData, CK_U
31300 4c 4f 4e 47 20 75 6c 44 61 74 61 4c 65 6e 2c 20  LONG ulDataLen, 
31310 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 53 69 67  CK_BYTE_PTR pSig
31320 6e 61 74 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47  nature, CK_ULONG
31330 5f 50 54 52 20 70 75 6c 53 69 67 6e 61 74 75 72  _PTR pulSignatur
31340 65 4c 65 6e 29 20 7b 0a 09 75 6e 73 69 67 6e 65  eLen) {..unsigne
31350 64 20 6c 6f 6e 67 20 73 74 61 72 74 5f 73 69 67  d long start_sig
31360 6e 5f 62 75 66 75 73 65 64 3b 0a 09 43 4b 5f 52  n_bufused;..CK_R
31370 56 20 73 69 67 6e 5f 72 65 74 3b 0a 09 69 6e 74  V sign_ret;..int
31380 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a   mutex_retval;..
31390 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
313a0 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
313b0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
313c0 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
313d0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
313e0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
313f0 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
31400 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
31410 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
31420 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69  IALIZED);..}...i
31430 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30  f (hSession == 0
31440 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20   || hSession >= 
31450 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
31460 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f  essions) / sizeo
31470 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
31480 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b  s[0]))) {...CACK
31490 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
314a0 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e  "Error.  Session
314b0 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29   out of range.")
314c0 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
314d0 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  R_SESSION_HANDLE
314e0 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
314f0 73 74 61 72 74 5f 73 69 67 6e 5f 62 75 66 75 73  start_sign_bufus
31500 65 64 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73  ed = cackey_sess
31510 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
31520 69 67 6e 5f 62 75 66 75 73 65 64 3b 0a 0a 09 73  ign_bufused;...s
31530 69 67 6e 5f 72 65 74 20 3d 20 43 5f 53 69 67 6e  ign_ret = C_Sign
31540 55 70 64 61 74 65 28 68 53 65 73 73 69 6f 6e 2c  Update(hSession,
31550 20 70 44 61 74 61 2c 20 75 6c 44 61 74 61 4c 65   pData, ulDataLe
31560 6e 29 3b 0a 09 69 66 20 28 73 69 67 6e 5f 72 65  n);..if (sign_re
31570 74 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09  t != CKR_OK) {..
31580 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
31590 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 69  INTF("Error.  Si
315a0 67 6e 55 70 64 61 74 65 28 29 20 72 65 74 75 72  gnUpdate() retur
315b0 6e 65 64 20 66 61 69 6c 75 72 65 20 28 72 76 20  ned failure (rv 
315c0 3d 20 25 6c 75 29 2e 22 2c 20 28 75 6e 73 69 67  = %lu).", (unsig
315d0 6e 65 64 20 6c 6f 6e 67 29 20 73 69 67 6e 5f 72  ned long) sign_r
315e0 65 74 29 3b 0a 0a 09 09 69 66 20 28 73 69 67 6e  et);....if (sign
315f0 5f 72 65 74 20 21 3d 20 43 4b 52 5f 42 55 46 46  _ret != CKR_BUFF
31600 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 20 7b 0a  ER_TOO_SMALL) {.
31610 09 09 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
31620 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c  = cackey_mutex_l
31630 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
31640 63 6b 29 3b 0a 09 09 09 69 66 20 28 6d 75 74 65  ck);....if (mute
31650 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
31660 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
31670 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
31680 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64    Locking failed
31690 2e 22 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e  .");......return
316a0 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
316b0 4f 52 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66  OR);....}.....if
316c0 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   (!cackey_sessio
316d0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74  ns[hSession].act
316e0 69 76 65 29 20 7b 0a 09 09 09 09 63 61 63 6b 65  ive) {.....cacke
316f0 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
31700 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
31710 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
31720 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
31730 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63    Session not ac
31740 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 09 09  tive.");........
31750 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
31760 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  ON_HANDLE_INVALI
31770 44 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20  D);....}.....if 
31780 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  (!cackey_session
31790 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
317a0 5f 61 63 74 69 76 65 29 20 7b 0a 09 09 09 09 63  _active) {.....c
317b0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
317c0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
317d0 6b 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f  k);......CACKEY_
317e0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
317f0 72 6f 72 2e 20 20 53 69 67 6e 20 6e 6f 74 20 61  ror.  Sign not a
31800 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 09  ctive.");.......
31810 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52  .return(CKR_OPER
31820 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41  ATION_NOT_INITIA
31830 4c 49 5a 45 44 29 3b 0a 09 09 09 7d 0a 0a 09 09  LIZED);....}....
31840 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
31850 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
31860 61 63 74 69 76 65 20 3d 20 30 3b 0a 0a 09 09 09  active = 0;.....
31870 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
31880 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
31890 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
318a0 6b 29 3b 0a 09 09 09 69 66 20 28 6d 75 74 65 78  k);....if (mutex
318b0 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
318c0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
318d0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
318e0 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65   Unlocking faile
318f0 64 2e 22 29 3b 0a 0a 09 09 09 09 72 65 74 75 72  d.");......retur
31900 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
31910 52 4f 52 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a  ROR);....}...}..
31920 09 09 72 65 74 75 72 6e 28 73 69 67 6e 5f 72 65  ..return(sign_re
31930 74 29 3b 0a 09 7d 0a 0a 09 73 69 67 6e 5f 72 65  t);..}...sign_re
31940 74 20 3d 20 43 5f 53 69 67 6e 46 69 6e 61 6c 28  t = C_SignFinal(
31950 68 53 65 73 73 69 6f 6e 2c 20 70 53 69 67 6e 61  hSession, pSigna
31960 74 75 72 65 2c 20 70 75 6c 53 69 67 6e 61 74 75  ture, pulSignatu
31970 72 65 4c 65 6e 29 3b 0a 09 69 66 20 28 73 69 67  reLen);..if (sig
31980 6e 5f 72 65 74 20 21 3d 20 43 4b 52 5f 4f 4b 29  n_ret != CKR_OK)
31990 20 7b 0a 09 09 69 66 20 28 73 69 67 6e 5f 72 65   {...if (sign_re
319a0 74 20 3d 3d 20 43 4b 52 5f 42 55 46 46 45 52 5f  t == CKR_BUFFER_
319b0 54 4f 4f 5f 53 4d 41 4c 4c 29 20 7b 0a 09 09 09  TOO_SMALL) {....
319c0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
319d0 4e 54 46 28 22 53 69 67 6e 46 69 6e 61 6c 28 29  NTF("SignFinal()
319e0 20 72 65 74 75 72 6e 65 64 20 43 4b 52 5f 42 55   returned CKR_BU
319f0 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 20 28  FFER_TOO_SMALL (
31a00 72 76 20 3d 20 25 6c 75 29 2c 20 75 6e 64 6f 69  rv = %lu), undoi
31a10 6e 67 20 43 5f 53 69 67 6e 55 70 64 61 74 65 28  ng C_SignUpdate(
31a20 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  )", (unsigned lo
31a30 6e 67 29 20 73 69 67 6e 5f 72 65 74 29 3b 0a 0a  ng) sign_ret);..
31a40 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
31a50 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
31a60 6e 5f 62 75 66 75 73 65 64 20 3d 20 73 74 61 72  n_bufused = star
31a70 74 5f 73 69 67 6e 5f 62 75 66 75 73 65 64 3b 0a  t_sign_bufused;.
31a80 0a 09 09 09 72 65 74 75 72 6e 28 73 69 67 6e 5f  ....return(sign_
31a90 72 65 74 29 3b 0a 09 09 7d 0a 0a 09 09 43 41 43  ret);...}....CAC
31aa0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
31ab0 28 22 45 72 72 6f 72 2e 20 20 53 69 67 6e 46 69  ("Error.  SignFi
31ac0 6e 61 6c 28 29 20 72 65 74 75 72 6e 65 64 20 66  nal() returned f
31ad0 61 69 6c 75 72 65 20 28 72 76 20 3d 20 25 6c 75  ailure (rv = %lu
31ae0 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ).", (unsigned l
31af0 6f 6e 67 29 20 73 69 67 6e 5f 72 65 74 29 3b 0a  ong) sign_ret);.
31b00 0a 09 09 72 65 74 75 72 6e 28 73 69 67 6e 5f 72  ...return(sign_r
31b10 65 74 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 53  et);..}...if (pS
31b20 69 67 6e 61 74 75 72 65 20 3d 3d 20 4e 55 4c 4c  ignature == NULL
31b30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
31b40 55 47 5f 50 52 49 4e 54 46 28 22 70 53 69 67 6e  UG_PRINTF("pSign
31b50 61 74 75 72 65 20 73 70 65 63 69 66 69 65 64 20  ature specified 
31b60 61 73 20 4e 55 4c 4c 2c 20 75 6e 64 6f 69 6e 67  as NULL, undoing
31b70 20 43 5f 53 69 67 6e 55 70 64 61 74 65 28 29 22   C_SignUpdate()"
31b80 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 73 65 73  );....cackey_ses
31b90 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
31ba0 73 69 67 6e 5f 62 75 66 75 73 65 64 20 3d 20 73  sign_bufused = s
31bb0 74 61 72 74 5f 73 69 67 6e 5f 62 75 66 75 73 65  tart_sign_bufuse
31bc0 64 3b 0a 0a 09 09 72 65 74 75 72 6e 28 73 69 67  d;....return(sig
31bd0 6e 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09 43 41 43  n_ret);..}...CAC
31be0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
31bf0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
31c00 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b  OK (%i)", CKR_OK
31c10 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
31c20 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  OK);.}..CK_DEFIN
31c30 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
31c40 2c 20 43 5f 53 69 67 6e 55 70 64 61 74 65 29 28  , C_SignUpdate)(
31c50 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
31c60 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42  E hSession, CK_B
31c70 59 54 45 5f 50 54 52 20 70 50 61 72 74 2c 20 43  YTE_PTR pPart, C
31c80 4b 5f 55 4c 4f 4e 47 20 75 6c 50 61 72 74 4c 65  K_ULONG ulPartLe
31c90 6e 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f  n) {..int mutex_
31ca0 72 65 74 76 61 6c 3b 0a 09 69 6e 74 20 72 65 73  retval;..int res
31cb0 69 7a 65 52 65 74 72 79 3b 0a 09 69 6e 74 20 6e  izeRetry;..int n
31cc0 65 65 64 52 65 73 69 7a 65 3b 0a 0a 09 43 41 43  eedResize;...CAC
31cd0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
31ce0 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
31cf0 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
31d00 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
31d10 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
31d20 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
31d30 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
31d40 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
31d50 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
31d60 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68  ZED);..}...if (h
31d70 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20  Session == 0 || 
31d80 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a  hSession >= (siz
31d90 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
31da0 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ons) / sizeof(ca
31db0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d  ckey_sessions[0]
31dc0 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ))) {...CACKEY_D
31dd0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
31de0 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74  or.  Session out
31df0 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09   of range.");...
31e00 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
31e10 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56  SSION_HANDLE_INV
31e20 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  ALID);..}...if (
31e30 70 50 61 72 74 20 3d 3d 20 4e 55 4c 4c 20 26 26  pPart == NULL &&
31e40 20 75 6c 50 61 72 74 4c 65 6e 20 3d 3d 20 30 29   ulPartLen == 0)
31e50 20 7b 0a 09 09 2f 2a 20 53 68 6f 72 74 20 63 69   {.../* Short ci
31e60 72 63 75 69 74 20 69 66 20 77 65 20 61 72 65 20  rcuit if we are 
31e70 61 73 6b 65 64 20 74 6f 20 73 69 67 6e 20 6e 6f  asked to sign no
31e80 74 68 69 6e 67 2e 2e 2e 20 2a 2f 0a 09 09 43 41  thing... */...CA
31e90 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
31ea0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
31eb0 5f 4f 4b 20 28 25 69 29 20 28 73 68 6f 72 74 20  _OK (%i) (short 
31ec0 63 69 72 63 75 69 74 29 22 2c 20 43 4b 52 5f 4f  circuit)", CKR_O
31ed0 4b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  K);....return(CK
31ee0 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  R_OK);..}...if (
31ef0 70 50 61 72 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b  pPart == NULL) {
31f00 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
31f10 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70  PRINTF("Error. p
31f20 50 61 72 74 20 69 73 20 4e 55 4c 4c 2c 20 62 75  Part is NULL, bu
31f30 74 20 75 6c 50 61 72 74 4c 65 6e 20 69 73 20 6e  t ulPartLen is n
31f40 6f 74 20 30 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ot 0.");....retu
31f50 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53  rn(CKR_ARGUMENTS
31f60 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  _BAD);..}...if (
31f70 75 6c 50 61 72 74 4c 65 6e 20 3d 3d 20 30 29 20  ulPartLen == 0) 
31f80 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
31f90 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
31fa0 75 6c 50 61 72 74 4c 65 6e 20 69 73 20 30 2c 20  ulPartLen is 0, 
31fb0 62 75 74 20 70 50 61 72 74 20 69 73 20 6e 6f 74  but pPart is not
31fc0 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74   NULL.");....ret
31fd0 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54  urn(CKR_ARGUMENT
31fe0 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74  S_BAD);..}...mut
31ff0 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
32000 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61  ey_mutex_lock(ca
32010 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
32020 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
32030 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
32040 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
32050 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20  Error.  Locking 
32060 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
32070 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
32080 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66  _ERROR);..}...if
32090 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   (!cackey_sessio
320a0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74  ns[hSession].act
320b0 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  ive) {...cackey_
320c0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
320d0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
320e0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
320f0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65  INTF("Error.  Se
32100 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65  ssion not active
32110 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
32120 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  (CKR_SESSION_HAN
32130 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  DLE_INVALID);..}
32140 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73  ...if (!cackey_s
32150 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
32160 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65 29 20 7b  ].sign_active) {
32170 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
32180 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
32190 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45  glock);....CACKE
321a0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
321b0 45 72 72 6f 72 2e 20 20 53 69 67 6e 20 6e 6f 74  Error.  Sign not
321c0 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09   active.");.....
321d0 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52  .return(CKR_OPER
321e0 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41  ATION_NOT_INITIA
321f0 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 73 77 69  LIZED);..}...swi
32200 74 63 68 20 28 63 61 63 6b 65 79 5f 73 65 73 73  tch (cackey_sess
32210 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
32220 69 67 6e 5f 6d 65 63 68 61 6e 69 73 6d 29 20 7b  ign_mechanism) {
32230 0a 09 09 63 61 73 65 20 43 4b 4d 5f 52 53 41 5f  ...case CKM_RSA_
32240 50 4b 43 53 3a 0a 09 09 09 2f 2a 20 41 63 63 75  PKCS:..../* Accu
32250 6d 75 6c 61 74 65 20 64 69 72 65 63 74 6c 79 20  mulate directly 
32260 2a 2f 0a 09 09 09 66 6f 72 20 28 72 65 73 69 7a  */....for (resiz
32270 65 52 65 74 72 79 20 3d 20 30 3b 20 72 65 73 69  eRetry = 0; resi
32280 7a 65 52 65 74 72 79 20 3c 20 31 31 3b 20 72 65  zeRetry < 11; re
32290 73 69 7a 65 52 65 74 72 79 2b 2b 29 20 7b 0a 09  sizeRetry++) {..
322a0 09 09 09 6e 65 65 64 52 65 73 69 7a 65 20 3d 20  ...needResize = 
322b0 30 3b 0a 09 09 09 09 69 66 20 28 28 63 61 63 6b  0;.....if ((cack
322c0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
322d0 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73  sion].sign_bufus
322e0 65 64 20 2b 20 75 6c 50 61 72 74 4c 65 6e 29 20  ed + ulPartLen) 
322f0 3e 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  > cackey_session
32300 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
32310 5f 62 75 66 6c 65 6e 29 20 7b 0a 09 09 09 09 09  _buflen) {......
32320 6e 65 65 64 52 65 73 69 7a 65 20 3d 20 31 3b 0a  needResize = 1;.
32330 09 09 09 09 7d 0a 0a 09 09 09 09 69 66 20 28 21  ....}......if (!
32340 6e 65 65 64 52 65 73 69 7a 65 29 20 7b 0a 09 09  needResize) {...
32350 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a  ...break;.....}.
32360 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
32370 47 5f 50 52 49 4e 54 46 28 22 52 65 73 69 7a 69  G_PRINTF("Resizi
32380 6e 67 20 73 69 67 6e 69 6e 67 20 62 75 66 66 65  ng signing buffe
32390 72 20 28 74 72 79 20 23 25 69 20 6f 66 20 31 30  r (try #%i of 10
323a0 20 2d 2d 20 31 31 74 68 20 69 73 20 66 61 74 61   -- 11th is fata
323b0 6c 29 22 2c 20 72 65 73 69 7a 65 52 65 74 72 79  l)", resizeRetry
323c0 29 3b 0a 0a 09 09 09 09 69 66 20 28 72 65 73 69  );......if (resi
323d0 7a 65 52 65 74 72 79 20 3d 3d 20 31 30 29 20 7b  zeRetry == 10) {
323e0 0a 09 09 09 09 09 66 72 65 65 28 63 61 63 6b 65  ......free(cacke
323f0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
32400 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 29 3b 0a  ion].sign_buf);.
32410 0a 09 09 09 09 09 63 61 63 6b 65 79 5f 73 65 73  ......cackey_ses
32420 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
32430 73 69 67 6e 5f 62 75 66 6c 65 6e 20 3d 20 30 3b  sign_buflen = 0;
32440 0a 09 09 09 09 09 63 61 63 6b 65 79 5f 73 65 73  ......cackey_ses
32450 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
32460 73 69 67 6e 5f 62 75 66 20 3d 20 4e 55 4c 4c 3b  sign_buf = NULL;
32470 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .......break;...
32480 09 09 7d 0a 0a 09 09 09 09 63 61 63 6b 65 79 5f  ..}......cackey_
32490 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
324a0 6e 5d 2e 73 69 67 6e 5f 62 75 66 6c 65 6e 20 2a  n].sign_buflen *
324b0 3d 20 32 3b 0a 0a 09 09 09 09 63 61 63 6b 65 79  = 2;......cackey
324c0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
324d0 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 20 3d 20 72  on].sign_buf = r
324e0 65 61 6c 6c 6f 63 28 63 61 63 6b 65 79 5f 73 65  ealloc(cackey_se
324f0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
32500 2e 73 69 67 6e 5f 62 75 66 2c 20 73 69 7a 65 6f  .sign_buf, sizeo
32510 66 28 2a 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  f(*cackey_sessio
32520 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
32530 6e 5f 62 75 66 29 20 2a 20 63 61 63 6b 65 79 5f  n_buf) * cackey_
32540 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
32550 6e 5d 2e 73 69 67 6e 5f 62 75 66 6c 65 6e 29 3b  n].sign_buflen);
32560 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 63 61  ....}.....if (ca
32570 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
32580 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66  ession].sign_buf
32590 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09   == NULL) {.....
325a0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
325b0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
325c0 63 6b 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59  ck);......CACKEY
325d0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
325e0 72 72 6f 72 2e 20 20 53 69 67 6e 69 6e 67 20 62  rror.  Signing b
325f0 75 66 66 65 72 20 69 73 20 4e 55 4c 4c 2e 22 29  uffer is NULL.")
32600 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
32610 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
32620 3b 0a 09 09 09 7d 0a 0a 09 09 09 6d 65 6d 63 70  ;....}.....memcp
32630 79 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  y(cackey_session
32640 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
32650 5f 62 75 66 20 2b 20 63 61 63 6b 65 79 5f 73 65  _buf + cackey_se
32660 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
32670 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 2c 20 70  .sign_bufused, p
32680 50 61 72 74 2c 20 75 6c 50 61 72 74 4c 65 6e 29  Part, ulPartLen)
32690 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73  ;.....cackey_ses
326a0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
326b0 73 69 67 6e 5f 62 75 66 75 73 65 64 20 2b 3d 20  sign_bufused += 
326c0 75 6c 50 61 72 74 4c 65 6e 3b 0a 0a 09 09 09 62  ulPartLen;.....b
326d0 72 65 61 6b 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78  reak;..}...mutex
326e0 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
326f0 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
32700 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
32710 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
32720 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
32730 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
32740 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e  Error.  Unlockin
32750 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
32760 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
32770 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
32780 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
32790 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
327a0 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52  KR_OK (%i)", CKR
327b0 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  _OK);...return(C
327c0 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  KR_OK);.}..CK_DE
327d0 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
327e0 5f 52 56 2c 20 43 5f 53 69 67 6e 46 69 6e 61 6c  _RV, C_SignFinal
327f0 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
32800 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
32810 5f 42 59 54 45 5f 50 54 52 20 70 53 69 67 6e 61  _BYTE_PTR pSigna
32820 74 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50  ture, CK_ULONG_P
32830 54 52 20 70 75 6c 53 69 67 6e 61 74 75 72 65 4c  TR pulSignatureL
32840 65 6e 29 20 7b 0a 09 73 74 61 74 69 63 20 43 4b  en) {..static CK
32850 5f 42 59 54 45 20 73 69 67 62 75 66 5b 31 30 32  _BYTE sigbuf[102
32860 34 5d 3b 0a 09 73 73 69 7a 65 5f 74 20 73 69 67  4];..ssize_t sig
32870 62 75 66 6c 65 6e 3b 0a 09 43 4b 5f 53 4c 4f 54  buflen;..CK_SLOT
32880 5f 49 44 20 73 6c 6f 74 49 44 3b 0a 09 43 4b 5f  _ID slotID;..CK_
32890 52 56 20 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f  RV retval = CKR_
328a0 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 3b 0a 09  GENERAL_ERROR;..
328b0 69 6e 74 20 74 65 72 6d 69 6e 61 74 65 5f 73 69  int terminate_si
328c0 67 6e 20 3d 20 31 3b 0a 09 69 6e 74 20 6d 75 74  gn = 1;..int mut
328d0 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43  ex_retval;...CAC
328e0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
328f0 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
32900 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
32910 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
32920 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
32930 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
32940 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
32950 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
32960 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
32970 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70  ZED);..}...if (p
32980 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 20 3d  ulSignatureLen =
32990 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
329a0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
329b0 22 45 72 72 6f 72 2e 20 70 75 6c 53 69 67 6e 61  "Error. pulSigna
329c0 74 75 72 65 4c 65 6e 20 69 73 20 4e 55 4c 4c 2e  tureLen is NULL.
329d0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
329e0 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29  R_ARGUMENTS_BAD)
329f0 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73  ;..}...if (hSess
32a00 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73  ion == 0 || hSes
32a10 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28  sion >= (sizeof(
32a20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29  cackey_sessions)
32a30 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
32a40 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20  _sessions[0]))) 
32a50 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
32a60 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
32a70 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20   Session out of 
32a80 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72  range.");......r
32a90 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f  eturn(CKR_SESSIO
32aa0 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44  N_HANDLE_INVALID
32ab0 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65  );..}...mutex_re
32ac0 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
32ad0 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  tex_lock(cackey_
32ae0 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
32af0 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
32b00 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
32b10 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
32b20 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65  .  Locking faile
32b30 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
32b40 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
32b50 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61  R);..}...if (!ca
32b60 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
32b70 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20  ession].active) 
32b80 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  {...cackey_mutex
32b90 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
32ba0 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b  iglock);....CACK
32bb0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
32bc0 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e  "Error.  Session
32bd0 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a   not active.");.
32be0 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
32bf0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49  SESSION_HANDLE_I
32c00 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66  NVALID);..}...if
32c10 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   (!cackey_sessio
32c20 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
32c30 6e 5f 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61  n_active) {...ca
32c40 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
32c50 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
32c60 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  );....CACKEY_DEB
32c70 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
32c80 2e 20 20 53 69 67 6e 20 6e 6f 74 20 61 63 74 69  .  Sign not acti
32c90 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ve.");......retu
32ca0 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e  rn(CKR_OPERATION
32cb0 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
32cc0 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 49 44 20 3d  );..}...slotID =
32cd0 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73   cackey_sessions
32ce0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49  [hSession].slotI
32cf0 44 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44 20  D;...if (slotID 
32d00 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d  < 0 || slotID >=
32d10 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
32d20 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28  slots) / sizeof(
32d30 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29  cackey_slots[0])
32d40 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  )) {...CACKEY_DE
32d50 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
32d60 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20  r. Invalid slot 
32d70 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c  requested (%lu),
32d80 20 6f 75 74 73 69 64 65 20 6f 66 20 76 61 6c 69   outside of vali
32d90 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44  d range", slotID
32da0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
32db0 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
32dc0 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79  ..}...if (cackey
32dd0 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61  _slots[slotID].a
32de0 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09  ctive == 0) {...
32df0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
32e00 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61  NTF("Error. Inva
32e10 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74  lid slot request
32e20 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e  ed (%lu), slot n
32e30 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74  ot currently act
32e40 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a  ive", slotID);..
32e50 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
32e60 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
32e70 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e  lock);....return
32e80 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
32e90 4f 52 29 3b 0a 09 7d 0a 0a 09 73 77 69 74 63 68  OR);..}...switch
32ea0 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e   (cackey_session
32eb0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
32ec0 5f 6d 65 63 68 61 6e 69 73 6d 29 20 7b 0a 09 09  _mechanism) {...
32ed0 63 61 73 65 20 43 4b 4d 5f 52 53 41 5f 50 4b 43  case CKM_RSA_PKC
32ee0 53 3a 0a 09 09 09 2f 2a 20 41 73 6b 20 63 61 72  S:..../* Ask car
32ef0 64 20 74 6f 20 73 69 67 6e 20 2a 2f 0a 09 09 09  d to sign */....
32f00 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
32f10 4e 54 46 28 22 41 73 6b 69 6e 67 20 74 6f 20 73  NTF("Asking to s
32f20 69 67 6e 20 66 72 6f 6d 20 69 64 65 6e 74 69 74  ign from identit
32f30 79 20 25 70 20 69 6e 20 73 65 73 73 69 6f 6e 20  y %p in session 
32f40 25 6c 75 22 2c 20 28 76 6f 69 64 20 2a 29 20 63  %lu", (void *) c
32f50 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
32f60 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 69 64  Session].sign_id
32f70 65 6e 74 69 74 79 2c 20 28 75 6e 73 69 67 6e 65  entity, (unsigne
32f80 64 20 6c 6f 6e 67 29 20 68 53 65 73 73 69 6f 6e  d long) hSession
32f90 29 3b 0a 09 09 09 73 69 67 62 75 66 6c 65 6e 20  );....sigbuflen 
32fa0 3d 20 63 61 63 6b 65 79 5f 73 69 67 6e 64 65 63  = cackey_signdec
32fb0 72 79 70 74 28 26 63 61 63 6b 65 79 5f 73 6c 6f  rypt(&cackey_slo
32fc0 74 73 5b 73 6c 6f 74 49 44 5d 2c 20 63 61 63 6b  ts[slotID], cack
32fd0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
32fe0 73 69 6f 6e 5d 2e 73 69 67 6e 5f 69 64 65 6e 74  sion].sign_ident
32ff0 69 74 79 2c 20 63 61 63 6b 65 79 5f 73 65 73 73  ity, cackey_sess
33000 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
33010 69 67 6e 5f 62 75 66 2c 20 63 61 63 6b 65 79 5f  ign_buf, cackey_
33020 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
33030 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 2c  n].sign_bufused,
33040 20 73 69 67 62 75 66 2c 20 73 69 7a 65 6f 66 28   sigbuf, sizeof(
33050 73 69 67 62 75 66 29 2c 20 31 2c 20 30 29 3b 0a  sigbuf), 1, 0);.
33060 0a 09 09 09 69 66 20 28 73 69 67 62 75 66 6c 65  ....if (sigbufle
33070 6e 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43  n == CACKEY_PCSC
33080 5f 45 5f 4e 45 45 44 4c 4f 47 49 4e 20 26 26 20  _E_NEEDLOGIN && 
33090 63 61 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61  cackey_pin_comma
330a0 6e 64 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  nd != NULL) {...
330b0 09 09 69 66 20 28 43 5f 4c 6f 67 69 6e 4d 75 74  ..if (C_LoginMut
330c0 65 78 41 72 67 28 68 53 65 73 73 69 6f 6e 2c 20  exArg(hSession, 
330d0 43 4b 55 5f 55 53 45 52 2c 20 4e 55 4c 4c 2c 20  CKU_USER, NULL, 
330e0 30 2c 20 30 29 20 3d 3d 20 43 4b 52 5f 4f 4b 29  0, 0) == CKR_OK)
330f0 20 7b 0a 09 09 09 09 09 73 69 67 62 75 66 6c 65   {......sigbufle
33100 6e 20 3d 20 63 61 63 6b 65 79 5f 73 69 67 6e 64  n = cackey_signd
33110 65 63 72 79 70 74 28 26 63 61 63 6b 65 79 5f 73  ecrypt(&cackey_s
33120 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c 20 63 61  lots[slotID], ca
33130 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
33140 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 69 64 65  ession].sign_ide
33150 6e 74 69 74 79 2c 20 63 61 63 6b 65 79 5f 73 65  ntity, cackey_se
33160 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
33170 2e 73 69 67 6e 5f 62 75 66 2c 20 63 61 63 6b 65  .sign_buf, cacke
33180 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
33190 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65  ion].sign_bufuse
331a0 64 2c 20 73 69 67 62 75 66 2c 20 73 69 7a 65 6f  d, sigbuf, sizeo
331b0 66 28 73 69 67 62 75 66 29 2c 20 31 2c 20 30 29  f(sigbuf), 1, 0)
331c0 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09  ;.....}....}....
331d0 09 69 66 20 28 73 69 67 62 75 66 6c 65 6e 20 3c  .if (sigbuflen <
331e0 20 30 29 20 7b 0a 09 09 09 09 2f 2a 20 53 69 67   0) {...../* Sig
331f0 6e 69 6e 67 20 66 61 69 6c 65 64 2e 20 2a 2f 0a  ning failed. */.
33200 09 09 09 09 69 66 20 28 73 69 67 62 75 66 6c 65  ....if (sigbufle
33210 6e 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43  n == CACKEY_PCSC
33220 5f 45 5f 4e 45 45 44 4c 4f 47 49 4e 29 20 7b 0a  _E_NEEDLOGIN) {.
33230 09 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b  .....retval = CK
33240 52 5f 55 53 45 52 5f 4e 4f 54 5f 4c 4f 47 47 45  R_USER_NOT_LOGGE
33250 44 5f 49 4e 3b 0a 09 09 09 09 7d 20 65 6c 73 65  D_IN;.....} else
33260 20 69 66 20 28 73 69 67 62 75 66 6c 65 6e 20 3d   if (sigbuflen =
33270 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  = CACKEY_PCSC_E_
33280 54 4f 4b 45 4e 41 42 53 45 4e 54 29 20 7b 0a 09  TOKENABSENT) {..
33290 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52  ....retval = CKR
332a0 5f 44 45 56 49 43 45 5f 52 45 4d 4f 56 45 44 3b  _DEVICE_REMOVED;
332b0 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  .....} else {...
332c0 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f  ...retval = CKR_
332d0 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 3b 0a 09  GENERAL_ERROR;..
332e0 09 09 09 7d 0a 09 09 09 7d 20 65 6c 73 65 20 69  ...}....} else i
332f0 66 20 28 28 28 75 6e 73 69 67 6e 65 64 20 6c 6f  f (((unsigned lo
33300 6e 67 29 20 73 69 67 62 75 66 6c 65 6e 29 20 3e  ng) sigbuflen) >
33310 20 2a 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65   *pulSignatureLe
33320 6e 20 26 26 20 70 53 69 67 6e 61 74 75 72 65 29  n && pSignature)
33330 20 7b 0a 09 09 09 09 2f 2a 20 53 69 67 6e 65 64   {...../* Signed
33340 20 64 61 74 61 20 74 6f 6f 20 6c 61 72 67 65 20   data too large 
33350 2a 2f 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  */.....CACKEY_DE
33360 42 55 47 5f 50 52 49 4e 54 46 28 22 72 65 74 76  BUG_PRINTF("retv
33370 61 6c 20 3d 20 43 4b 52 5f 42 55 46 46 45 52 5f  al = CKR_BUFFER_
33380 54 4f 4f 5f 53 4d 41 4c 4c 3b 20 20 73 69 67 62  TOO_SMALL;  sigb
33390 75 66 6c 65 6e 20 3d 20 25 6c 75 2c 20 70 75 6c  uflen = %lu, pul
333a0 53 69 67 6e 61 74 75 72 65 4c 65 6e 20 3d 20 25  SignatureLen = %
333b0 6c 75 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  lu", (unsigned l
333c0 6f 6e 67 29 20 73 69 67 62 75 66 6c 65 6e 2c 20  ong) sigbuflen, 
333d0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
333e0 2a 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e  *pulSignatureLen
333f0 29 3b 0a 0a 09 09 09 09 72 65 74 76 61 6c 20 3d  );......retval =
33400 20 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f   CKR_BUFFER_TOO_
33410 53 4d 41 4c 4c 3b 0a 0a 09 09 09 09 74 65 72 6d  SMALL;......term
33420 69 6e 61 74 65 5f 73 69 67 6e 20 3d 20 30 3b 0a  inate_sign = 0;.
33430 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09  ...} else {.....
33440 74 65 72 6d 69 6e 61 74 65 5f 73 69 67 6e 20 3d  terminate_sign =
33450 20 30 3b 0a 0a 09 09 09 09 69 66 20 28 70 53 69   0;......if (pSi
33460 67 6e 61 74 75 72 65 29 20 7b 0a 09 09 09 09 09  gnature) {......
33470 6d 65 6d 63 70 79 28 70 53 69 67 6e 61 74 75 72  memcpy(pSignatur
33480 65 2c 20 73 69 67 62 75 66 2c 20 73 69 67 62 75  e, sigbuf, sigbu
33490 66 6c 65 6e 29 3b 0a 0a 09 09 09 09 09 74 65 72  flen);.......ter
334a0 6d 69 6e 61 74 65 5f 73 69 67 6e 20 3d 20 31 3b  minate_sign = 1;
334b0 0a 09 09 09 09 7d 0a 0a 09 09 09 09 2a 70 75 6c  .....}......*pul
334c0 53 69 67 6e 61 74 75 72 65 4c 65 6e 20 3d 20 73  SignatureLen = s
334d0 69 67 62 75 66 6c 65 6e 3b 0a 0a 09 09 09 09 72  igbuflen;......r
334e0 65 74 76 61 6c 20 3d 20 43 4b 52 5f 4f 4b 3b 0a  etval = CKR_OK;.
334f0 09 09 09 7d 0a 0a 09 09 09 62 72 65 61 6b 3b 0a  ...}.....break;.
33500 09 7d 0a 0a 09 69 66 20 28 74 65 72 6d 69 6e 61  .}...if (termina
33510 74 65 5f 73 69 67 6e 29 20 7b 0a 09 09 69 66 20  te_sign) {...if 
33520 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
33530 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
33540 62 75 66 29 20 7b 0a 09 09 09 66 72 65 65 28 63  buf) {....free(c
33550 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
33560 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75  Session].sign_bu
33570 66 29 3b 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65  f);...}....cacke
33580 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
33590 69 6f 6e 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65  ion].sign_active
335a0 20 3d 20 30 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78   = 0;..}...mutex
335b0 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
335c0 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
335d0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
335e0 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
335f0 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
33600 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
33610 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e  Error.  Unlockin
33620 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
33630 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
33640 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
33650 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
33660 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 25  NTF("Returning %
33670 69 22 2c 20 28 69 6e 74 29 20 72 65 74 76 61 6c  i", (int) retval
33680 29 3b 0a 0a 09 72 65 74 75 72 6e 28 72 65 74 76  );...return(retv
33690 61 6c 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  al);.}..CK_DEFIN
336a0 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
336b0 2c 20 43 5f 53 69 67 6e 52 65 63 6f 76 65 72 49  , C_SignRecoverI
336c0 6e 69 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  nit)(CK_SESSION_
336d0 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
336e0 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54   CK_MECHANISM_PT
336f0 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b  R pMechanism, CK
33700 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68  _OBJECT_HANDLE h
33710 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  Key) {..CACKEY_D
33720 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
33730 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
33740 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
33750 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
33760 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
33770 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
33780 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
33790 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
337a0 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
337b0 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
337c0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
337d0 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
337e0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
337f0 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
33800 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
33810 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
33820 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
33830 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
33840 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
33850 43 4b 5f 52 56 2c 20 43 5f 53 69 67 6e 52 65 63  CK_RV, C_SignRec
33860 6f 76 65 72 29 28 43 4b 5f 53 45 53 53 49 4f 4e  over)(CK_SESSION
33870 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
33880 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 44  , CK_BYTE_PTR pD
33890 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  ata, CK_ULONG ul
338a0 44 61 74 61 4c 65 6e 2c 20 43 4b 5f 42 59 54 45  DataLen, CK_BYTE
338b0 5f 50 54 52 20 70 53 69 67 6e 61 74 75 72 65 2c  _PTR pSignature,
338c0 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75   CK_ULONG_PTR pu
338d0 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 29 20 7b  lSignatureLen) {
338e0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
338f0 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
33900 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
33910 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
33920 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
33930 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
33940 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
33950 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
33960 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
33970 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
33980 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
33990 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
339a0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
339b0 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
339c0 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
339d0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
339e0 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
339f0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
33a00 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
33a10 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
33a20 20 43 5f 56 65 72 69 66 79 49 6e 69 74 29 28 43   C_VerifyInit)(C
33a30 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
33a40 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45   hSession, CK_ME
33a50 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63  CHANISM_PTR pMec
33a60 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43  hanism, CK_OBJEC
33a70 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79 29 20 7b  T_HANDLE hKey) {
33a80 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
33a90 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
33aa0 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
33ab0 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
33ac0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
33ad0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
33ae0 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
33af0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
33b00 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
33b10 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
33b20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
33b30 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
33b40 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
33b50 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
33b60 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
33b70 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
33b80 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
33b90 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
33ba0 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
33bb0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
33bc0 20 43 5f 56 65 72 69 66 79 29 28 43 4b 5f 53 45   C_Verify)(CK_SE
33bd0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
33be0 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  ssion, CK_BYTE_P
33bf0 54 52 20 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f  TR pData, CK_ULO
33c00 4e 47 20 75 6c 44 61 74 61 4c 65 6e 2c 20 43 4b  NG ulDataLen, CK
33c10 5f 42 59 54 45 5f 50 54 52 20 70 53 69 67 6e 61  _BYTE_PTR pSigna
33c20 74 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  ture, CK_ULONG u
33c30 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 29 20 7b  lSignatureLen) {
33c40 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
33c50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
33c60 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
33c70 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
33c80 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
33c90 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
33ca0 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
33cb0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
33cc0 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
33cd0 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
33ce0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
33cf0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
33d00 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
33d10 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
33d20 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
33d30 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
33d40 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
33d50 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
33d60 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
33d70 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
33d80 20 43 5f 56 65 72 69 66 79 55 70 64 61 74 65 29   C_VerifyUpdate)
33d90 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
33da0 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
33db0 42 59 54 45 5f 50 54 52 20 70 50 61 72 74 2c 20  BYTE_PTR pPart, 
33dc0 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 61 72 74 4c  CK_ULONG ulPartL
33dd0 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  en) {..CACKEY_DE
33de0 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
33df0 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
33e00 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
33e10 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
33e20 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
33e30 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
33e40 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
33e50 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
33e60 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
33e70 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
33e80 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
33e90 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
33ea0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
33eb0 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
33ec0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
33ed0 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
33ee0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
33ef0 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
33f00 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
33f10 4b 5f 52 56 2c 20 43 5f 56 65 72 69 66 79 46 69  K_RV, C_VerifyFi
33f20 6e 61 6c 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  nal)(CK_SESSION_
33f30 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
33f40 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 53 69   CK_BYTE_PTR pSi
33f50 67 6e 61 74 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e  gnature, CK_ULON
33f60 47 20 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e  G ulSignatureLen
33f70 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
33f80 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
33f90 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
33fa0 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
33fb0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
33fc0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
33fd0 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
33fe0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
33ff0 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
34000 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
34010 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
34020 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
34030 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
34040 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
34050 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
34060 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
34070 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
34080 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
34090 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
340a0 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
340b0 52 56 2c 20 43 5f 56 65 72 69 66 79 52 65 63 6f  RV, C_VerifyReco
340c0 76 65 72 49 6e 69 74 29 28 43 4b 5f 53 45 53 53  verInit)(CK_SESS
340d0 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
340e0 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53  ion, CK_MECHANIS
340f0 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d  M_PTR pMechanism
34100 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44  , CK_OBJECT_HAND
34110 4c 45 20 68 4b 65 79 29 20 7b 0a 09 43 41 43 4b  LE hKey) {..CACK
34120 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
34130 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
34140 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
34150 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
34160 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
34170 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
34180 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
34190 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
341a0 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
341b0 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
341c0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
341d0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
341e0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
341f0 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
34200 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
34210 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
34220 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
34230 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
34240 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
34250 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 56 65 72  ION(CK_RV, C_Ver
34260 69 66 79 52 65 63 6f 76 65 72 29 28 43 4b 5f 53  ifyRecover)(CK_S
34270 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
34280 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f  ession, CK_BYTE_
34290 50 54 52 20 70 53 69 67 6e 61 74 75 72 65 2c 20  PTR pSignature, 
342a0 43 4b 5f 55 4c 4f 4e 47 20 75 6c 53 69 67 6e 61  CK_ULONG ulSigna
342b0 74 75 72 65 4c 65 6e 2c 20 43 4b 5f 42 59 54 45  tureLen, CK_BYTE
342c0 5f 50 54 52 20 70 44 61 74 61 2c 20 43 4b 5f 55  _PTR pData, CK_U
342d0 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 44 61 74 61  LONG_PTR pulData
342e0 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  Len) {..CACKEY_D
342f0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
34300 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
34310 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
34320 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
34330 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
34340 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
34350 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
34360 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
34370 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
34380 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
34390 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
343a0 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
343b0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
343c0 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
343d0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
343e0 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
343f0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
34400 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
34410 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
34420 43 4b 5f 52 56 2c 20 43 5f 44 69 67 65 73 74 45  CK_RV, C_DigestE
34430 6e 63 72 79 70 74 55 70 64 61 74 65 29 28 43 4b  ncryptUpdate)(CK
34440 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
34450 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54  hSession, CK_BYT
34460 45 5f 50 54 52 20 70 50 61 72 74 2c 20 43 4b 5f  E_PTR pPart, CK_
34470 55 4c 4f 4e 47 20 75 6c 50 61 72 74 4c 65 6e 2c  ULONG ulPartLen,
34480 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 45 6e   CK_BYTE_PTR pEn
34490 63 72 79 70 74 65 64 50 61 72 74 2c 20 43 4b 5f  cryptedPart, CK_
344a0 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 45 6e 63  ULONG_PTR pulEnc
344b0 72 79 70 74 65 64 50 61 72 74 4c 65 6e 29 20 7b  ryptedPartLen) {
344c0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
344d0 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
344e0 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
344f0 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
34500 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
34510 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
34520 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
34530 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
34540 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
34550 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
34560 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
34570 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
34580 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
34590 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
345a0 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
345b0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
345c0 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
345d0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
345e0 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
345f0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
34600 20 43 5f 44 65 63 72 79 70 74 44 69 67 65 73 74   C_DecryptDigest
34610 55 70 64 61 74 65 29 28 43 4b 5f 53 45 53 53 49  Update)(CK_SESSI
34620 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
34630 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  on, CK_BYTE_PTR 
34640 70 45 6e 63 72 79 70 74 65 64 50 61 72 74 2c 20  pEncryptedPart, 
34650 43 4b 5f 55 4c 4f 4e 47 20 75 6c 45 6e 63 72 79  CK_ULONG ulEncry
34660 70 74 65 64 50 61 72 74 4c 65 6e 2c 20 43 4b 5f  ptedPartLen, CK_
34670 42 59 54 45 5f 50 54 52 20 70 50 61 72 74 2c 20  BYTE_PTR pPart, 
34680 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c  CK_ULONG_PTR pul
34690 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b  PartLen) {..CACK
346a0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
346b0 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
346c0 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
346d0 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
346e0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
346f0 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
34700 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
34710 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
34720 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
34730 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
34740 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
34750 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
34760 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
34770 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
34780 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
34790 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
347a0 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
347b0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
347c0 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
347d0 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 69 67  ION(CK_RV, C_Sig
347e0 6e 45 6e 63 72 79 70 74 55 70 64 61 74 65 29 28  nEncryptUpdate)(
347f0 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
34800 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42  E hSession, CK_B
34810 59 54 45 5f 50 54 52 20 70 50 61 72 74 2c 20 43  YTE_PTR pPart, C
34820 4b 5f 55 4c 4f 4e 47 20 75 6c 50 61 72 74 4c 65  K_ULONG ulPartLe
34830 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
34840 45 6e 63 72 79 70 74 65 64 50 61 72 74 2c 20 43  EncryptedPart, C
34850 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 45  K_ULONG_PTR pulE
34860 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e 29  ncryptedPartLen)
34870 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
34880 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
34890 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
348a0 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
348b0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
348c0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
348d0 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
348e0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
348f0 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
34900 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
34910 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
34920 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
34930 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
34940 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
34950 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
34960 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
34970 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
34980 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
34990 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  TED);.}..CK_DEFI
349a0 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
349b0 56 2c 20 43 5f 44 65 63 72 79 70 74 56 65 72 69  V, C_DecryptVeri
349c0 66 79 55 70 64 61 74 65 29 28 43 4b 5f 53 45 53  fyUpdate)(CK_SES
349d0 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
349e0 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  sion, CK_BYTE_PT
349f0 52 20 70 45 6e 63 72 79 70 74 65 64 50 61 72 74  R pEncryptedPart
34a00 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 45 6e 63  , CK_ULONG ulEnc
34a10 72 79 70 74 65 64 50 61 72 74 4c 65 6e 2c 20 43  ryptedPartLen, C
34a20 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 61 72 74  K_BYTE_PTR pPart
34a30 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70  , CK_ULONG_PTR p
34a40 75 6c 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41  ulPartLen) {..CA
34a50 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
34a60 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
34a70 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
34a80 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
34a90 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
34aa0 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
34ab0 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
34ac0 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
34ad0 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
34ae0 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
34af0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
34b00 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
34b10 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
34b20 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
34b30 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
34b40 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
34b50 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
34b60 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
34b70 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
34b80 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47  CTION(CK_RV, C_G
34b90 65 6e 65 72 61 74 65 4b 65 79 29 28 43 4b 5f 53  enerateKey)(CK_S
34ba0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
34bb0 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41  ession, CK_MECHA
34bc0 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e  NISM_PTR pMechan
34bd0 69 73 6d 2c 20 43 4b 5f 41 54 54 52 49 42 55 54  ism, CK_ATTRIBUT
34be0 45 5f 50 54 52 20 70 54 65 6d 70 6c 61 74 65 2c  E_PTR pTemplate,
34bf0 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e   CK_ULONG ulCoun
34c00 74 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e  t, CK_OBJECT_HAN
34c10 44 4c 45 5f 50 54 52 20 70 68 4b 65 79 29 20 7b  DLE_PTR phKey) {
34c20 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
34c30 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
34c40 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
34c50 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
34c60 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
34c70 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
34c80 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
34c90 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
34ca0 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
34cb0 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
34cc0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
34cd0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
34ce0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
34cf0 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
34d00 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
34d10 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
34d20 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
34d30 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
34d40 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
34d50 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
34d60 20 43 5f 47 65 6e 65 72 61 74 65 4b 65 79 50 61   C_GenerateKeyPa
34d70 69 72 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  ir)(CK_SESSION_H
34d80 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
34d90 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52  CK_MECHANISM_PTR
34da0 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f   pMechanism, CK_
34db0 41 54 54 52 49 42 55 54 45 5f 50 54 52 20 70 50  ATTRIBUTE_PTR pP
34dc0 75 62 6c 69 63 4b 65 79 54 65 6d 70 6c 61 74 65  ublicKeyTemplate
34dd0 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 75 62  , CK_ULONG ulPub
34de0 6c 69 63 4b 65 79 41 74 74 72 69 62 75 74 65 43  licKeyAttributeC
34df0 6f 75 6e 74 2c 20 43 4b 5f 41 54 54 52 49 42 55  ount, CK_ATTRIBU
34e00 54 45 5f 50 54 52 20 70 50 72 69 76 61 74 65 4b  TE_PTR pPrivateK
34e10 65 79 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55  eyTemplate, CK_U
34e20 4c 4f 4e 47 20 75 6c 50 72 69 76 61 74 65 4b 65  LONG ulPrivateKe
34e30 79 41 74 74 72 69 62 75 74 65 43 6f 75 6e 74 2c  yAttributeCount,
34e40 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c   CK_OBJECT_HANDL
34e50 45 5f 50 54 52 20 70 68 50 75 62 6c 69 63 4b 65  E_PTR phPublicKe
34e60 79 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e  y, CK_OBJECT_HAN
34e70 44 4c 45 5f 50 54 52 20 70 68 50 72 69 76 61 74  DLE_PTR phPrivat
34e80 65 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f  eKey) {..CACKEY_
34e90 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
34ea0 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
34eb0 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
34ec0 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
34ed0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
34ee0 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
34ef0 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
34f00 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
34f10 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
34f20 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
34f30 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
34f40 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
34f50 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
34f60 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
34f70 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
34f80 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
34f90 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
34fa0 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
34fb0 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
34fc0 28 43 4b 5f 52 56 2c 20 43 5f 57 72 61 70 4b 65  (CK_RV, C_WrapKe
34fd0 79 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  y)(CK_SESSION_HA
34fe0 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
34ff0 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20  K_MECHANISM_PTR 
35000 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f  pMechanism, CK_O
35010 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 57 72  BJECT_HANDLE hWr
35020 61 70 70 69 6e 67 4b 65 79 2c 20 43 4b 5f 4f 42  appingKey, CK_OB
35030 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79  JECT_HANDLE hKey
35040 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 57  , CK_BYTE_PTR pW
35050 72 61 70 70 65 64 4b 65 79 2c 20 43 4b 5f 55 4c  rappedKey, CK_UL
35060 4f 4e 47 5f 50 54 52 20 70 75 6c 57 72 61 70 70  ONG_PTR pulWrapp
35070 65 64 4b 65 79 4c 65 6e 29 20 7b 0a 09 43 41 43  edKeyLen) {..CAC
35080 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
35090 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
350a0 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
350b0 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
350c0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
350d0 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
350e0 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
350f0 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
35100 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
35110 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
35120 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
35130 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
35140 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
35150 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
35160 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
35170 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
35180 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
35190 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
351a0 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
351b0 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 55 6e  TION(CK_RV, C_Un
351c0 77 72 61 70 4b 65 79 29 28 43 4b 5f 53 45 53 53  wrapKey)(CK_SESS
351d0 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
351e0 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53  ion, CK_MECHANIS
351f0 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d  M_PTR pMechanism
35200 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44  , CK_OBJECT_HAND
35210 4c 45 20 68 55 6e 77 72 61 70 70 69 6e 67 4b 65  LE hUnwrappingKe
35220 79 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  y, CK_BYTE_PTR p
35230 57 72 61 70 70 65 64 4b 65 79 2c 20 43 4b 5f 55  WrappedKey, CK_U
35240 4c 4f 4e 47 20 75 6c 57 72 61 70 70 65 64 4b 65  LONG ulWrappedKe
35250 79 4c 65 6e 2c 20 43 4b 5f 41 54 54 52 49 42 55  yLen, CK_ATTRIBU
35260 54 45 5f 50 54 52 20 70 54 65 6d 70 6c 61 74 65  TE_PTR pTemplate
35270 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 41 74 74  , CK_ULONG ulAtt
35280 72 69 62 75 74 65 43 6f 75 6e 74 2c 20 43 4b 5f  ributeCount, CK_
35290 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54  OBJECT_HANDLE_PT
352a0 52 20 70 68 4b 65 79 29 20 7b 0a 09 43 41 43 4b  R phKey) {..CACK
352b0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
352c0 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
352d0 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
352e0 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
352f0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
35300 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
35310 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
35320 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
35330 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
35340 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
35350 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
35360 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
35370 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
35380 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
35390 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
353a0 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
353b0 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
353c0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
353d0 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
353e0 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65 72  ION(CK_RV, C_Der
353f0 69 76 65 4b 65 79 29 28 43 4b 5f 53 45 53 53 49  iveKey)(CK_SESSI
35400 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
35410 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d  on, CK_MECHANISM
35420 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c  _PTR pMechanism,
35430 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c   CK_OBJECT_HANDL
35440 45 20 68 42 61 73 65 4b 65 79 2c 20 43 4b 5f 41  E hBaseKey, CK_A
35450 54 54 52 49 42 55 54 45 5f 50 54 52 20 70 54 65  TTRIBUTE_PTR pTe
35460 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47  mplate, CK_ULONG
35470 20 75 6c 41 74 74 72 69 62 75 74 65 43 6f 75 6e   ulAttributeCoun
35480 74 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e  t, CK_OBJECT_HAN
35490 44 4c 45 5f 50 54 52 20 70 68 4b 65 79 29 20 7b  DLE_PTR phKey) {
354a0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
354b0 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
354c0 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
354d0 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
354e0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
354f0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
35500 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
35510 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
35520 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
35530 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
35540 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
35550 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
35560 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
35570 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
35580 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
35590 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
355a0 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
355b0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
355c0 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
355d0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
355e0 20 43 5f 53 65 65 64 52 61 6e 64 6f 6d 29 28 43   C_SeedRandom)(C
355f0 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
35600 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59   hSession, CK_BY
35610 54 45 5f 50 54 52 20 70 53 65 65 64 2c 20 43 4b  TE_PTR pSeed, CK
35620 5f 55 4c 4f 4e 47 20 75 6c 53 65 65 64 4c 65 6e  _ULONG ulSeedLen
35630 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
35640 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
35650 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
35660 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
35670 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
35680 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
35690 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
356a0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
356b0 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
356c0 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
356d0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
356e0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
356f0 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
35700 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
35710 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
35720 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
35730 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
35740 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
35750 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
35760 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
35770 52 56 2c 20 43 5f 47 65 6e 65 72 61 74 65 52 61  RV, C_GenerateRa
35780 6e 64 6f 6d 29 28 43 4b 5f 53 45 53 53 49 4f 4e  ndom)(CK_SESSION
35790 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
357a0 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 52  , CK_BYTE_PTR pR
357b0 61 6e 64 6f 6d 44 61 74 61 2c 20 43 4b 5f 55 4c  andomData, CK_UL
357c0 4f 4e 47 20 75 6c 52 61 6e 64 6f 6d 4c 65 6e 29  ONG ulRandomLen)
357d0 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
357e0 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
357f0 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
35800 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
35810 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
35820 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
35830 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
35840 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
35850 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
35860 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
35870 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
35880 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
35890 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
358a0 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
358b0 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
358c0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
358d0 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
358e0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
358f0 54 45 44 29 3b 0a 7d 0a 0a 2f 2a 20 44 65 70 72  TED);.}../* Depr
35900 65 63 61 74 65 64 20 46 75 6e 63 74 69 6f 6e 20  ecated Function 
35910 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  */.CK_DEFINE_FUN
35920 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47  CTION(CK_RV, C_G
35930 65 74 46 75 6e 63 74 69 6f 6e 53 74 61 74 75 73  etFunctionStatus
35940 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
35950 44 4c 45 20 68 53 65 73 73 69 6f 6e 29 20 7b 0a  DLE hSession) {.
35960 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
35970 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
35980 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
35990 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
359a0 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
359b0 4f 54 5f 50 41 52 41 4c 4c 45 4c 20 28 25 69 29  OT_PARALLEL (%i)
359c0 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
359d0 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c 29 3b 0a 0a  NOT_PARALLEL);..
359e0 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
359f0 54 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45  TION_NOT_PARALLE
35a00 4c 29 3b 0a 0a 09 68 53 65 73 73 69 6f 6e 20 3d  L);...hSession =
35a10 20 68 53 65 73 73 69 6f 6e 3b 20 2f 2a 20 53 75   hSession; /* Su
35a20 70 72 65 73 73 20 75 6e 75 73 65 64 20 76 61 72  press unused var
35a30 69 61 62 6c 65 20 77 61 72 6e 69 6e 67 20 2a 2f  iable warning */
35a40 0a 7d 0a 0a 2f 2a 20 44 65 70 72 65 63 61 74 65  .}../* Deprecate
35a50 64 20 46 75 6e 63 74 69 6f 6e 20 2a 2f 0a 43 4b  d Function */.CK
35a60 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
35a70 28 43 4b 5f 52 56 2c 20 43 5f 43 61 6e 63 65 6c  (CK_RV, C_Cancel
35a80 46 75 6e 63 74 69 6f 6e 29 28 43 4b 5f 53 45 53  Function)(CK_SES
35a90 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
35aa0 73 69 6f 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f  sion) {..CACKEY_
35ab0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
35ac0 6c 6c 65 64 2e 22 29 3b 0a 0a 09 43 41 43 4b 45  lled.");...CACKE
35ad0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
35ae0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
35af0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c  NCTION_NOT_PARAL
35b00 4c 45 4c 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  LEL (%i)", CKR_F
35b10 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41  UNCTION_NOT_PARA
35b20 4c 4c 45 4c 29 3b 0a 0a 09 72 65 74 75 72 6e 28  LLEL);...return(
35b30 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
35b40 5f 50 41 52 41 4c 4c 45 4c 29 3b 0a 0a 09 68 53  _PARALLEL);...hS
35b50 65 73 73 69 6f 6e 20 3d 20 68 53 65 73 73 69 6f  ession = hSessio
35b60 6e 3b 20 2f 2a 20 53 75 70 72 65 73 73 20 75 6e  n; /* Supress un
35b70 75 73 65 64 20 76 61 72 69 61 62 6c 65 20 77 61  used variable wa
35b80 72 6e 69 6e 67 20 2a 2f 0a 7d 0a 0a 43 4b 5f 44  rning */.}..CK_D
35b90 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
35ba0 4b 5f 52 56 2c 20 43 5f 47 65 74 46 75 6e 63 74  K_RV, C_GetFunct
35bb0 69 6f 6e 4c 69 73 74 29 28 43 4b 5f 46 55 4e 43  ionList)(CK_FUNC
35bc0 54 49 4f 4e 5f 4c 49 53 54 5f 50 54 52 5f 50 54  TION_LIST_PTR_PT
35bd0 52 20 70 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  R ppFunctionList
35be0 29 20 7b 0a 09 73 74 61 74 69 63 20 43 4b 5f 46  ) {..static CK_F
35bf0 55 4e 43 54 49 4f 4e 5f 4c 49 53 54 5f 50 54 52  UNCTION_LIST_PTR
35c00 20 73 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 20   spFunctionList 
35c10 3d 20 4e 55 4c 4c 3b 0a 09 43 4b 5f 46 55 4e 43  = NULL;..CK_FUNC
35c20 54 49 4f 4e 5f 4c 49 53 54 5f 50 54 52 20 70 46  TION_LIST_PTR pF
35c30 75 6e 63 74 69 6f 6e 4c 69 73 74 3b 0a 0a 09 43  unctionList;...C
35c40 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
35c50 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
35c60 09 69 66 20 28 70 70 46 75 6e 63 74 69 6f 6e 4c  .if (ppFunctionL
35c70 69 73 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ist == NULL) {..
35c80 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
35c90 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 70 46  INTF("Error. ppF
35ca0 75 6e 63 74 69 6f 6e 4c 69 73 74 20 69 73 20 4e  unctionList is N
35cb0 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  ULL.");....retur
35cc0 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f  n(CKR_ARGUMENTS_
35cd0 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73  BAD);..}...if (s
35ce0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 20 21 3d  pFunctionList !=
35cf0 20 4e 55 4c 4c 29 20 7b 0a 09 09 2a 70 70 46 75   NULL) {...*ppFu
35d00 6e 63 74 69 6f 6e 4c 69 73 74 20 3d 20 73 70 46  nctionList = spF
35d10 75 6e 63 74 69 6f 6e 4c 69 73 74 3b 0a 0a 09 09  unctionList;....
35d20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
35d30 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
35d40 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52  KR_OK (%i)", CKR
35d50 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  _OK);....return(
35d60 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 70 46  CKR_OK);..}...pF
35d70 75 6e 63 74 69 6f 6e 4c 69 73 74 20 3d 20 6d 61  unctionList = ma
35d80 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70 46 75  lloc(sizeof(*pFu
35d90 6e 63 74 69 6f 6e 4c 69 73 74 29 29 3b 0a 0a 09  nctionList));...
35da0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 76  pFunctionList->v
35db0 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 28  ersion.major = (
35dc0 28 43 41 43 4b 45 59 5f 43 52 59 50 54 4f 4b 49  (CACKEY_CRYPTOKI
35dd0 5f 56 45 52 53 49 4f 4e 5f 43 4f 44 45 29 20 3e  _VERSION_CODE) >
35de0 3e 20 31 36 29 20 26 20 30 78 66 66 3b 0a 09 70  > 16) & 0xff;..p
35df0 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 76 65  FunctionList->ve
35e00 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 28 28  rsion.minor = ((
35e10 43 41 43 4b 45 59 5f 43 52 59 50 54 4f 4b 49 5f  CACKEY_CRYPTOKI_
35e20 56 45 52 53 49 4f 4e 5f 43 4f 44 45 29 20 3e 3e  VERSION_CODE) >>
35e30 20 38 29 20 26 20 30 78 66 66 3b 0a 0a 09 70 46   8) & 0xff;...pF
35e40 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 49  unctionList->C_I
35e50 6e 69 74 69 61 6c 69 7a 65 20 3d 20 43 5f 49 6e  nitialize = C_In
35e60 69 74 69 61 6c 69 7a 65 3b 0a 09 70 46 75 6e 63  itialize;..pFunc
35e70 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 46 69 6e 61  tionList->C_Fina
35e80 6c 69 7a 65 20 3d 20 43 5f 46 69 6e 61 6c 69 7a  lize = C_Finaliz
35e90 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  e;..pFunctionLis
35ea0 74 2d 3e 43 5f 47 65 74 49 6e 66 6f 20 3d 20 43  t->C_GetInfo = C
35eb0 5f 47 65 74 49 6e 66 6f 3b 0a 09 70 46 75 6e 63  _GetInfo;..pFunc
35ec0 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 53  tionList->C_GetS
35ed0 6c 6f 74 4c 69 73 74 20 3d 20 43 5f 47 65 74 53  lotList = C_GetS
35ee0 6c 6f 74 4c 69 73 74 3b 0a 09 70 46 75 6e 63 74  lotList;..pFunct
35ef0 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 53 6c  ionList->C_GetSl
35f00 6f 74 49 6e 66 6f 20 3d 20 43 5f 47 65 74 53 6c  otInfo = C_GetSl
35f10 6f 74 49 6e 66 6f 3b 0a 09 70 46 75 6e 63 74 69  otInfo;..pFuncti
35f20 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 54 6f 6b  onList->C_GetTok
35f30 65 6e 49 6e 66 6f 20 3d 20 43 5f 47 65 74 54 6f  enInfo = C_GetTo
35f40 6b 65 6e 49 6e 66 6f 3b 0a 09 70 46 75 6e 63 74  kenInfo;..pFunct
35f50 69 6f 6e 4c 69 73 74 2d 3e 43 5f 57 61 69 74 46  ionList->C_WaitF
35f60 6f 72 53 6c 6f 74 45 76 65 6e 74 20 3d 20 43 5f  orSlotEvent = C_
35f70 57 61 69 74 46 6f 72 53 6c 6f 74 45 76 65 6e 74  WaitForSlotEvent
35f80 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
35f90 2d 3e 43 5f 47 65 74 4d 65 63 68 61 6e 69 73 6d  ->C_GetMechanism
35fa0 4c 69 73 74 20 3d 20 43 5f 47 65 74 4d 65 63 68  List = C_GetMech
35fb0 61 6e 69 73 6d 4c 69 73 74 3b 0a 09 70 46 75 6e  anismList;..pFun
35fc0 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74  ctionList->C_Get
35fd0 4d 65 63 68 61 6e 69 73 6d 49 6e 66 6f 20 3d 20  MechanismInfo = 
35fe0 43 5f 47 65 74 4d 65 63 68 61 6e 69 73 6d 49 6e  C_GetMechanismIn
35ff0 66 6f 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  fo;..pFunctionLi
36000 73 74 2d 3e 43 5f 49 6e 69 74 54 6f 6b 65 6e 20  st->C_InitToken 
36010 3d 20 43 5f 49 6e 69 74 54 6f 6b 65 6e 3b 0a 09  = C_InitToken;..
36020 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
36030 5f 49 6e 69 74 50 49 4e 20 3d 20 43 5f 49 6e 69  _InitPIN = C_Ini
36040 74 50 49 4e 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  tPIN;..pFunction
36050 4c 69 73 74 2d 3e 43 5f 53 65 74 50 49 4e 20 3d  List->C_SetPIN =
36060 20 43 5f 53 65 74 50 49 4e 3b 0a 09 70 46 75 6e   C_SetPIN;..pFun
36070 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 4f 70 65  ctionList->C_Ope
36080 6e 53 65 73 73 69 6f 6e 20 3d 20 43 5f 4f 70 65  nSession = C_Ope
36090 6e 53 65 73 73 69 6f 6e 3b 0a 09 70 46 75 6e 63  nSession;..pFunc
360a0 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 43 6c 6f 73  tionList->C_Clos
360b0 65 53 65 73 73 69 6f 6e 20 3d 20 43 5f 43 6c 6f  eSession = C_Clo
360c0 73 65 53 65 73 73 69 6f 6e 3b 0a 09 70 46 75 6e  seSession;..pFun
360d0 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 43 6c 6f  ctionList->C_Clo
360e0 73 65 41 6c 6c 53 65 73 73 69 6f 6e 73 20 3d 20  seAllSessions = 
360f0 43 5f 43 6c 6f 73 65 41 6c 6c 53 65 73 73 69 6f  C_CloseAllSessio
36100 6e 73 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  ns;..pFunctionLi
36110 73 74 2d 3e 43 5f 47 65 74 53 65 73 73 69 6f 6e  st->C_GetSession
36120 49 6e 66 6f 20 3d 20 43 5f 47 65 74 53 65 73 73  Info = C_GetSess
36130 69 6f 6e 49 6e 66 6f 3b 0a 09 70 46 75 6e 63 74  ionInfo;..pFunct
36140 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 4f 70  ionList->C_GetOp
36150 65 72 61 74 69 6