Hex Artifact Content

Artifact f036f2ae534f8fa163f8a2c8c3e156308e4cf2f0:


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 53 49 47 4e 20 20 20 20 20 20 20 20  STR_SIGN        
0790: 20 20 20 20 20 20 30 78 32 41 0a 23 64 65 66 69        0x2A.#defi
07a0: 6e 65 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 47  ne GSCIS_INSTR_G
07b0: 45 54 5f 50 52 4f 50 20 20 20 20 20 20 20 20 20  ET_PROP         
07c0: 20 30 78 35 36 0a 23 64 65 66 69 6e 65 20 47 53   0x56.#define GS
07d0: 43 49 53 5f 49 4e 53 54 52 5f 47 45 54 5f 41 43  CIS_INSTR_GET_AC
07e0: 52 20 20 20 20 20 20 20 20 20 20 20 30 78 34 43  R           0x4C
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 52 45 41 44 5f 42 55 46 46 45 52  NSTR_READ_BUFFER
0810: 20 20 20 20 20 20 20 30 78 35 32 0a 23 64 65 66         0x52.#def
0820: 69 6e 65 20 47 53 43 49 53 5f 49 4e 53 54 52 5f  ine GSCIS_INSTR_
0830: 53 49 47 4e 44 45 43 52 59 50 54 20 20 20 20 20  SIGNDECRYPT     
0840: 20 20 30 78 34 32 0a 0a 23 64 65 66 69 6e 65 20    0x42..#define 
0850: 47 53 43 49 53 5f 50 41 52 41 4d 5f 53 45 4c 45  GSCIS_PARAM_SELE
0860: 43 54 5f 41 50 50 4c 45 54 20 20 20 20 20 30 78  CT_APPLET     0x
0870: 30 34 0a 0a 2f 2a 2a 20 54 61 67 73 20 2a 2a 2f  04../** Tags **/
0880: 0a 2f 2a 2a 2a 20 43 43 43 20 54 61 67 73 20 2a  ./*** CCC Tags *
0890: 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 47 53 43 49  **/.#define GSCI
08a0: 53 5f 54 41 47 5f 43 41 52 44 49 44 20 20 20 20  S_TAG_CARDID    
08b0: 20 20 20 20 20 20 20 20 20 20 30 78 46 30 0a 23            0xF0.#
08c0: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47  define GSCIS_TAG
08d0: 5f 43 43 43 5f 56 45 52 20 20 20 20 20 20 20 20  _CCC_VER        
08e0: 20 20 20 20 20 30 78 46 31 0a 23 64 65 66 69 6e       0xF1.#defin
08f0: 65 20 47 53 43 49 53 5f 54 41 47 5f 43 43 47 5f  e GSCIS_TAG_CCG_
0900: 56 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20  VER             
0910: 30 78 46 32 0a 23 64 65 66 69 6e 65 20 47 53 43  0xF2.#define GSC
0920: 49 53 5f 54 41 47 5f 43 41 52 44 55 52 4c 20 20  IS_TAG_CARDURL  
0930: 20 20 20 20 20 20 20 20 20 20 20 30 78 46 33 0a             0xF3.
0940: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
0950: 47 5f 50 4b 43 53 31 35 20 20 20 20 20 20 20 20  G_PKCS15        
0960: 20 20 20 20 20 20 30 78 46 34 0a 23 64 65 66 69        0xF4.#defi
0970: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 52 45 47  ne GSCIS_TAG_REG
0980: 5f 44 41 54 41 5f 4d 4f 44 45 4c 20 20 20 20 20  _DATA_MODEL     
0990: 20 30 78 46 35 0a 23 64 65 66 69 6e 65 20 47 53   0xF5.#define GS
09a0: 43 49 53 5f 54 41 47 5f 41 43 52 5f 54 41 42 4c  CIS_TAG_ACR_TABL
09b0: 45 20 20 20 20 20 20 20 20 20 20 20 30 78 46 36  E           0xF6
09c0: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54  .#define GSCIS_T
09d0: 41 47 5f 43 41 52 44 5f 41 50 44 55 20 20 20 20  AG_CARD_APDU    
09e0: 20 20 20 20 20 20 20 30 78 46 37 0a 23 64 65 66         0xF7.#def
09f0: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 52 45  ine GSCIS_TAG_RE
0a00: 44 49 52 45 43 54 49 4f 4e 20 20 20 20 20 20 20  DIRECTION       
0a10: 20 20 30 78 46 41 0a 23 64 65 66 69 6e 65 20 47    0xFA.#define G
0a20: 53 43 49 53 5f 54 41 47 5f 43 54 20 20 20 20 20  SCIS_TAG_CT     
0a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78 46               0xF
0a40: 42 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f  B.#define GSCIS_
0a50: 54 41 47 5f 53 54 20 20 20 20 20 20 20 20 20 20  TAG_ST          
0a60: 20 20 20 20 20 20 20 20 30 78 46 43 0a 23 64 65          0xFC.#de
0a70: 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 4e  fine GSCIS_TAG_N
0a80: 45 58 54 43 43 43 20 20 20 20 20 20 20 20 20 20  EXTCCC          
0a90: 20 20 20 30 78 46 44 0a 0a 2f 2a 2a 2a 20 47 65     0xFD../*** Ge
0aa0: 6e 65 72 61 6c 20 2d 20 45 46 20 32 32 30 30 20  neral - EF 2200 
0ab0: 2a 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 47 53 43  ***/.#define GSC
0ac0: 49 53 5f 54 41 47 5f 46 4e 41 4d 45 20 20 20 20  IS_TAG_FNAME    
0ad0: 20 20 20 20 20 20 20 20 20 20 20 30 78 30 31 0a             0x01.
0ae0: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
0af0: 47 5f 4d 4e 41 4d 45 20 20 20 20 20 20 20 20 20  G_MNAME         
0b00: 20 20 20 20 20 20 30 78 30 32 0a 23 64 65 66 69        0x02.#defi
0b10: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 4c 4e 41  ne GSCIS_TAG_LNA
0b20: 4d 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ME              
0b30: 20 30 78 30 33 0a 23 64 65 66 69 6e 65 20 47 53   0x03.#define GS
0b40: 43 49 53 5f 54 41 47 5f 53 55 46 46 49 58 20 20  CIS_TAG_SUFFIX  
0b50: 20 20 20 20 20 20 20 20 20 20 20 20 30 78 30 34              0x04
0b60: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54  .#define GSCIS_T
0b70: 41 47 5f 47 4f 56 54 5f 41 47 45 4e 43 59 20 20  AG_GOVT_AGENCY  
0b80: 20 20 20 20 20 20 20 30 78 30 35 0a 23 64 65 66         0x05.#def
0b90: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 42 55  ine GSCIS_TAG_BU
0ba0: 52 45 41 55 20 20 20 20 20 20 20 20 20 20 20 20  REAU            
0bb0: 20 20 30 78 30 36 0a 23 64 65 66 69 6e 65 20 47    0x06.#define G
0bc0: 53 43 49 53 5f 54 41 47 5f 42 55 52 45 41 55 5f  SCIS_TAG_BUREAU_
0bd0: 43 4f 44 45 20 20 20 20 20 20 20 20 20 30 78 30  CODE         0x0
0be0: 37 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f  7.#define GSCIS_
0bf0: 54 41 47 5f 44 45 50 54 5f 43 4f 44 45 20 20 20  TAG_DEPT_CODE   
0c00: 20 20 20 20 20 20 20 20 30 78 30 38 0a 23 64 65          0x08.#de
0c10: 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 54  fine GSCIS_TAG_T
0c20: 49 54 4c 45 20 20 20 20 20 20 20 20 20 20 20 20  ITLE            
0c30: 20 20 20 30 78 30 39 0a 23 64 65 66 69 6e 65 20     0x09.#define 
0c40: 47 53 43 49 53 5f 54 41 47 5f 42 55 49 4c 44 49  GSCIS_TAG_BUILDI
0c50: 4e 47 20 20 20 20 20 20 20 20 20 20 20 20 30 78  NG            0x
0c60: 31 30 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53  10.#define GSCIS
0c70: 5f 54 41 47 5f 4f 46 46 49 43 45 5f 41 44 44 52  _TAG_OFFICE_ADDR
0c80: 31 20 20 20 20 20 20 20 20 30 78 31 31 0a 23 64  1        0x11.#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 32 20 20 20 20  OFFICE_ADDR2    
0cb0: 20 20 20 20 30 78 31 32 0a 23 64 65 66 69 6e 65      0x12.#define
0cc0: 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43   GSCIS_TAG_OFFIC
0cd0: 45 5f 43 49 54 59 20 20 20 20 20 20 20 20 20 30  E_CITY         0
0ce0: 78 31 33 0a 23 64 65 66 69 6e 65 20 47 53 43 49  x13.#define GSCI
0cf0: 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 53 54 41  S_TAG_OFFICE_STA
0d00: 54 45 20 20 20 20 20 20 20 20 30 78 31 34 0a 23  TE        0x14.#
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 5a 49 50 20 20 20 20 20  _OFFICE_ZIP     
0d30: 20 20 20 20 20 30 78 31 35 0a 23 64 65 66 69 6e       0x15.#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 43 4f 55 4e 54 52 59 20 20 20 20 20 20  CE_COUNTRY      
0d60: 30 78 31 36 0a 23 64 65 66 69 6e 65 20 47 53 43  0x16.#define GSC
0d70: 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 50 48  IS_TAG_OFFICE_PH
0d80: 4f 4e 45 20 20 20 20 20 20 20 20 30 78 31 37 0a  ONE        0x17.
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 5f 45  G_OFFICE_PHONE_E
0db0: 58 54 20 20 20 20 30 78 31 38 0a 23 64 65 66 69  XT    0x18.#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 46 41 58 20 20 20 20 20 20 20 20 20  ICE_FAX         
0de0: 20 30 78 31 39 0a 23 64 65 66 69 6e 65 20 47 53   0x19.#define GS
0df0: 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 45  CIS_TAG_OFFICE_E
0e00: 4d 41 49 4c 20 20 20 20 20 20 20 20 30 78 31 41  MAIL        0x1A
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 52 4f 4f 4d 20 20  AG_OFFICE_ROOM  
0e30: 20 20 20 20 20 20 20 30 78 31 42 0a 23 64 65 66         0x1B.#def
0e40: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 4e 4f  ine GSCIS_TAG_NO
0e50: 4e 47 4f 56 5f 41 47 45 4e 43 59 20 20 20 20 20  NGOV_AGENCY     
0e60: 20 20 30 78 31 43 0a 23 64 65 66 69 6e 65 20 47    0x1C.#define G
0e70: 53 43 49 53 5f 54 41 47 5f 53 53 4e 5f 44 45 53  SCIS_TAG_SSN_DES
0e80: 49 47 4e 41 54 4f 52 20 20 20 20 20 20 30 78 31  IGNATOR      0x1
0e90: 44 0a 0a 2f 2a 2a 2a 20 50 49 49 20 2d 20 45 46  D../*** PII - EF
0ea0: 20 32 31 30 30 20 2a 2a 2a 2f 0a 23 64 65 66 69   2100 ***/.#defi
0eb0: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 53 53 4e  ne GSCIS_TAG_SSN
0ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ed0: 20 30 78 32 30 0a 23 64 65 66 69 6e 65 20 47 53   0x20.#define GS
0ee0: 43 49 53 5f 54 41 47 5f 44 4f 42 20 20 20 20 20  CIS_TAG_DOB     
0ef0: 20 20 20 20 20 20 20 20 20 20 20 20 30 78 32 31              0x21
0f00: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54  .#define GSCIS_T
0f10: 41 47 5f 47 45 4e 44 45 52 20 20 20 20 20 20 20  AG_GENDER       
0f20: 20 20 20 20 20 20 20 30 78 32 32 0a 0a 2f 2a 2a         0x22../**
0f30: 2a 20 4c 6f 67 69 6e 20 49 6e 66 6f 72 6d 61 74  * Login Informat
0f40: 69 6f 6e 20 2d 20 45 46 20 34 30 30 30 20 2a 2a  ion - EF 4000 **
0f50: 2a 2f 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53  */.#define GSCIS
0f60: 5f 54 41 47 5f 55 53 45 52 49 44 20 20 20 20 20  _TAG_USERID     
0f70: 20 20 20 20 20 20 20 20 20 30 78 34 30 0a 23 64           0x40.#d
0f80: 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f  efine GSCIS_TAG_
0f90: 44 4f 4d 41 49 4e 20 20 20 20 20 20 20 20 20 20  DOMAIN          
0fa0: 20 20 20 20 30 78 34 31 0a 23 64 65 66 69 6e 65      0x41.#define
0fb0: 20 47 53 43 49 53 5f 54 41 47 5f 50 41 53 53 57   GSCIS_TAG_PASSW
0fc0: 4f 52 44 20 20 20 20 20 20 20 20 20 20 20 20 30  ORD            0
0fd0: 78 34 32 0a 0a 2f 2a 2a 2a 20 43 61 72 64 20 49  x42../*** Card I
0fe0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 45 46 20  nformation - EF 
0ff0: 35 30 30 30 20 2a 2a 2a 2f 0a 23 64 65 66 69 6e  5000 ***/.#defin
1000: 65 20 47 53 43 49 53 5f 54 41 47 5f 49 53 53 55  e GSCIS_TAG_ISSU
1010: 45 52 49 44 20 20 20 20 20 20 20 20 20 20 20 20  ERID            
1020: 30 78 35 30 0a 23 64 65 66 69 6e 65 20 47 53 43  0x50.#define GSC
1030: 49 53 5f 54 41 47 5f 53 45 52 4e 4f 20 20 20 20  IS_TAG_SERNO    
1040: 20 20 20 20 20 20 20 20 20 20 20 30 78 35 31 0a             0x51.
1050: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
1060: 47 5f 49 53 53 55 45 5f 44 41 54 45 20 20 20 20  G_ISSUE_DATE    
1070: 20 20 20 20 20 20 30 78 35 32 0a 23 64 65 66 69        0x52.#defi
1080: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 45 58 50  ne GSCIS_TAG_EXP
1090: 49 52 45 5f 44 41 54 45 20 20 20 20 20 20 20 20  IRE_DATE        
10a0: 20 30 78 35 33 0a 23 64 65 66 69 6e 65 20 47 53   0x53.#define GS
10b0: 43 49 53 5f 54 41 47 5f 43 41 52 44 5f 54 59 50  CIS_TAG_CARD_TYP
10c0: 45 20 20 20 20 20 20 20 20 20 20 20 30 78 35 34  E           0x54
10d0: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54  .#define GSCIS_T
10e0: 41 47 5f 53 45 43 55 52 49 54 59 5f 43 4f 44 45  AG_SECURITY_CODE
10f0: 20 20 20 20 20 20 20 30 78 35 37 0a 23 64 65 66         0x57.#def
1100: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 43 41  ine GSCIS_TAG_CA
1110: 52 44 49 44 5f 41 49 44 20 20 20 20 20 20 20 20  RDID_AID        
1120: 20 20 30 78 35 38 0a 0a 2f 2a 2a 2a 20 50 49 56    0x58../*** PIV
1130: 20 43 6f 64 65 73 20 2a 2a 2a 2f 0a 23 64 65 66   Codes ***/.#def
1140: 69 6e 65 20 4e 49 53 54 53 50 38 30 30 5f 37 33  ine NISTSP800_73
1150: 5f 33 5f 49 4e 53 54 52 5f 47 45 54 5f 44 41 54  _3_INSTR_GET_DAT
1160: 41 20 30 78 43 42 0a 23 64 65 66 69 6e 65 20 4e  A 0xCB.#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 4e 41 55 54 48 20 20 30 78 38  STR_GENAUTH  0x8
1190: 37 0a 0a 2f 2a 2a 2a 20 50 4b 49 20 49 6e 66 6f  7../*** PKI Info
11a0: 72 6d 61 74 69 6f 6e 20 2d 20 45 46 20 37 30 30  rmation - EF 700
11b0: 30 20 2a 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 47  0 ***/.#define G
11c0: 53 43 49 53 5f 54 41 47 5f 43 45 52 54 49 46 49  SCIS_TAG_CERTIFI
11d0: 43 41 54 45 20 20 20 20 20 20 20 20 20 30 78 37  CATE         0x7
11e0: 30 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f  0.#define GSCIS_
11f0: 54 41 47 5f 43 45 52 54 5f 49 53 53 55 45 5f 44  TAG_CERT_ISSUE_D
1200: 41 54 45 20 20 20 20 20 30 78 37 31 0a 23 64 65  ATE     0x71.#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 45 58 50 49 52 45 5f 44 41 54 45 20  ERT_EXPIRE_DATE 
1230: 20 20 20 30 78 37 32 0a 0a 2f 2a 2a 20 41 70 70     0x72../** App
1240: 6c 65 74 20 49 44 73 20 2a 2a 2f 0a 23 64 65 66  let IDs **/.#def
1250: 69 6e 65 20 47 53 43 49 53 5f 41 49 44 5f 43 43  ine GSCIS_AID_CC
1260: 43 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  C               
1270: 20 20 30 78 41 30 2c 20 30 78 30 30 2c 20 30 78    0xA0, 0x00, 0x
1280: 30 30 2c 20 30 78 30 31 2c 20 30 78 31 36 2c 20  00, 0x01, 0x16, 
1290: 30 78 44 42 2c 20 30 78 30 30 0a 23 64 65 66 69  0xDB, 0x00.#defi
12a0: 6e 65 20 4e 49 53 54 53 50 38 30 30 5f 37 33 5f  ne NISTSP800_73_
12b0: 33 5f 50 49 56 5f 41 49 44 20 20 20 20 20 20 20  3_PIV_AID       
12c0: 20 30 78 41 30 2c 20 30 78 30 30 2c 20 30 78 30   0xA0, 0x00, 0x0
12d0: 30 2c 20 30 78 30 33 2c 20 30 78 30 38 2c 20 30  0, 0x03, 0x08, 0
12e0: 78 30 30 2c 20 30 78 30 30 2c 20 30 78 31 30 2c  x00, 0x00, 0x10,
12f0: 20 30 78 30 30 2c 20 30 78 30 31 2c 20 30 78 30   0x00, 0x01, 0x0
1300: 30 0a 0a 2f 2a 20 50 49 56 20 49 44 73 20 2a 2f  0../* PIV IDs */
1310: 0a 2f 2a 2a 20 4b 65 79 20 49 64 65 6e 74 69 66  ./** Key Identif
1320: 69 65 72 73 20 28 4e 49 53 54 20 53 50 20 38 30  iers (NIST SP 80
1330: 30 2d 37 38 2d 33 2c 20 54 61 62 6c 65 20 36 2d  0-78-3, Table 6-
1340: 31 20 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 49  1 **/.#define NI
1350: 53 54 53 50 38 30 30 5f 37 38 5f 33 5f 4b 45 59  STSP800_78_3_KEY
1360: 5f 50 49 56 41 55 54 48 20 20 20 30 78 39 41 0a  _PIVAUTH   0x9A.
1370: 23 64 65 66 69 6e 65 20 4e 49 53 54 53 50 38 30  #define NISTSP80
1380: 30 5f 37 38 5f 33 5f 4b 45 59 5f 53 49 47 4e 41  0_78_3_KEY_SIGNA
1390: 54 55 52 45 20 30 78 39 43 0a 23 64 65 66 69 6e  TURE 0x9C.#defin
13a0: 65 20 4e 49 53 54 53 50 38 30 30 5f 37 38 5f 33  e NISTSP800_78_3
13b0: 5f 4b 45 59 5f 4b 45 59 4d 47 54 20 20 20 20 30  _KEY_KEYMGT    0
13c0: 78 39 44 0a 23 64 65 66 69 6e 65 20 4e 49 53 54  x9D.#define NIST
13d0: 53 50 38 30 30 5f 37 38 5f 33 5f 4b 45 59 5f 43  SP800_78_3_KEY_C
13e0: 41 52 44 41 55 54 48 20 20 30 78 39 45 0a 0a 2f  ARDAUTH  0x9E../
13f0: 2a 2a 20 41 6c 67 6f 72 69 74 68 6d 20 49 64 65  ** Algorithm Ide
1400: 6e 74 69 66 69 65 72 73 20 28 4e 49 53 54 20 53  ntifiers (NIST S
1410: 50 20 38 30 30 2d 37 38 2d 33 2c 20 54 61 62 6c  P 800-78-3, Tabl
1420: 65 20 36 2d 32 20 2a 2a 2f 0a 23 64 65 66 69 6e  e 6-2 **/.#defin
1430: 65 20 4e 49 53 54 53 50 38 30 30 5f 37 38 5f 33  e NISTSP800_78_3
1440: 5f 41 4c 47 4f 5f 52 53 41 31 30 32 34 20 20 30  _ALGO_RSA1024  0
1450: 78 30 36 0a 23 64 65 66 69 6e 65 20 4e 49 53 54  x06.#define NIST
1460: 53 50 38 30 30 5f 37 38 5f 33 5f 41 4c 47 4f 5f  SP800_78_3_ALGO_
1470: 52 53 41 32 30 34 38 20 20 30 78 30 37 0a 0a 2f  RSA2048  0x07../
1480: 2a 2a 20 4f 62 6a 65 63 74 20 49 64 65 6e 74 69  ** Object Identi
1490: 66 69 65 72 73 20 28 4e 49 53 54 20 53 50 20 38  fiers (NIST SP 8
14a0: 30 30 2d 37 33 2d 33 20 50 61 72 74 20 31 2c 20  00-73-3 Part 1, 
14b0: 54 61 62 6c 65 20 32 29 20 2a 2a 2f 0a 23 64 65  Table 2) **/.#de
14c0: 66 69 6e 65 20 4e 49 53 54 53 50 38 30 30 5f 37  fine NISTSP800_7
14d0: 33 5f 33 5f 4f 49 44 5f 50 49 56 41 55 54 48 20  3_3_OID_PIVAUTH 
14e0: 20 20 30 78 35 46 2c 20 30 78 43 31 2c 20 30 78    0x5F, 0xC1, 0x
14f0: 30 35 0a 23 64 65 66 69 6e 65 20 4e 49 53 54 53  05.#define NISTS
1500: 50 38 30 30 5f 37 33 5f 33 5f 4f 49 44 5f 53 49  P800_73_3_OID_SI
1510: 47 4e 41 54 55 52 45 20 30 78 35 46 2c 20 30 78  GNATURE 0x5F, 0x
1520: 43 31 2c 20 30 78 30 41 0a 23 64 65 66 69 6e 65  C1, 0x0A.#define
1530: 20 4e 49 53 54 53 50 38 30 30 5f 37 33 5f 33 5f   NISTSP800_73_3_
1540: 4f 49 44 5f 4b 45 59 4d 47 54 20 20 20 20 30 78  OID_KEYMGT    0x
1550: 35 46 2c 20 30 78 43 31 2c 20 30 78 30 42 0a 23  5F, 0xC1, 0x0B.#
1560: 64 65 66 69 6e 65 20 4e 49 53 54 53 50 38 30 30  define NISTSP800
1570: 5f 37 33 5f 33 5f 4f 49 44 5f 43 41 52 44 41 55  _73_3_OID_CARDAU
1580: 54 48 20 20 30 78 35 46 2c 20 30 78 43 31 2c 20  TH  0x5F, 0xC1, 
1590: 30 78 30 31 0a 0a 2f 2a 20 4d 61 78 69 6d 75 6d  0x01../* Maximum
15a0: 20 73 69 7a 65 20 6f 66 20 64 61 74 61 20 70 6f   size of data po
15b0: 72 74 69 6f 6e 20 6f 66 20 41 50 44 55 73 20 2a  rtion of APDUs *
15c0: 2f 0a 2f 2a 2a 20 44 6f 20 6e 6f 74 20 73 65 74  /./** Do not set
15d0: 20 74 68 69 73 20 61 62 6f 76 65 20 32 35 30 20   this above 250 
15e0: 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 43 41 43 4b  **/.#define CACK
15f0: 45 59 5f 41 50 44 55 5f 4d 54 55 20 20 20 20 20  EY_APDU_MTU     
1600: 20 20 20 20 20 20 20 20 20 20 32 35 30 0a 0a 2f            250../
1610: 2a 20 41 54 52 20 49 66 20 6e 6f 74 20 61 76 61  * ATR If not ava
1620: 69 6c 61 62 6c 65 20 2a 2f 0a 23 69 66 6e 64 65  ilable */.#ifnde
1630: 66 20 4d 41 58 5f 41 54 52 5f 53 49 5a 45 0a 23  f MAX_ATR_SIZE.#
1640: 64 65 66 69 6e 65 20 4d 41 58 5f 41 54 52 5f 53  define MAX_ATR_S
1650: 49 5a 45 20 31 30 32 34 0a 23 65 6e 64 69 66 0a  IZE 1024.#endif.
1660: 0a 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f 44  .#ifdef CACKEY_D
1670: 45 42 55 47 0a 23 20 20 69 66 64 65 66 20 48 41  EBUG.#  ifdef HA
1680: 56 45 5f 54 49 4d 45 5f 48 0a 23 20 20 20 20 69  VE_TIME_H.#    i
1690: 6e 63 6c 75 64 65 20 3c 74 69 6d 65 2e 68 3e 0a  nclude <time.h>.
16a0: 73 74 61 74 69 63 20 74 69 6d 65 5f 74 20 63 61  static time_t ca
16b0: 63 6b 65 79 5f 64 65 62 75 67 5f 73 74 61 72 74  ckey_debug_start
16c0: 5f 74 69 6d 65 20 3d 20 30 3b 0a 73 74 61 74 69  _time = 0;.stati
16d0: 63 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  c unsigned long 
16e0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 47 45 54  CACKEY_DEBUG_GET
16f0: 54 49 4d 45 28 76 6f 69 64 29 20 7b 0a 09 69 66  TIME(void) {..if
1700: 20 28 63 61 63 6b 65 79 5f 64 65 62 75 67 5f 73   (cackey_debug_s
1710: 74 61 72 74 5f 74 69 6d 65 20 3d 3d 20 30 29 20  tart_time == 0) 
1720: 7b 0a 09 09 63 61 63 6b 65 79 5f 64 65 62 75 67  {...cackey_debug
1730: 5f 73 74 61 72 74 5f 74 69 6d 65 20 3d 20 74 69  _start_time = ti
1740: 6d 65 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 72  me(NULL);..}...r
1750: 65 74 75 72 6e 28 74 69 6d 65 28 4e 55 4c 4c 29  eturn(time(NULL)
1760: 20 2d 20 63 61 63 6b 65 79 5f 64 65 62 75 67 5f   - cackey_debug_
1770: 73 74 61 72 74 5f 74 69 6d 65 29 3b 0a 7d 0a 23  start_time);.}.#
1780: 20 20 65 6c 73 65 0a 73 74 61 74 69 63 20 75 6e    else.static un
1790: 73 69 67 6e 65 64 20 6c 6f 6e 67 20 43 41 43 4b  signed long CACK
17a0: 45 59 5f 44 45 42 55 47 5f 47 45 54 54 49 4d 45  EY_DEBUG_GETTIME
17b0: 28 76 6f 69 64 29 20 7b 0a 09 72 65 74 75 72 6e  (void) {..return
17c0: 28 30 29 3b 0a 7d 0a 23 20 20 65 6e 64 69 66 0a  (0);.}.#  endif.
17d0: 0a 23 20 20 64 65 66 69 6e 65 20 43 41 43 4b 45  .#  define CACKE
17e0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 78  Y_DEBUG_PRINTF(x
17f0: 2e 2e 2e 29 20 7b 20 5c 0a 09 73 74 61 74 69 63  ...) { \..static
1800: 20 63 68 61 72 20 62 75 66 5f 75 73 65 72 5b 34   char buf_user[4
1810: 30 39 36 5d 20 3d 20 7b 30 7d 3b 20 5c 0a 09 73  096] = {0}; \..s
1820: 6e 70 72 69 6e 74 66 28 62 75 66 5f 75 73 65 72  nprintf(buf_user
1830: 2c 20 73 69 7a 65 6f 66 28 62 75 66 5f 75 73 65  , sizeof(buf_use
1840: 72 29 2c 20 78 29 3b 20 5c 0a 09 62 75 66 5f 75  r), x); \..buf_u
1850: 73 65 72 5b 73 69 7a 65 6f 66 28 62 75 66 5f 75  ser[sizeof(buf_u
1860: 73 65 72 29 20 2d 20 31 5d 20 3d 20 27 5c 30 27  ser) - 1] = '\0'
1870: 3b 20 5c 0a 09 66 70 72 69 6e 74 66 28 63 61 63  ; \..fprintf(cac
1880: 6b 65 79 5f 64 65 62 75 67 5f 66 64 28 29 2c 20  key_debug_fd(), 
1890: 22 5b 25 6c 75 5d 3a 20 25 73 28 29 3a 25 69 3a  "[%lu]: %s():%i:
18a0: 20 25 73 5c 6e 22 2c 20 43 41 43 4b 45 59 5f 44   %s\n", CACKEY_D
18b0: 45 42 55 47 5f 47 45 54 54 49 4d 45 28 29 2c 20  EBUG_GETTIME(), 
18c0: 5f 5f 66 75 6e 63 5f 5f 2c 20 5f 5f 4c 49 4e 45  __func__, __LINE
18d0: 5f 5f 2c 20 62 75 66 5f 75 73 65 72 29 3b 20 5c  __, buf_user); \
18e0: 0a 09 66 66 6c 75 73 68 28 63 61 63 6b 65 79 5f  ..fflush(cackey_
18f0: 64 65 62 75 67 5f 66 64 28 29 29 3b 20 5c 0a 7d  debug_fd()); \.}
1900: 0a 23 20 20 64 65 66 69 6e 65 20 43 41 43 4b 45  .#  define CACKE
1910: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46  Y_DEBUG_PRINTBUF
1920: 28 66 2c 20 78 2c 20 79 29 20 7b 20 5c 0a 09 73  (f, x, y) { \..s
1930: 74 61 74 69 63 20 63 68 61 72 20 62 75 66 5f 75  tatic char buf_u
1940: 73 65 72 5b 34 30 39 36 5d 20 3d 20 7b 30 7d 2c  ser[4096] = {0},
1950: 20 2a 62 75 66 5f 75 73 65 72 5f 70 3b 20 5c 0a   *buf_user_p; \.
1960: 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 62  .unsigned long b
1970: 75 66 5f 75 73 65 72 5f 73 69 7a 65 3b 20 5c 0a  uf_user_size; \.
1980: 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  .unsigned char *
1990: 54 4d 50 42 55 46 3b 20 5c 0a 09 75 6e 73 69 67  TMPBUF; \..unsig
19a0: 6e 65 64 20 6c 6f 6e 67 20 69 64 78 3b 20 5c 0a  ned long idx; \.
19b0: 09 69 6e 74 20 73 6e 70 72 69 6e 74 66 5f 72 65  .int snprintf_re
19c0: 74 3b 20 5c 0a 09 54 4d 50 42 55 46 20 3d 20 28  t; \..TMPBUF = (
19d0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
19e0: 20 28 78 29 3b 20 5c 0a 09 62 75 66 5f 75 73 65   (x); \..buf_use
19f0: 72 5b 30 5d 20 3d 20 30 3b 20 5c 0a 09 62 75 66  r[0] = 0; \..buf
1a00: 5f 75 73 65 72 5f 70 20 3d 20 62 75 66 5f 75 73  _user_p = buf_us
1a10: 65 72 3b 20 5c 0a 09 62 75 66 5f 75 73 65 72 5f  er; \..buf_user_
1a20: 73 69 7a 65 20 3d 20 73 69 7a 65 6f 66 28 62 75  size = sizeof(bu
1a30: 66 5f 75 73 65 72 29 3b 20 5c 0a 09 66 6f 72 20  f_user); \..for 
1a40: 28 69 64 78 20 3d 20 31 3b 20 69 64 78 20 3c 20  (idx = 1; idx < 
1a50: 28 79 29 3b 20 69 64 78 2b 2b 29 20 7b 20 5c 0a  (y); idx++) { \.
1a60: 09 09 69 66 20 28 62 75 66 5f 75 73 65 72 5f 73  ..if (buf_user_s
1a70: 69 7a 65 20 3c 3d 20 30 29 20 7b 20 5c 0a 09 09  ize <= 0) { \...
1a80: 09 62 72 65 61 6b 3b 20 5c 0a 09 09 7d 3b 20 5c  .break; \...}; \
1a90: 0a 09 09 73 6e 70 72 69 6e 74 66 5f 72 65 74 20  ...snprintf_ret 
1aa0: 3d 20 73 6e 70 72 69 6e 74 66 28 62 75 66 5f 75  = snprintf(buf_u
1ab0: 73 65 72 5f 70 2c 20 62 75 66 5f 75 73 65 72 5f  ser_p, buf_user_
1ac0: 73 69 7a 65 2c 20 22 2c 20 25 30 32 78 22 2c 20  size, ", %02x", 
1ad0: 54 4d 50 42 55 46 5b 69 64 78 5d 29 3b 20 5c 0a  TMPBUF[idx]); \.
1ae0: 09 09 69 66 20 28 73 6e 70 72 69 6e 74 66 5f 72  ..if (snprintf_r
1af0: 65 74 20 3c 3d 20 30 29 20 7b 20 5c 0a 09 09 09  et <= 0) { \....
1b00: 62 72 65 61 6b 3b 20 5c 0a 09 09 7d 3b 20 5c 0a  break; \...}; \.
1b10: 09 09 62 75 66 5f 75 73 65 72 5f 70 20 2b 3d 20  ..buf_user_p += 
1b20: 73 6e 70 72 69 6e 74 66 5f 72 65 74 3b 20 5c 0a  snprintf_ret; \.
1b30: 09 09 62 75 66 5f 75 73 65 72 5f 73 69 7a 65 20  ..buf_user_size 
1b40: 2d 3d 20 73 6e 70 72 69 6e 74 66 5f 72 65 74 3b  -= snprintf_ret;
1b50: 20 5c 0a 09 7d 3b 20 5c 0a 09 62 75 66 5f 75 73   \..}; \..buf_us
1b60: 65 72 5b 73 69 7a 65 6f 66 28 62 75 66 5f 75 73  er[sizeof(buf_us
1b70: 65 72 29 20 2d 20 31 5d 20 3d 20 27 5c 30 27 3b  er) - 1] = '\0';
1b80: 20 5c 0a 09 66 70 72 69 6e 74 66 28 63 61 63 6b   \..fprintf(cack
1b90: 65 79 5f 64 65 62 75 67 5f 66 64 28 29 2c 20 22  ey_debug_fd(), "
1ba0: 5b 25 6c 75 5d 3a 20 25 73 28 29 3a 25 69 3a 20  [%lu]: %s():%i: 
1bb0: 25 73 20 20 28 25 73 2f 25 6c 75 20 3d 20 7b 25  %s  (%s/%lu = {%
1bc0: 30 32 78 25 73 7d 29 5c 6e 22 2c 20 43 41 43 4b  02x%s})\n", CACK
1bd0: 45 59 5f 44 45 42 55 47 5f 47 45 54 54 49 4d 45  EY_DEBUG_GETTIME
1be0: 28 29 2c 20 5f 5f 66 75 6e 63 5f 5f 2c 20 5f 5f  (), __func__, __
1bf0: 4c 49 4e 45 5f 5f 2c 20 66 2c 20 23 78 2c 20 28  LINE__, f, #x, (
1c00: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 28  unsigned long) (
1c10: 79 29 2c 20 54 4d 50 42 55 46 5b 30 5d 2c 20 62  y), TMPBUF[0], b
1c20: 75 66 5f 75 73 65 72 29 3b 20 5c 0a 09 66 66 6c  uf_user); \..ffl
1c30: 75 73 68 28 63 61 63 6b 65 79 5f 64 65 62 75 67  ush(cackey_debug
1c40: 5f 66 64 28 29 29 3b 20 5c 0a 7d 0a 23 20 20 64  _fd()); \.}.#  d
1c50: 65 66 69 6e 65 20 66 72 65 65 28 78 29 20 7b 20  efine free(x) { 
1c60: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1c70: 4e 54 46 28 22 46 52 45 45 28 25 70 29 20 28 25  NTF("FREE(%p) (%
1c80: 73 29 22 2c 20 28 76 6f 69 64 20 2a 29 20 78 2c  s)", (void *) x,
1c90: 20 23 78 29 3b 20 66 72 65 65 28 78 29 3b 20 7d   #x); free(x); }
1ca0: 0a 0a 73 74 61 74 69 63 20 46 49 4c 45 20 2a 63  ..static FILE *c
1cb0: 61 63 6b 65 79 5f 64 65 62 75 67 5f 66 64 28 76  ackey_debug_fd(v
1cc0: 6f 69 64 29 20 7b 0a 09 73 74 61 74 69 63 20 46  oid) {..static F
1cd0: 49 4c 45 20 2a 66 64 20 3d 20 4e 55 4c 4c 3b 0a  ILE *fd = NULL;.
1ce0: 09 63 68 61 72 20 2a 6c 6f 67 66 69 6c 65 3b 0a  .char *logfile;.
1cf0: 0a 09 69 66 20 28 66 64 20 21 3d 20 4e 55 4c 4c  ..if (fd != NULL
1d00: 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 66 64 29  ) {...return(fd)
1d10: 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 2a 20 4c 6f  ;..}.../*.. * Lo
1d20: 67 20 74 6f 20 73 74 64 65 72 72 20 69 6e 69 74  g to stderr init
1d30: 69 61 6c 6c 79 20 73 6f 20 77 65 20 63 61 6e 20  ially so we can 
1d40: 75 73 65 20 64 65 62 75 67 67 69 6e 67 20 77 69  use debugging wi
1d50: 74 68 69 6e 0a 09 20 2a 20 74 68 69 73 20 66 75  thin.. * this fu
1d60: 6e 63 74 69 6f 6e 20 77 69 74 68 6f 75 74 20 67  nction without g
1d70: 65 74 74 69 6e 67 20 69 6e 74 6f 20 61 6e 20 69  etting into an i
1d80: 6e 66 69 6e 69 74 65 20 6c 6f 6f 70 0a 09 20 2a  nfinite loop.. *
1d90: 2f 0a 09 66 64 20 3d 20 73 74 64 65 72 72 3b 0a  /..fd = stderr;.
1da0: 0a 09 6c 6f 67 66 69 6c 65 20 3d 20 67 65 74 65  ..logfile = gete
1db0: 6e 76 28 22 43 41 43 4b 45 59 5f 44 45 42 55 47  nv("CACKEY_DEBUG
1dc0: 5f 4c 4f 47 46 49 4c 45 22 29 3b 0a 09 69 66 20  _LOGFILE");..if 
1dd0: 28 6c 6f 67 66 69 6c 65 20 21 3d 20 4e 55 4c 4c  (logfile != NULL
1de0: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1df0: 55 47 5f 50 52 49 4e 54 46 28 22 46 6f 75 6e 64  UG_PRINTF("Found
1e00: 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72   environment var
1e10: 69 61 62 6c 65 3a 20 25 73 22 2c 20 6c 6f 67 66  iable: %s", logf
1e20: 69 6c 65 29 3b 0a 0a 09 09 6c 6f 67 66 69 6c 65  ile);....logfile
1e30: 20 3d 20 73 74 72 63 68 72 28 6c 6f 67 66 69 6c   = strchr(logfil
1e40: 65 2c 20 27 3d 27 29 3b 0a 09 09 69 66 20 28 6c  e, '=');...if (l
1e50: 6f 67 66 69 6c 65 20 3d 3d 20 4e 55 4c 4c 29 20  ogfile == NULL) 
1e60: 7b 0a 09 09 09 6c 6f 67 66 69 6c 65 20 3d 20 67  {....logfile = g
1e70: 65 74 65 6e 76 28 22 43 41 43 4b 45 59 5f 44 45  etenv("CACKEY_DE
1e80: 42 55 47 5f 4c 4f 47 46 49 4c 45 22 29 3b 0a 09  BUG_LOGFILE");..
1e90: 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 6c 6f 67  .} else {....log
1ea0: 66 69 6c 65 2b 2b 3b 0a 09 09 7d 0a 09 7d 0a 0a  file++;...}..}..
1eb0: 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f 44 45  #ifdef CACKEY_DE
1ec0: 42 55 47 5f 4c 4f 47 46 49 4c 45 0a 09 69 66 20  BUG_LOGFILE..if 
1ed0: 28 6c 6f 67 66 69 6c 65 20 3d 3d 20 4e 55 4c 4c  (logfile == NULL
1ee0: 29 20 7b 0a 09 09 6c 6f 67 66 69 6c 65 20 3d 20  ) {...logfile = 
1ef0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 4c 4f 47  CACKEY_DEBUG_LOG
1f00: 46 49 4c 45 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a  FILE;..}.#endif.
1f10: 0a 09 69 66 20 28 6c 6f 67 66 69 6c 65 20 21 3d  ..if (logfile !=
1f20: 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
1f30: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1f40: 46 6f 75 6e 64 20 6c 6f 67 20 66 69 6c 65 3a 20  Found log file: 
1f50: 25 73 22 2c 20 6c 6f 67 66 69 6c 65 29 3b 0a 0a  %s", logfile);..
1f60: 09 09 66 64 20 3d 20 66 6f 70 65 6e 28 6c 6f 67  ..fd = fopen(log
1f70: 66 69 6c 65 2c 20 22 61 22 29 3b 0a 09 7d 0a 0a  file, "a");..}..
1f80: 09 69 66 20 28 66 64 20 3d 3d 20 4e 55 4c 4c 29  .if (fd == NULL)
1f90: 20 7b 0a 09 09 66 64 20 3d 20 73 74 64 65 72 72   {...fd = stderr
1fa0: 3b 0a 09 7d 0a 0a 09 69 66 20 28 66 64 20 3d 3d  ;..}...if (fd ==
1fb0: 20 73 74 64 65 72 72 29 20 7b 0a 09 09 43 41 43   stderr) {...CAC
1fc0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1fd0: 28 22 52 65 74 75 72 6e 69 6e 67 20 73 74 64 65  ("Returning stde
1fe0: 72 72 22 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a  rr");..} else {.
1ff0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2000: 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
2010: 20 25 70 22 2c 20 28 76 6f 69 64 20 2a 29 20 66   %p", (void *) f
2020: 64 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28  d);..}...return(
2030: 66 64 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  fd);.}..static v
2040: 6f 69 64 20 2a 43 41 43 4b 45 59 5f 44 45 42 55  oid *CACKEY_DEBU
2050: 47 5f 46 55 4e 43 5f 4d 41 4c 4c 4f 43 28 73 69  G_FUNC_MALLOC(si
2060: 7a 65 5f 74 20 73 69 7a 65 2c 20 63 6f 6e 73 74  ze_t size, const
2070: 20 63 68 61 72 20 2a 66 75 6e 63 2c 20 69 6e 74   char *func, int
2080: 20 6c 69 6e 65 29 20 7b 0a 09 76 6f 69 64 20 2a   line) {..void *
2090: 72 65 74 76 61 6c 3b 0a 0a 09 72 65 74 76 61 6c  retval;...retval
20a0: 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 29 3b   = malloc(size);
20b0: 0a 0a 09 66 70 72 69 6e 74 66 28 63 61 63 6b 65  ...fprintf(cacke
20c0: 79 5f 64 65 62 75 67 5f 66 64 28 29 2c 20 22 5b  y_debug_fd(), "[
20d0: 25 6c 75 5d 3a 20 25 73 28 29 3a 25 69 3a 20 4d  %lu]: %s():%i: M
20e0: 41 4c 4c 4f 43 28 29 20 3d 20 25 70 5c 6e 22 2c  ALLOC() = %p\n",
20f0: 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 47 45   CACKEY_DEBUG_GE
2100: 54 54 49 4d 45 28 29 2c 20 66 75 6e 63 2c 20 6c  TTIME(), func, l
2110: 69 6e 65 2c 20 72 65 74 76 61 6c 29 3b 0a 09 66  ine, retval);..f
2120: 66 6c 75 73 68 28 63 61 63 6b 65 79 5f 64 65 62  flush(cackey_deb
2130: 75 67 5f 66 64 28 29 29 3b 0a 0a 09 72 65 74 75  ug_fd());...retu
2140: 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 73  rn(retval);.}..s
2150: 74 61 74 69 63 20 76 6f 69 64 20 2a 43 41 43 4b  tatic void *CACK
2160: 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 52 45  EY_DEBUG_FUNC_RE
2170: 41 4c 4c 4f 43 28 76 6f 69 64 20 2a 70 74 72 2c  ALLOC(void *ptr,
2180: 20 73 69 7a 65 5f 74 20 73 69 7a 65 2c 20 63 6f   size_t size, co
2190: 6e 73 74 20 63 68 61 72 20 2a 66 75 6e 63 2c 20  nst char *func, 
21a0: 69 6e 74 20 6c 69 6e 65 29 20 7b 0a 09 76 6f 69  int line) {..voi
21b0: 64 20 2a 72 65 74 76 61 6c 3b 0a 0a 09 72 65 74  d *retval;...ret
21c0: 76 61 6c 20 3d 20 72 65 61 6c 6c 6f 63 28 70 74  val = realloc(pt
21d0: 72 2c 20 73 69 7a 65 29 3b 0a 0a 09 69 66 20 28  r, size);...if (
21e0: 72 65 74 76 61 6c 20 21 3d 20 70 74 72 29 20 7b  retval != ptr) {
21f0: 0a 09 09 66 70 72 69 6e 74 66 28 63 61 63 6b 65  ...fprintf(cacke
2200: 79 5f 64 65 62 75 67 5f 66 64 28 29 2c 20 22 5b  y_debug_fd(), "[
2210: 25 6c 75 5d 3a 20 25 73 28 29 3a 25 69 3a 20 52  %lu]: %s():%i: R
2220: 45 41 4c 4c 4f 43 28 25 70 29 20 3d 20 25 70 5c  EALLOC(%p) = %p\
2230: 6e 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47  n", CACKEY_DEBUG
2240: 5f 47 45 54 54 49 4d 45 28 29 2c 20 66 75 6e 63  _GETTIME(), func
2250: 2c 20 6c 69 6e 65 2c 20 70 74 72 2c 20 72 65 74  , line, ptr, ret
2260: 76 61 6c 29 3b 0a 09 09 66 66 6c 75 73 68 28 63  val);...fflush(c
2270: 61 63 6b 65 79 5f 64 65 62 75 67 5f 66 64 28 29  ackey_debug_fd()
2280: 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 72 65 74 76  );..}...if (retv
2290: 61 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  al == NULL) {...
22a0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
22b0: 4e 54 46 28 22 20 2a 2a 2a 20 45 52 52 4f 52 20  NTF(" *** ERROR 
22c0: 2a 2a 2a 20 72 65 61 6c 6c 6f 63 20 72 65 74 75  *** realloc retu
22d0: 72 6e 65 64 20 4e 55 4c 4c 20 28 73 69 7a 65 20  rned NULL (size 
22e0: 3d 20 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e  = %lu)", (unsign
22f0: 65 64 20 6c 6f 6e 67 29 20 73 69 7a 65 29 3b 0a  ed long) size);.
2300: 09 7d 0a 0a 09 72 65 74 75 72 6e 28 72 65 74 76  .}...return(retv
2310: 61 6c 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 63  al);.}..static c
2320: 68 61 72 20 2a 43 41 43 4b 45 59 5f 44 45 42 55  har *CACKEY_DEBU
2330: 47 5f 46 55 4e 43 5f 53 54 52 44 55 50 28 63 6f  G_FUNC_STRDUP(co
2340: 6e 73 74 20 63 68 61 72 20 2a 70 74 72 2c 20 63  nst char *ptr, c
2350: 6f 6e 73 74 20 63 68 61 72 20 2a 66 75 6e 63 2c  onst char *func,
2360: 20 69 6e 74 20 6c 69 6e 65 29 20 7b 0a 09 63 68   int line) {..ch
2370: 61 72 20 2a 72 65 74 76 61 6c 3b 0a 0a 09 72 65  ar *retval;...re
2380: 74 76 61 6c 20 3d 20 73 74 72 64 75 70 28 70 74  tval = strdup(pt
2390: 72 29 3b 0a 0a 09 66 70 72 69 6e 74 66 28 63 61  r);...fprintf(ca
23a0: 63 6b 65 79 5f 64 65 62 75 67 5f 66 64 28 29 2c  ckey_debug_fd(),
23b0: 20 22 5b 25 6c 75 5d 3a 20 25 73 28 29 3a 25 69   "[%lu]: %s():%i
23c0: 3a 20 53 54 52 44 55 50 5f 4d 41 4c 4c 4f 43 28  : STRDUP_MALLOC(
23d0: 29 20 3d 20 25 70 5c 6e 22 2c 20 43 41 43 4b 45  ) = %p\n", CACKE
23e0: 59 5f 44 45 42 55 47 5f 47 45 54 54 49 4d 45 28  Y_DEBUG_GETTIME(
23f0: 29 2c 20 66 75 6e 63 2c 20 6c 69 6e 65 2c 20 72  ), func, line, r
2400: 65 74 76 61 6c 29 3b 0a 09 66 66 6c 75 73 68 28  etval);..fflush(
2410: 63 61 63 6b 65 79 5f 64 65 62 75 67 5f 66 64 28  cackey_debug_fd(
2420: 29 29 3b 0a 0a 09 72 65 74 75 72 6e 28 72 65 74  ));...return(ret
2430: 76 61 6c 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  val);.}..static 
2440: 63 6f 6e 73 74 20 63 68 61 72 20 2a 43 41 43 4b  const char *CACK
2450: 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 54 41  EY_DEBUG_FUNC_TA
2460: 47 5f 54 4f 5f 53 54 52 28 75 6e 73 69 67 6e 65  G_TO_STR(unsigne
2470: 64 20 63 68 61 72 20 74 61 67 29 20 7b 0a 09 73  d char tag) {..s
2480: 77 69 74 63 68 20 28 74 61 67 29 20 7b 0a 09 09  witch (tag) {...
2490: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43  case GSCIS_TAG_C
24a0: 41 52 44 49 44 3a 0a 09 09 09 72 65 74 75 72 6e  ARDID:....return
24b0: 28 22 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44  ("GSCIS_TAG_CARD
24c0: 49 44 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43  ID");...case GSC
24d0: 49 53 5f 54 41 47 5f 43 43 43 5f 56 45 52 3a 0a  IS_TAG_CCC_VER:.
24e0: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
24f0: 5f 54 41 47 5f 43 43 43 5f 56 45 52 22 29 3b 0a  _TAG_CCC_VER");.
2500: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47  ..case GSCIS_TAG
2510: 5f 43 43 47 5f 56 45 52 3a 0a 09 09 09 72 65 74  _CCG_VER:....ret
2520: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 43  urn("GSCIS_TAG_C
2530: 43 47 5f 56 45 52 22 29 3b 0a 09 09 63 61 73 65  CG_VER");...case
2540: 20 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44 55   GSCIS_TAG_CARDU
2550: 52 4c 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47  RL:....return("G
2560: 53 43 49 53 5f 54 41 47 5f 43 41 52 44 55 52 4c  SCIS_TAG_CARDURL
2570: 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53  ");...case GSCIS
2580: 5f 54 41 47 5f 50 4b 43 53 31 35 3a 0a 09 09 09  _TAG_PKCS15:....
2590: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
25a0: 47 5f 50 4b 43 53 31 35 22 29 3b 0a 09 09 63 61  G_PKCS15");...ca
25b0: 73 65 20 47 53 43 49 53 5f 54 41 47 5f 52 45 47  se GSCIS_TAG_REG
25c0: 5f 44 41 54 41 5f 4d 4f 44 45 4c 3a 0a 09 09 09  _DATA_MODEL:....
25d0: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
25e0: 47 5f 52 45 47 5f 44 41 54 41 5f 4d 4f 44 45 4c  G_REG_DATA_MODEL
25f0: 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53  ");...case GSCIS
2600: 5f 54 41 47 5f 41 43 52 5f 54 41 42 4c 45 3a 0a  _TAG_ACR_TABLE:.
2610: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
2620: 5f 54 41 47 5f 41 43 52 5f 54 41 42 4c 45 22 29  _TAG_ACR_TABLE")
2630: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ;...case GSCIS_T
2640: 41 47 5f 43 41 52 44 5f 41 50 44 55 3a 0a 09 09  AG_CARD_APDU:...
2650: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
2660: 41 47 5f 43 41 52 44 5f 41 50 44 55 22 29 3b 0a  AG_CARD_APDU");.
2670: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47  ..case GSCIS_TAG
2680: 5f 52 45 44 49 52 45 43 54 49 4f 4e 3a 0a 09 09  _REDIRECTION:...
2690: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
26a0: 41 47 5f 52 45 44 49 52 45 43 54 49 4f 4e 22 29  AG_REDIRECTION")
26b0: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ;...case GSCIS_T
26c0: 41 47 5f 43 54 3a 0a 09 09 09 72 65 74 75 72 6e  AG_CT:....return
26d0: 28 22 47 53 43 49 53 5f 54 41 47 5f 43 54 22 29  ("GSCIS_TAG_CT")
26e0: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ;...case GSCIS_T
26f0: 41 47 5f 53 54 3a 0a 09 09 09 72 65 74 75 72 6e  AG_ST:....return
2700: 28 22 47 53 43 49 53 5f 54 41 47 5f 53 54 22 29  ("GSCIS_TAG_ST")
2710: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ;...case GSCIS_T
2720: 41 47 5f 4e 45 58 54 43 43 43 3a 0a 09 09 09 72  AG_NEXTCCC:....r
2730: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
2740: 5f 4e 45 58 54 43 43 43 22 29 3b 0a 09 09 63 61  _NEXTCCC");...ca
2750: 73 65 20 47 53 43 49 53 5f 54 41 47 5f 46 4e 41  se GSCIS_TAG_FNA
2760: 4d 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47  ME:....return("G
2770: 53 43 49 53 5f 54 41 47 5f 46 4e 41 4d 45 22 29  SCIS_TAG_FNAME")
2780: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ;...case GSCIS_T
2790: 41 47 5f 4d 4e 41 4d 45 3a 0a 09 09 09 72 65 74  AG_MNAME:....ret
27a0: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4d  urn("GSCIS_TAG_M
27b0: 4e 41 4d 45 22 29 3b 0a 09 09 63 61 73 65 20 47  NAME");...case G
27c0: 53 43 49 53 5f 54 41 47 5f 4c 4e 41 4d 45 3a 0a  SCIS_TAG_LNAME:.
27d0: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
27e0: 5f 54 41 47 5f 4c 4e 41 4d 45 22 29 3b 0a 09 09  _TAG_LNAME");...
27f0: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 53  case GSCIS_TAG_S
2800: 55 46 46 49 58 3a 0a 09 09 09 72 65 74 75 72 6e  UFFIX:....return
2810: 28 22 47 53 43 49 53 5f 54 41 47 5f 53 55 46 46  ("GSCIS_TAG_SUFF
2820: 49 58 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43  IX");...case GSC
2830: 49 53 5f 54 41 47 5f 47 4f 56 54 5f 41 47 45 4e  IS_TAG_GOVT_AGEN
2840: 43 59 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47  CY:....return("G
2850: 53 43 49 53 5f 54 41 47 5f 47 4f 56 54 5f 41 47  SCIS_TAG_GOVT_AG
2860: 45 4e 43 59 22 29 3b 0a 09 09 63 61 73 65 20 47  ENCY");...case G
2870: 53 43 49 53 5f 54 41 47 5f 42 55 52 45 41 55 3a  SCIS_TAG_BUREAU:
2880: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49  ....return("GSCI
2890: 53 5f 54 41 47 5f 42 55 52 45 41 55 22 29 3b 0a  S_TAG_BUREAU");.
28a0: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47  ..case GSCIS_TAG
28b0: 5f 42 55 52 45 41 55 5f 43 4f 44 45 3a 0a 09 09  _BUREAU_CODE:...
28c0: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
28d0: 41 47 5f 42 55 52 45 41 55 5f 43 4f 44 45 22 29  AG_BUREAU_CODE")
28e0: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ;...case GSCIS_T
28f0: 41 47 5f 44 45 50 54 5f 43 4f 44 45 3a 0a 09 09  AG_DEPT_CODE:...
2900: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
2910: 41 47 5f 44 45 50 54 5f 43 4f 44 45 22 29 3b 0a  AG_DEPT_CODE");.
2920: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47  ..case GSCIS_TAG
2930: 5f 54 49 54 4c 45 3a 0a 09 09 09 72 65 74 75 72  _TITLE:....retur
2940: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 54 49 54  n("GSCIS_TAG_TIT
2950: 4c 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43  LE");...case GSC
2960: 49 53 5f 54 41 47 5f 42 55 49 4c 44 49 4e 47 3a  IS_TAG_BUILDING:
2970: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49  ....return("GSCI
2980: 53 5f 54 41 47 5f 42 55 49 4c 44 49 4e 47 22 29  S_TAG_BUILDING")
2990: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ;...case GSCIS_T
29a0: 41 47 5f 4f 46 46 49 43 45 5f 41 44 44 52 31 3a  AG_OFFICE_ADDR1:
29b0: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49  ....return("GSCI
29c0: 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 41 44 44  S_TAG_OFFICE_ADD
29d0: 52 31 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43  R1");...case GSC
29e0: 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 41 44  IS_TAG_OFFICE_AD
29f0: 44 52 32 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  DR2:....return("
2a00: 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45  GSCIS_TAG_OFFICE
2a10: 5f 41 44 44 52 32 22 29 3b 0a 09 09 63 61 73 65  _ADDR2");...case
2a20: 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43   GSCIS_TAG_OFFIC
2a30: 45 5f 43 49 54 59 3a 0a 09 09 09 72 65 74 75 72  E_CITY:....retur
2a40: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4f 46 46  n("GSCIS_TAG_OFF
2a50: 49 43 45 5f 43 49 54 59 22 29 3b 0a 09 09 63 61  ICE_CITY");...ca
2a60: 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46  se GSCIS_TAG_OFF
2a70: 49 43 45 5f 53 54 41 54 45 3a 0a 09 09 09 72 65  ICE_STATE:....re
2a80: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
2a90: 4f 46 46 49 43 45 5f 53 54 41 54 45 22 29 3b 0a  OFFICE_STATE");.
2aa0: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47  ..case GSCIS_TAG
2ab0: 5f 4f 46 46 49 43 45 5f 5a 49 50 3a 0a 09 09 09  _OFFICE_ZIP:....
2ac0: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
2ad0: 47 5f 4f 46 46 49 43 45 5f 5a 49 50 22 29 3b 0a  G_OFFICE_ZIP");.
2ae0: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47  ..case GSCIS_TAG
2af0: 5f 4f 46 46 49 43 45 5f 43 4f 55 4e 54 52 59 3a  _OFFICE_COUNTRY:
2b00: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49  ....return("GSCI
2b10: 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 43 4f 55  S_TAG_OFFICE_COU
2b20: 4e 54 52 59 22 29 3b 0a 09 09 63 61 73 65 20 47  NTRY");...case G
2b30: 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f  SCIS_TAG_OFFICE_
2b40: 50 48 4f 4e 45 3a 0a 09 09 09 72 65 74 75 72 6e  PHONE:....return
2b50: 28 22 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49  ("GSCIS_TAG_OFFI
2b60: 43 45 5f 50 48 4f 4e 45 22 29 3b 0a 09 09 63 61  CE_PHONE");...ca
2b70: 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46  se GSCIS_TAG_OFF
2b80: 49 43 45 5f 50 48 4f 4e 45 5f 45 58 54 3a 0a 09  ICE_PHONE_EXT:..
2b90: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
2ba0: 54 41 47 5f 4f 46 46 49 43 45 5f 50 48 4f 4e 45  TAG_OFFICE_PHONE
2bb0: 5f 45 58 54 22 29 3b 0a 09 09 63 61 73 65 20 47  _EXT");...case G
2bc0: 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f  SCIS_TAG_OFFICE_
2bd0: 46 41 58 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  FAX:....return("
2be0: 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45  GSCIS_TAG_OFFICE
2bf0: 5f 46 41 58 22 29 3b 0a 09 09 63 61 73 65 20 47  _FAX");...case G
2c00: 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f  SCIS_TAG_OFFICE_
2c10: 45 4d 41 49 4c 3a 0a 09 09 09 72 65 74 75 72 6e  EMAIL:....return
2c20: 28 22 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49  ("GSCIS_TAG_OFFI
2c30: 43 45 5f 45 4d 41 49 4c 22 29 3b 0a 09 09 63 61  CE_EMAIL");...ca
2c40: 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46  se GSCIS_TAG_OFF
2c50: 49 43 45 5f 52 4f 4f 4d 3a 0a 09 09 09 72 65 74  ICE_ROOM:....ret
2c60: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4f  urn("GSCIS_TAG_O
2c70: 46 46 49 43 45 5f 52 4f 4f 4d 22 29 3b 0a 09 09  FFICE_ROOM");...
2c80: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4e  case GSCIS_TAG_N
2c90: 4f 4e 47 4f 56 5f 41 47 45 4e 43 59 3a 0a 09 09  ONGOV_AGENCY:...
2ca0: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
2cb0: 41 47 5f 4e 4f 4e 47 4f 56 5f 41 47 45 4e 43 59  AG_NONGOV_AGENCY
2cc0: 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53  ");...case GSCIS
2cd0: 5f 54 41 47 5f 53 53 4e 5f 44 45 53 49 47 4e 41  _TAG_SSN_DESIGNA
2ce0: 54 4f 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  TOR:....return("
2cf0: 47 53 43 49 53 5f 54 41 47 5f 53 53 4e 5f 44 45  GSCIS_TAG_SSN_DE
2d00: 53 49 47 4e 41 54 4f 52 22 29 3b 0a 09 09 63 61  SIGNATOR");...ca
2d10: 73 65 20 47 53 43 49 53 5f 54 41 47 5f 53 53 4e  se GSCIS_TAG_SSN
2d20: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
2d30: 49 53 5f 54 41 47 5f 53 53 4e 22 29 3b 0a 09 09  IS_TAG_SSN");...
2d40: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 44  case GSCIS_TAG_D
2d50: 4f 42 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47  OB:....return("G
2d60: 53 43 49 53 5f 54 41 47 5f 44 4f 42 22 29 3b 0a  SCIS_TAG_DOB");.
2d70: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47  ..case GSCIS_TAG
2d80: 5f 47 45 4e 44 45 52 3a 0a 09 09 09 72 65 74 75  _GENDER:....retu
2d90: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 47 45  rn("GSCIS_TAG_GE
2da0: 4e 44 45 52 22 29 3b 0a 09 09 63 61 73 65 20 47  NDER");...case G
2db0: 53 43 49 53 5f 54 41 47 5f 55 53 45 52 49 44 3a  SCIS_TAG_USERID:
2dc0: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49  ....return("GSCI
2dd0: 53 5f 54 41 47 5f 55 53 45 52 49 44 22 29 3b 0a  S_TAG_USERID");.
2de0: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47  ..case GSCIS_TAG
2df0: 5f 44 4f 4d 41 49 4e 3a 0a 09 09 09 72 65 74 75  _DOMAIN:....retu
2e00: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 44 4f  rn("GSCIS_TAG_DO
2e10: 4d 41 49 4e 22 29 3b 0a 09 09 63 61 73 65 20 47  MAIN");...case G
2e20: 53 43 49 53 5f 54 41 47 5f 50 41 53 53 57 4f 52  SCIS_TAG_PASSWOR
2e30: 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  D:....return("GS
2e40: 43 49 53 5f 54 41 47 5f 50 41 53 53 57 4f 52 44  CIS_TAG_PASSWORD
2e50: 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53  ");...case GSCIS
2e60: 5f 54 41 47 5f 49 53 53 55 45 52 49 44 3a 0a 09  _TAG_ISSUERID:..
2e70: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
2e80: 54 41 47 5f 49 53 53 55 45 52 49 44 22 29 3b 0a  TAG_ISSUERID");.
2e90: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47  ..case GSCIS_TAG
2ea0: 5f 53 45 52 4e 4f 3a 0a 09 09 09 72 65 74 75 72  _SERNO:....retur
2eb0: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 53 45 52  n("GSCIS_TAG_SER
2ec0: 4e 4f 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43  NO");...case GSC
2ed0: 49 53 5f 54 41 47 5f 49 53 53 55 45 5f 44 41 54  IS_TAG_ISSUE_DAT
2ee0: 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  E:....return("GS
2ef0: 43 49 53 5f 54 41 47 5f 49 53 53 55 45 5f 44 41  CIS_TAG_ISSUE_DA
2f00: 54 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43  TE");...case GSC
2f10: 49 53 5f 54 41 47 5f 45 58 50 49 52 45 5f 44 41  IS_TAG_EXPIRE_DA
2f20: 54 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47  TE:....return("G
2f30: 53 43 49 53 5f 54 41 47 5f 45 58 50 49 52 45 5f  SCIS_TAG_EXPIRE_
2f40: 44 41 54 45 22 29 3b 0a 09 09 63 61 73 65 20 47  DATE");...case G
2f50: 53 43 49 53 5f 54 41 47 5f 43 41 52 44 5f 54 59  SCIS_TAG_CARD_TY
2f60: 50 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47  PE:....return("G
2f70: 53 43 49 53 5f 54 41 47 5f 43 41 52 44 5f 54 59  SCIS_TAG_CARD_TY
2f80: 50 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43  PE");...case GSC
2f90: 49 53 5f 54 41 47 5f 53 45 43 55 52 49 54 59 5f  IS_TAG_SECURITY_
2fa0: 43 4f 44 45 3a 0a 09 09 09 72 65 74 75 72 6e 28  CODE:....return(
2fb0: 22 47 53 43 49 53 5f 54 41 47 5f 53 45 43 55 52  "GSCIS_TAG_SECUR
2fc0: 49 54 59 5f 43 4f 44 45 22 29 3b 0a 09 09 63 61  ITY_CODE");...ca
2fd0: 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43 41 52  se GSCIS_TAG_CAR
2fe0: 44 49 44 5f 41 49 44 3a 0a 09 09 09 72 65 74 75  DID_AID:....retu
2ff0: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 43 41  rn("GSCIS_TAG_CA
3000: 52 44 49 44 5f 41 49 44 22 29 3b 0a 09 09 63 61  RDID_AID");...ca
3010: 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43 45 52  se GSCIS_TAG_CER
3020: 54 49 46 49 43 41 54 45 3a 0a 09 09 09 72 65 74  TIFICATE:....ret
3030: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 43  urn("GSCIS_TAG_C
3040: 45 52 54 49 46 49 43 41 54 45 22 29 3b 0a 09 09  ERTIFICATE");...
3050: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43  case GSCIS_TAG_C
3060: 45 52 54 5f 49 53 53 55 45 5f 44 41 54 45 3a 0a  ERT_ISSUE_DATE:.
3070: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
3080: 5f 54 41 47 5f 43 45 52 54 5f 49 53 53 55 45 5f  _TAG_CERT_ISSUE_
3090: 44 41 54 45 22 29 3b 0a 09 09 63 61 73 65 20 47  DATE");...case G
30a0: 53 43 49 53 5f 54 41 47 5f 43 45 52 54 5f 45 58  SCIS_TAG_CERT_EX
30b0: 50 49 52 45 5f 44 41 54 45 3a 0a 09 09 09 72 65  PIRE_DATE:....re
30c0: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
30d0: 43 45 52 54 5f 45 58 50 49 52 45 5f 44 41 54 45  CERT_EXPIRE_DATE
30e0: 22 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28  ");..}...return(
30f0: 22 55 4e 4b 4e 4f 57 4e 22 29 3b 0a 7d 0a 0a 73  "UNKNOWN");.}..s
3100: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
3110: 20 2a 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46   *CACKEY_DEBUG_F
3120: 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f  UNC_SCARDERR_TO_
3130: 53 54 52 28 4c 4f 4e 47 20 72 65 74 63 6f 64 65  STR(LONG retcode
3140: 29 20 7b 0a 09 73 77 69 74 63 68 20 28 72 65 74  ) {..switch (ret
3150: 63 6f 64 65 29 20 7b 0a 09 09 63 61 73 65 20 53  code) {...case S
3160: 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 3a 0a  CARD_S_SUCCESS:.
3170: 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44  ...return("SCARD
3180: 5f 53 5f 53 55 43 43 45 53 53 22 29 3b 0a 09 09  _S_SUCCESS");...
3190: 63 61 73 65 20 53 43 41 52 44 5f 45 5f 43 41 4e  case SCARD_E_CAN
31a0: 43 45 4c 4c 45 44 3a 0a 09 09 09 72 65 74 75 72  CELLED:....retur
31b0: 6e 28 22 53 43 41 52 44 5f 45 5f 43 41 4e 43 45  n("SCARD_E_CANCE
31c0: 4c 4c 45 44 22 29 3b 0a 09 09 63 61 73 65 20 53  LLED");...case S
31d0: 43 41 52 44 5f 45 5f 43 41 4e 54 5f 44 49 53 50  CARD_E_CANT_DISP
31e0: 4f 53 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  OSE:....return("
31f0: 53 43 41 52 44 5f 45 5f 43 41 4e 54 5f 44 49 53  SCARD_E_CANT_DIS
3200: 50 4f 53 45 22 29 3b 0a 09 09 63 61 73 65 20 53  POSE");...case S
3210: 43 41 52 44 5f 45 5f 49 4e 53 55 46 46 49 43 49  CARD_E_INSUFFICI
3220: 45 4e 54 5f 42 55 46 46 45 52 3a 0a 09 09 09 72  ENT_BUFFER:....r
3230: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 49  eturn("SCARD_E_I
3240: 4e 53 55 46 46 49 43 49 45 4e 54 5f 42 55 46 46  NSUFFICIENT_BUFF
3250: 45 52 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41  ER");...case SCA
3260: 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 41 54 52  RD_E_INVALID_ATR
3270: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41  :....return("SCA
3280: 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 41 54 52  RD_E_INVALID_ATR
3290: 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44  ");...case SCARD
32a0: 5f 45 5f 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c  _E_INVALID_HANDL
32b0: 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43  E:....return("SC
32c0: 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 48 41  ARD_E_INVALID_HA
32d0: 4e 44 4c 45 22 29 3b 0a 09 09 63 61 73 65 20 53  NDLE");...case S
32e0: 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 50  CARD_E_INVALID_P
32f0: 41 52 41 4d 45 54 45 52 3a 0a 09 09 09 72 65 74  ARAMETER:....ret
3300: 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 49 4e 56  urn("SCARD_E_INV
3310: 41 4c 49 44 5f 50 41 52 41 4d 45 54 45 52 22 29  ALID_PARAMETER")
3320: 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45  ;...case SCARD_E
3330: 5f 49 4e 56 41 4c 49 44 5f 54 41 52 47 45 54 3a  _INVALID_TARGET:
3340: 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52  ....return("SCAR
3350: 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 54 41 52 47  D_E_INVALID_TARG
3360: 45 54 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41  ET");...case SCA
3370: 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 56 41 4c  RD_E_INVALID_VAL
3380: 55 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53  UE:....return("S
3390: 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 56  CARD_E_INVALID_V
33a0: 41 4c 55 45 22 29 3b 0a 09 09 63 61 73 65 20 53  ALUE");...case S
33b0: 43 41 52 44 5f 45 5f 4e 4f 5f 4d 45 4d 4f 52 59  CARD_E_NO_MEMORY
33c0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41  :....return("SCA
33d0: 52 44 5f 45 5f 4e 4f 5f 4d 45 4d 4f 52 59 22 29  RD_E_NO_MEMORY")
33e0: 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45  ;...case SCARD_E
33f0: 5f 55 4e 4b 4e 4f 57 4e 5f 52 45 41 44 45 52 3a  _UNKNOWN_READER:
3400: 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52  ....return("SCAR
3410: 44 5f 45 5f 55 4e 4b 4e 4f 57 4e 5f 52 45 41 44  D_E_UNKNOWN_READ
3420: 45 52 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41  ER");...case SCA
3430: 52 44 5f 45 5f 54 49 4d 45 4f 55 54 3a 0a 09 09  RD_E_TIMEOUT:...
3440: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45  .return("SCARD_E
3450: 5f 54 49 4d 45 4f 55 54 22 29 3b 0a 09 09 63 61  _TIMEOUT");...ca
3460: 73 65 20 53 43 41 52 44 5f 45 5f 53 48 41 52 49  se SCARD_E_SHARI
3470: 4e 47 5f 56 49 4f 4c 41 54 49 4f 4e 3a 0a 09 09  NG_VIOLATION:...
3480: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45  .return("SCARD_E
3490: 5f 53 48 41 52 49 4e 47 5f 56 49 4f 4c 41 54 49  _SHARING_VIOLATI
34a0: 4f 4e 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41  ON");...case SCA
34b0: 52 44 5f 45 5f 4e 4f 5f 53 4d 41 52 54 43 41 52  RD_E_NO_SMARTCAR
34c0: 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43  D:....return("SC
34d0: 41 52 44 5f 45 5f 4e 4f 5f 53 4d 41 52 54 43 41  ARD_E_NO_SMARTCA
34e0: 52 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41  RD");...case SCA
34f0: 52 44 5f 45 5f 55 4e 4b 4e 4f 57 4e 5f 43 41 52  RD_E_UNKNOWN_CAR
3500: 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43  D:....return("SC
3510: 41 52 44 5f 45 5f 55 4e 4b 4e 4f 57 4e 5f 43 41  ARD_E_UNKNOWN_CA
3520: 52 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41  RD");...case SCA
3530: 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41  RD_E_PROTO_MISMA
3540: 54 43 48 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  TCH:....return("
3550: 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49  SCARD_E_PROTO_MI
3560: 53 4d 41 54 43 48 22 29 3b 0a 09 09 63 61 73 65  SMATCH");...case
3570: 20 53 43 41 52 44 5f 45 5f 4e 4f 54 5f 52 45 41   SCARD_E_NOT_REA
3580: 44 59 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53  DY:....return("S
3590: 43 41 52 44 5f 45 5f 4e 4f 54 5f 52 45 41 44 59  CARD_E_NOT_READY
35a0: 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44  ");...case SCARD
35b0: 5f 45 5f 53 59 53 54 45 4d 5f 43 41 4e 43 45 4c  _E_SYSTEM_CANCEL
35c0: 4c 45 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  LED:....return("
35d0: 53 43 41 52 44 5f 45 5f 53 59 53 54 45 4d 5f 43  SCARD_E_SYSTEM_C
35e0: 41 4e 43 45 4c 4c 45 44 22 29 3b 0a 09 09 63 61  ANCELLED");...ca
35f0: 73 65 20 53 43 41 52 44 5f 45 5f 4e 4f 54 5f 54  se SCARD_E_NOT_T
3600: 52 41 4e 53 41 43 54 45 44 3a 0a 09 09 09 72 65  RANSACTED:....re
3610: 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 4e 4f  turn("SCARD_E_NO
3620: 54 5f 54 52 41 4e 53 41 43 54 45 44 22 29 3b 0a  T_TRANSACTED");.
3630: 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 52  ..case SCARD_E_R
3640: 45 41 44 45 52 5f 55 4e 41 56 41 49 4c 41 42 4c  EADER_UNAVAILABL
3650: 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43  E:....return("SC
3660: 41 52 44 5f 45 5f 52 45 41 44 45 52 5f 55 4e 41  ARD_E_READER_UNA
3670: 56 41 49 4c 41 42 4c 45 22 29 3b 0a 09 09 63 61  VAILABLE");...ca
3680: 73 65 20 53 43 41 52 44 5f 57 5f 55 4e 53 55 50  se SCARD_W_UNSUP
3690: 50 4f 52 54 45 44 5f 43 41 52 44 3a 0a 09 09 09  PORTED_CARD:....
36a0: 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 57 5f  return("SCARD_W_
36b0: 55 4e 53 55 50 50 4f 52 54 45 44 5f 43 41 52 44  UNSUPPORTED_CARD
36c0: 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44  ");...case SCARD
36d0: 5f 57 5f 55 4e 52 45 53 50 4f 4e 53 49 56 45 5f  _W_UNRESPONSIVE_
36e0: 43 41 52 44 3a 0a 09 09 09 72 65 74 75 72 6e 28  CARD:....return(
36f0: 22 53 43 41 52 44 5f 57 5f 55 4e 52 45 53 50 4f  "SCARD_W_UNRESPO
3700: 4e 53 49 56 45 5f 43 41 52 44 22 29 3b 0a 09 09  NSIVE_CARD");...
3710: 63 61 73 65 20 53 43 41 52 44 5f 57 5f 55 4e 50  case SCARD_W_UNP
3720: 4f 57 45 52 45 44 5f 43 41 52 44 3a 0a 09 09 09  OWERED_CARD:....
3730: 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 57 5f  return("SCARD_W_
3740: 55 4e 50 4f 57 45 52 45 44 5f 43 41 52 44 22 29  UNPOWERED_CARD")
3750: 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 57  ;...case SCARD_W
3760: 5f 52 45 53 45 54 5f 43 41 52 44 3a 0a 09 09 09  _RESET_CARD:....
3770: 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 57 5f  return("SCARD_W_
3780: 52 45 53 45 54 5f 43 41 52 44 22 29 3b 0a 09 09  RESET_CARD");...
3790: 63 61 73 65 20 53 43 41 52 44 5f 57 5f 52 45 4d  case SCARD_W_REM
37a0: 4f 56 45 44 5f 43 41 52 44 3a 0a 09 09 09 72 65  OVED_CARD:....re
37b0: 74 75 72 6e 28 22 53 43 41 52 44 5f 57 5f 52 45  turn("SCARD_W_RE
37c0: 4d 4f 56 45 44 5f 43 41 52 44 22 29 3b 0a 09 09  MOVED_CARD");...
37d0: 63 61 73 65 20 53 43 41 52 44 5f 45 5f 50 43 49  case SCARD_E_PCI
37e0: 5f 54 4f 4f 5f 53 4d 41 4c 4c 3a 0a 09 09 09 72  _TOO_SMALL:....r
37f0: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 50  eturn("SCARD_E_P
3800: 43 49 5f 54 4f 4f 5f 53 4d 41 4c 4c 22 29 3b 0a  CI_TOO_SMALL");.
3810: 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 52  ..case SCARD_E_R
3820: 45 41 44 45 52 5f 55 4e 53 55 50 50 4f 52 54 45  EADER_UNSUPPORTE
3830: 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43  D:....return("SC
3840: 41 52 44 5f 45 5f 52 45 41 44 45 52 5f 55 4e 53  ARD_E_READER_UNS
3850: 55 50 50 4f 52 54 45 44 22 29 3b 0a 09 09 63 61  UPPORTED");...ca
3860: 73 65 20 53 43 41 52 44 5f 45 5f 44 55 50 4c 49  se SCARD_E_DUPLI
3870: 43 41 54 45 5f 52 45 41 44 45 52 3a 0a 09 09 09  CATE_READER:....
3880: 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f  return("SCARD_E_
3890: 44 55 50 4c 49 43 41 54 45 5f 52 45 41 44 45 52  DUPLICATE_READER
38a0: 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44  ");...case SCARD
38b0: 5f 45 5f 43 41 52 44 5f 55 4e 53 55 50 50 4f 52  _E_CARD_UNSUPPOR
38c0: 54 45 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  TED:....return("
38d0: 53 43 41 52 44 5f 45 5f 43 41 52 44 5f 55 4e 53  SCARD_E_CARD_UNS
38e0: 55 50 50 4f 52 54 45 44 22 29 3b 0a 09 09 63 61  UPPORTED");...ca
38f0: 73 65 20 53 43 41 52 44 5f 45 5f 4e 4f 5f 53 45  se SCARD_E_NO_SE
3900: 52 56 49 43 45 3a 0a 09 09 09 72 65 74 75 72 6e  RVICE:....return
3910: 28 22 53 43 41 52 44 5f 45 5f 4e 4f 5f 53 45 52  ("SCARD_E_NO_SER
3920: 56 49 43 45 22 29 3b 0a 09 09 63 61 73 65 20 53  VICE");...case S
3930: 43 41 52 44 5f 45 5f 53 45 52 56 49 43 45 5f 53  CARD_E_SERVICE_S
3940: 54 4f 50 50 45 44 3a 0a 09 09 09 72 65 74 75 72  TOPPED:....retur
3950: 6e 28 22 53 43 41 52 44 5f 45 5f 53 45 52 56 49  n("SCARD_E_SERVI
3960: 43 45 5f 53 54 4f 50 50 45 44 22 29 3b 0a 09 09  CE_STOPPED");...
3970: 63 61 73 65 20 53 43 41 52 44 5f 45 5f 55 4e 53  case SCARD_E_UNS
3980: 55 50 50 4f 52 54 45 44 5f 46 45 41 54 55 52 45  UPPORTED_FEATURE
3990: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41  :....return("SCA
39a0: 52 44 5f 45 5f 55 4e 53 55 50 50 4f 52 54 45 44  RD_E_UNSUPPORTED
39b0: 5f 46 45 41 54 55 52 45 22 29 3b 0a 23 69 66 64  _FEATURE");.#ifd
39c0: 65 66 20 53 43 41 52 44 5f 57 5f 49 4e 53 45 52  ef SCARD_W_INSER
39d0: 54 45 44 5f 43 41 52 44 0a 09 09 63 61 73 65 20  TED_CARD...case 
39e0: 53 43 41 52 44 5f 57 5f 49 4e 53 45 52 54 45 44  SCARD_W_INSERTED
39f0: 5f 43 41 52 44 3a 0a 09 09 09 72 65 74 75 72 6e  _CARD:....return
3a00: 28 22 53 43 41 52 44 5f 57 5f 49 4e 53 45 52 54  ("SCARD_W_INSERT
3a10: 45 44 5f 43 41 52 44 22 29 3b 0a 23 65 6e 64 69  ED_CARD");.#endi
3a20: 66 0a 23 69 66 64 65 66 20 53 43 41 52 44 5f 45  f.#ifdef SCARD_E
3a30: 5f 4e 4f 5f 52 45 41 44 45 52 53 5f 41 56 41 49  _NO_READERS_AVAI
3a40: 4c 41 42 4c 45 0a 09 09 63 61 73 65 20 53 43 41  LABLE...case SCA
3a50: 52 44 5f 45 5f 4e 4f 5f 52 45 41 44 45 52 53 5f  RD_E_NO_READERS_
3a60: 41 56 41 49 4c 41 42 4c 45 3a 0a 09 09 09 72 65  AVAILABLE:....re
3a70: 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 4e 4f  turn("SCARD_E_NO
3a80: 5f 52 45 41 44 45 52 53 5f 41 56 41 49 4c 41 42  _READERS_AVAILAB
3a90: 4c 45 22 29 3b 0a 23 65 6e 64 69 66 0a 09 7d 0a  LE");.#endif..}.
3aa0: 0a 09 72 65 74 75 72 6e 28 22 55 4e 4b 4e 4f 57  ..return("UNKNOW
3ab0: 4e 22 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 63  N");.}..static c
3ac0: 6f 6e 73 74 20 63 68 61 72 20 2a 43 41 43 4b 45  onst char *CACKE
3ad0: 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 4f 42 4a  Y_DEBUG_FUNC_OBJ
3ae0: 49 44 5f 54 4f 5f 53 54 52 28 75 69 6e 74 31 36  ID_TO_STR(uint16
3af0: 5f 74 20 6f 62 6a 69 64 29 20 7b 0a 09 73 77 69  _t objid) {..swi
3b00: 74 63 68 20 28 6f 62 6a 69 64 29 20 7b 0a 09 09  tch (objid) {...
3b10: 63 61 73 65 20 30 78 32 30 30 30 3a 0a 09 09 09  case 0x2000:....
3b20: 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54  return("CACKEY_T
3b30: 4c 56 5f 4f 42 4a 49 44 5f 47 45 4e 45 52 41 4c  LV_OBJID_GENERAL
3b40: 49 4e 46 4f 22 29 3b 0a 09 09 63 61 73 65 20 30  INFO");...case 0
3b50: 78 32 31 30 30 3a 0a 09 09 09 72 65 74 75 72 6e  x2100:....return
3b60: 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a  ("CACKEY_TLV_OBJ
3b70: 49 44 5f 50 52 4f 50 45 52 53 4f 4e 41 4c 49 4e  ID_PROPERSONALIN
3b80: 46 4f 22 29 3b 0a 09 09 63 61 73 65 20 30 78 33  FO");...case 0x3
3b90: 30 30 30 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  000:....return("
3ba0: 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44  CACKEY_TLV_OBJID
3bb0: 5f 41 43 43 45 53 53 43 4f 4e 54 52 4f 4c 22 29  _ACCESSCONTROL")
3bc0: 3b 0a 09 09 63 61 73 65 20 30 78 34 30 30 30 3a  ;...case 0x4000:
3bd0: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b  ....return("CACK
3be0: 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 4c 4f 47  EY_TLV_OBJID_LOG
3bf0: 49 4e 22 29 3b 0a 09 09 63 61 73 65 20 30 78 35  IN");...case 0x5
3c00: 30 30 30 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  000:....return("
3c10: 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44  CACKEY_TLV_OBJID
3c20: 5f 43 41 52 44 49 4e 46 4f 22 29 3b 0a 09 09 63  _CARDINFO");...c
3c30: 61 73 65 20 30 78 36 30 30 30 3a 0a 09 09 09 72  ase 0x6000:....r
3c40: 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c  eturn("CACKEY_TL
3c50: 56 5f 4f 42 4a 49 44 5f 42 49 4f 4d 45 54 52 49  V_OBJID_BIOMETRI
3c60: 43 53 22 29 3b 0a 09 09 63 61 73 65 20 30 78 37  CS");...case 0x7
3c70: 30 30 30 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  000:....return("
3c80: 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44  CACKEY_TLV_OBJID
3c90: 5f 44 49 47 49 54 41 4c 53 49 47 43 45 52 54 22  _DIGITALSIGCERT"
3ca0: 29 3b 0a 09 09 63 61 73 65 20 30 78 30 32 30 30  );...case 0x0200
3cb0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43  :....return("CAC
3cc0: 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41  KEY_TLV_OBJID_CA
3cd0: 43 5f 50 45 52 53 4f 4e 22 29 3b 0a 09 09 63 61  C_PERSON");...ca
3ce0: 73 65 20 30 78 30 32 30 32 3a 0a 09 09 09 72 65  se 0x0202:....re
3cf0: 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56  turn("CACKEY_TLV
3d00: 5f 4f 42 4a 49 44 5f 43 41 43 5f 42 45 4e 45 46  _OBJID_CAC_BENEF
3d10: 49 54 53 22 29 3b 0a 09 09 63 61 73 65 20 30 78  ITS");...case 0x
3d20: 30 32 30 33 3a 0a 09 09 09 72 65 74 75 72 6e 28  0203:....return(
3d30: 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49  "CACKEY_TLV_OBJI
3d40: 44 5f 43 41 43 5f 4f 54 48 45 52 42 45 4e 45 46  D_CAC_OTHERBENEF
3d50: 49 54 53 22 29 3b 0a 09 09 63 61 73 65 20 30 78  ITS");...case 0x
3d60: 30 32 30 31 3a 0a 09 09 09 72 65 74 75 72 6e 28  0201:....return(
3d70: 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49  "CACKEY_TLV_OBJI
3d80: 44 5f 43 41 43 5f 50 45 52 53 4f 4e 4e 45 4c 22  D_CAC_PERSONNEL"
3d90: 29 3b 0a 09 09 63 61 73 65 20 30 78 30 32 46 45  );...case 0x02FE
3da0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43  :....return("CAC
3db0: 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41  KEY_TLV_OBJID_CA
3dc0: 43 5f 50 4b 49 43 45 52 54 22 29 3b 0a 09 7d 0a  C_PKICERT");..}.
3dd0: 09 0a 09 72 65 74 75 72 6e 28 22 55 4e 4b 4e 4f  ...return("UNKNO
3de0: 57 4e 22 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  WN");.}..static 
3df0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 43 41 43 4b  const char *CACK
3e00: 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 41 50  EY_DEBUG_FUNC_AP
3e10: 50 54 59 50 45 5f 54 4f 5f 53 54 52 28 75 69 6e  PTYPE_TO_STR(uin
3e20: 74 38 5f 74 20 61 70 70 74 79 70 65 29 20 7b 0a  t8_t apptype) {.
3e30: 09 73 77 69 74 63 68 20 28 61 70 70 74 79 70 65  .switch (apptype
3e40: 29 20 7b 0a 09 09 63 61 73 65 20 30 78 30 30 3a  ) {...case 0x00:
3e50: 0a 09 09 09 72 65 74 75 72 6e 28 22 4e 4f 4e 45  ....return("NONE
3e60: 22 29 3b 0a 09 09 63 61 73 65 20 30 78 30 31 3a  ");...case 0x01:
3e70: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b  ....return("CACK
3e80: 45 59 5f 54 4c 56 5f 41 50 50 5f 47 45 4e 45 52  EY_TLV_APP_GENER
3e90: 49 43 22 29 3b 0a 09 09 63 61 73 65 20 30 78 30  IC");...case 0x0
3ea0: 32 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41  2:....return("CA
3eb0: 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 53 4b 49  CKEY_TLV_APP_SKI
3ec0: 22 29 3b 0a 09 09 63 61 73 65 20 30 78 30 33 3a  ");...case 0x03:
3ed0: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b  ....return("CACK
3ee0: 45 59 5f 54 4c 56 5f 41 50 50 5f 47 45 4e 45 52  EY_TLV_APP_GENER
3ef0: 49 43 20 7c 20 43 41 43 4b 45 59 5f 54 4c 56 5f  IC | CACKEY_TLV_
3f00: 41 50 50 5f 53 4b 49 22 29 3b 0a 09 09 63 61 73  APP_SKI");...cas
3f10: 65 20 30 78 30 34 3a 0a 09 09 09 72 65 74 75 72  e 0x04:....retur
3f20: 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50  n("CACKEY_TLV_AP
3f30: 50 5f 50 4b 49 22 29 3b 0a 09 09 63 61 73 65 20  P_PKI");...case 
3f40: 30 78 30 35 3a 0a 09 09 09 72 65 74 75 72 6e 28  0x05:....return(
3f50: 22 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f  "CACKEY_TLV_APP_
3f60: 47 45 4e 45 52 49 43 20 7c 20 43 41 43 4b 45 59  GENERIC | CACKEY
3f70: 5f 54 4c 56 5f 41 50 50 5f 50 4b 49 22 29 3b 0a  _TLV_APP_PKI");.
3f80: 09 09 63 61 73 65 20 30 78 30 36 3a 0a 09 09 09  ..case 0x06:....
3f90: 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54  return("CACKEY_T
3fa0: 4c 56 5f 41 50 50 5f 53 4b 49 20 7c 20 43 41 43  LV_APP_SKI | CAC
3fb0: 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 50 4b 49 22  KEY_TLV_APP_PKI"
3fc0: 29 3b 0a 09 09 63 61 73 65 20 30 78 30 37 3a 0a  );...case 0x07:.
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 47 45 4e 45 52 49  Y_TLV_APP_GENERI
3ff0: 43 20 7c 20 43 41 43 4b 45 59 5f 54 4c 56 5f 41  C | CACKEY_TLV_A
4000: 50 50 5f 53 4b 49 20 7c 20 43 41 43 4b 45 59 5f  PP_SKI | CACKEY_
4010: 54 4c 56 5f 41 50 50 5f 50 4b 49 22 29 3b 0a 09  TLV_APP_PKI");..
4020: 7d 0a 0a 09 72 65 74 75 72 6e 28 22 49 4e 56 41  }...return("INVA
4030: 4c 49 44 22 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  LID");.}..static
4040: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 43 41 43   const char *CAC
4050: 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 41  KEY_DEBUG_FUNC_A
4060: 54 54 52 49 42 55 54 45 5f 54 4f 5f 53 54 52 28  TTRIBUTE_TO_STR(
4070: 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 54 59 50  CK_ATTRIBUTE_TYP
4080: 45 20 61 74 74 72 29 20 7b 0a 09 73 77 69 74 63  E attr) {..switc
4090: 68 20 28 61 74 74 72 29 20 7b 0a 09 09 63 61 73  h (attr) {...cas
40a0: 65 20 43 4b 41 5f 43 4c 41 53 53 3a 0a 09 09 09  e CKA_CLASS:....
40b0: 72 65 74 75 72 6e 28 22 43 4b 41 5f 43 4c 41 53  return("CKA_CLAS
40c0: 53 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f  S");...case CKA_
40d0: 54 4f 4b 45 4e 3a 0a 09 09 09 72 65 74 75 72 6e  TOKEN:....return
40e0: 28 22 43 4b 41 5f 54 4f 4b 45 4e 22 29 3b 0a 09  ("CKA_TOKEN");..
40f0: 09 63 61 73 65 20 43 4b 41 5f 50 52 49 56 41 54  .case CKA_PRIVAT
4100: 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b  E:....return("CK
4110: 41 5f 50 52 49 56 41 54 45 22 29 3b 0a 09 09 63  A_PRIVATE");...c
4120: 61 73 65 20 43 4b 41 5f 4c 41 42 45 4c 3a 0a 09  ase CKA_LABEL:..
4130: 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 4c 41  ..return("CKA_LA
4140: 42 45 4c 22 29 3b 0a 09 09 63 61 73 65 20 43 4b  BEL");...case CK
4150: 41 5f 41 50 50 4c 49 43 41 54 49 4f 4e 3a 0a 09  A_APPLICATION:..
4160: 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 41 50  ..return("CKA_AP
4170: 50 4c 49 43 41 54 49 4f 4e 22 29 3b 0a 09 09 63  PLICATION");...c
4180: 61 73 65 20 43 4b 41 5f 56 41 4c 55 45 3a 0a 09  ase CKA_VALUE:..
4190: 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 56 41  ..return("CKA_VA
41a0: 4c 55 45 22 29 3b 0a 09 09 63 61 73 65 20 43 4b  LUE");...case CK
41b0: 41 5f 4f 42 4a 45 43 54 5f 49 44 3a 0a 09 09 09  A_OBJECT_ID:....
41c0: 72 65 74 75 72 6e 28 22 43 4b 41 5f 4f 42 4a 45  return("CKA_OBJE
41d0: 43 54 5f 49 44 22 29 3b 0a 09 09 63 61 73 65 20  CT_ID");...case 
41e0: 43 4b 41 5f 43 45 52 54 49 46 49 43 41 54 45 5f  CKA_CERTIFICATE_
41f0: 54 59 50 45 3a 0a 09 09 09 72 65 74 75 72 6e 28  TYPE:....return(
4200: 22 43 4b 41 5f 43 45 52 54 49 46 49 43 41 54 45  "CKA_CERTIFICATE
4210: 5f 54 59 50 45 22 29 3b 0a 09 09 63 61 73 65 20  _TYPE");...case 
4220: 43 4b 41 5f 49 53 53 55 45 52 3a 0a 09 09 09 72  CKA_ISSUER:....r
4230: 65 74 75 72 6e 28 22 43 4b 41 5f 49 53 53 55 45  eturn("CKA_ISSUE
4240: 52 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f  R");...case CKA_
4250: 53 45 52 49 41 4c 5f 4e 55 4d 42 45 52 3a 0a 09  SERIAL_NUMBER:..
4260: 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 53 45  ..return("CKA_SE
4270: 52 49 41 4c 5f 4e 55 4d 42 45 52 22 29 3b 0a 09  RIAL_NUMBER");..
4280: 09 63 61 73 65 20 43 4b 41 5f 41 43 5f 49 53 53  .case CKA_AC_ISS
4290: 55 45 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  UER:....return("
42a0: 43 4b 41 5f 41 43 5f 49 53 53 55 45 52 22 29 3b  CKA_AC_ISSUER");
42b0: 0a 09 09 63 61 73 65 20 43 4b 41 5f 4f 57 4e 45  ...case CKA_OWNE
42c0: 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b  R:....return("CK
42d0: 41 5f 4f 57 4e 45 52 22 29 3b 0a 09 09 63 61 73  A_OWNER");...cas
42e0: 65 20 43 4b 41 5f 41 54 54 52 5f 54 59 50 45 53  e CKA_ATTR_TYPES
42f0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41  :....return("CKA
4300: 5f 41 54 54 52 5f 54 59 50 45 53 22 29 3b 0a 09  _ATTR_TYPES");..
4310: 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54 45  .case CKA_TRUSTE
4320: 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b  D:....return("CK
4330: 41 5f 54 52 55 53 54 45 44 22 29 3b 0a 09 09 63  A_TRUSTED");...c
4340: 61 73 65 20 43 4b 41 5f 4b 45 59 5f 54 59 50 45  ase CKA_KEY_TYPE
4350: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41  :....return("CKA
4360: 5f 4b 45 59 5f 54 59 50 45 22 29 3b 0a 09 09 63  _KEY_TYPE");...c
4370: 61 73 65 20 43 4b 41 5f 53 55 42 4a 45 43 54 3a  ase CKA_SUBJECT:
4380: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f  ....return("CKA_
4390: 53 55 42 4a 45 43 54 22 29 3b 0a 09 09 63 61 73  SUBJECT");...cas
43a0: 65 20 43 4b 41 5f 49 44 3a 0a 09 09 09 72 65 74  e CKA_ID:....ret
43b0: 75 72 6e 28 22 43 4b 41 5f 49 44 22 29 3b 0a 09  urn("CKA_ID");..
43c0: 09 63 61 73 65 20 43 4b 41 5f 53 45 4e 53 49 54  .case CKA_SENSIT
43d0: 49 56 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  IVE:....return("
43e0: 43 4b 41 5f 53 45 4e 53 49 54 49 56 45 22 29 3b  CKA_SENSITIVE");
43f0: 0a 09 09 63 61 73 65 20 43 4b 41 5f 45 4e 43 52  ...case CKA_ENCR
4400: 59 50 54 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  YPT:....return("
4410: 43 4b 41 5f 45 4e 43 52 59 50 54 22 29 3b 0a 09  CKA_ENCRYPT");..
4420: 09 63 61 73 65 20 43 4b 41 5f 44 45 43 52 59 50  .case CKA_DECRYP
4430: 54 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b  T:....return("CK
4440: 41 5f 44 45 43 52 59 50 54 22 29 3b 0a 09 09 63  A_DECRYPT");...c
4450: 61 73 65 20 43 4b 41 5f 57 52 41 50 3a 0a 09 09  ase CKA_WRAP:...
4460: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 57 52 41  .return("CKA_WRA
4470: 50 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f  P");...case CKA_
4480: 55 4e 57 52 41 50 3a 0a 09 09 09 72 65 74 75 72  UNWRAP:....retur
4490: 6e 28 22 43 4b 41 5f 55 4e 57 52 41 50 22 29 3b  n("CKA_UNWRAP");
44a0: 0a 09 09 63 61 73 65 20 43 4b 41 5f 53 49 47 4e  ...case CKA_SIGN
44b0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41  :....return("CKA
44c0: 5f 53 49 47 4e 22 29 3b 0a 09 09 63 61 73 65 20  _SIGN");...case 
44d0: 43 4b 41 5f 53 49 47 4e 5f 52 45 43 4f 56 45 52  CKA_SIGN_RECOVER
44e0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41  :....return("CKA
44f0: 5f 53 49 47 4e 5f 52 45 43 4f 56 45 52 22 29 3b  _SIGN_RECOVER");
4500: 0a 09 09 63 61 73 65 20 43 4b 41 5f 56 45 52 49  ...case CKA_VERI
4510: 46 59 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  FY:....return("C
4520: 4b 41 5f 56 45 52 49 46 59 22 29 3b 0a 09 09 63  KA_VERIFY");...c
4530: 61 73 65 20 43 4b 41 5f 56 45 52 49 46 59 5f 52  ase CKA_VERIFY_R
4540: 45 43 4f 56 45 52 3a 0a 09 09 09 72 65 74 75 72  ECOVER:....retur
4550: 6e 28 22 43 4b 41 5f 56 45 52 49 46 59 5f 52 45  n("CKA_VERIFY_RE
4560: 43 4f 56 45 52 22 29 3b 0a 09 09 63 61 73 65 20  COVER");...case 
4570: 43 4b 41 5f 44 45 52 49 56 45 3a 0a 09 09 09 72  CKA_DERIVE:....r
4580: 65 74 75 72 6e 28 22 43 4b 41 5f 44 45 52 49 56  eturn("CKA_DERIV
4590: 45 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f  E");...case CKA_
45a0: 53 54 41 52 54 5f 44 41 54 45 3a 0a 09 09 09 72  START_DATE:....r
45b0: 65 74 75 72 6e 28 22 43 4b 41 5f 53 54 41 52 54  eturn("CKA_START
45c0: 5f 44 41 54 45 22 29 3b 0a 09 09 63 61 73 65 20  _DATE");...case 
45d0: 43 4b 41 5f 45 4e 44 5f 44 41 54 45 3a 0a 09 09  CKA_END_DATE:...
45e0: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 45 4e 44  .return("CKA_END
45f0: 5f 44 41 54 45 22 29 3b 0a 09 09 63 61 73 65 20  _DATE");...case 
4600: 43 4b 41 5f 4d 4f 44 55 4c 55 53 3a 0a 09 09 09  CKA_MODULUS:....
4610: 72 65 74 75 72 6e 28 22 43 4b 41 5f 4d 4f 44 55  return("CKA_MODU
4620: 4c 55 53 22 29 3b 0a 09 09 63 61 73 65 20 43 4b  LUS");...case CK
4630: 41 5f 4d 4f 44 55 4c 55 53 5f 42 49 54 53 3a 0a  A_MODULUS_BITS:.
4640: 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 4d  ...return("CKA_M
4650: 4f 44 55 4c 55 53 5f 42 49 54 53 22 29 3b 0a 09  ODULUS_BITS");..
4660: 09 63 61 73 65 20 43 4b 41 5f 50 55 42 4c 49 43  .case CKA_PUBLIC
4670: 5f 45 58 50 4f 4e 45 4e 54 3a 0a 09 09 09 72 65  _EXPONENT:....re
4680: 74 75 72 6e 28 22 43 4b 41 5f 50 55 42 4c 49 43  turn("CKA_PUBLIC
4690: 5f 45 58 50 4f 4e 45 4e 54 22 29 3b 0a 09 09 63  _EXPONENT");...c
46a0: 61 73 65 20 43 4b 41 5f 50 52 49 56 41 54 45 5f  ase CKA_PRIVATE_
46b0: 45 58 50 4f 4e 45 4e 54 3a 0a 09 09 09 72 65 74  EXPONENT:....ret
46c0: 75 72 6e 28 22 43 4b 41 5f 50 52 49 56 41 54 45  urn("CKA_PRIVATE
46d0: 5f 45 58 50 4f 4e 45 4e 54 22 29 3b 0a 09 09 63  _EXPONENT");...c
46e0: 61 73 65 20 43 4b 41 5f 50 52 49 4d 45 5f 31 3a  ase CKA_PRIME_1:
46f0: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f  ....return("CKA_
4700: 50 52 49 4d 45 5f 31 22 29 3b 0a 09 09 63 61 73  PRIME_1");...cas
4710: 65 20 43 4b 41 5f 50 52 49 4d 45 5f 32 3a 0a 09  e CKA_PRIME_2:..
4720: 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 50 52  ..return("CKA_PR
4730: 49 4d 45 5f 32 22 29 3b 0a 09 09 63 61 73 65 20  IME_2");...case 
4740: 43 4b 41 5f 45 58 50 4f 4e 45 4e 54 5f 31 3a 0a  CKA_EXPONENT_1:.
4750: 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 45  ...return("CKA_E
4760: 58 50 4f 4e 45 4e 54 5f 31 22 29 3b 0a 09 09 63  XPONENT_1");...c
4770: 61 73 65 20 43 4b 41 5f 45 58 50 4f 4e 45 4e 54  ase CKA_EXPONENT
4780: 5f 32 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  _2:....return("C
4790: 4b 41 5f 45 58 50 4f 4e 45 4e 54 5f 32 22 29 3b  KA_EXPONENT_2");
47a0: 0a 09 09 63 61 73 65 20 43 4b 41 5f 43 4f 45 46  ...case CKA_COEF
47b0: 46 49 43 49 45 4e 54 3a 0a 09 09 09 72 65 74 75  FICIENT:....retu
47c0: 72 6e 28 22 43 4b 41 5f 43 4f 45 46 46 49 43 49  rn("CKA_COEFFICI
47d0: 45 4e 54 22 29 3b 0a 09 09 63 61 73 65 20 43 4b  ENT");...case CK
47e0: 41 5f 50 52 49 4d 45 3a 0a 09 09 09 72 65 74 75  A_PRIME:....retu
47f0: 72 6e 28 22 43 4b 41 5f 50 52 49 4d 45 22 29 3b  rn("CKA_PRIME");
4800: 0a 09 09 63 61 73 65 20 43 4b 41 5f 53 55 42 50  ...case CKA_SUBP
4810: 52 49 4d 45 3a 0a 09 09 09 72 65 74 75 72 6e 28  RIME:....return(
4820: 22 43 4b 41 5f 53 55 42 50 52 49 4d 45 22 29 3b  "CKA_SUBPRIME");
4830: 0a 09 09 63 61 73 65 20 43 4b 41 5f 42 41 53 45  ...case CKA_BASE
4840: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41  :....return("CKA
4850: 5f 42 41 53 45 22 29 3b 0a 09 09 63 61 73 65 20  _BASE");...case 
4860: 43 4b 41 5f 50 52 49 4d 45 5f 42 49 54 53 3a 0a  CKA_PRIME_BITS:.
4870: 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 50  ...return("CKA_P
4880: 52 49 4d 45 5f 42 49 54 53 22 29 3b 0a 09 09 63  RIME_BITS");...c
4890: 61 73 65 20 43 4b 41 5f 53 55 42 5f 50 52 49 4d  ase CKA_SUB_PRIM
48a0: 45 5f 42 49 54 53 3a 0a 09 09 09 72 65 74 75 72  E_BITS:....retur
48b0: 6e 28 22 43 4b 41 5f 53 55 42 5f 50 52 49 4d 45  n("CKA_SUB_PRIME
48c0: 5f 42 49 54 53 22 29 3b 0a 09 09 63 61 73 65 20  _BITS");...case 
48d0: 43 4b 41 5f 56 41 4c 55 45 5f 42 49 54 53 3a 0a  CKA_VALUE_BITS:.
48e0: 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 56  ...return("CKA_V
48f0: 41 4c 55 45 5f 42 49 54 53 22 29 3b 0a 09 09 63  ALUE_BITS");...c
4900: 61 73 65 20 43 4b 41 5f 56 41 4c 55 45 5f 4c 45  ase CKA_VALUE_LE
4910: 4e 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b  N:....return("CK
4920: 41 5f 56 41 4c 55 45 5f 4c 45 4e 22 29 3b 0a 09  A_VALUE_LEN");..
4930: 09 63 61 73 65 20 43 4b 41 5f 45 58 54 52 41 43  .case CKA_EXTRAC
4940: 54 41 42 4c 45 3a 0a 09 09 09 72 65 74 75 72 6e  TABLE:....return
4950: 28 22 43 4b 41 5f 45 58 54 52 41 43 54 41 42 4c  ("CKA_EXTRACTABL
4960: 45 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f  E");...case CKA_
4970: 4c 4f 43 41 4c 3a 0a 09 09 09 72 65 74 75 72 6e  LOCAL:....return
4980: 28 22 43 4b 41 5f 4c 4f 43 41 4c 22 29 3b 0a 09  ("CKA_LOCAL");..
4990: 09 63 61 73 65 20 43 4b 41 5f 4e 45 56 45 52 5f  .case CKA_NEVER_
49a0: 45 58 54 52 41 43 54 41 42 4c 45 3a 0a 09 09 09  EXTRACTABLE:....
49b0: 72 65 74 75 72 6e 28 22 43 4b 41 5f 4e 45 56 45  return("CKA_NEVE
49c0: 52 5f 45 58 54 52 41 43 54 41 42 4c 45 22 29 3b  R_EXTRACTABLE");
49d0: 0a 09 09 63 61 73 65 20 43 4b 41 5f 41 4c 57 41  ...case CKA_ALWA
49e0: 59 53 5f 53 45 4e 53 49 54 49 56 45 3a 0a 09 09  YS_SENSITIVE:...
49f0: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 41 4c 57  .return("CKA_ALW
4a00: 41 59 53 5f 53 45 4e 53 49 54 49 56 45 22 29 3b  AYS_SENSITIVE");
4a10: 0a 09 09 63 61 73 65 20 43 4b 41 5f 4b 45 59 5f  ...case CKA_KEY_
4a20: 47 45 4e 5f 4d 45 43 48 41 4e 49 53 4d 3a 0a 09  GEN_MECHANISM:..
4a30: 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 4b 45  ..return("CKA_KE
4a40: 59 5f 47 45 4e 5f 4d 45 43 48 41 4e 49 53 4d 22  Y_GEN_MECHANISM"
4a50: 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 4d 4f  );...case CKA_MO
4a60: 44 49 46 49 41 42 4c 45 3a 0a 09 09 09 72 65 74  DIFIABLE:....ret
4a70: 75 72 6e 28 22 43 4b 41 5f 4d 4f 44 49 46 49 41  urn("CKA_MODIFIA
4a80: 42 4c 45 22 29 3b 0a 09 09 63 61 73 65 20 43 4b  BLE");...case CK
4a90: 41 5f 45 43 44 53 41 5f 50 41 52 41 4d 53 3a 0a  A_ECDSA_PARAMS:.
4aa0: 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 45  ...return("CKA_E
4ab0: 43 44 53 41 5f 50 41 52 41 4d 53 22 29 3b 0a 09  CDSA_PARAMS");..
4ac0: 09 63 61 73 65 20 43 4b 41 5f 45 43 5f 50 4f 49  .case CKA_EC_POI
4ad0: 4e 54 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  NT:....return("C
4ae0: 4b 41 5f 45 43 5f 50 4f 49 4e 54 22 29 3b 0a 09  KA_EC_POINT");..
4af0: 09 63 61 73 65 20 43 4b 41 5f 53 45 43 4f 4e 44  .case CKA_SECOND
4b00: 41 52 59 5f 41 55 54 48 3a 0a 09 09 09 72 65 74  ARY_AUTH:....ret
4b10: 75 72 6e 28 22 43 4b 41 5f 53 45 43 4f 4e 44 41  urn("CKA_SECONDA
4b20: 52 59 5f 41 55 54 48 22 29 3b 0a 09 09 63 61 73  RY_AUTH");...cas
4b30: 65 20 43 4b 41 5f 41 55 54 48 5f 50 49 4e 5f 46  e CKA_AUTH_PIN_F
4b40: 4c 41 47 53 3a 0a 09 09 09 72 65 74 75 72 6e 28  LAGS:....return(
4b50: 22 43 4b 41 5f 41 55 54 48 5f 50 49 4e 5f 46 4c  "CKA_AUTH_PIN_FL
4b60: 41 47 53 22 29 3b 0a 09 09 63 61 73 65 20 43 4b  AGS");...case CK
4b70: 41 5f 48 57 5f 46 45 41 54 55 52 45 5f 54 59 50  A_HW_FEATURE_TYP
4b80: 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b  E:....return("CK
4b90: 41 5f 48 57 5f 46 45 41 54 55 52 45 5f 54 59 50  A_HW_FEATURE_TYP
4ba0: 45 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f  E");...case CKA_
4bb0: 52 45 53 45 54 5f 4f 4e 5f 49 4e 49 54 3a 0a 09  RESET_ON_INIT:..
4bc0: 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 52 45  ..return("CKA_RE
4bd0: 53 45 54 5f 4f 4e 5f 49 4e 49 54 22 29 3b 0a 09  SET_ON_INIT");..
4be0: 09 63 61 73 65 20 43 4b 41 5f 48 41 53 5f 52 45  .case CKA_HAS_RE
4bf0: 53 45 54 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  SET:....return("
4c00: 43 4b 41 5f 48 41 53 5f 52 45 53 45 54 22 29 3b  CKA_HAS_RESET");
4c10: 0a 09 09 63 61 73 65 20 43 4b 41 5f 56 45 4e 44  ...case CKA_VEND
4c20: 4f 52 5f 44 45 46 49 4e 45 44 3a 0a 09 09 09 72  OR_DEFINED:....r
4c30: 65 74 75 72 6e 28 22 43 4b 41 5f 56 45 4e 44 4f  eturn("CKA_VENDO
4c40: 52 5f 44 45 46 49 4e 45 44 22 29 3b 0a 09 7d 0a  R_DEFINED");..}.
4c50: 0a 09 72 65 74 75 72 6e 28 22 55 4e 4b 4e 4f 57  ..return("UNKNOW
4c60: 4e 22 29 3b 0a 7d 0a 0a 23 20 20 64 65 66 69 6e  N");.}..#  defin
4c70: 65 20 6d 61 6c 6c 6f 63 28 78 29 20 43 41 43 4b  e malloc(x) CACK
4c80: 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 4d 41  EY_DEBUG_FUNC_MA
4c90: 4c 4c 4f 43 28 78 2c 20 5f 5f 66 75 6e 63 5f 5f  LLOC(x, __func__
4ca0: 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 0a 23 20 20 64  , __LINE__).#  d
4cb0: 65 66 69 6e 65 20 72 65 61 6c 6c 6f 63 28 78 2c  efine realloc(x,
4cc0: 20 79 29 20 43 41 43 4b 45 59 5f 44 45 42 55 47   y) CACKEY_DEBUG
4cd0: 5f 46 55 4e 43 5f 52 45 41 4c 4c 4f 43 28 78 2c  _FUNC_REALLOC(x,
4ce0: 20 79 2c 20 5f 5f 66 75 6e 63 5f 5f 2c 20 5f 5f   y, __func__, __
4cf0: 4c 49 4e 45 5f 5f 29 0a 23 20 20 69 66 64 65 66  LINE__).#  ifdef
4d00: 20 73 74 72 64 75 70 0a 23 20 20 20 20 75 6e 64   strdup.#    und
4d10: 65 66 20 73 74 72 64 75 70 0a 23 20 20 65 6e 64  ef strdup.#  end
4d20: 69 66 0a 23 20 20 64 65 66 69 6e 65 20 73 74 72  if.#  define str
4d30: 64 75 70 28 78 29 20 43 41 43 4b 45 59 5f 44 45  dup(x) CACKEY_DE
4d40: 42 55 47 5f 46 55 4e 43 5f 53 54 52 44 55 50 28  BUG_FUNC_STRDUP(
4d50: 78 2c 20 5f 5f 66 75 6e 63 5f 5f 2c 20 5f 5f 4c  x, __func__, __L
4d60: 49 4e 45 5f 5f 29 0a 23 65 6c 73 65 0a 23 20 20  INE__).#else.#  
4d70: 64 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 44 45  define CACKEY_DE
4d80: 42 55 47 5f 50 52 49 4e 54 46 28 78 2e 2e 2e 29  BUG_PRINTF(x...)
4d90: 20 2f 2a 2a 2f 0a 23 20 20 64 65 66 69 6e 65 20   /**/.#  define 
4da0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
4db0: 4e 54 42 55 46 28 66 2c 20 78 2c 20 79 29 20 2f  NTBUF(f, x, y) /
4dc0: 2a 2a 2f 0a 23 20 20 64 65 66 69 6e 65 20 43 41  **/.#  define CA
4dd0: 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
4de0: 54 41 47 5f 54 4f 5f 53 54 52 28 78 29 20 22 44  TAG_TO_STR(x) "D
4df0: 45 42 55 47 5f 44 49 53 41 42 4c 45 44 22 0a 23  EBUG_DISABLED".#
4e00: 20 20 64 65 66 69 6e 65 20 43 41 43 4b 45 59 5f    define CACKEY_
4e10: 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44  DEBUG_FUNC_SCARD
4e20: 45 52 52 5f 54 4f 5f 53 54 52 28 78 29 20 22 44  ERR_TO_STR(x) "D
4e30: 45 42 55 47 5f 44 49 53 41 42 4c 45 44 22 0a 23  EBUG_DISABLED".#
4e40: 20 20 64 65 66 69 6e 65 20 43 41 43 4b 45 59 5f    define CACKEY_
4e50: 44 45 42 55 47 5f 46 55 4e 43 5f 4f 42 4a 49 44  DEBUG_FUNC_OBJID
4e60: 5f 54 4f 5f 53 54 52 28 78 29 20 22 44 45 42 55  _TO_STR(x) "DEBU
4e70: 47 5f 44 49 53 41 42 4c 45 44 22 0a 23 20 20 64  G_DISABLED".#  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 41 50 50 54 59 50 45 5f  UG_FUNC_APPTYPE_
4ea0: 54 4f 5f 53 54 52 28 78 29 20 22 44 45 42 55 47  TO_STR(x) "DEBUG
4eb0: 5f 44 49 53 41 42 4c 45 44 22 0a 23 20 20 64 65  _DISABLED".#  de
4ec0: 66 69 6e 65 20 43 41 43 4b 45 59 5f 44 45 42 55  fine CACKEY_DEBU
4ed0: 47 5f 46 55 4e 43 5f 41 54 54 52 49 42 55 54 45  G_FUNC_ATTRIBUTE
4ee0: 5f 54 4f 5f 53 54 52 28 78 29 20 22 44 45 42 55  _TO_STR(x) "DEBU
4ef0: 47 5f 44 49 53 41 42 4c 45 44 22 0a 23 65 6e 64  G_DISABLED".#end
4f00: 69 66 0a 0a 2f 2a 0a 20 2a 20 49 6e 63 6c 75 64  if../*. * Includ
4f10: 65 20 74 68 65 73 65 20 73 6f 75 72 63 65 20 66  e these source f
4f20: 69 6c 65 73 20 69 6e 20 74 68 69 73 20 74 72 61  iles in this tra
4f30: 6e 73 6c 61 74 69 6f 6e 20 75 6e 69 74 20 73 6f  nslation unit so
4f40: 20 74 68 61 74 20 77 65 20 63 61 6e 20 62 69 6e   that we can bin
4f50: 64 20 74 6f 0a 20 2a 20 66 75 6e 63 74 69 6f 6e  d to. * function
4f60: 73 20 61 6e 64 20 6e 6f 74 20 69 6e 63 6c 75 64  s and not includ
4f70: 65 20 61 6e 79 20 73 79 6d 62 6f 6c 73 20 69 6e  e any symbols in
4f80: 20 74 68 65 20 6f 75 74 70 75 74 20 73 68 61 72   the output shar
4f90: 65 64 20 6f 62 6a 65 63 74 2e 0a 20 2a 2f 0a 23  ed object.. */.#
4fa0: 69 6e 63 6c 75 64 65 20 22 61 73 6e 31 2d 78 35  include "asn1-x5
4fb0: 30 39 2e 63 22 0a 23 69 6e 63 6c 75 64 65 20 22  09.c".#include "
4fc0: 73 68 61 31 2e 63 22 0a 23 69 6e 63 6c 75 64 65  sha1.c".#include
4fd0: 20 22 6d 64 35 2e 63 22 0a 0a 74 79 70 65 64 65   "md5.c"..typede
4fe0: 66 20 65 6e 75 6d 20 7b 0a 09 43 41 43 4b 45 59  f enum {..CACKEY
4ff0: 5f 49 44 5f 54 59 50 45 5f 43 41 43 2c 0a 09 43  _ID_TYPE_CAC,..C
5000: 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 50 49  ACKEY_ID_TYPE_PI
5010: 56 2c 0a 09 43 41 43 4b 45 59 5f 49 44 5f 54 59  V,..CACKEY_ID_TY
5020: 50 45 5f 43 45 52 54 5f 4f 4e 4c 59 0a 7d 20 63  PE_CERT_ONLY.} c
5030: 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 5f 74 79  ackey_pcsc_id_ty
5040: 70 65 3b 0a 0a 73 74 72 75 63 74 20 63 61 63 6b  pe;..struct cack
5050: 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79  ey_pcsc_identity
5060: 20 7b 0a 09 63 61 63 6b 65 79 5f 70 63 73 63 5f   {..cackey_pcsc_
5070: 69 64 5f 74 79 70 65 20 69 64 5f 74 79 70 65 3b  id_type id_type;
5080: 0a 0a 09 73 69 7a 65 5f 74 20 63 65 72 74 69 66  ...size_t certif
5090: 69 63 61 74 65 5f 6c 65 6e 3b 0a 09 75 6e 73 69  icate_len;..unsi
50a0: 67 6e 65 64 20 63 68 61 72 20 2a 63 65 72 74 69  gned char *certi
50b0: 66 69 63 61 74 65 3b 0a 0a 09 73 73 69 7a 65 5f  ficate;...ssize_
50c0: 74 20 6b 65 79 73 69 7a 65 3b 0a 0a 09 75 6e 69  t keysize;...uni
50d0: 6f 6e 20 7b 0a 09 09 73 74 72 75 63 74 20 7b 0a  on {...struct {.
50e0: 09 09 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72  ...unsigned char
50f0: 20 61 70 70 6c 65 74 5b 37 5d 3b 0a 09 09 09 75   applet[7];....u
5100: 69 6e 74 31 36 5f 74 20 66 69 6c 65 3b 0a 09 09  int16_t file;...
5110: 7d 20 63 61 63 3b 0a 0a 09 09 73 74 72 75 63 74  } cac;....struct
5120: 20 7b 0a 09 09 09 75 6e 73 69 67 6e 65 64 20 63   {....unsigned c
5130: 68 61 72 20 6b 65 79 5f 69 64 3b 0a 09 09 09 63  har key_id;....c
5140: 68 61 72 20 6c 61 62 65 6c 5b 33 32 5d 3b 0a 09  har label[32];..
5150: 09 7d 20 70 69 76 3b 0a 09 7d 20 63 61 72 64 3b  .} piv;..} card;
5160: 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 63 61 63 6b  .};..struct cack
5170: 65 79 5f 69 64 65 6e 74 69 74 79 20 7b 0a 09 73  ey_identity {..s
5180: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73  truct cackey_pcs
5190: 63 5f 69 64 65 6e 74 69 74 79 20 2a 70 63 73 63  c_identity *pcsc
51a0: 5f 69 64 65 6e 74 69 74 79 3b 0a 0a 09 43 4b 5f  _identity;...CK_
51b0: 41 54 54 52 49 42 55 54 45 20 2a 61 74 74 72 69  ATTRIBUTE *attri
51c0: 62 75 74 65 73 3b 0a 09 43 4b 5f 55 4c 4f 4e 47  butes;..CK_ULONG
51d0: 20 61 74 74 72 69 62 75 74 65 73 5f 63 6f 75 6e   attributes_coun
51e0: 74 3b 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 63 61  t;.};..struct ca
51f0: 63 6b 65 79 5f 73 65 73 73 69 6f 6e 20 7b 0a 09  ckey_session {..
5200: 69 6e 74 20 61 63 74 69 76 65 3b 0a 0a 09 43 4b  int active;...CK
5210: 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 3b  _SLOT_ID slotID;
5220: 0a 0a 09 43 4b 5f 53 54 41 54 45 20 73 74 61 74  ...CK_STATE stat
5230: 65 3b 0a 09 43 4b 5f 46 4c 41 47 53 20 66 6c 61  e;..CK_FLAGS fla
5240: 67 73 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 75 6c  gs;..CK_ULONG ul
5250: 44 65 76 69 63 65 45 72 72 6f 72 3b 0a 09 43 4b  DeviceError;..CK
5260: 5f 56 4f 49 44 5f 50 54 52 20 70 41 70 70 6c 69  _VOID_PTR pAppli
5270: 63 61 74 69 6f 6e 3b 0a 09 43 4b 5f 4e 4f 54 49  cation;..CK_NOTI
5280: 46 59 20 4e 6f 74 69 66 79 3b 0a 0a 09 73 74 72  FY Notify;...str
5290: 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e 74  uct cackey_ident
52a0: 69 74 79 20 2a 69 64 65 6e 74 69 74 69 65 73 3b  ity *identities;
52b0: 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  ..unsigned long 
52c0: 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74  identities_count
52d0: 3b 0a 0a 09 69 6e 74 20 73 65 61 72 63 68 5f 61  ;...int search_a
52e0: 63 74 69 76 65 3b 0a 09 43 4b 5f 41 54 54 52 49  ctive;..CK_ATTRI
52f0: 42 55 54 45 5f 50 54 52 20 73 65 61 72 63 68 5f  BUTE_PTR search_
5300: 71 75 65 72 79 3b 0a 09 43 4b 5f 55 4c 4f 4e 47  query;..CK_ULONG
5310: 20 73 65 61 72 63 68 5f 71 75 65 72 79 5f 63 6f   search_query_co
5320: 75 6e 74 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c  unt;..unsigned l
5330: 6f 6e 67 20 73 65 61 72 63 68 5f 63 75 72 72 5f  ong search_curr_
5340: 69 64 3b 0a 0a 09 69 6e 74 20 73 69 67 6e 5f 61  id;...int sign_a
5350: 63 74 69 76 65 3b 0a 09 43 4b 5f 4d 45 43 48 41  ctive;..CK_MECHA
5360: 4e 49 53 4d 5f 54 59 50 45 20 73 69 67 6e 5f 6d  NISM_TYPE sign_m
5370: 65 63 68 61 6e 69 73 6d 3b 0a 09 43 4b 5f 42 59  echanism;..CK_BY
5380: 54 45 5f 50 54 52 20 73 69 67 6e 5f 62 75 66 3b  TE_PTR sign_buf;
5390: 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  ..unsigned long 
53a0: 73 69 67 6e 5f 62 75 66 6c 65 6e 3b 0a 09 75 6e  sign_buflen;..un
53b0: 73 69 67 6e 65 64 20 6c 6f 6e 67 20 73 69 67 6e  signed long sign
53c0: 5f 62 75 66 75 73 65 64 3b 0a 09 73 74 72 75 63  _bufused;..struc
53d0: 74 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 74  t cackey_identit
53e0: 79 20 2a 73 69 67 6e 5f 69 64 65 6e 74 69 74 79  y *sign_identity
53f0: 3b 0a 0a 09 69 6e 74 20 64 65 63 72 79 70 74 5f  ;...int decrypt_
5400: 61 63 74 69 76 65 3b 0a 09 43 4b 5f 4d 45 43 48  active;..CK_MECH
5410: 41 4e 49 53 4d 5f 54 59 50 45 20 64 65 63 72 79  ANISM_TYPE decry
5420: 70 74 5f 6d 65 63 68 61 6e 69 73 6d 3b 0a 09 43  pt_mechanism;..C
5430: 4b 5f 56 4f 49 44 5f 50 54 52 20 64 65 63 72 79  K_VOID_PTR decry
5440: 70 74 5f 6d 65 63 68 5f 70 61 72 6d 3b 0a 09 43  pt_mech_parm;..C
5450: 4b 5f 55 4c 4f 4e 47 20 64 65 63 72 79 70 74 5f  K_ULONG decrypt_
5460: 6d 65 63 68 5f 70 61 72 6d 6c 65 6e 3b 0a 09 73  mech_parmlen;..s
5470: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65  truct cackey_ide
5480: 6e 74 69 74 79 20 2a 64 65 63 72 79 70 74 5f 69  ntity *decrypt_i
5490: 64 65 6e 74 69 74 79 3b 0a 7d 3b 0a 0a 73 74 72  dentity;.};..str
54a0: 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20  uct cackey_slot 
54b0: 7b 0a 09 69 6e 74 20 61 63 74 69 76 65 3b 0a 09  {..int active;..
54c0: 69 6e 74 20 69 6e 74 65 72 6e 61 6c 3b 0a 0a 09  int internal;...
54d0: 63 68 61 72 20 2a 70 63 73 63 5f 72 65 61 64 65  char *pcsc_reade
54e0: 72 3b 0a 0a 09 69 6e 74 20 70 63 73 63 5f 63 61  r;...int pcsc_ca
54f0: 72 64 5f 63 6f 6e 6e 65 63 74 65 64 3b 0a 09 53  rd_connected;..S
5500: 43 41 52 44 48 41 4e 44 4c 45 20 70 63 73 63 5f  CARDHANDLE pcsc_
5510: 63 61 72 64 3b 0a 0a 09 69 6e 74 20 74 72 61 6e  card;...int tran
5520: 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 3b 0a 09  saction_depth;..
5530: 69 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 5f  int transaction_
5540: 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b 3b 0a 0a 09  need_hw_lock;...
5550: 69 6e 74 20 73 6c 6f 74 5f 72 65 73 65 74 3b 0a  int slot_reset;.
5560: 0a 09 43 4b 5f 46 4c 41 47 53 20 74 6f 6b 65 6e  ..CK_FLAGS token
5570: 5f 66 6c 61 67 73 3b 0a 0a 09 75 6e 73 69 67 6e  _flags;...unsign
5580: 65 64 20 63 68 61 72 20 2a 6c 61 62 65 6c 3b 0a  ed char *label;.
5590: 0a 09 44 57 4f 52 44 20 70 72 6f 74 6f 63 6f 6c  ..DWORD protocol
55a0: 3b 0a 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e 74  ;...unsigned int
55b0: 20 63 61 63 68 65 64 5f 63 65 72 74 73 5f 63 6f   cached_certs_co
55c0: 75 6e 74 3b 0a 09 73 74 72 75 63 74 20 63 61 63  unt;..struct cac
55d0: 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74  key_pcsc_identit
55e0: 79 20 2a 63 61 63 68 65 64 5f 63 65 72 74 73 3b  y *cached_certs;
55f0: 0a 7d 3b 0a 0a 74 79 70 65 64 65 66 20 65 6e 75  .};..typedef enu
5600: 6d 20 7b 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f  m {..CACKEY_TLV_
5610: 41 50 50 5f 47 45 4e 45 52 49 43 20 3d 20 30 78  APP_GENERIC = 0x
5620: 30 31 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f  01,..CACKEY_TLV_
5630: 41 50 50 5f 53 4b 49 20 20 20 20 20 3d 20 30 78  APP_SKI     = 0x
5640: 30 32 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f  02,..CACKEY_TLV_
5650: 41 50 50 5f 50 4b 49 20 20 20 20 20 3d 20 30 78  APP_PKI     = 0x
5660: 30 34 0a 7d 20 63 61 63 6b 65 79 5f 74 6c 76 5f  04.} cackey_tlv_
5670: 61 70 70 74 79 70 65 3b 0a 0a 74 79 70 65 64 65  apptype;..typede
5680: 66 20 65 6e 75 6d 20 7b 0a 09 43 41 43 4b 45 59  f enum {..CACKEY
5690: 5f 54 4c 56 5f 4f 42 4a 49 44 5f 47 45 4e 45 52  _TLV_OBJID_GENER
56a0: 41 4c 49 4e 46 4f 20 20 20 20 20 20 20 3d 20 30  ALINFO       = 0
56b0: 78 32 30 30 30 2c 0a 09 43 41 43 4b 45 59 5f 54  x2000,..CACKEY_T
56c0: 4c 56 5f 4f 42 4a 49 44 5f 50 52 4f 50 45 52 53  LV_OBJID_PROPERS
56d0: 4f 4e 41 4c 49 4e 46 4f 20 20 20 3d 20 30 78 32  ONALINFO   = 0x2
56e0: 31 30 30 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56  100,..CACKEY_TLV
56f0: 5f 4f 42 4a 49 44 5f 41 43 43 45 53 53 43 4f 4e  _OBJID_ACCESSCON
5700: 54 52 4f 4c 20 20 20 20 20 3d 20 30 78 33 30 30  TROL     = 0x300
5710: 30 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f  0,..CACKEY_TLV_O
5720: 42 4a 49 44 5f 4c 4f 47 49 4e 20 20 20 20 20 20  BJID_LOGIN      
5730: 20 20 20 20 20 20 20 3d 20 30 78 34 30 30 30 2c         = 0x4000,
5740: 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a  ..CACKEY_TLV_OBJ
5750: 49 44 5f 43 41 52 44 49 4e 46 4f 20 20 20 20 20  ID_CARDINFO     
5760: 20 20 20 20 20 3d 20 30 78 35 30 30 30 2c 0a 09       = 0x5000,..
5770: 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44  CACKEY_TLV_OBJID
5780: 5f 42 49 4f 4d 45 54 52 49 43 53 20 20 20 20 20  _BIOMETRICS     
5790: 20 20 20 3d 20 30 78 36 30 30 30 2c 0a 09 43 41     = 0x6000,..CA
57a0: 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 44  CKEY_TLV_OBJID_D
57b0: 49 47 49 54 41 4c 53 49 47 43 45 52 54 20 20 20  IGITALSIGCERT   
57c0: 20 3d 20 30 78 37 30 30 30 2c 0a 09 43 41 43 4b   = 0x7000,..CACK
57d0: 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43  EY_TLV_OBJID_CAC
57e0: 5f 50 45 52 53 4f 4e 20 20 20 20 20 20 20 20 3d  _PERSON        =
57f0: 20 30 78 30 32 30 30 2c 0a 09 43 41 43 4b 45 59   0x0200,..CACKEY
5800: 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 42  _TLV_OBJID_CAC_B
5810: 45 4e 45 46 49 54 53 20 20 20 20 20 20 3d 20 30  ENEFITS      = 0
5820: 78 30 32 30 32 2c 0a 09 43 41 43 4b 45 59 5f 54  x0202,..CACKEY_T
5830: 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 4f 54 48  LV_OBJID_CAC_OTH
5840: 45 52 42 45 4e 45 46 49 54 53 20 3d 20 30 78 30  ERBENEFITS = 0x0
5850: 32 30 33 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56  203,..CACKEY_TLV
5860: 5f 4f 42 4a 49 44 5f 43 41 43 5f 50 45 52 53 4f  _OBJID_CAC_PERSO
5870: 4e 4e 45 4c 20 20 20 20 20 3d 20 30 78 30 32 30  NNEL     = 0x020
5880: 31 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f  1,..CACKEY_TLV_O
5890: 42 4a 49 44 5f 43 41 43 5f 50 4b 49 43 45 52 54  BJID_CAC_PKICERT
58a0: 20 20 20 20 20 20 20 3d 20 30 78 30 32 46 45 0a         = 0x02FE.
58b0: 7d 20 63 61 63 6b 65 79 5f 74 6c 76 5f 6f 62 6a  } cackey_tlv_obj
58c0: 65 63 74 69 64 3b 0a 0a 74 79 70 65 64 65 66 20  ectid;..typedef 
58d0: 65 6e 75 6d 20 7b 0a 09 43 41 43 4b 45 59 5f 50  enum {..CACKEY_P
58e0: 43 53 43 5f 53 5f 54 4f 4b 45 4e 50 52 45 53 45  CSC_S_TOKENPRESE
58f0: 4e 54 20 20 20 20 3d 20 31 2c 0a 09 43 41 43 4b  NT    = 1,..CACK
5900: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20 20  EY_PCSC_S_OK    
5910: 20 20 20 20 20 20 20 20 20 20 3d 20 30 2c 0a 09            = 0,..
5920: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45  CACKEY_PCSC_E_GE
5930: 4e 45 52 49 43 20 20 20 20 20 20 20 20 20 3d 20  NERIC         = 
5940: 2d 31 2c 0a 09 43 41 43 4b 45 59 5f 50 43 53 43  -1,..CACKEY_PCSC
5950: 5f 45 5f 42 41 44 50 49 4e 20 20 20 20 20 20 20  _E_BADPIN       
5960: 20 20 20 3d 20 2d 32 2c 0a 09 43 41 43 4b 45 59     = -2,..CACKEY
5970: 5f 50 43 53 43 5f 45 5f 4c 4f 43 4b 45 44 20 20  _PCSC_E_LOCKED  
5980: 20 20 20 20 20 20 20 20 3d 20 2d 33 2c 0a 09 43          = -3,..C
5990: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4e 45 45  ACKEY_PCSC_E_NEE
59a0: 44 4c 4f 47 49 4e 20 20 20 20 20 20 20 3d 20 2d  DLOGIN       = -
59b0: 34 2c 0a 09 43 41 43 4b 45 59 5f 50 43 53 43 5f  4,..CACKEY_PCSC_
59c0: 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 20 20 20  E_TOKENABSENT   
59d0: 20 20 3d 20 2d 36 2c 0a 09 43 41 43 4b 45 59 5f    = -6,..CACKEY_
59e0: 50 43 53 43 5f 45 5f 52 45 54 52 59 20 20 20 20  PCSC_E_RETRY    
59f0: 20 20 20 20 20 20 20 3d 20 2d 37 0a 7d 20 63 61         = -7.} ca
5a00: 63 6b 65 79 5f 72 65 74 3b 0a 0a 73 74 72 75 63  ckey_ret;..struc
5a10: 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 63 61 72  t cackey_tlv_car
5a20: 64 75 72 6c 20 7b 0a 09 75 6e 73 69 67 6e 65 64  durl {..unsigned
5a30: 20 63 68 61 72 20 20 20 20 20 20 20 20 72 69 64   char        rid
5a40: 5b 35 5d 3b 0a 09 63 61 63 6b 65 79 5f 74 6c 76  [5];..cackey_tlv
5a50: 5f 61 70 70 74 79 70 65 20 20 20 61 70 70 74 79  _apptype   appty
5a60: 70 65 3b 0a 09 63 61 63 6b 65 79 5f 74 6c 76 5f  pe;..cackey_tlv_
5a70: 6f 62 6a 65 63 74 69 64 20 20 6f 62 6a 65 63 74  objectid  object
5a80: 69 64 3b 0a 09 63 61 63 6b 65 79 5f 74 6c 76 5f  id;..cackey_tlv_
5a90: 6f 62 6a 65 63 74 69 64 20 20 61 70 70 69 64 3b  objectid  appid;
5aa0: 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  ..unsigned char 
5ab0: 20 20 20 20 20 20 20 70 69 6e 69 64 3b 0a 7d 3b         pinid;.};
5ac0: 0a 0a 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  ..struct cackey_
5ad0: 74 6c 76 5f 65 6e 74 69 74 79 3b 0a 73 74 72 75  tlv_entity;.stru
5ae0: 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e  ct cackey_tlv_en
5af0: 74 69 74 79 20 7b 0a 09 75 69 6e 74 38 5f 74 20  tity {..uint8_t 
5b00: 74 61 67 3b 0a 09 73 69 7a 65 5f 74 20 6c 65 6e  tag;..size_t len
5b10: 67 74 68 3b 0a 0a 09 75 6e 69 6f 6e 20 7b 0a 09  gth;...union {..
5b20: 09 76 6f 69 64 20 2a 76 61 6c 75 65 3b 0a 09 09  .void *value;...
5b30: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c  struct cackey_tl
5b40: 76 5f 63 61 72 64 75 72 6c 20 2a 76 61 6c 75 65  v_cardurl *value
5b50: 5f 63 61 72 64 75 72 6c 3b 0a 09 09 75 69 6e 74  _cardurl;...uint
5b60: 38 5f 74 20 76 61 6c 75 65 5f 62 79 74 65 3b 0a  8_t value_byte;.
5b70: 09 7d 3b 0a 0a 09 73 74 72 75 63 74 20 63 61 63  .};...struct cac
5b80: 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20 2a  key_tlv_entity *
5b90: 5f 6e 65 78 74 3b 0a 7d 3b 0a 0a 2f 2a 20 43 41  _next;.};../* CA
5ba0: 43 4b 45 59 20 47 6c 6f 62 61 6c 20 48 61 6e 64  CKEY Global Hand
5bb0: 6c 65 73 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f  les */.static vo
5bc0: 69 64 20 2a 63 61 63 6b 65 79 5f 62 69 67 6c 6f  id *cackey_biglo
5bd0: 63 6b 20 3d 20 4e 55 4c 4c 3b 0a 73 74 61 74 69  ck = NULL;.stati
5be0: 63 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  c struct cackey_
5bf0: 73 65 73 73 69 6f 6e 20 63 61 63 6b 65 79 5f 73  session cackey_s
5c00: 65 73 73 69 6f 6e 73 5b 31 32 38 5d 3b 0a 73 74  essions[128];.st
5c10: 61 74 69 63 20 73 74 72 75 63 74 20 63 61 63 6b  atic struct cack
5c20: 65 79 5f 73 6c 6f 74 20 63 61 63 6b 65 79 5f 73  ey_slot cackey_s
5c30: 6c 6f 74 73 5b 31 32 38 5d 3b 0a 73 74 61 74 69  lots[128];.stati
5c40: 63 20 69 6e 74 20 63 61 63 6b 65 79 5f 69 6e 69  c int cackey_ini
5c50: 74 69 61 6c 69 7a 65 64 20 3d 20 30 3b 0a 73 74  tialized = 0;.st
5c60: 61 74 69 63 20 69 6e 74 20 63 61 63 6b 65 79 5f  atic int cackey_
5c70: 62 69 67 6c 6f 63 6b 5f 69 6e 69 74 20 3d 20 30  biglock_init = 0
5c80: 3b 0a 43 4b 5f 43 5f 49 4e 49 54 49 41 4c 49 5a  ;.CK_C_INITIALIZ
5c90: 45 5f 41 52 47 53 20 63 61 63 6b 65 79 5f 61 72  E_ARGS cackey_ar
5ca0: 67 73 3b 0a 0a 2f 2a 2a 20 45 78 74 72 61 20 63  gs;../** Extra c
5cb0: 65 72 74 69 66 69 63 61 74 65 73 20 74 6f 20 69  ertificates to i
5cc0: 6e 63 6c 75 64 65 20 69 6e 20 74 6f 6b 65 6e 20  nclude in token 
5cd0: 2a 2a 2f 0a 73 74 72 75 63 74 20 63 61 63 6b 65  **/.struct cacke
5ce0: 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20  y_pcsc_identity 
5cf0: 65 78 74 72 61 5f 63 65 72 74 73 5b 5d 20 3d 20  extra_certs[] = 
5d00: 7b 0a 23 69 6e 63 6c 75 64 65 20 22 63 61 63 6b  {.#include "cack
5d10: 65 79 5f 62 75 69 6c 74 69 6e 5f 63 65 72 74 73  ey_builtin_certs
5d20: 2e 68 22 0a 7d 3b 0a 0a 2f 2a 20 50 72 6f 74 65  .h".};../* Prote
5d30: 63 74 65 64 20 41 75 74 68 65 6e 74 69 63 61 74  cted Authenticat
5d40: 69 6f 6e 20 50 61 74 68 20 63 6f 6d 6d 61 6e 64  ion Path command
5d50: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 43 41 43 4b   */.#define CACK
5d60: 45 59 5f 50 49 4e 5f 43 4f 4d 4d 41 4e 44 5f 44  EY_PIN_COMMAND_D
5d70: 45 46 41 55 4c 54 5f 58 53 54 52 28 73 74 72 29  EFAULT_XSTR(str)
5d80: 20 43 41 43 4b 45 59 5f 50 49 4e 5f 43 4f 4d 4d   CACKEY_PIN_COMM
5d90: 41 4e 44 5f 44 45 46 41 55 4c 54 5f 53 54 52 28  AND_DEFAULT_STR(
5da0: 73 74 72 29 0a 23 64 65 66 69 6e 65 20 43 41 43  str).#define CAC
5db0: 4b 45 59 5f 50 49 4e 5f 43 4f 4d 4d 41 4e 44 5f  KEY_PIN_COMMAND_
5dc0: 44 45 46 41 55 4c 54 5f 53 54 52 28 73 74 72 29  DEFAULT_STR(str)
5dd0: 20 23 73 74 72 0a 73 74 61 74 69 63 20 63 68 61   #str.static cha
5de0: 72 20 2a 63 61 63 6b 65 79 5f 70 69 6e 5f 63 6f  r *cackey_pin_co
5df0: 6d 6d 61 6e 64 20 3d 20 4e 55 4c 4c 3b 0a 0a 2f  mmand = NULL;../
5e00: 2a 20 50 43 53 43 20 47 6c 6f 62 61 6c 20 48 61  * PCSC Global Ha
5e10: 6e 64 6c 65 73 20 2a 2f 0a 73 74 61 74 69 63 20  ndles */.static 
5e20: 4c 50 53 43 41 52 44 43 4f 4e 54 45 58 54 20 63  LPSCARDCONTEXT c
5e30: 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c  ackey_pcsc_handl
5e40: 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 73 74 61 74 69  e = NULL;..stati
5e50: 63 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  c unsigned long 
5e60: 63 61 63 6b 65 79 5f 67 65 74 76 65 72 73 69 6f  cackey_getversio
5e70: 6e 28 76 6f 69 64 29 20 7b 0a 09 73 74 61 74 69  n(void) {..stati
5e80: 63 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  c unsigned long 
5e90: 72 65 74 76 61 6c 20 3d 20 32 35 35 3b 0a 09 75  retval = 255;..u
5ea0: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6d 61 6a  nsigned long maj
5eb0: 6f 72 20 3d 20 30 3b 0a 09 75 6e 73 69 67 6e 65  or = 0;..unsigne
5ec0: 64 20 6c 6f 6e 67 20 6d 69 6e 6f 72 20 3d 20 30  d long minor = 0
5ed0: 3b 0a 09 63 68 61 72 20 2a 6d 61 6a 6f 72 5f 73  ;..char *major_s
5ee0: 74 72 20 3d 20 4e 55 4c 4c 3b 0a 09 63 68 61 72  tr = NULL;..char
5ef0: 20 2a 6d 69 6e 6f 72 5f 73 74 72 20 3d 20 4e 55   *minor_str = NU
5f00: 4c 4c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  LL;...CACKEY_DEB
5f10: 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
5f20: 64 2e 22 29 3b 0a 0a 09 69 66 20 28 72 65 74 76  d.");...if (retv
5f30: 61 6c 20 21 3d 20 32 35 35 29 20 7b 0a 09 09 43  al != 255) {...C
5f40: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
5f50: 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 30 78  TF("Returning 0x
5f60: 25 6c 78 20 28 63 61 63 68 65 64 29 2e 22 2c 20  %lx (cached).", 
5f70: 72 65 74 76 61 6c 29 3b 0a 0a 09 09 72 65 74 75  retval);....retu
5f80: 72 6e 28 72 65 74 76 61 6c 29 3b 0a 09 7d 0a 0a  rn(retval);..}..
5f90: 09 72 65 74 76 61 6c 20 3d 20 30 3b 0a 0a 23 69  .retval = 0;..#i
5fa0: 66 64 65 66 20 50 41 43 4b 41 47 45 5f 56 45 52  fdef PACKAGE_VER
5fb0: 53 49 4f 4e 0a 20 20 20 20 20 20 20 20 6d 61 6a  SION.        maj
5fc0: 6f 72 5f 73 74 72 20 3d 20 50 41 43 4b 41 47 45  or_str = PACKAGE
5fd0: 5f 56 45 52 53 49 4f 4e 3b 0a 09 69 66 20 28 6d  _VERSION;..if (m
5fe0: 61 6a 6f 72 5f 73 74 72 29 20 7b 0a 09 20 20 20  ajor_str) {..   
5ff0: 20 20 20 20 20 6d 61 6a 6f 72 20 3d 20 73 74 72       major = str
6000: 74 6f 75 6c 28 6d 61 6a 6f 72 5f 73 74 72 2c 20  toul(major_str, 
6010: 26 6d 69 6e 6f 72 5f 73 74 72 2c 20 31 30 29 3b  &minor_str, 10);
6020: 0a 0a 09 09 69 66 20 28 6d 69 6e 6f 72 5f 73 74  ....if (minor_st
6030: 72 29 20 7b 0a 09 09 09 6d 69 6e 6f 72 20 3d 20  r) {....minor = 
6040: 73 74 72 74 6f 75 6c 28 6d 69 6e 6f 72 5f 73 74  strtoul(minor_st
6050: 72 20 2b 20 31 2c 20 4e 55 4c 4c 2c 20 31 30 29  r + 1, NULL, 10)
6060: 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 72 65 74 76 61  ;...}..}...retva
6070: 6c 20 3d 20 28 6d 61 6a 6f 72 20 3c 3c 20 31 36  l = (major << 16
6080: 29 20 7c 20 28 6d 69 6e 6f 72 20 3c 3c 20 38 29  ) | (minor << 8)
6090: 3b 0a 23 65 6e 64 69 66 0a 0a 09 43 41 43 4b 45  ;.#endif...CACKE
60a0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
60b0: 52 65 74 75 72 6e 69 6e 67 20 30 78 25 6c 78 22  Returning 0x%lx"
60c0: 2c 20 72 65 74 76 61 6c 29 3b 0a 0a 09 72 65 74  , retval);...ret
60d0: 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a  urn(retval);.}..
60e0: 2f 2a 20 50 43 2f 53 43 20 52 65 6c 61 74 65 64  /* PC/SC Related
60f0: 20 46 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 2f 2a   Functions */./*
6100: 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20  . * SYNPOSIS. * 
6110: 20 20 20 20 76 6f 69 64 20 63 61 63 6b 65 79 5f      void cackey_
6120: 73 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e 65 63 74  slots_disconnect
6130: 5f 61 6c 6c 28 76 6f 69 64 29 3b 0a 20 2a 0a 20  _all(void);. *. 
6140: 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20  * ARGUMENTS. *  
6150: 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 52 45     None. *. * RE
6160: 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20  TURN VALUE. *   
6170: 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 4e 4f 54    None. *. * NOT
6180: 45 53 0a 20 2a 20 20 20 20 20 54 68 69 73 20 66  ES. *     This f
6190: 75 6e 63 74 69 6f 6e 20 64 69 73 63 6f 6e 6e 65  unction disconne
61a0: 63 74 73 20 66 72 6f 6d 20 61 6c 6c 20 63 61 72  cts from all car
61b0: 64 73 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69  ds.. *. */.stati
61c0: 63 20 76 6f 69 64 20 63 61 63 6b 65 79 5f 73 6c  c void cackey_sl
61d0: 6f 74 73 5f 64 69 73 63 6f 6e 6e 65 63 74 5f 61  ots_disconnect_a
61e0: 6c 6c 28 76 6f 69 64 29 20 7b 0a 09 75 69 6e 74  ll(void) {..uint
61f0: 33 32 5f 74 20 69 64 78 3b 0a 0a 09 43 41 43 4b  32_t idx;...CACK
6200: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
6210: 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 66 6f  "Called.");...fo
6220: 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20  r (idx = 0; idx 
6230: 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  < (sizeof(cackey
6240: 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66  _slots) / sizeof
6250: 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d  (cackey_slots[0]
6260: 29 29 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 69  )); idx++) {...i
6270: 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  f (cackey_slots[
6280: 69 64 78 5d 2e 69 6e 74 65 72 6e 61 6c 29 20 7b  idx].internal) {
6290: 0a 09 09 09 2f 2a 20 53 6b 69 70 20 69 6e 74 65  ..../* Skip inte
62a0: 72 6e 61 6c 20 73 6c 6f 74 73 20 2a 2f 0a 09 09  rnal slots */...
62b0: 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 7d 0a 0a  .continue;...}..
62c0: 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f  ..if (cackey_slo
62d0: 74 73 5b 69 64 78 5d 2e 70 63 73 63 5f 63 61 72  ts[idx].pcsc_car
62e0: 64 5f 63 6f 6e 6e 65 63 74 65 64 29 20 7b 0a 09  d_connected) {..
62f0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
6300: 52 49 4e 54 46 28 22 53 43 61 72 64 44 69 73 63  RINTF("SCardDisc
6310: 6f 6e 6e 65 63 74 28 25 6c 75 29 20 63 61 6c 6c  onnect(%lu) call
6320: 65 64 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ed", (unsigned l
6330: 6f 6e 67 29 20 69 64 78 29 3b 0a 0a 09 09 09 53  ong) idx);.....S
6340: 43 61 72 64 44 69 73 63 6f 6e 6e 65 63 74 28 63  CardDisconnect(c
6350: 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d  ackey_slots[idx]
6360: 2e 70 63 73 63 5f 63 61 72 64 2c 20 53 43 41 52  .pcsc_card, SCAR
6370: 44 5f 4c 45 41 56 45 5f 43 41 52 44 29 3b 0a 09  D_LEAVE_CARD);..
6380: 09 7d 0a 0a 09 09 69 66 20 28 63 61 63 6b 65 79  .}....if (cackey
6390: 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 6c 61 62 65  _slots[idx].labe
63a0: 6c 29 20 7b 0a 09 09 09 66 72 65 65 28 63 61 63  l) {....free(cac
63b0: 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 6c  key_slots[idx].l
63c0: 61 62 65 6c 29 3b 0a 0a 09 09 09 63 61 63 6b 65  abel);.....cacke
63d0: 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 6c 61 62  y_slots[idx].lab
63e0: 65 6c 20 3d 20 4e 55 4c 4c 3b 0a 09 09 7d 0a 0a  el = NULL;...}..
63f0: 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69  ..cackey_slots[i
6400: 64 78 5d 2e 70 63 73 63 5f 63 61 72 64 5f 63 6f  dx].pcsc_card_co
6410: 6e 6e 65 63 74 65 64 20 3d 20 30 3b 0a 09 09 63  nnected = 0;...c
6420: 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d  ackey_slots[idx]
6430: 2e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70  .transaction_dep
6440: 74 68 20 3d 20 30 3b 0a 09 09 63 61 63 6b 65 79  th = 0;...cackey
6450: 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 74 72 61 6e  _slots[idx].tran
6460: 73 61 63 74 69 6f 6e 5f 6e 65 65 64 5f 68 77 5f  saction_need_hw_
6470: 6c 6f 63 6b 20 3d 20 30 3b 0a 0a 09 09 69 66 20  lock = 0;....if 
6480: 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64  (cackey_slots[id
6490: 78 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 09  x].active) {....
64a0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
64b0: 4e 54 46 28 22 4d 61 72 6b 69 6e 67 20 61 63 74  NTF("Marking act
64c0: 69 76 65 20 73 6c 6f 74 20 25 6c 75 20 61 73 20  ive slot %lu as 
64d0: 62 65 69 6e 67 20 72 65 73 65 74 22 2c 20 28 75  being reset", (u
64e0: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 69 64  nsigned long) id
64f0: 78 29 3b 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65  x);...}....cacke
6500: 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 73 6c 6f  y_slots[idx].slo
6510: 74 5f 72 65 73 65 74 20 3d 20 31 3b 0a 09 7d 0a  t_reset = 1;..}.
6520: 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
6530: 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
6540: 22 29 3b 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a  ");...return;.}.
6550: 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a  ./*. * SYNPOSIS.
6560: 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 72 65   *     cackey_re
6570: 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 63 6f  t cackey_pcsc_co
6580: 6e 6e 65 63 74 28 76 6f 69 64 29 3b 0a 20 2a 0a  nnect(void);. *.
6590: 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20   * ARGUMENTS. * 
65a0: 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 52      None. *. * R
65b0: 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20  ETURN VALUE. *  
65c0: 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53     CACKEY_PCSC_S
65d0: 5f 4f 4b 20 20 20 20 20 20 20 20 20 4f 6e 20 73  _OK         On s
65e0: 75 63 63 65 73 73 0a 20 2a 20 20 20 20 20 43 41  uccess. *     CA
65f0: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45  CKEY_PCSC_E_GENE
6600: 52 49 43 20 20 20 20 4f 6e 20 65 72 72 6f 72 0a  RIC    On error.
6610: 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20   *. * NOTES. *  
6620: 20 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e     This function
6630: 20 63 6f 6e 6e 65 63 74 73 20 74 6f 20 74 68 65   connects to the
6640: 20 50 43 2f 53 43 20 43 6f 6e 6e 65 63 74 69 6f   PC/SC Connectio
6650: 6e 20 4d 61 6e 61 67 65 72 20 61 6e 64 20 75 70  n Manager and up
6660: 64 61 74 65 73 20 74 68 65 0a 20 2a 20 20 20 20  dates the. *    
6670: 20 67 6c 6f 62 61 6c 20 68 61 6e 64 6c 65 2e 0a   global handle..
6680: 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 61   *. */.static ca
6690: 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f  ckey_ret cackey_
66a0: 70 63 73 63 5f 63 6f 6e 6e 65 63 74 28 76 6f 69  pcsc_connect(voi
66b0: 64 29 20 7b 0a 09 4c 4f 4e 47 20 73 63 61 72 64  d) {..LONG scard
66c0: 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74  _est_context_ret
66d0: 3b 0a 23 69 66 64 65 66 20 48 41 56 45 5f 53 43  ;.#ifdef HAVE_SC
66e0: 41 52 44 49 53 56 41 4c 49 44 43 4f 4e 54 45 58  ARDISVALIDCONTEX
66f0: 54 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f 69 73  T..LONG scard_is
6700: 76 61 6c 69 64 5f 72 65 74 3b 0a 23 65 6e 64 69  valid_ret;.#endi
6710: 66 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  f...CACKEY_DEBUG
6720: 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
6730: 22 29 3b 0a 0a 09 69 66 20 28 63 61 63 6b 65 79  ");...if (cackey
6740: 5f 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d 3d 20  _pcsc_handle == 
6750: 4e 55 4c 4c 29 20 7b 0a 09 09 63 61 63 6b 65 79  NULL) {...cackey
6760: 5f 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d 20 6d  _pcsc_handle = m
6770: 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63 61  alloc(sizeof(*ca
6780: 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65  ckey_pcsc_handle
6790: 29 29 3b 0a 09 09 69 66 20 28 63 61 63 6b 65 79  ));...if (cackey
67a0: 5f 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d 3d 20  _pcsc_handle == 
67b0: 4e 55 4c 4c 29 20 7b 0a 09 09 09 43 41 43 4b 45  NULL) {....CACKE
67c0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
67d0: 43 61 6c 6c 20 74 6f 20 6d 61 6c 6c 6f 63 28 29  Call to malloc()
67e0: 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 69   failed, returni
67f0: 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b  ng in failure");
6800: 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  .....cackey_slot
6810: 73 5f 64 69 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c  s_disconnect_all
6820: 28 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43  ();.....return(C
6830: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e  ACKEY_PCSC_E_GEN
6840: 45 52 49 43 29 3b 0a 09 09 7d 0a 0a 09 09 43 41  ERIC);...}....CA
6850: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
6860: 46 28 22 53 43 61 72 64 45 73 74 61 62 6c 69 73  F("SCardEstablis
6870: 68 43 6f 6e 74 65 78 74 28 29 20 63 61 6c 6c 65  hContext() calle
6880: 64 22 29 3b 0a 09 09 73 63 61 72 64 5f 65 73 74  d");...scard_est
6890: 5f 63 6f 6e 74 65 78 74 5f 72 65 74 20 3d 20 53  _context_ret = S
68a0: 43 61 72 64 45 73 74 61 62 6c 69 73 68 43 6f 6e  CardEstablishCon
68b0: 74 65 78 74 28 53 43 41 52 44 5f 53 43 4f 50 45  text(SCARD_SCOPE
68c0: 5f 53 59 53 54 45 4d 2c 20 4e 55 4c 4c 2c 20 4e  _SYSTEM, NULL, N
68d0: 55 4c 4c 2c 20 63 61 63 6b 65 79 5f 70 63 73 63  ULL, cackey_pcsc
68e0: 5f 68 61 6e 64 6c 65 29 3b 0a 09 09 69 66 20 28  _handle);...if (
68f0: 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78  scard_est_contex
6900: 74 5f 72 65 74 20 21 3d 20 53 43 41 52 44 5f 53  t_ret != SCARD_S
6910: 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09 09 43  _SUCCESS) {....C
6920: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
6930: 54 46 28 22 43 61 6c 6c 20 74 6f 20 53 43 61 72  TF("Call to SCar
6940: 64 45 73 74 61 62 6c 69 73 68 43 6f 6e 74 65 78  dEstablishContex
6950: 74 20 66 61 69 6c 65 64 20 28 72 65 74 75 72 6e  t failed (return
6960: 65 64 20 25 73 2f 25 6c 69 29 2c 20 72 65 74 75  ed %s/%li), retu
6970: 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65  rning in failure
6980: 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ", CACKEY_DEBUG_
6990: 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f  FUNC_SCARDERR_TO
69a0: 5f 53 54 52 28 73 63 61 72 64 5f 65 73 74 5f 63  _STR(scard_est_c
69b0: 6f 6e 74 65 78 74 5f 72 65 74 29 2c 20 28 6c 6f  ontext_ret), (lo
69c0: 6e 67 29 20 73 63 61 72 64 5f 65 73 74 5f 63 6f  ng) scard_est_co
69d0: 6e 74 65 78 74 5f 72 65 74 29 3b 0a 0a 09 09 09  ntext_ret);.....
69e0: 66 72 65 65 28 63 61 63 6b 65 79 5f 70 63 73 63  free(cackey_pcsc
69f0: 5f 68 61 6e 64 6c 65 29 3b 0a 09 09 09 63 61 63  _handle);....cac
6a00: 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 20  key_pcsc_handle 
6a10: 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 63 61 63 6b  = NULL;.....cack
6a20: 65 79 5f 73 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e  ey_slots_disconn
6a30: 65 63 74 5f 61 6c 6c 28 29 3b 0a 0a 09 09 09 72  ect_all();.....r
6a40: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
6a50: 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 09  C_E_GENERIC);...
6a60: 7d 0a 09 7d 0a 0a 23 69 66 64 65 66 20 48 41 56  }..}..#ifdef HAV
6a70: 45 5f 53 43 41 52 44 49 53 56 41 4c 49 44 43 4f  E_SCARDISVALIDCO
6a80: 4e 54 45 58 54 0a 09 43 41 43 4b 45 59 5f 44 45  NTEXT..CACKEY_DE
6a90: 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43 61 72  BUG_PRINTF("SCar
6aa0: 64 49 73 56 61 6c 69 64 43 6f 6e 74 65 78 74 28  dIsValidContext(
6ab0: 29 20 63 61 6c 6c 65 64 22 29 3b 0a 09 73 63 61  ) called");..sca
6ac0: 72 64 5f 69 73 76 61 6c 69 64 5f 72 65 74 20 3d  rd_isvalid_ret =
6ad0: 20 53 43 61 72 64 49 73 56 61 6c 69 64 43 6f 6e   SCardIsValidCon
6ae0: 74 65 78 74 28 2a 63 61 63 6b 65 79 5f 70 63 73  text(*cackey_pcs
6af0: 63 5f 68 61 6e 64 6c 65 29 3b 0a 09 69 66 20 28  c_handle);..if (
6b00: 73 63 61 72 64 5f 69 73 76 61 6c 69 64 5f 72 65  scard_isvalid_re
6b10: 74 20 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 43  t != SCARD_S_SUC
6b20: 43 45 53 53 29 20 7b 0a 09 09 43 41 43 4b 45 59  CESS) {...CACKEY
6b30: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 48  _DEBUG_PRINTF("H
6b40: 61 6e 64 6c 65 20 68 61 73 20 62 65 63 6f 6d 65  andle has become
6b50: 20 69 6e 76 61 6c 69 64 20 28 53 43 61 72 64 49   invalid (SCardI
6b60: 73 56 61 6c 69 64 43 6f 6e 74 65 78 74 20 3d 20  sValidContext = 
6b70: 25 73 2f 25 6c 69 29 2c 20 74 72 79 69 6e 67 20  %s/%li), trying 
6b80: 74 6f 20 72 65 2d 65 73 74 61 62 6c 69 73 68 2e  to re-establish.
6b90: 2e 2e 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55  ..", CACKEY_DEBU
6ba0: 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f  G_FUNC_SCARDERR_
6bb0: 54 4f 5f 53 54 52 28 73 63 61 72 64 5f 69 73 76  TO_STR(scard_isv
6bc0: 61 6c 69 64 5f 72 65 74 29 2c 20 28 6c 6f 6e 67  alid_ret), (long
6bd0: 29 20 73 63 61 72 64 5f 69 73 76 61 6c 69 64 5f  ) scard_isvalid_
6be0: 72 65 74 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f  ret);....CACKEY_
6bf0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43  DEBUG_PRINTF("SC
6c00: 61 72 64 45 73 74 61 62 6c 69 73 68 43 6f 6e 74  ardEstablishCont
6c10: 65 78 74 28 29 20 63 61 6c 6c 65 64 22 29 3b 0a  ext() called");.
6c20: 09 09 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74  ..scard_est_cont
6c30: 65 78 74 5f 72 65 74 20 3d 20 53 43 61 72 64 45  ext_ret = SCardE
6c40: 73 74 61 62 6c 69 73 68 43 6f 6e 74 65 78 74 28  stablishContext(
6c50: 53 43 41 52 44 5f 53 43 4f 50 45 5f 53 59 53 54  SCARD_SCOPE_SYST
6c60: 45 4d 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20  EM, NULL, NULL, 
6c70: 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64  cackey_pcsc_hand
6c80: 6c 65 29 3b 0a 09 09 69 66 20 28 73 63 61 72 64  le);...if (scard
6c90: 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74  _est_context_ret
6ca0: 20 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43   != SCARD_S_SUCC
6cb0: 45 53 53 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  ESS) {....CACKEY
6cc0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
6cd0: 61 6c 6c 20 74 6f 20 53 43 61 72 64 45 73 74 61  all to SCardEsta
6ce0: 62 6c 69 73 68 43 6f 6e 74 65 78 74 20 66 61 69  blishContext fai
6cf0: 6c 65 64 20 28 72 65 74 75 72 6e 65 64 20 25 73  led (returned %s
6d00: 2f 25 6c 69 29 2c 20 72 65 74 75 72 6e 69 6e 67  /%li), returning
6d10: 20 69 6e 20 66 61 69 6c 75 72 65 22 2c 20 43 41   in failure", CA
6d20: 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
6d30: 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28  SCARDERR_TO_STR(
6d40: 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78  scard_est_contex
6d50: 74 5f 72 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73  t_ret), (long) s
6d60: 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74  card_est_context
6d70: 5f 72 65 74 29 3b 0a 0a 09 09 09 66 72 65 65 28  _ret);.....free(
6d80: 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64  cackey_pcsc_hand
6d90: 6c 65 29 3b 0a 09 09 09 63 61 63 6b 65 79 5f 70  le);....cackey_p
6da0: 63 73 63 5f 68 61 6e 64 6c 65 20 3d 20 4e 55 4c  csc_handle = NUL
6db0: 4c 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c  L;.....cackey_sl
6dc0: 6f 74 73 5f 64 69 73 63 6f 6e 6e 65 63 74 5f 61  ots_disconnect_a
6dd0: 6c 6c 28 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e  ll();.....return
6de0: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47  (CACKEY_PCSC_E_G
6df0: 45 4e 45 52 49 43 29 3b 0a 09 09 7d 0a 0a 09 09  ENERIC);...}....
6e00: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
6e10: 4e 54 46 28 22 48 61 6e 64 6c 65 20 68 61 73 20  NTF("Handle has 
6e20: 62 65 65 6e 20 72 65 2d 65 73 74 61 62 6c 69 73  been re-establis
6e30: 68 65 64 22 29 3b 0a 09 7d 0a 23 65 6e 64 69 66  hed");..}.#endif
6e40: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
6e50: 50 52 49 4e 54 46 28 22 53 75 63 65 73 73 66 75  PRINTF("Sucessfu
6e60: 6c 6c 79 20 63 6f 6e 6e 65 63 74 65 64 20 74 6f  lly connected to
6e70: 20 50 43 2f 53 43 2c 20 72 65 74 75 72 6e 69 6e   PC/SC, returnin
6e80: 67 20 69 6e 20 73 75 63 63 65 73 73 22 29 3b 0a  g in success");.
6e90: 0a 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
6ea0: 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f  PCSC_S_OK);.}../
6eb0: 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a  *. * SYNPOSIS. *
6ec0: 20 20 20 20 20 63 61 63 6b 65 79 5f 72 65 74 20       cackey_ret 
6ed0: 63 61 63 6b 65 79 5f 70 63 73 63 5f 64 69 73 63  cackey_pcsc_disc
6ee0: 6f 6e 6e 65 63 74 28 76 6f 69 64 29 3b 0a 20 2a  onnect(void);. *
6ef0: 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a  . * ARGUMENTS. *
6f00: 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 20       None. *. * 
6f10: 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20  RETURN VALUE. * 
6f20: 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f      CACKEY_PCSC_
6f30: 53 5f 4f 4b 20 20 20 20 20 20 20 20 20 4f 6e 20  S_OK         On 
6f40: 73 75 63 63 65 73 73 0a 20 2a 20 20 20 20 20 43  success. *     C
6f50: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e  ACKEY_PCSC_E_GEN
6f60: 45 52 49 43 20 20 20 20 4f 6e 20 65 72 72 6f 72  ERIC    On error
6f70: 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20  . *. * NOTES. * 
6f80: 20 20 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f      This functio
6f90: 6e 20 64 69 73 63 6f 6e 6e 65 63 74 73 20 66 72  n disconnects fr
6fa0: 6f 6d 20 74 68 65 20 50 43 2f 53 43 20 43 6f 6e  om the PC/SC Con
6fb0: 6e 65 63 74 69 6f 6e 20 6d 61 6e 61 67 65 72 20  nection manager 
6fc0: 61 6e 64 20 75 70 64 61 74 65 73 0a 20 2a 20 20  and updates. *  
6fd0: 20 20 20 74 68 65 20 67 6c 6f 62 61 6c 20 68 61     the global ha
6fe0: 6e 64 6c 65 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61  ndle.. *. */.sta
6ff0: 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74 20 63  tic cackey_ret c
7000: 61 63 6b 65 79 5f 70 63 73 63 5f 64 69 73 63 6f  ackey_pcsc_disco
7010: 6e 6e 65 63 74 28 76 6f 69 64 29 20 7b 0a 09 4c  nnect(void) {..L
7020: 4f 4e 47 20 73 63 61 72 64 5f 72 65 6c 5f 63 6f  ONG scard_rel_co
7030: 6e 74 65 78 74 5f 72 65 74 3b 0a 0a 09 43 41 43  ntext_ret;...CAC
7040: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
7050: 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
7060: 66 20 28 63 61 63 6b 65 79 5f 70 63 73 63 5f 68  f (cackey_pcsc_h
7070: 61 6e 64 6c 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b  andle == NULL) {
7080: 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
7090: 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 09 7d 0a  _PCSC_S_OK);..}.
70a0: 0a 09 73 63 61 72 64 5f 72 65 6c 5f 63 6f 6e 74  ..scard_rel_cont
70b0: 65 78 74 5f 72 65 74 20 3d 20 53 43 61 72 64 52  ext_ret = SCardR
70c0: 65 6c 65 61 73 65 43 6f 6e 74 65 78 74 28 2a 63  eleaseContext(*c
70d0: 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c  ackey_pcsc_handl
70e0: 65 29 3b 0a 0a 09 69 66 20 28 63 61 63 6b 65 79  e);...if (cackey
70f0: 5f 70 63 73 63 5f 68 61 6e 64 6c 65 29 20 7b 0a  _pcsc_handle) {.
7100: 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f 70 63  ..free(cackey_pc
7110: 73 63 5f 68 61 6e 64 6c 65 29 3b 0a 09 0a 09 09  sc_handle);.....
7120: 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64  cackey_pcsc_hand
7130: 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 0a 09  le = NULL;..}...
7140: 69 66 20 28 73 63 61 72 64 5f 72 65 6c 5f 63 6f  if (scard_rel_co
7150: 6e 74 65 78 74 5f 72 65 74 20 21 3d 20 53 43 41  ntext_ret != SCA
7160: 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a  RD_S_SUCCESS) {.
7170: 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
7180: 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b  PCSC_E_GENERIC);
7190: 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 43 41 43  ..}...return(CAC
71a0: 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a  KEY_PCSC_S_OK);.
71b0: 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49  }../*. * SYNPOSI
71c0: 53 0a 20 2a 20 20 20 20 20 76 6f 69 64 20 63 61  S. *     void ca
71d0: 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72  ckey_mark_slot_r
71e0: 65 73 65 74 28 73 74 72 75 63 74 20 63 61 63 6b  eset(struct cack
71f0: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 3b 0a  ey_slot *slot);.
7200: 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a   *. * ARGUMENTS.
7210: 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20   *     None. *. 
7220: 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20  * RETURN VALUE. 
7230: 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a  *     None. *. *
7240: 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 54 68   NOTES. *     Th
7250: 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 72 6b  is function mark
7260: 73 20 61 20 73 6c 6f 74 20 68 61 73 20 68 61 76  s a slot has hav
7270: 69 6e 67 20 62 65 65 6e 20 72 65 73 65 74 2c 20  ing been reset, 
7280: 74 6f 20 6c 61 74 65 72 20 62 65 20 63 6c 65 61  to later be clea
7290: 6e 65 64 20 75 70 2e 0a 20 2a 20 20 20 20 20 43  ned up.. *     C
72a0: 6c 65 61 6e 75 70 20 6f 6e 6c 79 20 68 61 70 70  leanup only happ
72b0: 65 6e 73 20 77 68 65 6e 20 61 20 50 4b 43 53 23  ens when a PKCS#
72c0: 31 31 20 63 6c 69 65 6e 74 20 63 61 6c 6c 73 20  11 client calls 
72d0: 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73 49 6e 69  C_FindObjectsIni
72e0: 74 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63  t.. *. */.static
72f0: 20 76 6f 69 64 20 63 61 63 6b 65 79 5f 6d 61 72   void cackey_mar
7300: 6b 5f 73 6c 6f 74 5f 72 65 73 65 74 28 73 74 72  k_slot_reset(str
7310: 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20  uct cackey_slot 
7320: 2a 73 6c 6f 74 29 20 7b 0a 09 69 66 20 28 73 6c  *slot) {..if (sl
7330: 6f 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  ot == NULL) {...
7340: 72 65 74 75 72 6e 3b 0a 09 7d 0a 0a 09 43 41 43  return;..}...CAC
7350: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
7360: 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
7370: 66 20 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61  f (slot->pcsc_ca
7380: 72 64 5f 63 6f 6e 6e 65 63 74 65 64 29 20 7b 0a  rd_connected) {.
7390: 09 09 53 43 61 72 64 44 69 73 63 6f 6e 6e 65 63  ..SCardDisconnec
73a0: 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72  t(slot->pcsc_car
73b0: 64 2c 20 53 43 41 52 44 5f 4c 45 41 56 45 5f 43  d, SCARD_LEAVE_C
73c0: 41 52 44 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 2d  ARD);..}...slot-
73d0: 3e 73 6c 6f 74 5f 72 65 73 65 74 20 3d 20 31 3b  >slot_reset = 1;
73e0: 0a 09 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72  ..slot->pcsc_car
73f0: 64 5f 63 6f 6e 6e 65 63 74 65 64 20 3d 20 30 3b  d_connected = 0;
7400: 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 70 69 6e  ..if (cackey_pin
7410: 5f 63 6f 6d 6d 61 6e 64 20 3d 3d 20 4e 55 4c 4c  _command == NULL
7420: 29 20 7b 0a 09 09 73 6c 6f 74 2d 3e 74 6f 6b 65  ) {...slot->toke
7430: 6e 5f 66 6c 61 67 73 20 3d 20 43 4b 46 5f 4c 4f  n_flags = CKF_LO
7440: 47 49 4e 5f 52 45 51 55 49 52 45 44 3b 0a 09 7d  GIN_REQUIRED;..}
7450: 20 65 6c 73 65 20 7b 0a 09 09 73 6c 6f 74 2d 3e   else {...slot->
7460: 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 3d 20 30 3b  token_flags = 0;
7470: 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
7480: 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
7490: 6e 69 6e 67 2e 22 29 3b 0a 0a 09 72 65 74 75 72  ning.");...retur
74a0: 6e 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50  n;.}../*. * SYNP
74b0: 4f 53 49 53 0a 20 2a 20 20 20 20 20 4c 4f 4e 47  OSIS. *     LONG
74c0: 20 63 61 63 6b 65 79 5f 72 65 63 6f 6e 6e 65 63   cackey_reconnec
74d0: 74 5f 63 61 72 64 28 73 74 72 75 63 74 20 63 61  t_card(struct ca
74e0: 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c  ckey_slot *slot,
74f0: 20 44 57 4f 52 44 20 64 65 66 61 75 6c 74 5f 70   DWORD default_p
7500: 72 6f 74 6f 63 6f 6c 29 3b 0a 20 2a 0a 20 2a 20  rotocol);. *. * 
7510: 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20  ARGUMENTS. *    
7520: 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c   cackey_slot *sl
7530: 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20 53 6c  ot. *         Sl
7540: 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d 6d 61  ot to send comma
7550: 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 20 20 20  nds to. *. *    
7560: 20 44 57 4f 52 44 20 64 65 66 61 75 6c 74 5f 70   DWORD default_p
7570: 72 6f 74 6f 63 6f 6c 0a 20 2a 20 20 20 20 20 20  rotocol. *      
7580: 20 20 20 50 72 6f 74 6f 63 6f 6c 20 74 6f 20 61     Protocol to a
7590: 74 74 65 6d 70 74 20 66 69 72 73 74 0a 20 2a 0a  ttempt first. *.
75a0: 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a   * RETURN VALUE.
75b0: 20 2a 20 20 20 20 20 54 68 65 20 72 65 74 75 72   *     The retur
75c0: 6e 20 76 61 6c 75 65 20 66 72 6f 6d 20 53 43 61  n value from SCa
75d0: 72 64 52 65 63 6f 6e 6e 65 63 74 28 29 0a 20 2a  rdReconnect(). *
75e0: 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20  . * NOTES. *    
75f0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
7600: 73 20 61 20 77 72 61 70 70 65 72 20 61 72 6f 75  s a wrapper arou
7610: 6e 64 20 53 43 61 72 64 52 65 63 6f 6e 6e 65 63  nd SCardReconnec
7620: 74 28 29 0a 20 2a 0a 20 2a 20 20 20 20 20 54 68  t(). *. *     Th
7630: 65 20 53 43 61 72 64 52 65 63 6f 6e 6e 65 63 74  e SCardReconnect
7640: 28 29 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c  () function call
7650: 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20   will be called 
7660: 66 69 72 73 74 20 77 69 74 68 20 74 68 65 0a 20  first with the. 
7670: 2a 20 20 20 20 20 64 77 50 72 65 66 65 72 72 65  *     dwPreferre
7680: 64 50 72 6f 74 6f 63 6f 6c 73 20 6f 66 20 22 64  dProtocols of "d
7690: 65 66 61 75 6c 74 5f 70 72 6f 74 6f 63 6f 6c 22  efault_protocol"
76a0: 2e 20 20 49 66 20 74 68 61 74 20 63 61 6c 6c 20  .  If that call 
76b0: 72 65 74 75 72 6e 73 0a 20 2a 20 20 20 20 20 53  returns. *     S
76c0: 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53  CARD_E_PROTO_MIS
76d0: 4d 41 54 43 48 20 74 72 79 20 61 67 61 69 6e 20  MATCH try again 
76e0: 77 69 74 68 20 61 20 70 72 6f 74 6f 63 6f 6c 20  with a protocol 
76f0: 6f 66 20 54 3d 30 2c 20 61 6e 64 20 66 61 69 6c  of T=0, and fail
7700: 69 6e 67 0a 20 2a 20 20 20 20 20 74 68 61 74 20  ing. *     that 
7710: 54 3d 31 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74  T=1.. *. */.stat
7720: 69 63 20 4c 4f 4e 47 20 63 61 63 6b 65 79 5f 72  ic LONG cackey_r
7730: 65 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73 74  econnect_card(st
7740: 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74  ruct cackey_slot
7750: 20 2a 73 6c 6f 74 2c 20 44 57 4f 52 44 20 64 65   *slot, DWORD de
7760: 66 61 75 6c 74 5f 70 72 6f 74 6f 63 6f 6c 29 20  fault_protocol) 
7770: 7b 0a 09 44 57 4f 52 44 20 73 65 6c 65 63 74 65  {..DWORD selecte
7780: 64 5f 70 72 6f 74 6f 63 6f 6c 3b 0a 09 4c 4f 4e  d_protocol;..LON
7790: 47 20 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74  G scard_conn_ret
77a0: 3b 0a 0a 09 73 65 6c 65 63 74 65 64 5f 70 72 6f  ;...selected_pro
77b0: 74 6f 63 6f 6c 20 3d 20 30 3b 0a 0a 09 73 63 61  tocol = 0;...sca
77c0: 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 53 43  rd_conn_ret = SC
77d0: 61 72 64 52 65 63 6f 6e 6e 65 63 74 28 73 6c 6f  ardReconnect(slo
77e0: 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 53 43  t->pcsc_card, SC
77f0: 41 52 44 5f 53 48 41 52 45 5f 53 48 41 52 45 44  ARD_SHARE_SHARED
7800: 2c 20 64 65 66 61 75 6c 74 5f 70 72 6f 74 6f 63  , default_protoc
7810: 6f 6c 2c 20 53 43 41 52 44 5f 52 45 53 45 54 5f  ol, SCARD_RESET_
7820: 43 41 52 44 2c 20 26 73 65 6c 65 63 74 65 64 5f  CARD, &selected_
7830: 70 72 6f 74 6f 63 6f 6c 29 3b 0a 0a 09 69 66 20  protocol);...if 
7840: 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20  (scard_conn_ret 
7850: 3d 3d 20 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f  == SCARD_E_PROTO
7860: 5f 4d 49 53 4d 41 54 43 48 29 20 7b 0a 09 09 43  _MISMATCH) {...C
7870: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
7880: 54 46 28 22 53 43 61 72 64 52 65 63 6f 6e 6e 65  TF("SCardReconne
7890: 63 74 28 29 20 72 65 74 75 72 6e 65 64 20 53 43  ct() returned SC
78a0: 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d  ARD_E_PROTO_MISM
78b0: 41 54 43 48 2c 20 74 72 79 69 6e 67 20 77 69 74  ATCH, trying wit
78c0: 68 20 6a 75 73 74 20 54 3d 30 22 29 0a 09 09 73  h just T=0")...s
78d0: 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20  card_conn_ret = 
78e0: 53 43 61 72 64 52 65 63 6f 6e 6e 65 63 74 28 73  SCardReconnect(s
78f0: 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20  lot->pcsc_card, 
7900: 53 43 41 52 44 5f 53 48 41 52 45 5f 53 48 41 52  SCARD_SHARE_SHAR
7910: 45 44 2c 20 53 43 41 52 44 5f 50 52 4f 54 4f 43  ED, SCARD_PROTOC
7920: 4f 4c 5f 54 30 2c 20 53 43 41 52 44 5f 52 45 53  OL_T0, SCARD_RES
7930: 45 54 5f 43 41 52 44 2c 20 26 73 65 6c 65 63 74  ET_CARD, &select
7940: 65 64 5f 70 72 6f 74 6f 63 6f 6c 29 3b 0a 0a 09  ed_protocol);...
7950: 09 69 66 20 28 73 63 61 72 64 5f 63 6f 6e 6e 5f  .if (scard_conn_
7960: 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 45 5f 50  ret == SCARD_E_P
7970: 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 29 20 7b  ROTO_MISMATCH) {
7980: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
7990: 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64 52 65  _PRINTF("SCardRe
79a0: 63 6f 6e 6e 65 63 74 28 29 20 72 65 74 75 72 6e  connect() return
79b0: 65 64 20 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f  ed SCARD_E_PROTO
79c0: 5f 4d 49 53 4d 41 54 43 48 2c 20 74 72 79 69 6e  _MISMATCH, tryin
79d0: 67 20 77 69 74 68 20 6a 75 73 74 20 54 3d 31 22  g with just T=1"
79e0: 29 0a 09 09 09 73 63 61 72 64 5f 63 6f 6e 6e 5f  )....scard_conn_
79f0: 72 65 74 20 3d 20 53 43 61 72 64 52 65 63 6f 6e  ret = SCardRecon
7a00: 6e 65 63 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f  nect(slot->pcsc_
7a10: 63 61 72 64 2c 20 53 43 41 52 44 5f 53 48 41 52  card, SCARD_SHAR
7a20: 45 5f 53 48 41 52 45 44 2c 20 53 43 41 52 44 5f  E_SHARED, SCARD_
7a30: 50 52 4f 54 4f 43 4f 4c 5f 54 31 2c 20 53 43 41  PROTOCOL_T1, SCA
7a40: 52 44 5f 52 45 53 45 54 5f 43 41 52 44 2c 20 26  RD_RESET_CARD, &
7a50: 73 65 6c 65 63 74 65 64 5f 70 72 6f 74 6f 63 6f  selected_protoco
7a60: 6c 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20  l);...}..}...if 
7a70: 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20  (scard_conn_ret 
7a80: 3d 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45  == SCARD_S_SUCCE
7a90: 53 53 29 20 7b 0a 09 09 73 6c 6f 74 2d 3e 70 72  SS) {...slot->pr
7aa0: 6f 74 6f 63 6f 6c 20 3d 20 73 65 6c 65 63 74 65  otocol = selecte
7ab0: 64 5f 70 72 6f 74 6f 63 6f 6c 3b 0a 09 7d 0a 0a  d_protocol;..}..
7ac0: 09 72 65 74 75 72 6e 28 73 63 61 72 64 5f 63 6f  .return(scard_co
7ad0: 6e 6e 5f 72 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 20  nn_ret);.}../*. 
7ae0: 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20  * SYNPOSIS. *   
7af0: 20 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63    cackey_ret cac
7b00: 6b 65 79 5f 63 6f 6e 6e 65 63 74 5f 63 61 72 64  key_connect_card
7b10: 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73  (struct cackey_s
7b20: 6c 6f 74 20 2a 73 6c 6f 74 29 3b 0a 20 2a 0a 20  lot *slot);. *. 
7b30: 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20  * ARGUMENTS. *  
7b40: 20 20 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a     cackey_slot *
7b50: 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20  slot. *         
7b60: 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d  Slot to send com
7b70: 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 52  mands to. *. * R
7b80: 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20  ETURN VALUE. *  
7b90: 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53     CACKEY_PCSC_S
7ba0: 5f 4f 4b 20 20 20 20 20 20 20 20 20 4f 6e 20 73  _OK         On s
7bb0: 75 63 63 65 73 73 0a 20 2a 20 20 20 20 20 43 41  uccess. *     CA
7bc0: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45  CKEY_PCSC_E_GENE
7bd0: 52 49 43 20 20 20 20 4f 6e 20 65 72 72 6f 72 0a  RIC    On error.
7be0: 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20   *. * NOTES. *  
7bf0: 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 2f 0a 73     None. *. */.s
7c00: 74 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74  tatic cackey_ret
7c10: 20 63 61 63 6b 65 79 5f 63 6f 6e 6e 65 63 74 5f   cackey_connect_
7c20: 63 61 72 64 28 73 74 72 75 63 74 20 63 61 63 6b  card(struct cack
7c30: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 20 7b  ey_slot *slot) {
7c40: 0a 09 63 61 63 6b 65 79 5f 72 65 74 20 70 63 73  ..cackey_ret pcs
7c50: 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 3b 0a 09  c_connect_ret;..
7c60: 44 57 4f 52 44 20 70 72 6f 74 6f 63 6f 6c 3b 0a  DWORD protocol;.
7c70: 09 4c 4f 4e 47 20 73 63 61 72 64 5f 63 6f 6e 6e  .LONG scard_conn
7c80: 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  _ret;...CACKEY_D
7c90: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
7ca0: 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 73  led.");...if (!s
7cb0: 6c 6f 74 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  lot) {...CACKEY_
7cc0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 49 6e  DEBUG_PRINTF("In
7cd0: 76 61 6c 69 64 20 73 6c 6f 74 20 73 70 65 63 69  valid slot speci
7ce0: 66 69 65 64 2c 20 72 65 74 75 72 6e 69 6e 67 20  fied, returning 
7cf0: 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09  in failure");...
7d00: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
7d10: 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a  CSC_E_GENERIC);.
7d20: 09 7d 0a 0a 09 70 63 73 63 5f 63 6f 6e 6e 65 63  .}...pcsc_connec
7d30: 74 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 70  t_ret = cackey_p
7d40: 63 73 63 5f 63 6f 6e 6e 65 63 74 28 29 3b 0a 09  csc_connect();..
7d50: 69 66 20 28 70 63 73 63 5f 63 6f 6e 6e 65 63 74  if (pcsc_connect
7d60: 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50  _ret != CACKEY_P
7d70: 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41  CSC_S_OK) {...CA
7d80: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
7d90: 46 28 22 43 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f  F("Connection to
7da0: 20 50 43 2f 53 43 20 66 61 69 6c 65 64 2c 20 72   PC/SC failed, r
7db0: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
7dc0: 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ure");....return
7dd0: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47  (CACKEY_PCSC_E_G
7de0: 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 2f 2a  ENERIC);..}.../*
7df0: 20 43 6f 6e 6e 65 63 74 20 74 6f 20 72 65 61 64   Connect to read
7e00: 65 72 2c 20 69 66 20 6e 65 65 64 65 64 20 2a 2f  er, if needed */
7e10: 0a 09 69 66 20 28 21 73 6c 6f 74 2d 3e 70 63 73  ..if (!slot->pcs
7e20: 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64  c_card_connected
7e30: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
7e40: 55 47 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64  UG_PRINTF("SCard
7e50: 43 6f 6e 6e 65 63 74 28 25 73 29 20 63 61 6c 6c  Connect(%s) call
7e60: 65 64 20 66 6f 72 20 73 6c 6f 74 20 25 70 22 2c  ed for slot %p",
7e70: 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64   slot->pcsc_read
7e80: 65 72 2c 20 73 6c 6f 74 29 3b 0a 09 09 73 63 61  er, slot);...sca
7e90: 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 53 43  rd_conn_ret = SC
7ea0: 61 72 64 43 6f 6e 6e 65 63 74 28 2a 63 61 63 6b  ardConnect(*cack
7eb0: 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20  ey_pcsc_handle, 
7ec0: 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64 65  slot->pcsc_reade
7ed0: 72 2c 20 53 43 41 52 44 5f 53 48 41 52 45 5f 53  r, SCARD_SHARE_S
7ee0: 48 41 52 45 44 2c 20 53 43 41 52 44 5f 50 52 4f  HARED, SCARD_PRO
7ef0: 54 4f 43 4f 4c 5f 54 30 20 7c 20 53 43 41 52 44  TOCOL_T0 | SCARD
7f00: 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31 2c 20 26 73  _PROTOCOL_T1, &s
7f10: 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20  lot->pcsc_card, 
7f20: 26 70 72 6f 74 6f 63 6f 6c 29 3b 0a 0a 09 09 69  &protocol);....i
7f30: 66 20 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65  f (scard_conn_re
7f40: 74 20 3d 3d 20 53 43 41 52 44 5f 45 5f 50 52 4f  t == SCARD_E_PRO
7f50: 54 4f 5f 4d 49 53 4d 41 54 43 48 29 20 7b 0a 09  TO_MISMATCH) {..
7f60: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
7f70: 52 49 4e 54 46 28 22 53 43 61 72 64 43 6f 6e 6e  RINTF("SCardConn
7f80: 65 63 74 28 29 20 72 65 74 75 72 6e 65 64 20 53  ect() returned S
7f90: 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53  CARD_E_PROTO_MIS
7fa0: 4d 41 54 43 48 2c 20 74 72 79 69 6e 67 20 77 69  MATCH, trying wi
7fb0: 74 68 20 6a 75 73 74 20 54 3d 30 22 29 0a 09 09  th just T=0")...
7fc0: 09 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20  .scard_conn_ret 
7fd0: 3d 20 53 43 61 72 64 43 6f 6e 6e 65 63 74 28 2a  = SCardConnect(*
7fe0: 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64  cackey_pcsc_hand
7ff0: 6c 65 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72  le, slot->pcsc_r
8000: 65 61 64 65 72 2c 20 53 43 41 52 44 5f 53 48 41  eader, SCARD_SHA
8010: 52 45 5f 53 48 41 52 45 44 2c 20 53 43 41 52 44  RE_SHARED, SCARD
8020: 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 2c 20 26 73  _PROTOCOL_T0, &s
8030: 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20  lot->pcsc_card, 
8040: 26 70 72 6f 74 6f 63 6f 6c 29 3b 0a 0a 09 09 09  &protocol);.....
8050: 69 66 20 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72  if (scard_conn_r
8060: 65 74 20 3d 3d 20 53 43 41 52 44 5f 45 5f 50 52  et == SCARD_E_PR
8070: 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 29 20 7b 0a  OTO_MISMATCH) {.
8080: 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
8090: 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64 43 6f  _PRINTF("SCardCo
80a0: 6e 6e 65 63 74 28 29 20 72 65 74 75 72 6e 65 64  nnect() returned
80b0: 20 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d   SCARD_E_PROTO_M
80c0: 49 53 4d 41 54 43 48 2c 20 74 72 79 69 6e 67 20  ISMATCH, trying 
80d0: 77 69 74 68 20 6a 75 73 74 20 54 3d 31 22 29 0a  with just T=1").
80e0: 09 09 09 09 73 63 61 72 64 5f 63 6f 6e 6e 5f 72  ....scard_conn_r
80f0: 65 74 20 3d 20 53 43 61 72 64 43 6f 6e 6e 65 63  et = SCardConnec
8100: 74 28 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f 68  t(*cackey_pcsc_h
8110: 61 6e 64 6c 65 2c 20 73 6c 6f 74 2d 3e 70 63 73  andle, slot->pcs
8120: 63 5f 72 65 61 64 65 72 2c 20 53 43 41 52 44 5f  c_reader, SCARD_
8130: 53 48 41 52 45 5f 53 48 41 52 45 44 2c 20 53 43  SHARE_SHARED, SC
8140: 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31 2c  ARD_PROTOCOL_T1,
8150: 20 26 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72   &slot->pcsc_car
8160: 64 2c 20 26 70 72 6f 74 6f 63 6f 6c 29 3b 0a 09  d, &protocol);..
8170: 09 09 7d 0a 09 09 7d 0a 0a 09 09 69 66 20 28 73  ..}...}....if (s
8180: 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 3d  card_conn_ret ==
8190: 20 53 43 41 52 44 5f 57 5f 55 4e 50 4f 57 45 52   SCARD_W_UNPOWER
81a0: 45 44 5f 43 41 52 44 29 20 7b 0a 09 09 09 43 41  ED_CARD) {....CA
81b0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
81c0: 46 28 22 53 43 61 72 64 43 6f 6e 6e 65 63 74 28  F("SCardConnect(
81d0: 29 20 72 65 74 75 72 6e 65 64 20 53 43 41 52 44  ) returned SCARD
81e0: 5f 57 5f 55 4e 50 4f 57 45 52 45 44 5f 43 41 52  _W_UNPOWERED_CAR
81f0: 44 2c 20 74 72 79 69 6e 67 20 74 6f 20 72 65 2d  D, trying to re-
8200: 63 6f 6e 6e 65 63 74 2e 2e 2e 22 29 3b 0a 0a 09  connect...");...
8210: 09 09 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74  ..scard_conn_ret
8220: 20 3d 20 53 43 61 72 64 43 6f 6e 6e 65 63 74 28   = SCardConnect(
8230: 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e  *cackey_pcsc_han
8240: 64 6c 65 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 5f  dle, slot->pcsc_
8250: 72 65 61 64 65 72 2c 20 53 43 41 52 44 5f 53 48  reader, SCARD_SH
8260: 41 52 45 5f 44 49 52 45 43 54 2c 20 53 43 41 52  ARE_DIRECT, SCAR
8270: 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 20 7c 20  D_PROTOCOL_T0 | 
8280: 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54  SCARD_PROTOCOL_T
8290: 31 2c 20 26 73 6c 6f 74 2d 3e 70 63 73 63 5f 63  1, &slot->pcsc_c
82a0: 61 72 64 2c 20 26 70 72 6f 74 6f 63 6f 6c 29 3b  ard, &protocol);
82b0: 0a 0a 09 09 09 69 66 20 28 73 63 61 72 64 5f 63  .....if (scard_c
82c0: 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53 43 41 52 44  onn_ret == SCARD
82d0: 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43  _E_PROTO_MISMATC
82e0: 48 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f  H) {.....CACKEY_
82f0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43  DEBUG_PRINTF("SC
8300: 61 72 64 43 6f 6e 6e 65 63 74 28 29 20 72 65 74  ardConnect() ret
8310: 75 72 6e 65 64 20 53 43 41 52 44 5f 45 5f 50 52  urned SCARD_E_PR
8320: 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 2c 20 74 72  OTO_MISMATCH, tr
8330: 79 69 6e 67 20 77 69 74 68 20 6a 75 73 74 20 54  ying with just T
8340: 3d 30 22 29 0a 09 09 09 09 73 63 61 72 64 5f 63  =0").....scard_c
8350: 6f 6e 6e 5f 72 65 74 20 3d 20 53 43 61 72 64 43  onn_ret = SCardC
8360: 6f 6e 6e 65 63 74 28 2a 63 61 63 6b 65 79 5f 70  onnect(*cackey_p
8370: 63 73 63 5f 68 61 6e 64 6c 65 2c 20 73 6c 6f 74  csc_handle, slot
8380: 2d 3e 70 63 73 63 5f 72 65 61 64 65 72 2c 20 53  ->pcsc_reader, S
8390: 43 41 52 44 5f 53 48 41 52 45 5f 53 48 41 52 45  CARD_SHARE_SHARE
83a0: 44 2c 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f  D, SCARD_PROTOCO
83b0: 4c 5f 54 30 2c 20 26 73 6c 6f 74 2d 3e 70 63 73  L_T0, &slot->pcs
83c0: 63 5f 63 61 72 64 2c 20 26 70 72 6f 74 6f 63 6f  c_card, &protoco
83d0: 6c 29 3b 0a 0a 09 09 09 09 69 66 20 28 73 63 61  l);......if (sca
83e0: 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53  rd_conn_ret == S
83f0: 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53  CARD_E_PROTO_MIS
8400: 4d 41 54 43 48 29 20 7b 0a 09 09 09 09 09 43 41  MATCH) {......CA
8410: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
8420: 46 28 22 53 43 61 72 64 43 6f 6e 6e 65 63 74 28  F("SCardConnect(
8430: 29 20 72 65 74 75 72 6e 65 64 20 53 43 41 52 44  ) returned SCARD
8440: 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43  _E_PROTO_MISMATC
8450: 48 2c 20 74 72 79 69 6e 67 20 77 69 74 68 20 6a  H, trying with j
8460: 75 73 74 20 54 3d 31 22 29 0a 09 09 09 09 09 73  ust T=1")......s
8470: 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20  card_conn_ret = 
8480: 53 43 61 72 64 43 6f 6e 6e 65 63 74 28 2a 63 61  SCardConnect(*ca
8490: 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65  ckey_pcsc_handle
84a0: 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61  , slot->pcsc_rea
84b0: 64 65 72 2c 20 53 43 41 52 44 5f 53 48 41 52 45  der, SCARD_SHARE
84c0: 5f 53 48 41 52 45 44 2c 20 53 43 41 52 44 5f 50  _SHARED, SCARD_P
84d0: 52 4f 54 4f 43 4f 4c 5f 54 31 2c 20 26 73 6c 6f  ROTOCOL_T1, &slo
84e0: 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 26 70  t->pcsc_card, &p
84f0: 72 6f 74 6f 63 6f 6c 29 3b 0a 09 09 09 09 7d 0a  rotocol);.....}.
8500: 09 09 09 7d 0a 0a 09 09 09 73 63 61 72 64 5f 63  ...}.....scard_c
8510: 6f 6e 6e 5f 72 65 74 20 3d 20 63 61 63 6b 65 79  onn_ret = cackey
8520: 5f 72 65 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28  _reconnect_card(
8530: 73 6c 6f 74 2c 20 70 72 6f 74 6f 63 6f 6c 29 3b  slot, protocol);
8540: 0a 09 09 7d 0a 0a 09 09 69 66 20 28 73 63 61 72  ...}....if (scar
8550: 64 5f 63 6f 6e 6e 5f 72 65 74 20 21 3d 20 53 43  d_conn_ret != SC
8560: 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b  ARD_S_SUCCESS) {
8570: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
8580: 5f 50 52 49 4e 54 46 28 22 43 6f 6e 6e 65 63 74  _PRINTF("Connect
8590: 69 6f 6e 20 74 6f 20 63 61 72 64 20 66 61 69 6c  ion to card fail
85a0: 65 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e  ed, returning in
85b0: 20 66 61 69 6c 75 72 65 20 28 53 43 61 72 64 43   failure (SCardC
85c0: 6f 6e 6e 65 63 74 28 29 20 3d 20 25 73 2f 25 6c  onnect() = %s/%l
85d0: 69 29 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55  i)", CACKEY_DEBU
85e0: 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f  G_FUNC_SCARDERR_
85f0: 54 4f 5f 53 54 52 28 73 63 61 72 64 5f 63 6f 6e  TO_STR(scard_con
8600: 6e 5f 72 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73  n_ret), (long) s
8610: 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 29 3b 0a  card_conn_ret);.
8620: 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ....return(CACKE
8630: 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43  Y_PCSC_E_GENERIC
8640: 29 3b 0a 09 09 7d 0a 0a 09 09 73 6c 6f 74 2d 3e  );...}....slot->
8650: 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63  pcsc_card_connec
8660: 74 65 64 20 3d 20 31 3b 0a 09 09 73 6c 6f 74 2d  ted = 1;...slot-
8670: 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70  >transaction_dep
8680: 74 68 20 3d 20 30 3b 0a 09 09 73 6c 6f 74 2d 3e  th = 0;...slot->
8690: 74 72 61 6e 73 61 63 74 69 6f 6e 5f 6e 65 65 64  transaction_need
86a0: 5f 68 77 5f 6c 6f 63 6b 20 3d 20 30 3b 0a 09 09  _hw_lock = 0;...
86b0: 73 6c 6f 74 2d 3e 70 72 6f 74 6f 63 6f 6c 20 3d  slot->protocol =
86c0: 20 70 72 6f 74 6f 63 6f 6c 3b 0a 09 7d 0a 0a 09   protocol;..}...
86d0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
86e0: 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 69  NTF("Returning i
86f0: 6e 20 73 75 63 63 65 73 73 22 29 3b 0a 0a 09 72  n success");...r
8700: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
8710: 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20  C_S_OK);.}../*. 
8720: 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20  * SYNPOSIS. *   
8730: 20 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63    cackey_ret cac
8740: 6b 65 79 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61  key_begin_transa
8750: 63 74 69 6f 6e 28 73 74 72 75 63 74 20 63 61 63  ction(struct cac
8760: 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 3b  key_slot *slot);
8770: 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53  . *. * ARGUMENTS
8780: 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 73  . *     cackey_s
8790: 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20  lot *slot. *    
87a0: 20 20 20 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e       Slot to sen
87b0: 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a  d commands to. *
87c0: 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45  . * RETURN VALUE
87d0: 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50  . *     CACKEY_P
87e0: 43 53 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20  CSC_S_OK        
87f0: 20 4f 6e 20 73 75 63 63 65 73 73 0a 20 2a 20 20   On success. *  
8800: 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45     CACKEY_PCSC_E
8810: 5f 47 45 4e 45 52 49 43 20 20 20 20 4f 6e 20 65  _GENERIC    On e
8820: 72 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53  rror. *. * NOTES
8830: 0a 20 2a 20 20 20 20 20 54 68 65 20 74 72 61 6e  . *     The tran
8840: 73 61 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62  saction should b
8850: 65 20 74 65 72 6d 69 6e 61 74 65 64 20 75 73 69  e terminated usi
8860: 6e 67 20 22 63 61 63 6b 65 79 5f 65 6e 64 5f 74  ng "cackey_end_t
8870: 72 61 6e 73 61 63 74 69 6f 6e 22 0a 20 2a 0a 20  ransaction". *. 
8880: 2a 2f 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79  */.static cackey
8890: 5f 72 65 74 20 63 61 63 6b 65 79 5f 62 65 67 69  _ret cackey_begi
88a0: 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 74  n_transaction(st
88b0: 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74  ruct cackey_slot
88c0: 20 2a 73 6c 6f 74 29 20 7b 0a 09 63 61 63 6b 65   *slot) {..cacke
88d0: 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 63 6f 6e  y_ret cackey_con
88e0: 6e 5f 72 65 74 3b 0a 09 4c 4f 4e 47 20 73 63 61  n_ret;..LONG sca
88f0: 72 64 5f 74 72 61 6e 73 5f 72 65 74 3b 0a 0a 09  rd_trans_ret;...
8900: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
8910: 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
8920: 0a 09 63 61 63 6b 65 79 5f 63 6f 6e 6e 5f 72 65  ..cackey_conn_re
8930: 74 20 3d 20 63 61 63 6b 65 79 5f 63 6f 6e 6e 65  t = cackey_conne
8940: 63 74 5f 63 61 72 64 28 73 6c 6f 74 29 3b 0a 09  ct_card(slot);..
8950: 69 66 20 28 63 61 63 6b 65 79 5f 63 6f 6e 6e 5f  if (cackey_conn_
8960: 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43  ret != CACKEY_PC
8970: 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43  SC_S_OK) {...CAC
8980: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
8990: 28 22 55 6e 61 62 6c 65 20 74 6f 20 63 6f 6e 6e  ("Unable to conn
89a0: 65 63 74 20 74 6f 20 63 61 72 64 2c 20 72 65 74  ect to card, ret
89b0: 75 72 6e 69 6e 67 20 69 6e 20 65 72 72 6f 72 22  urning in error"
89c0: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43  );....return(CAC
89d0: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52  KEY_PCSC_E_GENER
89e0: 49 43 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 2d 3e  IC);..}...slot->
89f0: 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74  transaction_dept
8a00: 68 2b 2b 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 2d  h++;...if (slot-
8a10: 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70  >transaction_dep
8a20: 74 68 20 3e 20 31 20 26 26 20 21 73 6c 6f 74 2d  th > 1 && !slot-
8a30: 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 6e 65 65  >transaction_nee
8a40: 64 5f 68 77 5f 6c 6f 63 6b 29 20 7b 0a 09 09 43  d_hw_lock) {...C
8a50: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
8a60: 54 46 28 22 41 6c 72 65 61 64 79 20 69 6e 20 61  TF("Already in a
8a70: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 70 65   transaction, pe
8a80: 72 66 6f 72 6d 69 6e 67 20 6e 6f 20 61 63 74 69  rforming no acti
8a90: 6f 6e 20 28 6e 65 77 20 64 65 70 74 68 20 3d 20  on (new depth = 
8aa0: 25 69 29 22 2c 20 73 6c 6f 74 2d 3e 74 72 61 6e  %i)", slot->tran
8ab0: 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 29 3b 0a  saction_depth);.
8ac0: 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
8ad0: 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 09 7d 0a  _PCSC_S_OK);..}.
8ae0: 0a 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74  ..slot->transact
8af0: 69 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b  ion_need_hw_lock
8b00: 20 3d 20 30 3b 0a 0a 09 73 63 61 72 64 5f 74 72   = 0;...scard_tr
8b10: 61 6e 73 5f 72 65 74 20 3d 20 53 43 61 72 64 42  ans_ret = SCardB
8b20: 65 67 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 28  eginTransaction(
8b30: 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 29  slot->pcsc_card)
8b40: 3b 0a 09 69 66 20 28 73 63 61 72 64 5f 74 72 61  ;..if (scard_tra
8b50: 6e 73 5f 72 65 74 20 21 3d 20 53 43 41 52 44 5f  ns_ret != SCARD_
8b60: 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09 43  S_SUCCESS) {...C
8b70: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
8b80: 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 62 65  TF("Unable to be
8b90: 67 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  gin transaction,
8ba0: 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 65 72   returning in er
8bb0: 72 6f 72 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ror");....return
8bc0: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47  (CACKEY_PCSC_E_G
8bd0: 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 43 41  ENERIC);..}...CA
8be0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
8bf0: 46 28 22 53 75 63 65 73 73 66 75 6c 6c 79 20 62  F("Sucessfully b
8c00: 65 67 61 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e  egan transaction
8c10: 20 6f 6e 20 73 6c 6f 74 20 28 25 73 29 22 2c 20   on slot (%s)", 
8c20: 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64 65  slot->pcsc_reade
8c30: 72 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41 43  r);...return(CAC
8c40: 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a  KEY_PCSC_S_OK);.
8c50: 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49  }../*. * SYNPOSI
8c60: 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f  S. *     cackey_
8c70: 72 65 74 20 63 61 63 6b 65 79 5f 65 6e 64 5f 74  ret cackey_end_t
8c80: 72 61 6e 73 61 63 74 69 6f 6e 28 73 74 72 75 63  ransaction(struc
8c90: 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73  t cackey_slot *s
8ca0: 6c 6f 74 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55  lot);. *. * ARGU
8cb0: 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 63 61 63  MENTS. *     cac
8cc0: 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20  key_slot *slot. 
8cd0: 2a 20 20 20 20 20 20 20 20 20 53 6c 6f 74 20 74  *         Slot t
8ce0: 6f 20 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20  o send commands 
8cf0: 74 6f 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20  to. *. * RETURN 
8d00: 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 43 41 43  VALUE. *     CAC
8d10: 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20  KEY_PCSC_S_OK   
8d20: 20 20 20 20 20 20 4f 6e 20 73 75 63 63 65 73 73        On success
8d30: 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50  . *     CACKEY_P
8d40: 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 20 20 20  CSC_E_GENERIC   
8d50: 20 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a 20 2a 20   On error. *. * 
8d60: 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 54 68 69  NOTES. *     Thi
8d70: 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 71 75 69  s function requi
8d80: 72 65 73 20 22 63 61 63 6b 65 79 5f 62 65 67 69  res "cackey_begi
8d90: 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e 22 20 74  n_transaction" t
8da0: 6f 20 62 65 20 63 61 6c 6c 65 64 20 66 69 72 73  o be called firs
8db0: 74 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20  t. *. */.static 
8dc0: 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65  cackey_ret cacke
8dd0: 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  y_end_transactio
8de0: 6e 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  n(struct cackey_
8df0: 73 6c 6f 74 20 2a 73 6c 6f 74 29 20 7b 0a 09 4c  slot *slot) {..L
8e00: 4f 4e 47 20 73 63 61 72 64 5f 74 72 61 6e 73 5f  ONG scard_trans_
8e10: 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ret;...CACKEY_DE
8e20: 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
8e30: 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 73 6c  ed.");...if (!sl
8e40: 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f  ot->pcsc_card_co
8e50: 6e 6e 65 63 74 65 64 29 20 7b 0a 09 09 43 41 43  nnected) {...CAC
8e60: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
8e70: 28 22 43 61 72 64 20 69 73 20 6e 6f 74 20 63 6f  ("Card is not co
8e80: 6e 6e 65 63 74 65 64 2c 20 75 6e 61 62 6c 65 20  nnected, unable 
8e90: 74 6f 20 65 6e 64 20 74 72 61 6e 73 61 63 74 69  to end transacti
8ea0: 6f 6e 20 6f 6e 20 63 61 72 64 22 29 3b 0a 0a 09  on on card");...
8eb0: 09 69 66 20 28 73 6c 6f 74 2d 3e 74 72 61 6e 73  .if (slot->trans
8ec0: 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3e 20 30  action_depth > 0
8ed0: 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
8ee0: 42 55 47 5f 50 52 49 4e 54 46 28 22 44 65 63 72  BUG_PRINTF("Decr
8ef0: 65 61 73 69 6e 67 20 74 72 61 6e 73 61 63 74 69  easing transacti
8f00: 6f 6e 20 64 65 70 74 68 20 61 6e 64 20 61 73 6b  on depth and ask
8f10: 69 6e 67 20 66 6f 72 20 61 20 68 61 72 64 77 61  ing for a hardwa
8f20: 72 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6e  re lock on the n
8f30: 65 78 74 20 62 65 67 69 6e 20 74 72 61 6e 73 61  ext begin transa
8f40: 63 74 69 6f 6e 20 28 63 75 72 72 65 6e 74 20 64  ction (current d
8f50: 65 70 74 68 20 3d 20 25 69 29 22 2c 20 73 6c 6f  epth = %i)", slo
8f60: 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64  t->transaction_d
8f70: 65 70 74 68 29 3b 0a 0a 09 09 09 73 6c 6f 74 2d  epth);.....slot-
8f80: 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70  >transaction_dep
8f90: 74 68 2d 2d 3b 0a 0a 09 09 09 69 66 20 28 73 6c  th--;.....if (sl
8fa0: 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f  ot->transaction_
8fb0: 64 65 70 74 68 20 3e 20 30 29 20 7b 0a 09 09 09  depth > 0) {....
8fc0: 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69  .slot->transacti
8fd0: 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b 20  on_need_hw_lock 
8fe0: 3d 20 31 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09  = 1;....}...}...
8ff0: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
9000: 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a  CSC_E_GENERIC);.
9010: 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 2d 3e 74  .}...if (slot->t
9020: 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68  ransaction_depth
9030: 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   == 0) {...CACKE
9040: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
9050: 54 65 72 6d 69 6e 61 74 69 6e 67 20 61 20 74 72  Terminating a tr
9060: 61 6e 73 61 63 74 69 6f 6e 20 74 68 61 74 20 68  ansaction that h
9070: 61 73 20 6e 6f 74 20 62 65 67 75 6e 21 22 29 3b  as not begun!");
9080: 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ....return(CACKE
9090: 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43  Y_PCSC_E_GENERIC
90a0: 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 2d 3e 74 72  );..}...slot->tr
90b0: 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 2d  ansaction_depth-
90c0: 2d 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 2d 3e 74  -;...if (slot->t
90d0: 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68  ransaction_depth
90e0: 20 3e 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59   > 0) {...CACKEY
90f0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54  _DEBUG_PRINTF("T
9100: 72 61 6e 73 61 63 74 69 6f 6e 73 20 73 74 69 6c  ransactions stil
9110: 6c 20 69 6e 20 70 72 6f 67 72 65 73 73 2c 20 6e  l in progress, n
9120: 6f 74 20 74 65 72 6d 69 6e 61 74 69 6e 67 20 6f  ot terminating o
9130: 6e 2d 63 61 72 64 20 54 72 61 6e 73 61 63 74 69  n-card Transacti
9140: 6f 6e 20 28 63 75 72 72 65 6e 74 20 64 65 70 74  on (current dept
9150: 68 20 3d 20 25 69 29 22 2c 20 73 6c 6f 74 2d 3e  h = %i)", slot->
9160: 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74  transaction_dept
9170: 68 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41  h);....return(CA
9180: 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b  CKEY_PCSC_S_OK);
9190: 0a 09 7d 0a 0a 09 73 63 61 72 64 5f 74 72 61 6e  ..}...scard_tran
91a0: 73 5f 72 65 74 20 3d 20 53 43 61 72 64 45 6e 64  s_ret = SCardEnd
91b0: 54 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74  Transaction(slot
91c0: 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 53 43 41  ->pcsc_card, SCA
91d0: 52 44 5f 4c 45 41 56 45 5f 43 41 52 44 29 3b 0a  RD_LEAVE_CARD);.
91e0: 09 69 66 20 28 73 63 61 72 64 5f 74 72 61 6e 73  .if (scard_trans
91f0: 5f 72 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f  _ret != SCARD_S_
9200: 53 55 43 43 45 53 53 29 20 7b 0a 09 09 43 41 43  SUCCESS) {...CAC
9210: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
9220: 28 22 55 6e 61 62 6c 65 20 74 6f 20 65 6e 64 20  ("Unable to end 
9230: 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 72 65 74  transaction, ret
9240: 75 72 6e 69 6e 67 20 69 6e 20 65 72 72 6f 72 22  urning in error"
9250: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43  );....return(CAC
9260: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52  KEY_PCSC_E_GENER
9270: 49 43 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  IC);..}...CACKEY
9280: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53  _DEBUG_PRINTF("S
9290: 75 63 65 73 73 66 75 6c 6c 79 20 74 65 72 6d 69  ucessfully termi
92a0: 6e 61 74 65 64 20 74 72 61 6e 73 61 63 74 69 6f  nated transactio
92b0: 6e 20 6f 6e 20 73 6c 6f 74 20 28 25 73 29 22 2c  n on slot (%s)",
92c0: 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64   slot->pcsc_read
92d0: 65 72 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41  er);...return(CA
92e0: 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b  CKEY_PCSC_S_OK);
92f0: 0a 7d 0a 0a 2f 2a 20 41 50 44 55 20 52 65 6c 61  .}../* APDU Rela
9300: 74 65 64 20 46 75 6e 63 74 69 6f 6e 73 20 2a 2f  ted Functions */
9310: 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a  ./*. * SYNPOSIS.
9320: 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 72 65   *     cackey_re
9330: 74 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70  t cackey_send_ap
9340: 64 75 28 73 74 72 75 63 74 20 63 61 63 6b 65 79  du(struct cackey
9350: 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73  _slot *slot, uns
9360: 69 67 6e 65 64 20 63 68 61 72 20 63 6c 61 73 73  igned char class
9370: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
9380: 69 6e 73 74 72 75 63 74 69 6f 6e 2c 20 75 6e 73  instruction, uns
9390: 69 67 6e 65 64 20 63 68 61 72 20 70 31 2c 20 75  igned char p1, u
93a0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 70 32 2c  nsigned char p2,
93b0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6c   unsigned char l
93c0: 63 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  c, unsigned char
93d0: 20 2a 64 61 74 61 2c 20 75 6e 73 69 67 6e 65 64   *data, unsigned
93e0: 20 63 68 61 72 20 6c 65 2c 20 75 69 6e 74 31 36   char le, uint16
93f0: 5f 74 20 2a 72 65 73 70 63 6f 64 65 2c 20 75 6e  _t *respcode, un
9400: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 72 65 73  signed char *res
9410: 70 64 61 74 61 2c 20 73 69 7a 65 5f 74 20 2a 72  pdata, size_t *r
9420: 65 73 70 64 61 74 61 5f 6c 65 6e 29 3b 0a 20 2a  espdata_len);. *
9430: 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a  . * ARGUMENTS. *
9440: 20 20 20 20 20 63 61 63 6b 65 79 5f 73 6c 6f 74       cackey_slot
9450: 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20   *slot. *       
9460: 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63    Slot to send c
9470: 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a  ommands to. *. *
9480: 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68       unsigned ch
9490: 61 72 20 63 6c 61 73 73 0a 20 2a 20 20 20 20 20  ar class. *     
94a0: 20 20 20 20 41 50 44 55 20 43 6c 61 73 73 20 28      APDU Class (
94b0: 47 53 43 49 53 5f 43 4c 41 53 53 5f 49 53 4f 37  GSCIS_CLASS_ISO7
94c0: 38 31 36 20 6f 72 20 47 53 43 49 53 5f 43 4c 41  816 or GSCIS_CLA
94d0: 53 53 5f 47 4c 4f 42 41 4c 5f 50 4c 41 54 46 4f  SS_GLOBAL_PLATFO
94e0: 52 4d 0a 20 2a 20 20 20 20 20 20 20 20 20 75 73  RM. *         us
94f0: 75 61 6c 6c 79 29 2c 20 28 43 4c 41 29 0a 20 2a  ually), (CLA). *
9500: 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64  . *     unsigned
9510: 20 63 68 61 72 20 69 6e 73 74 72 75 63 74 69 6f   char instructio
9520: 6e 0a 20 2a 20 20 20 20 20 20 20 20 20 41 50 44  n. *         APD
9530: 55 20 49 6e 73 74 72 75 63 74 69 6f 6e 20 28 49  U Instruction (I
9540: 4e 53 29 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e  NS). *. *     un
9550: 73 69 67 6e 65 64 20 63 68 61 72 20 70 31 0a 20  signed char p1. 
9560: 2a 20 20 20 20 20 20 20 20 20 41 50 44 55 20 50  *         APDU P
9570: 61 72 61 6d 65 74 65 72 20 31 20 28 50 31 29 0a  arameter 1 (P1).
9580: 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e   *. *     unsign
9590: 65 64 20 63 68 61 72 20 70 32 0a 20 2a 20 20 20  ed char p2. *   
95a0: 20 20 20 20 20 20 41 50 44 55 20 50 61 72 61 6d        APDU Param
95b0: 65 74 65 72 20 32 20 28 50 32 29 0a 20 2a 0a 20  eter 2 (P2). *. 
95c0: 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63  *     unsigned c
95d0: 68 61 72 20 6c 63 0a 20 2a 20 20 20 20 20 20 20  har lc. *       
95e0: 20 20 41 50 44 55 20 4c 65 6e 67 74 68 20 6f 66    APDU Length of
95f0: 20 43 6f 6e 74 65 6e 74 20 28 4c 63 29 20 2d 2d   Content (Lc) --
9600: 20 74 68 69 73 20 69 73 20 74 68 65 20 6c 65 6e   this is the len
9610: 67 74 68 20 6f 66 20 22 64 61 74 61 22 0a 20 2a  gth of "data". *
9620: 20 20 20 20 20 20 20 20 20 70 61 72 61 6d 65 74           paramet
9630: 65 72 2e 20 20 49 66 20 22 64 61 74 61 22 20 69  er.  If "data" i
9640: 73 20 73 70 65 63 69 66 69 65 64 20 61 73 20 4e  s specified as N
9650: 55 4c 4c 2c 20 74 68 69 73 20 70 61 72 61 6d 65  ULL, this parame
9660: 74 65 72 20 77 69 6c 6c 0a 20 2a 20 20 20 20 20  ter will. *     
9670: 20 20 20 20 62 65 20 69 67 6e 6f 72 65 64 2e 0a      be ignored..
9680: 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e   *. *     unsign
9690: 65 64 20 63 68 61 72 20 2a 64 61 74 61 0a 20 2a  ed char *data. *
96a0: 20 20 20 20 20 20 20 20 20 50 6f 69 6e 74 65 72           Pointer
96b0: 20 74 6f 20 62 75 66 66 65 72 20 74 6f 20 73 65   to buffer to se
96c0: 6e 64 2e 20 20 49 74 20 73 68 6f 75 6c 64 20 62  nd.  It should b
96d0: 65 20 22 4c 63 22 20 62 79 74 65 73 20 6c 6f 6e  e "Lc" bytes lon
96e0: 67 2e 20 20 49 66 0a 20 2a 20 20 20 20 20 20 20  g.  If. *       
96f0: 20 20 73 70 65 63 69 66 69 65 64 20 61 73 20 4e    specified as N
9700: 55 4c 4c 2c 20 22 4c 63 22 20 77 69 6c 6c 20 6e  ULL, "Lc" will n
9710: 6f 74 20 62 65 20 73 65 6e 74 2c 20 61 6e 64 20  ot be sent, and 
9720: 74 68 69 73 20 62 75 66 66 65 72 20 77 69 6c 6c  this buffer will
9730: 20 62 65 0a 20 2a 20 20 20 20 20 20 20 20 20 69   be. *         i
9740: 67 6e 6f 72 65 64 2e 0a 20 2a 0a 20 2a 20 20 20  gnored.. *. *   
9750: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
9760: 6c 65 0a 20 2a 20 20 20 20 20 20 20 20 20 41 50  le. *         AP
9770: 44 55 20 4c 65 6e 67 74 68 20 6f 66 20 45 78 70  DU Length of Exp
9780: 65 63 74 61 74 69 6f 6e 20 28 4c 65 29 20 2d 2d  ectation (Le) --
9790: 20 74 68 69 73 20 69 73 20 74 68 65 20 6c 65 6e   this is the len
97a0: 67 74 68 20 6f 66 20 74 68 65 0a 20 2a 20 20 20  gth of the. *   
97b0: 20 20 20 20 20 20 65 78 70 65 63 74 65 64 20 72        expected r
97c0: 65 70 6c 79 2e 20 20 49 66 20 74 68 69 73 20 69  eply.  If this i
97d0: 73 20 73 70 65 63 69 66 69 65 64 20 61 73 20 30  s specified as 0
97e0: 20 74 68 65 6e 20 69 74 20 77 69 6c 6c 20 6e 6f   then it will no
97f0: 74 0a 20 2a 20 20 20 20 20 20 20 20 20 62 65 20  t. *         be 
9800: 73 65 6e 74 2e 0a 20 2a 0a 20 2a 20 20 20 20 20  sent.. *. *     
9810: 75 69 6e 74 31 36 5f 74 20 2a 72 65 73 70 63 6f  uint16_t *respco
9820: 64 65 0a 20 2a 20 20 20 20 20 20 20 20 20 5b 4f  de. *         [O
9830: 55 54 5d 20 50 6f 69 6e 74 65 72 20 74 6f 20 73  UT] Pointer to s
9840: 74 6f 72 61 67 65 20 6f 66 20 41 50 44 55 20 72  torage of APDU r
9850: 65 73 70 6f 6e 73 65 20 63 6f 64 65 2e 20 20 49  esponse code.  I
9860: 66 20 74 68 69 73 20 69 73 0a 20 2a 20 20 20 20  f this is. *    
9870: 20 20 20 20 20 73 70 65 63 69 66 69 65 64 20 61       specified a
9880: 73 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65 73 70  s NULL, the resp
9890: 6f 6e 73 65 20 63 6f 64 65 20 77 69 6c 6c 20 62  onse code will b
98a0: 65 20 64 69 73 63 61 72 64 65 64 2e 0a 20 2a 0a  e discarded.. *.
98b0: 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20   *     unsigned 
98c0: 63 68 61 72 20 2a 72 65 73 70 64 61 74 61 0a 20  char *respdata. 
98d0: 2a 20 20 20 20 20 20 20 20 20 5b 4f 55 54 5d 20  *         [OUT] 
98e0: 50 6f 69 6e 74 65 72 20 74 6f 20 73 74 6f 72 61  Pointer to stora
98f0: 67 65 20 6f 66 20 41 50 44 55 20 72 65 73 70 6f  ge of APDU respo
9900: 6e 73 65 20 64 61 74 61 2e 20 20 49 66 20 74 68  nse data.  If th
9910: 69 73 20 69 73 0a 20 2a 20 20 20 20 20 20 20 20  is is. *        
9920: 20 73 70 65 63 69 66 69 65 64 20 61 73 20 4e 55   specified as NU
9930: 4c 4c 2c 20 74 68 65 20 72 65 73 70 6f 6e 73 65  LL, the response
9940: 20 64 61 74 61 20 77 69 6c 6c 20 62 65 20 64 69   data will be di
9950: 73 63 61 72 64 65 64 2e 20 20 49 66 0a 20 2a 20  scarded.  If. * 
9960: 20 20 20 20 20 20 20 20 74 68 65 20 22 72 65 73          the "res
9970: 70 64 61 74 61 5f 6c 65 6e 22 20 70 61 72 61 6d  pdata_len" param
9980: 65 74 65 72 20 69 73 20 73 70 65 63 69 66 69 65  eter is specifie
9990: 64 20 61 73 20 4e 55 4c 4c 2c 20 74 68 69 73 20  d as NULL, this 
99a0: 62 75 66 66 65 72 0a 20 2a 20 20 20 20 20 20 20  buffer. *       
99b0: 20 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75 70    will not be up
99c0: 64 61 74 65 64 2e 0a 20 2a 0a 20 2a 20 20 20 20  dated.. *. *    
99d0: 20 73 69 7a 65 5f 74 20 2a 72 65 73 70 64 61 74   size_t *respdat
99e0: 61 5f 6c 65 6e 0a 20 2a 20 20 20 20 20 20 20 20  a_len. *        
99f0: 20 5b 49 4e 2c 20 4f 55 54 5d 20 50 6f 69 6e 74   [IN, OUT] Point
9a00: 65 72 20 69 6e 69 74 69 61 6c 69 6e 67 20 63 6f  er initialing co
9a10: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 73 69 7a  ntaining the siz
9a20: 65 20 6f 66 20 74 68 65 20 22 72 65 73 70 64 61  e of the "respda
9a30: 74 61 22 0a 20 2a 20 20 20 20 20 20 20 20 20 62  ta". *         b
9a40: 75 66 66 65 72 2e 20 20 42 65 66 6f 72 65 20 72  uffer.  Before r
9a50: 65 74 75 72 6e 69 6e 67 2c 20 74 68 65 20 70 6f  eturning, the po
9a60: 69 6e 74 65 64 20 74 6f 20 76 61 6c 75 65 20 69  inted to value i
9a70: 73 20 75 70 64 61 74 65 64 20 74 6f 20 74 68 65  s updated to the
9a80: 0a 20 2a 20 20 20 20 20 20 20 20 20 6e 75 6d 62  . *         numb
9a90: 65 72 20 6f 66 20 62 79 74 65 73 20 77 72 69 74  er of bytes writ
9aa0: 74 65 6e 20 74 6f 20 74 68 65 20 62 75 66 66 65  ten to the buffe
9ab0: 72 2e 20 20 49 66 20 74 68 69 73 20 69 73 20 73  r.  If this is s
9ac0: 70 65 63 69 66 69 65 64 20 61 73 0a 20 2a 20 20  pecified as. *  
9ad0: 20 20 20 20 20 20 20 4e 55 4c 4c 2c 20 69 74 20         NULL, it 
9ae0: 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75 70 64 61  will not be upda
9af0: 74 65 64 2c 20 61 6e 64 20 22 72 65 73 70 64 61  ted, and "respda
9b00: 74 61 22 20 77 69 6c 6c 20 62 65 20 69 67 6e 6f  ta" will be igno
9b10: 72 65 64 20 63 61 75 73 69 6e 67 0a 20 2a 20 20  red causing. *  
9b20: 20 20 20 20 20 20 20 74 68 65 20 72 65 73 70 6f         the respo
9b30: 6e 73 65 20 64 61 74 61 20 74 6f 20 62 65 20 64  nse data to be d
9b40: 69 73 63 61 72 64 65 64 2e 0a 20 2a 0a 20 2a 20  iscarded.. *. * 
9b50: 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20  RETURN VALUE. * 
9b60: 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f      CACKEY_PCSC_
9b70: 53 5f 4f 4b 20 20 20 20 20 20 20 20 20 20 20 4f  S_OK           O
9b80: 6e 20 73 75 63 63 65 73 73 0a 20 2a 20 20 20 20  n success. *    
9b90: 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47   CACKEY_PCSC_E_G
9ba0: 45 4e 45 52 49 43 20 20 20 20 20 20 4f 6e 20 65  ENERIC      On e
9bb0: 72 72 6f 72 0a 20 2a 20 20 20 20 20 43 41 43 4b  rror. *     CACK
9bc0: 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41  EY_PCSC_E_TOKENA
9bd0: 42 53 45 4e 54 20 20 49 66 20 74 68 65 20 73 65  BSENT  If the se
9be0: 6e 64 69 6e 67 20 66 61 69 6c 65 64 20 62 65 63  nding failed bec
9bf0: 61 75 73 65 20 74 68 65 20 74 6f 6b 65 6e 20 69  ause the token i
9c00: 73 0a 20 2a 20 20 20 20 20 20 20 20 20 20 20 20  s. *            
9c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c20: 20 20 20 20 61 62 73 65 6e 74 0a 20 2a 0a 20 2a      absent. *. *
9c30: 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 54 68   NOTES. *     Th
9c40: 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c  is function will
9c50: 20 63 6f 6e 6e 65 63 74 20 74 6f 20 74 68 65 20   connect to the 
9c60: 50 43 2f 53 43 20 43 6f 6e 6e 65 63 74 69 6f 6e  PC/SC Connection
9c70: 20 4d 61 6e 61 67 65 72 20 76 69 61 0a 20 2a 20   Manager via. * 
9c80: 20 20 20 20 63 61 63 6b 65 79 5f 70 63 73 63 5f      cackey_pcsc_
9c90: 63 6f 6e 6e 65 63 74 28 29 20 69 66 20 6e 65 65  connect() if nee
9ca0: 64 65 64 2e 0a 20 2a 0a 20 2a 20 20 20 20 20 49  ded.. *. *     I
9cb0: 74 20 77 69 6c 6c 20 63 6f 6e 6e 65 63 74 20 74  t will connect t
9cc0: 6f 20 74 68 65 20 63 61 72 64 20 69 6e 20 74 68  o the card in th
9cd0: 65 20 72 65 61 64 65 72 20 61 74 74 61 63 68 65  e reader attache
9ce0: 64 20 74 6f 20 74 68 65 20 73 6c 6f 74 0a 20 2a  d to the slot. *
9cf0: 20 20 20 20 20 73 70 65 63 69 66 69 65 64 2e 20       specified. 
9d00: 20 49 74 20 77 69 6c 6c 20 72 65 63 6f 6e 6e 65   It will reconne
9d10: 63 74 20 74 6f 20 74 68 65 20 63 61 72 64 20 69  ct to the card i
9d20: 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  f the connection
9d30: 0a 20 2a 20 20 20 20 20 67 6f 65 73 20 61 77 61  . *     goes awa
9d40: 79 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63  y.. *. */.static
9d50: 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b   cackey_ret cack
9d60: 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 74 72  ey_send_apdu(str
9d70: 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20  uct cackey_slot 
9d80: 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20  *slot, unsigned 
9d90: 63 68 61 72 20 63 6c 61 73 73 2c 20 75 6e 73 69  char class, unsi
9da0: 67 6e 65 64 20 63 68 61 72 20 69 6e 73 74 72 75  gned char instru
9db0: 63 74 69 6f 6e 2c 20 75 6e 73 69 67 6e 65 64 20  ction, unsigned 
9dc0: 63 68 61 72 20 70 31 2c 20 75 6e 73 69 67 6e 65  char p1, unsigne
9dd0: 64 20 63 68 61 72 20 70 32 2c 20 75 6e 73 69 67  d char p2, unsig
9de0: 6e 65 64 20 69 6e 74 20 6c 63 2c 20 75 6e 73 69  ned int lc, unsi
9df0: 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 2c  gned char *data,
9e00: 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 6c 65   unsigned int le
9e10: 2c 20 75 69 6e 74 31 36 5f 74 20 2a 72 65 73 70  , uint16_t *resp
9e20: 63 6f 64 65 2c 20 75 6e 73 69 67 6e 65 64 20 63  code, unsigned c
9e30: 68 61 72 20 2a 72 65 73 70 64 61 74 61 2c 20 73  har *respdata, s
9e40: 69 7a 65 5f 74 20 2a 72 65 73 70 64 61 74 61 5f  ize_t *respdata_
9e50: 6c 65 6e 29 20 7b 0a 09 75 69 6e 74 38 5f 74 20  len) {..uint8_t 
9e60: 6d 61 6a 6f 72 5f 72 63 2c 20 6d 69 6e 6f 72 5f  major_rc, minor_
9e70: 72 63 3b 0a 09 73 69 7a 65 5f 74 20 62 79 74 65  rc;..size_t byte
9e80: 73 5f 74 6f 5f 63 6f 70 79 2c 20 74 6d 70 5f 72  s_to_copy, tmp_r
9e90: 65 73 70 64 61 74 61 5f 6c 65 6e 3b 0a 09 4c 50  espdata_len;..LP
9ea0: 43 53 43 41 52 44 5f 49 4f 5f 52 45 51 55 45 53  CSCARD_IO_REQUES
9eb0: 54 20 70 69 6f 53 65 6e 64 50 63 69 3b 0a 09 44  T pioSendPci;..D
9ec0: 57 4f 52 44 20 78 6d 69 74 5f 6c 65 6e 2c 20 72  WORD xmit_len, r
9ed0: 65 63 76 5f 6c 65 6e 3b 0a 09 4c 4f 4e 47 20 73  ecv_len;..LONG s
9ee0: 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 2c 20 73  card_xmit_ret, s
9ef0: 63 61 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 74 3b  card_reconn_ret;
9f00: 0a 09 42 59 54 45 20 78 6d 69 74 5f 62 75 66 5b  ..BYTE xmit_buf[
9f10: 31 30 32 34 5d 2c 20 72 65 63 76 5f 62 75 66 5b  1024], recv_buf[
9f20: 31 30 32 34 5d 3b 0a 09 69 6e 74 20 70 63 73 63  1024];..int pcsc
9f30: 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 2c 20 70 63  _connect_ret, pc
9f40: 73 63 5f 67 65 74 72 65 73 70 5f 72 65 74 3b 0a  sc_getresp_ret;.
9f50: 09 69 6e 74 20 69 64 78 3b 0a 0a 09 43 41 43 4b  .int idx;...CACK
9f60: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
9f70: 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
9f80: 20 28 21 73 6c 6f 74 29 20 7b 0a 09 09 43 41 43   (!slot) {...CAC
9f90: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
9fa0: 28 22 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 73  ("Invalid slot s
9fb0: 70 65 63 69 66 69 65 64 2e 22 29 3b 0a 0a 09 09  pecified.");....
9fc0: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
9fd0: 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09  SC_E_GENERIC);..
9fe0: 7d 0a 0a 09 70 63 73 63 5f 63 6f 6e 6e 65 63 74  }...pcsc_connect
9ff0: 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 63 6f  _ret = cackey_co
a000: 6e 6e 65 63 74 5f 63 61 72 64 28 73 6c 6f 74 29  nnect_card(slot)
a010: 3b 0a 09 69 66 20 28 70 63 73 63 5f 63 6f 6e 6e  ;..if (pcsc_conn
a020: 65 63 74 5f 72 65 74 20 21 3d 20 43 41 43 4b 45  ect_ret != CACKE
a030: 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09  Y_PCSC_S_OK) {..
a040: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
a050: 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20  INTF("Unable to 
a060: 63 6f 6e 6e 65 63 74 20 74 6f 20 63 61 72 64 2c  connect to card,
a070: 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61   returning in fa
a080: 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75  ilure");....retu
a090: 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  rn(CACKEY_PCSC_E
a0a0: 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09  _GENERIC);..}...
a0b0: 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 77 68 69  /* Determine whi
a0c0: 63 68 20 70 72 6f 74 6f 63 6f 6c 20 74 6f 20 73  ch protocol to s
a0d0: 65 6e 64 20 75 73 69 6e 67 20 2a 2f 0a 09 73 77  end using */..sw
a0e0: 69 74 63 68 20 28 73 6c 6f 74 2d 3e 70 72 6f 74  itch (slot->prot
a0f0: 6f 63 6f 6c 29 20 7b 0a 09 09 63 61 73 65 20 53  ocol) {...case S
a100: 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30  CARD_PROTOCOL_T0
a110: 3a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  :....CACKEY_DEBU
a120: 47 5f 50 52 49 4e 54 46 28 22 50 72 6f 74 6f 63  G_PRINTF("Protoc
a130: 6f 6c 20 74 6f 20 73 65 6e 64 20 64 61 74 61 67  ol to send datag
a140: 72 61 6d 20 69 73 20 54 3d 30 22 29 3b 0a 0a 09  ram is T=0");...
a150: 09 09 70 69 6f 53 65 6e 64 50 63 69 20 3d 20 53  ..pioSendPci = S
a160: 43 41 52 44 5f 50 43 49 5f 54 30 3b 0a 0a 09 09  CARD_PCI_T0;....
a170: 09 62 72 65 61 6b 3b 0a 09 09 63 61 73 65 20 53  .break;...case S
a180: 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31  CARD_PROTOCOL_T1
a190: 3a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  :....CACKEY_DEBU
a1a0: 47 5f 50 52 49 4e 54 46 28 22 50 72 6f 74 6f 63  G_PRINTF("Protoc
a1b0: 6f 6c 20 74 6f 20 73 65 6e 64 20 64 61 74 61 67  ol to send datag
a1c0: 72 61 6d 20 69 73 20 54 3d 31 22 29 3b 0a 0a 09  ram is T=1");...
a1d0: 09 09 70 69 6f 53 65 6e 64 50 63 69 20 3d 20 53  ..pioSendPci = S
a1e0: 43 41 52 44 5f 50 43 49 5f 54 31 3b 0a 0a 09 09  CARD_PCI_T1;....
a1f0: 09 62 72 65 61 6b 3b 0a 09 09 64 65 66 61 75 6c  .break;...defaul
a200: 74 3a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42  t:....CACKEY_DEB
a210: 55 47 5f 50 52 49 4e 54 46 28 22 49 6e 76 61 6c  UG_PRINTF("Inval
a220: 69 64 20 70 72 6f 74 6f 63 6f 6c 20 66 6f 75 6e  id protocol foun
a230: 64 2c 20 61 62 6f 72 74 69 6e 67 2e 22 29 3b 0a  d, aborting.");.
a240: 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ....return(CACKE
a250: 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43  Y_PCSC_E_GENERIC
a260: 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 54 72 61 6e 73  );..}.../* Trans
a270: 6d 69 74 20 2a 2f 0a 09 78 6d 69 74 5f 6c 65 6e  mit */..xmit_len
a280: 20 3d 20 30 3b 0a 09 78 6d 69 74 5f 62 75 66 5b   = 0;..xmit_buf[
a290: 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 63 6c  xmit_len++] = cl
a2a0: 61 73 73 3b 0a 09 78 6d 69 74 5f 62 75 66 5b 78  ass;..xmit_buf[x
a2b0: 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 69 6e 73  mit_len++] = ins
a2c0: 74 72 75 63 74 69 6f 6e 3b 0a 09 78 6d 69 74 5f  truction;..xmit_
a2d0: 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20  buf[xmit_len++] 
a2e0: 3d 20 70 31 3b 0a 09 78 6d 69 74 5f 62 75 66 5b  = p1;..xmit_buf[
a2f0: 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 70 32  xmit_len++] = p2
a300: 3b 0a 09 69 66 20 28 64 61 74 61 29 20 7b 0a 09  ;..if (data) {..
a310: 09 69 66 20 28 6c 63 20 3e 20 32 35 35 29 20 7b  .if (lc > 255) {
a320: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
a330: 5f 50 52 49 4e 54 46 28 22 43 41 55 54 49 4f 4e  _PRINTF("CAUTION
a340: 21 20 20 55 73 69 6e 67 20 61 6e 20 4c 63 20 67  !  Using an Lc g
a350: 72 65 61 74 65 72 20 74 68 61 6e 20 32 35 35 20  reater than 255 
a360: 69 73 20 75 6e 74 65 73 74 65 64 2e 20 20 4c 63  is untested.  Lc
a370: 20 3d 20 25 75 22 2c 20 6c 63 29 3b 0a 0a 09 09   = %u", lc);....
a380: 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c  .xmit_buf[xmit_l
a390: 65 6e 2b 2b 5d 20 3d 20 30 78 38 32 3b 20 2f 2a  en++] = 0x82; /*
a3a0: 20 58 58 58 20 55 4e 54 45 53 54 45 44 20 2a 2f   XXX UNTESTED */
a3b0: 0a 09 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69  ....xmit_buf[xmi
a3c0: 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 28 6c 63 20 26  t_len++] = (lc &
a3d0: 20 30 78 66 66 30 30 29 20 3e 3e 20 38 3b 0a 09   0xff00) >> 8;..
a3e0: 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f  ..xmit_buf[xmit_
a3f0: 6c 65 6e 2b 2b 5d 20 3d 20 6c 63 20 26 20 30 78  len++] = lc & 0x
a400: 66 66 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09  ff;...} else {..
a410: 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f  ..xmit_buf[xmit_
a420: 6c 65 6e 2b 2b 5d 20 3d 20 6c 63 3b 0a 09 09 7d  len++] = lc;...}
a430: 0a 09 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b  ...for (idx = 0;
a440: 20 69 64 78 20 3c 20 6c 63 3b 20 69 64 78 2b 2b   idx < lc; idx++
a450: 29 20 7b 0a 09 09 09 78 6d 69 74 5f 62 75 66 5b  ) {....xmit_buf[
a460: 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 64 61  xmit_len++] = da
a470: 74 61 5b 69 64 78 5d 3b 0a 09 09 7d 0a 09 7d 0a  ta[idx];...}..}.
a480: 0a 09 69 66 20 28 6c 65 20 21 3d 20 30 78 30 30  ..if (le != 0x00
a490: 29 20 7b 0a 09 09 69 66 20 28 6c 65 20 3e 20 32  ) {...if (le > 2
a4a0: 35 36 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  56) {....CACKEY_
a4b0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 41  DEBUG_PRINTF("CA
a4c0: 55 54 49 4f 4e 21 20 20 55 73 69 6e 67 20 61 6e  UTION!  Using an
a4d0: 20 4c 65 20 67 72 65 61 74 65 72 20 74 68 61 6e   Le greater than
a4e0: 20 32 35 36 20 69 73 20 75 6e 74 65 73 74 65 64   256 is untested
a4f0: 2e 20 20 4c 65 20 3d 20 25 75 22 2c 20 6c 65 29  .  Le = %u", le)
a500: 3b 0a 0a 09 09 09 78 6d 69 74 5f 62 75 66 5b 78  ;.....xmit_buf[x
a510: 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 30 78 38  mit_len++] = 0x8
a520: 32 3b 20 2f 2a 20 58 58 58 20 55 4e 54 45 53 54  2; /* XXX UNTEST
a530: 45 44 20 2a 2f 0a 09 09 09 78 6d 69 74 5f 62 75  ED */....xmit_bu
a540: 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20  f[xmit_len++] = 
a550: 28 6c 65 20 26 20 30 78 66 66 30 30 29 20 3e 3e  (le & 0xff00) >>
a560: 20 38 3b 0a 09 09 09 78 6d 69 74 5f 62 75 66 5b   8;....xmit_buf[
a570: 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 6c 65  xmit_len++] = le
a580: 20 26 20 30 78 66 66 3b 0a 09 09 7d 20 65 6c 73   & 0xff;...} els
a590: 65 20 69 66 20 28 6c 65 20 3d 3d 20 32 35 36 29  e if (le == 256)
a5a0: 20 7b 0a 09 09 09 78 6d 69 74 5f 62 75 66 5b 78   {....xmit_buf[x
a5b0: 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 30 78 30  mit_len++] = 0x0
a5c0: 30 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  0;...} else {...
a5d0: 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c  .xmit_buf[xmit_l
a5e0: 65 6e 2b 2b 5d 20 3d 20 6c 65 3b 0a 09 09 7d 0a  en++] = le;...}.
a5f0: 09 7d 0a 0a 09 2f 2a 20 42 65 67 69 6e 20 53 6d  .}.../* Begin Sm
a600: 61 72 74 63 61 72 64 20 54 72 61 6e 73 61 63 74  artcard Transact
a610: 69 6f 6e 20 2a 2f 0a 09 63 61 63 6b 65 79 5f 62  ion */..cackey_b
a620: 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e  egin_transaction
a630: 28 73 6c 6f 74 29 3b 0a 0a 09 69 66 20 28 63 6c  (slot);...if (cl
a640: 61 73 73 20 3d 3d 20 47 53 43 49 53 5f 43 4c 41  ass == GSCIS_CLA
a650: 53 53 5f 49 53 4f 37 38 31 36 20 26 26 20 69 6e  SS_ISO7816 && in
a660: 73 74 72 75 63 74 69 6f 6e 20 3d 3d 20 47 53 43  struction == GSC
a670: 49 53 5f 49 4e 53 54 52 5f 56 45 52 49 46 59 20  IS_INSTR_VERIFY 
a680: 26 26 20 70 31 20 3d 3d 20 30 78 30 30 29 20 7b  && p1 == 0x00) {
a690: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
a6a0: 50 52 49 4e 54 46 28 22 53 65 6e 64 69 6e 67 20  PRINTF("Sending 
a6b0: 41 50 44 55 3a 20 3c 3c 63 65 6e 73 6f 72 65 64  APDU: <<censored
a6c0: 3e 3e 22 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a  >>");..} else {.
a6d0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
a6e0: 52 49 4e 54 42 55 46 28 22 53 65 6e 64 69 6e 67  RINTBUF("Sending
a6f0: 20 41 50 44 55 3a 22 2c 20 78 6d 69 74 5f 62 75   APDU:", xmit_bu
a700: 66 2c 20 78 6d 69 74 5f 6c 65 6e 29 3b 0a 09 7d  f, xmit_len);..}
a710: 0a 0a 09 72 65 63 76 5f 6c 65 6e 20 3d 20 73 69  ...recv_len = si
a720: 7a 65 6f 66 28 72 65 63 76 5f 62 75 66 29 3b 0a  zeof(recv_buf);.
a730: 09 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 20  .scard_xmit_ret 
a740: 3d 20 53 43 61 72 64 54 72 61 6e 73 6d 69 74 28  = SCardTransmit(
a750: 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c  slot->pcsc_card,
a760: 20 70 69 6f 53 65 6e 64 50 63 69 2c 20 78 6d 69   pioSendPci, xmi
a770: 74 5f 62 75 66 2c 20 78 6d 69 74 5f 6c 65 6e 2c  t_buf, xmit_len,
a780: 20 4e 55 4c 4c 2c 20 72 65 63 76 5f 62 75 66 2c   NULL, recv_buf,
a790: 20 26 72 65 63 76 5f 6c 65 6e 29 3b 0a 0a 09 69   &recv_len);...i
a7a0: 66 20 28 73 63 61 72 64 5f 78 6d 69 74 5f 72 65  f (scard_xmit_re
a7b0: 74 20 3d 3d 20 53 43 41 52 44 5f 45 5f 4e 4f 54  t == SCARD_E_NOT
a7c0: 5f 54 52 41 4e 53 41 43 54 45 44 29 20 7b 0a 09  _TRANSACTED) {..
a7d0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
a7e0: 49 4e 54 46 28 22 46 61 69 6c 65 64 20 74 6f 20  INTF("Failed to 
a7f0: 73 65 6e 64 20 41 50 44 55 20 74 6f 20 63 61 72  send APDU to car
a800: 64 20 28 53 43 61 72 64 54 72 61 6e 73 6d 69 74  d (SCardTransmit
a810: 28 29 20 3d 20 25 73 2f 25 6c 78 29 2c 20 77 69  () = %s/%lx), wi
a820: 6c 6c 20 61 73 6b 20 63 61 6c 6c 69 6e 67 20 66  ll ask calling f
a830: 75 6e 63 74 69 6f 6e 20 74 6f 20 72 65 74 72 79  unction to retry
a840: 20 28 6e 6f 74 20 72 65 73 65 74 74 69 6e 67 20   (not resetting 
a850: 63 61 72 64 29 2e 2e 2e 22 2c 20 43 41 43 4b 45  card)...", CACKE
a860: 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41  Y_DEBUG_FUNC_SCA
a870: 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61  RDERR_TO_STR(sca
a880: 72 64 5f 78 6d 69 74 5f 72 65 74 29 2c 20 28 75  rd_xmit_ret), (u
a890: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 63  nsigned long) sc
a8a0: 61 72 64 5f 78 6d 69 74 5f 72 65 74 29 3b 0a 0a  ard_xmit_ret);..
a8b0: 09 09 2f 2a 20 42 65 67 69 6e 20 53 6d 61 72 74  ../* Begin Smart
a8c0: 63 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e  card Transaction
a8d0: 20 2a 2f 0a 09 09 63 61 63 6b 65 79 5f 65 6e 64   */...cackey_end
a8e0: 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f  _transaction(slo
a8f0: 74 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 72 65  t);....cackey_re
a900: 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73 6c 6f  connect_card(slo
a910: 74 2c 20 73 6c 6f 74 2d 3e 70 72 6f 74 6f 63 6f  t, slot->protoco
a920: 6c 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41  l);....return(CA
a930: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 52 45 54 52  CKEY_PCSC_E_RETR
a940: 59 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 63 61  Y);..}...if (sca
a950: 72 64 5f 78 6d 69 74 5f 72 65 74 20 21 3d 20 53  rd_xmit_ret != S
a960: 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20  CARD_S_SUCCESS) 
a970: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
a980: 5f 50 52 49 4e 54 46 28 22 46 61 69 6c 65 64 20  _PRINTF("Failed 
a990: 74 6f 20 73 65 6e 64 20 41 50 44 55 20 74 6f 20  to send APDU to 
a9a0: 63 61 72 64 20 28 53 43 61 72 64 54 72 61 6e 73  card (SCardTrans
a9b0: 6d 69 74 28 29 20 3d 20 25 73 2f 25 6c 78 29 22  mit() = %s/%lx)"
a9c0: 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46  , CACKEY_DEBUG_F
a9d0: 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f  UNC_SCARDERR_TO_
a9e0: 53 54 52 28 73 63 61 72 64 5f 78 6d 69 74 5f 72  STR(scard_xmit_r
a9f0: 65 74 29 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  et), (unsigned l
aa00: 6f 6e 67 29 20 73 63 61 72 64 5f 78 6d 69 74 5f  ong) scard_xmit_
aa10: 72 65 74 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f  ret);....CACKEY_
aa20: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4d 61  DEBUG_PRINTF("Ma
aa30: 72 6b 69 6e 67 20 73 6c 6f 74 20 61 73 20 68 61  rking slot as ha
aa40: 76 69 6e 67 20 62 65 65 6e 20 72 65 73 65 74 22  ving been reset"
aa50: 29 3b 0a 09 09 63 61 63 6b 65 79 5f 6d 61 72 6b  );...cackey_mark
aa60: 5f 73 6c 6f 74 5f 72 65 73 65 74 28 73 6c 6f 74  _slot_reset(slot
aa70: 29 3b 0a 0a 09 09 69 66 20 28 73 63 61 72 64 5f  );....if (scard_
aa80: 78 6d 69 74 5f 72 65 74 20 3d 3d 20 53 43 41 52  xmit_ret == SCAR
aa90: 44 5f 57 5f 52 45 53 45 54 5f 43 41 52 44 29 20  D_W_RESET_CARD) 
aaa0: 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
aab0: 47 5f 50 52 49 4e 54 46 28 22 52 65 73 65 74 20  G_PRINTF("Reset 
aac0: 72 65 71 75 69 72 65 64 2c 20 70 6c 65 61 73 65  required, please
aad0: 20 68 6f 6c 64 2e 2e 2e 22 29 3b 0a 0a 09 09 09   hold...");.....
aae0: 73 63 61 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 74  scard_reconn_ret
aaf0: 20 3d 20 63 61 63 6b 65 79 5f 72 65 63 6f 6e 6e   = cackey_reconn
ab00: 65 63 74 5f 63 61 72 64 28 73 6c 6f 74 2c 20 53  ect_card(slot, S
ab10: 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30  CARD_PROTOCOL_T0
ab20: 20 7c 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f   | SCARD_PROTOCO
ab30: 4c 5f 54 31 29 3b 0a 0a 09 09 09 69 66 20 28 73  L_T1);.....if (s
ab40: 63 61 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 74 20  card_reconn_ret 
ab50: 3d 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45  == SCARD_S_SUCCE
ab60: 53 53 29 20 7b 0a 09 09 09 09 73 77 69 74 63 68  SS) {.....switch
ab70: 20 28 73 6c 6f 74 2d 3e 70 72 6f 74 6f 63 6f 6c   (slot->protocol
ab80: 29 20 7b 0a 09 09 09 09 09 63 61 73 65 20 53 43  ) {......case SC
ab90: 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 3a  ARD_PROTOCOL_T0:
aba0: 0a 09 09 09 09 09 09 70 69 6f 53 65 6e 64 50 63  .......pioSendPc
abb0: 69 20 3d 20 53 43 41 52 44 5f 50 43 49 5f 54 30  i = SCARD_PCI_T0
abc0: 3b 0a 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a  ;........break;.
abd0: 09 09 09 09 09 63 61 73 65 20 53 43 41 52 44 5f  .....case SCARD_
abe0: 50 52 4f 54 4f 43 4f 4c 5f 54 31 3a 0a 09 09 09  PROTOCOL_T1:....
abf0: 09 09 09 70 69 6f 53 65 6e 64 50 63 69 20 3d 20  ...pioSendPci = 
ac00: 53 43 41 52 44 5f 50 43 49 5f 54 31 3b 0a 0a 09  SCARD_PCI_T1;...
ac10: 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09  .....break;.....
ac20: 09 64 65 66 61 75 6c 74 3a 0a 09 09 09 09 09 09  .default:.......
ac30: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
ac40: 4e 54 46 28 22 49 6e 76 61 6c 69 64 20 70 72 6f  NTF("Invalid pro
ac50: 74 6f 63 6f 6c 20 66 6f 75 6e 64 2c 20 62 75 74  tocol found, but
ac60: 20 74 6f 6f 20 6c 61 74 65 20 74 6f 20 64 6f 20   too late to do 
ac70: 61 6e 79 74 68 69 6e 67 20 61 62 6f 75 74 20 69  anything about i
ac80: 74 20 6e 6f 77 20 2d 2d 20 74 72 79 69 6e 67 20  t now -- trying 
ac90: 61 6e 79 77 61 79 2e 22 29 3b 0a 0a 09 09 09 09  anyway.");......
aca0: 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a  ..break;.....}..
acb0: 09 09 09 09 2f 2a 20 52 65 2d 65 73 74 61 62 6c  ..../* Re-establ
acc0: 69 73 68 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ish transaction,
acd0: 20 69 66 20 69 74 20 77 61 73 20 70 72 65 73 65   if it was prese
ace0: 6e 74 20 2a 2f 0a 09 09 09 09 69 66 20 28 73 6c  nt */.....if (sl
acf0: 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f  ot->transaction_
ad00: 64 65 70 74 68 20 3e 20 30 29 20 7b 0a 09 09 09  depth > 0) {....
ad10: 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74  ..slot->transact
ad20: 69 6f 6e 5f 64 65 70 74 68 2d 2d 3b 0a 09 09 09  ion_depth--;....
ad30: 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74  ..slot->transact
ad40: 69 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b  ion_need_hw_lock
ad50: 20 3d 20 31 3b 0a 09 09 09 09 09 63 61 63 6b 65   = 1;......cacke
ad60: 79 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74  y_begin_transact
ad70: 69 6f 6e 28 73 6c 6f 74 29 3b 0a 09 09 09 09 7d  ion(slot);.....}
ad80: 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
ad90: 55 47 5f 50 52 49 4e 54 46 28 22 52 65 73 65 74  UG_PRINTF("Reset
ada0: 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74   successful, ret
adb0: 72 61 6e 73 6d 69 74 74 69 6e 67 22 29 3b 0a 0a  ransmitting");..
adc0: 09 09 09 09 72 65 63 76 5f 6c 65 6e 20 3d 20 73  ....recv_len = s
add0: 69 7a 65 6f 66 28 72 65 63 76 5f 62 75 66 29 3b  izeof(recv_buf);
ade0: 0a 09 09 09 09 73 63 61 72 64 5f 78 6d 69 74 5f  .....scard_xmit_
adf0: 72 65 74 20 3d 20 53 43 61 72 64 54 72 61 6e 73  ret = SCardTrans
ae00: 6d 69 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63  mit(slot->pcsc_c
ae10: 61 72 64 2c 20 70 69 6f 53 65 6e 64 50 63 69 2c  ard, pioSendPci,
ae20: 20 78 6d 69 74 5f 62 75 66 2c 20 78 6d 69 74 5f   xmit_buf, xmit_
ae30: 6c 65 6e 2c 20 4e 55 4c 4c 2c 20 72 65 63 76 5f  len, NULL, recv_
ae40: 62 75 66 2c 20 26 72 65 63 76 5f 6c 65 6e 29 3b  buf, &recv_len);
ae50: 0a 0a 09 09 09 09 69 66 20 28 73 63 61 72 64 5f  ......if (scard_
ae60: 78 6d 69 74 5f 72 65 74 20 21 3d 20 53 43 41 52  xmit_ret != SCAR
ae70: 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09  D_S_SUCCESS) {..
ae80: 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
ae90: 5f 50 52 49 4e 54 46 28 22 52 65 74 72 61 6e 73  _PRINTF("Retrans
aea0: 6d 69 74 20 66 61 69 6c 65 64 2c 20 72 65 74 75  mit failed, retu
aeb0: 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65  rning in failure
aec0: 20 61 66 74 65 72 20 64 69 73 63 6f 6e 6e 65 63   after disconnec
aed0: 74 69 6e 67 20 74 68 65 20 63 61 72 64 20 28 53  ting the card (S
aee0: 43 61 72 64 54 72 61 6e 73 6d 69 74 20 3d 20 25  CardTransmit = %
aef0: 73 2f 25 6c 69 29 22 2c 20 43 41 43 4b 45 59 5f  s/%li)", CACKEY_
af00: 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44  DEBUG_FUNC_SCARD
af10: 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64  ERR_TO_STR(scard
af20: 5f 78 6d 69 74 5f 72 65 74 29 2c 20 28 6c 6f 6e  _xmit_ret), (lon
af30: 67 29 20 73 63 61 72 64 5f 78 6d 69 74 5f 72 65  g) scard_xmit_re
af40: 74 29 3b 0a 0a 09 09 09 09 09 53 43 61 72 64 44  t);.......SCardD
af50: 69 73 63 6f 6e 6e 65 63 74 28 73 6c 6f 74 2d 3e  isconnect(slot->
af60: 70 63 73 63 5f 63 61 72 64 2c 20 53 43 41 52 44  pcsc_card, SCARD
af70: 5f 4c 45 41 56 45 5f 43 41 52 44 29 3b 0a 09 09  _LEAVE_CARD);...
af80: 09 09 09 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61  ...slot->pcsc_ca
af90: 72 64 5f 63 6f 6e 6e 65 63 74 65 64 20 3d 20 30  rd_connected = 0
afa0: 3b 0a 0a 09 09 09 09 09 2f 2a 20 45 6e 64 20 53  ;......./* End S
afb0: 6d 61 72 74 63 61 72 64 20 54 72 61 6e 73 61 63  martcard Transac
afc0: 74 69 6f 6e 20 2a 2f 0a 09 09 09 09 09 73 6c 6f  tion */......slo
afd0: 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64  t->transaction_d
afe0: 65 70 74 68 20 3d 20 31 3b 0a 09 09 09 09 09 63  epth = 1;......c
aff0: 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61  ackey_end_transa
b000: 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09  ction(slot);....
b010: 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
b020: 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53  _PCSC_E_TOKENABS
b030: 45 4e 54 29 3b 0a 09 09 09 09 7d 0a 09 09 09 7d  ENT);.....}....}
b040: 20 65 6c 73 65 20 7b 0a 09 09 09 09 43 41 43 4b   else {.....CACK
b050: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
b060: 22 44 69 73 63 6f 6e 6e 65 63 74 69 6e 67 20 63  "Disconnecting c
b070: 61 72 64 22 29 3b 0a 0a 09 09 09 09 53 43 61 72  ard");......SCar
b080: 64 44 69 73 63 6f 6e 6e 65 63 74 28 73 6c 6f 74  dDisconnect(slot
b090: 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 53 43 41  ->pcsc_card, SCA
b0a0: 52 44 5f 4c 45 41 56 45 5f 43 41 52 44 29 3b 0a  RD_LEAVE_CARD);.
b0b0: 09 09 09 09 73 6c 6f 74 2d 3e 70 63 73 63 5f 63  ....slot->pcsc_c
b0c0: 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 20 3d 20  ard_connected = 
b0d0: 30 3b 0a 0a 09 09 09 09 2f 2a 20 45 6e 64 20 53  0;....../* End S
b0e0: 6d 61 72 74 63 61 72 64 20 54 72 61 6e 73 61 63  martcard Transac
b0f0: 74 69 6f 6e 20 2a 2f 0a 09 09 09 09 73 6c 6f 74  tion */.....slot
b100: 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65  ->transaction_de
b110: 70 74 68 20 3d 20 31 3b 0a 09 09 09 09 63 61 63  pth = 1;.....cac
b120: 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  key_end_transact
b130: 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 09 09  ion(slot);......
b140: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
b150: 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 69  NTF("Returning i
b160: 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 09 09 09  n failure");....
b170: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
b180: 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e  CSC_E_TOKENABSEN
b190: 54 29 3b 0a 09 09 09 7d 0a 09 09 7d 20 65 6c 73  T);....}...} els
b1a0: 65 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  e {....CACKEY_DE
b1b0: 42 55 47 5f 50 52 49 4e 54 46 28 22 44 69 73 63  BUG_PRINTF("Disc
b1c0: 6f 6e 6e 65 63 74 69 6e 67 20 63 61 72 64 22 29  onnecting card")
b1d0: 3b 0a 0a 09 09 09 53 43 61 72 64 44 69 73 63 6f  ;.....SCardDisco
b1e0: 6e 6e 65 63 74 28 73 6c 6f 74 2d 3e 70 63 73 63  nnect(slot->pcsc
b1f0: 5f 63 61 72 64 2c 20 53 43 41 52 44 5f 4c 45 41  _card, SCARD_LEA
b200: 56 45 5f 43 41 52 44 29 3b 0a 09 09 09 73 6c 6f  VE_CARD);....slo
b210: 74 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e  t->pcsc_card_con
b220: 6e 65 63 74 65 64 20 3d 20 30 3b 0a 0a 09 09 09  nected = 0;.....
b230: 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63 61 72 64  /* End Smartcard
b240: 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a   Transaction */.
b250: 09 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63  ...slot->transac
b260: 74 69 6f 6e 5f 64 65 70 74 68 20 3d 20 31 3b 0a  tion_depth = 1;.
b270: 09 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72  ...cackey_end_tr
b280: 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b  ansaction(slot);
b290: 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
b2a0: 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
b2b0: 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29  ing in failure")
b2c0: 3b 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b  ;....return(CACK
b2d0: 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41  EY_PCSC_E_TOKENA
b2e0: 42 53 45 4e 54 29 3b 0a 09 09 7d 0a 09 7d 0a 0a  BSENT);...}..}..
b2f0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
b300: 49 4e 54 42 55 46 28 22 52 65 74 75 72 6e 65 64  INTBUF("Returned
b310: 20 56 61 6c 75 65 3a 22 2c 20 72 65 63 76 5f 62   Value:", recv_b
b320: 75 66 2c 20 72 65 63 76 5f 6c 65 6e 29 3b 0a 0a  uf, recv_len);..
b330: 09 69 66 20 28 72 65 63 76 5f 6c 65 6e 20 3c 20  .if (recv_len < 
b340: 32 29 20 7b 0a 09 09 2f 2a 20 4d 69 6e 69 6d 61  2) {.../* Minima
b350: 6c 20 72 65 73 70 6f 6e 73 65 20 6c 65 6e 67 74  l response lengt
b360: 68 20 69 73 20 32 20 62 79 74 65 73 2c 20 72 65  h is 2 bytes, re
b370: 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
b380: 72 65 20 2a 2f 0a 09 09 43 41 43 4b 45 59 5f 44  re */...CACKEY_D
b390: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 73  EBUG_PRINTF("Res
b3a0: 70 6f 6e 73 65 20 74 6f 6f 20 73 6d 61 6c 6c 2c  ponse too small,
b3b0: 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61   returning in fa
b3c0: 69 6c 75 72 65 20 28 72 65 63 76 5f 6c 65 6e 20  ilure (recv_len 
b3d0: 3d 20 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e  = %lu)", (unsign
b3e0: 65 64 20 6c 6f 6e 67 29 20 72 65 63 76 5f 6c 65  ed long) recv_le
b3f0: 6e 29 3b 0a 0a 09 09 2f 2a 20 45 6e 64 20 53 6d  n);..../* End Sm
b400: 61 72 74 63 61 72 64 20 54 72 61 6e 73 61 63 74  artcard Transact
b410: 69 6f 6e 20 2a 2f 0a 09 09 63 61 63 6b 65 79 5f  ion */...cackey_
b420: 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
b430: 73 6c 6f 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e  slot);....return
b440: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47  (CACKEY_PCSC_E_G
b450: 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 2f 2a  ENERIC);..}.../*
b460: 20 44 65 74 65 72 6d 69 6e 65 20 72 65 73 75 6c   Determine resul
b470: 74 20 63 6f 64 65 20 2a 2f 0a 09 6d 61 6a 6f 72  t code */..major
b480: 5f 72 63 20 3d 20 72 65 63 76 5f 62 75 66 5b 72  _rc = recv_buf[r
b490: 65 63 76 5f 6c 65 6e 20 2d 20 32 5d 3b 0a 09 6d  ecv_len - 2];..m
b4a0: 69 6e 6f 72 5f 72 63 20 3d 20 72 65 63 76 5f 62  inor_rc = recv_b
b4b0: 75 66 5b 72 65 63 76 5f 6c 65 6e 20 2d 20 31 5d  uf[recv_len - 1]
b4c0: 3b 0a 09 69 66 20 28 72 65 73 70 63 6f 64 65 29  ;..if (respcode)
b4d0: 20 7b 0a 09 09 2a 72 65 73 70 63 6f 64 65 20 3d   {...*respcode =
b4e0: 20 28 6d 61 6a 6f 72 5f 72 63 20 3c 3c 20 38 29   (major_rc << 8)
b4f0: 20 7c 20 6d 69 6e 6f 72 5f 72 63 3b 0a 09 7d 0a   | minor_rc;..}.
b500: 0a 09 2f 2a 20 41 64 6a 75 73 74 20 6d 65 73 73  ../* Adjust mess
b510: 61 67 65 20 62 75 66 66 65 72 20 2a 2f 0a 09 72  age buffer */..r
b520: 65 63 76 5f 6c 65 6e 20 2d 3d 20 32 3b 0a 0a 09  ecv_len -= 2;...
b530: 2f 2a 20 41 64 64 20 62 79 74 65 73 20 74 6f 20  /* Add bytes to 
b540: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a  return value */.
b550: 09 74 6d 70 5f 72 65 73 70 64 61 74 61 5f 6c 65  .tmp_respdata_le
b560: 6e 20 3d 20 30 3b 0a 09 69 66 20 28 72 65 73 70  n = 0;..if (resp
b570: 64 61 74 61 20 26 26 20 72 65 73 70 64 61 74 61  data && respdata
b580: 5f 6c 65 6e 29 20 7b 0a 09 09 74 6d 70 5f 72 65  _len) {...tmp_re
b590: 73 70 64 61 74 61 5f 6c 65 6e 20 3d 20 2a 72 65  spdata_len = *re
b5a0: 73 70 64 61 74 61 5f 6c 65 6e 3b 0a 0a 09 09 62  spdata_len;....b
b5b0: 79 74 65 73 5f 74 6f 5f 63 6f 70 79 20 3d 20 2a  ytes_to_copy = *
b5c0: 72 65 73 70 64 61 74 61 5f 6c 65 6e 3b 0a 0a 09  respdata_len;...
b5d0: 09 69 66 20 28 72 65 63 76 5f 6c 65 6e 20 3c 20  .if (recv_len < 
b5e0: 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 29 20 7b  bytes_to_copy) {
b5f0: 0a 09 09 09 62 79 74 65 73 5f 74 6f 5f 63 6f 70  ....bytes_to_cop
b600: 79 20 3d 20 72 65 63 76 5f 6c 65 6e 3b 0a 09 09  y = recv_len;...
b610: 7d 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  }....CACKEY_DEBU
b620: 47 5f 50 52 49 4e 54 46 28 22 43 6f 70 79 69 6e  G_PRINTF("Copyin
b630: 67 20 25 6c 75 20 62 79 74 65 73 20 74 6f 20 74  g %lu bytes to t
b640: 68 65 20 62 75 66 66 65 72 20 28 72 65 63 76 27  he buffer (recv'
b650: 64 20 25 6c 75 20 62 79 74 65 73 2c 20 62 75 74  d %lu bytes, but
b660: 20 6f 6e 6c 79 20 25 6c 75 20 62 79 74 65 73 20   only %lu bytes 
b670: 6c 65 66 74 20 69 6e 20 6f 75 72 20 62 75 66 66  left in our buff
b680: 65 72 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  er)", (unsigned 
b690: 6c 6f 6e 67 29 20 62 79 74 65 73 5f 74 6f 5f 63  long) bytes_to_c
b6a0: 6f 70 79 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  opy, (unsigned l
b6b0: 6f 6e 67 29 20 72 65 63 76 5f 6c 65 6e 2c 20 28  ong) recv_len, (
b6c0: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a  unsigned long) *
b6d0: 72 65 73 70 64 61 74 61 5f 6c 65 6e 29 3b 0a 0a  respdata_len);..
b6e0: 09 09 6d 65 6d 63 70 79 28 72 65 73 70 64 61 74  ..memcpy(respdat
b6f0: 61 2c 20 72 65 63 76 5f 62 75 66 2c 20 62 79 74  a, recv_buf, byt
b700: 65 73 5f 74 6f 5f 63 6f 70 79 29 3b 0a 09 09 72  es_to_copy);...r
b710: 65 73 70 64 61 74 61 20 2b 3d 20 62 79 74 65 73  espdata += bytes
b720: 5f 74 6f 5f 63 6f 70 79 3b 0a 0a 09 09 2a 72 65  _to_copy;....*re
b730: 73 70 64 61 74 61 5f 6c 65 6e 20 3d 20 62 79 74  spdata_len = byt
b740: 65 73 5f 74 6f 5f 63 6f 70 79 3b 0a 09 09 74 6d  es_to_copy;...tm
b750: 70 5f 72 65 73 70 64 61 74 61 5f 6c 65 6e 20 2d  p_respdata_len -
b760: 3d 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 3b  = bytes_to_copy;
b770: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69 66 20  ..} else {...if 
b780: 28 72 65 63 76 5f 6c 65 6e 20 21 3d 20 30 29 20  (recv_len != 0) 
b790: 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
b7a0: 47 5f 50 52 49 4e 54 46 28 22 54 68 72 6f 77 69  G_PRINTF("Throwi
b7b0: 6e 67 20 61 77 61 79 20 25 6c 75 20 62 79 74 65  ng away %lu byte
b7c0: 73 2c 20 6e 6f 77 68 65 72 65 20 74 6f 20 70 75  s, nowhere to pu
b7d0: 74 20 74 68 65 6d 21 22 2c 20 28 75 6e 73 69 67  t them!", (unsig
b7e0: 6e 65 64 20 6c 6f 6e 67 29 20 72 65 63 76 5f 6c  ned long) recv_l
b7f0: 65 6e 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66  en);...}..}...if
b800: 20 28 6d 61 6a 6f 72 5f 72 63 20 3d 3d 20 30 78   (major_rc == 0x
b810: 36 31 29 20 7b 0a 09 09 2f 2a 20 57 65 20 6e 65  61) {.../* We ne
b820: 65 64 20 74 6f 20 52 45 41 44 20 2a 2f 0a 09 09  ed to READ */...
b830: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
b840: 4e 54 46 28 22 42 75 66 66 65 72 20 72 65 61 64  NTF("Buffer read
b850: 20 72 65 71 75 69 72 65 64 22 29 3b 0a 0a 09 09   required");....
b860: 69 66 20 28 6d 69 6e 6f 72 5f 72 63 20 3d 3d 20  if (minor_rc == 
b870: 30 78 30 30 29 20 7b 0a 09 09 09 6d 69 6e 6f 72  0x00) {....minor
b880: 5f 72 63 20 3d 20 43 41 43 4b 45 59 5f 41 50 44  _rc = CACKEY_APD
b890: 55 5f 4d 54 55 3b 0a 09 09 7d 0a 0a 09 09 70 63  U_MTU;...}....pc
b8a0: 73 63 5f 67 65 74 72 65 73 70 5f 72 65 74 20 3d  sc_getresp_ret =
b8b0: 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64   cackey_send_apd
b8c0: 75 28 73 6c 6f 74 2c 20 47 53 43 49 53 5f 43 4c  u(slot, GSCIS_CL
b8d0: 41 53 53 5f 49 53 4f 37 38 31 36 2c 20 47 53 43  ASS_ISO7816, GSC
b8e0: 49 53 5f 49 4e 53 54 52 5f 47 45 54 5f 52 45 53  IS_INSTR_GET_RES
b8f0: 50 4f 4e 53 45 2c 20 30 78 30 30 2c 20 30 78 30  PONSE, 0x00, 0x0
b900: 30 2c 20 30 2c 20 4e 55 4c 4c 2c 20 6d 69 6e 6f  0, 0, NULL, mino
b910: 72 5f 72 63 2c 20 72 65 73 70 63 6f 64 65 2c 20  r_rc, respcode, 
b920: 72 65 73 70 64 61 74 61 2c 20 26 74 6d 70 5f 72  respdata, &tmp_r
b930: 65 73 70 64 61 74 61 5f 6c 65 6e 29 3b 0a 0a 09  espdata_len);...
b940: 09 69 66 20 28 70 63 73 63 5f 67 65 74 72 65 73  .if (pcsc_getres
b950: 70 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f  p_ret != CACKEY_
b960: 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09  PCSC_S_OK) {....
b970: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
b980: 4e 54 46 28 22 42 75 66 66 65 72 20 72 65 61 64  NTF("Buffer read
b990: 20 66 61 69 6c 65 64 21 20 20 52 65 74 75 72 6e   failed!  Return
b9a0: 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29  ing in failure")
b9b0: 3b 0a 0a 09 09 09 2f 2a 20 45 6e 64 20 53 6d 61  ;...../* End Sma
b9c0: 72 74 63 61 72 64 20 54 72 61 6e 73 61 63 74 69  rtcard Transacti
b9d0: 6f 6e 20 2a 2f 0a 09 09 09 63 61 63 6b 65 79 5f  on */....cackey_
b9e0: 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
b9f0: 73 6c 6f 74 29 3b 0a 0a 09 09 09 69 66 20 28 70  slot);.....if (p
ba00: 63 73 63 5f 67 65 74 72 65 73 70 5f 72 65 74 20  csc_getresp_ret 
ba10: 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  == CACKEY_PCSC_E
ba20: 5f 52 45 54 52 59 29 20 7b 0a 09 09 09 09 72 65  _RETRY) {.....re
ba30: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
ba40: 5f 45 5f 52 45 54 52 59 29 3b 0a 09 09 09 7d 0a  _E_RETRY);....}.
ba50: 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ....return(CACKE
ba60: 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43  Y_PCSC_E_GENERIC
ba70: 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 72 65  );...}....if (re
ba80: 73 70 64 61 74 61 5f 6c 65 6e 29 20 7b 0a 09 09  spdata_len) {...
ba90: 09 2a 72 65 73 70 64 61 74 61 5f 6c 65 6e 20 2b  .*respdata_len +
baa0: 3d 20 74 6d 70 5f 72 65 73 70 64 61 74 61 5f 6c  = tmp_respdata_l
bab0: 65 6e 3b 0a 09 09 7d 0a 0a 09 09 2f 2a 20 45 6e  en;...}..../* En
bac0: 64 20 53 6d 61 72 74 63 61 72 64 20 54 72 61 6e  d Smartcard Tran
bad0: 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 09 63 61 63  saction */...cac
bae0: 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  key_end_transact
baf0: 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 43 41  ion(slot);....CA
bb00: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
bb10: 46 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e 20  F("Returning in 
bb20: 73 75 63 63 65 73 73 20 28 62 75 66 66 65 72 20  success (buffer 
bb30: 72 65 61 64 20 63 6f 6d 70 6c 65 74 65 29 22 29  read complete)")
bb40: 3b 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ;...return(CACKE
bb50: 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 09 7d  Y_PCSC_S_OK);..}
bb60: 0a 0a 09 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63  .../* End Smartc
bb70: 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20  ard Transaction 
bb80: 2a 2f 0a 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74  */..cackey_end_t
bb90: 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29  ransaction(slot)
bba0: 3b 0a 0a 09 69 66 20 28 6d 61 6a 6f 72 5f 72 63  ;...if (major_rc
bbb0: 20 3d 3d 20 30 78 39 30 29 20 7b 0a 09 09 2f 2a   == 0x90) {.../*
bbc0: 20 53 75 63 63 65 73 73 20 2a 2f 0a 09 09 43 41   Success */...CA
bbd0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
bbe0: 46 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e 20  F("Returning in 
bbf0: 73 75 63 63 65 73 73 20 28 6d 61 6a 6f 72 5f 72  success (major_r
bc00: 63 20 3d 20 30 78 39 30 29 22 29 3b 0a 0a 09 09  c = 0x90)");....
bc10: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
bc20: 53 43 5f 53 5f 4f 4b 29 3b 0a 09 7d 0a 0a 0a 09  SC_S_OK);..}....
bc30: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
bc40: 4e 54 46 28 22 41 50 44 55 20 52 65 74 75 72 6e  NTF("APDU Return
bc50: 65 64 20 61 6e 20 65 72 72 6f 72 2c 20 72 65 74  ed an error, ret
bc60: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
bc70: 65 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41  e");...return(CA
bc80: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45  CKEY_PCSC_E_GENE
bc90: 52 49 43 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  RIC);.}..static 
bca0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 63  unsigned char *c
bcb0: 61 63 6b 65 79 5f 72 65 61 64 5f 62 65 72 74 6c  ackey_read_bertl
bcc0: 76 5f 74 61 67 28 75 6e 73 69 67 6e 65 64 20 63  v_tag(unsigned c
bcd0: 68 61 72 20 2a 62 75 66 66 65 72 2c 20 73 69 7a  har *buffer, siz
bce0: 65 5f 74 20 2a 62 75 66 66 65 72 5f 6c 65 6e 5f  e_t *buffer_len_
bcf0: 70 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  p, unsigned char
bd00: 20 74 61 67 2c 20 75 6e 73 69 67 6e 65 64 20 63   tag, unsigned c
bd10: 68 61 72 20 2a 6f 75 74 62 75 66 66 65 72 2c 20  har *outbuffer, 
bd20: 73 69 7a 65 5f 74 20 2a 6f 75 74 62 75 66 66 65  size_t *outbuffe
bd30: 72 5f 6c 65 6e 5f 70 29 20 7b 0a 09 75 6e 73 69  r_len_p) {..unsi
bd40: 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 66 65  gned char *buffe
bd50: 72 5f 70 3b 0a 09 73 69 7a 65 5f 74 20 6f 75 74  r_p;..size_t out
bd60: 62 75 66 66 65 72 5f 6c 65 6e 2c 20 62 75 66 66  buffer_len, buff
bd70: 65 72 5f 6c 65 6e 3b 0a 09 73 69 7a 65 5f 74 20  er_len;..size_t 
bd80: 73 69 7a 65 3b 0a 09 69 6e 74 20 69 64 78 3b 0a  size;..int idx;.
bd90: 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
bda0: 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
bdb0: 3b 0a 0a 09 69 66 20 28 62 75 66 66 65 72 5f 6c  ;...if (buffer_l
bdc0: 65 6e 5f 70 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  en_p == NULL) {.
bdd0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
bde0: 52 49 4e 54 46 28 22 62 75 66 66 65 72 5f 6c 65  RINTF("buffer_le
bdf0: 6e 5f 70 20 69 73 20 4e 55 4c 4c 2e 20 20 52 65  n_p is NULL.  Re
be00: 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
be10: 72 65 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  re.");....return
be20: 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 69 66 20  (NULL);..}...if 
be30: 28 6f 75 74 62 75 66 66 65 72 5f 6c 65 6e 5f 70  (outbuffer_len_p
be40: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
be50: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
be60: 46 28 22 6f 75 74 62 75 66 66 65 72 5f 6c 65 6e  F("outbuffer_len
be70: 5f 70 20 69 73 20 4e 55 4c 4c 2e 20 20 52 65 74  _p is NULL.  Ret
be80: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
be90: 65 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  e.");....return(
bea0: 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 62 75 66 66  NULL);..}...buff
beb0: 65 72 5f 6c 65 6e 20 3d 20 2a 6f 75 74 62 75 66  er_len = *outbuf
bec0: 66 65 72 5f 6c 65 6e 5f 70 3b 0a 09 6f 75 74 62  fer_len_p;..outb
bed0: 75 66 66 65 72 5f 6c 65 6e 20 3d 20 2a 6f 75 74  uffer_len = *out
bee0: 62 75 66 66 65 72 5f 6c 65 6e 5f 70 3b 0a 0a 09  buffer_len_p;...
bef0: 69 66 20 28 62 75 66 66 65 72 5f 6c 65 6e 20 3c  if (buffer_len <
bf00: 20 32 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   2) {...CACKEY_D
bf10: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 62 75 66  EBUG_PRINTF("buf
bf20: 66 65 72 5f 6c 65 6e 20 69 73 20 6c 65 73 73 20  fer_len is less 
bf30: 74 68 61 6e 20 32 2c 20 73 6f 20 77 65 20 63 61  than 2, so we ca
bf40: 6e 27 74 20 72 65 61 64 20 61 6e 79 20 74 61 67  n't read any tag
bf50: 2e 20 20 52 65 74 75 72 6e 69 6e 67 20 69 6e 20  .  Returning in 
bf60: 66 61 69 6c 75 72 65 2e 22 29 3b 0a 0a 09 09 72  failure.");....r
bf70: 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a  eturn(NULL);..}.
bf80: 0a 09 62 75 66 66 65 72 5f 70 20 3d 20 62 75 66  ..buffer_p = buf
bf90: 66 65 72 3b 0a 09 69 66 20 28 62 75 66 66 65 72  fer;..if (buffer
bfa0: 5f 70 5b 30 5d 20 21 3d 20 74 61 67 29 20 7b 0a  _p[0] != tag) {.
bfb0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
bfc0: 52 49 4e 54 46 28 22 54 61 67 20 66 6f 75 6e 64  RINTF("Tag found
bfd0: 20 77 61 73 20 6e 6f 74 20 74 61 67 20 65 78 70   was not tag exp
bfe0: 65 63 74 65 64 2e 20 20 54 61 67 20 3d 20 25 30  ected.  Tag = %0
bff0: 32 78 2c 20 45 78 70 65 63 74 65 64 20 3d 20 25  2x, Expected = %
c000: 30 32 78 2e 20 20 52 65 74 75 72 6e 69 6e 67 20  02x.  Returning 
c010: 69 6e 20 66 61 69 6c 75 72 65 2e 22 2c 20 28 75  in failure.", (u
c020: 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 62 75 66  nsigned int) buf
c030: 66 65 72 5f 70 5b 30 5d 2c 20 74 61 67 29 3b 0a  fer_p[0], tag);.
c040: 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b  ...return(NULL);
c050: 0a 09 7d 0a 0a 09 62 75 66 66 65 72 5f 70 2b 2b  ..}...buffer_p++
c060: 3b 0a 09 62 75 66 66 65 72 5f 6c 65 6e 2d 2d 3b  ;..buffer_len--;
c070: 0a 0a 09 69 66 20 28 28 62 75 66 66 65 72 5f 70  ...if ((buffer_p
c080: 5b 30 5d 20 26 20 30 78 38 30 29 20 3d 3d 20 30  [0] & 0x80) == 0
c090: 78 38 30 29 20 7b 0a 09 09 73 69 7a 65 20 3d 20  x80) {...size = 
c0a0: 30 3b 0a 09 09 69 64 78 20 3d 20 28 62 75 66 66  0;...idx = (buff
c0b0: 65 72 5f 70 5b 30 5d 20 26 20 30 78 37 66 29 3b  er_p[0] & 0x7f);
c0c0: 0a 0a 09 09 69 66 20 28 69 64 78 20 3e 20 62 75  ....if (idx > bu
c0d0: 66 66 65 72 5f 6c 65 6e 29 20 7b 0a 09 09 09 43  ffer_len) {....C
c0e0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
c0f0: 54 46 28 22 4d 61 6c 66 6f 72 6d 65 64 20 42 45  TF("Malformed BE
c100: 52 20 76 61 6c 75 65 20 2d 2d 20 6e 6f 74 20 65  R value -- not e
c110: 6e 6f 75 67 68 20 62 79 74 65 73 20 61 76 61 69  nough bytes avai
c120: 6c 61 62 6c 65 20 74 6f 20 72 65 61 64 20 6c 65  lable to read le
c130: 6e 67 74 68 20 28 69 64 78 20 3d 20 25 69 2c 20  ngth (idx = %i, 
c140: 62 75 66 66 65 72 5f 6c 65 6e 20 3d 20 25 6c 75  buffer_len = %lu
c150: 29 22 2c 20 69 64 78 2c 20 28 75 6e 73 69 67 6e  )", idx, (unsign
c160: 65 64 20 6c 6f 6e 67 29 20 62 75 66 66 65 72 5f  ed long) buffer_
c170: 6c 65 6e 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e  len);.....return
c180: 28 4e 55 4c 4c 29 3b 0a 09 09 7d 0a 0a 09 09 66  (NULL);...}....f
c190: 6f 72 20 28 3b 20 69 64 78 20 3e 20 30 3b 20 69  or (; idx > 0; i
c1a0: 64 78 2d 2d 29 20 7b 0a 09 09 09 62 75 66 66 65  dx--) {....buffe
c1b0: 72 5f 70 2b 2b 3b 0a 09 09 09 62 75 66 66 65 72  r_p++;....buffer
c1c0: 5f 6c 65 6e 2d 2d 3b 0a 0a 09 09 09 73 69 7a 65  _len--;.....size
c1d0: 20 3c 3c 3d 20 38 3b 0a 09 09 09 73 69 7a 65 20   <<= 8;....size 
c1e0: 7c 3d 20 62 75 66 66 65 72 5f 70 5b 30 5d 3b 0a  |= buffer_p[0];.
c1f0: 09 09 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09  ..}..} else {...
c200: 73 69 7a 65 20 3d 20 62 75 66 66 65 72 5f 70 5b  size = buffer_p[
c210: 30 5d 3b 0a 09 7d 0a 0a 09 62 75 66 66 65 72 5f  0];..}...buffer_
c220: 70 2b 2b 3b 0a 09 62 75 66 66 65 72 5f 6c 65 6e  p++;..buffer_len
c230: 2d 2d 3b 0a 0a 09 69 66 20 28 73 69 7a 65 20 3e  --;...if (size >
c240: 20 6f 75 74 62 75 66 66 65 72 5f 6c 65 6e 29 20   outbuffer_len) 
c250: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
c260: 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20  _PRINTF("Unable 
c270: 74 6f 20 63 6f 70 79 20 76 61 6c 75 65 20 62 75  to copy value bu
c280: 66 66 65 72 20 74 6f 20 6f 75 74 62 75 66 66 65  ffer to outbuffe
c290: 72 2c 20 6e 6f 74 20 65 6e 6f 75 67 68 20 72 6f  r, not enough ro
c2a0: 6f 6d 2e 20 20 56 61 6c 75 65 20 62 75 66 66 65  om.  Value buffe
c2b0: 72 20 6c 65 6e 67 74 68 20 3d 20 25 6c 75 2c 20  r length = %lu, 
c2c0: 6f 75 74 20 62 75 66 66 65 72 20 6c 65 6e 67 74  out buffer lengt
c2d0: 68 20 3d 20 25 6c 75 22 2c 20 28 75 6e 73 69 67  h = %lu", (unsig
c2e0: 6e 65 64 20 6c 6f 6e 67 29 20 73 69 7a 65 2c 20  ned long) size, 
c2f0: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
c300: 6f 75 74 62 75 66 66 65 72 5f 6c 65 6e 29 3b 0a  outbuffer_len);.
c310: 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b  ...return(NULL);
c320: 0a 09 7d 0a 0a 09 2a 6f 75 74 62 75 66 66 65 72  ..}...*outbuffer
c330: 5f 6c 65 6e 5f 70 20 3d 20 73 69 7a 65 3b 0a 09  _len_p = size;..
c340: 69 66 20 28 6f 75 74 62 75 66 66 65 72 29 20 7b  if (outbuffer) {
c350: 0a 09 09 6d 65 6d 63 70 79 28 6f 75 74 62 75 66  ...memcpy(outbuf
c360: 66 65 72 2c 20 62 75 66 66 65 72 5f 70 2c 20 73  fer, buffer_p, s
c370: 69 7a 65 29 3b 0a 09 09 62 75 66 66 65 72 5f 70  ize);...buffer_p
c380: 20 2b 3d 20 73 69 7a 65 3b 0a 09 09 62 75 66 66   += size;...buff
c390: 65 72 5f 6c 65 6e 20 2d 3d 20 73 69 7a 65 3b 0a  er_len -= size;.
c3a0: 0a 09 09 2a 62 75 66 66 65 72 5f 6c 65 6e 5f 70  ...*buffer_len_p
c3b0: 20 3d 20 62 75 66 66 65 72 5f 6c 65 6e 3b 0a 0a   = buffer_len;..
c3c0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
c3d0: 52 49 4e 54 42 55 46 28 22 42 45 52 2d 54 4c 56  RINTBUF("BER-TLV
c3e0: 20 72 65 73 75 6c 74 73 3a 22 2c 20 6f 75 74 62   results:", outb
c3f0: 75 66 66 65 72 2c 20 73 69 7a 65 29 3b 0a 09 7d  uffer, size);..}
c400: 20 65 6c 73 65 20 7b 0a 09 09 6d 65 6d 6d 6f 76   else {...memmov
c410: 65 28 62 75 66 66 65 72 2c 20 62 75 66 66 65 72  e(buffer, buffer
c420: 5f 70 2c 20 73 69 7a 65 29 3b 0a 09 09 62 75 66  _p, size);...buf
c430: 66 65 72 5f 70 20 3d 20 62 75 66 66 65 72 3b 0a  fer_p = buffer;.
c440: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
c450: 50 52 49 4e 54 42 55 46 28 22 42 45 52 2d 54 4c  PRINTBUF("BER-TL
c460: 56 20 72 65 73 75 6c 74 73 3a 22 2c 20 62 75 66  V results:", buf
c470: 66 65 72 2c 20 73 69 7a 65 29 3b 0a 09 7d 0a 0a  fer, size);..}..
c480: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
c490: 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
c4a0: 69 6e 20 73 75 63 63 65 73 73 2e 20 20 53 69 7a  in success.  Siz
c4b0: 65 20 6f 66 20 63 6f 6e 74 65 6e 74 73 20 66 6f  e of contents fo
c4c0: 72 20 74 61 67 20 25 30 32 78 20 69 73 20 25 6c  r tag %02x is %l
c4d0: 75 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 69 6e  u", (unsigned in
c4e0: 74 29 20 74 61 67 2c 20 28 75 6e 73 69 67 6e 65  t) tag, (unsigne
c4f0: 64 20 6c 6f 6e 67 29 20 73 69 7a 65 29 3b 0a 0a  d long) size);..
c500: 09 72 65 74 75 72 6e 28 62 75 66 66 65 72 5f 70  .return(buffer_p
c510: 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50  );.}../*. * SYNP
c520: 4f 53 49 53 0a 20 2a 20 20 20 20 20 73 73 69 7a  OSIS. *     ssiz
c530: 65 5f 74 20 63 61 63 6b 65 79 5f 67 65 74 5f 64  e_t cackey_get_d
c540: 61 74 61 28 73 74 72 75 63 74 20 63 61 63 6b 65  ata(struct cacke
c550: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e  y_slot *slot, un
c560: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66  signed char *buf
c570: 66 65 72 2c 20 73 69 7a 65 5f 74 20 62 75 66 66  fer, size_t buff
c580: 65 72 5f 6c 65 6e 2c 20 75 6e 73 69 67 6e 65 64  er_len, unsigned
c590: 20 63 68 61 72 20 6f 69 64 5b 33 5d 29 3b 0a 20   char oid[3]);. 
c5a0: 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20  *. * ARGUMENTS. 
c5b0: 2a 20 20 20 20 20 73 74 72 75 63 74 20 63 61 63  *     struct cac
c5c0: 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20  key_slot *slot. 
c5d0: 2a 20 20 20 20 20 20 20 20 20 53 6c 6f 74 20 74  *         Slot t
c5e0: 6f 20 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20  o send commands 
c5f0: 74 6f 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73  to. *. *     uns
c600: 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 66  igned char *buff
c610: 65 72 0a 20 2a 20 20 20 20 20 20 20 20 20 5b 4f  er. *         [O
c620: 55 54 5d 20 42 75 66 66 65 72 0a 20 2a 0a 20 2a  UT] Buffer. *. *
c630: 20 20 20 20 20 73 69 7a 65 5f 74 20 62 75 66 66       size_t buff
c640: 65 72 5f 6c 65 6e 0a 20 2a 20 20 20 20 20 20 20  er_len. *       
c650: 20 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65    Number of byte
c660: 73 20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f 20  s to attempt to 
c670: 72 65 61 64 0a 20 2a 0a 20 2a 20 20 20 20 20 75  read. *. *     u
c680: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6f 69 64  nsigned char oid
c690: 5b 33 5d 0a 20 2a 20 20 20 20 20 20 20 20 20 33  [3]. *         3
c6a0: 2d 62 79 74 65 20 4f 49 44 20 74 6f 20 72 65 61  -byte OID to rea
c6b0: 64 0a 20 2a 0a 20 2a 0a 20 2a 20 52 45 54 55 52  d. *. *. * RETUR
c6c0: 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 54  N VALUE. *     T
c6d0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
c6e0: 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20  urns the number 
c6f0: 6f 66 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c  of bytes actuall
c700: 79 20 72 65 61 64 2c 20 6f 72 20 2d 31 20 6f 6e  y read, or -1 on
c710: 20 65 72 72 6f 72 2e 0a 20 2a 0a 20 2a 20 4e 4f   error.. *. * NO
c720: 54 45 53 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a  TES. *     None.
c730: 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 73 73   *. */.static ss
c740: 69 7a 65 5f 74 20 63 61 63 6b 65 79 5f 67 65 74  ize_t cackey_get
c750: 5f 64 61 74 61 28 73 74 72 75 63 74 20 63 61 63  _data(struct cac
c760: 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20  key_slot *slot, 
c770: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62  unsigned char *b
c780: 75 66 66 65 72 2c 20 73 69 7a 65 5f 74 20 62 75  uffer, size_t bu
c790: 66 66 65 72 5f 6c 65 6e 2c 20 75 6e 73 69 67 6e  ffer_len, unsign
c7a0: 65 64 20 63 68 61 72 20 6f 69 64 5b 33 5d 29 20  ed char oid[3]) 
c7b0: 7b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72  {..unsigned char
c7c0: 20 63 6d 64 5b 5d 20 3d 20 7b 30 78 35 43 2c 20   cmd[] = {0x5C, 
c7d0: 30 78 30 33 2c 20 30 78 30 30 2c 20 30 78 30 30  0x03, 0x00, 0x00
c7e0: 2c 20 30 78 30 30 7d 3b 0a 09 75 6e 73 69 67 6e  , 0x00};..unsign
c7f0: 65 64 20 63 68 61 72 20 2a 62 75 66 66 65 72 5f  ed char *buffer_
c800: 70 3b 0a 09 73 69 7a 65 5f 74 20 69 6e 69 74 5f  p;..size_t init_
c810: 62 75 66 66 65 72 5f 6c 65 6e 2c 20 73 69 7a 65  buffer_len, size
c820: 3b 0a 09 75 69 6e 74 31 36 5f 74 20 72 65 73 70  ;..uint16_t resp
c830: 63 6f 64 65 3b 0a 09 69 6e 74 20 73 65 6e 64 5f  code;..int send_
c840: 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ret;...CACKEY_DE
c850: 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
c860: 65 64 2e 22 29 3b 0a 0a 09 69 6e 69 74 5f 62 75  ed.");...init_bu
c870: 66 66 65 72 5f 6c 65 6e 20 3d 20 62 75 66 66 65  ffer_len = buffe
c880: 72 5f 6c 65 6e 3b 0a 0a 09 63 6d 64 5b 32 5d 20  r_len;...cmd[2] 
c890: 3d 20 6f 69 64 5b 30 5d 3b 0a 09 63 6d 64 5b 33  = oid[0];..cmd[3
c8a0: 5d 20 3d 20 6f 69 64 5b 31 5d 3b 0a 09 63 6d 64  ] = oid[1];..cmd
c8b0: 5b 34 5d 20 3d 20 6f 69 64 5b 32 5d 3b 0a 0a 09  [4] = oid[2];...
c8c0: 2f 2a 20 32 35 36 20 74 6f 20 69 6e 64 69 63 61  /* 256 to indica
c8d0: 74 65 20 74 68 65 20 6c 61 72 67 65 73 74 20 6d  te the largest m
c8e0: 65 73 73 61 67 65 20 73 69 7a 65 20 2d 2d 20 6e  essage size -- n
c8f0: 6f 74 20 63 6c 65 61 72 20 69 66 20 74 68 69 73  ot clear if this
c900: 20 77 69 6c 6c 20 77 6f 72 6b 20 77 69 74 68 20   will work with 
c910: 61 6c 6c 20 6d 65 73 73 61 67 65 73 20 2a 2f 0a  all messages */.
c920: 09 73 65 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b  .send_ret = cack
c930: 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f  ey_send_apdu(slo
c940: 74 2c 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 49  t, GSCIS_CLASS_I
c950: 53 4f 37 38 31 36 2c 20 4e 49 53 54 53 50 38 30  SO7816, NISTSP80
c960: 30 5f 37 33 5f 33 5f 49 4e 53 54 52 5f 47 45 54  0_73_3_INSTR_GET
c970: 5f 44 41 54 41 2c 20 30 78 33 46 2c 20 30 78 46  _DATA, 0x3F, 0xF
c980: 46 2c 20 73 69 7a 65 6f 66 28 63 6d 64 29 2c 20  F, sizeof(cmd), 
c990: 63 6d 64 2c 20 32 35 36 2c 20 26 72 65 73 70 63  cmd, 256, &respc
c9a0: 6f 64 65 2c 20 62 75 66 66 65 72 2c 20 26 62 75  ode, buffer, &bu
c9b0: 66 66 65 72 5f 6c 65 6e 29 3b 0a 0a 09 69 66 20  ffer_len);...if 
c9c0: 28 73 65 6e 64 5f 72 65 74 20 3d 3d 20 43 41 43  (send_ret == CAC
c9d0: 4b 45 59 5f 50 43 53 43 5f 45 5f 52 45 54 52 59  KEY_PCSC_E_RETRY
c9e0: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
c9f0: 55 47 5f 50 52 49 4e 54 46 28 22 41 44 50 55 20  UG_PRINTF("ADPU 
ca00: 53 65 6e 64 69 6e 67 20 66 61 69 6c 65 64 2c 20  Sending failed, 
ca10: 72 65 74 72 79 69 6e 67 20 72 65 61 64 20 62 75  retrying read bu
ca20: 66 66 65 72 22 29 3b 0a 0a 09 09 72 65 74 75 72  ffer");....retur
ca30: 6e 28 63 61 63 6b 65 79 5f 67 65 74 5f 64 61 74  n(cackey_get_dat
ca40: 61 28 73 6c 6f 74 2c 20 62 75 66 66 65 72 2c 20  a(slot, buffer, 
ca50: 69 6e 69 74 5f 62 75 66 66 65 72 5f 6c 65 6e 2c  init_buffer_len,
ca60: 20 6f 69 64 29 29 3b 0a 09 7d 0a 0a 09 69 66 20   oid));..}...if 
ca70: 28 73 65 6e 64 5f 72 65 74 20 21 3d 20 43 41 43  (send_ret != CAC
ca80: 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b  KEY_PCSC_S_OK) {
ca90: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
caa0: 50 52 49 4e 54 46 28 22 63 61 63 6b 65 79 5f 73  PRINTF("cackey_s
cab0: 65 6e 64 5f 61 70 64 75 28 29 20 66 61 69 6c 65  end_apdu() faile
cac0: 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20  d, returning in 
cad0: 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65  failure");....re
cae0: 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 23 69  turn(-1);..}..#i
caf0: 66 64 65 66 20 43 41 43 4b 45 59 5f 50 41 52 41  fdef CACKEY_PARA
cb00: 4e 4f 49 44 0a 23 20 20 69 66 64 65 66 20 5f 50  NOID.#  ifdef _P
cb10: 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58 0a 09  OSIX_SSIZE_MAX..
cb20: 69 66 20 28 62 75 66 66 65 72 5f 6c 65 6e 20 3e  if (buffer_len >
cb30: 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41   _POSIX_SSIZE_MA
cb40: 58 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  X) {...CACKEY_DE
cb50: 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 61 64  BUG_PRINTF("Read
cb60: 20 62 79 74 65 73 20 28 62 75 66 66 65 72 5f 6c   bytes (buffer_l
cb70: 65 6e 29 20 65 78 63 65 65 64 73 20 6d 61 78 69  en) exceeds maxi
cb80: 6d 75 6d 20 76 61 6c 75 65 2c 20 72 65 74 75 72  mum value, retur
cb90: 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 2e  ning in failure.
cba0: 20 28 6d 61 78 20 3d 20 25 6c 69 2c 20 62 75 66   (max = %li, buf
cbb0: 66 65 72 5f 6c 65 6e 20 3d 20 25 6c 75 29 22 2c  fer_len = %lu)",
cbc0: 20 28 6c 6f 6e 67 29 20 5f 50 4f 53 49 58 5f 53   (long) _POSIX_S
cbd0: 53 49 5a 45 5f 4d 41 58 2c 20 28 75 6e 73 69 67  SIZE_MAX, (unsig
cbe0: 6e 65 64 20 6c 6f 6e 67 29 20 62 75 66 66 65 72  ned long) buffer
cbf0: 5f 6c 65 6e 29 3b 0a 0a 09 09 72 65 74 75 72 6e  _len);....return
cc00: 28 2d 31 29 3b 0a 09 7d 0a 23 20 20 65 6e 64 69  (-1);..}.#  endi
cc10: 66 0a 23 65 6e 64 69 66 0a 0a 09 69 66 20 28 62  f.#endif...if (b
cc20: 75 66 66 65 72 5f 6c 65 6e 20 3c 20 32 29 20 7b  uffer_len < 2) {
cc30: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
cc40: 50 52 49 4e 54 46 28 22 41 50 44 55 20 47 45 54  PRINTF("APDU GET
cc50: 20 44 41 54 41 20 72 65 74 75 72 6e 65 64 20 25   DATA returned %
cc60: 6c 75 20 62 79 74 65 73 2c 20 77 68 69 63 68 20  lu bytes, which 
cc70: 69 73 20 74 6f 6f 20 73 68 6f 72 74 20 66 6f 72  is too short for
cc80: 20 61 20 42 45 52 2d 54 4c 56 20 72 65 73 70 6f   a BER-TLV respo
cc90: 6e 73 65 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  nse", (unsigned 
cca0: 6c 6f 6e 67 29 20 62 75 66 66 65 72 5f 6c 65 6e  long) buffer_len
ccb0: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29  );....return(-1)
ccc0: 3b 0a 09 7d 0a 0a 09 73 69 7a 65 20 3d 20 62 75  ;..}...size = bu
ccd0: 66 66 65 72 5f 6c 65 6e 3b 0a 09 62 75 66 66 65  ffer_len;..buffe
cce0: 72 5f 70 20 3d 20 63 61 63 6b 65 79 5f 72 65 61  r_p = cackey_rea
ccf0: 64 5f 62 65 72 74 6c 76 5f 74 61 67 28 62 75 66  d_bertlv_tag(buf
cd00: 66 65 72 2c 20 26 62 75 66 66 65 72 5f 6c 65 6e  fer, &buffer_len
cd10: 2c 20 30 78 35 33 2c 20 4e 55 4c 4c 2c 20 26 73  , 0x53, NULL, &s
cd20: 69 7a 65 29 3b 0a 0a 09 69 66 20 28 62 75 66 66  ize);...if (buff
cd30: 65 72 5f 70 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  er_p == NULL) {.
cd40: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
cd50: 52 49 4e 54 46 28 22 54 61 67 20 64 65 63 6f 64  RINTF("Tag decod
cd60: 69 6e 67 20 66 61 69 6c 65 64 2c 20 72 65 74 75  ing failed, retu
cd70: 72 6e 69 6e 67 20 69 6e 20 65 72 72 6f 72 2e 22  rning in error."
cd80: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29  );....return(-1)
cd90: 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
cda0: 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22 47 45  BUG_PRINTBUF("GE
cdb0: 54 20 44 41 54 41 20 72 65 73 75 6c 74 22 2c 20  T DATA result", 
cdc0: 62 75 66 66 65 72 2c 20 73 69 7a 65 29 3b 0a 0a  buffer, size);..
cdd0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
cde0: 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
cdf0: 69 6e 20 73 75 63 63 65 73 73 2c 20 72 65 61 64  in success, read
ce00: 20 25 6c 75 20 62 79 74 65 73 22 2c 20 28 75 6e   %lu bytes", (un
ce10: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69 7a  signed long) siz
ce20: 65 29 3b 0a 0a 09 72 65 74 75 72 6e 28 73 69 7a  e);...return(siz
ce30: 65 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e  e);.}../*. * SYN
ce40: 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 73 73 69  POSIS. *     ssi
ce50: 7a 65 5f 74 20 63 61 63 6b 65 79 5f 72 65 61 64  ze_t cackey_read
ce60: 5f 62 75 66 66 65 72 28 73 74 72 75 63 74 20 63  _buffer(struct c
ce70: 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74  ackey_slot *slot
ce80: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
ce90: 2a 62 75 66 66 65 72 2c 20 73 69 7a 65 5f 74 20  *buffer, size_t 
cea0: 63 6f 75 6e 74 2c 20 75 6e 73 69 67 6e 65 64 20  count, unsigned 
ceb0: 63 68 61 72 20 74 5f 6f 72 5f 76 2c 20 73 69 7a  char t_or_v, siz
cec0: 65 5f 74 20 69 6e 69 74 69 61 6c 5f 6f 66 66 73  e_t initial_offs
ced0: 65 74 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d  et);. *. * ARGUM
cee0: 45 4e 54 53 0a 20 2a 20 20 20 20 20 73 74 72 75  ENTS. *     stru
cef0: 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a  ct cackey_slot *
cf00: 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20  slot. *         
cf10: 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d  Slot to send com
cf20: 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 20  mands to. *. *  
cf30: 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
cf40: 20 2a 62 75 66 66 65 72 0a 20 2a 20 20 20 20 20   *buffer. *     
cf50: 20 20 20 20 5b 4f 55 54 5d 20 42 75 66 66 65 72      [OUT] Buffer
cf60: 0a 20 2a 0a 20 2a 20 20 20 20 20 73 69 7a 65 5f  . *. *     size_
cf70: 74 20 63 6f 75 6e 74 0a 20 2a 20 20 20 20 20 20  t count. *      
cf80: 20 20 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74     Number of byt
cf90: 65 73 20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f  es to attempt to
cfa0: 20 72 65 61 64 0a 20 2a 0a 20 2a 20 20 20 20 20   read. *. *     
cfb0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 74 5f  unsigned char t_
cfc0: 6f 72 5f 76 0a 20 2a 20 20 20 20 20 20 20 20 20  or_v. *         
cfd0: 53 65 6c 65 63 74 20 74 68 65 20 54 2d 62 75 66  Select the T-buf
cfe0: 66 65 72 20 28 30 31 29 20 6f 72 20 56 2d 62 75  fer (01) or V-bu
cff0: 66 66 65 72 20 28 30 32 29 20 74 6f 20 72 65 61  ffer (02) to rea
d000: 64 20 66 72 6f 6d 2e 20 20 0a 20 2a 0a 20 2a 20  d from.  . *. * 
d010: 20 20 20 20 73 69 7a 65 5f 74 20 69 6e 69 74 69      size_t initi
d020: 61 6c 5f 6f 66 66 73 65 74 0a 20 2a 20 20 20 20  al_offset. *    
d030: 20 20 20 20 20 53 70 65 63 69 66 79 20 74 68 65       Specify the
d040: 20 6f 66 66 73 65 74 20 74 6f 20 62 65 67 69 6e   offset to begin
d050: 20 74 68 65 20 72 65 61 64 20 66 72 6f 6d 0a 20   the read from. 
d060: 2a 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56  *. *. * RETURN V
d070: 41 4c 55 45 0a 20 2a 20 20 20 20 20 54 68 69 73  ALUE. *     This
d080: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
d090: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
d0a0: 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20 72  bytes actually r
d0b0: 65 61 64 2c 20 6f 72 20 2d 31 20 6f 6e 20 65 72  ead, or -1 on er
d0c0: 72 6f 72 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53  ror.. *. * NOTES
d0d0: 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a  . *     None. *.
d0e0: 20 2a 2f 0a 73 74 61 74 69 63 20 73 73 69 7a 65   */.static ssize
d0f0: 5f 74 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 62  _t cackey_read_b
d100: 75 66 66 65 72 28 73 74 72 75 63 74 20 63 61 63  uffer(struct cac
d110: 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20  key_slot *slot, 
d120: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62  unsigned char *b
d130: 75 66 66 65 72 2c 20 73 69 7a 65 5f 74 20 63 6f  uffer, size_t co
d140: 75 6e 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  unt, unsigned ch
d150: 61 72 20 74 5f 6f 72 5f 76 2c 20 73 69 7a 65 5f  ar t_or_v, size_
d160: 74 20 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65 74  t initial_offset
d170: 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68  ) {..unsigned ch
d180: 61 72 20 2a 69 6e 69 74 5f 62 75 66 66 65 72 3b  ar *init_buffer;
d190: 0a 09 73 69 7a 65 5f 74 20 69 6e 69 74 5f 63 6f  ..size_t init_co
d1a0: 75 6e 74 3b 0a 09 73 69 7a 65 5f 74 20 69 6e 69  unt;..size_t ini
d1b0: 74 5f 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65 74  t_initial_offset
d1c0: 3b 0a 0a 09 73 69 7a 65 5f 74 20 6f 66 66 73 65  ;...size_t offse
d1d0: 74 20 3d 20 30 2c 20 6d 61 78 5f 6f 66 66 73 65  t = 0, max_offse
d1e0: 74 2c 20 6d 61 78 5f 63 6f 75 6e 74 3b 0a 09 75  t, max_count;..u
d1f0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63 6d 64  nsigned char cmd
d200: 5b 32 5d 3b 0a 09 75 69 6e 74 31 36 5f 74 20 72  [2];..uint16_t r
d210: 65 73 70 63 6f 64 65 3b 0a 09 69 6e 74 20 73 65  espcode;..int se
d220: 6e 64 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59  nd_ret;...CACKEY
d230: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
d240: 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 6e 69 74  alled.");...init
d250: 5f 62 75 66 66 65 72 20 3d 20 62 75 66 66 65 72  _buffer = buffer
d260: 3b 0a 09 69 6e 69 74 5f 63 6f 75 6e 74 20 3d 20  ;..init_count = 
d270: 63 6f 75 6e 74 3b 0a 09 69 6e 69 74 5f 69 6e 69  count;..init_ini
d280: 74 69 61 6c 5f 6f 66 66 73 65 74 20 3d 20 69 6e  tial_offset = in
d290: 69 74 69 61 6c 5f 6f 66 66 73 65 74 3b 0a 0a 09  itial_offset;...
d2a0: 6d 61 78 5f 6f 66 66 73 65 74 20 3d 20 63 6f 75  max_offset = cou
d2b0: 6e 74 3b 0a 09 6d 61 78 5f 63 6f 75 6e 74 20 3d  nt;..max_count =
d2c0: 20 43 41 43 4b 45 59 5f 41 50 44 55 5f 4d 54 55   CACKEY_APDU_MTU
d2d0: 3b 0a 0a 09 69 66 20 28 74 5f 6f 72 5f 76 20 21  ;...if (t_or_v !
d2e0: 3d 20 31 20 26 26 20 74 5f 6f 72 5f 76 20 21 3d  = 1 && t_or_v !=
d2f0: 20 32 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   2) {...CACKEY_D
d300: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 49 6e 76  EBUG_PRINTF("Inv
d310: 61 6c 69 64 20 54 20 6f 72 20 56 20 70 61 72 61  alid T or V para
d320: 6d 65 74 65 72 20 73 70 65 63 69 66 69 65 64 2c  meter specified,
d330: 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61   returning in fa
d340: 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75  ilure");....retu
d350: 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 63 6d 64  rn(-1);..}...cmd
d360: 5b 30 5d 20 3d 20 74 5f 6f 72 5f 76 3b 0a 0a 09  [0] = t_or_v;...
d370: 77 68 69 6c 65 20 28 31 29 20 7b 0a 09 09 69 66  while (1) {...if
d380: 20 28 6f 66 66 73 65 74 20 3e 3d 20 6d 61 78 5f   (offset >= max_
d390: 6f 66 66 73 65 74 29 20 7b 0a 09 09 09 43 41 43  offset) {....CAC
d3a0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
d3b0: 28 22 42 75 66 66 65 72 20 74 6f 6f 20 73 6d 61  ("Buffer too sma
d3c0: 6c 6c 2c 20 72 65 74 75 72 6e 69 6e 67 20 77 68  ll, returning wh
d3d0: 61 74 20 77 65 20 67 6f 74 2e 2e 2e 22 29 3b 0a  at we got...");.
d3e0: 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a  ....break;...}..
d3f0: 09 09 63 6f 75 6e 74 20 3d 20 6d 61 78 5f 6f 66  ..count = max_of
d400: 66 73 65 74 20 2d 20 6f 66 66 73 65 74 3b 0a 09  fset - offset;..
d410: 09 69 66 20 28 63 6f 75 6e 74 20 3e 20 6d 61 78  .if (count > max
d420: 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 09 63 6f 75  _count) {....cou
d430: 6e 74 20 3d 20 6d 61 78 5f 63 6f 75 6e 74 3b 0a  nt = max_count;.
d440: 09 09 7d 0a 0a 09 09 63 6d 64 5b 31 5d 20 3d 20  ..}....cmd[1] = 
d450: 63 6f 75 6e 74 3b 0a 0a 09 09 73 65 6e 64 5f 72  count;....send_r
d460: 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64  et = cackey_send
d470: 5f 61 70 64 75 28 73 6c 6f 74 2c 20 47 53 43 49  _apdu(slot, GSCI
d480: 53 5f 43 4c 41 53 53 5f 47 4c 4f 42 41 4c 5f 50  S_CLASS_GLOBAL_P
d490: 4c 41 54 46 4f 52 4d 2c 20 47 53 43 49 53 5f 49  LATFORM, GSCIS_I
d4a0: 4e 53 54 52 5f 52 45 41 44 5f 42 55 46 46 45 52  NSTR_READ_BUFFER
d4b0: 2c 20 28 28 69 6e 69 74 69 61 6c 5f 6f 66 66 73  , ((initial_offs
d4c0: 65 74 20 2b 20 6f 66 66 73 65 74 29 20 3e 3e 20  et + offset) >> 
d4d0: 38 29 20 26 20 30 78 66 66 2c 20 28 69 6e 69 74  8) & 0xff, (init
d4e0: 69 61 6c 5f 6f 66 66 73 65 74 20 2b 20 6f 66 66  ial_offset + off
d4f0: 73 65 74 29 20 26 20 30 78 66 66 2c 20 73 69 7a  set) & 0xff, siz
d500: 65 6f 66 28 63 6d 64 29 2c 20 63 6d 64 2c 20 30  eof(cmd), cmd, 0
d510: 78 30 30 2c 20 26 72 65 73 70 63 6f 64 65 2c 20  x00, &respcode, 
d520: 62 75 66 66 65 72 20 2b 20 6f 66 66 73 65 74 2c  buffer + offset,
d530: 20 26 63 6f 75 6e 74 29 3b 0a 0a 09 09 69 66 20   &count);....if 
d540: 28 73 65 6e 64 5f 72 65 74 20 3d 3d 20 43 41 43  (send_ret == CAC
d550: 4b 45 59 5f 50 43 53 43 5f 45 5f 52 45 54 52 59  KEY_PCSC_E_RETRY
d560: 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
d570: 42 55 47 5f 50 52 49 4e 54 46 28 22 41 44 50 55  BUG_PRINTF("ADPU
d580: 20 53 65 6e 64 69 6e 67 20 66 61 69 6c 65 64 2c   Sending failed,
d590: 20 72 65 74 72 79 69 6e 67 20 72 65 61 64 20 62   retrying read b
d5a0: 75 66 66 65 72 22 29 3b 0a 0a 09 09 09 72 65 74  uffer");.....ret
d5b0: 75 72 6e 28 63 61 63 6b 65 79 5f 72 65 61 64 5f  urn(cackey_read_
d5c0: 62 75 66 66 65 72 28 73 6c 6f 74 2c 20 69 6e 69  buffer(slot, ini
d5d0: 74 5f 62 75 66 66 65 72 2c 20 69 6e 69 74 5f 63  t_buffer, init_c
d5e0: 6f 75 6e 74 2c 20 74 5f 6f 72 5f 76 2c 20 69 6e  ount, t_or_v, in
d5f0: 69 74 5f 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65  it_initial_offse
d600: 74 29 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28  t));...}....if (
d610: 73 65 6e 64 5f 72 65 74 20 21 3d 20 43 41 43 4b  send_ret != CACK
d620: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a  EY_PCSC_S_OK) {.
d630: 09 09 09 69 66 20 28 72 65 73 70 63 6f 64 65 20  ...if (respcode 
d640: 3d 3d 20 30 78 36 41 38 36 29 20 7b 0a 09 09 09  == 0x6A86) {....
d650: 09 69 66 20 28 6d 61 78 5f 63 6f 75 6e 74 20 3d  .if (max_count =
d660: 3d 20 31 29 20 7b 0a 09 09 09 09 09 62 72 65 61  = 1) {......brea
d670: 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 6d 61  k;.....}......ma
d680: 78 5f 63 6f 75 6e 74 20 3d 20 6d 61 78 5f 63 6f  x_count = max_co
d690: 75 6e 74 20 2f 20 32 3b 0a 0a 09 09 09 09 63 6f  unt / 2;......co
d6a0: 6e 74 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a 09 09  ntinue;....}....
d6b0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
d6c0: 49 4e 54 46 28 22 63 61 63 6b 65 79 5f 73 65 6e  INTF("cackey_sen
d6d0: 64 5f 61 70 64 75 28 29 20 66 61 69 6c 65 64 2c  d_apdu() failed,
d6e0: 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61   returning in fa
d6f0: 69 6c 75 72 65 22 29 3b 0a 0a 09 09 09 72 65 74  ilure");.....ret
d700: 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09 09  urn(-1);...}....
d710: 6f 66 66 73 65 74 20 2b 3d 20 63 6f 75 6e 74 3b  offset += count;
d720: 0a 0a 09 09 69 66 20 28 63 6f 75 6e 74 20 3c 20  ....if (count < 
d730: 6d 61 78 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 09  max_count) {....
d740: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
d750: 4e 54 46 28 22 53 68 6f 72 74 20 72 65 61 64 20  NTF("Short read 
d760: 2d 2d 20 63 6f 75 6e 74 20 3d 20 25 69 2c 20 63  -- count = %i, c
d770: 6d 64 5b 31 5d 20 3d 20 25 69 22 2c 20 28 69 6e  md[1] = %i", (in
d780: 74 29 20 63 6f 75 6e 74 2c 20 28 69 6e 74 29 20  t) count, (int) 
d790: 63 6d 64 5b 31 5d 29 3b 0a 0a 09 09 09 62 72 65  cmd[1]);.....bre
d7a0: 61 6b 3b 0a 09 09 7d 0a 09 7d 0a 0a 23 69 66 64  ak;...}..}..#ifd
d7b0: 65 66 20 43 41 43 4b 45 59 5f 50 41 52 41 4e 4f  ef CACKEY_PARANO
d7c0: 49 44 0a 23 20 20 69 66 64 65 66 20 5f 50 4f 53  ID.#  ifdef _POS
d7d0: 49 58 5f 53 53 49 5a 45 5f 4d 41 58 0a 09 69 66  IX_SSIZE_MAX..if
d7e0: 20 28 6f 66 66 73 65 74 20 3e 20 5f 50 4f 53 49   (offset > _POSI
d7f0: 58 5f 53 53 49 5a 45 5f 4d 41 58 29 20 7b 0a 09  X_SSIZE_MAX) {..
d800: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
d810: 49 4e 54 46 28 22 4f 66 66 73 65 74 20 65 78 63  INTF("Offset exc
d820: 65 65 64 73 20 6d 61 78 69 6d 75 6d 20 76 61 6c  eeds maximum val
d830: 75 65 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e  ue, returning in
d840: 20 66 61 69 6c 75 72 65 2e 20 28 6d 61 78 20 3d   failure. (max =
d850: 20 25 6c 69 2c 20 6f 66 66 73 65 74 20 3d 20 25   %li, offset = %
d860: 6c 75 29 22 2c 20 28 6c 6f 6e 67 29 20 5f 50 4f  lu)", (long) _PO
d870: 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58 2c 20 28  SIX_SSIZE_MAX, (
d880: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 6f  unsigned long) o
d890: 66 66 73 65 74 29 3b 0a 0a 09 09 72 65 74 75 72  ffset);....retur
d8a0: 6e 28 2d 31 29 3b 0a 09 7d 0a 23 20 20 65 6e 64  n(-1);..}.#  end
d8b0: 69 66 0a 23 65 6e 64 69 66 0a 0a 09 43 41 43 4b  if.#endif...CACK
d8c0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
d8d0: 22 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 73 75  "Returning in su
d8e0: 63 63 65 73 73 2c 20 72 65 61 64 20 25 6c 75 20  ccess, read %lu 
d8f0: 62 79 74 65 73 22 2c 20 28 75 6e 73 69 67 6e 65  bytes", (unsigne
d900: 64 20 6c 6f 6e 67 29 20 6f 66 66 73 65 74 29 3b  d long) offset);
d910: 0a 0a 09 72 65 74 75 72 6e 28 6f 66 66 73 65 74  ...return(offset
d920: 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50  );.}../*. * SYNP
d930: 4f 53 49 53 0a 20 2a 20 20 20 20 20 63 61 63 6b  OSIS. *     cack
d940: 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 73 65  ey_ret cackey_se
d950: 6c 65 63 74 5f 61 70 70 6c 65 74 28 73 74 72 75  lect_applet(stru
d960: 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a  ct cackey_slot *
d970: 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20 63  slot, unsigned c
d980: 68 61 72 20 2a 61 69 64 2c 20 73 69 7a 65 5f 74  har *aid, size_t
d990: 20 61 69 64 5f 6c 65 6e 29 3b 0a 20 2a 0a 20 2a   aid_len);. *. *
d9a0: 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20   ARGUMENTS. *   
d9b0: 20 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f    struct cackey_
d9c0: 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20  slot *slot. *   
d9d0: 20 20 20 20 20 20 53 6c 6f 74 20 74 6f 20 73 65        Slot to se
d9e0: 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20  nd commands to. 
d9f0: 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65  *. *     unsigne
da00: 64 20 63 68 61 72 20 2a 61 69 64 0a 20 2a 20 20  d char *aid. *  
da10: 20 20 20 20 20 20 20 42 75 66 66 65 72 20 63 6f         Buffer co
da20: 6e 74 61 69 6e 69 6e 67 20 41 70 70 6c 65 74 20  ntaining Applet 
da30: 49 44 20 74 6f 20 73 65 6c 65 63 74 0a 20 2a 0a  ID to select. *.
da40: 20 2a 20 20 20 20 20 73 69 7a 65 5f 74 20 61 69   *     size_t ai
da50: 64 5f 6c 65 6e 0a 20 2a 20 20 20 20 20 20 20 20  d_len. *        
da60: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
da70: 20 69 6e 20 74 68 65 20 22 61 69 64 22 20 28 41   in the "aid" (A
da80: 70 70 6c 65 74 20 49 44 29 20 70 61 72 61 6d 65  pplet ID) parame
da90: 74 65 72 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e  ter. *. * RETURN
daa0: 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 43 41   VALUE. *     CA
dab0: 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20  CKEY_PCSC_S_OK  
dac0: 20 20 20 20 20 20 20 4f 6e 20 73 75 63 63 65 73         On succes
dad0: 73 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f  s. *     CACKEY_
dae0: 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 20 20  PCSC_E_GENERIC  
daf0: 20 20 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a 20 2a    On error. *. *
db00: 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 4e 6f   NOTES. *     No
db10: 6e 65 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63  ne. *. */.static
db20: 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b   cackey_ret cack
db30: 65 79 5f 73 65 6c 65 63 74 5f 61 70 70 6c 65 74  ey_select_applet
db40: 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73  (struct cackey_s
db50: 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67  lot *slot, unsig
db60: 6e 65 64 20 63 68 61 72 20 2a 61 69 64 2c 20 73  ned char *aid, s
db70: 69 7a 65 5f 74 20 61 69 64 5f 6c 65 6e 29 20 7b  ize_t aid_len) {
db80: 0a 09 69 6e 74 20 73 65 6e 64 5f 72 65 74 3b 0a  ..int send_ret;.
db90: 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
dba0: 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
dbb0: 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
dbc0: 5f 50 52 49 4e 54 42 55 46 28 22 53 65 6c 65 63  _PRINTBUF("Selec
dbd0: 74 69 6e 67 20 61 70 70 6c 65 74 3a 22 2c 20 61  ting applet:", a
dbe0: 69 64 2c 20 61 69 64 5f 6c 65 6e 29 3b 0a 0a 09  id, aid_len);...
dbf0: 73 65 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b 65  send_ret = cacke
dc00: 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f 74  y_send_apdu(slot
dc10: 2c 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 49 53  , GSCIS_CLASS_IS
dc20: 4f 37 38 31 36 2c 20 47 53 43 49 53 5f 49 4e 53  O7816, GSCIS_INS
dc30: 54 52 5f 53 45 4c 45 43 54 2c 20 47 53 43 49 53  TR_SELECT, GSCIS
dc40: 5f 50 41 52 41 4d 5f 53 45 4c 45 43 54 5f 41 50  _PARAM_SELECT_AP
dc50: 50 4c 45 54 2c 20 30 78 30 30 2c 20 61 69 64 5f  PLET, 0x00, aid_
dc60: 6c 65 6e 2c 20 61 69 64 2c 20 30 78 30 30 2c 20  len, aid, 0x00, 
dc70: 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c  NULL, NULL, NULL
dc80: 29 3b 0a 0a 09 69 66 20 28 73 65 6e 64 5f 72 65  );...if (send_re
dc90: 74 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43  t == CACKEY_PCSC
dca0: 5f 45 5f 52 45 54 52 59 29 20 7b 0a 09 09 43 41  _E_RETRY) {...CA
dcb0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
dcc0: 46 28 22 41 44 50 55 20 53 65 6e 64 69 6e 67 20  F("ADPU Sending 
dcd0: 66 61 69 6c 65 64 2c 20 72 65 74 72 79 69 6e 67  failed, retrying
dce0: 20 73 65 6c 65 63 74 20 61 70 70 6c 65 74 22 29   select applet")
dcf0: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 63 61 63 6b  ;....return(cack
dd00: 65 79 5f 73 65 6c 65 63 74 5f 61 70 70 6c 65 74  ey_select_applet
dd10: 28 73 6c 6f 74 2c 20 61 69 64 2c 20 61 69 64 5f  (slot, aid, aid_
dd20: 6c 65 6e 29 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  len));..}...if (
dd30: 73 65 6e 64 5f 72 65 74 20 21 3d 20 43 41 43 4b  send_ret != CACK
dd40: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a  EY_PCSC_S_OK) {.
dd50: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
dd60: 52 49 4e 54 46 28 22 46 61 69 6c 65 64 20 74 6f  RINTF("Failed to
dd70: 20 6f 70 65 6e 20 61 70 70 6c 65 74 2c 20 72 65   open applet, re
dd80: 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
dd90: 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  re");....return(
dda0: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45  CACKEY_PCSC_E_GE
ddb0: 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 43 41 43  NERIC);..}...CAC
ddc0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
ddd0: 28 22 53 75 63 63 65 73 73 66 75 6c 6c 79 20 73  ("Successfully s
dde0: 65 6c 65 63 74 65 64 20 66 69 6c 65 22 29 3b 0a  elected file");.
ddf0: 0a 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
de00: 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f  PCSC_S_OK);.}../
de10: 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a  *. * SYNPOSIS. *
de20: 20 20 20 20 20 63 61 63 6b 65 79 5f 72 65 74 20       cackey_ret 
de30: 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 66 69  cackey_select_fi
de40: 6c 65 28 73 74 72 75 63 74 20 63 61 63 6b 65 79  le(struct cackey
de50: 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 69 6e  _slot *slot, uin
de60: 74 31 36 5f 74 20 65 66 29 3b 0a 20 2a 0a 20 2a  t16_t ef);. *. *
de70: 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20   ARGUMENTS. *   
de80: 20 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f    struct cackey_
de90: 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20  slot *slot. *   
dea0: 20 20 20 20 20 20 53 6c 6f 74 20 74 6f 20 73 65        Slot to se
deb0: 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20  nd commands to. 
dec0: 2a 0a 20 2a 20 20 20 20 20 75 69 6e 74 31 36 5f  *. *     uint16_
ded0: 74 20 65 66 0a 20 2a 20 20 20 20 20 20 20 20 20  t ef. *         
dee0: 45 6c 65 6d 65 6e 74 61 6c 20 46 69 6c 65 20 74  Elemental File t
def0: 6f 20 73 65 6c 65 63 74 0a 20 2a 0a 20 2a 20 52  o select. *. * R
df00: 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20  ETURN VALUE. *  
df10: 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53     CACKEY_PCSC_S
df20: 5f 4f 4b 20 20 20 20 20 20 20 20 20 4f 6e 20 73  _OK         On s
df30: 75 63 63 65 73 73 0a 20 2a 20 20 20 20 20 43 41  uccess. *     CA
df40: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45  CKEY_PCSC_E_GENE
df50: 52 49 43 20 20 20 20 4f 6e 20 65 72 72 6f 72 0a  RIC    On error.
df60: 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20   *. * NOTES. *  
df70: 20 20 20 54 68 69 73 20 73 65 6c 65 63 74 73 20     This selects 
df80: 61 6e 20 45 6c 65 6d 65 6e 74 61 72 79 20 46 69  an Elementary Fi
df90: 6c 65 20 28 45 46 29 20 75 6e 64 65 72 20 74 68  le (EF) under th
dfa0: 65 20 63 75 72 72 65 6e 74 6c 79 20 73 65 6c 65  e currently sele
dfb0: 63 74 65 64 0a 20 2a 20 20 20 20 20 44 65 64 69  cted. *     Dedi
dfc0: 63 61 74 65 64 20 46 69 6c 65 20 28 44 46 29 0a  cated File (DF).
dfd0: 20 2a 0a 20 2a 20 20 20 20 20 54 79 70 69 63 61   *. *     Typica
dfe0: 6c 6c 79 20 74 68 69 73 20 69 73 20 63 61 6c 6c  lly this is call
dff0: 65 64 20 61 66 74 65 72 20 73 65 6c 65 63 74 69  ed after selecti
e000: 6e 67 20 74 68 65 20 63 6f 72 72 65 63 74 20 41  ng the correct A
e010: 70 70 6c 65 74 20 28 75 73 69 6e 67 0a 20 2a 20  pplet (using. * 
e020: 20 20 20 20 63 61 63 6b 65 79 5f 73 65 6c 65 63      cackey_selec
e030: 74 5f 61 70 70 6c 65 74 29 20 66 6f 72 20 56 4d  t_applet) for VM
e040: 20 63 61 72 64 73 0a 20 2a 0a 20 2a 2f 0a 73 74   cards. *. */.st
e050: 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74 20  atic cackey_ret 
e060: 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 66 69  cackey_select_fi
e070: 6c 65 28 73 74 72 75 63 74 20 63 61 63 6b 65 79  le(struct cackey
e080: 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 69 6e  _slot *slot, uin
e090: 74 31 36 5f 74 20 65 66 29 20 7b 0a 09 75 6e 73  t16_t ef) {..uns
e0a0: 69 67 6e 65 64 20 63 68 61 72 20 66 69 64 5f 62  igned char fid_b
e0b0: 75 66 5b 32 5d 3b 0a 09 69 6e 74 20 73 65 6e 64  uf[2];..int send
e0c0: 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  _ret;...CACKEY_D
e0d0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
e0e0: 6c 65 64 2e 22 29 3b 0a 0a 09 2f 2a 20 4f 70 65  led.");.../* Ope
e0f0: 6e 20 74 68 65 20 65 6c 65 6d 65 6e 74 61 72 79  n the elementary
e100: 20 66 69 6c 65 20 2a 2f 0a 09 66 69 64 5f 62 75   file */..fid_bu
e110: 66 5b 30 5d 20 3d 20 28 65 66 20 3e 3e 20 38 29  f[0] = (ef >> 8)
e120: 20 26 20 30 78 66 66 3b 0a 09 66 69 64 5f 62 75   & 0xff;..fid_bu
e130: 66 5b 31 5d 20 3d 20 65 66 20 26 20 30 78 66 66  f[1] = ef & 0xff
e140: 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
e150: 5f 50 52 49 4e 54 46 28 22 53 65 6c 65 63 74 69  _PRINTF("Selecti
e160: 6e 67 20 66 69 6c 65 3a 20 25 30 34 6c 78 22 2c  ng file: %04lx",
e170: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
e180: 20 65 66 29 3b 0a 0a 09 73 65 6e 64 5f 72 65 74   ef);...send_ret
e190: 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61   = cackey_send_a
e1a0: 70 64 75 28 73 6c 6f 74 2c 20 47 53 43 49 53 5f  pdu(slot, GSCIS_
e1b0: 43 4c 41 53 53 5f 49 53 4f 37 38 31 36 2c 20 47  CLASS_ISO7816, G
e1c0: 53 43 49 53 5f 49 4e 53 54 52 5f 53 45 4c 45 43  SCIS_INSTR_SELEC
e1d0: 54 2c 20 30 78 30 32 2c 20 30 78 30 43 2c 20 73  T, 0x02, 0x0C, s
e1e0: 69 7a 65 6f 66 28 66 69 64 5f 62 75 66 29 2c 20  izeof(fid_buf), 
e1f0: 66 69 64 5f 62 75 66 2c 20 30 78 30 30 2c 20 4e  fid_buf, 0x00, N
e200: 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29  ULL, NULL, NULL)
e210: 3b 0a 09 69 66 20 28 73 65 6e 64 5f 72 65 74 20  ;..if (send_ret 
e220: 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  != CACKEY_PCSC_S
e230: 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  _OK) {...CACKEY_
e240: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 61  DEBUG_PRINTF("Fa
e250: 69 6c 65 64 20 74 6f 20 6f 70 65 6e 20 66 69 6c  iled to open fil
e260: 65 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20  e, returning in 
e270: 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65  failure");....re
e280: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
e290: 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a  _E_GENERIC);..}.
e2a0: 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
e2b0: 52 49 4e 54 46 28 22 53 75 63 63 65 73 73 66 75  RINTF("Successfu
e2c0: 6c 6c 79 20 73 65 6c 65 63 74 65 64 20 66 69 6c  lly selected fil
e2d0: 65 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41  e");...return(CA
e2e0: 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b  CKEY_PCSC_S_OK);
e2f0: 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53  .}../*. * SYNPOS
e300: 49 53 0a 20 2a 20 20 20 20 20 76 6f 69 64 20 63  IS. *     void c
e310: 61 63 6b 65 79 5f 66 72 65 65 5f 74 6c 76 28 73  ackey_free_tlv(s
e320: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76  truct cackey_tlv
e330: 5f 65 6e 74 69 74 79 20 2a 72 6f 6f 74 29 3b 0a  _entity *root);.
e340: 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a   *. * ARGUMENTS.
e350: 20 2a 20 20 20 20 20 73 74 72 75 63 74 20 63 61   *     struct ca
e360: 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20  ckey_tlv_entity 
e370: 2a 72 6f 6f 74 0a 20 2a 20 20 20 20 20 20 20 20  *root. *        
e380: 20 52 6f 6f 74 20 6f 66 20 74 68 65 20 54 4c 56   Root of the TLV
e390: 20 6c 69 73 74 20 74 6f 20 73 74 61 72 74 20 66   list to start f
e3a0: 72 65 65 69 6e 67 0a 20 2a 0a 20 2a 20 52 45 54  reeing. *. * RET
e3b0: 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20  URN VALUE. *    
e3c0: 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 4e 4f 54 45   None. *. * NOTE
e3d0: 53 0a 20 2a 20 20 20 20 20 54 68 69 73 20 66 75  S. *     This fu
e3e0: 6e 63 74 69 6f 6e 20 66 72 65 65 73 20 74 68 65  nction frees the
e3f0: 20 54 4c 56 20 6c 69 6e 6b 65 64 20 6c 69 73 74   TLV linked list
e400: 65 64 20 72 65 74 75 72 6e 65 64 20 66 72 6f 6d  ed returned from
e410: 0a 20 2a 20 20 20 20 20 22 63 61 63 6b 65 79 5f  . *     "cackey_
e420: 72 65 61 64 5f 74 6c 76 22 0a 20 2a 0a 20 2a 2f  read_tlv". *. */
e430: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 61 63  .static void cac
e440: 6b 65 79 5f 66 72 65 65 5f 74 6c 76 28 73 74 72  key_free_tlv(str
e450: 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65  uct cackey_tlv_e
e460: 6e 74 69 74 79 20 2a 72 6f 6f 74 29 20 7b 0a 09  ntity *root) {..
e470: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c  struct cackey_tl
e480: 76 5f 65 6e 74 69 74 79 20 2a 63 75 72 72 2c 20  v_entity *curr, 
e490: 2a 6e 65 78 74 3b 0a 0a 09 69 66 20 28 72 6f 6f  *next;...if (roo
e4a0: 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72  t == NULL) {...r
e4b0: 65 74 75 72 6e 3b 0a 09 7d 0a 0a 09 66 6f 72 20  eturn;..}...for 
e4c0: 28 63 75 72 72 20 3d 20 72 6f 6f 74 3b 20 63 75  (curr = root; cu
e4d0: 72 72 3b 20 63 75 72 72 20 3d 20 6e 65 78 74 29  rr; curr = next)
e4e0: 20 7b 0a 09 09 6e 65 78 74 20 3d 20 63 75 72 72   {...next = curr
e4f0: 2d 3e 5f 6e 65 78 74 3b 0a 0a 09 09 73 77 69 74  ->_next;....swit
e500: 63 68 20 28 63 75 72 72 2d 3e 74 61 67 29 20 7b  ch (curr->tag) {
e510: 0a 09 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ....case GSCIS_T
e520: 41 47 5f 41 43 52 5f 54 41 42 4c 45 3a 0a 09 09  AG_ACR_TABLE:...
e530: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
e540: 43 45 52 54 49 46 49 43 41 54 45 3a 0a 09 09 09  CERTIFICATE:....
e550: 09 69 66 20 28 63 75 72 72 2d 3e 76 61 6c 75 65  .if (curr->value
e560: 29 20 7b 0a 09 09 09 09 09 66 72 65 65 28 63 75  ) {......free(cu
e570: 72 72 2d 3e 76 61 6c 75 65 29 3b 0a 09 09 09 09  rr->value);.....
e580: 7d 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  }.....break;....
e590: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43  case GSCIS_TAG_C
e5a0: 41 52 44 55 52 4c 3a 0a 09 09 09 09 69 66 20 28  ARDURL:.....if (
e5b0: 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64  curr->value_card
e5c0: 75 72 6c 29 20 7b 0a 09 09 09 09 09 66 72 65 65  url) {......free
e5d0: 28 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72  (curr->value_car
e5e0: 64 75 72 6c 29 3b 0a 09 09 09 09 7d 0a 09 09 09  durl);.....}....
e5f0: 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09 66  .break;...}....f
e600: 72 65 65 28 63 75 72 72 29 3b 0a 09 7d 0a 0a 09  ree(curr);..}...
e610: 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 20 2a  return;.}../*. *
e620: 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20   SYNPOSIS. *    
e630: 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55 4d   .... *. * ARGUM
e640: 45 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a  ENTS. *     ....
e650: 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c   *. * RETURN VAL
e660: 55 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a  UE. *     .... *
e670: 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20  . * NOTES. *    
e680: 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74   .... *. */.stat
e690: 69 63 20 73 74 72 75 63 74 20 63 61 63 6b 65 79  ic struct cackey
e6a0: 5f 74 6c 76 5f 65 6e 74 69 74 79 20 2a 63 61 63  _tlv_entity *cac
e6b0: 6b 65 79 5f 72 65 61 64 5f 74 6c 76 28 73 74 72  key_read_tlv(str
e6c0: 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20  uct cackey_slot 
e6d0: 2a 73 6c 6f 74 29 20 7b 0a 09 73 74 72 75 63 74  *slot) {..struct
e6e0: 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69   cackey_tlv_enti
e6f0: 74 79 20 2a 63 75 72 72 5f 65 6e 74 69 74 79 2c  ty *curr_entity,
e700: 20 2a 72 6f 6f 74 20 3d 20 4e 55 4c 4c 2c 20 2a   *root = NULL, *
e710: 6c 61 73 74 20 3d 20 4e 55 4c 4c 3b 0a 09 75 6e  last = NULL;..un
e720: 73 69 67 6e 65 64 20 63 68 61 72 20 74 6c 65 6e  signed char tlen
e730: 5f 62 75 66 5b 32 5d 2c 20 74 76 61 6c 5f 62 75  _buf[2], tval_bu
e740: 66 5b 31 30 32 34 5d 2c 20 2a 74 76 61 6c 3b 0a  f[1024], *tval;.
e750: 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 76  .unsigned char v
e760: 6c 65 6e 5f 62 75 66 5b 32 5d 2c 20 76 76 61 6c  len_buf[2], vval
e770: 5f 62 75 66 5b 38 31 39 32 5d 2c 20 2a 76 76 61  _buf[8192], *vva
e780: 6c 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61  l;..unsigned cha
e790: 72 20 2a 74 6d 70 62 75 66 3b 0a 09 75 6e 73 69  r *tmpbuf;..unsi
e7a0: 67 6e 65 64 20 6c 6f 6e 67 20 74 6d 70 62 75 66  gned long tmpbuf
e7b0: 6c 65 6e 3b 0a 09 73 73 69 7a 65 5f 74 20 74 6c  len;..ssize_t tl
e7c0: 65 6e 2c 20 76 6c 65 6e 3b 0a 09 73 73 69 7a 65  en, vlen;..ssize
e7d0: 5f 74 20 72 65 61 64 5f 72 65 74 3b 0a 09 73 69  _t read_ret;..si
e7e0: 7a 65 5f 74 20 6f 66 66 73 65 74 5f 74 20 3d 20  ze_t offset_t = 
e7f0: 30 2c 20 6f 66 66 73 65 74 5f 76 20 3d 20 30 3b  0, offset_v = 0;
e800: 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  ..unsigned char 
e810: 74 61 67 3b 0a 09 73 69 7a 65 5f 74 20 6c 65 6e  tag;..size_t len
e820: 67 74 68 3b 0a 23 69 66 64 65 66 20 48 41 56 45  gth;.#ifdef HAVE
e830: 5f 4c 49 42 5a 0a 09 69 6e 74 20 75 6e 63 6f 6d  _LIBZ..int uncom
e840: 70 72 65 73 73 5f 72 65 74 3b 0a 23 65 6e 64 69  press_ret;.#endi
e850: 66 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  f...CACKEY_DEBUG
e860: 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
e870: 22 29 3b 0a 0a 09 72 65 61 64 5f 72 65 74 20 3d  ");...read_ret =
e880: 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 62 75 66   cackey_read_buf
e890: 66 65 72 28 73 6c 6f 74 2c 20 74 6c 65 6e 5f 62  fer(slot, tlen_b
e8a0: 75 66 2c 20 73 69 7a 65 6f 66 28 74 6c 65 6e 5f  uf, sizeof(tlen_
e8b0: 62 75 66 29 2c 20 31 2c 20 6f 66 66 73 65 74 5f  buf), 1, offset_
e8c0: 74 29 3b 0a 09 69 66 20 28 72 65 61 64 5f 72 65  t);..if (read_re
e8d0: 74 20 21 3d 20 73 69 7a 65 6f 66 28 74 6c 65 6e  t != sizeof(tlen
e8e0: 5f 62 75 66 29 29 20 7b 0a 09 09 43 41 43 4b 45  _buf)) {...CACKE
e8f0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
e900: 52 65 61 64 20 66 61 69 6c 65 64 2c 20 72 65 74  Read failed, ret
e910: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
e920: 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e  e");....return(N
e930: 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 74 6c 65 6e 20  ULL);..}...tlen 
e940: 3d 20 28 74 6c 65 6e 5f 62 75 66 5b 31 5d 20 3c  = (tlen_buf[1] <
e950: 3c 20 38 29 20 7c 20 74 6c 65 6e 5f 62 75 66 5b  < 8) | tlen_buf[
e960: 30 5d 3b 0a 0a 09 72 65 61 64 5f 72 65 74 20 3d  0];...read_ret =
e970: 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 62 75 66   cackey_read_buf
e980: 66 65 72 28 73 6c 6f 74 2c 20 76 6c 65 6e 5f 62  fer(slot, vlen_b
e990: 75 66 2c 20 73 69 7a 65 6f 66 28 76 6c 65 6e 5f  uf, sizeof(vlen_
e9a0: 62 75 66 29 2c 20 32 2c 20 6f 66 66 73 65 74 5f  buf), 2, offset_
e9b0: 76 29 3b 0a 09 69 66 20 28 72 65 61 64 5f 72 65  v);..if (read_re
e9c0: 74 20 21 3d 20 73 69 7a 65 6f 66 28 76 6c 65 6e  t != sizeof(vlen
e9d0: 5f 62 75 66 29 29 20 7b 0a 09 09 43 41 43 4b 45  _buf)) {...CACKE
e9e0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
e9f0: 52 65 61 64 20 66 61 69 6c 65 64 2c 20 72 65 74  Read failed, ret
ea00: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
ea10: 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e  e");....return(N
ea20: 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 76 6c 65 6e 20  ULL);..}...vlen 
ea30: 3d 20 28 76 6c 65 6e 5f 62 75 66 5b 31 5d 20 3c  = (vlen_buf[1] <
ea40: 3c 20 38 29 20 7c 20 76 6c 65 6e 5f 62 75 66 5b  < 8) | vlen_buf[
ea50: 30 5d 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  0];...CACKEY_DEB
ea60: 55 47 5f 50 52 49 4e 54 46 28 22 54 61 67 20 4c  UG_PRINTF("Tag L
ea70: 65 6e 67 74 68 20 3d 20 25 6c 75 2c 20 56 61 6c  ength = %lu, Val
ea80: 75 65 20 4c 65 6e 67 74 68 20 3d 20 25 6c 75 22  ue Length = %lu"
ea90: 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
eaa0: 29 20 74 6c 65 6e 2c 20 28 75 6e 73 69 67 6e 65  ) tlen, (unsigne
eab0: 64 20 6c 6f 6e 67 29 20 76 6c 65 6e 29 3b 0a 0a  d long) vlen);..
eac0: 09 6f 66 66 73 65 74 5f 74 20 2b 3d 20 32 3b 0a  .offset_t += 2;.
ead0: 09 6f 66 66 73 65 74 5f 76 20 2b 3d 20 32 3b 0a  .offset_v += 2;.
eae0: 0a 09 69 66 20 28 74 6c 65 6e 20 3e 20 73 69 7a  ..if (tlen > siz
eaf0: 65 6f 66 28 74 76 61 6c 5f 62 75 66 29 29 20 7b  eof(tval_buf)) {
eb00: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
eb10: 50 52 49 4e 54 46 28 22 54 61 67 20 6c 65 6e 67  PRINTF("Tag leng
eb20: 74 68 20 69 73 20 74 6f 6f 20 6c 61 72 67 65 2c  th is too large,
eb30: 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61   returning in fa
eb40: 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75  ilure");....retu
eb50: 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 69  rn(NULL);..}...i
eb60: 66 20 28 76 6c 65 6e 20 3e 20 73 69 7a 65 6f 66  f (vlen > sizeof
eb70: 28 76 76 61 6c 5f 62 75 66 29 29 20 7b 0a 09 09  (vval_buf)) {...
eb80: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
eb90: 4e 54 46 28 22 56 61 6c 75 65 20 6c 65 6e 67 74  NTF("Value lengt
eba0: 68 20 69 73 20 74 6f 6f 20 6c 61 72 67 65 2c 20  h is too large, 
ebb0: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  returning in fai
ebc0: 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72  lure");....retur
ebd0: 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 72 65  n(NULL);..}...re
ebe0: 61 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f  ad_ret = cackey_
ebf0: 72 65 61 64 5f 62 75 66 66 65 72 28 73 6c 6f 74  read_buffer(slot
ec00: 2c 20 74 76 61 6c 5f 62 75 66 2c 20 74 6c 65 6e  , tval_buf, tlen
ec10: 2c 20 31 2c 20 6f 66 66 73 65 74 5f 74 29 3b 0a  , 1, offset_t);.
ec20: 09 69 66 20 28 72 65 61 64 5f 72 65 74 20 21 3d  .if (read_ret !=
ec30: 20 74 6c 65 6e 29 20 7b 0a 09 09 43 41 43 4b 45   tlen) {...CACKE
ec40: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
ec50: 55 6e 61 62 6c 65 20 74 6f 20 72 65 61 64 20 65  Unable to read e
ec60: 6e 74 69 72 65 20 54 2d 62 75 66 66 65 72 2c 20  ntire T-buffer, 
ec70: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  returning in fai
ec80: 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72  lure");....retur
ec90: 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 72 65  n(NULL);..}...re
eca0: 61 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f  ad_ret = cackey_
ecb0: 72 65 61 64 5f 62 75 66 66 65 72 28 73 6c 6f 74  read_buffer(slot
ecc0: 2c 20 76 76 61 6c 5f 62 75 66 2c 20 76 6c 65 6e  , vval_buf, vlen
ecd0: 2c 20 32 2c 20 6f 66 66 73 65 74 5f 76 29 3b 0a  , 2, offset_v);.
ece0: 09 69 66 20 28 72 65 61 64 5f 72 65 74 20 21 3d  .if (read_ret !=
ecf0: 20 76 6c 65 6e 29 20 7b 0a 09 09 43 41 43 4b 45   vlen) {...CACKE
ed00: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
ed10: 55 6e 61 62 6c 65 20 74 6f 20 72 65 61 64 20 65  Unable to read e
ed20: 6e 74 69 72 65 20 56 2d 62 75 66 66 65 72 2c 20  ntire V-buffer, 
ed30: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  returning in fai
ed40: 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72  lure");....retur
ed50: 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 74 76  n(NULL);..}...tv
ed60: 61 6c 20 3d 20 74 76 61 6c 5f 62 75 66 3b 0a 09  al = tval_buf;..
ed70: 76 76 61 6c 20 3d 20 76 76 61 6c 5f 62 75 66 3b  vval = vval_buf;
ed80: 0a 09 77 68 69 6c 65 20 28 74 6c 65 6e 20 3e 20  ..while (tlen > 
ed90: 30 20 26 26 20 76 6c 65 6e 20 3e 20 30 29 20 7b  0 && vlen > 0) {
eda0: 0a 09 09 74 61 67 20 3d 20 2a 74 76 61 6c 3b 0a  ...tag = *tval;.
edb0: 09 09 74 76 61 6c 2b 2b 3b 0a 09 09 74 6c 65 6e  ..tval++;...tlen
edc0: 2d 2d 3b 0a 0a 09 09 69 66 20 28 2a 74 76 61 6c  --;....if (*tval
edd0: 20 3d 3d 20 30 78 66 66 29 20 7b 0a 09 09 09 6c   == 0xff) {....l
ede0: 65 6e 67 74 68 20 3d 20 28 74 76 61 6c 5b 32 5d  ength = (tval[2]
edf0: 20 3c 3c 20 38 29 20 7c 20 74 76 61 6c 5b 31 5d   << 8) | tval[1]
ee00: 3b 0a 09 09 09 74 76 61 6c 20 2b 3d 20 33 3b 0a  ;....tval += 3;.
ee10: 09 09 09 74 6c 65 6e 20 2d 3d 20 33 3b 0a 09 09  ...tlen -= 3;...
ee20: 7d 20 65 6c 73 65 20 7b 0a 09 09 09 6c 65 6e 67  } else {....leng
ee30: 74 68 20 3d 20 2a 74 76 61 6c 3b 0a 09 09 09 74  th = *tval;....t
ee40: 76 61 6c 2b 2b 3b 0a 09 09 09 74 6c 65 6e 2d 2d  val++;....tlen--
ee50: 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f  ;...}....CACKEY_
ee60: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54 61  DEBUG_PRINTF("Ta
ee70: 67 3a 20 25 73 20 28 25 30 32 78 29 22 2c 20 43  g: %s (%02x)", C
ee80: 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43  ACKEY_DEBUG_FUNC
ee90: 5f 54 41 47 5f 54 4f 5f 53 54 52 28 74 61 67 29  _TAG_TO_STR(tag)
eea0: 2c 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29  , (unsigned int)
eeb0: 20 74 61 67 29 3b 0a 09 09 43 41 43 4b 45 59 5f   tag);...CACKEY_
eec0: 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22  DEBUG_PRINTBUF("
eed0: 56 61 6c 75 65 3a 22 2c 20 76 76 61 6c 2c 20 6c  Value:", vval, l
eee0: 65 6e 67 74 68 29 3b 0a 0a 09 09 63 75 72 72 5f  ength);....curr_
eef0: 65 6e 74 69 74 79 20 3d 20 4e 55 4c 4c 3b 0a 09  entity = NULL;..
ef00: 09 73 77 69 74 63 68 20 28 74 61 67 29 20 7b 0a  .switch (tag) {.
ef10: 09 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
ef20: 47 5f 43 41 52 44 55 52 4c 3a 0a 09 09 09 09 63  G_CARDURL:.....c
ef30: 75 72 72 5f 65 6e 74 69 74 79 20 3d 20 6d 61 6c  urr_entity = mal
ef40: 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63 75 72 72  loc(sizeof(*curr
ef50: 5f 65 6e 74 69 74 79 29 29 3b 0a 09 09 09 09 63  _entity));.....c
ef60: 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75  urr_entity->valu
ef70: 65 5f 63 61 72 64 75 72 6c 20 3d 20 6d 61 6c 6c  e_cardurl = mall
ef80: 6f 63 28 73 69 7a 65 6f 66 28 2a 63 75 72 72 5f  oc(sizeof(*curr_
ef90: 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65 5f 63 61  entity->value_ca
efa0: 72 64 75 72 6c 29 29 3b 0a 0a 09 09 09 09 6d 65  rdurl));......me
efb0: 6d 63 70 79 28 63 75 72 72 5f 65 6e 74 69 74 79  mcpy(curr_entity
efc0: 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d  ->value_cardurl-
efd0: 3e 72 69 64 2c 20 76 76 61 6c 2c 20 35 29 3b 0a  >rid, vval, 5);.
efe0: 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d  ....curr_entity-
eff0: 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e  >value_cardurl->
f000: 61 70 70 74 79 70 65 20 3d 20 76 76 61 6c 5b 35  apptype = vval[5
f010: 5d 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69  ];.....curr_enti
f020: 74 79 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72  ty->value_cardur
f030: 6c 2d 3e 6f 62 6a 65 63 74 69 64 20 3d 20 28 76  l->objectid = (v
f040: 76 61 6c 5b 36 5d 20 3c 3c 20 38 29 20 7c 20 76  val[6] << 8) | v
f050: 76 61 6c 5b 37 5d 3b 0a 09 09 09 09 63 75 72 72  val[7];.....curr
f060: 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65 5f 63  _entity->value_c
f070: 61 72 64 75 72 6c 2d 3e 61 70 70 69 64 20 3d 20  ardurl->appid = 
f080: 28 76 76 61 6c 5b 38 5d 20 3c 3c 20 38 29 20 7c  (vval[8] << 8) |
f090: 20 76 76 61 6c 5b 39 5d 3b 0a 0a 09 09 09 09 63   vval[9];......c
f0a0: 75 72 72 5f 65 6e 74 69 74 79 2d 3e 74 61 67 20  urr_entity->tag 
f0b0: 3d 20 74 61 67 3b 0a 09 09 09 09 63 75 72 72 5f  = tag;.....curr_
f0c0: 65 6e 74 69 74 79 2d 3e 5f 6e 65 78 74 20 3d 20  entity->_next = 
f0d0: 4e 55 4c 4c 3b 0a 0a 09 09 09 09 62 72 65 61 6b  NULL;......break
f0e0: 3b 0a 09 09 09 63 61 73 65 20 47 53 43 49 53 5f  ;....case GSCIS_
f0f0: 54 41 47 5f 41 43 52 5f 54 41 42 4c 45 3a 0a 09  TAG_ACR_TABLE:..
f100: 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 20 3d  ...curr_entity =
f110: 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a   malloc(sizeof(*
f120: 63 75 72 72 5f 65 6e 74 69 74 79 29 29 3b 0a 09  curr_entity));..
f130: 09 09 09 74 6d 70 62 75 66 20 3d 20 6d 61 6c 6c  ...tmpbuf = mall
f140: 6f 63 28 6c 65 6e 67 74 68 29 3b 0a 0a 09 09 09  oc(length);.....
f150: 09 6d 65 6d 63 70 79 28 74 6d 70 62 75 66 2c 20  .memcpy(tmpbuf, 
f160: 76 76 61 6c 2c 20 6c 65 6e 67 74 68 29 3b 0a 0a  vval, length);..
f170: 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d  ....curr_entity-
f180: 3e 74 61 67 20 3d 20 74 61 67 3b 0a 09 09 09 09  >tag = tag;.....
f190: 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 6c 65 6e  curr_entity->len
f1a0: 67 74 68 20 3d 20 6c 65 6e 67 74 68 3b 0a 09 09  gth = length;...
f1b0: 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76  ..curr_entity->v
f1c0: 61 6c 75 65 20 3d 20 74 6d 70 62 75 66 3b 0a 09  alue = tmpbuf;..
f1d0: 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e  ...curr_entity->
f1e0: 5f 6e 65 78 74 20 3d 20 4e 55 4c 4c 3b 0a 0a 09  _next = NULL;...
f1f0: 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
f200: 65 20 47 53 43 49 53 5f 54 41 47 5f 43 45 52 54  e GSCIS_TAG_CERT
f210: 49 46 49 43 41 54 45 3a 0a 09 09 09 09 63 75 72  IFICATE:.....cur
f220: 72 5f 65 6e 74 69 74 79 20 3d 20 6d 61 6c 6c 6f  r_entity = mallo
f230: 63 28 73 69 7a 65 6f 66 28 2a 63 75 72 72 5f 65  c(sizeof(*curr_e
f240: 6e 74 69 74 79 29 29 3b 0a 0a 23 69 66 64 65 66  ntity));..#ifdef
f250: 20 48 41 56 45 5f 4c 49 42 5a 0a 09 09 09 09 74   HAVE_LIBZ.....t
f260: 6d 70 62 75 66 6c 65 6e 20 3d 20 6c 65 6e 67 74  mpbuflen = lengt
f270: 68 20 2a 20 32 3b 0a 09 09 09 09 74 6d 70 62 75  h * 2;.....tmpbu
f280: 66 20 3d 20 6d 61 6c 6c 6f 63 28 74 6d 70 62 75  f = malloc(tmpbu
f290: 66 6c 65 6e 29 3b 0a 0a 09 09 09 09 75 6e 63 6f  flen);......unco
f2a0: 6d 70 72 65 73 73 5f 72 65 74 20 3d 20 75 6e 63  mpress_ret = unc
f2b0: 6f 6d 70 72 65 73 73 28 74 6d 70 62 75 66 2c 20  ompress(tmpbuf, 
f2c0: 26 74 6d 70 62 75 66 6c 65 6e 2c 20 76 76 61 6c  &tmpbuflen, vval
f2d0: 2c 20 6c 65 6e 67 74 68 29 3b 0a 09 09 09 09 69  , length);.....i
f2e0: 66 20 28 75 6e 63 6f 6d 70 72 65 73 73 5f 72 65  f (uncompress_re
f2f0: 74 20 21 3d 20 5a 5f 4f 4b 29 20 7b 0a 09 09 09  t != Z_OK) {....
f300: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
f310: 52 49 4e 54 46 28 22 46 61 69 6c 65 64 20 74 6f  RINTF("Failed to
f320: 20 64 65 63 6f 6d 70 72 65 73 73 2c 20 75 6e 63   decompress, unc
f330: 6f 6d 70 72 65 73 73 28 29 20 72 65 74 75 72 6e  ompress() return
f340: 65 64 20 25 69 20 2d 2d 20 72 65 73 6f 72 74 69  ed %i -- resorti
f350: 6e 67 20 74 6f 20 64 69 72 65 63 74 20 63 6f 70  ng to direct cop
f360: 79 22 2c 20 75 6e 63 6f 6d 70 72 65 73 73 5f 72  y", uncompress_r
f370: 65 74 29 3b 0a 0a 09 09 09 09 09 74 6d 70 62 75  et);.......tmpbu
f380: 66 6c 65 6e 20 3d 20 6c 65 6e 67 74 68 3b 0a 09  flen = length;..
f390: 09 09 09 09 6d 65 6d 63 70 79 28 74 6d 70 62 75  ....memcpy(tmpbu
f3a0: 66 2c 20 76 76 61 6c 2c 20 6c 65 6e 67 74 68 29  f, vval, length)
f3b0: 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43  ;.....}......CAC
f3c0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42  KEY_DEBUG_PRINTB
f3d0: 55 46 28 22 44 65 63 6f 6d 70 72 65 73 73 65 64  UF("Decompressed
f3e0: 20 74 6f 3a 22 2c 20 74 6d 70 62 75 66 2c 20 74   to:", tmpbuf, t
f3f0: 6d 70 62 75 66 6c 65 6e 29 3b 0a 23 65 6c 73 65  mpbuflen);.#else
f400: 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
f410: 47 5f 50 52 49 4e 54 46 28 22 4d 69 73 73 69 6e  G_PRINTF("Missin
f420: 67 20 5a 4c 49 42 20 53 75 70 70 6f 72 74 2c 20  g ZLIB Support, 
f430: 74 68 69 73 20 63 65 72 74 69 66 69 63 61 74 65  this certificate
f440: 20 69 73 20 6c 69 6b 65 6c 79 20 75 73 65 6c 65   is likely usele
f450: 73 73 2e 2e 2e 22 29 3b 0a 0a 09 09 09 09 74 6d  ss...");......tm
f460: 70 62 75 66 6c 65 6e 20 3d 20 6c 65 6e 67 74 68  pbuflen = length
f470: 3b 0a 09 09 09 09 6d 65 6d 63 70 79 28 74 6d 70  ;.....memcpy(tmp
f480: 62 75 66 2c 20 76 76 61 6c 2c 20 6c 65 6e 67 74  buf, vval, lengt
f490: 68 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 09 09 09  h);.#endif......
f4a0: 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 74 61 67  curr_entity->tag
f4b0: 20 3d 20 74 61 67 3b 0a 09 09 09 09 63 75 72 72   = tag;.....curr
f4c0: 5f 65 6e 74 69 74 79 2d 3e 6c 65 6e 67 74 68 20  _entity->length 
f4d0: 3d 20 74 6d 70 62 75 66 6c 65 6e 3b 0a 09 09 09  = tmpbuflen;....
f4e0: 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61  .curr_entity->va
f4f0: 6c 75 65 20 3d 20 74 6d 70 62 75 66 3b 0a 09 09  lue = tmpbuf;...
f500: 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 5f  ..curr_entity->_
f510: 6e 65 78 74 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09  next = NULL;....
f520: 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
f530: 20 47 53 43 49 53 5f 54 41 47 5f 50 4b 43 53 31   GSCIS_TAG_PKCS1
f540: 35 3a 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69  5:.....curr_enti
f550: 74 79 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65  ty = malloc(size
f560: 6f 66 28 2a 63 75 72 72 5f 65 6e 74 69 74 79 29  of(*curr_entity)
f570: 29 3b 0a 0a 09 09 09 09 63 75 72 72 5f 65 6e 74  );......curr_ent
f580: 69 74 79 2d 3e 74 61 67 20 3d 20 74 61 67 3b 0a  ity->tag = tag;.
f590: 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d  ....curr_entity-
f5a0: 3e 76 61 6c 75 65 5f 62 79 74 65 20 3d 20 76 76  >value_byte = vv
f5b0: 61 6c 5b 30 5d 3b 0a 09 09 09 09 63 75 72 72 5f  al[0];.....curr_
f5c0: 65 6e 74 69 74 79 2d 3e 5f 6e 65 78 74 20 3d 20  entity->_next = 
f5d0: 4e 55 4c 4c 3b 0a 0a 09 09 09 09 62 72 65 61 6b  NULL;......break
f5e0: 3b 0a 09 09 7d 0a 0a 09 09 76 76 61 6c 20 2b 3d  ;...}....vval +=
f5f0: 20 6c 65 6e 67 74 68 3b 0a 09 09 76 6c 65 6e 20   length;...vlen 
f600: 2d 3d 20 6c 65 6e 67 74 68 3b 0a 0a 09 09 69 66  -= length;....if
f610: 20 28 63 75 72 72 5f 65 6e 74 69 74 79 20 21 3d   (curr_entity !=
f620: 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 69 66 20 28   NULL) {....if (
f630: 72 6f 6f 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  root == NULL) {.
f640: 09 09 09 09 72 6f 6f 74 20 3d 20 63 75 72 72 5f  ....root = curr_
f650: 65 6e 74 69 74 79 3b 0a 09 09 09 7d 0a 0a 09 09  entity;....}....
f660: 09 69 66 20 28 6c 61 73 74 20 21 3d 20 4e 55 4c  .if (last != NUL
f670: 4c 29 20 7b 0a 09 09 09 09 6c 61 73 74 2d 3e 5f  L) {.....last->_
f680: 6e 65 78 74 20 3d 20 63 75 72 72 5f 65 6e 74 69  next = curr_enti
f690: 74 79 3b 0a 09 09 09 7d 0a 0a 09 09 09 6c 61 73  ty;....}.....las
f6a0: 74 20 3d 20 63 75 72 72 5f 65 6e 74 69 74 79 3b  t = curr_entity;
f6b0: 0a 09 09 7d 0a 09 7d 0a 0a 09 72 65 74 75 72 6e  ...}..}...return
f6c0: 28 72 6f 6f 74 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a  (root);.}../*. *
f6d0: 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20   SYNPOSIS. *    
f6e0: 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55 4d   .... *. * ARGUM
f6f0: 45 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a  ENTS. *     ....
f700: 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c   *. * RETURN VAL
f710: 55 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a  UE. *     .... *
f720: 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20  . * NOTES. *    
f730: 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74   .... *. */.stat
f740: 69 63 20 76 6f 69 64 20 63 61 63 6b 65 79 5f 66  ic void cackey_f
f750: 72 65 65 5f 63 65 72 74 73 28 73 74 72 75 63 74  ree_certs(struct
f760: 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65   cackey_pcsc_ide
f770: 6e 74 69 74 79 20 2a 73 74 61 72 74 2c 20 73 69  ntity *start, si
f780: 7a 65 5f 74 20 63 6f 75 6e 74 2c 20 69 6e 74 20  ze_t count, int 
f790: 66 72 65 65 5f 73 74 61 72 74 29 20 7b 0a 09 73  free_start) {..s
f7a0: 69 7a 65 5f 74 20 69 64 78 3b 0a 0a 09 69 66 20  ize_t idx;...if 
f7b0: 28 73 74 61 72 74 20 3d 3d 20 4e 55 4c 4c 29 20  (start == NULL) 
f7c0: 7b 0a 09 09 72 65 74 75 72 6e 3b 0a 09 7d 0a 0a  {...return;..}..
f7d0: 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69  .for (idx = 0; i
f7e0: 64 78 20 3c 20 63 6f 75 6e 74 3b 20 69 64 78 2b  dx < count; idx+
f7f0: 2b 29 20 7b 0a 09 09 69 66 20 28 73 74 61 72 74  +) {...if (start
f800: 5b 69 64 78 5d 2e 63 65 72 74 69 66 69 63 61 74  [idx].certificat
f810: 65 29 20 7b 0a 09 09 09 66 72 65 65 28 73 74 61  e) {....free(sta
f820: 72 74 5b 69 64 78 5d 2e 63 65 72 74 69 66 69 63  rt[idx].certific
f830: 61 74 65 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69  ate);...}..}...i
f840: 66 20 28 66 72 65 65 5f 73 74 61 72 74 29 20 7b  f (free_start) {
f850: 0a 09 09 66 72 65 65 28 73 74 61 72 74 29 3b 0a  ...free(start);.
f860: 09 7d 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a  .}...return;.}..
f870: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 63 61  static struct ca
f880: 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69  ckey_pcsc_identi
f890: 74 79 20 2a 63 61 63 6b 65 79 5f 63 6f 70 79 5f  ty *cackey_copy_
f8a0: 63 65 72 74 73 28 73 74 72 75 63 74 20 63 61 63  certs(struct cac
f8b0: 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74  key_pcsc_identit
f8c0: 79 20 2a 64 65 73 74 2c 20 73 74 72 75 63 74 20  y *dest, struct 
f8d0: 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e  cackey_pcsc_iden
f8e0: 74 69 74 79 20 2a 73 74 61 72 74 2c 20 73 69 7a  tity *start, siz
f8f0: 65 5f 74 20 63 6f 75 6e 74 29 20 7b 0a 09 73 69  e_t count) {..si
f900: 7a 65 5f 74 20 69 64 78 3b 0a 0a 09 69 66 20 28  ze_t idx;...if (
f910: 73 74 61 72 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b  start == NULL) {
f920: 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b  ...return(NULL);
f930: 0a 09 7d 0a 0a 09 69 66 20 28 64 65 73 74 20 3d  ..}...if (dest =
f940: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 64 65 73 74  = NULL) {...dest
f950: 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66   = malloc(sizeof
f960: 28 2a 64 65 73 74 29 20 2a 20 63 6f 75 6e 74 29  (*dest) * count)
f970: 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 64 78 20  ;..}...for (idx 
f980: 3d 20 30 3b 20 69 64 78 20 3c 20 63 6f 75 6e 74  = 0; idx < count
f990: 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 64 65 73  ; idx++) {...des
f9a0: 74 5b 69 64 78 5d 2e 69 64 5f 74 79 70 65 20 3d  t[idx].id_type =
f9b0: 20 73 74 61 72 74 5b 69 64 78 5d 2e 69 64 5f 74   start[idx].id_t
f9c0: 79 70 65 3b 0a 0a 09 09 73 77 69 74 63 68 20 28  ype;....switch (
f9d0: 64 65 73 74 5b 69 64 78 5d 2e 69 64 5f 74 79 70  dest[idx].id_typ
f9e0: 65 29 20 7b 0a 09 09 09 63 61 73 65 20 43 41 43  e) {....case CAC
f9f0: 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43 41 43 3a  KEY_ID_TYPE_CAC:
fa00: 0a 09 09 09 09 6d 65 6d 63 70 79 28 64 65 73 74  .....memcpy(dest
fa10: 5b 69 64 78 5d 2e 63 61 72 64 2e 63 61 63 2e 61  [idx].card.cac.a
fa20: 70 70 6c 65 74 2c 20 73 74 61 72 74 5b 69 64 78  pplet, start[idx
fa30: 5d 2e 63 61 72 64 2e 63 61 63 2e 61 70 70 6c 65  ].card.cac.apple
fa40: 74 2c 20 73 69 7a 65 6f 66 28 64 65 73 74 5b 69  t, sizeof(dest[i
fa50: 64 78 5d 2e 63 61 72 64 2e 63 61 63 2e 61 70 70  dx].card.cac.app
fa60: 6c 65 74 29 29 3b 0a 09 09 09 09 64 65 73 74 5b  let));.....dest[
fa70: 69 64 78 5d 2e 63 61 72 64 2e 63 61 63 2e 66 69  idx].card.cac.fi
fa80: 6c 65 20 3d 20 73 74 61 72 74 5b 69 64 78 5d 2e  le = start[idx].
fa90: 63 61 72 64 2e 63 61 63 2e 66 69 6c 65 3b 0a 09  card.cac.file;..
faa0: 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
fab0: 65 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45  e CACKEY_ID_TYPE
fac0: 5f 50 49 56 3a 0a 09 09 09 09 64 65 73 74 5b 69  _PIV:.....dest[i
fad0: 64 78 5d 2e 63 61 72 64 2e 70 69 76 2e 6b 65 79  dx].card.piv.key
fae0: 5f 69 64 20 3d 20 73 74 61 72 74 5b 69 64 78 5d  _id = start[idx]
faf0: 2e 63 61 72 64 2e 70 69 76 2e 6b 65 79 5f 69 64  .card.piv.key_id
fb00: 3b 0a 09 09 09 09 6d 65 6d 63 70 79 28 64 65 73  ;.....memcpy(des
fb10: 74 5b 69 64 78 5d 2e 63 61 72 64 2e 70 69 76 2e  t[idx].card.piv.
fb20: 6c 61 62 65 6c 2c 20 73 74 61 72 74 5b 69 64 78  label, start[idx
fb30: 5d 2e 63 61 72 64 2e 70 69 76 2e 6c 61 62 65 6c  ].card.piv.label
fb40: 2c 20 73 69 7a 65 6f 66 28 64 65 73 74 5b 69 64  , sizeof(dest[id
fb50: 78 5d 2e 63 61 72 64 2e 70 69 76 2e 6c 61 62 65  x].card.piv.labe
fb60: 6c 29 29 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a  l));.....break;.
fb70: 09 09 09 63 61 73 65 20 43 41 43 4b 45 59 5f 49  ...case CACKEY_I
fb80: 44 5f 54 59 50 45 5f 43 45 52 54 5f 4f 4e 4c 59  D_TYPE_CERT_ONLY
fb90: 3a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d  :.....break;...}
fba0: 0a 09 09 64 65 73 74 5b 69 64 78 5d 2e 63 65 72  ...dest[idx].cer
fbb0: 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3d 20 73  tificate_len = s
fbc0: 74 61 72 74 5b 69 64 78 5d 2e 63 65 72 74 69 66  tart[idx].certif
fbd0: 69 63 61 74 65 5f 6c 65 6e 3b 0a 09 09 64 65 73  icate_len;...des
fbe0: 74 5b 69 64 78 5d 2e 6b 65 79 73 69 7a 65 20 3d  t[idx].keysize =
fbf0: 20 73 74 61 72 74 5b 69 64 78 5d 2e 6b 65 79 73   start[idx].keys
fc00: 69 7a 65 3b 0a 0a 09 09 64 65 73 74 5b 69 64 78  ize;....dest[idx
fc10: 5d 2e 63 65 72 74 69 66 69 63 61 74 65 20 3d 20  ].certificate = 
fc20: 6d 61 6c 6c 6f 63 28 64 65 73 74 5b 69 64 78 5d  malloc(dest[idx]
fc30: 2e 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e  .certificate_len
fc40: 29 3b 0a 09 09 6d 65 6d 63 70 79 28 64 65 73 74  );...memcpy(dest
fc50: 5b 69 64 78 5d 2e 63 65 72 74 69 66 69 63 61 74  [idx].certificat
fc60: 65 2c 20 73 74 61 72 74 5b 69 64 78 5d 2e 63 65  e, start[idx].ce
fc70: 72 74 69 66 69 63 61 74 65 2c 20 64 65 73 74 5b  rtificate, dest[
fc80: 69 64 78 5d 2e 63 65 72 74 69 66 69 63 61 74 65  idx].certificate
fc90: 5f 6c 65 6e 29 3b 0a 09 7d 0a 0a 09 72 65 74 75  _len);..}...retu
fca0: 72 6e 28 64 65 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a  rn(dest);.}../*.
fcb0: 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20   * SYNPOSIS. *  
fcc0: 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47     .... *. * ARG
fcd0: 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e  UMENTS. *     ..
fce0: 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56  .. *. * RETURN V
fcf0: 41 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a  ALUE. *     ....
fd00: 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20   *. * NOTES. *  
fd10: 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74     .... *. */.st
fd20: 61 74 69 63 20 73 74 72 75 63 74 20 63 61 63 6b  atic struct cack
fd30: 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79  ey_pcsc_identity
fd40: 20 2a 63 61 63 6b 65 79 5f 72 65 61 64 5f 63 65   *cackey_read_ce
fd50: 72 74 73 28 73 74 72 75 63 74 20 63 61 63 6b 65  rts(struct cacke
fd60: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 73 74  y_slot *slot, st
fd70: 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63  ruct cackey_pcsc
fd80: 5f 69 64 65 6e 74 69 74 79 20 2a 63 65 72 74 73  _identity *certs
fd90: 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  , unsigned long 
fda0: 2a 63 6f 75 6e 74 29 20 7b 0a 09 73 74 72 75 63  *count) {..struc
fdb0: 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64  t cackey_pcsc_id
fdc0: 65 6e 74 69 74 79 20 2a 63 75 72 72 5f 69 64 3b  entity *curr_id;
fdd0: 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  ..struct cackey_
fde0: 74 6c 76 5f 65 6e 74 69 74 79 20 2a 63 63 63 5f  tlv_entity *ccc_
fdf0: 74 6c 76 2c 20 2a 63 63 63 5f 63 75 72 72 2c 20  tlv, *ccc_curr, 
fe00: 2a 61 70 70 5f 74 6c 76 2c 20 2a 61 70 70 5f 63  *app_tlv, *app_c
fe10: 75 72 72 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63  urr;..unsigned c
fe20: 68 61 72 20 63 63 63 5f 61 69 64 5b 5d 20 3d 20  har ccc_aid[] = 
fe30: 7b 47 53 43 49 53 5f 41 49 44 5f 43 43 43 7d 2c  {GSCIS_AID_CCC},
fe40: 20 70 69 76 5f 61 69 64 5b 5d 20 3d 20 7b 4e 49   piv_aid[] = {NI
fe50: 53 54 53 50 38 30 30 5f 37 33 5f 33 5f 50 49 56  STSP800_73_3_PIV
fe60: 5f 41 49 44 7d 3b 0a 09 75 6e 73 69 67 6e 65 64  _AID};..unsigned
fe70: 20 63 68 61 72 20 2a 70 69 76 5f 6f 69 64 2c 20   char *piv_oid, 
fe80: 70 69 76 5f 6f 69 64 5f 70 69 76 61 75 74 68 5b  piv_oid_pivauth[
fe90: 5d 20 3d 20 7b 4e 49 53 54 53 50 38 30 30 5f 37  ] = {NISTSP800_7
fea0: 33 5f 33 5f 4f 49 44 5f 50 49 56 41 55 54 48 7d  3_3_OID_PIVAUTH}
feb0: 2c 20 70 69 76 5f 6f 69 64 5f 73 69 67 6e 61 74  , piv_oid_signat
fec0: 75 72 65 5b 5d 20 3d 20 7b 4e 49 53 54 53 50 38  ure[] = {NISTSP8
fed0: 30 30 5f 37 33 5f 33 5f 4f 49 44 5f 53 49 47 4e  00_73_3_OID_SIGN
fee0: 41 54 55 52 45 7d 2c 20 70 69 76 5f 6f 69 64 5f  ATURE}, piv_oid_
fef0: 6b 65 79 6d 67 74 5b 5d 20 3d 20 7b 4e 49 53 54  keymgt[] = {NIST
ff00: 53 50 38 30 30 5f 37 33 5f 33 5f 4f 49 44 5f 4b  SP800_73_3_OID_K
ff10: 45 59 4d 47 54 7d 3b 0a 09 75 6e 73 69 67 6e 65  EYMGT};..unsigne
ff20: 64 20 63 68 61 72 20 63 75 72 72 5f 61 69 64 5b  d char curr_aid[
ff30: 37 5d 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68  7];..unsigned ch
ff40: 61 72 20 62 75 66 66 65 72 5b 38 31 39 32 5d 2c  ar buffer[8192],
ff50: 20 2a 62 75 66 66 65 72 5f 70 2c 20 2a 74 6d 70   *buffer_p, *tmp
ff60: 62 75 66 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c  buf;..unsigned l
ff70: 6f 6e 67 20 6f 75 74 69 64 78 20 3d 20 30 3b 0a  ong outidx = 0;.
ff80: 09 63 68 61 72 20 2a 70 69 76 5f 6c 61 62 65 6c  .char *piv_label
ff90: 3b 0a 09 63 61 63 6b 65 79 5f 72 65 74 20 74 72  ;..cackey_ret tr
ffa0: 61 6e 73 61 63 74 69 6f 6e 5f 72 65 74 3b 0a 09  ansaction_ret;..
ffb0: 73 73 69 7a 65 5f 74 20 72 65 61 64 5f 72 65 74  ssize_t read_ret
ffc0: 3b 0a 09 73 69 7a 65 5f 74 20 62 75 66 66 65 72  ;..size_t buffer
ffd0: 5f 6c 65 6e 2c 20 74 6d 70 62 75 66 6c 65 6e 3b  _len, tmpbuflen;
ffe0: 0a 09 69 6e 74 20 63 65 72 74 73 5f 72 65 73 69  ..int certs_resi
fff0: 7a 61 62 6c 65 3b 0a 09 69 6e 74 20 73 65 6e 64  zable;..int send
10000 5f 72 65 74 2c 20 73 65 6c 65 63 74 5f 72 65 74  _ret, select_ret
10010 3b 0a 09 69 6e 74 20 70 69 76 5f 6b 65 79 2c 20  ;..int piv_key, 
10020 70 69 76 20 3d 20 30 3b 0a 09 69 6e 74 20 69 64  piv = 0;..int id
10030 78 3b 0a 23 69 66 64 65 66 20 48 41 56 45 5f 4c  x;.#ifdef HAVE_L
10040 49 42 5a 0a 09 69 6e 74 20 75 6e 63 6f 6d 70 72  IBZ..int uncompr
10050 65 73 73 5f 72 65 74 3b 0a 09 7a 5f 73 74 72 65  ess_ret;..z_stre
10060 61 6d 20 67 7a 69 70 5f 73 74 72 65 61 6d 3b 0a  am gzip_stream;.
10070 23 65 6e 64 69 66 0a 0a 09 43 41 43 4b 45 59 5f  #endif...CACKEY_
10080 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
10090 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 63  lled.");...if (c
100a0 6f 75 6e 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  ount == NULL) {.
100b0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
100c0 52 49 4e 54 46 28 22 63 6f 75 6e 74 20 69 73 20  RINTF("count is 
100d0 4e 55 4c 4c 2c 20 72 65 74 75 72 6e 69 6e 67 20  NULL, returning 
100e0 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09  in failure");...
100f0 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09  .return(NULL);..
10100 7d 0a 0a 09 69 66 20 28 63 65 72 74 73 20 21 3d  }...if (certs !=
10110 20 4e 55 4c 4c 29 20 7b 0a 09 09 69 66 20 28 2a   NULL) {...if (*
10120 63 6f 75 6e 74 20 3d 3d 20 30 29 20 7b 0a 09 09  count == 0) {...
10130 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
10140 49 4e 54 46 28 22 52 65 71 75 65 73 74 65 64 20  INTF("Requested 
10150 77 65 20 72 65 74 75 72 6e 20 30 20 6f 62 6a 65  we return 0 obje
10160 63 74 73 2c 20 73 68 6f 72 74 2d 63 69 72 63 75  cts, short-circu
10170 69 74 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e  it");.....return
10180 28 63 65 72 74 73 29 3b 0a 09 09 7d 0a 09 7d 0a  (certs);...}..}.
10190 0a 09 69 66 20 28 21 73 6c 6f 74 2d 3e 73 6c 6f  ..if (!slot->slo
101a0 74 5f 72 65 73 65 74 29 20 7b 0a 09 09 69 66 20  t_reset) {...if 
101b0 28 73 6c 6f 74 2d 3e 63 61 63 68 65 64 5f 63 65  (slot->cached_ce
101c0 72 74 73 29 20 7b 0a 09 09 09 69 66 20 28 63 65  rts) {....if (ce
101d0 72 74 73 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  rts == NULL) {..
101e0 09 09 09 63 65 72 74 73 20 3d 20 6d 61 6c 6c 6f  ...certs = mallo
101f0 63 28 73 69 7a 65 6f 66 28 2a 63 65 72 74 73 29  c(sizeof(*certs)
10200 20 2a 20 73 6c 6f 74 2d 3e 63 61 63 68 65 64 5f   * slot->cached_
10210 63 65 72 74 73 5f 63 6f 75 6e 74 29 3b 0a 09 09  certs_count);...
10220 09 09 2a 63 6f 75 6e 74 20 3d 20 73 6c 6f 74 2d  ..*count = slot-
10230 3e 63 61 63 68 65 64 5f 63 65 72 74 73 5f 63 6f  >cached_certs_co
10240 75 6e 74 3b 0a 09 09 09 7d 20 65 6c 73 65 20 7b  unt;....} else {
10250 0a 09 09 09 09 69 66 20 28 2a 63 6f 75 6e 74 20  .....if (*count 
10260 3e 20 73 6c 6f 74 2d 3e 63 61 63 68 65 64 5f 63  > slot->cached_c
10270 65 72 74 73 5f 63 6f 75 6e 74 29 20 7b 0a 09 09  erts_count) {...
10280 09 09 09 2a 63 6f 75 6e 74 20 3d 20 73 6c 6f 74  ...*count = slot
10290 2d 3e 63 61 63 68 65 64 5f 63 65 72 74 73 5f 63  ->cached_certs_c
102a0 6f 75 6e 74 3b 0a 09 09 09 09 7d 0a 09 09 09 7d  ount;.....}....}
102b0 0a 0a 09 09 09 63 61 63 6b 65 79 5f 63 6f 70 79  .....cackey_copy
102c0 5f 63 65 72 74 73 28 63 65 72 74 73 2c 20 73 6c  _certs(certs, sl
102d0 6f 74 2d 3e 63 61 63 68 65 64 5f 63 65 72 74 73  ot->cached_certs
102e0 2c 20 2a 63 6f 75 6e 74 29 3b 0a 0a 09 09 09 72  , *count);.....r
102f0 65 74 75 72 6e 28 63 65 72 74 73 29 3b 0a 09 09  eturn(certs);...
10300 7d 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 2d  }..}...if (slot-
10310 3e 63 61 63 68 65 64 5f 63 65 72 74 73 29 20 7b  >cached_certs) {
10320 0a 09 09 63 61 63 6b 65 79 5f 66 72 65 65 5f 63  ...cackey_free_c
10330 65 72 74 73 28 73 6c 6f 74 2d 3e 63 61 63 68 65  erts(slot->cache
10340 64 5f 63 65 72 74 73 2c 20 73 6c 6f 74 2d 3e 63  d_certs, slot->c
10350 61 63 68 65 64 5f 63 65 72 74 73 5f 63 6f 75 6e  ached_certs_coun
10360 74 2c 20 31 29 3b 0a 0a 09 09 73 6c 6f 74 2d 3e  t, 1);....slot->
10370 63 61 63 68 65 64 5f 63 65 72 74 73 20 3d 20 4e  cached_certs = N
10380 55 4c 4c 3b 0a 09 7d 0a 0a 09 2f 2a 20 42 65 67  ULL;..}.../* Beg
10390 69 6e 20 61 20 53 6d 61 72 74 43 61 72 64 20 74  in a SmartCard t
103a0 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 74  ransaction */..t
103b0 72 61 6e 73 61 63 74 69 6f 6e 5f 72 65 74 20 3d  ransaction_ret =
103c0 20 63 61 63 6b 65 79 5f 62 65 67 69 6e 5f 74 72   cackey_begin_tr
103d0 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b  ansaction(slot);
103e0 0a 09 69 66 20 28 74 72 61 6e 73 61 63 74 69 6f  ..if (transactio
103f0 6e 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f  n_ret != CACKEY_
10400 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43  PCSC_S_OK) {...C
10410 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
10420 54 46 28 22 55 6e 61 62 6c 65 20 62 65 67 69 6e  TF("Unable begin
10430 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 72 65   transaction, re
10440 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
10450 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  re");....return(
10460 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  NULL);..}...if (
10470 63 65 72 74 73 20 3d 3d 20 4e 55 4c 4c 29 20 7b  certs == NULL) {
10480 0a 09 09 63 65 72 74 73 20 3d 20 6d 61 6c 6c 6f  ...certs = mallo
10490 63 28 73 69 7a 65 6f 66 28 2a 63 65 72 74 73 29  c(sizeof(*certs)
104a0 20 2a 20 35 29 3b 0a 09 09 2a 63 6f 75 6e 74 20   * 5);...*count 
104b0 3d 20 35 3b 0a 09 09 63 65 72 74 73 5f 72 65 73  = 5;...certs_res
104c0 69 7a 61 62 6c 65 20 3d 20 31 3b 0a 09 7d 20 65  izable = 1;..} e
104d0 6c 73 65 20 7b 0a 09 09 63 65 72 74 73 5f 72 65  lse {...certs_re
104e0 73 69 7a 61 62 6c 65 20 3d 20 30 3b 0a 09 7d 0a  sizable = 0;..}.
104f0 0a 09 2f 2a 20 53 65 6c 65 63 74 20 74 68 65 20  ../* Select the 
10500 43 43 43 20 41 70 70 6c 65 74 20 2a 2f 0a 09 73  CCC Applet */..s
10510 65 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79  end_ret = cackey
10520 5f 73 65 6c 65 63 74 5f 61 70 70 6c 65 74 28 73  _select_applet(s
10530 6c 6f 74 2c 20 63 63 63 5f 61 69 64 2c 20 73 69  lot, ccc_aid, si
10540 7a 65 6f 66 28 63 63 63 5f 61 69 64 29 29 3b 0a  zeof(ccc_aid));.
10550 09 69 66 20 28 73 65 6e 64 5f 72 65 74 20 21 3d  .if (send_ret !=
10560 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f   CACKEY_PCSC_S_O
10570 4b 29 20 7b 0a 09 09 2f 2a 20 54 72 79 20 50 49  K) {.../* Try PI
10580 56 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 2a 2f  V application */
10590 0a 09 09 73 65 6e 64 5f 72 65 74 20 3d 20 63 61  ...send_ret = ca
105a0 63 6b 65 79 5f 73 65 6c 65 63 74 5f 61 70 70 6c  ckey_select_appl
105b0 65 74 28 73 6c 6f 74 2c 20 70 69 76 5f 61 69 64  et(slot, piv_aid
105c0 2c 20 73 69 7a 65 6f 66 28 70 69 76 5f 61 69 64  , sizeof(piv_aid
105d0 29 29 3b 0a 09 09 69 66 20 28 73 65 6e 64 5f 72  ));...if (send_r
105e0 65 74 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53  et == CACKEY_PCS
105f0 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 43 41 43  C_S_OK) {....CAC
10600 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
10610 28 22 57 65 20 68 61 76 65 20 61 20 50 49 56 20  ("We have a PIV 
10620 63 61 72 64 20 2d 2d 20 6e 6f 74 20 75 73 69 6e  card -- not usin
10630 67 20 74 68 65 20 43 43 43 2c 20 70 75 6c 6c 69  g the CCC, pulli
10640 6e 67 20 70 72 65 2d 73 65 6c 65 63 74 65 64 20  ng pre-selected 
10650 6b 65 79 73 22 29 3b 0a 0a 09 09 09 70 69 76 20  keys");.....piv 
10660 3d 20 31 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a  = 1;...} else {.
10670 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
10680 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74  PRINTF("Unable t
10690 6f 20 73 65 6c 65 63 74 20 43 43 43 20 41 70 70  o select CCC App
106a0 6c 65 74 2c 20 72 65 74 75 72 6e 69 6e 67 20 69  let, returning i
106b0 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09  n failure");....
106c0 09 2f 2a 20 54 65 72 6d 69 6e 61 74 65 20 53 6d  ./* Terminate Sm
106d0 61 72 74 43 61 72 64 20 54 72 61 6e 73 61 63 74  artCard Transact
106e0 69 6f 6e 20 2a 2f 0a 09 09 09 63 61 63 6b 65 79  ion */....cackey
106f0 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
10700 28 73 6c 6f 74 29 3b 0a 0a 09 09 09 72 65 74 75  (slot);.....retu
10710 72 6e 28 4e 55 4c 4c 29 3b 0a 09 09 7d 0a 09 7d  rn(NULL);...}..}
10720 0a 0a 09 69 66 20 28 70 69 76 29 20 7b 0a 09 09  ...if (piv) {...
10730 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64  for (idx = 0; id
10740 78 20 3c 20 33 3b 20 69 64 78 2b 2b 29 20 7b 0a  x < 3; idx++) {.
10750 09 09 09 73 77 69 74 63 68 20 28 69 64 78 29 20  ...switch (idx) 
10760 7b 0a 09 09 09 09 63 61 73 65 20 30 3a 0a 09 09  {.....case 0:...
10770 09 09 09 70 69 76 5f 6f 69 64 20 3d 20 70 69 76  ...piv_oid = piv
10780 5f 6f 69 64 5f 70 69 76 61 75 74 68 3b 0a 09 09  _oid_pivauth;...
10790 09 09 09 70 69 76 5f 6b 65 79 20 3d 20 4e 49 53  ...piv_key = NIS
107a0 54 53 50 38 30 30 5f 37 38 5f 33 5f 4b 45 59 5f  TSP800_78_3_KEY_
107b0 50 49 56 41 55 54 48 3b 0a 09 09 09 09 09 70 69  PIVAUTH;......pi
107c0 76 5f 6c 61 62 65 6c 20 3d 20 22 41 75 74 68 65  v_label = "Authe
107d0 6e 74 69 63 61 74 69 6f 6e 22 3b 0a 09 09 09 09  ntication";.....
107e0 09 62 72 65 61 6b 3b 0a 09 09 09 09 63 61 73 65  .break;.....case
107f0 20 31 3a 0a 09 09 09 09 09 70 69 76 5f 6f 69 64   1:......piv_oid
10800 20 3d 20 70 69 76 5f 6f 69 64 5f 73 69 67 6e 61   = piv_oid_signa
10810 74 75 72 65 3b 0a 09 09 09 09 09 70 69 76 5f 6b  ture;......piv_k
10820 65 79 20 3d 20 4e 49 53 54 53 50 38 30 30 5f 37  ey = NISTSP800_7
10830 38 5f 33 5f 4b 45 59 5f 53 49 47 4e 41 54 55 52  8_3_KEY_SIGNATUR
10840 45 3b 0a 09 09 09 09 09 70 69 76 5f 6c 61 62 65  E;......piv_labe
10850 6c 20 3d 20 22 53 69 67 6e 61 74 75 72 65 22 3b  l = "Signature";
10860 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
10870 09 63 61 73 65 20 32 3a 0a 09 09 09 09 09 70 69  .case 2:......pi
10880 76 5f 6f 69 64 20 3d 20 70 69 76 5f 6f 69 64 5f  v_oid = piv_oid_
10890 6b 65 79 6d 67 74 3b 0a 09 09 09 09 09 70 69 76  keymgt;......piv
108a0 5f 6b 65 79 20 3d 20 4e 49 53 54 53 50 38 30 30  _key = NISTSP800
108b0 5f 37 38 5f 33 5f 4b 45 59 5f 4b 45 59 4d 47 54  _78_3_KEY_KEYMGT
108c0 3b 0a 09 09 09 09 09 70 69 76 5f 6c 61 62 65 6c  ;......piv_label
108d0 20 3d 20 22 4b 65 79 20 4d 61 6e 61 67 65 6d 65   = "Key Manageme
108e0 6e 74 22 3b 0a 09 09 09 09 09 62 72 65 61 6b 3b  nt";......break;
108f0 0a 09 09 09 7d 0a 0a 09 09 09 72 65 61 64 5f 72  ....}.....read_r
10900 65 74 20 3d 20 63 61 63 6b 65 79 5f 67 65 74 5f  et = cackey_get_
10910 64 61 74 61 28 73 6c 6f 74 2c 20 62 75 66 66 65  data(slot, buffe
10920 72 2c 20 73 69 7a 65 6f 66 28 62 75 66 66 65 72  r, sizeof(buffer
10930 29 2c 20 70 69 76 5f 6f 69 64 29 3b 0a 0a 09 09  ), piv_oid);....
10940 09 69 66 20 28 72 65 61 64 5f 72 65 74 20 3c 3d  .if (read_ret <=
10950 20 30 29 20 7b 0a 09 09 09 09 63 6f 6e 74 69 6e   0) {.....contin
10960 75 65 3b 0a 09 09 09 7d 0a 0a 09 09 09 63 75 72  ue;....}.....cur
10970 72 5f 69 64 20 3d 20 26 63 65 72 74 73 5b 6f 75  r_id = &certs[ou
10980 74 69 64 78 5d 3b 0a 09 09 09 6f 75 74 69 64 78  tidx];....outidx
10990 2b 2b 3b 0a 0a 09 09 09 63 75 72 72 5f 69 64 2d  ++;.....curr_id-
109a0 3e 6b 65 79 73 69 7a 65 20 3d 20 2d 31 3b 0a 09  >keysize = -1;..
109b0 09 09 63 75 72 72 5f 69 64 2d 3e 69 64 5f 74 79  ..curr_id->id_ty
109c0 70 65 20 3d 20 43 41 43 4b 45 59 5f 49 44 5f 54  pe = CACKEY_ID_T
109d0 59 50 45 5f 50 49 56 3b 0a 09 09 09 63 75 72 72  YPE_PIV;....curr
109e0 5f 69 64 2d 3e 63 61 72 64 2e 70 69 76 2e 6b 65  _id->card.piv.ke
109f0 79 5f 69 64 20 3d 20 70 69 76 5f 6b 65 79 3b 0a  y_id = piv_key;.
10a00 09 09 09 6d 65 6d 63 70 79 28 63 75 72 72 5f 69  ...memcpy(curr_i
10a10 64 2d 3e 63 61 72 64 2e 70 69 76 2e 6c 61 62 65  d->card.piv.labe
10a20 6c 2c 20 70 69 76 5f 6c 61 62 65 6c 2c 20 73 74  l, piv_label, st
10a30 72 6c 65 6e 28 70 69 76 5f 6c 61 62 65 6c 29 20  rlen(piv_label) 
10a40 2b 20 31 29 3b 0a 0a 09 09 09 63 75 72 72 5f 69  + 1);.....curr_i
10a50 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65 5f 6c  d->certificate_l
10a60 65 6e 20 3d 20 72 65 61 64 5f 72 65 74 3b 0a 09  en = read_ret;..
10a70 09 09 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69  ..curr_id->certi
10a80 66 69 63 61 74 65 20 3d 20 6d 61 6c 6c 6f 63 28  ficate = malloc(
10a90 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69  curr_id->certifi
10aa0 63 61 74 65 5f 6c 65 6e 29 3b 0a 0a 09 09 09 62  cate_len);.....b
10ab0 75 66 66 65 72 5f 6c 65 6e 20 3d 20 73 69 7a 65  uffer_len = size
10ac0 6f 66 28 62 75 66 66 65 72 29 3b 0a 09 09 09 62  of(buffer);....b
10ad0 75 66 66 65 72 5f 70 20 3d 20 63 61 63 6b 65 79  uffer_p = cackey
10ae0 5f 72 65 61 64 5f 62 65 72 74 6c 76 5f 74 61 67  _read_bertlv_tag
10af0 28 62 75 66 66 65 72 2c 20 26 62 75 66 66 65 72  (buffer, &buffer
10b00 5f 6c 65 6e 2c 20 30 78 37 30 2c 20 63 75 72 72  _len, 0x70, curr
10b10 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65  _id->certificate
10b20 2c 20 26 63 75 72 72 5f 69 64 2d 3e 63 65 72 74  , &curr_id->cert
10b30 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a 0a 09  ificate_len);...
10b40 09 09 69 66 20 28 62 75 66 66 65 72 5f 70 20 3d  ..if (buffer_p =
10b50 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 43 41  = NULL) {.....CA
10b60 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
10b70 46 28 22 52 65 61 64 69 6e 67 20 63 65 72 74 69  F("Reading certi
10b80 66 69 63 61 74 65 20 66 72 6f 6d 20 42 45 52 2d  ficate from BER-
10b90 54 4c 56 20 72 65 73 70 6f 6e 73 65 20 66 61 69  TLV response fai
10ba0 6c 65 64 2c 20 73 6b 69 70 70 69 6e 67 20 6b 65  led, skipping ke
10bb0 79 20 25 69 22 2c 20 69 64 78 29 3b 0a 0a 09 09  y %i", idx);....
10bc0 09 09 66 72 65 65 28 63 75 72 72 5f 69 64 2d 3e  ..free(curr_id->
10bd0 63 65 72 74 69 66 69 63 61 74 65 29 3b 0a 0a 09  certificate);...
10be0 09 09 09 63 75 72 72 5f 69 64 2d 3e 63 65 72 74  ...curr_id->cert
10bf0 69 66 69 63 61 74 65 20 3d 20 4e 55 4c 4c 3b 0a  ificate = NULL;.
10c00 0a 09 09 09 09 6f 75 74 69 64 78 2d 2d 3b 0a 0a  .....outidx--;..
10c10 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09  ....continue;...
10c20 09 7d 0a 0a 23 69 66 64 65 66 20 48 41 56 45 5f  .}..#ifdef HAVE_
10c30 4c 49 42 5a 0a 09 09 09 69 66 20 28 63 75 72 72  LIBZ....if (curr
10c40 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65  _id->certificate
10c50 5f 6c 65 6e 20 3e 20 34 29 20 7b 0a 09 09 09 09  _len > 4) {.....
10c60 69 66 20 28 6d 65 6d 63 6d 70 28 63 75 72 72 5f  if (memcmp(curr_
10c70 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65 2c  id->certificate,
10c80 20 22 5c 78 31 66 5c 78 38 62 5c 78 30 38 5c 78   "\x1f\x8b\x08\x
10c90 30 30 22 2c 20 34 29 20 3d 3d 20 30 29 20 7b 0a  00", 4) == 0) {.
10ca0 09 09 09 09 09 74 6d 70 62 75 66 6c 65 6e 20 3d  .....tmpbuflen =
10cb0 20 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66   curr_id->certif
10cc0 69 63 61 74 65 5f 6c 65 6e 20 2a 20 32 3b 0a 09  icate_len * 2;..
10cd0 09 09 09 09 74 6d 70 62 75 66 20 3d 20 6d 61 6c  ....tmpbuf = mal
10ce0 6c 6f 63 28 74 6d 70 62 75 66 6c 65 6e 29 3b 0a  loc(tmpbuflen);.
10cf0 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
10d00 55 47 5f 50 52 49 4e 54 42 55 46 28 22 41 74 74  UG_PRINTBUF("Att
10d10 65 6d 70 74 69 6e 67 20 74 6f 20 64 65 63 6f 6d  empting to decom
10d20 70 72 65 73 73 3a 22 2c 20 63 75 72 72 5f 69 64  press:", curr_id
10d30 2d 3e 63 65 72 74 69 66 69 63 61 74 65 2c 20 63  ->certificate, c
10d40 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63  urr_id->certific
10d50 61 74 65 5f 6c 65 6e 29 3b 0a 0a 09 09 09 09 09  ate_len);.......
10d60 67 7a 69 70 5f 73 74 72 65 61 6d 2e 7a 61 6c 6c  gzip_stream.zall
10d70 6f 63 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 09  oc = NULL;......
10d80 67 7a 69 70 5f 73 74 72 65 61 6d 2e 7a 66 72 65  gzip_stream.zfre
10d90 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 67  e = NULL;......g
10da0 7a 69 70 5f 73 74 72 65 61 6d 2e 6f 70 61 71 75  zip_stream.opaqu
10db0 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09 09  e = NULL;.......
10dc0 67 7a 69 70 5f 73 74 72 65 61 6d 2e 6e 65 78 74  gzip_stream.next
10dd0 5f 69 6e 20 20 3d 20 63 75 72 72 5f 69 64 2d 3e  _in  = curr_id->
10de0 63 65 72 74 69 66 69 63 61 74 65 3b 0a 09 09 09  certificate;....
10df0 09 09 67 7a 69 70 5f 73 74 72 65 61 6d 2e 61 76  ..gzip_stream.av
10e00 61 69 6c 5f 69 6e 20 3d 20 63 75 72 72 5f 69 64  ail_in = curr_id
10e10 2d 3e 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65  ->certificate_le
10e20 6e 3b 0a 09 09 09 09 09 67 7a 69 70 5f 73 74 72  n;......gzip_str
10e30 65 61 6d 2e 6e 65 78 74 5f 6f 75 74 20 3d 20 74  eam.next_out = t
10e40 6d 70 62 75 66 3b 0a 09 09 09 09 09 67 7a 69 70  mpbuf;......gzip
10e50 5f 73 74 72 65 61 6d 2e 61 76 61 69 6c 5f 6f 75  _stream.avail_ou
10e60 74 20 3d 20 74 6d 70 62 75 66 6c 65 6e 3b 0a 0a  t = tmpbuflen;..
10e70 09 09 09 09 09 75 6e 63 6f 6d 70 72 65 73 73 5f  .....uncompress_
10e80 72 65 74 20 3d 20 69 6e 66 6c 61 74 65 49 6e 69  ret = inflateIni
10e90 74 28 26 67 7a 69 70 5f 73 74 72 65 61 6d 29 3b  t(&gzip_stream);
10ea0 0a 09 09 09 09 09 69 66 20 28 75 6e 63 6f 6d 70  ......if (uncomp
10eb0 72 65 73 73 5f 72 65 74 20 3d 3d 20 5a 5f 4f 4b  ress_ret == Z_OK
10ec0 29 20 7b 0a 09 09 09 09 09 09 75 6e 63 6f 6d 70  ) {.......uncomp
10ed0 72 65 73 73 5f 72 65 74 20 3d 20 69 6e 66 6c 61  ress_ret = infla
10ee0 74 65 52 65 73 65 74 32 28 26 67 7a 69 70 5f 73  teReset2(&gzip_s
10ef0 74 72 65 61 6d 2c 20 33 31 29 3b 0a 09 09 09 09  tream, 31);.....
10f00 09 7d 0a 09 09 09 09 09 69 66 20 28 75 6e 63 6f  .}......if (unco
10f10 6d 70 72 65 73 73 5f 72 65 74 20 3d 3d 20 5a 5f  mpress_ret == Z_
10f20 4f 4b 29 20 7b 0a 09 09 09 09 09 09 75 6e 63 6f  OK) {.......unco
10f30 6d 70 72 65 73 73 5f 72 65 74 20 3d 20 69 6e 66  mpress_ret = inf
10f40 6c 61 74 65 28 26 67 7a 69 70 5f 73 74 72 65 61  late(&gzip_strea
10f50 6d 2c 20 30 29 3b 0a 09 09 09 09 09 7d 0a 09 09  m, 0);......}...
10f60 09 09 09 69 66 20 28 75 6e 63 6f 6d 70 72 65 73  ...if (uncompres
10f70 73 5f 72 65 74 20 3d 3d 20 5a 5f 53 54 52 45 41  s_ret == Z_STREA
10f80 4d 5f 45 4e 44 29 20 7b 0a 09 09 09 09 09 09 75  M_END) {.......u
10f90 6e 63 6f 6d 70 72 65 73 73 5f 72 65 74 20 3d 20  ncompress_ret = 
10fa0 69 6e 66 6c 61 74 65 45 6e 64 28 26 67 7a 69 70  inflateEnd(&gzip
10fb0 5f 73 74 72 65 61 6d 29 3b 0a 09 09 09 09 09 7d  _stream);......}
10fc0 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09 75 6e   else {.......un
10fd0 63 6f 6d 70 72 65 73 73 5f 72 65 74 20 3d 20 5a  compress_ret = Z
10fe0 5f 44 41 54 41 5f 45 52 52 4f 52 3b 0a 09 09 09  _DATA_ERROR;....
10ff0 09 09 7d 0a 09 09 09 09 09 69 66 20 28 75 6e 63  ..}......if (unc
11000 6f 6d 70 72 65 73 73 5f 72 65 74 20 3d 3d 20 5a  ompress_ret == Z
11010 5f 4f 4b 29 20 7b 0a 09 09 09 09 09 09 43 41 43  _OK) {.......CAC
11020 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42  KEY_DEBUG_PRINTB
11030 55 46 28 22 44 65 63 6f 6d 70 72 65 73 73 65 64  UF("Decompressed
11040 20 74 6f 3a 22 2c 20 74 6d 70 62 75 66 2c 20 74   to:", tmpbuf, t
11050 6d 70 62 75 66 6c 65 6e 29 3b 0a 0a 09 09 09 09  mpbuflen);......
11060 09 09 66 72 65 65 28 63 75 72 72 5f 69 64 2d 3e  ..free(curr_id->
11070 63 65 72 74 69 66 69 63 61 74 65 29 3b 0a 0a 09  certificate);...
11080 09 09 09 09 09 63 75 72 72 5f 69 64 2d 3e 63 65  .....curr_id->ce
11090 72 74 69 66 69 63 61 74 65 20 3d 20 74 6d 70 62  rtificate = tmpb
110a0 75 66 3b 0a 09 09 09 09 09 09 63 75 72 72 5f 69  uf;.......curr_i
110b0 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65 5f 6c  d->certificate_l
110c0 65 6e 20 3d 20 74 6d 70 62 75 66 6c 65 6e 3b 0a  en = tmpbuflen;.
110d0 09 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  .....} else {...
110e0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
110f0 5f 50 52 49 4e 54 46 28 22 44 65 63 6f 6d 70 72  _PRINTF("Decompr
11100 65 73 73 69 6e 67 20 66 61 69 6c 65 64 21 20 75  essing failed! u
11110 6e 63 6f 6d 70 72 65 73 73 28 29 20 72 65 74 75  ncompress() retu
11120 72 6e 65 64 20 25 69 22 2c 20 75 6e 63 6f 6d 70  rned %i", uncomp
11130 72 65 73 73 5f 72 65 74 29 3b 0a 0a 09 09 09 09  ress_ret);......
11140 09 09 66 72 65 65 28 74 6d 70 62 75 66 29 3b 0a  ..free(tmpbuf);.
11150 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 09 09 09  .....}.....}....
11160 7d 0a 23 65 6e 64 69 66 0a 09 09 7d 0a 09 7d 20  }.#endif...}..} 
11170 65 6c 73 65 20 7b 0a 09 09 2f 2a 20 52 65 61 64  else {.../* Read
11180 20 61 6c 6c 20 74 68 65 20 61 70 70 6c 65 74 73   all the applets
11190 20 66 72 6f 6d 20 74 68 65 20 43 43 43 27 73 20   from the CCC's 
111a0 54 4c 56 20 2a 2f 0a 09 09 63 63 63 5f 74 6c 76  TLV */...ccc_tlv
111b0 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 74   = cackey_read_t
111c0 6c 76 28 73 6c 6f 74 29 3b 0a 0a 09 09 2f 2a 20  lv(slot);..../* 
111d0 4c 6f 6f 6b 20 66 6f 72 20 43 41 52 44 55 52 4c  Look for CARDURL
111e0 73 20 74 68 61 74 20 63 6f 6f 72 65 73 70 6f 6e  s that coorespon
111f0 64 20 74 6f 20 50 4b 49 20 61 70 70 6c 65 74 73  d to PKI applets
11200 20 2a 2f 0a 09 09 66 6f 72 20 28 63 63 63 5f 63   */...for (ccc_c
11210 75 72 72 20 3d 20 63 63 63 5f 74 6c 76 3b 20 63  urr = ccc_tlv; c
11220 63 63 5f 63 75 72 72 3b 20 63 63 63 5f 63 75 72  cc_curr; ccc_cur
11230 72 20 3d 20 63 63 63 5f 63 75 72 72 2d 3e 5f 6e  r = ccc_curr->_n
11240 65 78 74 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  ext) {....CACKEY
11250 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46  _DEBUG_PRINTF("F
11260 6f 75 6e 64 20 74 61 67 3a 20 25 73 20 2e 2e 2e  ound tag: %s ...
11270 20 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47   ", CACKEY_DEBUG
11280 5f 46 55 4e 43 5f 54 41 47 5f 54 4f 5f 53 54 52  _FUNC_TAG_TO_STR
11290 28 63 63 63 5f 63 75 72 72 2d 3e 74 61 67 29 29  (ccc_curr->tag))
112a0 3b 0a 0a 09 09 09 69 66 20 28 63 63 63 5f 63 75  ;.....if (ccc_cu
112b0 72 72 2d 3e 74 61 67 20 21 3d 20 47 53 43 49 53  rr->tag != GSCIS
112c0 5f 54 41 47 5f 43 41 52 44 55 52 4c 29 20 7b 0a  _TAG_CARDURL) {.
112d0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
112e0 5f 50 52 49 4e 54 46 28 22 20 20 2e 2e 2e 20 73  _PRINTF("  ... s
112f0 6b 69 70 70 69 6e 67 20 69 74 20 28 77 65 20 6f  kipping it (we o
11300 6e 6c 79 20 63 61 72 65 20 61 62 6f 75 74 20 43  nly care about C
11310 41 52 44 55 52 4c 73 29 22 29 3b 0a 0a 09 09 09  ARDURLs)");.....
11320 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 7d 0a  .continue;....}.
11330 0a 09 09 09 69 66 20 28 28 63 63 63 5f 63 75 72  ....if ((ccc_cur
11340 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c  r->value_cardurl
11350 2d 3e 61 70 70 74 79 70 65 20 26 20 43 41 43 4b  ->apptype & CACK
11360 45 59 5f 54 4c 56 5f 41 50 50 5f 50 4b 49 29 20  EY_TLV_APP_PKI) 
11370 21 3d 20 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50  != CACKEY_TLV_AP
11380 50 5f 50 4b 49 29 20 7b 0a 09 09 09 09 43 41 43  P_PKI) {.....CAC
11390 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
113a0 28 22 20 20 2e 2e 2e 20 73 6b 69 70 70 69 6e 67  ("  ... skipping
113b0 20 69 74 20 28 77 65 20 6f 6e 6c 79 20 63 61 72   it (we only car
113c0 65 20 61 62 6f 75 74 20 50 4b 49 20 61 70 70 6c  e about PKI appl
113d0 65 74 73 2c 20 74 68 69 73 20 61 70 70 6c 65 74  ets, this applet
113e0 20 73 75 70 70 6f 72 74 73 3a 20 25 73 2f 25 30   supports: %s/%0
113f0 32 78 29 22 2c 20 43 41 43 4b 45 59 5f 44 45 42  2x)", CACKEY_DEB
11400 55 47 5f 46 55 4e 43 5f 41 50 50 54 59 50 45 5f  UG_FUNC_APPTYPE_
11410 54 4f 5f 53 54 52 28 63 63 63 5f 63 75 72 72 2d  TO_STR(ccc_curr-
11420 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e  >value_cardurl->
11430 61 70 70 74 79 70 65 29 2c 20 28 75 6e 73 69 67  apptype), (unsig
11440 6e 65 64 20 69 6e 74 29 20 63 63 63 5f 63 75 72  ned int) ccc_cur
11450 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c  r->value_cardurl
11460 2d 3e 61 70 70 74 79 70 65 29 3b 0a 0a 09 09 09  ->apptype);.....
11470 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 7d 0a  .continue;....}.
11480 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
11490 5f 50 52 49 4e 54 42 55 46 28 22 52 49 44 3a 22  _PRINTBUF("RID:"
114a0 2c 20 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75  , ccc_curr->valu
114b0 65 5f 63 61 72 64 75 72 6c 2d 3e 72 69 64 2c 20  e_cardurl->rid, 
114c0 73 69 7a 65 6f 66 28 63 63 63 5f 63 75 72 72 2d  sizeof(ccc_curr-
114d0 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e  >value_cardurl->
114e0 72 69 64 29 29 3b 0a 09 09 09 43 41 43 4b 45 59  rid));....CACKEY
114f0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 41  _DEBUG_PRINTF("A
11500 70 70 49 44 20 3d 20 25 73 2f 25 30 34 6c 78 22  ppID = %s/%04lx"
11510 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46  , CACKEY_DEBUG_F
11520 55 4e 43 5f 4f 42 4a 49 44 5f 54 4f 5f 53 54 52  UNC_OBJID_TO_STR
11530 28 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65  (ccc_curr->value
11540 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70 69 64 29  _cardurl->appid)
11550 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
11560 29 20 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75  ) ccc_curr->valu
11570 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70 69 64  e_cardurl->appid
11580 29 3b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42  );....CACKEY_DEB
11590 55 47 5f 50 52 49 4e 54 46 28 22 4f 62 6a 65 63  UG_PRINTF("Objec
115a0 74 49 44 20 3d 20 25 73 2f 25 30 34 6c 78 22 2c  tID = %s/%04lx",
115b0 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55   CACKEY_DEBUG_FU
115c0 4e 43 5f 4f 42 4a 49 44 5f 54 4f 5f 53 54 52 28  NC_OBJID_TO_STR(
115d0 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f  ccc_curr->value_
115e0 63 61 72 64 75 72 6c 2d 3e 6f 62 6a 65 63 74 69  cardurl->objecti
115f0 64 29 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  d), (unsigned lo
11600 6e 67 29 20 63 63 63 5f 63 75 72 72 2d 3e 76 61  ng) ccc_curr->va
11610 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 6f 62 6a  lue_cardurl->obj
11620 65 63 74 69 64 29 3b 0a 0a 09 09 09 6d 65 6d 63  ectid);.....memc
11630 70 79 28 63 75 72 72 5f 61 69 64 2c 20 63 63 63  py(curr_aid, ccc
11640 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72  _curr->value_car
11650 64 75 72 6c 2d 3e 72 69 64 2c 20 73 69 7a 65 6f  durl->rid, sizeo
11660 66 28 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75  f(ccc_curr->valu
11670 65 5f 63 61 72 64 75 72 6c 2d 3e 72 69 64 29 29  e_cardurl->rid))
11680 3b 0a 09 09 09 63 75 72 72 5f 61 69 64 5b 73 69  ;....curr_aid[si
11690 7a 65 6f 66 28 63 75 72 72 5f 61 69 64 29 20 2d  zeof(curr_aid) -
116a0 20 32 5d 20 3d 20 28 63 63 63 5f 63 75 72 72 2d   2] = (ccc_curr-
116b0 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e  >value_cardurl->
116c0 61 70 70 69 64 20 3e 3e 20 38 29 20 26 20 30 78  appid >> 8) & 0x
116d0 66 66 3b 0a 09 09 09 63 75 72 72 5f 61 69 64 5b  ff;....curr_aid[
116e0 73 69 7a 65 6f 66 28 63 75 72 72 5f 61 69 64 29  sizeof(curr_aid)
116f0 20 2d 20 31 5d 20 3d 20 63 63 63 5f 63 75 72 72   - 1] = ccc_curr
11700 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d  ->value_cardurl-
11710 3e 61 70 70 69 64 20 26 20 30 78 66 66 3b 0a 0a  >appid & 0xff;..
11720 09 09 09 2f 2a 20 53 65 6c 65 63 74 20 66 6f 75  .../* Select fou
11730 6e 64 20 61 70 70 6c 65 74 20 2e 2e 2e 20 2a 2f  nd applet ... */
11740 0a 09 09 09 73 65 6c 65 63 74 5f 72 65 74 20 3d  ....select_ret =
11750 20 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 61   cackey_select_a
11760 70 70 6c 65 74 28 73 6c 6f 74 2c 20 63 75 72 72  pplet(slot, curr
11770 5f 61 69 64 2c 20 73 69 7a 65 6f 66 28 63 75 72  _aid, sizeof(cur
11780 72 5f 61 69 64 29 29 3b 0a 09 09 09 69 66 20 28  r_aid));....if (
11790 73 65 6c 65 63 74 5f 72 65 74 20 21 3d 20 43 41  select_ret != CA
117a0 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20  CKEY_PCSC_S_OK) 
117b0 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  {.....CACKEY_DEB
117c0 55 47 5f 50 52 49 4e 54 46 28 22 46 61 69 6c 65  UG_PRINTF("Faile
117d0 64 20 74 6f 20 73 65 6c 65 63 74 20 61 70 70 6c  d to select appl
117e0 65 74 2c 20 73 6b 69 70 70 69 6e 67 20 70 72 6f  et, skipping pro
117f0 63 65 73 73 69 6e 67 20 6f 66 20 74 68 69 73 20  cessing of this 
11800 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 63  object");......c
11810 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a 09  ontinue;....}...
11820 09 09 2f 2a 20 2e 2e 2e 20 61 6e 64 20 6f 62 6a  ../* ... and obj
11830 65 63 74 20 28 66 69 6c 65 29 20 2a 2f 0a 09 09  ect (file) */...
11840 09 73 65 6c 65 63 74 5f 72 65 74 20 3d 20 63 61  .select_ret = ca
11850 63 6b 65 79 5f 73 65 6c 65 63 74 5f 66 69 6c 65  ckey_select_file
11860 28 73 6c 6f 74 2c 20 63 63 63 5f 63 75 72 72 2d  (slot, ccc_curr-
11870 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e  >value_cardurl->
11880 6f 62 6a 65 63 74 69 64 29 3b 0a 09 09 09 69 66  objectid);....if
11890 20 28 73 65 6c 65 63 74 5f 72 65 74 20 21 3d 20   (select_ret != 
118a0 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
118b0 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  ) {.....CACKEY_D
118c0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 61 69  EBUG_PRINTF("Fai
118d0 6c 65 64 20 74 6f 20 73 65 6c 65 63 74 20 66 69  led to select fi
118e0 6c 65 2c 20 73 6b 69 70 70 69 6e 67 20 70 72 6f  le, skipping pro
118f0 63 65 73 73 69 6e 67 20 6f 66 20 74 68 69 73 20  cessing of this 
11900 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 63  object");......c
11910 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a 09  ontinue;....}...
11920 09 09 2f 2a 20 50 72 6f 63 65 73 73 20 74 68 69  ../* Process thi
11930 73 20 66 69 6c 65 27 73 20 54 4c 56 20 6c 6f 6f  s file's TLV loo
11940 6b 69 6e 67 20 66 6f 72 20 63 65 72 74 69 66 69  king for certifi
11950 63 61 74 65 73 20 2a 2f 0a 09 09 09 61 70 70 5f  cates */....app_
11960 74 6c 76 20 3d 20 63 61 63 6b 65 79 5f 72 65 61  tlv = cackey_rea
11970 64 5f 74 6c 76 28 73 6c 6f 74 29 3b 0a 09 0a 09  d_tlv(slot);....
11980 09 09 66 6f 72 20 28 61 70 70 5f 63 75 72 72 20  ..for (app_curr 
11990 3d 20 61 70 70 5f 74 6c 76 3b 20 61 70 70 5f 63  = app_tlv; app_c
119a0 75 72 72 3b 20 61 70 70 5f 63 75 72 72 20 3d 20  urr; app_curr = 
119b0 61 70 70 5f 63 75 72 72 2d 3e 5f 6e 65 78 74 29  app_curr->_next)
119c0 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45   {.....CACKEY_DE
119d0 42 55 47 5f 50 52 49 4e 54 46 28 22 46 6f 75 6e  BUG_PRINTF("Foun
119e0 64 20 74 61 67 3a 20 25 73 22 2c 20 43 41 43 4b  d tag: %s", CACK
119f0 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 54 41  EY_DEBUG_FUNC_TA
11a00 47 5f 54 4f 5f 53 54 52 28 61 70 70 5f 63 75 72  G_TO_STR(app_cur
11a10 72 2d 3e 74 61 67 29 29 3b 0a 09 09 09 09 69 66  r->tag));.....if
11a20 20 28 61 70 70 5f 63 75 72 72 2d 3e 74 61 67 20   (app_curr->tag 
11a30 21 3d 20 47 53 43 49 53 5f 54 41 47 5f 43 45 52  != GSCIS_TAG_CER
11a40 54 49 46 49 43 41 54 45 29 20 7b 0a 09 09 09 09  TIFICATE) {.....
11a50 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
11a60 49 4e 54 46 28 22 20 20 2e 2e 2e 20 73 6b 69 70  INTF("  ... skip
11a70 70 69 6e 67 20 69 74 20 28 77 65 20 6f 6e 6c 79  ping it (we only
11a80 20 63 61 72 65 20 61 62 6f 75 74 20 43 45 52 54   care about CERT
11a90 49 46 49 43 41 54 45 73 29 22 29 3b 0a 0a 09 09  IFICATEs)");....
11aa0 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09  ...continue;....
11ab0 09 7d 0a 0a 09 09 09 09 63 75 72 72 5f 69 64 20  .}......curr_id 
11ac0 3d 20 26 63 65 72 74 73 5b 6f 75 74 69 64 78 5d  = &certs[outidx]
11ad0 3b 0a 09 09 09 09 6f 75 74 69 64 78 2b 2b 3b 0a  ;.....outidx++;.
11ae0 0a 09 09 09 09 63 75 72 72 5f 69 64 2d 3e 69 64  .....curr_id->id
11af0 5f 74 79 70 65 20 3d 20 43 41 43 4b 45 59 5f 49  _type = CACKEY_I
11b00 44 5f 54 59 50 45 5f 43 41 43 3b 0a 09 09 09 09  D_TYPE_CAC;.....
11b10 6d 65 6d 63 70 79 28 63 75 72 72 5f 69 64 2d 3e  memcpy(curr_id->
11b20 63 61 72 64 2e 63 61 63 2e 61 70 70 6c 65 74 2c  card.cac.applet,
11b30 20 63 75 72 72 5f 61 69 64 2c 20 73 69 7a 65 6f   curr_aid, sizeo
11b40 66 28 63 75 72 72 5f 69 64 2d 3e 63 61 72 64 2e  f(curr_id->card.
11b50 63 61 63 2e 61 70 70 6c 65 74 29 29 3b 0a 09 09  cac.applet));...
11b60 09 09 63 75 72 72 5f 69 64 2d 3e 63 61 72 64 2e  ..curr_id->card.
11b70 63 61 63 2e 66 69 6c 65 20 3d 20 63 63 63 5f 63  cac.file = ccc_c
11b80 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75  urr->value_cardu
11b90 72 6c 2d 3e 6f 62 6a 65 63 74 69 64 3b 0a 09 09  rl->objectid;...
11ba0 09 09 63 75 72 72 5f 69 64 2d 3e 6b 65 79 73 69  ..curr_id->keysi
11bb0 7a 65 20 3d 20 2d 31 3b 0a 0a 09 09 09 09 43 41  ze = -1;......CA
11bc0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
11bd0 46 28 22 46 69 6c 6c 69 6e 67 20 63 75 72 72 5f  F("Filling curr_
11be0 69 64 2d 3e 63 61 72 64 2e 63 61 63 2e 61 70 70  id->card.cac.app
11bf0 6c 65 74 20 28 25 70 29 20 77 69 74 68 20 25 6c  let (%p) with %l
11c00 75 20 62 79 74 65 73 3a 22 2c 20 63 75 72 72 5f  u bytes:", curr_
11c10 69 64 2d 3e 63 61 72 64 2e 63 61 63 2e 61 70 70  id->card.cac.app
11c20 6c 65 74 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  let, (unsigned l
11c30 6f 6e 67 29 20 73 69 7a 65 6f 66 28 63 75 72 72  ong) sizeof(curr
11c40 5f 69 64 2d 3e 63 61 72 64 2e 63 61 63 2e 61 70  _id->card.cac.ap
11c50 70 6c 65 74 29 29 3b 0a 09 09 09 09 43 41 43 4b  plet));.....CACK
11c60 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55  EY_DEBUG_PRINTBU
11c70 46 28 22 56 41 4c 3a 22 2c 20 63 75 72 72 5f 69  F("VAL:", curr_i
11c80 64 2d 3e 63 61 72 64 2e 63 61 63 2e 61 70 70 6c  d->card.cac.appl
11c90 65 74 2c 20 73 69 7a 65 6f 66 28 63 75 72 72 5f  et, sizeof(curr_
11ca0 69 64 2d 3e 63 61 72 64 2e 63 61 63 2e 61 70 70  id->card.cac.app
11cb0 6c 65 74 29 29 3b 0a 0a 09 09 09 09 63 75 72 72  let));......curr
11cc0 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65  _id->certificate
11cd0 5f 6c 65 6e 20 3d 20 61 70 70 5f 63 75 72 72 2d  _len = app_curr-
11ce0 3e 6c 65 6e 67 74 68 3b 0a 0a 09 09 09 09 63 75  >length;......cu
11cf0 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61  rr_id->certifica
11d00 74 65 20 3d 20 6d 61 6c 6c 6f 63 28 63 75 72 72  te = malloc(curr
11d10 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65  _id->certificate
11d20 5f 6c 65 6e 29 3b 0a 09 09 09 09 6d 65 6d 63 70  _len);.....memcp
11d30 79 28 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69  y(curr_id->certi
11d40 66 69 63 61 74 65 2c 20 61 70 70 5f 63 75 72 72  ficate, app_curr
11d50 2d 3e 76 61 6c 75 65 2c 20 63 75 72 72 5f 69 64  ->value, curr_id
11d60 2d 3e 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65  ->certificate_le
11d70 6e 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 75 74  n);......if (out
11d80 69 64 78 20 3e 3d 20 2a 63 6f 75 6e 74 29 20 7b  idx >= *count) {
11d90 0a 09 09 09 09 09 69 66 20 28 63 65 72 74 73 5f  ......if (certs_
11da0 72 65 73 69 7a 61 62 6c 65 29 20 7b 0a 09 09 09  resizable) {....
11db0 09 09 09 2a 63 6f 75 6e 74 20 2a 3d 20 32 3b 0a  ...*count *= 2;.
11dc0 09 09 09 09 09 09 69 66 20 28 2a 63 6f 75 6e 74  ......if (*count
11dd0 20 21 3d 20 30 29 20 7b 0a 09 09 09 09 09 09 09   != 0) {........
11de0 63 65 72 74 73 20 3d 20 72 65 61 6c 6c 6f 63 28  certs = realloc(
11df0 63 65 72 74 73 2c 20 73 69 7a 65 6f 66 28 2a 63  certs, sizeof(*c
11e00 65 72 74 73 29 20 2a 20 28 2a 63 6f 75 6e 74 29  erts) * (*count)
11e10 29 3b 0a 09 09 09 09 09 09 7d 20 65 6c 73 65 20  );.......} else 
11e20 7b 0a 09 09 09 09 09 09 09 63 65 72 74 73 20 3d  {........certs =
11e30 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 09 7d 0a 09   NULL;.......}..
11e40 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ....} else {....
11e50 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 7d  ...break;......}
11e60 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 09  .....}....}.....
11e70 63 61 63 6b 65 79 5f 66 72 65 65 5f 74 6c 76 28  cackey_free_tlv(
11e80 61 70 70 5f 74 6c 76 29 3b 0a 0a 09 09 09 69 66  app_tlv);.....if
11e90 20 28 6f 75 74 69 64 78 20 3e 3d 20 2a 63 6f 75   (outidx >= *cou
11ea0 6e 74 29 20 7b 0a 09 09 09 09 62 72 65 61 6b 3b  nt) {.....break;
11eb0 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 63 61 63  ....}...}....cac
11ec0 6b 65 79 5f 66 72 65 65 5f 74 6c 76 28 63 63 63  key_free_tlv(ccc
11ed0 5f 74 6c 76 29 3b 0a 09 7d 0a 0a 09 2a 63 6f 75  _tlv);..}...*cou
11ee0 6e 74 20 3d 20 6f 75 74 69 64 78 3b 0a 0a 09 69  nt = outidx;...i
11ef0 66 20 28 63 65 72 74 73 5f 72 65 73 69 7a 61 62  f (certs_resizab
11f00 6c 65 29 20 7b 0a 09 09 69 66 20 28 2a 63 6f 75  le) {...if (*cou
11f10 6e 74 20 21 3d 20 30 29 20 7b 0a 09 09 09 63 65  nt != 0) {....ce
11f20 72 74 73 20 3d 20 72 65 61 6c 6c 6f 63 28 63 65  rts = realloc(ce
11f30 72 74 73 2c 20 73 69 7a 65 6f 66 28 2a 63 65 72  rts, sizeof(*cer
11f40 74 73 29 20 2a 20 28 2a 63 6f 75 6e 74 29 29 3b  ts) * (*count));
11f50 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 63  ...} else {....c
11f60 65 72 74 73 20 3d 20 4e 55 4c 4c 3b 0a 09 09 7d  erts = NULL;...}
11f70 0a 09 7d 0a 0a 09 73 6c 6f 74 2d 3e 63 61 63 68  ..}...slot->cach
11f80 65 64 5f 63 65 72 74 73 20 3d 20 63 61 63 6b 65  ed_certs = cacke
11f90 79 5f 63 6f 70 79 5f 63 65 72 74 73 28 4e 55 4c  y_copy_certs(NUL
11fa0 4c 2c 20 63 65 72 74 73 2c 20 2a 63 6f 75 6e 74  L, certs, *count
11fb0 29 3b 0a 09 73 6c 6f 74 2d 3e 63 61 63 68 65 64  );..slot->cached
11fc0 5f 63 65 72 74 73 5f 63 6f 75 6e 74 20 3d 20 2a  _certs_count = *
11fd0 63 6f 75 6e 74 3b 0a 0a 09 2f 2a 20 54 65 72 6d  count;.../* Term
11fe0 69 6e 61 74 65 20 53 6d 61 72 74 43 61 72 64 20  inate SmartCard 
11ff0 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09  Transaction */..
12000 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73  cackey_end_trans
12010 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09  action(slot);...
12020 72 65 74 75 72 6e 28 63 65 72 74 73 29 3b 0a 7d  return(certs);.}
12030 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53  ../*. * SYNPOSIS
12040 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20  . *     .... *. 
12050 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20  * ARGUMENTS. *  
12060 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54     .... *. * RET
12070 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20  URN VALUE. *    
12080 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53   .... *. * NOTES
12090 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20  . *     .... *. 
120a0 2a 2f 0a 73 74 61 74 69 63 20 73 73 69 7a 65 5f  */.static ssize_
120b0 74 20 63 61 63 6b 65 79 5f 73 69 67 6e 64 65 63  t cackey_signdec
120c0 72 79 70 74 28 73 74 72 75 63 74 20 63 61 63 6b  rypt(struct cack
120d0 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 73  ey_slot *slot, s
120e0 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65  truct cackey_ide
120f0 6e 74 69 74 79 20 2a 69 64 65 6e 74 69 74 79 2c  ntity *identity,
12100 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
12110 62 75 66 2c 20 73 69 7a 65 5f 74 20 62 75 66 6c  buf, size_t bufl
12120 65 6e 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  en, unsigned cha
12130 72 20 2a 6f 75 74 62 75 66 2c 20 73 69 7a 65 5f  r *outbuf, size_
12140 74 20 6f 75 74 62 75 66 6c 65 6e 2c 20 69 6e 74  t outbuflen, int
12150 20 70 61 64 49 6e 70 75 74 2c 20 69 6e 74 20 75   padInput, int u
12160 6e 70 61 64 4f 75 74 70 75 74 29 20 7b 0a 09 63  npadOutput) {..c
12170 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 5f 74 79  ackey_pcsc_id_ty
12180 70 65 20 69 64 5f 74 79 70 65 3b 0a 09 75 6e 73  pe id_type;..uns
12190 69 67 6e 65 64 20 63 68 61 72 20 64 79 6e 5f 61  igned char dyn_a
121a0 75 74 68 5f 74 65 6d 70 6c 61 74 65 5b 31 30 5d  uth_template[10]
121b0 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72  ;..unsigned char
121c0 20 2a 74 6d 70 62 75 66 2c 20 2a 74 6d 70 62 75   *tmpbuf, *tmpbu
121d0 66 5f 73 2c 20 2a 6f 75 74 62 75 66 5f 73 2c 20  f_s, *outbuf_s, 
121e0 2a 6f 75 74 62 75 66 5f 70 3b 0a 09 75 6e 73 69  *outbuf_p;..unsi
121f0 67 6e 65 64 20 63 68 61 72 20 62 79 74 65 73 5f  gned char bytes_
12200 74 6f 5f 73 65 6e 64 2c 20 70 31 2c 20 63 6c 61  to_send, p1, cla
12210 73 73 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68  ss;..unsigned ch
12220 61 72 20 62 6c 6f 63 6b 74 79 70 65 3b 0a 09 63  ar blocktype;..c
12230 61 63 6b 65 79 5f 72 65 74 20 73 65 6e 64 5f 72  ackey_ret send_r
12240 65 74 3b 0a 09 75 69 6e 74 31 36 5f 74 20 72 65  et;..uint16_t re
12250 73 70 63 6f 64 65 3b 0a 09 73 73 69 7a 65 5f 74  spcode;..ssize_t
12260 20 72 65 74 76 61 6c 20 3d 20 30 2c 20 75 6e 70   retval = 0, unp
12270 61 64 6f 66 66 73 65 74 3b 0a 09 73 69 7a 65 5f  adoffset;..size_
12280 74 20 74 6d 70 62 75 66 6c 65 6e 2c 20 70 61 64  t tmpbuflen, pad
12290 6c 65 6e 2c 20 74 6d 70 6f 75 74 62 75 66 6c 65  len, tmpoutbufle
122a0 6e 2c 20 6f 75 74 62 75 66 5f 6c 65 6e 3b 0a 09  n, outbuf_len;..
122b0 69 6e 74 20 66 72 65 65 5f 74 6d 70 62 75 66 20  int free_tmpbuf 
122c0 3d 20 30 3b 0a 09 69 6e 74 20 6c 65 3b 0a 0a 09  = 0;..int le;...
122d0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
122e0 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
122f0 0a 09 69 66 20 28 73 6c 6f 74 20 3d 3d 20 4e 55  ..if (slot == NU
12300 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
12310 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
12320 6f 72 2e 20 20 73 6c 6f 74 20 69 73 20 4e 55 4c  or.  slot is NUL
12330 4c 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d  L");....return(-
12340 31 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 62 75 66  1);..}...if (buf
12350 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
12360 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
12370 46 28 22 45 72 72 6f 72 2e 20 20 62 75 66 20 69  F("Error.  buf i
12380 73 20 4e 55 4c 4c 22 29 3b 0a 0a 09 09 72 65 74  s NULL");....ret
12390 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 69 66  urn(-1);..}...if
123a0 20 28 6f 75 74 62 75 66 20 3d 3d 20 4e 55 4c 4c   (outbuf == NULL
123b0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
123c0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
123d0 2e 20 20 6f 75 74 62 75 66 20 69 73 20 4e 55 4c  .  outbuf is NUL
123e0 4c 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d  L");....return(-
123f0 31 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 69 64 65  1);..}...if (ide
12400 6e 74 69 74 79 20 3d 3d 20 4e 55 4c 4c 29 20 7b  ntity == NULL) {
12410 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
12420 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
12430 69 64 65 6e 74 69 74 79 20 69 73 20 4e 55 4c 4c  identity is NULL
12440 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31  ");....return(-1
12450 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 69 64 65 6e  );..}...if (iden
12460 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74  tity->pcsc_ident
12470 69 74 79 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ity == NULL) {..
12480 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
12490 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 69 64  INTF("Error.  id
124a0 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65  entity->pcsc_ide
124b0 6e 74 69 74 79 20 69 73 20 4e 55 4c 4c 22 29 3b  ntity is NULL");
124c0 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a  ....return(-1);.
124d0 09 7d 0a 0a 09 69 64 5f 74 79 70 65 20 3d 20 69  .}...id_type = i
124e0 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64  dentity->pcsc_id
124f0 65 6e 74 69 74 79 2d 3e 69 64 5f 74 79 70 65 3b  entity->id_type;
12500 0a 09 69 66 20 28 69 64 5f 74 79 70 65 20 3d 3d  ..if (id_type ==
12510 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f   CACKEY_ID_TYPE_
12520 43 45 52 54 5f 4f 4e 4c 59 29 20 7b 0a 09 09 43  CERT_ONLY) {...C
12530 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
12540 54 46 28 22 45 72 72 6f 72 2e 20 20 69 64 65 6e  TF("Error.  iden
12550 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74  tity->pcsc_ident
12560 69 74 79 20 69 73 20 43 41 43 4b 45 59 5f 49 44  ity is CACKEY_ID
12570 5f 54 59 50 45 5f 43 45 52 54 5f 4f 4e 4c 59 2c  _TYPE_CERT_ONLY,
12580 20 77 68 69 63 68 20 63 61 6e 6e 6f 74 20 62 65   which cannot be
12590 20 75 73 65 64 20 66 6f 72 20 73 69 67 6e 2f 64   used for sign/d
125a0 65 63 72 79 70 74 22 29 3b 0a 0a 09 09 72 65 74  ecrypt");....ret
125b0 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 73 77  urn(-1);..}...sw
125c0 69 74 63 68 20 28 69 64 5f 74 79 70 65 29 20 7b  itch (id_type) {
125d0 0a 09 09 63 61 73 65 20 43 41 43 4b 45 59 5f 49  ...case CACKEY_I
125e0 44 5f 54 59 50 45 5f 50 49 56 3a 0a 09 09 63 61  D_TYPE_PIV:...ca
125f0 73 65 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50  se CACKEY_ID_TYP
12600 45 5f 43 41 43 3a 0a 09 09 09 62 72 65 61 6b 3b  E_CAC:....break;
12610 0a 09 09 64 65 66 61 75 6c 74 3a 0a 09 09 09 43  ...default:....C
12620 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
12630 54 46 28 22 45 72 72 6f 72 2e 20 20 69 64 65 6e  TF("Error.  iden
12640 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74  tity->pcsc_ident
12650 69 74 79 20 69 73 20 6e 6f 74 20 61 20 73 75 70  ity is not a sup
12660 70 6f 72 74 65 64 20 76 61 6c 75 65 2e 20 54 79  ported value. Ty
12670 70 65 20 69 73 3a 20 30 78 25 6c 78 20 28 50 49  pe is: 0x%lx (PI
12680 56 20 3d 20 30 78 25 6c 78 2c 20 43 41 43 20 3d  V = 0x%lx, CAC =
12690 20 30 78 25 6c 78 29 22 2c 20 28 75 6e 73 69 67   0x%lx)", (unsig
126a0 6e 65 64 20 6c 6f 6e 67 29 20 69 64 5f 74 79 70  ned long) id_typ
126b0 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  e, (unsigned lon
126c0 67 29 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50  g) CACKEY_ID_TYP
126d0 45 5f 50 49 56 2c 20 28 75 6e 73 69 67 6e 65 64  E_PIV, (unsigned
126e0 20 6c 6f 6e 67 29 20 43 41 43 4b 45 59 5f 49 44   long) CACKEY_ID
126f0 5f 54 59 50 45 5f 43 41 43 29 3b 0a 0a 09 09 09  _TYPE_CAC);.....
12700 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a  return(-1);..}..
12710 09 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 69 64  ./* Determine id
12720 65 6e 74 69 74 79 20 4b 65 79 20 73 69 7a 65 20  entity Key size 
12730 2a 2f 0a 09 69 66 20 28 69 64 65 6e 74 69 74 79  */..if (identity
12740 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d  ->pcsc_identity-
12750 3e 6b 65 79 73 69 7a 65 20 3c 20 30 29 20 7b 0a  >keysize < 0) {.
12760 09 09 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63  ..identity->pcsc
12770 5f 69 64 65 6e 74 69 74 79 2d 3e 6b 65 79 73 69  _identity->keysi
12780 7a 65 20 3d 20 78 35 30 39 5f 74 6f 5f 6b 65 79  ze = x509_to_key
12790 73 69 7a 65 28 69 64 65 6e 74 69 74 79 2d 3e 70  size(identity->p
127a0 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 63 65  csc_identity->ce
127b0 72 74 69 66 69 63 61 74 65 2c 20 69 64 65 6e 74  rtificate, ident
127c0 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69  ity->pcsc_identi
127d0 74 79 2d 3e 63 65 72 74 69 66 69 63 61 74 65 5f  ty->certificate_
127e0 6c 65 6e 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 50 61  len);..}.../* Pa
127f0 64 20 6d 65 73 73 61 67 65 20 74 6f 20 6b 65 79  d message to key
12800 20 73 69 7a 65 20 2a 2f 0a 09 69 66 20 28 70 61   size */..if (pa
12810 64 49 6e 70 75 74 29 20 7b 0a 09 09 69 66 20 28  dInput) {...if (
12820 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69  identity->pcsc_i
12830 64 65 6e 74 69 74 79 2d 3e 6b 65 79 73 69 7a 65  dentity->keysize
12840 20 3e 20 30 29 20 7b 0a 09 09 09 69 66 20 28 62   > 0) {....if (b
12850 75 66 6c 65 6e 20 21 3d 20 69 64 65 6e 74 69 74  uflen != identit
12860 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79  y->pcsc_identity
12870 2d 3e 6b 65 79 73 69 7a 65 29 20 7b 0a 09 09 09  ->keysize) {....
12880 09 69 66 20 28 62 75 66 6c 65 6e 20 3e 20 28 69  .if (buflen > (i
12890 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64  dentity->pcsc_id
128a0 65 6e 74 69 74 79 2d 3e 6b 65 79 73 69 7a 65 20  entity->keysize 
128b0 2b 20 33 29 29 20 7b 0a 09 09 09 09 09 43 41 43  + 3)) {......CAC
128c0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
128d0 28 22 45 72 72 6f 72 2e 20 20 4d 65 73 73 61 67  ("Error.  Messag
128e0 65 20 69 73 20 74 6f 6f 20 6c 61 72 67 65 20 74  e is too large t
128f0 6f 20 73 69 67 6e 2f 64 65 63 72 79 70 74 22 29  o sign/decrypt")
12900 3b 0a 0a 09 09 09 09 09 72 65 74 75 72 6e 28 2d  ;.......return(-
12910 31 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 74  1);.....}......t
12920 6d 70 62 75 66 6c 65 6e 20 3d 20 69 64 65 6e 74  mpbuflen = ident
12930 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69  ity->pcsc_identi
12940 74 79 2d 3e 6b 65 79 73 69 7a 65 3b 0a 09 09 09  ty->keysize;....
12950 09 74 6d 70 62 75 66 20 3d 20 6d 61 6c 6c 6f 63  .tmpbuf = malloc
12960 28 74 6d 70 62 75 66 6c 65 6e 29 3b 0a 09 09 09  (tmpbuflen);....
12970 09 66 72 65 65 5f 74 6d 70 62 75 66 20 3d 20 31  .free_tmpbuf = 1
12980 3b 0a 0a 09 09 09 09 70 61 64 6c 65 6e 20 3d 20  ;......padlen = 
12990 74 6d 70 62 75 66 6c 65 6e 20 2d 20 62 75 66 6c  tmpbuflen - bufl
129a0 65 6e 20 2d 20 33 3b 0a 0a 09 09 09 09 2f 2a 20  en - 3;....../* 
129b0 52 53 41 20 50 4b 43 53 23 31 20 45 4d 53 41 2d  RSA PKCS#1 EMSA-
129c0 50 4b 43 53 31 2d 76 31 5f 35 20 50 61 64 64 69  PKCS1-v1_5 Paddi
129d0 6e 67 20 2a 2f 0a 09 09 09 09 74 6d 70 62 75 66  ng */.....tmpbuf
129e0 5b 30 5d 20 3d 20 30 78 30 30 3b 0a 09 09 09 09  [0] = 0x00;.....
129f0 74 6d 70 62 75 66 5b 31 5d 20 3d 20 30 78 30 31  tmpbuf[1] = 0x01
12a00 3b 0a 09 09 09 09 6d 65 6d 73 65 74 28 26 74 6d  ;.....memset(&tm
12a10 70 62 75 66 5b 32 5d 2c 20 30 78 46 46 2c 20 70  pbuf[2], 0xFF, p
12a20 61 64 6c 65 6e 29 3b 0a 09 09 09 09 74 6d 70 62  adlen);.....tmpb
12a30 75 66 5b 70 61 64 6c 65 6e 20 2b 20 32 5d 3d 20  uf[padlen + 2]= 
12a40 30 78 30 30 3b 0a 09 09 09 09 6d 65 6d 63 70 79  0x00;.....memcpy
12a50 28 26 74 6d 70 62 75 66 5b 70 61 64 6c 65 6e 20  (&tmpbuf[padlen 
12a60 2b 20 33 5d 2c 20 62 75 66 2c 20 62 75 66 6c 65  + 3], buf, bufle
12a70 6e 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f  n);......CACKEY_
12a80 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22  DEBUG_PRINTBUF("
12a90 55 6e 70 61 64 64 65 64 3a 22 2c 20 62 75 66 2c  Unpadded:", buf,
12aa0 20 62 75 66 6c 65 6e 29 3b 0a 09 09 09 09 43 41   buflen);.....CA
12ab0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
12ac0 42 55 46 28 22 50 61 64 64 65 64 3a 22 2c 20 74  BUF("Padded:", t
12ad0 6d 70 62 75 66 2c 20 74 6d 70 62 75 66 6c 65 6e  mpbuf, tmpbuflen
12ae0 29 3b 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09  );....} else {..
12af0 09 09 09 74 6d 70 62 75 66 20 3d 20 62 75 66 3b  ...tmpbuf = buf;
12b00 0a 09 09 09 09 74 6d 70 62 75 66 6c 65 6e 20 3d  .....tmpbuflen =
12b10 20 62 75 66 6c 65 6e 3b 0a 09 09 09 09 66 72 65   buflen;.....fre
12b20 65 5f 74 6d 70 62 75 66 20 3d 20 30 3b 0a 09 09  e_tmpbuf = 0;...
12b30 09 09 70 61 64 6c 65 6e 20 3d 20 30 3b 0a 09 09  ..padlen = 0;...
12b40 09 7d 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  .}...} else {...
12b50 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
12b60 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20  INTF("Unable to 
12b70 64 65 74 65 72 6d 69 6e 65 20 6b 65 79 20 73 69  determine key si
12b80 7a 65 2c 20 68 6f 70 69 6e 67 20 74 68 65 20 6d  ze, hoping the m
12b90 65 73 73 61 67 65 20 69 73 20 70 72 6f 70 65 72  essage is proper
12ba0 6c 79 20 70 61 64 64 65 64 21 22 29 3b 0a 0a 09  ly padded!");...
12bb0 09 09 74 6d 70 62 75 66 20 3d 20 62 75 66 3b 0a  ..tmpbuf = buf;.
12bc0 09 09 09 74 6d 70 62 75 66 6c 65 6e 20 3d 20 62  ...tmpbuflen = b
12bd0 75 66 6c 65 6e 3b 0a 09 09 09 66 72 65 65 5f 74  uflen;....free_t
12be0 6d 70 62 75 66 20 3d 20 30 3b 0a 09 09 09 70 61  mpbuf = 0;....pa
12bf0 64 6c 65 6e 20 3d 20 30 3b 0a 09 09 7d 0a 09 7d  dlen = 0;...}..}
12c00 20 65 6c 73 65 20 7b 0a 09 09 74 6d 70 62 75 66   else {...tmpbuf
12c10 20 3d 20 62 75 66 3b 0a 09 09 74 6d 70 62 75 66   = buf;...tmpbuf
12c20 6c 65 6e 20 3d 20 62 75 66 6c 65 6e 3b 0a 09 09  len = buflen;...
12c30 66 72 65 65 5f 74 6d 70 62 75 66 20 3d 20 30 3b  free_tmpbuf = 0;
12c40 0a 09 09 70 61 64 6c 65 6e 20 3d 20 30 3b 0a 09  ...padlen = 0;..
12c50 7d 0a 0a 09 2f 2a 20 42 65 67 69 6e 20 74 72 61  }.../* Begin tra
12c60 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 63 61 63  nsaction */..cac
12c70 6b 65 79 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61  key_begin_transa
12c80 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 2f  ction(slot);.../
12c90 2a 20 53 65 6c 65 63 74 20 63 6f 72 72 65 63 74  * Select correct
12ca0 20 61 70 70 6c 65 74 20 2a 2f 0a 09 73 77 69 74   applet */..swit
12cb0 63 68 20 28 69 64 5f 74 79 70 65 29 20 7b 0a 09  ch (id_type) {..
12cc0 09 63 61 73 65 20 43 41 43 4b 45 59 5f 49 44 5f  .case CACKEY_ID_
12cd0 54 59 50 45 5f 43 41 43 3a 0a 09 09 09 43 41 43  TYPE_CAC:....CAC
12ce0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
12cf0 28 22 53 65 6c 65 63 74 69 6e 67 20 61 70 70 6c  ("Selecting appl
12d00 65 74 20 66 6f 75 6e 64 20 61 74 20 25 70 20 2e  et found at %p .
12d10 2e 2e 22 2c 20 69 64 65 6e 74 69 74 79 2d 3e 70  ..", identity->p
12d20 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 63 61  csc_identity->ca
12d30 72 64 2e 63 61 63 2e 61 70 70 6c 65 74 29 3b 0a  rd.cac.applet);.
12d40 09 09 09 63 61 63 6b 65 79 5f 73 65 6c 65 63 74  ...cackey_select
12d50 5f 61 70 70 6c 65 74 28 73 6c 6f 74 2c 20 69 64  _applet(slot, id
12d60 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65  entity->pcsc_ide
12d70 6e 74 69 74 79 2d 3e 63 61 72 64 2e 63 61 63 2e  ntity->card.cac.
12d80 61 70 70 6c 65 74 2c 20 73 69 7a 65 6f 66 28 69  applet, sizeof(i
12d90 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64  dentity->pcsc_id
12da0 65 6e 74 69 74 79 2d 3e 63 61 72 64 2e 63 61 63  entity->card.cac
12db0 2e 61 70 70 6c 65 74 29 29 3b 0a 0a 09 09 09 2f  .applet));...../
12dc0 2a 20 53 65 6c 65 63 74 20 63 6f 72 72 65 63 74  * Select correct
12dd0 20 66 69 6c 65 20 2a 2f 0a 09 09 09 63 61 63 6b   file */....cack
12de0 65 79 5f 73 65 6c 65 63 74 5f 66 69 6c 65 28 73  ey_select_file(s
12df0 6c 6f 74 2c 20 69 64 65 6e 74 69 74 79 2d 3e 70  lot, identity->p
12e00 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 63 61  csc_identity->ca
12e10 72 64 2e 63 61 63 2e 66 69 6c 65 29 3b 0a 09 09  rd.cac.file);...
12e20 09 62 72 65 61 6b 3b 0a 09 09 63 61 73 65 20 43  .break;...case C
12e30 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 50 49  ACKEY_ID_TYPE_PI
12e40 56 3a 0a 09 09 09 64 79 6e 5f 61 75 74 68 5f 74  V:....dyn_auth_t
12e50 65 6d 70 6c 61 74 65 5b 30 5d 20 3d 20 30 78 37  emplate[0] = 0x7
12e60 43 3b 0a 09 09 09 64 79 6e 5f 61 75 74 68 5f 74  C;....dyn_auth_t
12e70 65 6d 70 6c 61 74 65 5b 31 5d 20 3d 20 30 78 38  emplate[1] = 0x8
12e80 32 3b 0a 09 09 09 64 79 6e 5f 61 75 74 68 5f 74  2;....dyn_auth_t
12e90 65 6d 70 6c 61 74 65 5b 32 5d 20 3d 20 28 28 74  emplate[2] = ((t
12ea0 6d 70 62 75 66 6c 65 6e 20 2b 20 36 29 20 26 20  mpbuflen + 6) & 
12eb0 30 78 66 66 30 30 29 20 3e 3e 20 38 3b 0a 09 09  0xff00) >> 8;...
12ec0 09 64 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61  .dyn_auth_templa
12ed0 74 65 5b 33 5d 20 3d 20 28 74 6d 70 62 75 66 6c  te[3] = (tmpbufl
12ee0 65 6e 20 2b 20 36 29 20 26 20 30 78 30 30 66 66  en + 6) & 0x00ff
12ef0 3b 0a 09 09 09 64 79 6e 5f 61 75 74 68 5f 74 65  ;....dyn_auth_te
12f00 6d 70 6c 61 74 65 5b 34 5d 20 3d 20 30 78 38 32  mplate[4] = 0x82
12f10 3b 0a 09 09 09 64 79 6e 5f 61 75 74 68 5f 74 65  ;....dyn_auth_te
12f20 6d 70 6c 61 74 65 5b 35 5d 20 3d 20 30 78 30 30  mplate[5] = 0x00
12f30 3b 0a 09 09 09 64 79 6e 5f 61 75 74 68 5f 74 65  ;....dyn_auth_te
12f40 6d 70 6c 61 74 65 5b 36 5d 20 3d 20 30 78 38 31  mplate[6] = 0x81
12f50 3b 0a 09 09 09 64 79 6e 5f 61 75 74 68 5f 74 65  ;....dyn_auth_te
12f60 6d 70 6c 61 74 65 5b 37 5d 20 3d 20 30 78 38 32  mplate[7] = 0x82
12f70 3b 0a 09 09 09 64 79 6e 5f 61 75 74 68 5f 74 65  ;....dyn_auth_te
12f80 6d 70 6c 61 74 65 5b 38 5d 20 3d 20 28 74 6d 70  mplate[8] = (tmp
12f90 62 75 66 6c 65 6e 20 26 20 30 78 66 66 30 30 29  buflen & 0xff00)
12fa0 20 3e 3e 20 38 3b 0a 09 09 09 64 79 6e 5f 61 75   >> 8;....dyn_au
12fb0 74 68 5f 74 65 6d 70 6c 61 74 65 5b 39 5d 20 3d  th_template[9] =
12fc0 20 74 6d 70 62 75 66 6c 65 6e 20 26 20 30 78 30   tmpbuflen & 0x0
12fd0 30 66 66 3b 0a 0a 09 09 09 73 65 6e 64 5f 72 65  0ff;.....send_re
12fe0 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f  t = cackey_send_
12ff0 61 70 64 75 28 73 6c 6f 74 2c 20 30 78 31 30 2c  apdu(slot, 0x10,
13000 20 4e 49 53 54 53 50 38 30 30 5f 37 33 5f 33 5f   NISTSP800_73_3_
13010 49 4e 53 54 52 5f 47 45 4e 41 55 54 48 2c 20 4e  INSTR_GENAUTH, N
13020 49 53 54 53 50 38 30 30 5f 37 38 5f 33 5f 41 4c  ISTSP800_78_3_AL
13030 47 4f 5f 52 53 41 32 30 34 38 2c 20 69 64 65 6e  GO_RSA2048, iden
13040 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74  tity->pcsc_ident
13050 69 74 79 2d 3e 63 61 72 64 2e 70 69 76 2e 6b 65  ity->card.piv.ke
13060 79 5f 69 64 2c 20 73 69 7a 65 6f 66 28 64 79 6e  y_id, sizeof(dyn
13070 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74 65 29 2c  _auth_template),
13080 20 64 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61   dyn_auth_templa
13090 74 65 2c 20 30 78 30 30 2c 20 4e 55 4c 4c 2c 20  te, 0x00, NULL, 
130a0 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 09 09  NULL, NULL);....
130b0 62 72 65 61 6b 3b 0a 09 09 63 61 73 65 20 43 41  break;...case CA
130c0 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43 45 52  CKEY_ID_TYPE_CER
130d0 54 5f 4f 4e 4c 59 3a 0a 09 09 09 62 72 65 61 6b  T_ONLY:....break
130e0 3b 0a 09 7d 0a 0a 09 74 6d 70 62 75 66 5f 73 20  ;..}...tmpbuf_s 
130f0 3d 20 74 6d 70 62 75 66 3b 0a 09 6f 75 74 62 75  = tmpbuf;..outbu
13100 66 5f 73 20 3d 20 6f 75 74 62 75 66 3b 0a 09 77  f_s = outbuf;..w
13110 68 69 6c 65 20 28 74 6d 70 62 75 66 6c 65 6e 29  hile (tmpbuflen)
13120 20 7b 0a 09 09 74 6d 70 6f 75 74 62 75 66 6c 65   {...tmpoutbufle
13130 6e 20 3d 20 6f 75 74 62 75 66 6c 65 6e 3b 0a 0a  n = outbuflen;..
13140 09 09 69 66 20 28 74 6d 70 62 75 66 6c 65 6e 20  ..if (tmpbuflen 
13150 3e 20 43 41 43 4b 45 59 5f 41 50 44 55 5f 4d 54  > CACKEY_APDU_MT
13160 55 29 20 7b 0a 09 09 09 62 79 74 65 73 5f 74 6f  U) {....bytes_to
13170 5f 73 65 6e 64 20 3d 20 43 41 43 4b 45 59 5f 41  _send = CACKEY_A
13180 50 44 55 5f 4d 54 55 3b 0a 09 09 7d 20 65 6c 73  PDU_MTU;...} els
13190 65 20 7b 0a 09 09 09 62 79 74 65 73 5f 74 6f 5f  e {....bytes_to_
131a0 73 65 6e 64 20 3d 20 74 6d 70 62 75 66 6c 65 6e  send = tmpbuflen
131b0 3b 0a 09 09 7d 0a 0a 09 09 73 65 6e 64 5f 72 65  ;...}....send_re
131c0 74 20 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f  t = CACKEY_PCSC_
131d0 45 5f 47 45 4e 45 52 49 43 3b 0a 09 09 73 77 69  E_GENERIC;...swi
131e0 74 63 68 20 28 69 64 5f 74 79 70 65 29 20 7b 0a  tch (id_type) {.
131f0 09 09 09 63 61 73 65 20 43 41 43 4b 45 59 5f 49  ...case CACKEY_I
13200 44 5f 54 59 50 45 5f 43 41 43 3a 0a 09 09 09 09  D_TYPE_CAC:.....
13210 69 66 20 28 74 6d 70 62 75 66 6c 65 6e 20 3e 20  if (tmpbuflen > 
13220 43 41 43 4b 45 59 5f 41 50 44 55 5f 4d 54 55 29  CACKEY_APDU_MTU)
13230 20 7b 0a 09 09 09 09 09 70 31 20 3d 20 30 78 38   {......p1 = 0x8
13240 30 3b 0a 09 09 09 09 09 6c 65 20 3d 20 30 78 30  0;......le = 0x0
13250 30 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a  0;.....} else {.
13260 09 09 09 09 09 70 31 20 3d 20 30 78 30 30 3b 0a  .....p1 = 0x00;.
13270 09 09 09 09 09 6c 65 20 3d 20 30 78 30 30 3b 0a  .....le = 0x00;.
13280 09 09 09 09 7d 0a 0a 09 09 09 09 73 65 6e 64 5f  ....}......send_
13290 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e  ret = cackey_sen
132a0 64 5f 61 70 64 75 28 73 6c 6f 74 2c 20 47 53 43  d_apdu(slot, GSC
132b0 49 53 5f 43 4c 41 53 53 5f 47 4c 4f 42 41 4c 5f  IS_CLASS_GLOBAL_
132c0 50 4c 41 54 46 4f 52 4d 2c 20 47 53 43 49 53 5f  PLATFORM, GSCIS_
132d0 49 4e 53 54 52 5f 53 49 47 4e 44 45 43 52 59 50  INSTR_SIGNDECRYP
132e0 54 2c 20 70 31 2c 20 30 78 30 30 2c 20 62 79 74  T, p1, 0x00, byt
132f0 65 73 5f 74 6f 5f 73 65 6e 64 2c 20 74 6d 70 62  es_to_send, tmpb
13300 75 66 2c 20 6c 65 2c 20 26 72 65 73 70 63 6f 64  uf, le, &respcod
13310 65 2c 20 6f 75 74 62 75 66 2c 20 26 74 6d 70 6f  e, outbuf, &tmpo
13320 75 74 62 75 66 6c 65 6e 29 3b 0a 09 09 09 09 62  utbuflen);.....b
13330 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 41  reak;....case CA
13340 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 50 49 56  CKEY_ID_TYPE_PIV
13350 3a 0a 09 09 09 09 69 66 20 28 74 6d 70 62 75 66  :.....if (tmpbuf
13360 6c 65 6e 20 3e 20 43 41 43 4b 45 59 5f 41 50 44  len > CACKEY_APD
13370 55 5f 4d 54 55 29 20 7b 0a 09 09 09 09 09 63 6c  U_MTU) {......cl
13380 61 73 73 20 3d 20 30 78 31 30 3b 0a 09 09 09 09  ass = 0x10;.....
13390 09 6c 65 20 3d 20 30 78 30 30 3b 0a 09 09 09 09  .le = 0x00;.....
133a0 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 63 6c  } else {......cl
133b0 61 73 73 20 3d 20 47 53 43 49 53 5f 43 4c 41 53  ass = GSCIS_CLAS
133c0 53 5f 49 53 4f 37 38 31 36 3b 0a 09 09 09 09 09  S_ISO7816;......
133d0 6c 65 20 3d 20 32 35 36 3b 0a 09 09 09 09 7d 0a  le = 256;.....}.
133e0 0a 09 09 09 09 73 65 6e 64 5f 72 65 74 20 3d 20  .....send_ret = 
133f0 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75  cackey_send_apdu
13400 28 73 6c 6f 74 2c 20 63 6c 61 73 73 2c 20 4e 49  (slot, class, NI
13410 53 54 53 50 38 30 30 5f 37 33 5f 33 5f 49 4e 53  STSP800_73_3_INS
13420 54 52 5f 47 45 4e 41 55 54 48 2c 20 4e 49 53 54  TR_GENAUTH, NIST
13430 53 50 38 30 30 5f 37 38 5f 33 5f 41 4c 47 4f 5f  SP800_78_3_ALGO_
13440 52 53 41 32 30 34 38 2c 20 69 64 65 6e 74 69 74  RSA2048, identit
13450 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79  y->pcsc_identity
13460 2d 3e 63 61 72 64 2e 70 69 76 2e 6b 65 79 5f 69  ->card.piv.key_i
13470 64 2c 20 62 79 74 65 73 5f 74 6f 5f 73 65 6e 64  d, bytes_to_send
13480 2c 20 74 6d 70 62 75 66 2c 20 6c 65 2c 20 26 72  , tmpbuf, le, &r
13490 65 73 70 63 6f 64 65 2c 20 6f 75 74 62 75 66 2c  espcode, outbuf,
134a0 20 26 74 6d 70 6f 75 74 62 75 66 6c 65 6e 29 3b   &tmpoutbuflen);
134b0 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
134c0 61 73 65 20 43 41 43 4b 45 59 5f 49 44 5f 54 59  ase CACKEY_ID_TY
134d0 50 45 5f 43 45 52 54 5f 4f 4e 4c 59 3a 0a 09 09  PE_CERT_ONLY:...
134e0 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09  ..break;...}....
134f0 69 66 20 28 73 65 6e 64 5f 72 65 74 20 21 3d 20  if (send_ret != 
13500 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
13510 29 20 7b 0a 09 09 09 69 66 20 28 66 72 65 65 5f  ) {....if (free_
13520 74 6d 70 62 75 66 29 20 7b 0a 09 09 09 09 69 66  tmpbuf) {.....if
13530 20 28 74 6d 70 62 75 66 5f 73 29 20 7b 0a 09 09   (tmpbuf_s) {...
13540 09 09 09 66 72 65 65 28 74 6d 70 62 75 66 5f 73  ...free(tmpbuf_s
13550 29 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09  );.....}....}...
13560 09 09 2f 2a 20 45 6e 64 20 74 72 61 6e 73 61 63  ../* End transac
13570 74 69 6f 6e 20 2a 2f 0a 09 09 09 63 61 63 6b 65  tion */....cacke
13580 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  y_end_transactio
13590 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 09 69 66 20  n(slot);.....if 
135a0 28 73 65 6e 64 5f 72 65 74 20 3d 3d 20 43 41 43  (send_ret == CAC
135b0 4b 45 59 5f 50 43 53 43 5f 45 5f 52 45 54 52 59  KEY_PCSC_E_RETRY
135c0 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  ) {.....CACKEY_D
135d0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 41 44 50  EBUG_PRINTF("ADP
135e0 55 20 53 65 6e 64 69 6e 67 20 46 61 69 6c 65 64  U Sending Failed
135f0 20 2d 2d 20 72 65 74 72 79 69 6e 67 2e 22 29 3b   -- retrying.");
13600 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 63 61 63  ......return(cac
13610 6b 65 79 5f 73 69 67 6e 64 65 63 72 79 70 74 28  key_signdecrypt(
13620 73 6c 6f 74 2c 20 69 64 65 6e 74 69 74 79 2c 20  slot, identity, 
13630 62 75 66 2c 20 62 75 66 6c 65 6e 2c 20 6f 75 74  buf, buflen, out
13640 62 75 66 2c 20 6f 75 74 62 75 66 6c 65 6e 2c 20  buf, outbuflen, 
13650 70 61 64 49 6e 70 75 74 2c 20 75 6e 70 61 64 4f  padInput, unpadO
13660 75 74 70 75 74 29 29 3b 0a 09 09 09 7d 0a 0a 09  utput));....}...
13670 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
13680 52 49 4e 54 46 28 22 41 44 50 55 20 53 65 6e 64  RINTF("ADPU Send
13690 69 6e 67 20 46 61 69 6c 65 64 20 2d 2d 20 72 65  ing Failed -- re
136a0 74 75 72 6e 69 6e 67 20 69 6e 20 65 72 72 6f 72  turning in error
136b0 2e 22 29 3b 0a 0a 09 09 09 69 66 20 28 72 65 73  .");.....if (res
136c0 70 63 6f 64 65 20 3d 3d 20 30 78 36 39 38 32 20  pcode == 0x6982 
136d0 7c 7c 20 72 65 73 70 63 6f 64 65 20 3d 3d 20 30  || respcode == 0
136e0 78 36 65 30 30 29 20 7b 0a 09 09 09 09 69 66 20  x6e00) {.....if 
136f0 28 72 65 73 70 63 6f 64 65 20 3d 3d 20 30 78 36  (respcode == 0x6
13700 45 30 30 29 20 7b 0a 09 09 09 09 09 43 41 43 4b  E00) {......CACK
13710 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
13720 22 47 6f 74 20 5c 22 57 52 4f 4e 47 20 43 4c 41  "Got \"WRONG CLA
13730 53 53 5c 22 2c 20 74 68 69 73 20 6d 65 61 6e 73  SS\", this means
13740 20 77 65 20 61 72 65 20 74 61 6c 6b 69 6e 67 20   we are talking 
13750 74 6f 20 74 68 65 20 77 72 6f 6e 67 20 6f 62 6a  to the wrong obj
13760 65 63 74 20 28 6c 69 6b 65 6c 79 20 62 65 63 61  ect (likely beca
13770 75 73 65 20 74 68 65 20 63 61 72 64 20 77 65 6e  use the card wen
13780 74 20 61 77 61 79 29 20 2d 2d 20 72 65 73 65 74  t away) -- reset
13790 74 69 6e 67 22 29 3b 0a 09 09 09 09 7d 20 65 6c  ting");.....} el
137a0 73 65 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59  se {......CACKEY
137b0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53  _DEBUG_PRINTF("S
137c0 65 63 75 72 69 74 79 20 73 74 61 74 75 73 20 6e  ecurity status n
137d0 6f 74 20 73 61 74 69 73 69 66 69 65 64 20 28 72  ot satisified (r
137e0 65 73 70 63 6f 64 65 20 3d 20 30 78 25 30 34 78  espcode = 0x%04x
137f0 29 2e 20 20 52 65 74 75 72 6e 69 6e 67 20 4e 45  ).  Returning NE
13800 45 44 4c 4f 47 49 4e 22 2c 20 28 69 6e 74 29 20  EDLOGIN", (int) 
13810 72 65 73 70 63 6f 64 65 29 3b 0a 09 09 09 09 7d  respcode);.....}
13820 0a 0a 09 09 09 09 63 61 63 6b 65 79 5f 6d 61 72  ......cackey_mar
13830 6b 5f 73 6c 6f 74 5f 72 65 73 65 74 28 73 6c 6f  k_slot_reset(slo
13840 74 29 3b 0a 0a 09 09 09 09 73 6c 6f 74 2d 3e 74  t);......slot->t
13850 6f 6b 65 6e 5f 66 6c 61 67 73 20 3d 20 43 4b 46  oken_flags = CKF
13860 5f 4c 4f 47 49 4e 5f 52 45 51 55 49 52 45 44 3b  _LOGIN_REQUIRED;
13870 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 43 41 43  ......return(CAC
13880 4b 45 59 5f 50 43 53 43 5f 45 5f 4e 45 45 44 4c  KEY_PCSC_E_NEEDL
13890 4f 47 49 4e 29 3b 0a 09 09 09 7d 0a 0a 09 09 09  OGIN);....}.....
138a0 69 66 20 28 72 65 73 70 63 6f 64 65 20 3d 3d 20  if (respcode == 
138b0 30 78 36 45 30 30 29 20 7b 0a 09 09 09 09 43 41  0x6E00) {.....CA
138c0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
138d0 46 28 22 47 6f 74 20 5c 22 57 52 4f 4e 47 20 43  F("Got \"WRONG C
138e0 4c 41 53 53 5c 22 2c 20 74 68 69 73 20 6d 65 61  LASS\", this mea
138f0 6e 73 20 77 65 20 61 72 65 20 74 61 6c 6b 69 6e  ns we are talkin
13900 67 20 74 6f 20 74 68 65 20 77 72 6f 6e 67 20 6f  g to the wrong o
13910 62 6a 65 63 74 20 28 6c 69 6b 65 6c 79 20 62 65  bject (likely be
13920 63 61 75 73 65 20 74 68 65 20 63 61 72 64 20 77  cause the card w
13930 65 6e 74 20 61 77 61 79 29 20 2d 2d 20 72 65 73  ent away) -- res
13940 65 74 74 69 6e 67 22 29 3b 0a 0a 09 09 09 09 63  etting");......c
13950 61 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f  ackey_mark_slot_
13960 72 65 73 65 74 28 73 6c 6f 74 29 3b 0a 0a 09 09  reset(slot);....
13970 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
13980 50 43 53 43 5f 45 5f 4e 45 45 44 4c 4f 47 49 4e  PCSC_E_NEEDLOGIN
13990 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28  );....}.....if (
139a0 73 65 6e 64 5f 72 65 74 20 3d 3d 20 43 41 43 4b  send_ret == CACK
139b0 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41  EY_PCSC_E_TOKENA
139c0 42 53 45 4e 54 29 20 7b 0a 09 09 09 09 43 41 43  BSENT) {.....CAC
139d0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
139e0 28 22 54 6f 6b 65 6e 20 61 62 73 65 6e 74 2e 20  ("Token absent. 
139f0 20 52 65 74 75 72 6e 69 6e 67 20 54 4f 4b 45 4e   Returning TOKEN
13a00 41 42 53 45 4e 54 22 29 3b 0a 0a 09 09 09 09 63  ABSENT");......c
13a10 61 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f  ackey_mark_slot_
13a20 72 65 73 65 74 28 73 6c 6f 74 29 3b 0a 0a 09 09  reset(slot);....
13a30 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
13a40 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45  PCSC_E_TOKENABSE
13a50 4e 54 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 72 65  NT);....}.....re
13a60 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09  turn(-1);...}...
13a70 09 74 6d 70 62 75 66 20 2b 3d 20 62 79 74 65 73  .tmpbuf += bytes
13a80 5f 74 6f 5f 73 65 6e 64 3b 0a 09 09 74 6d 70 62  _to_send;...tmpb
13a90 75 66 6c 65 6e 20 2d 3d 20 62 79 74 65 73 5f 74  uflen -= bytes_t
13aa0 6f 5f 73 65 6e 64 3b 0a 0a 09 09 6f 75 74 62 75  o_send;....outbu
13ab0 66 20 2b 3d 20 74 6d 70 6f 75 74 62 75 66 6c 65  f += tmpoutbufle
13ac0 6e 3b 0a 09 09 6f 75 74 62 75 66 6c 65 6e 20 2d  n;...outbuflen -
13ad0 3d 20 74 6d 70 6f 75 74 62 75 66 6c 65 6e 3b 0a  = tmpoutbuflen;.
13ae0 09 09 72 65 74 76 61 6c 20 2b 3d 20 74 6d 70 6f  ..retval += tmpo
13af0 75 74 62 75 66 6c 65 6e 3b 0a 09 7d 0a 0a 09 69  utbuflen;..}...i
13b00 66 20 28 66 72 65 65 5f 74 6d 70 62 75 66 29 20  f (free_tmpbuf) 
13b10 7b 0a 09 09 69 66 20 28 74 6d 70 62 75 66 5f 73  {...if (tmpbuf_s
13b20 29 20 7b 0a 09 09 09 66 72 65 65 28 74 6d 70 62  ) {....free(tmpb
13b30 75 66 5f 73 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09  uf_s);...}..}...
13b40 6f 75 74 62 75 66 20 3d 20 6f 75 74 62 75 66 5f  outbuf = outbuf_
13b50 73 3b 0a 0a 09 2f 2a 20 45 6e 64 20 74 72 61 6e  s;.../* End tran
13b60 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 63 61 63 6b  saction */..cack
13b70 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  ey_end_transacti
13b80 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 23 69 66 64 65  on(slot);..#ifde
13b90 66 20 43 41 43 4b 45 59 5f 50 41 52 41 4e 4f 49  f CACKEY_PARANOI
13ba0 44 0a 23 20 20 69 66 64 65 66 20 5f 50 4f 53 49  D.#  ifdef _POSI
13bb0 58 5f 53 53 49 5a 45 5f 4d 41 58 0a 09 69 66 20  X_SSIZE_MAX..if 
13bc0 28 6f 75 74 62 75 66 6c 65 6e 20 3e 20 5f 50 4f  (outbuflen > _PO
13bd0 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58 29 20 7b  SIX_SSIZE_MAX) {
13be0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
13bf0 50 52 49 4e 54 46 28 22 4f 75 74 62 75 66 6c 65  PRINTF("Outbufle
13c00 6e 20 65 78 63 65 65 64 73 20 6d 61 78 69 6d 75  n exceeds maximu
13c10 6d 20 76 61 6c 75 65 2c 20 72 65 74 75 72 6e 69  m value, returni
13c20 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 2e 20 28  ng in failure. (
13c30 6d 61 78 20 3d 20 25 6c 69 2c 20 6f 75 74 62 75  max = %li, outbu
13c40 66 6c 65 6e 20 3d 20 25 6c 75 29 22 2c 20 28 6c  flen = %lu)", (l
13c50 6f 6e 67 29 20 5f 50 4f 53 49 58 5f 53 53 49 5a  ong) _POSIX_SSIZ
13c60 45 5f 4d 41 58 2c 20 28 75 6e 73 69 67 6e 65 64  E_MAX, (unsigned
13c70 20 6c 6f 6e 67 29 20 6f 75 74 62 75 66 6c 65 6e   long) outbuflen
13c80 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29  );....return(-1)
13c90 3b 0a 09 7d 0a 23 20 20 65 6e 64 69 66 0a 23 65  ;..}.#  endif.#e
13ca0 6e 64 69 66 0a 0a 09 2f 2a 20 57 65 20 6d 75 73  ndif.../* We mus
13cb0 74 20 72 65 6d 6f 76 65 20 74 68 65 20 22 37 43  t remove the "7C
13cc0 22 20 74 61 67 20 74 6f 20 67 65 74 20 74 6f 20  " tag to get to 
13cd0 74 68 65 20 73 69 67 6e 61 74 75 72 65 20 2a 2f  the signature */
13ce0 0a 09 73 77 69 74 63 68 20 28 69 64 5f 74 79 70  ..switch (id_typ
13cf0 65 29 20 7b 0a 09 09 63 61 73 65 20 43 41 43 4b  e) {...case CACK
13d00 45 59 5f 49 44 5f 54 59 50 45 5f 50 49 56 3a 0a  EY_ID_TYPE_PIV:.
13d10 09 09 09 6f 75 74 62 75 66 5f 6c 65 6e 20 3d 20  ...outbuf_len = 
13d20 72 65 74 76 61 6c 3b 0a 09 09 09 6f 75 74 62 75  retval;....outbu
13d30 66 5f 70 20 3d 20 63 61 63 6b 65 79 5f 72 65 61  f_p = cackey_rea
13d40 64 5f 62 65 72 74 6c 76 5f 74 61 67 28 6f 75 74  d_bertlv_tag(out
13d50 62 75 66 2c 20 26 6f 75 74 62 75 66 5f 6c 65 6e  buf, &outbuf_len
13d60 2c 20 30 78 37 43 2c 20 4e 55 4c 4c 2c 20 20 26  , 0x7C, NULL,  &
13d70 6f 75 74 62 75 66 5f 6c 65 6e 29 3b 0a 09 09 09  outbuf_len);....
13d80 69 66 20 28 6f 75 74 62 75 66 5f 70 20 3d 3d 20  if (outbuf_p == 
13d90 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 43 41 43 4b  NULL) {.....CACK
13da0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
13db0 22 52 65 73 70 6f 6e 73 65 20 66 72 6f 6d 20 50  "Response from P
13dc0 49 56 20 66 6f 72 20 47 45 4e 45 52 41 54 45 20  IV for GENERATE 
13dd0 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 20 77  AUTHENTICATION w
13de0 61 73 20 6e 6f 74 20 61 20 30 78 37 43 20 74 61  as not a 0x7C ta
13df0 67 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20  g, returning in 
13e00 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 09 09  failure");......
13e10 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 09 7d  return(-1);....}
13e20 0a 0a 09 09 09 72 65 74 76 61 6c 20 3d 20 6f 75  .....retval = ou
13e30 74 62 75 66 5f 6c 65 6e 3b 0a 0a 09 09 09 6f 75  tbuf_len;.....ou
13e40 74 62 75 66 5f 6c 65 6e 20 3d 20 72 65 74 76 61  tbuf_len = retva
13e50 6c 3b 0a 09 09 09 6f 75 74 62 75 66 5f 70 20 3d  l;....outbuf_p =
13e60 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 62 65 72   cackey_read_ber
13e70 74 6c 76 5f 74 61 67 28 6f 75 74 62 75 66 2c 20  tlv_tag(outbuf, 
13e80 26 6f 75 74 62 75 66 5f 6c 65 6e 2c 20 30 78 38  &outbuf_len, 0x8
13e90 32 2c 20 4e 55 4c 4c 2c 20 20 26 6f 75 74 62 75  2, NULL,  &outbu
13ea0 66 5f 6c 65 6e 29 3b 0a 09 09 09 69 66 20 28 6f  f_len);....if (o
13eb0 75 74 62 75 66 5f 70 20 3d 3d 20 4e 55 4c 4c 29  utbuf_p == NULL)
13ec0 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45   {.....CACKEY_DE
13ed0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 73 70  BUG_PRINTF("Resp
13ee0 6f 6e 73 65 20 66 72 6f 6d 20 50 49 56 20 66 6f  onse from PIV fo
13ef0 72 20 47 45 4e 45 52 41 54 45 20 41 55 54 48 45  r GENERATE AUTHE
13f00 4e 54 49 43 41 54 49 4f 4e 20 77 61 73 20 6e 6f  NTICATION was no
13f10 74 20 61 20 30 78 38 32 20 77 69 74 68 69 6e 20  t a 0x82 within 
13f20 61 20 30 78 37 43 20 74 61 67 2c 20 72 65 74 75  a 0x7C tag, retu
13f30 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65  rning in failure
13f40 22 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28  ");......return(
13f50 2d 31 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 72 65  -1);....}.....re
13f60 74 76 61 6c 20 3d 20 6f 75 74 62 75 66 5f 6c 65  tval = outbuf_le
13f70 6e 3b 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09  n;.....break;...
13f80 63 61 73 65 20 43 41 43 4b 45 59 5f 49 44 5f 54  case CACKEY_ID_T
13f90 59 50 45 5f 43 41 43 3a 0a 09 09 63 61 73 65 20  YPE_CAC:...case 
13fa0 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43  CACKEY_ID_TYPE_C
13fb0 45 52 54 5f 4f 4e 4c 59 3a 0a 09 09 09 62 72 65  ERT_ONLY:....bre
13fc0 61 6b 3b 0a 09 7d 0a 0a 09 2f 2a 20 55 6e 70 61  ak;..}.../* Unpa
13fd0 64 20 72 65 70 6c 79 20 2a 2f 0a 09 69 66 20 28  d reply */..if (
13fe0 75 6e 70 61 64 4f 75 74 70 75 74 29 20 7b 0a 09  unpadOutput) {..
13ff0 09 69 66 20 28 72 65 74 76 61 6c 20 3c 20 33 29  .if (retval < 3)
14000 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
14010 55 47 5f 50 52 49 4e 54 46 28 22 52 65 70 6c 79  UG_PRINTF("Reply
14020 20 69 73 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20 77   is too small, w
14030 65 20 61 72 65 20 6e 6f 74 20 61 62 6c 65 20 74  e are not able t
14040 6f 20 75 6e 70 61 64 20 2d 2d 20 70 61 73 73 69  o unpad -- passi
14050 6e 67 20 62 61 63 6b 20 61 6e 64 20 68 6f 70 69  ng back and hopi
14060 6e 67 20 66 6f 72 20 74 68 65 20 62 65 73 74 21  ng for the best!
14070 22 29 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44  ");.....CACKEY_D
14080 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
14090 75 72 6e 69 6e 67 20 69 6e 20 73 75 63 63 65 73  urning in succes
140a0 73 2c 20 72 65 74 76 61 6c 20 3d 20 25 6c 69 20  s, retval = %li 
140b0 28 62 79 74 65 73 29 22 2c 20 28 6c 6f 6e 67 29  (bytes)", (long)
140c0 20 72 65 74 76 61 6c 29 3b 0a 09 09 09 72 65 74   retval);....ret
140d0 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 09 09 7d  urn(retval);...}
140e0 0a 0a 09 09 69 66 20 28 6f 75 74 62 75 66 5b 30  ....if (outbuf[0
140f0 5d 20 21 3d 20 30 78 30 30 29 20 7b 0a 09 09 09  ] != 0x00) {....
14100 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
14110 4e 54 46 28 22 55 6e 72 65 63 6f 67 6e 69 7a 65  NTF("Unrecognize
14120 64 20 70 61 64 64 69 6e 67 20 73 63 68 65 6d 65  d padding scheme
14130 20 2d 2d 20 70 61 73 73 69 6e 67 20 62 61 63 6b   -- passing back
14140 20 61 6e 64 20 68 6f 70 69 6e 67 20 66 6f 72 20   and hoping for 
14150 74 68 65 20 62 65 73 74 21 22 29 3b 0a 0a 09 09  the best!");....
14160 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
14170 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
14180 69 6e 20 73 75 63 63 65 73 73 2c 20 72 65 74 76  in success, retv
14190 61 6c 20 3d 20 25 6c 69 20 28 62 79 74 65 73 29  al = %li (bytes)
141a0 22 2c 20 28 6c 6f 6e 67 29 20 72 65 74 76 61 6c  ", (long) retval
141b0 29 3b 0a 09 09 09 72 65 74 75 72 6e 28 72 65 74  );....return(ret
141c0 76 61 6c 29 3b 0a 09 09 7d 0a 0a 09 09 62 6c 6f  val);...}....blo
141d0 63 6b 74 79 70 65 20 3d 20 6f 75 74 62 75 66 5b  cktype = outbuf[
141e0 31 5d 3b 0a 09 09 75 6e 70 61 64 6f 66 66 73 65  1];...unpadoffse
141f0 74 20 3d 20 30 3b 0a 0a 09 09 73 77 69 74 63 68  t = 0;....switch
14200 20 28 62 6c 6f 63 6b 74 79 70 65 29 20 7b 0a 09   (blocktype) {..
14210 09 09 63 61 73 65 20 30 78 30 30 3a 0a 09 09 09  ..case 0x00:....
14220 09 2f 2a 20 50 61 64 64 69 6e 67 20 53 63 68 65  ./* Padding Sche
14230 6d 65 20 31 2c 20 74 68 65 20 66 69 72 73 74 20  me 1, the first 
14240 6e 6f 6e 2d 7a 65 72 6f 20 62 79 74 65 20 69 73  non-zero byte is
14250 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 64 61   the start of da
14260 74 61 20 2a 2f 0a 09 09 09 09 66 6f 72 20 28 75  ta */.....for (u
14270 6e 70 61 64 6f 66 66 73 65 74 20 3d 20 32 3b 20  npadoffset = 2; 
14280 75 6e 70 61 64 6f 66 66 73 65 74 20 3c 20 72 65  unpadoffset < re
14290 74 76 61 6c 3b 20 75 6e 70 61 64 6f 66 66 73 65  tval; unpadoffse
142a0 74 2b 2b 29 20 7b 0a 09 09 09 09 09 69 66 20 28  t++) {......if (
142b0 6f 75 74 62 75 66 5b 75 6e 70 61 64 6f 66 66 73  outbuf[unpadoffs
142c0 65 74 5d 20 21 3d 20 30 78 30 30 29 20 7b 0a 09  et] != 0x00) {..
142d0 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09  .....break;.....
142e0 09 7d 0a 09 09 09 09 7d 0a 09 09 09 09 62 72 65  .}.....}.....bre
142f0 61 6b 3b 0a 09 09 09 63 61 73 65 20 30 78 30 31  ak;....case 0x01
14300 3a 0a 09 09 09 09 2f 2a 20 50 61 64 64 69 6e 67  :...../* Padding
14310 20 53 63 68 65 6d 65 20 32 2c 20 70 61 64 20 62   Scheme 2, pad b
14320 79 74 65 73 20 61 72 65 20 30 78 46 46 20 66 6f  ytes are 0xFF fo
14330 6c 6c 6f 77 65 64 20 62 79 20 30 78 30 30 20 2a  llowed by 0x00 *
14340 2f 0a 09 09 09 09 66 6f 72 20 28 75 6e 70 61 64  /.....for (unpad
14350 6f 66 66 73 65 74 20 3d 20 32 3b 20 75 6e 70 61  offset = 2; unpa
14360 64 6f 66 66 73 65 74 20 3c 20 72 65 74 76 61 6c  doffset < retval
14370 3b 20 75 6e 70 61 64 6f 66 66 73 65 74 2b 2b 29  ; unpadoffset++)
14380 20 7b 0a 09 09 09 09 09 69 66 20 28 6f 75 74 62   {......if (outb
14390 75 66 5b 75 6e 70 61 64 6f 66 66 73 65 74 5d 20  uf[unpadoffset] 
143a0 21 3d 20 30 78 46 46 29 20 7b 0a 09 09 09 09 09  != 0xFF) {......
143b0 09 69 66 20 28 6f 75 74 62 75 66 5b 75 6e 70 61  .if (outbuf[unpa
143c0 64 6f 66 66 73 65 74 5d 20 3d 3d 20 30 78 30 30  doffset] == 0x00
143d0 29 20 7b 0a 09 09 09 09 09 09 09 75 6e 70 61 64  ) {........unpad
143e0 6f 66 66 73 65 74 2b 2b 3b 0a 0a 09 09 09 09 09  offset++;.......
143f0 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 09 7d  ..break;.......}
14400 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09 09 43   else {........C
14410 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
14420 54 46 28 22 49 6e 76 61 6c 69 64 20 70 61 64 64  TF("Invalid padd
14430 69 6e 67 20 64 61 74 61 20 66 6f 75 6e 64 2c 20  ing data found, 
14440 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  returning in fai
14450 6c 75 72 65 2c 20 73 68 6f 75 6c 64 20 68 61 76  lure, should hav
14460 65 20 62 65 65 6e 20 30 78 30 30 20 66 6f 75 6e  e been 0x00 foun
14470 64 20 30 78 25 30 32 78 22 2c 20 28 75 6e 73 69  d 0x%02x", (unsi
14480 67 6e 65 64 20 69 6e 74 29 20 6f 75 74 62 75 66  gned int) outbuf
14490 5b 75 6e 70 61 64 6f 66 66 73 65 74 5d 29 3b 0a  [unpadoffset]);.
144a0 0a 09 09 09 09 09 09 09 72 65 74 75 72 6e 28 2d  ........return(-
144b0 31 29 3b 0a 09 09 09 09 09 09 7d 0a 09 09 09 09  1);.......}.....
144c0 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09  .} else {.......
144d0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
144e0 4e 54 46 28 22 49 6e 76 61 6c 69 64 20 70 61 64  NTF("Invalid pad
144f0 64 69 6e 67 20 64 61 74 61 20 66 6f 75 6e 64 2c  ding data found,
14500 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61   returning in fa
14510 69 6c 75 72 65 2c 20 73 68 6f 75 6c 64 20 68 61  ilure, should ha
14520 76 65 20 62 65 65 6e 20 30 78 46 46 20 66 6f 75  ve been 0xFF fou
14530 6e 64 20 30 78 25 30 32 78 22 2c 20 28 75 6e 73  nd 0x%02x", (uns
14540 69 67 6e 65 64 20 69 6e 74 29 20 6f 75 74 62 75  igned int) outbu
14550 66 5b 75 6e 70 61 64 6f 66 66 73 65 74 5d 29 3b  f[unpadoffset]);
14560 0a 0a 09 09 09 09 09 09 72 65 74 75 72 6e 28 2d  ........return(-
14570 31 29 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d  1);......}.....}
14580 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
14590 61 73 65 20 30 78 30 32 3a 0a 09 09 09 09 2f 2a  ase 0x02:...../*
145a0 20 50 61 64 64 69 6e 67 20 53 63 68 65 6d 65 20   Padding Scheme 
145b0 33 2c 20 70 61 64 20 62 79 74 65 73 20 61 72 65  3, pad bytes are
145c0 20 6e 6f 6e 2d 7a 65 72 6f 20 66 69 72 73 74 20   non-zero first 
145d0 7a 65 72 6f 20 62 79 74 65 20 66 6f 75 6e 64 20  zero byte found 
145e0 69 73 20 74 68 65 20 73 65 70 65 72 61 74 6f 72  is the seperator
145f0 20 62 79 74 65 20 2a 2f 0a 09 09 09 09 66 6f 72   byte */.....for
14600 20 28 75 6e 70 61 64 6f 66 66 73 65 74 20 3d 20   (unpadoffset = 
14610 32 3b 20 75 6e 70 61 64 6f 66 66 73 65 74 20 3c  2; unpadoffset <
14620 20 72 65 74 76 61 6c 3b 20 75 6e 70 61 64 6f 66   retval; unpadof
14630 66 73 65 74 2b 2b 29 20 7b 0a 09 09 09 09 09 69  fset++) {......i
14640 66 20 28 6f 75 74 62 75 66 5b 75 6e 70 61 64 6f  f (outbuf[unpado
14650 66 66 73 65 74 5d 20 3d 3d 20 30 78 30 30 29 20  ffset] == 0x00) 
14660 7b 0a 09 09 09 09 09 09 75 6e 70 61 64 6f 66 66  {.......unpadoff
14670 73 65 74 2b 2b 3b 0a 0a 09 09 09 09 09 09 62 72  set++;........br
14680 65 61 6b 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09  eak;......}.....
14690 7d 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d  }.....break;...}
146a0 0a 0a 09 09 69 66 20 28 75 6e 70 61 64 6f 66 66  ....if (unpadoff
146b0 73 65 74 20 3e 20 72 65 74 76 61 6c 29 20 7b 0a  set > retval) {.
146c0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
146d0 50 52 49 4e 54 46 28 22 4f 66 66 73 65 74 20 67  PRINTF("Offset g
146e0 72 65 61 74 65 72 20 74 68 61 6e 20 72 65 70 6c  reater than repl
146f0 79 20 73 69 7a 65 2c 20 61 62 6f 72 74 69 6e 67  y size, aborting
14700 2e 20 20 28 75 6e 70 61 64 6f 66 66 73 65 74 20  .  (unpadoffset 
14710 3d 20 25 6c 75 2c 20 72 65 74 76 61 6c 20 3d 20  = %lu, retval = 
14720 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64  %lu)", (unsigned
14730 20 6c 6f 6e 67 29 20 75 6e 70 61 64 6f 66 66 73   long) unpadoffs
14740 65 74 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  et, (unsigned lo
14750 6e 67 29 20 72 65 74 76 61 6c 29 3b 0a 0a 09 09  ng) retval);....
14760 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d  .return(-1);...}
14770 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
14780 5f 50 52 49 4e 54 42 55 46 28 22 50 61 64 64 65  _PRINTBUF("Padde
14790 64 3a 22 2c 20 6f 75 74 62 75 66 2c 20 72 65 74  d:", outbuf, ret
147a0 76 61 6c 29 3b 0a 0a 09 09 72 65 74 76 61 6c 20  val);....retval 
147b0 2d 3d 20 75 6e 70 61 64 6f 66 66 73 65 74 3b 0a  -= unpadoffset;.
147c0 09 09 6d 65 6d 6d 6f 76 65 28 6f 75 74 62 75 66  ..memmove(outbuf
147d0 2c 20 6f 75 74 62 75 66 20 2b 20 75 6e 70 61 64  , outbuf + unpad
147e0 6f 66 66 73 65 74 2c 20 72 65 74 76 61 6c 29 3b  offset, retval);
147f0 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
14800 5f 50 52 49 4e 54 42 55 46 28 22 55 6e 70 61 64  _PRINTBUF("Unpad
14810 64 65 64 3a 22 2c 20 6f 75 74 62 75 66 2c 20 72  ded:", outbuf, r
14820 65 74 76 61 6c 29 3b 0a 09 7d 0a 0a 0a 09 43 41  etval);..}....CA
14830 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
14840 46 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e 20  F("Returning in 
14850 73 75 63 63 65 73 73 2c 20 72 65 74 76 61 6c 20  success, retval 
14860 3d 20 25 6c 69 20 28 62 79 74 65 73 29 22 2c 20  = %li (bytes)", 
14870 28 6c 6f 6e 67 29 20 72 65 74 76 61 6c 29 3b 0a  (long) retval);.
14880 0a 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29  ..return(retval)
14890 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f  ;.}../*. * SYNPO
148a0 53 49 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20  SIS. *     .... 
148b0 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20  *. * ARGUMENTS. 
148c0 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20  *     .... *. * 
148d0 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20  RETURN VALUE. * 
148e0 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f      .... *. * NO
148f0 54 45 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20  TES. *     .... 
14900 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 61 63  *. */.static cac
14910 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 6c  key_ret cackey_l
14920 6f 67 69 6e 28 73 74 72 75 63 74 20 63 61 63 6b  ogin(struct cack
14930 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75  ey_slot *slot, u
14940 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 69  nsigned char *pi
14950 6e 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  n, unsigned long
14960 20 70 69 6e 5f 6c 65 6e 2c 20 69 6e 74 20 2a 74   pin_len, int *t
14970 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 5f 70  ries_remaining_p
14980 29 20 7b 0a 09 73 74 72 75 63 74 20 63 61 63 6b  ) {..struct cack
14990 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79  ey_pcsc_identity
149a0 20 2a 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65   *pcsc_identitie
149b0 73 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61  s;..unsigned cha
149c0 72 20 63 61 63 5f 70 69 6e 5b 38 5d 20 3d 20 7b  r cac_pin[8] = {
149d0 30 78 46 46 2c 20 30 78 46 46 2c 20 30 78 46 46  0xFF, 0xFF, 0xFF
149e0 2c 20 30 78 46 46 2c 20 30 78 46 46 2c 20 30 78  , 0xFF, 0xFF, 0x
149f0 46 46 2c 20 30 78 46 46 2c 20 30 78 46 46 7d 3b  FF, 0xFF, 0xFF};
14a00 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  ..unsigned long 
14a10 6e 75 6d 5f 63 65 72 74 73 3b 0a 09 75 69 6e 74  num_certs;..uint
14a20 31 36 5f 74 20 72 65 73 70 6f 6e 73 65 5f 63 6f  16_t response_co
14a30 64 65 3b 0a 09 69 6e 74 20 74 72 69 65 73 5f 72  de;..int tries_r
14a40 65 6d 61 69 6e 69 6e 67 3b 0a 09 69 6e 74 20 73  emaining;..int s
14a50 65 6e 64 5f 72 65 74 3b 0a 09 69 6e 74 20 6b 65  end_ret;..int ke
14a60 79 5f 72 65 66 65 72 65 6e 63 65 20 3d 20 30 78  y_reference = 0x
14a70 30 30 3b 0a 0a 09 2f 2a 20 49 6e 64 69 63 61 74  00;.../* Indicat
14a80 65 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74  e that we do not
14a90 20 6b 6e 6f 77 20 61 62 6f 75 74 20 68 6f 77 20   know about how 
14aa0 6d 61 6e 79 20 74 72 69 65 73 20 61 72 65 20 72  many tries are r
14ab0 65 6d 61 69 6e 69 6e 67 20 2a 2f 0a 09 69 66 20  emaining */..if 
14ac0 28 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67  (tries_remaining
14ad0 5f 70 29 20 7b 0a 09 09 2a 74 72 69 65 73 5f 72  _p) {...*tries_r
14ae0 65 6d 61 69 6e 69 6e 67 5f 70 20 3d 20 2d 31 3b  emaining_p = -1;
14af0 0a 09 7d 0a 0a 09 2f 2a 20 41 70 70 61 72 65 6e  ..}.../* Apparen
14b00 74 6c 79 2c 20 43 41 43 20 50 49 4e 73 20 61 72  tly, CAC PINs ar
14b10 65 20 2a 45 58 41 43 54 4c 59 2a 20 38 20 62 79  e *EXACTLY* 8 by
14b20 74 65 73 20 6c 6f 6e 67 20 2d 2d 20 70 61 64 20  tes long -- pad 
14b30 77 69 74 68 20 30 78 46 46 20 69 66 20 74 6f 6f  with 0xFF if too
14b40 20 73 68 6f 72 74 20 2a 2f 0a 09 69 66 20 28 70   short */..if (p
14b50 69 6e 5f 6c 65 6e 20 3e 3d 20 38 29 20 7b 0a 09  in_len >= 8) {..
14b60 09 6d 65 6d 63 70 79 28 63 61 63 5f 70 69 6e 2c  .memcpy(cac_pin,
14b70 20 70 69 6e 2c 20 38 29 3b 0a 09 7d 20 65 6c 73   pin, 8);..} els
14b80 65 20 7b 0a 09 09 6d 65 6d 63 70 79 28 63 61 63  e {...memcpy(cac
14b90 5f 70 69 6e 2c 20 70 69 6e 2c 20 70 69 6e 5f 6c  _pin, pin, pin_l
14ba0 65 6e 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 52 65 6a  en);..}.../* Rej
14bb0 65 63 74 20 50 49 4e 73 20 77 68 69 63 68 20 61  ect PINs which a
14bc0 72 65 20 74 6f 6f 20 73 68 6f 72 74 20 2a 2f 0a  re too short */.
14bd0 09 69 66 20 28 70 69 6e 5f 6c 65 6e 20 3c 20 35  .if (pin_len < 5
14be0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
14bf0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 6a 65 63  UG_PRINTF("Rejec
14c00 74 69 6e 67 20 50 49 4e 20 77 68 69 63 68 20 69  ting PIN which i
14c10 73 20 74 6f 6f 20 73 68 6f 72 74 20 28 6c 65 6e  s too short (len
14c20 67 74 68 20 3d 20 25 6c 75 2c 20 6d 75 73 74 20  gth = %lu, must 
14c30 62 65 20 61 74 6c 65 61 73 74 20 35 29 22 2c 20  be atleast 5)", 
14c40 70 69 6e 5f 6c 65 6e 29 3b 0a 0a 09 09 72 65 74  pin_len);....ret
14c50 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
14c60 45 5f 42 41 44 50 49 4e 29 3b 0a 09 7d 0a 0a 09  E_BADPIN);..}...
14c70 2f 2a 20 50 49 56 20 61 75 74 68 65 6e 74 69 63  /* PIV authentic
14c80 61 74 69 6f 6e 20 75 73 65 73 20 61 20 22 6b 65  ation uses a "ke
14c90 79 5f 72 65 66 65 72 65 6e 63 65 22 20 6f 66 20  y_reference" of 
14ca0 30 78 38 30 20 2a 2f 0a 09 70 63 73 63 5f 69 64  0x80 */..pcsc_id
14cb0 65 6e 74 69 74 69 65 73 20 3d 20 63 61 63 6b 65  entities = cacke
14cc0 79 5f 72 65 61 64 5f 63 65 72 74 73 28 73 6c 6f  y_read_certs(slo
14cd0 74 2c 20 4e 55 4c 4c 2c 20 26 6e 75 6d 5f 63 65  t, NULL, &num_ce
14ce0 72 74 73 29 3b 0a 09 69 66 20 28 6e 75 6d 5f 63  rts);..if (num_c
14cf0 65 72 74 73 20 3e 20 30 20 26 26 20 70 63 73 63  erts > 0 && pcsc
14d00 5f 69 64 65 6e 74 69 74 69 65 73 20 21 3d 20 4e  _identities != N
14d10 55 4c 4c 29 20 7b 0a 09 09 73 77 69 74 63 68 20  ULL) {...switch 
14d20 28 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73  (pcsc_identities
14d30 5b 30 5d 2e 69 64 5f 74 79 70 65 29 20 7b 0a 09  [0].id_type) {..
14d40 09 09 63 61 73 65 20 43 41 43 4b 45 59 5f 49 44  ..case CACKEY_ID
14d50 5f 54 59 50 45 5f 50 49 56 3a 0a 09 09 09 09 43  _TYPE_PIV:.....C
14d60 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
14d70 54 46 28 22 57 65 20 68 61 76 65 20 50 49 56 20  TF("We have PIV 
14d80 63 61 72 64 2c 20 73 6f 20 77 65 20 77 69 6c 6c  card, so we will
14d90 20 61 74 74 65 6d 70 74 20 74 6f 20 61 75 74 68   attempt to auth
14da0 65 6e 74 69 63 61 74 65 20 75 73 69 6e 67 20 74  enticate using t
14db0 68 65 20 50 49 56 20 41 70 70 6c 69 63 61 74 69  he PIV Applicati
14dc0 6f 6e 20 6b 65 79 20 72 65 66 65 72 65 6e 63 65  on key reference
14dd0 22 29 3b 0a 0a 09 09 09 09 6b 65 79 5f 72 65 66  ");......key_ref
14de0 65 72 65 6e 63 65 20 3d 20 30 78 38 30 3b 0a 09  erence = 0x80;..
14df0 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 64 65 66  ...break;....def
14e00 61 75 6c 74 3a 0a 09 09 09 09 62 72 65 61 6b 3b  ault:.....break;
14e10 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 66  ...}....cackey_f
14e20 72 65 65 5f 63 65 72 74 73 28 70 63 73 63 5f 69  ree_certs(pcsc_i
14e30 64 65 6e 74 69 74 69 65 73 2c 20 6e 75 6d 5f 63  dentities, num_c
14e40 65 72 74 73 2c 20 31 29 3b 0a 09 7d 0a 0a 09 2f  erts, 1);..}.../
14e50 2a 20 49 73 73 75 65 20 50 49 4e 20 56 65 72 69  * Issue PIN Veri
14e60 66 79 20 2a 2f 0a 09 73 65 6e 64 5f 72 65 74 20  fy */..send_ret 
14e70 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70  = cackey_send_ap
14e80 64 75 28 73 6c 6f 74 2c 20 47 53 43 49 53 5f 43  du(slot, GSCIS_C
14e90 4c 41 53 53 5f 49 53 4f 37 38 31 36 2c 20 47 53  LASS_ISO7816, GS
14ea0 43 49 53 5f 49 4e 53 54 52 5f 56 45 52 49 46 59  CIS_INSTR_VERIFY
14eb0 2c 20 30 78 30 30 2c 20 6b 65 79 5f 72 65 66 65  , 0x00, key_refe
14ec0 72 65 6e 63 65 2c 20 73 69 7a 65 6f 66 28 63 61  rence, sizeof(ca
14ed0 63 5f 70 69 6e 29 2c 20 63 61 63 5f 70 69 6e 2c  c_pin), cac_pin,
14ee0 20 30 78 30 30 2c 20 26 72 65 73 70 6f 6e 73 65   0x00, &response
14ef0 5f 63 6f 64 65 2c 20 4e 55 4c 4c 2c 20 4e 55 4c  _code, NULL, NUL
14f00 4c 29 3b 0a 0a 09 69 66 20 28 73 65 6e 64 5f 72  L);...if (send_r
14f10 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53  et != CACKEY_PCS
14f20 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 69 66 20 28  C_S_OK) {...if (
14f30 28 72 65 73 70 6f 6e 73 65 5f 63 6f 64 65 20 26  (response_code &
14f40 20 30 78 36 33 43 30 29 20 3d 3d 20 30 78 36 33   0x63C0) == 0x63
14f50 43 30 29 20 7b 0a 09 09 09 74 72 69 65 73 5f 72  C0) {....tries_r
14f60 65 6d 61 69 6e 69 6e 67 20 3d 20 28 72 65 73 70  emaining = (resp
14f70 6f 6e 73 65 5f 63 6f 64 65 20 26 20 30 78 46 29  onse_code & 0xF)
14f80 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ;.....CACKEY_DEB
14f90 55 47 5f 50 52 49 4e 54 46 28 22 50 49 4e 20 56  UG_PRINTF("PIN V
14fa0 65 72 69 66 69 63 61 74 69 6f 6e 20 66 61 69 6c  erification fail
14fb0 65 64 2c 20 25 69 20 74 72 69 65 73 20 72 65 6d  ed, %i tries rem
14fc0 61 69 6e 69 6e 67 22 2c 20 74 72 69 65 73 5f 72  aining", tries_r
14fd0 65 6d 61 69 6e 69 6e 67 29 3b 0a 0a 09 09 09 69  emaining);.....i
14fe0 66 20 28 74 72 69 65 73 5f 72 65 6d 61 69 6e 69  f (tries_remaini
14ff0 6e 67 5f 70 29 20 7b 0a 09 09 09 09 2a 74 72 69  ng_p) {.....*tri
15000 65 73 5f 72 65 6d 61 69 6e 69 6e 67 5f 70 20 3d  es_remaining_p =
15010 20 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67   tries_remaining
15020 3b 0a 09 09 09 7d 0a 0a 09 09 09 72 65 74 75 72  ;....}.....retur
15030 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  n(CACKEY_PCSC_E_
15040 42 41 44 50 49 4e 29 3b 0a 09 09 7d 0a 0a 09 09  BADPIN);...}....
15050 69 66 20 28 72 65 73 70 6f 6e 73 65 5f 63 6f 64  if (response_cod
15060 65 20 3d 3d 20 30 78 36 39 38 33 29 20 7b 0a 09  e == 0x6983) {..
15070 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
15080 52 49 4e 54 46 28 22 50 49 4e 20 56 65 72 69 66  RINTF("PIN Verif
15090 69 63 61 74 69 6f 6e 20 66 61 69 6c 65 64 2c 20  ication failed, 
150a0 64 65 76 69 63 65 20 69 73 20 6c 6f 63 6b 65 64  device is locked
150b0 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43  ");.....return(C
150c0 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4c 4f 43  ACKEY_PCSC_E_LOC
150d0 4b 45 44 29 3b 0a 09 09 7d 0a 0a 09 09 72 65 74  KED);...}....ret
150e0 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
150f0 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a  E_GENERIC);..}..
15100 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
15110 49 4e 54 46 28 22 50 49 4e 20 56 65 72 69 66 69  INTF("PIN Verifi
15120 63 61 74 69 6f 6e 20 73 75 63 63 65 65 64 65 64  cation succeeded
15130 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41 43  ");...return(CAC
15140 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a  KEY_PCSC_S_OK);.
15150 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49  }../*. * SYNPOSI
15160 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a  S. *     .... *.
15170 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20   * ARGUMENTS. * 
15180 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45      .... *. * RE
15190 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20  TURN VALUE. *   
151a0 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45    .... *. * NOTE
151b0 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a  S. *     .... *.
151c0 20 2a 2f 0a 73 74 61 74 69 63 20 63 61 63 6b 65   */.static cacke
151d0 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 74 6f 6b  y_ret cackey_tok
151e0 65 6e 5f 70 72 65 73 65 6e 74 28 73 74 72 75 63  en_present(struc
151f0 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73  t cackey_slot *s
15200 6c 6f 74 29 20 7b 0a 09 63 61 63 6b 65 79 5f 72  lot) {..cackey_r
15210 65 74 20 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f  et pcsc_connect_
15220 72 65 74 3b 0a 09 44 57 4f 52 44 20 72 65 61 64  ret;..DWORD read
15230 65 72 5f 6c 65 6e 20 3d 20 30 2c 20 73 74 61 74  er_len = 0, stat
15240 65 20 3d 20 30 2c 20 70 72 6f 74 6f 63 6f 6c 20  e = 0, protocol 
15250 3d 20 30 2c 20 61 74 72 5f 6c 65 6e 3b 0a 09 42  = 0, atr_len;..B
15260 59 54 45 20 61 74 72 5b 4d 41 58 5f 41 54 52 5f  YTE atr[MAX_ATR_
15270 53 49 5a 45 5d 3b 0a 09 4c 4f 4e 47 20 73 74 61  SIZE];..LONG sta
15280 74 75 73 5f 72 65 74 2c 20 73 63 61 72 64 5f 72  tus_ret, scard_r
15290 65 63 6f 6e 6e 5f 72 65 74 3b 0a 0a 09 43 41 43  econn_ret;...CAC
152a0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
152b0 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
152c0 66 20 28 73 6c 6f 74 2d 3e 69 6e 74 65 72 6e 61  f (slot->interna
152d0 6c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  l) {...CACKEY_DE
152e0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
152f0 72 6e 69 6e 67 20 74 6f 6b 65 6e 20 70 72 65 73  rning token pres
15300 65 6e 74 20 28 69 6e 74 65 72 6e 61 6c 20 74 6f  ent (internal to
15310 6b 65 6e 29 22 29 3b 0a 0a 09 09 72 65 74 75 72  ken)");....retur
15320 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  n(CACKEY_PCSC_S_
15330 54 4f 4b 45 4e 50 52 45 53 45 4e 54 29 3b 0a 09  TOKENPRESENT);..
15340 7d 0a 0a 09 70 63 73 63 5f 63 6f 6e 6e 65 63 74  }...pcsc_connect
15350 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 63 6f  _ret = cackey_co
15360 6e 6e 65 63 74 5f 63 61 72 64 28 73 6c 6f 74 29  nnect_card(slot)
15370 3b 0a 09 69 66 20 28 70 63 73 63 5f 63 6f 6e 6e  ;..if (pcsc_conn
15380 65 63 74 5f 72 65 74 20 21 3d 20 43 41 43 4b 45  ect_ret != CACKE
15390 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09  Y_PCSC_S_OK) {..
153a0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
153b0 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20  INTF("Unable to 
153c0 63 6f 6e 6e 65 63 74 20 74 6f 20 63 61 72 64 2c  connect to card,
153d0 20 72 65 74 75 72 6e 69 6e 67 20 74 6f 6b 65 6e   returning token
153e0 20 61 62 73 65 6e 74 22 29 3b 0a 0a 09 09 72 65   absent");....re
153f0 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
15400 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b  _E_TOKENABSENT);
15410 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
15420 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 69  UG_PRINTF("Calli
15430 6e 67 20 53 43 61 72 64 53 74 61 74 75 73 28 29  ng SCardStatus()
15440 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 63 61   to determine ca
15450 72 64 20 73 74 61 74 75 73 22 29 3b 0a 0a 09 61  rd status");...a
15460 74 72 5f 6c 65 6e 20 3d 20 73 69 7a 65 6f 66 28  tr_len = sizeof(
15470 61 74 72 29 3b 0a 09 73 74 61 74 75 73 5f 72 65  atr);..status_re
15480 74 20 3d 20 53 43 61 72 64 53 74 61 74 75 73 28  t = SCardStatus(
15490 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c  slot->pcsc_card,
154a0 20 4e 55 4c 4c 2c 20 26 72 65 61 64 65 72 5f 6c   NULL, &reader_l
154b0 65 6e 2c 20 26 73 74 61 74 65 2c 20 26 70 72 6f  en, &state, &pro
154c0 74 6f 63 6f 6c 2c 20 61 74 72 2c 20 26 61 74 72  tocol, atr, &atr
154d0 5f 6c 65 6e 29 3b 0a 0a 09 69 66 20 28 73 74 61  _len);...if (sta
154e0 74 75 73 5f 72 65 74 20 3d 3d 20 53 43 41 52 44  tus_ret == SCARD
154f0 5f 45 5f 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c  _E_INVALID_HANDL
15500 45 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  E) {...CACKEY_DE
15510 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43 61 72  BUG_PRINTF("SCar
15520 64 53 74 61 74 75 73 28 29 20 72 65 74 75 72 6e  dStatus() return
15530 65 64 20 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c  ed SCARD_E_INVAL
15540 49 44 5f 48 41 4e 44 4c 45 2c 20 6d 61 72 6b 69  ID_HANDLE, marki
15550 6e 67 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  ng is not alread
15560 79 20 63 6f 6e 6e 65 63 74 65 64 20 61 6e 64 20  y connected and 
15570 74 72 79 69 6e 67 20 61 67 61 69 6e 22 29 3b 0a  trying again");.
15580 09 09 63 61 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c  ..cackey_mark_sl
15590 6f 74 5f 72 65 73 65 74 28 73 6c 6f 74 29 3b 0a  ot_reset(slot);.
155a0 0a 09 09 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f  ...pcsc_connect_
155b0 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 63 6f 6e  ret = cackey_con
155c0 6e 65 63 74 5f 63 61 72 64 28 73 6c 6f 74 29 3b  nect_card(slot);
155d0 0a 09 09 69 66 20 28 70 63 73 63 5f 63 6f 6e 6e  ...if (pcsc_conn
155e0 65 63 74 5f 72 65 74 20 21 3d 20 43 41 43 4b 45  ect_ret != CACKE
155f0 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09  Y_PCSC_S_OK) {..
15600 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
15610 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f  RINTF("Unable to
15620 20 63 6f 6e 6e 65 63 74 20 74 6f 20 63 61 72 64   connect to card
15630 2c 20 72 65 74 75 72 6e 69 6e 67 20 74 6f 6b 65  , returning toke
15640 6e 20 61 62 73 65 6e 74 22 29 3b 0a 0a 09 09 09  n absent");.....
15650 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
15660 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54  SC_E_TOKENABSENT
15670 29 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59  );...}....CACKEY
15680 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
15690 61 6c 6c 69 6e 67 20 53 43 61 72 64 53 74 61 74  alling SCardStat
156a0 75 73 28 29 20 61 67 61 69 6e 22 29 3b 0a 0a 09  us() again");...
156b0 09 61 74 72 5f 6c 65 6e 20 3d 20 73 69 7a 65 6f  .atr_len = sizeo
156c0 66 28 61 74 72 29 3b 0a 09 09 73 74 61 74 75 73  f(atr);...status
156d0 5f 72 65 74 20 3d 20 53 43 61 72 64 53 74 61 74  _ret = SCardStat
156e0 75 73 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61  us(slot->pcsc_ca
156f0 72 64 2c 20 4e 55 4c 4c 2c 20 26 72 65 61 64 65  rd, NULL, &reade
15700 72 5f 6c 65 6e 2c 20 26 73 74 61 74 65 2c 20 26  r_len, &state, &
15710 70 72 6f 74 6f 63 6f 6c 2c 20 61 74 72 2c 20 26  protocol, atr, &
15720 61 74 72 5f 6c 65 6e 29 3b 0a 09 7d 0a 0a 09 69  atr_len);..}...i
15730 66 20 28 73 74 61 74 75 73 5f 72 65 74 20 21 3d  f (status_ret !=
15740 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53   SCARD_S_SUCCESS
15750 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 61 72  ) {...cackey_mar
15760 6b 5f 73 6c 6f 74 5f 72 65 73 65 74 28 73 6c 6f  k_slot_reset(slo
15770 74 29 3b 0a 0a 09 09 69 66 20 28 73 74 61 74 75  t);....if (statu
15780 73 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 57  s_ret == SCARD_W
15790 5f 52 45 53 45 54 5f 43 41 52 44 29 20 7b 0a 09  _RESET_CARD) {..
157a0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
157b0 52 49 4e 54 46 28 22 52 65 73 65 74 20 72 65 71  RINTF("Reset req
157c0 75 69 72 65 64 2c 20 70 6c 65 61 73 65 20 68 6f  uired, please ho
157d0 6c 64 2e 2e 2e 22 29 3b 0a 0a 09 09 09 73 63 61  ld...");.....sca
157e0 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 74 20 3d 20  rd_reconn_ret = 
157f0 63 61 63 6b 65 79 5f 72 65 63 6f 6e 6e 65 63 74  cackey_reconnect
15800 5f 63 61 72 64 28 73 6c 6f 74 2c 20 53 43 41 52  _card(slot, SCAR
15810 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 20 7c 20  D_PROTOCOL_T0 | 
15820 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54  SCARD_PROTOCOL_T
15830 31 29 3b 0a 09 09 09 69 66 20 28 73 63 61 72 64  1);....if (scard
15840 5f 72 65 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53  _reconn_ret == S
15850 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20  CARD_S_SUCCESS) 
15860 7b 0a 09 09 09 09 2f 2a 20 52 65 2d 65 73 74 61  {...../* Re-esta
15870 62 6c 69 73 68 20 74 72 61 6e 73 61 63 74 69 6f  blish transactio
15880 6e 2c 20 69 66 20 69 74 20 77 61 73 20 70 72 65  n, if it was pre
15890 73 65 6e 74 20 2a 2f 0a 09 09 09 09 69 66 20 28  sent */.....if (
158a0 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f  slot->transactio
158b0 6e 5f 64 65 70 74 68 20 3e 20 30 29 20 7b 0a 09  n_depth > 0) {..
158c0 09 09 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61  ....slot->transa
158d0 63 74 69 6f 6e 5f 64 65 70 74 68 2d 2d 3b 0a 09  ction_depth--;..
158e0 09 09 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61  ....slot->transa
158f0 63 74 69 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f  ction_need_hw_lo
15900 63 6b 20 3d 20 31 3b 0a 09 09 09 09 09 63 61 63  ck = 1;......cac
15910 6b 65 79 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61  key_begin_transa
15920 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 09 09 09  ction(slot);....
15930 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  .}......CACKEY_D
15940 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 73  EBUG_PRINTF("Res
15950 65 74 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72  et successful, r
15960 65 71 75 65 72 79 69 6e 67 22 29 3b 0a 09 09 09  equerying");....
15970 09 73 74 61 74 75 73 5f 72 65 74 20 3d 20 53 43  .status_ret = SC
15980 61 72 64 53 74 61 74 75 73 28 73 6c 6f 74 2d 3e  ardStatus(slot->
15990 70 63 73 63 5f 63 61 72 64 2c 20 4e 55 4c 4c 2c  pcsc_card, NULL,
159a0 20 26 72 65 61 64 65 72 5f 6c 65 6e 2c 20 26 73   &reader_len, &s
159b0 74 61 74 65 2c 20 26 70 72 6f 74 6f 63 6f 6c 2c  tate, &protocol,
159c0 20 61 74 72 2c 20 26 61 74 72 5f 6c 65 6e 29 3b   atr, &atr_len);
159d0 0a 09 09 09 09 69 66 20 28 73 74 61 74 75 73 5f  .....if (status_
159e0 72 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f 53  ret != SCARD_S_S
159f0 55 43 43 45 53 53 29 20 7b 0a 09 09 09 09 09 43  UCCESS) {......C
15a00 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
15a10 54 46 28 22 53 74 69 6c 6c 20 75 6e 61 62 6c 65  TF("Still unable
15a20 20 74 6f 20 71 75 65 72 79 20 63 61 72 64 20 73   to query card s
15a30 74 61 74 75 73 2c 20 72 65 74 75 72 6e 69 6e 67  tatus, returning
15a40 20 74 6f 6b 65 6e 20 61 62 73 65 6e 74 2e 20 20   token absent.  
15a50 53 43 61 72 64 53 74 61 74 75 73 28 29 20 3d 20  SCardStatus() = 
15a60 25 73 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55  %s", CACKEY_DEBU
15a70 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f  G_FUNC_SCARDERR_
15a80 54 4f 5f 53 54 52 28 73 74 61 74 75 73 5f 72 65  TO_STR(status_re
15a90 74 29 29 3b 0a 0a 09 09 09 09 09 72 65 74 75 72  t));.......retur
15aa0 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  n(CACKEY_PCSC_E_
15ab0 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b 0a 09 09  TOKENABSENT);...
15ac0 09 09 7d 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a  ..}....} else {.
15ad0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
15ae0 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20  _PRINTF("Unable 
15af0 74 6f 20 72 65 63 6f 6e 6e 65 63 74 20 74 6f 20  to reconnect to 
15b00 63 61 72 64 2c 20 72 65 74 75 72 6e 69 6e 67 20  card, returning 
15b10 74 6f 6b 65 6e 20 61 62 73 65 6e 74 2e 20 20 53  token absent.  S
15b20 43 61 72 64 52 65 63 6f 6e 6e 65 63 74 28 29 20  CardReconnect() 
15b30 3d 20 25 73 22 2c 20 43 41 43 4b 45 59 5f 44 45  = %s", CACKEY_DE
15b40 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52  BUG_FUNC_SCARDER
15b50 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 5f 72  R_TO_STR(scard_r
15b60 65 63 6f 6e 6e 5f 72 65 74 29 29 3b 0a 0a 09 09  econn_ret));....
15b70 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
15b80 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45  PCSC_E_TOKENABSE
15b90 4e 54 29 3b 0a 09 09 09 7d 0a 09 09 7d 20 65 6c  NT);....}...} el
15ba0 73 65 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  se {....CACKEY_D
15bb0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61  EBUG_PRINTF("Una
15bc0 62 6c 65 20 74 6f 20 71 75 65 72 79 20 63 61 72  ble to query car
15bd0 64 20 73 74 61 74 75 73 2c 20 72 65 74 75 72 6e  d status, return
15be0 69 6e 67 20 74 6f 6b 65 6e 20 61 62 73 65 6e 74  ing token absent
15bf0 2e 20 20 53 43 61 72 64 53 74 61 74 75 73 28 29  .  SCardStatus()
15c00 20 3d 20 25 73 22 2c 20 43 41 43 4b 45 59 5f 44   = %s", CACKEY_D
15c10 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45  EBUG_FUNC_SCARDE
15c20 52 52 5f 54 4f 5f 53 54 52 28 73 74 61 74 75 73  RR_TO_STR(status
15c30 5f 72 65 74 29 29 3b 0a 0a 09 09 09 72 65 74 75  _ret));.....retu
15c40 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  rn(CACKEY_PCSC_E
15c50 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b 0a 09  _TOKENABSENT);..
15c60 09 7d 0a 09 7d 0a 0a 09 69 66 20 28 28 73 74 61  .}..}...if ((sta
15c70 74 65 20 26 20 53 43 41 52 44 5f 41 42 53 45 4e  te & SCARD_ABSEN
15c80 54 29 20 3d 3d 20 53 43 41 52 44 5f 41 42 53 45  T) == SCARD_ABSE
15c90 4e 54 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  NT) {...CACKEY_D
15ca0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 72  EBUG_PRINTF("Car
15cb0 64 20 69 73 20 61 62 73 65 6e 74 2c 20 72 65 74  d is absent, ret
15cc0 75 72 6e 69 6e 67 20 74 6f 6b 65 6e 20 61 62 73  urning token abs
15cd0 65 6e 74 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ent");....return
15ce0 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54  (CACKEY_PCSC_E_T
15cf0 4f 4b 45 4e 41 42 53 45 4e 54 29 3b 0a 09 7d 0a  OKENABSENT);..}.
15d00 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
15d10 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
15d20 20 74 6f 6b 65 6e 20 70 72 65 73 65 6e 74 2e 22   token present."
15d30 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41 43 4b  );...return(CACK
15d40 45 59 5f 50 43 53 43 5f 53 5f 54 4f 4b 45 4e 50  EY_PCSC_S_TOKENP
15d50 52 45 53 45 4e 54 29 3b 0a 7d 0a 0a 2f 2a 0a 20  RESENT);.}../*. 
15d60 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20  * SYNPOSIS. *   
15d70 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55    .... *. * ARGU
15d80 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e  MENTS. *     ...
15d90 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41  . *. * RETURN VA
15da0 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20  LUE. *     .... 
15db0 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20  *. * NOTES. *   
15dc0 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61    .... *. */.sta
15dd0 74 69 63 20 73 73 69 7a 65 5f 74 20 63 61 63 6b  tic ssize_t cack
15de0 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79  ey_pcsc_identity
15df0 5f 74 6f 5f 6c 61 62 65 6c 28 73 74 72 75 63 74  _to_label(struct
15e00 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65   cackey_pcsc_ide
15e10 6e 74 69 74 79 20 2a 69 64 65 6e 74 69 74 79 2c  ntity *identity,
15e20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
15e30 6c 61 62 65 6c 5f 62 75 66 2c 20 75 6e 73 69 67  label_buf, unsig
15e40 6e 65 64 20 6c 6f 6e 67 20 6c 61 62 65 6c 5f 62  ned long label_b
15e50 75 66 5f 6c 65 6e 29 20 7b 0a 09 75 6e 73 69 67  uf_len) {..unsig
15e60 6e 65 64 20 6c 6f 6e 67 20 63 65 72 74 69 66 69  ned long certifi
15e70 63 61 74 65 5f 6c 65 6e 3b 0a 09 76 6f 69 64 20  cate_len;..void 
15e80 2a 6c 61 62 65 6c 5f 61 73 6e 31 3b 0a 09 76 6f  *label_asn1;..vo
15e90 69 64 20 2a 63 65 72 74 69 66 69 63 61 74 65 3b  id *certificate;
15ea0 0a 09 69 6e 74 20 78 35 30 39 5f 72 65 61 64 5f  ..int x509_read_
15eb0 72 65 74 3b 0a 0a 09 63 65 72 74 69 66 69 63 61  ret;...certifica
15ec0 74 65 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e 63  te = identity->c
15ed0 65 72 74 69 66 69 63 61 74 65 3b 0a 09 63 65 72  ertificate;..cer
15ee0 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3d 20 69  tificate_len = i
15ef0 64 65 6e 74 69 74 79 2d 3e 63 65 72 74 69 66 69  dentity->certifi
15f00 63 61 74 65 5f 6c 65 6e 3b 0a 0a 09 69 66 20 28  cate_len;...if (
15f10 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20  certificate_len 
15f20 3c 20 30 29 20 7b 0a 09 09 72 65 74 75 72 6e 28  < 0) {...return(
15f30 2d 31 29 3b 0a 09 7d 0a 0a 09 78 35 30 39 5f 72  -1);..}...x509_r
15f40 65 61 64 5f 72 65 74 20 3d 20 78 35 30 39 5f 74  ead_ret = x509_t
15f50 6f 5f 73 75 62 6a 65 63 74 28 63 65 72 74 69 66  o_subject(certif
15f60 69 63 61 74 65 2c 20 63 65 72 74 69 66 69 63 61  icate, certifica
15f70 74 65 5f 6c 65 6e 2c 20 28 76 6f 69 64 20 2a 2a  te_len, (void **
15f80 29 20 26 6c 61 62 65 6c 5f 61 73 6e 31 29 3b 0a  ) &label_asn1);.
15f90 09 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72  .if (x509_read_r
15fa0 65 74 20 3c 20 30 29 20 7b 0a 09 09 72 65 74 75  et < 0) {...retu
15fb0 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 78 35 30  rn(-1);..}...x50
15fc0 39 5f 72 65 61 64 5f 72 65 74 20 3d 20 78 35 30  9_read_ret = x50
15fd0 39 5f 64 6e 5f 74 6f 5f 73 74 72 69 6e 67 28 6c  9_dn_to_string(l
15fe0 61 62 65 6c 5f 61 73 6e 31 2c 20 78 35 30 39 5f  abel_asn1, x509_
15ff0 72 65 61 64 5f 72 65 74 2c 20 28 63 68 61 72 20  read_ret, (char 
16000 2a 29 20 6c 61 62 65 6c 5f 62 75 66 2c 20 6c 61  *) label_buf, la
16010 62 65 6c 5f 62 75 66 5f 6c 65 6e 2c 20 22 43 4e  bel_buf_len, "CN
16020 22 29 3b 0a 09 69 66 20 28 78 35 30 39 5f 72 65  ");..if (x509_re
16030 61 64 5f 72 65 74 20 3c 3d 20 30 29 20 7b 0a 09  ad_ret <= 0) {..
16040 09 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3d  .x509_read_ret =
16050 20 78 35 30 39 5f 64 6e 5f 74 6f 5f 73 74 72 69   x509_dn_to_stri
16060 6e 67 28 6c 61 62 65 6c 5f 61 73 6e 31 2c 20 78  ng(label_asn1, x
16070 35 30 39 5f 72 65 61 64 5f 72 65 74 2c 20 28 63  509_read_ret, (c
16080 68 61 72 20 2a 29 20 6c 61 62 65 6c 5f 62 75 66  har *) label_buf
16090 2c 20 6c 61 62 65 6c 5f 62 75 66 5f 6c 65 6e 2c  , label_buf_len,
160a0 20 4e 55 4c 4c 29 3b 0a 0a 09 09 69 66 20 28 78   NULL);....if (x
160b0 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3c 3d 20  509_read_ret <= 
160c0 30 29 20 7b 0a 09 09 09 72 65 74 75 72 6e 28 2d  0) {....return(-
160d0 31 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 23 69 66 64  1);...}..}..#ifd
160e0 65 66 20 43 41 43 4b 45 59 5f 50 41 52 41 4e 4f  ef CACKEY_PARANO
160f0 49 44 0a 23 20 20 69 66 64 65 66 20 5f 50 4f 53  ID.#  ifdef _POS
16100 49 58 5f 53 53 49 5a 45 5f 4d 41 58 0a 09 69 66  IX_SSIZE_MAX..if
16110 20 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20   (x509_read_ret 
16120 3e 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d  > _POSIX_SSIZE_M
16130 41 58 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  AX) {...CACKEY_D
16140 45 42 55 47 5f 50 52 49 4e 54 46 28 22 78 35 30  EBUG_PRINTF("x50
16150 39 5f 72 65 61 64 5f 72 65 74 20 65 78 63 65 65  9_read_ret excee
16160 64 73 20 6d 61 78 69 6d 75 6d 20 76 61 6c 75 65  ds maximum value
16170 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66  , returning in f
16180 61 69 6c 75 72 65 2e 20 28 6d 61 78 20 3d 20 25  ailure. (max = %
16190 6c 69 2c 20 78 35 30 39 5f 72 65 61 64 5f 72 65  li, x509_read_re
161a0 74 20 3d 20 25 6c 75 29 22 2c 20 28 6c 6f 6e 67  t = %lu)", (long
161b0 29 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d  ) _POSIX_SSIZE_M
161c0 41 58 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  AX, (unsigned lo
161d0 6e 67 29 20 78 35 30 39 5f 72 65 61 64 5f 72 65  ng) x509_read_re
161e0 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31  t);....return(-1
161f0 29 3b 0a 09 7d 0a 23 20 20 65 6e 64 69 66 0a 23  );..}.#  endif.#
16200 65 6e 64 69 66 0a 0a 09 72 65 74 75 72 6e 28 78  endif...return(x
16210 35 30 39 5f 72 65 61 64 5f 72 65 74 29 3b 0a 7d  509_read_ret);.}
16220 0a 0a 2f 2a 20 52 65 74 75 72 6e 73 20 30 20 6f  ../* Returns 0 o
16230 6e 20 73 75 63 63 65 73 73 20 2a 2f 0a 73 74 61  n success */.sta
16240 74 69 63 20 69 6e 74 20 63 61 63 6b 65 79 5f 6d  tic int cackey_m
16250 75 74 65 78 5f 63 72 65 61 74 65 28 76 6f 69 64  utex_create(void
16260 20 2a 2a 6d 75 74 65 78 29 20 7b 0a 09 70 74 68   **mutex) {..pth
16270 72 65 61 64 5f 6d 75 74 65 78 5f 74 20 2a 70 74  read_mutex_t *pt
16280 68 72 65 61 64 5f 6d 75 74 65 78 3b 0a 09 69 6e  hread_mutex;..in
16290 74 20 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c  t pthread_retval
162a0 3b 0a 09 43 4b 5f 52 56 20 63 75 73 74 6f 6d 5f  ;..CK_RV custom_
162b0 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59  retval;...CACKEY
162c0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
162d0 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
162e0 28 63 61 63 6b 65 79 5f 61 72 67 73 2e 66 6c 61  (cackey_args.fla
162f0 67 73 20 26 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b  gs & CKF_OS_LOCK
16300 49 4e 47 5f 4f 4b 29 20 3d 3d 20 43 4b 46 5f 4f  ING_OK) == CKF_O
16310 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20 7b 0a  S_LOCKING_OK) {.
16320 09 09 70 74 68 72 65 61 64 5f 6d 75 74 65 78 20  ..pthread_mutex 
16330 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28  = malloc(sizeof(
16340 2a 70 74 68 72 65 61 64 5f 6d 75 74 65 78 29 29  *pthread_mutex))
16350 3b 0a 09 09 69 66 20 28 21 70 74 68 72 65 61 64  ;...if (!pthread
16360 5f 6d 75 74 65 78 29 20 7b 0a 09 09 09 43 41 43  _mutex) {....CAC
16370 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
16380 28 22 46 61 69 6c 65 64 20 74 6f 20 61 6c 6c 6f  ("Failed to allo
16390 63 61 74 65 20 6d 65 6d 6f 72 79 2e 22 29 3b 0a  cate memory.");.
163a0 0a 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a  ....return(-1);.
163b0 09 09 7d 0a 0a 09 09 70 74 68 72 65 61 64 5f 72  ..}....pthread_r
163c0 65 74 76 61 6c 20 3d 20 70 74 68 72 65 61 64 5f  etval = pthread_
163d0 6d 75 74 65 78 5f 69 6e 69 74 28 70 74 68 72 65  mutex_init(pthre
163e0 61 64 5f 6d 75 74 65 78 2c 20 4e 55 4c 4c 29 3b  ad_mutex, NULL);
163f0 0a 09 09 69 66 20 28 70 74 68 72 65 61 64 5f 72  ...if (pthread_r
16400 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
16410 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
16420 49 4e 54 46 28 22 70 74 68 72 65 61 64 5f 6d 75  INTF("pthread_mu
16430 74 65 78 5f 69 6e 69 74 28 29 20 72 65 74 75 72  tex_init() retur
16440 6e 65 64 20 65 72 72 6f 72 20 28 25 69 29 2e 22  ned error (%i)."
16450 2c 20 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c  , pthread_retval
16460 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 2d 31  );.....return(-1
16470 29 3b 0a 09 09 7d 0a 0a 09 09 2a 6d 75 74 65 78  );...}....*mutex
16480 20 3d 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78   = pthread_mutex
16490 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69 66  ;..} else {...if
164a0 20 28 63 61 63 6b 65 79 5f 61 72 67 73 2e 43 72   (cackey_args.Cr
164b0 65 61 74 65 4d 75 74 65 78 29 20 7b 0a 09 09 09  eateMutex) {....
164c0 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 20 3d 20  custom_retval = 
164d0 63 61 63 6b 65 79 5f 61 72 67 73 2e 43 72 65 61  cackey_args.Crea
164e0 74 65 4d 75 74 65 78 28 6d 75 74 65 78 29 3b 0a  teMutex(mutex);.
164f0 0a 09 09 09 69 66 20 28 63 75 73 74 6f 6d 5f 72  ....if (custom_r
16500 65 74 76 61 6c 20 21 3d 20 43 4b 52 5f 4f 4b 29  etval != CKR_OK)
16510 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45   {.....CACKEY_DE
16520 42 55 47 5f 50 52 49 4e 54 46 28 22 63 61 63 6b  BUG_PRINTF("cack
16530 65 79 5f 61 72 67 73 2e 43 72 65 61 74 65 4d 75  ey_args.CreateMu
16540 74 65 78 28 29 20 72 65 74 75 72 6e 65 64 20 65  tex() returned e
16550 72 72 6f 72 20 28 25 6c 69 29 2e 22 2c 20 28 6c  rror (%li).", (l
16560 6f 6e 67 29 20 63 75 73 74 6f 6d 5f 72 65 74 76  ong) custom_retv
16570 61 6c 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e  al);......return
16580 28 2d 31 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a 09  (-1);....}...}..
16590 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
165a0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
165b0 6e 67 20 73 75 63 65 73 73 66 75 6c 6c 79 20 28  ng sucessfully (
165c0 30 29 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 30  0)");...return(0
165d0 29 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 73  );.}../* Returns
165e0 20 30 20 6f 6e 20 73 75 63 63 65 73 73 20 2a 2f   0 on success */
165f0 0a 73 74 61 74 69 63 20 69 6e 74 20 63 61 63 6b  .static int cack
16600 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 76 6f  ey_mutex_lock(vo
16610 69 64 20 2a 6d 75 74 65 78 29 20 7b 0a 09 70 74  id *mutex) {..pt
16620 68 72 65 61 64 5f 6d 75 74 65 78 5f 74 20 2a 70  hread_mutex_t *p
16630 74 68 72 65 61 64 5f 6d 75 74 65 78 3b 0a 09 69  thread_mutex;..i
16640 6e 74 20 70 74 68 72 65 61 64 5f 72 65 74 76 61  nt pthread_retva
16650 6c 3b 0a 09 43 4b 5f 52 56 20 63 75 73 74 6f 6d  l;..CK_RV custom
16660 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45  _retval;...CACKE
16670 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
16680 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
16690 28 28 63 61 63 6b 65 79 5f 61 72 67 73 2e 66 6c  ((cackey_args.fl
166a0 61 67 73 20 26 20 43 4b 46 5f 4f 53 5f 4c 4f 43  ags & CKF_OS_LOC
166b0 4b 49 4e 47 5f 4f 4b 29 20 3d 3d 20 43 4b 46 5f  KING_OK) == CKF_
166c0 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20 7b  OS_LOCKING_OK) {
166d0 0a 09 09 70 74 68 72 65 61 64 5f 6d 75 74 65 78  ...pthread_mutex
166e0 20 3d 20 6d 75 74 65 78 3b 0a 0a 09 09 70 74 68   = mutex;....pth
166f0 72 65 61 64 5f 72 65 74 76 61 6c 20 3d 20 70 74  read_retval = pt
16700 68 72 65 61 64 5f 6d 75 74 65 78 5f 6c 6f 63 6b  hread_mutex_lock
16710 28 70 74 68 72 65 61 64 5f 6d 75 74 65 78 29 3b  (pthread_mutex);
16720 0a 09 09 69 66 20 28 70 74 68 72 65 61 64 5f 72  ...if (pthread_r
16730 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
16740 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
16750 49 4e 54 46 28 22 70 74 68 72 65 61 64 5f 6d 75  INTF("pthread_mu
16760 74 65 78 5f 6c 6f 63 6b 28 29 20 72 65 74 75 72  tex_lock() retur
16770 6e 65 64 20 65 72 72 6f 72 20 28 25 69 29 2e 22  ned error (%i)."
16780 2c 20 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c  , pthread_retval
16790 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 2d 31  );.....return(-1
167a0 29 3b 0a 09 09 7d 0a 09 7d 20 65 6c 73 65 20 7b  );...}..} else {
167b0 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 61 72  ...if (cackey_ar
167c0 67 73 2e 4c 6f 63 6b 4d 75 74 65 78 29 20 7b 0a  gs.LockMutex) {.
167d0 09 09 09 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c  ...custom_retval
167e0 20 3d 20 63 61 63 6b 65 79 5f 61 72 67 73 2e 4c   = cackey_args.L
167f0 6f 63 6b 4d 75 74 65 78 28 6d 75 74 65 78 29 3b  ockMutex(mutex);
16800 0a 0a 09 09 09 69 66 20 28 63 75 73 74 6f 6d 5f  .....if (custom_
16810 72 65 74 76 61 6c 20 21 3d 20 43 4b 52 5f 4f 4b  retval != CKR_OK
16820 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  ) {.....CACKEY_D
16830 45 42 55 47 5f 50 52 49 4e 54 46 28 22 63 61 63  EBUG_PRINTF("cac
16840 6b 65 79 5f 61 72 67 73 2e 4c 6f 63 6b 4d 75 74  key_args.LockMut
16850 65 78 28 29 20 72 65 74 75 72 6e 65 64 20 65 72  ex() returned er
16860 72 6f 72 20 28 25 6c 69 29 2e 22 2c 20 28 6c 6f  ror (%li).", (lo
16870 6e 67 29 20 63 75 73 74 6f 6d 5f 72 65 74 76 61  ng) custom_retva
16880 6c 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28  l);......return(
16890 2d 31 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a 09 7d  -1);....}...}..}
168a0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
168b0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
168c0 67 20 73 75 63 65 73 73 66 75 6c 6c 79 20 28 30  g sucessfully (0
168d0 29 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 30 29  )");...return(0)
168e0 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 73 20  ;.}../* Returns 
168f0 30 20 6f 6e 20 73 75 63 63 65 73 73 20 2a 2f 0a  0 on success */.
16900 73 74 61 74 69 63 20 69 6e 74 20 63 61 63 6b 65  static int cacke
16910 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 76  y_mutex_unlock(v
16920 6f 69 64 20 2a 6d 75 74 65 78 29 20 7b 0a 09 70  oid *mutex) {..p
16930 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 74 20 2a  thread_mutex_t *
16940 70 74 68 72 65 61 64 5f 6d 75 74 65 78 3b 0a 09  pthread_mutex;..
16950 69 6e 74 20 70 74 68 72 65 61 64 5f 72 65 74 76  int pthread_retv
16960 61 6c 3b 0a 09 43 4b 5f 52 56 20 63 75 73 74 6f  al;..CK_RV custo
16970 6d 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b  m_retval;...CACK
16980 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
16990 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
169a0 20 28 28 63 61 63 6b 65 79 5f 61 72 67 73 2e 66   ((cackey_args.f
169b0 6c 61 67 73 20 26 20 43 4b 46 5f 4f 53 5f 4c 4f  lags & CKF_OS_LO
169c0 43 4b 49 4e 47 5f 4f 4b 29 20 3d 3d 20 43 4b 46  CKING_OK) == CKF
169d0 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20  _OS_LOCKING_OK) 
169e0 7b 0a 09 09 70 74 68 72 65 61 64 5f 6d 75 74 65  {...pthread_mute
169f0 78 20 3d 20 6d 75 74 65 78 3b 0a 0a 09 09 70 74  x = mutex;....pt
16a00 68 72 65 61 64 5f 72 65 74 76 61 6c 20 3d 20 70  hread_retval = p
16a10 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 75 6e 6c  thread_mutex_unl
16a20 6f 63 6b 28 70 74 68 72 65 61 64 5f 6d 75 74 65  ock(pthread_mute
16a30 78 29 3b 0a 09 09 69 66 20 28 70 74 68 72 65 61  x);...if (pthrea
16a40 64 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  d_retval != 0) {
16a50 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
16a60 5f 50 52 49 4e 54 46 28 22 70 74 68 72 65 61 64  _PRINTF("pthread
16a70 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 29 20  _mutex_unlock() 
16a80 72 65 74 75 72 6e 65 64 20 65 72 72 6f 72 20 28  returned error (
16a90 25 69 29 2e 22 2c 20 70 74 68 72 65 61 64 5f 72  %i).", pthread_r
16aa0 65 74 76 61 6c 29 3b 0a 0a 09 09 09 72 65 74 75  etval);.....retu
16ab0 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 09 7d 20 65  rn(-1);...}..} e
16ac0 6c 73 65 20 7b 0a 09 09 69 66 20 28 63 61 63 6b  lse {...if (cack
16ad0 65 79 5f 61 72 67 73 2e 55 6e 6c 6f 63 6b 4d 75  ey_args.UnlockMu
16ae0 74 65 78 29 20 7b 0a 09 09 09 63 75 73 74 6f 6d  tex) {....custom
16af0 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
16b00 5f 61 72 67 73 2e 55 6e 6c 6f 63 6b 4d 75 74 65  _args.UnlockMute
16b10 78 28 6d 75 74 65 78 29 3b 0a 0a 09 09 09 69 66  x(mutex);.....if
16b20 20 28 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 20   (custom_retval 
16b30 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 09  != CKR_OK) {....
16b40 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
16b50 49 4e 54 46 28 22 63 61 63 6b 65 79 5f 61 72 67  INTF("cackey_arg
16b60 73 2e 55 6e 6c 6f 63 6b 4d 75 74 65 78 28 29 20  s.UnlockMutex() 
16b70 72 65 74 75 72 6e 65 64 20 65 72 72 6f 72 20 28  returned error (
16b80 25 6c 69 29 2e 22 2c 20 28 6c 6f 6e 67 29 20 63  %li).", (long) c
16b90 75 73 74 6f 6d 5f 72 65 74 76 61 6c 29 3b 0a 0a  ustom_retval);..
16ba0 09 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a  ....return(-1);.
16bb0 09 09 09 7d 0a 09 09 7d 0a 09 7d 0a 0a 09 43 41  ...}...}..}...CA
16bc0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
16bd0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 73 75 63  F("Returning suc
16be0 65 73 73 66 75 6c 6c 79 20 28 30 29 22 29 3b 0a  essfully (0)");.
16bf0 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a  ..return(0);.}..
16c00 73 74 61 74 69 63 20 43 4b 5f 41 54 54 52 49 42  static CK_ATTRIB
16c10 55 54 45 5f 50 54 52 20 63 61 63 6b 65 79 5f 67  UTE_PTR cackey_g
16c20 65 74 5f 61 74 74 72 69 62 75 74 65 73 28 43 4b  et_attributes(CK
16c30 5f 4f 42 4a 45 43 54 5f 43 4c 41 53 53 20 6f 62  _OBJECT_CLASS ob
16c40 6a 65 63 74 63 6c 61 73 73 2c 20 73 74 72 75 63  jectclass, struc
16c50 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64  t cackey_pcsc_id
16c60 65 6e 74 69 74 79 20 2a 69 64 65 6e 74 69 74 79  entity *identity
16c70 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  , unsigned long 
16c80 69 64 65 6e 74 69 74 79 5f 6e 75 6d 2c 20 43 4b  identity_num, CK
16c90 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 43 6f  _ULONG_PTR pulCo
16ca0 75 6e 74 29 20 7b 0a 09 73 74 61 74 69 63 20 43  unt) {..static C
16cb0 4b 5f 42 42 4f 4f 4c 20 63 6b 5f 74 72 75 65 20  K_BBOOL ck_true 
16cc0 3d 20 31 3b 0a 09 73 74 61 74 69 63 20 43 4b 5f  = 1;..static CK_
16cd0 42 42 4f 4f 4c 20 63 6b 5f 66 61 6c 73 65 20 3d  BBOOL ck_false =
16ce0 20 30 3b 0a 09 73 74 61 74 69 63 20 43 4b 5f 54   0;..static CK_T
16cf0 52 55 53 54 20 63 6b 5f 74 72 75 73 74 65 64 20  RUST ck_trusted 
16d00 3d 20 43 4b 5f 54 52 55 53 54 45 44 5f 44 45 4c  = CK_TRUSTED_DEL
16d10 45 47 41 54 4f 52 3b 0a 09 43 4b 5f 55 4c 4f 4e  EGATOR;..CK_ULON
16d20 47 20 6e 75 6d 61 74 74 72 73 20 3d 20 30 2c 20  G numattrs = 0, 
16d30 72 65 74 76 61 6c 5f 63 6f 75 6e 74 3b 0a 09 43  retval_count;..C
16d40 4b 5f 41 54 54 52 49 42 55 54 45 5f 54 59 50 45  K_ATTRIBUTE_TYPE
16d50 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 3b   curr_attr_type;
16d60 0a 09 43 4b 5f 41 54 54 52 49 42 55 54 45 20 63  ..CK_ATTRIBUTE c
16d70 75 72 72 5f 61 74 74 72 2c 20 2a 72 65 74 76 61  urr_attr, *retva
16d80 6c 3b 0a 09 43 4b 5f 56 4f 49 44 5f 50 54 52 20  l;..CK_VOID_PTR 
16d90 70 56 61 6c 75 65 3b 0a 09 43 4b 5f 55 4c 4f 4e  pValue;..CK_ULON
16da0 47 20 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 09 43  G ulValueLen;..C
16db0 4b 5f 4f 42 4a 45 43 54 5f 43 4c 41 53 53 20 63  K_OBJECT_CLASS c
16dc0 6b 5f 6f 62 6a 65 63 74 5f 63 6c 61 73 73 3b 0a  k_object_class;.
16dd0 09 43 4b 5f 43 45 52 54 49 46 49 43 41 54 45 5f  .CK_CERTIFICATE_
16de0 54 59 50 45 20 63 6b 5f 63 65 72 74 69 66 69 63  TYPE ck_certific
16df0 61 74 65 5f 74 79 70 65 3b 0a 09 43 4b 5f 4b 45  ate_type;..CK_KE
16e00 59 5f 54 59 50 45 20 63 6b 5f 6b 65 79 5f 74 79  Y_TYPE ck_key_ty
16e10 70 65 3b 0a 09 43 4b 5f 55 54 46 38 43 48 41 52  pe;..CK_UTF8CHAR
16e20 20 75 63 54 6d 70 42 75 66 5b 31 30 32 34 5d 3b   ucTmpBuf[1024];
16e30 0a 09 53 48 41 31 43 6f 6e 74 65 78 74 20 73 68  ..SHA1Context sh
16e40 61 31 5f 63 74 78 3b 0a 09 4d 44 35 5f 43 54 58  a1_ctx;..MD5_CTX
16e50 20 6d 64 35 5f 63 74 78 3b 0a 09 75 69 6e 74 38   md5_ctx;..uint8
16e60 5f 74 20 73 68 61 31 5f 68 61 73 68 5b 53 48 41  _t sha1_hash[SHA
16e70 31 48 61 73 68 53 69 7a 65 5d 3b 0a 09 75 69 6e  1HashSize];..uin
16e80 74 38 5f 74 20 6d 64 35 5f 68 61 73 68 5b 4d 44  t8_t md5_hash[MD
16e90 35 48 61 73 68 53 69 7a 65 5d 3b 0a 09 75 6e 73  5HashSize];..uns
16ea0 69 67 6e 65 64 20 63 68 61 72 20 2a 63 65 72 74  igned char *cert
16eb0 69 66 69 63 61 74 65 3b 0a 09 73 73 69 7a 65 5f  ificate;..ssize_
16ec0 74 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65  t certificate_le
16ed0 6e 20 3d 20 2d 31 2c 20 78 35 30 39 5f 72 65 61  n = -1, x509_rea
16ee0 64 5f 72 65 74 3b 0a 09 69 6e 74 20 70 56 61 6c  d_ret;..int pVal
16ef0 75 65 5f 66 72 65 65 3b 0a 0a 09 43 41 43 4b 45  ue_free;...CACKE
16f00 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
16f10 43 61 6c 6c 65 64 20 28 6f 62 6a 65 63 74 43 6c  Called (objectCl
16f20 61 73 73 20 3d 20 25 6c 75 2c 20 69 64 65 6e 74  ass = %lu, ident
16f30 69 74 79 5f 6e 75 6d 20 3d 20 25 6c 75 29 2e 22  ity_num = %lu)."
16f40 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
16f50 29 20 6f 62 6a 65 63 74 63 6c 61 73 73 2c 20 69  ) objectclass, i
16f60 64 65 6e 74 69 74 79 5f 6e 75 6d 29 3b 0a 0a 09  dentity_num);...
16f70 2a 70 75 6c 43 6f 75 6e 74 20 3d 20 30 3b 0a 0a  *pulCount = 0;..
16f80 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73  .if (objectclass
16f90 20 21 3d 20 43 4b 4f 5f 43 45 52 54 49 46 49 43   != CKO_CERTIFIC
16fa0 41 54 45 20 26 26 20 6f 62 6a 65 63 74 63 6c 61  ATE && objectcla
16fb0 73 73 20 21 3d 20 43 4b 4f 5f 50 55 42 4c 49 43  ss != CKO_PUBLIC
16fc0 5f 4b 45 59 20 26 26 20 6f 62 6a 65 63 74 63 6c  _KEY && objectcl
16fd0 61 73 73 20 21 3d 20 43 4b 4f 5f 50 52 49 56 41  ass != CKO_PRIVA
16fe0 54 45 5f 4b 45 59 20 26 26 20 6f 62 6a 65 63 74  TE_KEY && object
16ff0 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 4e 45 54  class != CKO_NET
17000 53 43 41 50 45 5f 54 52 55 53 54 29 20 7b 0a 09  SCAPE_TRUST) {..
17010 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
17020 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
17030 30 20 6f 62 6a 65 63 74 73 20 28 4e 55 4c 4c 29  0 objects (NULL)
17040 2c 20 69 6e 76 61 6c 69 64 20 6f 62 6a 65 63 74  , invalid object
17050 20 63 6c 61 73 73 22 29 3b 0a 0a 09 09 72 65 74   class");....ret
17060 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09  urn(NULL);..}...
17070 2f 2a 20 47 65 74 20 43 65 72 74 20 2a 2f 0a 09  /* Get Cert */..
17080 69 66 20 28 69 64 65 6e 74 69 74 79 20 3d 3d 20  if (identity == 
17090 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
170a0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
170b0 65 74 75 72 6e 69 6e 67 20 30 20 6f 62 6a 65 63  eturning 0 objec
170c0 74 73 20 28 4e 55 4c 4c 29 2c 20 69 6e 76 61 6c  ts (NULL), inval
170d0 69 64 20 69 64 65 6e 74 69 79 20 70 72 6f 76 69  id identiy provi
170e0 64 65 64 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ded");....return
170f0 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 63 65 72  (NULL);..}...cer
17100 74 69 66 69 63 61 74 65 20 3d 20 69 64 65 6e 74  tificate = ident
17110 69 74 79 2d 3e 63 65 72 74 69 66 69 63 61 74 65  ity->certificate
17120 3b 0a 09 63 65 72 74 69 66 69 63 61 74 65 5f 6c  ;..certificate_l
17130 65 6e 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e 63  en = identity->c
17140 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 3b 0a  ertificate_len;.
17150 0a 09 69 66 20 28 63 65 72 74 69 66 69 63 61 74  ..if (certificat
17160 65 5f 6c 65 6e 20 3d 3d 20 2d 31 20 7c 7c 20 63  e_len == -1 || c
17170 65 72 74 69 66 69 63 61 74 65 20 3d 3d 20 4e 55  ertificate == NU
17180 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
17190 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
171a0 75 72 6e 69 6e 67 20 30 20 6f 62 6a 65 63 74 73  urning 0 objects
171b0 20 28 4e 55 4c 4c 29 2c 20 74 68 69 73 20 69 64   (NULL), this id
171c0 65 6e 74 69 74 79 20 64 6f 65 73 20 6e 6f 74 20  entity does not 
171d0 68 61 76 65 20 61 6e 20 58 2e 35 30 39 20 63 65  have an X.509 ce
171e0 72 74 69 66 69 63 61 74 65 20 61 73 73 6f 63 69  rtificate associ
171f0 61 74 65 64 20 77 69 74 68 20 69 74 20 61 6e 64  ated with it and
17200 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 22 29   will not work")
17210 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c  ;....return(NULL
17220 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 56 65 72 69 66  );..}.../* Verif
17230 79 20 74 68 61 74 20 63 65 72 74 69 66 69 63 61  y that certifica
17240 74 65 20 69 73 20 41 53 4e 2e 31 20 65 6e 63 6f  te is ASN.1 enco
17250 64 65 64 20 58 2e 35 30 39 20 63 65 72 74 69 66  ded X.509 certif
17260 69 63 61 74 65 20 2a 2f 0a 09 69 66 20 28 78 35  icate */..if (x5
17270 30 39 5f 74 6f 5f 73 65 72 69 61 6c 28 63 65 72  09_to_serial(cer
17280 74 69 66 69 63 61 74 65 2c 20 63 65 72 74 69 66  tificate, certif
17290 69 63 61 74 65 5f 6c 65 6e 2c 20 4e 55 4c 4c 29  icate_len, NULL)
172a0 20 3c 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59   < 0) {...CACKEY
172b0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
172c0 65 74 75 72 6e 69 6e 67 20 30 20 6f 62 6a 65 63  eturning 0 objec
172d0 74 73 20 28 4e 55 4c 4c 29 2c 20 74 68 65 20 58  ts (NULL), the X
172e0 2e 35 30 39 20 63 65 72 74 69 66 69 63 61 74 65  .509 certificate
172f0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
17300 20 74 68 69 73 20 69 64 65 6e 74 69 74 79 20 69   this identity i
17310 73 20 6e 6f 74 20 76 61 6c 69 64 22 29 3b 0a 0a  s not valid");..
17320 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a  ..return(NULL);.
17330 09 7d 0a 0a 09 72 65 74 76 61 6c 5f 63 6f 75 6e  .}...retval_coun
17340 74 20 3d 20 36 34 3b 0a 09 72 65 74 76 61 6c 20  t = 64;..retval 
17350 3d 20 6d 61 6c 6c 6f 63 28 72 65 74 76 61 6c 5f  = malloc(retval_
17360 63 6f 75 6e 74 20 2a 20 73 69 7a 65 6f 66 28 2a  count * sizeof(*
17370 72 65 74 76 61 6c 29 29 3b 0a 0a 09 66 6f 72 20  retval));...for 
17380 28 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 20  (curr_attr_type 
17390 3d 20 30 3b 20 63 75 72 72 5f 61 74 74 72 5f 74  = 0; curr_attr_t
173a0 79 70 65 20 3c 20 30 78 63 65 35 33 36 33 62 66  ype < 0xce5363bf
173b0 3b 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65  ; curr_attr_type
173c0 2b 2b 29 20 7b 0a 09 09 69 66 20 28 63 75 72 72  ++) {...if (curr
173d0 5f 61 74 74 72 5f 74 79 70 65 20 3d 3d 20 30 78  _attr_type == 0x
173e0 38 30 30 29 20 7b 0a 09 09 09 63 75 72 72 5f 61  800) {....curr_a
173f0 74 74 72 5f 74 79 70 65 20 3d 20 30 78 63 65 35  ttr_type = 0xce5
17400 33 36 33 30 30 3b 0a 09 09 7d 0a 0a 09 09 70 56  36300;...}....pV
17410 61 6c 75 65 5f 66 72 65 65 20 3d 20 30 3b 0a 09  alue_free = 0;..
17420 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a  .pValue = NULL;.
17430 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 28  ..ulValueLen = (
17440 43 4b 5f 4c 4f 4e 47 29 20 2d 31 3b 0a 0a 09 09  CK_LONG) -1;....
17450 73 77 69 74 63 68 20 28 63 75 72 72 5f 61 74 74  switch (curr_att
17460 72 5f 74 79 70 65 29 20 7b 0a 09 09 09 63 61 73  r_type) {....cas
17470 65 20 43 4b 41 5f 43 4c 41 53 53 3a 0a 09 09 09  e CKA_CLASS:....
17480 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
17490 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67  INTF("Requesting
174a0 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 43   attribute CKA_C
174b0 4c 41 53 53 20 28 30 78 25 30 38 6c 78 29 20 2e  LASS (0x%08lx) .
174c0 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ..", (unsigned l
174d0 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74  ong) curr_attr_t
174e0 79 70 65 29 3b 0a 0a 09 09 09 09 63 6b 5f 6f 62  ype);......ck_ob
174f0 6a 65 63 74 5f 63 6c 61 73 73 20 3d 20 6f 62 6a  ject_class = obj
17500 65 63 74 63 6c 61 73 73 3b 0a 0a 09 09 09 09 70  ectclass;......p
17510 56 61 6c 75 65 20 3d 20 26 63 6b 5f 6f 62 6a 65  Value = &ck_obje
17520 63 74 5f 63 6c 61 73 73 3b 0a 09 09 09 09 75 6c  ct_class;.....ul
17530 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f  ValueLen = sizeo
17540 66 28 63 6b 5f 6f 62 6a 65 63 74 5f 63 6c 61 73  f(ck_object_clas
17550 73 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f  s);......CACKEY_
17560 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
17570 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75  .. returning %lu
17580 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73   (%p/%lu)", (uns
17590 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43  igned long) *((C
175a0 4b 5f 4f 42 4a 45 43 54 5f 43 4c 41 53 53 20 2a  K_OBJECT_CLASS *
175b0 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75  ) pValue), pValu
175c0 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  e, (unsigned lon
175d0 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a  g) ulValueLen);.
175e0 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
175f0 61 73 65 20 43 4b 41 5f 54 4f 4b 45 4e 3a 0a 09  ase CKA_TOKEN:..
17600 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
17610 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69  PRINTF("Requesti
17620 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41  ng attribute CKA
17630 5f 54 4f 4b 45 4e 20 28 30 78 25 30 38 6c 78 29  _TOKEN (0x%08lx)
17640 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64   ...", (unsigned
17650 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72   long) curr_attr
17660 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 70 56 61  _type);......pVa
17670 6c 75 65 20 3d 20 26 63 6b 5f 74 72 75 65 3b 0a  lue = &ck_true;.
17680 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ....ulValueLen =
17690 20 73 69 7a 65 6f 66 28 63 6b 5f 74 72 75 65 29   sizeof(ck_true)
176a0 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  ;......CACKEY_DE
176b0 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
176c0 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28   returning %lu (
176d0 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67  %p/%lu)", (unsig
176e0 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f  ned long) *((CK_
176f0 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29  BBOOL *) pValue)
17700 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67  , pValue, (unsig
17710 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75  ned long) ulValu
17720 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61  eLen);......brea
17730 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 50  k;....case CKA_P
17740 52 49 56 41 54 45 3a 0a 09 09 09 09 43 41 43 4b  RIVATE:.....CACK
17750 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
17760 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72  "Requesting attr
17770 69 62 75 74 65 20 43 4b 41 5f 50 52 49 56 41 54  ibute CKA_PRIVAT
17780 45 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22  E (0x%08lx) ..."
17790 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
177a0 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65  ) curr_attr_type
177b0 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65  );......if (obje
177c0 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 4e  ctclass != CKO_N
177d0 45 54 53 43 41 50 45 5f 54 52 55 53 54 29 20 7b  ETSCAPE_TRUST) {
177e0 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
177f0 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
17800 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20  but not getting 
17810 69 74 20 62 65 63 61 75 73 65 20 77 65 20 61 72  it because we ar
17820 65 20 6e 6f 74 20 61 20 4e 65 74 73 63 61 70 65  e not a Netscape
17830 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29 3b   trust object");
17840 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .......break;...
17850 09 09 7d 0a 0a 09 09 09 09 70 56 61 6c 75 65 20  ..}......pValue 
17860 3d 20 26 63 6b 5f 66 61 6c 73 65 3b 0a 09 09 09  = &ck_false;....
17870 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69  .ulValueLen = si
17880 7a 65 6f 66 28 63 6b 5f 66 61 6c 73 65 29 3b 0a  zeof(ck_false);.
17890 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
178a0 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72  G_PRINTF(" ... r
178b0 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70  eturning %lu (%p
178c0 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65  /%lu)", (unsigne
178d0 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42  d long) *((CK_BB
178e0 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c 20  OOL *) pValue), 
178f0 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65  pValue, (unsigne
17900 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c  d long) ulValueL
17910 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b  en);......break;
17920 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 54 52 55  ....case CKA_TRU
17930 53 54 45 44 3a 0a 09 09 09 09 43 41 43 4b 45 59  STED:.....CACKEY
17940 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
17950 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62  equesting attrib
17960 75 74 65 20 43 4b 41 5f 54 52 55 53 54 45 44 20  ute CKA_TRUSTED 
17970 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20  (0x%08lx) ...", 
17980 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
17990 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b  curr_attr_type);
179a0 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74  ......if (object
179b0 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54  class == CKO_NET
179c0 53 43 41 50 45 5f 54 52 55 53 54 29 20 7b 0a 09  SCAPE_TRUST) {..
179d0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
179e0 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75  _PRINTF(" ... bu
179f0 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74  t not getting it
17a00 20 62 65 63 61 75 73 65 20 77 65 20 61 72 65 20   because we are 
17a10 61 20 4e 65 74 73 63 61 70 65 20 74 72 75 73 74  a Netscape trust
17a20 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09   object");......
17a30 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09  .break;.....}...
17a40 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f  ...pValue = &ck_
17a50 74 72 75 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75  true;.....ulValu
17a60 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b  eLen = sizeof(ck
17a70 5f 74 72 75 65 29 3b 0a 0a 09 09 09 09 43 41 43  _true);......CAC
17a80 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
17a90 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67  (" ... returning
17aa0 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20   %lu (%p/%lu)", 
17ab0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
17ac0 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70  *((CK_BBOOL *) p
17ad0 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20  Value), pValue, 
17ae0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
17af0 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09  ulValueLen);....
17b00 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
17b10 20 43 4b 41 5f 4d 4f 44 49 46 49 41 42 4c 45 3a   CKA_MODIFIABLE:
17b20 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
17b30 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73  G_PRINTF("Reques
17b40 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43  ting attribute C
17b50 4b 41 5f 4d 4f 44 49 46 49 41 42 4c 45 20 28 30  KA_MODIFIABLE (0
17b60 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75  x%08lx) ...", (u
17b70 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75  nsigned long) cu
17b80 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a  rr_attr_type);..
17b90 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b  ....pValue = &ck
17ba0 5f 66 61 6c 73 65 3b 0a 09 09 09 09 75 6c 56 61  _false;.....ulVa
17bb0 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28  lueLen = sizeof(
17bc0 63 6b 5f 66 61 6c 73 65 29 3b 0a 0a 09 09 09 09  ck_false);......
17bd0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
17be0 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e  NTF(" ... return
17bf0 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29  ing %lu (%p/%lu)
17c00 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
17c10 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a  g) *((CK_BBOOL *
17c20 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75  ) pValue), pValu
17c30 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  e, (unsigned lon
17c40 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a  g) ulValueLen);.
17c50 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
17c60 61 73 65 20 43 4b 41 5f 4c 41 42 45 4c 3a 0a 09  ase CKA_LABEL:..
17c70 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
17c80 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69  PRINTF("Requesti
17c90 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41  ng attribute CKA
17ca0 5f 4c 41 42 45 4c 20 28 30 78 25 30 38 6c 78 29  _LABEL (0x%08lx)
17cb0 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64   ...", (unsigned
17cc0 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72   long) curr_attr
17cd0 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20  _type);......if 
17ce0 28 69 64 65 6e 74 69 74 79 2d 3e 69 64 5f 74 79  (identity->id_ty
17cf0 70 65 20 3d 3d 20 43 41 43 4b 45 59 5f 49 44 5f  pe == CACKEY_ID_
17d00 54 59 50 45 5f 50 49 56 29 20 7b 0a 09 09 09 09  TYPE_PIV) {.....
17d10 09 70 56 61 6c 75 65 20 3d 20 69 64 65 6e 74 69  .pValue = identi
17d20 74 79 2d 3e 63 61 72 64 2e 70 69 76 2e 6c 61 62  ty->card.piv.lab
17d30 65 6c 3b 0a 09 09 09 09 09 75 6c 56 61 6c 75 65  el;......ulValue
17d40 4c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 70 56 61  Len = strlen(pVa
17d50 6c 75 65 29 3b 0a 09 09 09 09 7d 20 65 6c 73 65  lue);.....} else
17d60 20 7b 0a 09 09 09 09 09 75 6c 56 61 6c 75 65 4c   {......ulValueL
17d70 65 6e 20 3d 20 73 6e 70 72 69 6e 74 66 28 28 63  en = snprintf((c
17d80 68 61 72 20 2a 29 20 75 63 54 6d 70 42 75 66 2c  har *) ucTmpBuf,
17d90 20 73 69 7a 65 6f 66 28 75 63 54 6d 70 42 75 66   sizeof(ucTmpBuf
17da0 29 2c 20 22 49 64 65 6e 74 69 74 79 20 23 25 6c  ), "Identity #%l
17db0 75 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  u", (unsigned lo
17dc0 6e 67 29 20 69 64 65 6e 74 69 74 79 5f 6e 75 6d  ng) identity_num
17dd0 29 3b 0a 09 09 09 09 09 70 56 61 6c 75 65 20 3d  );......pValue =
17de0 20 75 63 54 6d 70 42 75 66 3b 0a 0a 09 09 09 09   ucTmpBuf;......
17df0 09 69 66 20 28 75 6c 56 61 6c 75 65 4c 65 6e 20  .if (ulValueLen 
17e00 3e 3d 20 73 69 7a 65 6f 66 28 75 63 54 6d 70 42  >= sizeof(ucTmpB
17e10 75 66 29 29 20 7b 0a 09 09 09 09 09 09 75 6c 56  uf)) {.......ulV
17e20 61 6c 75 65 4c 65 6e 20 3d 20 30 3b 0a 09 09 09  alueLen = 0;....
17e30 09 09 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c  ...pValue = NULL
17e40 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 0a  ;......}.....}..
17e50 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
17e60 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65  _PRINTF(" ... re
17e70 74 75 72 6e 69 6e 67 20 28 25 70 2f 25 6c 75 29  turning (%p/%lu)
17e80 22 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69  ", pValue, (unsi
17e90 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c  gned long) ulVal
17ea0 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65  ueLen);......bre
17eb0 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f  ak;....case CKA_
17ec0 56 41 4c 55 45 3a 0a 09 09 09 09 43 41 43 4b 45  VALUE:.....CACKE
17ed0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
17ee0 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69  Requesting attri
17ef0 62 75 74 65 20 43 4b 41 5f 56 41 4c 55 45 20 28  bute CKA_VALUE (
17f00 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28  0x%08lx) ...", (
17f10 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63  unsigned long) c
17f20 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a  urr_attr_type);.
17f30 0a 09 09 09 09 73 77 69 74 63 68 20 28 6f 62 6a  .....switch (obj
17f40 65 63 74 63 6c 61 73 73 29 20 7b 0a 09 09 09 09  ectclass) {.....
17f50 09 63 61 73 65 20 43 4b 4f 5f 50 52 49 56 41 54  .case CKO_PRIVAT
17f60 45 5f 4b 45 59 3a 0a 09 09 09 09 09 09 43 41 43  E_KEY:.......CAC
17f70 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
17f80 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67  (" ... but not g
17f90 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73  etting it becaus
17fa0 65 20 77 65 20 61 72 65 20 61 20 70 72 69 76 61  e we are a priva
17fb0 74 65 20 6b 65 79 2e 22 29 3b 0a 0a 09 09 09 09  te key.");......
17fc0 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 63 61  ..break;......ca
17fd0 73 65 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f  se CKO_NETSCAPE_
17fe0 54 52 55 53 54 3a 0a 09 09 09 09 09 09 43 41 43  TRUST:.......CAC
17ff0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
18000 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67  (" ... but not g
18010 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73  etting it becaus
18020 65 20 77 65 20 61 72 65 20 61 20 4e 65 74 73 63  e we are a Netsc
18030 61 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74  ape trust object
18040 22 29 3b 0a 0a 09 09 09 09 09 09 62 72 65 61 6b  ");........break
18050 3b 0a 09 09 09 09 09 63 61 73 65 20 43 4b 4f 5f  ;......case CKO_
18060 50 55 42 4c 49 43 5f 4b 45 59 3a 0a 09 09 09 09  PUBLIC_KEY:.....
18070 09 09 69 66 20 28 63 65 72 74 69 66 69 63 61 74  ..if (certificat
18080 65 5f 6c 65 6e 20 3e 3d 20 30 29 20 7b 0a 09 09  e_len >= 0) {...
18090 09 09 09 09 09 78 35 30 39 5f 72 65 61 64 5f 72  .....x509_read_r
180a0 65 74 20 3d 20 78 35 30 39 5f 74 6f 5f 70 75 62  et = x509_to_pub
180b0 6b 65 79 28 63 65 72 74 69 66 69 63 61 74 65 2c  key(certificate,
180c0 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e   certificate_len
180d0 2c 20 26 70 56 61 6c 75 65 29 3b 0a 09 09 09 09  , &pValue);.....
180e0 09 09 09 69 66 20 28 78 35 30 39 5f 72 65 61 64  ...if (x509_read
180f0 5f 72 65 74 20 3c 20 30 29 20 7b 20 0a 09 09 09  _ret < 0) { ....
18100 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 4e 55  .....pValue = NU
18110 4c 4c 3b 0a 09 09 09 09 09 09 09 7d 20 65 6c 73  LL;........} els
18120 65 20 7b 0a 09 09 09 09 09 09 09 09 75 6c 56 61  e {.........ulVa
18130 6c 75 65 4c 65 6e 20 3d 20 78 35 30 39 5f 72 65  lueLen = x509_re
18140 61 64 5f 72 65 74 3b 0a 09 09 09 09 09 09 09 7d  ad_ret;........}
18150 0a 09 09 09 09 09 09 7d 0a 0a 09 09 09 09 09 09  .......}........
18160 62 72 65 61 6b 3b 0a 09 09 09 09 09 63 61 73 65  break;......case
18170 20 43 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 45   CKO_CERTIFICATE
18180 3a 0a 09 09 09 09 09 09 70 56 61 6c 75 65 20 3d  :.......pValue =
18190 20 63 65 72 74 69 66 69 63 61 74 65 3b 0a 09 09   certificate;...
181a0 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ....ulValueLen =
181b0 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e   certificate_len
181c0 3b 0a 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a  ;........break;.
181d0 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45  ....}......CACKE
181e0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
181f0 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25   ... returning %
18200 70 2f 25 6c 75 22 2c 20 70 56 61 6c 75 65 2c 20  p/%lu", pValue, 
18210 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
18220 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09  ulValueLen);....
18230 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
18240 20 43 4b 41 5f 49 53 53 55 45 52 3a 0a 09 09 09   CKA_ISSUER:....
18250 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
18260 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67  INTF("Requesting
18270 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 49   attribute CKA_I
18280 53 53 55 45 52 20 28 30 78 25 30 38 6c 78 29 20  SSUER (0x%08lx) 
18290 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  ...", (unsigned 
182a0 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f  long) curr_attr_
182b0 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28  type);......if (
182c0 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43  objectclass != C
182d0 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 45 20 26  KO_CERTIFICATE &
182e0 26 20 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d  & objectclass !=
182f0 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52   CKO_NETSCAPE_TR
18300 55 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b  UST) {......CACK
18310 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
18320 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65  " ... but not ge
18330 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65  tting it because
18340 20 77 65 20 61 72 65 20 6e 6f 74 20 61 20 63 65   we are not a ce
18350 72 74 69 66 69 63 61 74 65 20 6f 72 20 4e 65 74  rtificate or Net
18360 73 63 61 70 65 20 74 72 75 73 74 20 6f 62 6a 65  scape trust obje
18370 63 74 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61  ct");.......brea
18380 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69 66  k;.....}......if
18390 20 28 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65   (certificate_le
183a0 6e 20 3e 3d 20 30 29 20 7b 0a 09 09 09 09 09 78  n >= 0) {......x
183b0 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3d 20 78  509_read_ret = x
183c0 35 30 39 5f 74 6f 5f 69 73 73 75 65 72 28 63 65  509_to_issuer(ce
183d0 72 74 69 66 69 63 61 74 65 2c 20 63 65 72 74 69  rtificate, certi
183e0 66 69 63 61 74 65 5f 6c 65 6e 2c 20 26 70 56 61  ficate_len, &pVa
183f0 6c 75 65 29 3b 0a 09 09 09 09 09 69 66 20 28 78  lue);......if (x
18400 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3c 20 30  509_read_ret < 0
18410 29 20 7b 0a 09 09 09 09 09 09 70 56 61 6c 75 65  ) {.......pValue
18420 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 7d 20   = NULL;......} 
18430 65 6c 73 65 20 7b 0a 09 09 09 09 09 09 75 6c 56  else {.......ulV
18440 61 6c 75 65 4c 65 6e 20 3d 20 78 35 30 39 5f 72  alueLen = x509_r
18450 65 61 64 5f 72 65 74 3b 0a 09 09 09 09 09 7d 0a  ead_ret;......}.
18460 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45  ....}......CACKE
18470 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
18480 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25   ... returning %
18490 70 2f 25 6c 75 22 2c 20 70 56 61 6c 75 65 2c 20  p/%lu", pValue, 
184a0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
184b0 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09  ulValueLen);....
184c0 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
184d0 20 43 4b 41 5f 53 45 52 49 41 4c 5f 4e 55 4d 42   CKA_SERIAL_NUMB
184e0 45 52 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  ER:.....CACKEY_D
184f0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71  EBUG_PRINTF("Req
18500 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74  uesting attribut
18510 65 20 43 4b 41 5f 53 45 52 49 41 4c 5f 4e 55 4d  e CKA_SERIAL_NUM
18520 42 45 52 20 28 30 78 25 30 38 6c 78 29 20 2e 2e  BER (0x%08lx) ..
18530 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  .", (unsigned lo
18540 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79  ng) curr_attr_ty
18550 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62  pe);......if (ob
18560 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f  jectclass != CKO
18570 5f 43 45 52 54 49 46 49 43 41 54 45 20 26 26 20  _CERTIFICATE && 
18580 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43  objectclass != C
18590 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53  KO_NETSCAPE_TRUS
185a0 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59  T) {......CACKEY
185b0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
185c0 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74  ... but not gett
185d0 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77  ing it because w
185e0 65 20 61 72 65 20 6e 6f 74 20 61 20 63 65 72 74  e are not a cert
185f0 69 66 69 63 61 74 65 20 6f 72 20 4e 65 74 73 63  ificate or Netsc
18600 61 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74  ape trust object
18610 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b  ");.......break;
18620 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69 66 20 28  .....}......if (
18630 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20  certificate_len 
18640 3e 3d 20 30 29 20 7b 0a 09 09 09 09 09 78 35 30  >= 0) {......x50
18650 39 5f 72 65 61 64 5f 72 65 74 20 3d 20 78 35 30  9_read_ret = x50
18660 39 5f 74 6f 5f 73 65 72 69 61 6c 28 63 65 72 74  9_to_serial(cert
18670 69 66 69 63 61 74 65 2c 20 63 65 72 74 69 66 69  ificate, certifi
18680 63 61 74 65 5f 6c 65 6e 2c 20 26 70 56 61 6c 75  cate_len, &pValu
18690 65 29 3b 0a 09 09 09 09 09 69 66 20 28 78 35 30  e);......if (x50
186a0 39 5f 72 65 61 64 5f 72 65 74 20 3c 20 30 29 20  9_read_ret < 0) 
186b0 7b 0a 09 09 09 09 09 09 70 56 61 6c 75 65 20 3d  {.......pValue =
186c0 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 7d 20 65 6c   NULL;......} el
186d0 73 65 20 7b 0a 09 09 09 09 09 09 75 6c 56 61 6c  se {.......ulVal
186e0 75 65 4c 65 6e 20 3d 20 78 35 30 39 5f 72 65 61  ueLen = x509_rea
186f0 64 5f 72 65 74 3b 0a 09 09 09 09 09 7d 0a 09 09  d_ret;......}...
18700 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f  ..}......CACKEY_
18710 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
18720 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 28 25 70  .. returning (%p
18730 2f 25 6c 75 29 22 2c 20 70 56 61 6c 75 65 2c 20  /%lu)", pValue, 
18740 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
18750 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09  ulValueLen);....
18760 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
18770 20 43 4b 41 5f 53 55 42 4a 45 43 54 3a 0a 09 09   CKA_SUBJECT:...
18780 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
18790 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e  RINTF("Requestin
187a0 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f  g attribute CKA_
187b0 53 55 42 4a 45 43 54 20 28 30 78 25 30 38 6c 78  SUBJECT (0x%08lx
187c0 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65  ) ...", (unsigne
187d0 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74  d long) curr_att
187e0 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66  r_type);......if
187f0 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d   (objectclass !=
18800 20 43 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 45   CKO_CERTIFICATE
18810 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f  ) {......CACKEY_
18820 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
18830 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69  .. but not getti
18840 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77 65  ng it because we
18850 20 61 72 65 20 6e 6f 74 20 61 20 63 65 72 74 69   are not a certi
18860 66 69 63 61 74 65 22 29 3b 0a 0a 09 09 09 09 09  ficate");.......
18870 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09  break;.....}....
18880 09 09 69 66 20 28 63 65 72 74 69 66 69 63 61 74  ..if (certificat
18890 65 5f 6c 65 6e 20 3e 3d 20 30 29 20 7b 0a 09 09  e_len >= 0) {...
188a0 09 09 09 78 35 30 39 5f 72 65 61 64 5f 72 65 74  ...x509_read_ret
188b0 20 3d 20 78 35 30 39 5f 74 6f 5f 73 75 62 6a 65   = x509_to_subje
188c0 63 74 28 63 65 72 74 69 66 69 63 61 74 65 2c 20  ct(certificate, 
188d0 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c  certificate_len,
188e0 20 26 70 56 61 6c 75 65 29 3b 0a 09 09 09 09 09   &pValue);......
188f0 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72 65  if (x509_read_re
18900 74 20 3c 20 30 29 20 7b 0a 09 09 09 09 09 09 70  t < 0) {.......p
18910 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09  Value = NULL;...
18920 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09  ...} else {.....
18930 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 78  ..ulValueLen = x
18940 35 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09 09  509_read_ret;...
18950 09 09 09 7d 0a 09 09 09 09 7d 0a 0a 09 09 09 09  ...}.....}......
18960 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
18970 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e  NTF(" ... return
18980 69 6e 67 20 25 70 2f 25 6c 75 22 2c 20 70 56 61  ing %p/%lu", pVa
18990 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  lue, (unsigned l
189a0 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29  ong) ulValueLen)
189b0 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  ;......break;...
189c0 09 63 61 73 65 20 43 4b 41 5f 49 44 3a 0a 09 09  .case CKA_ID:...
189d0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
189e0 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e  RINTF("Requestin
189f0 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f  g attribute CKA_
18a00 49 44 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e  ID (0x%08lx) ...
18a10 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
18a20 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70  g) curr_attr_typ
18a30 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a  e);......if (obj
18a40 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f  ectclass == CKO_
18a50 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54 29 20  NETSCAPE_TRUST) 
18a60 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45  {......CACKEY_DE
18a70 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
18a80 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67   but not getting
18a90 20 69 74 20 62 65 63 61 75 73 65 20 77 65 20 61   it because we a
18aa0 72 65 20 61 20 4e 65 74 73 63 61 70 65 20 74 72  re a Netscape tr
18ab0 75 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09  ust object");...
18ac0 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d  ....break;.....}
18ad0 0a 0a 09 09 09 09 75 63 54 6d 70 42 75 66 5b 30  ......ucTmpBuf[0
18ae0 5d 20 3d 20 28 28 69 64 65 6e 74 69 74 79 5f 6e  ] = ((identity_n
18af0 75 6d 20 2b 20 31 29 20 3e 3e 20 38 29 20 26 20  um + 1) >> 8) & 
18b00 30 78 66 66 3b 0a 09 09 09 09 75 63 54 6d 70 42  0xff;.....ucTmpB
18b10 75 66 5b 31 5d 20 3d 20 20 28 69 64 65 6e 74 69  uf[1] =  (identi
18b20 74 79 5f 6e 75 6d 20 2b 20 31 29 20 26 20 30 78  ty_num + 1) & 0x
18b30 66 66 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65 20  ff;......pValue 
18b40 3d 20 26 75 63 54 6d 70 42 75 66 3b 0a 09 09 09  = &ucTmpBuf;....
18b50 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 32 3b  .ulValueLen = 2;
18b60 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
18b70 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
18b80 72 65 74 75 72 6e 69 6e 67 20 25 70 2f 25 6c 75  returning %p/%lu
18b90 22 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69  ", pValue, (unsi
18ba0 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c  gned long) ulVal
18bb0 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65  ueLen);......bre
18bc0 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f  ak;....case CKA_
18bd0 43 45 52 54 49 46 49 43 41 54 45 5f 54 59 50 45  CERTIFICATE_TYPE
18be0 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  :.....CACKEY_DEB
18bf0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65  UG_PRINTF("Reque
18c00 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20  sting attribute 
18c10 43 4b 41 5f 43 45 52 54 49 46 49 43 41 54 45 5f  CKA_CERTIFICATE_
18c20 54 59 50 45 20 28 30 78 25 30 38 6c 78 29 20 2e  TYPE (0x%08lx) .
18c30 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ..", (unsigned l
18c40 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74  ong) curr_attr_t
18c50 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f  ype);......if (o
18c60 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b  bjectclass != CK
18c70 4f 5f 43 45 52 54 49 46 49 43 41 54 45 29 20 7b  O_CERTIFICATE) {
18c80 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
18c90 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
18ca0 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20  but not getting 
18cb0 69 74 20 62 65 63 61 75 73 65 20 77 65 20 61 72  it because we ar
18cc0 65 20 6e 6f 74 20 61 20 63 65 72 74 69 66 69 63  e not a certific
18cd0 61 74 65 2e 22 29 3b 0a 0a 09 09 09 09 09 62 72  ate.");.......br
18ce0 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09  eak;.....}......
18cf0 2f 2a 20 57 65 20 6f 6e 6c 79 20 73 75 70 70 6f  /* We only suppo
18d00 72 74 20 6f 6e 65 20 63 65 72 74 69 66 69 63 61  rt one certifica
18d10 74 65 20 74 79 70 65 20 2a 2f 0a 09 09 09 09 63  te type */.....c
18d20 6b 5f 63 65 72 74 69 66 69 63 61 74 65 5f 74 79  k_certificate_ty
18d30 70 65 20 3d 20 43 4b 43 5f 58 5f 35 30 39 3b 0a  pe = CKC_X_509;.
18d40 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63  .....pValue = &c
18d50 6b 5f 63 65 72 74 69 66 69 63 61 74 65 5f 74 79  k_certificate_ty
18d60 70 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c  pe;.....ulValueL
18d70 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 63  en = sizeof(ck_c
18d80 65 72 74 69 66 69 63 61 74 65 5f 74 79 70 65 29  ertificate_type)
18d90 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  ;......CACKEY_DE
18da0 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
18db0 20 72 65 74 75 72 6e 69 6e 67 20 43 4b 43 5f 58   returning CKC_X
18dc0 5f 35 30 39 20 28 25 6c 75 29 20 28 25 70 2f 25  _509 (%lu) (%p/%
18dd0 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  lu)", (unsigned 
18de0 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 43 45 52 54  long) *((CK_CERT
18df0 49 46 49 43 41 54 45 5f 54 59 50 45 20 2a 29 20  IFICATE_TYPE *) 
18e00 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c  pValue), pValue,
18e10 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
18e20 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09   ulValueLen);...
18e30 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
18e40 65 20 43 4b 41 5f 4b 45 59 5f 54 59 50 45 3a 0a  e CKA_KEY_TYPE:.
18e50 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
18e60 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74  _PRINTF("Request
18e70 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b  ing attribute CK
18e80 41 5f 4b 45 59 5f 54 59 50 45 20 28 30 78 25 30  A_KEY_TYPE (0x%0
18e90 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69  8lx) ...", (unsi
18ea0 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f  gned long) curr_
18eb0 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09  attr_type);.....
18ec0 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73  .if (objectclass
18ed0 20 21 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f   != CKO_PRIVATE_
18ee0 4b 45 59 20 26 26 20 6f 62 6a 65 63 74 63 6c 61  KEY && objectcla
18ef0 73 73 20 21 3d 20 43 4b 4f 5f 50 55 42 4c 49 43  ss != CKO_PUBLIC
18f00 5f 4b 45 59 29 20 7b 0a 09 09 09 09 09 43 41 43  _KEY) {......CAC
18f10 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
18f20 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67  (" ... but not g
18f30 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73  etting it becaus
18f40 65 20 77 65 20 61 72 65 20 6e 6f 74 20 61 20 6b  e we are not a k
18f50 65 79 2e 22 29 3b 0a 0a 09 09 09 09 09 62 72 65  ey.");.......bre
18f60 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 2f  ak;.....}....../
18f70 2a 20 57 65 20 6f 6e 6c 79 20 73 75 70 70 6f 72  * We only suppor
18f80 74 20 6f 6e 65 20 6b 65 79 20 74 79 70 65 20 2a  t one key type *
18f90 2f 0a 09 09 09 09 63 6b 5f 6b 65 79 5f 74 79 70  /.....ck_key_typ
18fa0 65 20 3d 20 43 4b 4b 5f 52 53 41 3b 0a 0a 09 09  e = CKK_RSA;....
18fb0 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 6b  ..pValue = &ck_k
18fc0 65 79 5f 74 79 70 65 3b 0a 09 09 09 09 75 6c 56  ey_type;.....ulV
18fd0 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66  alueLen = sizeof
18fe0 28 63 6b 5f 6b 65 79 5f 74 79 70 65 29 3b 0a 0a  (ck_key_type);..
18ff0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
19000 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65  _PRINTF(" ... re
19010 74 75 72 6e 69 6e 67 20 43 4b 4b 5f 52 53 41 20  turning CKK_RSA 
19020 28 25 6c 75 29 20 28 25 70 2f 25 6c 75 29 22 2c  (%lu) (%p/%lu)",
19030 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
19040 20 2a 28 28 43 4b 5f 43 45 52 54 49 46 49 43 41   *((CK_CERTIFICA
19050 54 45 5f 54 59 50 45 20 2a 29 20 70 56 61 6c 75  TE_TYPE *) pValu
19060 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73  e), pValue, (uns
19070 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61  igned long) ulVa
19080 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72  lueLen);......br
19090 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41  eak;....case CKA
190a0 5f 53 49 47 4e 3a 0a 09 09 09 09 43 41 43 4b 45  _SIGN:.....CACKE
190b0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
190c0 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69  Requesting attri
190d0 62 75 74 65 20 43 4b 41 5f 53 49 47 4e 20 28 30  bute CKA_SIGN (0
190e0 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75  x%08lx) ...", (u
190f0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75  nsigned long) cu
19100 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a  rr_attr_type);..
19110 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c  ....if (objectcl
19120 61 73 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43  ass == CKO_NETSC
19130 41 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09  APE_TRUST) {....
19140 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
19150 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20  RINTF(" ... but 
19160 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 62  not getting it b
19170 65 63 61 75 73 65 20 77 65 20 61 72 65 20 61 20  ecause we are a 
19180 4e 65 74 73 63 61 70 65 20 74 72 75 73 74 20 6f  Netscape trust o
19190 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62  bject");.......b
191a0 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09  reak;.....}.....
191b0 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73  .if (objectclass
191c0 20 3d 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f   == CKO_PRIVATE_
191d0 4b 45 59 29 20 7b 0a 09 09 09 09 09 70 56 61 6c  KEY) {......pVal
191e0 75 65 20 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09  ue = &ck_true;..
191f0 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ....ulValueLen =
19200 20 73 69 7a 65 6f 66 28 63 6b 5f 74 72 75 65 29   sizeof(ck_true)
19210 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09  ;.....} else {..
19220 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b  ....pValue = &ck
19230 5f 66 61 6c 73 65 3b 0a 09 09 09 09 09 75 6c 56  _false;......ulV
19240 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66  alueLen = sizeof
19250 28 63 6b 5f 66 61 6c 73 65 29 3b 0a 09 09 09 09  (ck_false);.....
19260 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  }......CACKEY_DE
19270 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
19280 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28   returning %lu (
19290 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67  %p/%lu)", (unsig
192a0 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f  ned long) *((CK_
192b0 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29  BBOOL *) pValue)
192c0 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67  , pValue, (unsig
192d0 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75  ned long) ulValu
192e0 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61  eLen);......brea
192f0 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 53  k;....case CKA_S
19300 49 47 4e 5f 52 45 43 4f 56 45 52 3a 0a 09 09 09  IGN_RECOVER:....
19310 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
19320 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67  INTF("Requesting
19330 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 53   attribute CKA_S
19340 49 47 4e 5f 52 45 43 4f 56 45 52 20 28 30 78 25  IGN_RECOVER (0x%
19350 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73  08lx) ...", (uns
19360 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72  igned long) curr
19370 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09  _attr_type);....
19380 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73  ..if (objectclas
19390 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50  s == CKO_NETSCAP
193a0 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 09 09  E_TRUST) {......
193b0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
193c0 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f  NTF(" ... but no
193d0 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63  t getting it bec
193e0 61 75 73 65 20 77 65 20 61 72 65 20 61 20 4e 65  ause we are a Ne
193f0 74 73 63 61 70 65 20 74 72 75 73 74 20 6f 62 6a  tscape trust obj
19400 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62 72 65  ect");.......bre
19410 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 2f  ak;.....}....../
19420 2a 20 57 65 20 63 75 72 72 65 6e 74 6c 79 20 6f  * We currently o
19430 6e 6c 79 20 73 75 70 70 6f 72 74 20 22 53 69 67  nly support "Sig
19440 6e 20 77 69 74 68 20 41 70 70 65 6e 64 69 78 22  n with Appendix"
19450 20 2a 2f 0a 09 09 09 09 70 56 61 6c 75 65 20 3d   */.....pValue =
19460 20 26 63 6b 5f 66 61 6c 73 65 3b 0a 09 09 09 09   &ck_false;.....
19470 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a  ulValueLen = siz
19480 65 6f 66 28 63 6b 5f 66 61 6c 73 65 29 3b 0a 0a  eof(ck_false);..
19490 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
194a0 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65  _PRINTF(" ... re
194b0 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f  turning %lu (%p/
194c0 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64  %lu)", (unsigned
194d0 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f   long) *((CK_BBO
194e0 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70  OL *) pValue), p
194f0 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64  Value, (unsigned
19500 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65   long) ulValueLe
19510 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a  n);......break;.
19520 09 09 09 63 61 73 65 20 43 4b 41 5f 44 45 43 52  ...case CKA_DECR
19530 59 50 54 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f  YPT:.....CACKEY_
19540 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
19550 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75  questing attribu
19560 74 65 20 43 4b 41 5f 44 45 43 52 59 50 54 20 28  te CKA_DECRYPT (
19570 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28  0x%08lx) ...", (
19580 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63  unsigned long) c
19590 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a  urr_attr_type);.
195a0 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63  .....if (objectc
195b0 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53  lass == CKO_NETS
195c0 43 41 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 09  CAPE_TRUST) {...
195d0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
195e0 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74  PRINTF(" ... but
195f0 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20   not getting it 
19600 62 65 63 61 75 73 65 20 77 65 20 61 72 65 20 61  because we are a
19610 20 4e 65 74 73 63 61 70 65 20 74 72 75 73 74 20   Netscape trust 
19620 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09  object");.......
19630 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09  break;.....}....
19640 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73  ..if (objectclas
19650 73 20 3d 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45  s == CKO_PRIVATE
19660 5f 4b 45 59 20 7c 7c 20 6f 62 6a 65 63 74 63 6c  _KEY || objectcl
19670 61 73 73 20 3d 3d 20 43 4b 4f 5f 50 55 42 4c 49  ass == CKO_PUBLI
19680 43 5f 4b 45 59 29 20 7b 0a 09 09 09 09 09 70 56  C_KEY) {......pV
19690 61 6c 75 65 20 3d 20 26 63 6b 5f 74 72 75 65 3b  alue = &ck_true;
196a0 0a 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e  ......ulValueLen
196b0 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 74 72 75   = sizeof(ck_tru
196c0 65 29 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b  e);.....} else {
196d0 0a 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26  ......pValue = &
196e0 63 6b 5f 66 61 6c 73 65 3b 0a 09 09 09 09 09 75  ck_false;......u
196f0 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65  lValueLen = size
19700 6f 66 28 63 6b 5f 66 61 6c 73 65 29 3b 0a 09 09  of(ck_false);...
19710 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f  ..}......CACKEY_
19720 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
19730 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75  .. returning %lu
19740 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73   (%p/%lu)", (uns
19750 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43  igned long) *((C
19760 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75  K_BBOOL *) pValu
19770 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73  e), pValue, (uns
19780 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61  igned long) ulVa
19790 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72  lueLen);......br
197a0 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41  eak;....case CKA
197b0 5f 53 45 4e 53 49 54 49 56 45 3a 0a 09 09 09 09  _SENSITIVE:.....
197c0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
197d0 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20  NTF("Requesting 
197e0 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 53 45  attribute CKA_SE
197f0 4e 53 49 54 49 56 45 20 28 30 78 25 30 38 6c 78  NSITIVE (0x%08lx
19800 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65  ) ...", (unsigne
19810 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74  d long) curr_att
19820 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66  r_type);......if
19830 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d   (objectclass ==
19840 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52   CKO_NETSCAPE_TR
19850 55 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b  UST) {......CACK
19860 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
19870 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65  " ... but not ge
19880 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65  tting it because
19890 20 77 65 20 61 72 65 20 61 20 4e 65 74 73 63 61   we are a Netsca
198a0 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22  pe trust object"
198b0 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a  );.......break;.
198c0 09 09 09 09 7d 0a 0a 09 09 09 09 69 66 20 28 6f  ....}......if (o
198d0 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b  bjectclass == CK
198e0 4f 5f 50 52 49 56 41 54 45 5f 4b 45 59 29 20 7b  O_PRIVATE_KEY) {
198f0 0a 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26  ......pValue = &
19900 63 6b 5f 74 72 75 65 3b 0a 09 09 09 09 09 75 6c  ck_true;......ul
19910 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f  ValueLen = sizeo
19920 66 28 63 6b 5f 74 72 75 65 29 3b 0a 09 09 09 09  f(ck_true);.....
19930 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 70 56  } else {......pV
19940 61 6c 75 65 20 3d 20 26 63 6b 5f 66 61 6c 73 65  alue = &ck_false
19950 3b 0a 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65  ;......ulValueLe
19960 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 66 61  n = sizeof(ck_fa
19970 6c 73 65 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09  lse);.....}.....
19980 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
19990 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72  INTF(" ... retur
199a0 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75  ning %lu (%p/%lu
199b0 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  )", (unsigned lo
199c0 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20  ng) *((CK_BBOOL 
199d0 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c  *) pValue), pVal
199e0 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  ue, (unsigned lo
199f0 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b  ng) ulValueLen);
19a00 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
19a10 63 61 73 65 20 43 4b 41 5f 45 58 54 52 41 43 54  case CKA_EXTRACT
19a20 41 42 4c 45 3a 0a 09 09 09 09 43 41 43 4b 45 59  ABLE:.....CACKEY
19a30 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
19a40 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62  equesting attrib
19a50 75 74 65 20 43 4b 41 5f 45 58 54 52 41 43 54 41  ute CKA_EXTRACTA
19a60 42 4c 45 20 28 30 78 25 30 38 6c 78 29 20 2e 2e  BLE (0x%08lx) ..
19a70 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  .", (unsigned lo
19a80 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79  ng) curr_attr_ty
19a90 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62  pe);......if (ob
19aa0 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f  jectclass == CKO
19ab0 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54 29  _NETSCAPE_TRUST)
19ac0 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44   {......CACKEY_D
19ad0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
19ae0 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e  . but not gettin
19af0 67 20 69 74 20 62 65 63 61 75 73 65 20 77 65 20  g it because we 
19b00 61 72 65 20 61 20 4e 65 74 73 63 61 70 65 20 74  are a Netscape t
19b10 72 75 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a  rust object");..
19b20 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09  .....break;.....
19b30 7d 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63  }......if (objec
19b40 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 50 52  tclass == CKO_PR
19b50 49 56 41 54 45 5f 4b 45 59 29 20 7b 0a 09 09 09  IVATE_KEY) {....
19b60 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 66  ..pValue = &ck_f
19b70 61 6c 73 65 3b 0a 09 09 09 09 09 75 6c 56 61 6c  alse;......ulVal
19b80 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63  ueLen = sizeof(c
19b90 6b 5f 74 72 75 65 29 3b 0a 09 09 09 09 7d 20 65  k_true);.....} e
19ba0 6c 73 65 20 7b 0a 09 09 09 09 09 70 56 61 6c 75  lse {......pValu
19bb0 65 20 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09 09  e = &ck_true;...
19bc0 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  ...ulValueLen = 
19bd0 73 69 7a 65 6f 66 28 63 6b 5f 66 61 6c 73 65 29  sizeof(ck_false)
19be0 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43  ;.....}......CAC
19bf0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
19c00 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67  (" ... returning
19c10 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20   %lu (%p/%lu)", 
19c20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
19c30 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70  *((CK_BBOOL *) p
19c40 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20  Value), pValue, 
19c50 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
19c60 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09  ulValueLen);....
19c70 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
19c80 20 43 4b 41 5f 4d 4f 44 55 4c 55 53 3a 0a 09 09   CKA_MODULUS:...
19c90 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
19ca0 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e  RINTF("Requestin
19cb0 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f  g attribute CKA_
19cc0 4d 4f 44 55 4c 55 53 20 28 30 78 25 30 38 6c 78  MODULUS (0x%08lx
19cd0 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65  ) ...", (unsigne
19ce0 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74  d long) curr_att
19cf0 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66  r_type);......if
19d00 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d   (objectclass ==
19d10 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52   CKO_NETSCAPE_TR
19d20 55 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b  UST) {......CACK
19d30 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
19d40 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65  " ... but not ge
19d50 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65  tting it because
19d60 20 77 65 20 61 72 65 20 61 20 4e 65 74 73 63 61   we are a Netsca
19d70 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22  pe trust object"
19d80 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a  );.......break;.
19d90 09 09 09 09 7d 0a 0a 09 09 09 09 69 66 20 28 63  ....}......if (c
19da0 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3e  ertificate_len >
19db0 3d 20 30 29 20 7b 0a 09 09 09 09 09 78 35 30 39  = 0) {......x509
19dc0 5f 72 65 61 64 5f 72 65 74 20 3d 20 78 35 30 39  _read_ret = x509
19dd0 5f 74 6f 5f 6d 6f 64 75 6c 75 73 28 63 65 72 74  _to_modulus(cert
19de0 69 66 69 63 61 74 65 2c 20 63 65 72 74 69 66 69  ificate, certifi
19df0 63 61 74 65 5f 6c 65 6e 2c 20 26 70 56 61 6c 75  cate_len, &pValu
19e00 65 29 3b 0a 09 09 09 09 09 69 66 20 28 78 35 30  e);......if (x50
19e10 39 5f 72 65 61 64 5f 72 65 74 20 3c 20 30 29 20  9_read_ret < 0) 
19e20 7b 0a 09 09 09 09 09 09 70 56 61 6c 75 65 20 3d  {.......pValue =
19e30 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 7d 20 65 6c   NULL;......} el
19e40 73 65 20 7b 0a 09 09 09 09 09 09 75 6c 56 61 6c  se {.......ulVal
19e50 75 65 4c 65 6e 20 3d 20 78 35 30 39 5f 72 65 61  ueLen = x509_rea
19e60 64 5f 72 65 74 3b 0a 09 09 09 09 09 7d 0a 09 09  d_ret;......}...
19e70 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f  ..}......CACKEY_
19e80 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
19e90 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 28 25 70  .. returning (%p
19ea0 2f 25 6c 75 29 22 2c 20 70 56 61 6c 75 65 2c 20  /%lu)", pValue, 
19eb0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
19ec0 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09  ulValueLen);....
19ed0 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
19ee0 20 43 4b 41 5f 50 55 42 4c 49 43 5f 45 58 50 4f   CKA_PUBLIC_EXPO
19ef0 4e 45 4e 54 3a 0a 09 09 09 09 43 41 43 4b 45 59  NENT:.....CACKEY
19f00 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
19f10 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62  equesting attrib
19f20 75 74 65 20 43 4b 41 5f 50 55 42 4c 49 43 5f 45  ute CKA_PUBLIC_E
19f30 58 50 4f 4e 45 4e 54 20 28 30 78 25 30 38 6c 78  XPONENT (0x%08lx
19f40 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65  ) ...", (unsigne
19f50 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74  d long) curr_att
19f60 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66  r_type);......if
19f70 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d   (objectclass ==
19f80 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52   CKO_NETSCAPE_TR
19f90 55 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b  UST) {......CACK
19fa0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
19fb0 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65  " ... but not ge
19fc0 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65  tting it because
19fd0 20 77 65 20 61 72 65 20 61 20 4e 65 74 73 63 61   we are a Netsca
19fe0 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22  pe trust object"
19ff0 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a  );.......break;.
1a000 09 09 09 09 7d 0a 0a 09 09 09 09 69 66 20 28 63  ....}......if (c
1a010 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3e  ertificate_len >
1a020 3d 20 30 29 20 7b 0a 09 09 09 09 09 78 35 30 39  = 0) {......x509
1a030 5f 72 65 61 64 5f 72 65 74 20 3d 20 78 35 30 39  _read_ret = x509
1a040 5f 74 6f 5f 65 78 70 6f 6e 65 6e 74 28 63 65 72  _to_exponent(cer
1a050 74 69 66 69 63 61 74 65 2c 20 63 65 72 74 69 66  tificate, certif
1a060 69 63 61 74 65 5f 6c 65 6e 2c 20 26 70 56 61 6c  icate_len, &pVal
1a070 75 65 29 3b 0a 09 09 09 09 09 69 66 20 28 78 35  ue);......if (x5
1a080 30 39 5f 72 65 61 64 5f 72 65 74 20 3c 20 30 29  09_read_ret < 0)
1a090 20 7b 0a 09 09 09 09 09 09 70 56 61 6c 75 65 20   {.......pValue 
1a0a0 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 7d 20 65  = NULL;......} e
1a0b0 6c 73 65 20 7b 0a 09 09 09 09 09 09 75 6c 56 61  lse {.......ulVa
1a0c0 6c 75 65 4c 65 6e 20 3d 20 78 35 30 39 5f 72 65  lueLen = x509_re
1a0d0 61 64 5f 72 65 74 3b 0a 09 09 09 09 09 7d 0a 09  ad_ret;......}..
1a0e0 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59  ...}......CACKEY
1a0f0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
1a100 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 28 25  ... returning (%
1a110 70 2f 25 6c 75 29 22 2c 20 70 56 61 6c 75 65 2c  p/%lu)", pValue,
1a120 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
1a130 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09   ulValueLen);...
1a140 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
1a150 65 20 43 4b 41 5f 54 52 55 53 54 5f 44 49 47 49  e CKA_TRUST_DIGI
1a160 54 41 4c 5f 53 49 47 4e 41 54 55 52 45 3a 0a 09  TAL_SIGNATURE:..
1a170 09 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54  ..case CKA_TRUST
1a180 5f 4e 4f 4e 5f 52 45 50 55 44 49 41 54 49 4f 4e  _NON_REPUDIATION
1a190 3a 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 54 52  :....case CKA_TR
1a1a0 55 53 54 5f 4b 45 59 5f 45 4e 43 49 50 48 45 52  UST_KEY_ENCIPHER
1a1b0 4d 45 4e 54 3a 0a 09 09 09 63 61 73 65 20 43 4b  MENT:....case CK
1a1c0 41 5f 54 52 55 53 54 5f 44 41 54 41 5f 45 4e 43  A_TRUST_DATA_ENC
1a1d0 49 50 48 45 52 4d 45 4e 54 3a 0a 09 09 09 63 61  IPHERMENT:....ca
1a1e0 73 65 20 43 4b 41 5f 54 52 55 53 54 5f 4b 45 59  se CKA_TRUST_KEY
1a1f0 5f 41 47 52 45 45 4d 45 4e 54 3a 0a 09 09 09 63  _AGREEMENT:....c
1a200 61 73 65 20 43 4b 41 5f 54 52 55 53 54 5f 4b 45  ase CKA_TRUST_KE
1a210 59 5f 43 45 52 54 5f 53 49 47 4e 3a 0a 09 09 09  Y_CERT_SIGN:....
1a220 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54 5f 43  case CKA_TRUST_C
1a230 52 4c 5f 53 49 47 4e 3a 0a 09 09 09 63 61 73 65  RL_SIGN:....case
1a240 20 43 4b 41 5f 54 52 55 53 54 5f 53 45 52 56 45   CKA_TRUST_SERVE
1a250 52 5f 41 55 54 48 3a 0a 09 09 09 63 61 73 65 20  R_AUTH:....case 
1a260 43 4b 41 5f 54 52 55 53 54 5f 43 4c 49 45 4e 54  CKA_TRUST_CLIENT
1a270 5f 41 55 54 48 3a 0a 09 09 09 63 61 73 65 20 43  _AUTH:....case C
1a280 4b 41 5f 54 52 55 53 54 5f 43 4f 44 45 5f 53 49  KA_TRUST_CODE_SI
1a290 47 4e 49 4e 47 3a 0a 09 09 09 63 61 73 65 20 43  GNING:....case C
1a2a0 4b 41 5f 54 52 55 53 54 5f 45 4d 41 49 4c 5f 50  KA_TRUST_EMAIL_P
1a2b0 52 4f 54 45 43 54 49 4f 4e 3a 0a 09 09 09 09 43  ROTECTION:.....C
1a2c0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1a2d0 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61  TF("Requesting a
1a2e0 74 74 72 69 62 75 74 65 20 43 4b 41 5f 54 52 55  ttribute CKA_TRU
1a2f0 53 54 5f 2e 2e 2e 20 28 30 78 25 30 38 6c 78 29  ST_... (0x%08lx)
1a300 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64   ...", (unsigned
1a310 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72   long) curr_attr
1a320 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 70 56 61  _type);......pVa
1a330 6c 75 65 20 3d 20 26 63 6b 5f 74 72 75 73 74 65  lue = &ck_truste
1a340 64 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65  d;.....ulValueLe
1a350 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 74 72  n = sizeof(ck_tr
1a360 75 73 74 65 64 29 3b 0a 0a 09 09 09 09 43 41 43  usted);......CAC
1a370 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1a380 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67  (" ... returning
1a390 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20   %lu (%p/%lu)", 
1a3a0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
1a3b0 2a 28 28 43 4b 5f 54 52 55 53 54 20 2a 29 20 70  *((CK_TRUST *) p
1a3c0 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20  Value), pValue, 
1a3d0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
1a3e0 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09  ulValueLen);....
1a3f0 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
1a400 20 43 4b 41 5f 43 45 52 54 5f 53 48 41 31 5f 48   CKA_CERT_SHA1_H
1a410 41 53 48 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f  ASH:.....CACKEY_
1a420 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
1a430 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75  questing attribu
1a440 74 65 20 43 4b 41 5f 43 45 52 54 5f 53 48 41 31  te CKA_CERT_SHA1
1a450 5f 48 41 53 48 20 28 30 78 25 30 38 6c 78 29 20  _HASH (0x%08lx) 
1a460 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  ...", (unsigned 
1a470 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f  long) curr_attr_
1a480 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28  type);......if (
1a490 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43  objectclass != C
1a4a0 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53  KO_NETSCAPE_TRUS
1a4b0 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59  T) {......CACKEY
1a4c0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
1a4d0 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74  ... but not gett
1a4e0 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77  ing it because w
1a4f0 65 20 61 72 65 20 6e 6f 74 20 61 20 4e 65 74 73  e are not a Nets
1a500 63 61 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63  cape trust objec
1a510 74 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b  t");.......break
1a520 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 53 48 41  ;.....}......SHA
1a530 31 52 65 73 65 74 28 26 73 68 61 31 5f 63 74 78  1Reset(&sha1_ctx
1a540 29 3b 0a 09 09 09 09 53 48 41 31 49 6e 70 75 74  );.....SHA1Input
1a550 28 26 73 68 61 31 5f 63 74 78 2c 20 63 65 72 74  (&sha1_ctx, cert
1a560 69 66 69 63 61 74 65 2c 20 63 65 72 74 69 66 69  ificate, certifi
1a570 63 61 74 65 5f 6c 65 6e 29 3b 0a 09 09 09 09 53  cate_len);.....S
1a580 48 41 31 52 65 73 75 6c 74 28 26 73 68 61 31 5f  HA1Result(&sha1_
1a590 63 74 78 2c 20 73 68 61 31 5f 68 61 73 68 29 3b  ctx, sha1_hash);
1a5a0 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 73  ......pValue = s
1a5b0 68 61 31 5f 68 61 73 68 3b 0a 09 09 09 09 75 6c  ha1_hash;.....ul
1a5c0 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f  ValueLen = sizeo
1a5d0 66 28 73 68 61 31 5f 68 61 73 68 29 3b 0a 0a 09  f(sha1_hash);...
1a5e0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1a5f0 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74  PRINTF(" ... ret
1a600 75 72 6e 69 6e 67 20 25 70 2f 25 6c 75 22 2c 20  urning %p/%lu", 
1a610 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65  pValue, (unsigne
1a620 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c  d long) ulValueL
1a630 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b  en);......break;
1a640 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 43 45 52  ....case CKA_CER
1a650 54 5f 4d 44 35 5f 48 41 53 48 3a 0a 09 09 09 09  T_MD5_HASH:.....
1a660 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1a670 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20  NTF("Requesting 
1a680 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 43 45  attribute CKA_CE
1a690 52 54 5f 4d 44 35 5f 48 41 53 48 20 28 30 78 25  RT_MD5_HASH (0x%
1a6a0 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73  08lx) ...", (uns
1a6b0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72  igned long) curr
1a6c0 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09  _attr_type);....
1a6d0 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73  ..if (objectclas
1a6e0 73 20 21 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50  s != CKO_NETSCAP
1a6f0 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 09 09  E_TRUST) {......
1a700 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1a710 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f  NTF(" ... but no
1a720 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63  t getting it bec
1a730 61 75 73 65 20 77 65 20 61 72 65 20 6e 6f 74 20  ause we are not 
1a740 61 20 4e 65 74 73 63 61 70 65 20 74 72 75 73 74  a Netscape trust
1a750 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09   object");......
1a760 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09  .break;.....}...
1a770 09 09 09 4d 44 35 49 6e 69 74 28 26 6d 64 35 5f  ...MD5Init(&md5_
1a780 63 74 78 29 3b 0a 09 09 09 09 4d 44 35 55 70 64  ctx);.....MD5Upd
1a790 61 74 65 28 26 6d 64 35 5f 63 74 78 2c 20 63 65  ate(&md5_ctx, ce
1a7a0 72 74 69 66 69 63 61 74 65 2c 20 63 65 72 74 69  rtificate, certi
1a7b0 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a 09 09 09  ficate_len);....
1a7c0 09 4d 44 35 46 69 6e 61 6c 28 6d 64 35 5f 68 61  .MD5Final(md5_ha
1a7d0 73 68 2c 20 26 6d 64 35 5f 63 74 78 29 3b 0a 0a  sh, &md5_ctx);..
1a7e0 09 09 09 09 70 56 61 6c 75 65 20 3d 20 6d 64 35  ....pValue = md5
1a7f0 5f 68 61 73 68 3b 0a 09 09 09 09 75 6c 56 61 6c  _hash;.....ulVal
1a800 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 6d  ueLen = sizeof(m
1a810 64 35 5f 68 61 73 68 29 3b 0a 0a 09 09 09 09 43  d5_hash);......C
1a820 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1a830 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69  TF(" ... returni
1a840 6e 67 20 25 70 2f 25 6c 75 22 2c 20 70 56 61 6c  ng %p/%lu", pVal
1a850 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  ue, (unsigned lo
1a860 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b  ng) ulValueLen);
1a870 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
1a880 64 65 66 61 75 6c 74 3a 0a 09 09 09 09 70 56 61  default:.....pVa
1a890 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09  lue = NULL;.....
1a8a0 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 28 43 4b  ulValueLen = (CK
1a8b0 5f 4c 4f 4e 47 29 20 2d 31 3b 0a 09 09 09 09 62  _LONG) -1;.....b
1a8c0 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09 69 66 20  reak;...}....if 
1a8d0 28 28 28 43 4b 5f 4c 4f 4e 47 29 20 75 6c 56 61  (((CK_LONG) ulVa
1a8e0 6c 75 65 4c 65 6e 29 20 21 3d 20 28 28 43 4b 5f  lueLen) != ((CK_
1a8f0 4c 4f 4e 47 29 20 2d 31 29 29 20 7b 0a 09 09 09  LONG) -1)) {....
1a900 2f 2a 20 50 75 73 68 20 63 75 72 72 5f 61 74 74  /* Push curr_att
1a910 72 20 6f 6e 74 6f 20 74 68 65 20 73 74 61 63 6b  r onto the stack
1a920 20 2a 2f 0a 09 09 09 63 75 72 72 5f 61 74 74 72   */....curr_attr
1a930 2e 74 79 70 65 20 3d 20 63 75 72 72 5f 61 74 74  .type = curr_att
1a940 72 5f 74 79 70 65 3b 0a 09 09 09 63 75 72 72 5f  r_type;....curr_
1a950 61 74 74 72 2e 75 6c 56 61 6c 75 65 4c 65 6e 20  attr.ulValueLen 
1a960 3d 20 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 0a 09  = ulValueLen;...
1a970 09 09 63 75 72 72 5f 61 74 74 72 2e 70 56 61 6c  ..curr_attr.pVal
1a980 75 65 20 3d 20 6d 61 6c 6c 6f 63 28 63 75 72 72  ue = malloc(curr
1a990 5f 61 74 74 72 2e 75 6c 56 61 6c 75 65 4c 65 6e  _attr.ulValueLen
1a9a0 29 3b 0a 09 09 09 6d 65 6d 63 70 79 28 63 75 72  );....memcpy(cur
1a9b0 72 5f 61 74 74 72 2e 70 56 61 6c 75 65 2c 20 70  r_attr.pValue, p
1a9c0 56 61 6c 75 65 2c 20 63 75 72 72 5f 61 74 74 72  Value, curr_attr
1a9d0 2e 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09  .ulValueLen);...
1a9e0 09 09 69 66 20 28 70 56 61 6c 75 65 5f 66 72 65  ..if (pValue_fre
1a9f0 65 20 26 26 20 70 56 61 6c 75 65 29 20 7b 0a 09  e && pValue) {..
1aa00 09 09 09 66 72 65 65 28 70 56 61 6c 75 65 29 3b  ...free(pValue);
1aa10 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 6e 75  ....}.....if (nu
1aa20 6d 61 74 74 72 73 20 3e 3d 20 72 65 74 76 61 6c  mattrs >= retval
1aa30 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 09 09 72 65  _count) {.....re
1aa40 74 76 61 6c 20 3d 20 72 65 61 6c 6c 6f 63 28 72  tval = realloc(r
1aa50 65 74 76 61 6c 2c 20 72 65 74 76 61 6c 5f 63 6f  etval, retval_co
1aa60 75 6e 74 20 2a 20 73 69 7a 65 6f 66 28 2a 72 65  unt * sizeof(*re
1aa70 74 76 61 6c 29 29 3b 0a 09 09 09 7d 0a 0a 09 09  tval));....}....
1aa80 09 6d 65 6d 63 70 79 28 26 72 65 74 76 61 6c 5b  .memcpy(&retval[
1aa90 6e 75 6d 61 74 74 72 73 5d 2c 20 26 63 75 72 72  numattrs], &curr
1aaa0 5f 61 74 74 72 2c 20 73 69 7a 65 6f 66 28 63 75  _attr, sizeof(cu
1aab0 72 72 5f 61 74 74 72 29 29 3b 0a 09 09 09 6e 75  rr_attr));....nu
1aac0 6d 61 74 74 72 73 2b 2b 3b 0a 09 09 7d 0a 09 7d  mattrs++;...}..}
1aad0 0a 0a 09 69 66 20 28 6e 75 6d 61 74 74 72 73 20  ...if (numattrs 
1aae0 21 3d 20 30 29 20 7b 0a 09 09 72 65 74 76 61 6c  != 0) {...retval
1aaf0 5f 63 6f 75 6e 74 20 3d 20 6e 75 6d 61 74 74 72  _count = numattr
1ab00 73 3b 0a 09 09 72 65 74 76 61 6c 20 3d 20 72 65  s;...retval = re
1ab10 61 6c 6c 6f 63 28 72 65 74 76 61 6c 2c 20 72 65  alloc(retval, re
1ab20 74 76 61 6c 5f 63 6f 75 6e 74 20 2a 20 73 69 7a  tval_count * siz
1ab30 65 6f 66 28 2a 72 65 74 76 61 6c 29 29 3b 0a 09  eof(*retval));..
1ab40 7d 20 65 6c 73 65 20 7b 0a 09 09 66 72 65 65 28  } else {...free(
1ab50 72 65 74 76 61 6c 29 3b 0a 0a 09 09 72 65 74 76  retval);....retv
1ab60 61 6c 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 0a 09  al = NULL;..}...
1ab70 2a 70 75 6c 43 6f 75 6e 74 20 3d 20 6e 75 6d 61  *pulCount = numa
1ab80 74 74 72 73 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  ttrs;...CACKEY_D
1ab90 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
1aba0 75 72 6e 69 6e 67 20 25 6c 75 20 6f 62 6a 65 63  urning %lu objec
1abb0 74 73 20 28 25 70 29 2e 22 2c 20 6e 75 6d 61 74  ts (%p).", numat
1abc0 74 72 73 2c 20 28 76 6f 69 64 20 2a 29 20 72 65  trs, (void *) re
1abd0 74 76 61 6c 29 3b 0a 0a 09 72 65 74 75 72 6e 28  tval);...return(
1abe0 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 73 74 61 74  retval);.}..stat
1abf0 69 63 20 76 6f 69 64 20 63 61 63 6b 65 79 5f 66  ic void cackey_f
1ac00 72 65 65 5f 69 64 65 6e 74 69 74 69 65 73 28 73  ree_identities(s
1ac10 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65  truct cackey_ide
1ac20 6e 74 69 74 79 20 2a 69 64 65 6e 74 69 74 69 65  ntity *identitie
1ac30 73 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  s, unsigned long
1ac40 20 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e   identities_coun
1ac50 74 29 20 7b 0a 09 43 4b 5f 41 54 54 52 49 42 55  t) {..CK_ATTRIBU
1ac60 54 45 20 2a 63 75 72 72 5f 61 74 74 72 3b 0a 09  TE *curr_attr;..
1ac70 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 69 64  unsigned long id
1ac80 5f 69 64 78 2c 20 61 74 74 72 5f 69 64 78 3b 0a  _idx, attr_idx;.
1ac90 0a 09 69 66 20 28 69 64 65 6e 74 69 74 69 65 73  ..if (identities
1aca0 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 69 64 65 6e   == NULL || iden
1acb0 74 69 74 69 65 73 5f 63 6f 75 6e 74 20 3d 3d 20  tities_count == 
1acc0 30 29 20 7b 0a 09 09 72 65 74 75 72 6e 3b 0a 09  0) {...return;..
1acd0 7d 0a 0a 09 66 6f 72 20 28 69 64 5f 69 64 78 20  }...for (id_idx 
1ace0 3d 20 30 3b 20 69 64 5f 69 64 78 20 3c 20 69 64  = 0; id_idx < id
1acf0 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 3b 20  entities_count; 
1ad00 69 64 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66  id_idx++) {...if
1ad10 20 28 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f   (identities[id_
1ad20 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73 29  idx].attributes)
1ad30 20 7b 0a 09 09 09 66 6f 72 20 28 61 74 74 72 5f   {....for (attr_
1ad40 69 64 78 20 3d 20 30 3b 20 61 74 74 72 5f 69 64  idx = 0; attr_id
1ad50 78 20 3c 20 69 64 65 6e 74 69 74 69 65 73 5b 69  x < identities[i
1ad60 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65  d_idx].attribute
1ad70 73 5f 63 6f 75 6e 74 3b 20 61 74 74 72 5f 69 64  s_count; attr_id
1ad80 78 2b 2b 29 20 7b 0a 09 09 09 09 63 75 72 72 5f  x++) {.....curr_
1ad90 61 74 74 72 20 3d 20 26 69 64 65 6e 74 69 74 69  attr = &identiti
1ada0 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69  es[id_idx].attri
1adb0 62 75 74 65 73 5b 61 74 74 72 5f 69 64 78 5d 3b  butes[attr_idx];
1adc0 0a 0a 09 09 09 09 69 66 20 28 63 75 72 72 5f 61  ......if (curr_a
1add0 74 74 72 2d 3e 70 56 61 6c 75 65 29 20 7b 0a 09  ttr->pValue) {..
1ade0 09 09 09 09 66 72 65 65 28 63 75 72 72 5f 61 74  ....free(curr_at
1adf0 74 72 2d 3e 70 56 61 6c 75 65 29 3b 0a 09 09 09  tr->pValue);....
1ae00 09 7d 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28  .}....}.....if (
1ae10 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64  identities[id_id
1ae20 78 5d 2e 61 74 74 72 69 62 75 74 65 73 29 20 7b  x].attributes) {
1ae30 0a 09 09 09 09 66 72 65 65 28 69 64 65 6e 74 69  .....free(identi
1ae40 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74  ties[id_idx].att
1ae50 72 69 62 75 74 65 73 29 3b 0a 09 09 09 7d 0a 0a  ributes);....}..
1ae60 09 09 09 63 61 63 6b 65 79 5f 66 72 65 65 5f 63  ...cackey_free_c
1ae70 65 72 74 73 28 69 64 65 6e 74 69 74 69 65 73 5b  erts(identities[
1ae80 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64 65  id_idx].pcsc_ide
1ae90 6e 74 69 74 79 2c 20 31 2c 20 31 29 3b 0a 09 09  ntity, 1, 1);...
1aea0 7d 0a 09 7d 0a 0a 09 66 72 65 65 28 69 64 65 6e  }..}...free(iden
1aeb0 74 69 74 69 65 73 29 3b 0a 7d 0a 0a 73 74 61 74  tities);.}..stat
1aec0 69 63 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  ic unsigned long
1aed0 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 64 6f 64   cackey_read_dod
1aee0 5f 69 64 65 6e 74 69 74 69 65 73 28 73 74 72 75  _identities(stru
1aef0 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69  ct cackey_identi
1af00 74 79 20 2a 69 64 65 6e 74 69 74 69 65 73 2c 20  ty *identities, 
1af10 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6e 75  unsigned long nu
1af20 6d 5f 64 6f 64 5f 63 65 72 74 73 29 20 7b 0a 09  m_dod_certs) {..
1af30 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 63 65  unsigned long ce
1af40 72 74 5f 69 64 78 2c 20 69 64 5f 69 64 78 20 3d  rt_idx, id_idx =
1af50 20 30 3b 0a 0a 09 69 66 20 28 69 64 65 6e 74 69   0;...if (identi
1af60 74 69 65 73 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  ties == NULL) {.
1af70 09 09 72 65 74 75 72 6e 28 6e 75 6d 5f 64 6f 64  ..return(num_dod
1af80 5f 63 65 72 74 73 20 2a 20 33 29 3b 0a 09 7d 0a  _certs * 3);..}.
1af90 0a 09 66 6f 72 20 28 63 65 72 74 5f 69 64 78 20  ..for (cert_idx 
1afa0 3d 20 30 3b 20 63 65 72 74 5f 69 64 78 20 3c 20  = 0; cert_idx < 
1afb0 6e 75 6d 5f 64 6f 64 5f 63 65 72 74 73 3b 20 63  num_dod_certs; c
1afc0 65 72 74 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 69  ert_idx++) {...i
1afd0 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78  dentities[id_idx
1afe0 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20  ].pcsc_identity 
1aff0 3d 20 4e 55 4c 4c 3b 0a 09 09 69 64 65 6e 74 69  = NULL;...identi
1b000 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74  ties[id_idx].att
1b010 72 69 62 75 74 65 73 20 3d 20 63 61 63 6b 65 79  ributes = cackey
1b020 5f 67 65 74 5f 61 74 74 72 69 62 75 74 65 73 28  _get_attributes(
1b030 43 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 45 2c  CKO_CERTIFICATE,
1b040 20 26 65 78 74 72 61 5f 63 65 72 74 73 5b 63 65   &extra_certs[ce
1b050 72 74 5f 69 64 78 5d 2c 20 30 78 66 30 30 30 20  rt_idx], 0xf000 
1b060 7c 20 63 65 72 74 5f 69 64 78 2c 20 26 69 64 65  | cert_idx, &ide
1b070 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e  ntities[id_idx].
1b080 61 74 74 72 69 62 75 74 65 73 5f 63 6f 75 6e 74  attributes_count
1b090 29 3b 0a 09 09 69 64 5f 69 64 78 2b 2b 3b 0a 0a  );...id_idx++;..
1b0a0 09 09 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f  ..identities[id_
1b0b0 69 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69  idx].pcsc_identi
1b0c0 74 79 20 3d 20 4e 55 4c 4c 3b 0a 09 09 69 64 65  ty = NULL;...ide
1b0d0 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e  ntities[id_idx].
1b0e0 61 74 74 72 69 62 75 74 65 73 20 3d 20 63 61 63  attributes = cac
1b0f0 6b 65 79 5f 67 65 74 5f 61 74 74 72 69 62 75 74  key_get_attribut
1b100 65 73 28 43 4b 4f 5f 50 55 42 4c 49 43 5f 4b 45  es(CKO_PUBLIC_KE
1b110 59 2c 20 26 65 78 74 72 61 5f 63 65 72 74 73 5b  Y, &extra_certs[
1b120 63 65 72 74 5f 69 64 78 5d 2c 20 30 78 66 30 30  cert_idx], 0xf00
1b130 30 20 7c 20 63 65 72 74 5f 69 64 78 2c 20 26 69  0 | cert_idx, &i
1b140 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78  dentities[id_idx
1b150 5d 2e 61 74 74 72 69 62 75 74 65 73 5f 63 6f 75  ].attributes_cou
1b160 6e 74 29 3b 0a 09 09 69 64 5f 69 64 78 2b 2b 3b  nt);...id_idx++;
1b170 0a 0a 09 09 69 64 65 6e 74 69 74 69 65 73 5b 69  ....identities[i
1b180 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e  d_idx].pcsc_iden
1b190 74 69 74 79 20 3d 20 4e 55 4c 4c 3b 0a 09 09 69  tity = NULL;...i
1b1a0 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78  dentities[id_idx
1b1b0 5d 2e 61 74 74 72 69 62 75 74 65 73 20 3d 20 63  ].attributes = c
1b1c0 61 63 6b 65 79 5f 67 65 74 5f 61 74 74 72 69 62  ackey_get_attrib
1b1d0 75 74 65 73 28 43 4b 4f 5f 4e 45 54 53 43 41 50  utes(CKO_NETSCAP
1b1e0 45 5f 54 52 55 53 54 2c 20 26 65 78 74 72 61 5f  E_TRUST, &extra_
1b1f0 63 65 72 74 73 5b 63 65 72 74 5f 69 64 78 5d 2c  certs[cert_idx],
1b200 20 30 78 66 30 30 30 20 7c 20 63 65 72 74 5f 69   0xf000 | cert_i
1b210 64 78 2c 20 26 69 64 65 6e 74 69 74 69 65 73 5b  dx, &identities[
1b220 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74  id_idx].attribut
1b230 65 73 5f 63 6f 75 6e 74 29 3b 0a 09 09 69 64 5f  es_count);...id_
1b240 69 64 78 2b 2b 3b 0a 09 7d 0a 0a 09 72 65 74 75  idx++;..}...retu
1b250 72 6e 28 69 64 5f 69 64 78 29 3b 0a 7d 0a 0a 73  rn(id_idx);.}..s
1b260 74 61 74 69 63 20 73 74 72 75 63 74 20 63 61 63  tatic struct cac
1b270 6b 65 79 5f 69 64 65 6e 74 69 74 79 20 2a 63 61  key_identity *ca
1b280 63 6b 65 79 5f 72 65 61 64 5f 69 64 65 6e 74 69  ckey_read_identi
1b290 74 69 65 73 28 73 74 72 75 63 74 20 63 61 63 6b  ties(struct cack
1b2a0 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75  ey_slot *slot, u
1b2b0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 2a 69 64  nsigned long *id
1b2c0 73 5f 66 6f 75 6e 64 29 20 7b 0a 09 73 74 72 75  s_found) {..stru
1b2d0 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69  ct cackey_pcsc_i
1b2e0 64 65 6e 74 69 74 79 20 2a 70 63 73 63 5f 69 64  dentity *pcsc_id
1b2f0 65 6e 74 69 74 69 65 73 3b 0a 09 73 74 72 75 63  entities;..struc
1b300 74 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 74  t cackey_identit
1b310 79 20 2a 69 64 65 6e 74 69 74 69 65 73 3b 0a 09  y *identities;..
1b320 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6e 75  unsigned long nu
1b330 6d 5f 69 64 73 2c 20 69 64 5f 69 64 78 2c 20 63  m_ids, id_idx, c
1b340 75 72 72 5f 69 64 5f 74 79 70 65 3b 0a 09 75 6e  urr_id_type;..un
1b350 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6e 75 6d 5f  signed long num_
1b360 63 65 72 74 73 2c 20 6e 75 6d 5f 64 6f 64 5f 63  certs, num_dod_c
1b370 65 72 74 73 2c 20 63 65 72 74 5f 69 64 78 3b 0a  erts, cert_idx;.
1b380 09 69 6e 74 20 69 6e 63 6c 75 64 65 5f 65 78 74  .int include_ext
1b390 72 61 5f 63 65 72 74 73 20 3d 20 30 2c 20 69 6e  ra_certs = 0, in
1b3a0 63 6c 75 64 65 5f 64 6f 64 5f 63 65 72 74 73 3b  clude_dod_certs;
1b3b0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1b3c0 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
1b3d0 29 3b 0a 0a 09 69 66 20 28 69 64 73 5f 66 6f 75  );...if (ids_fou
1b3e0 6e 64 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  nd == NULL) {...
1b3f0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1b400 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 69 64 73  NTF("Error.  ids
1b410 5f 66 6f 75 6e 64 20 69 73 20 4e 55 4c 4c 22 29  _found is NULL")
1b420 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c  ;....return(NULL
1b430 29 3b 0a 09 7d 0a 0a 23 69 66 64 65 66 20 43 41  );..}..#ifdef CA
1b440 43 4b 45 59 5f 43 41 52 44 5f 53 4c 4f 54 5f 49  CKEY_CARD_SLOT_I
1b450 4e 43 4c 55 44 45 5f 45 58 54 52 41 5f 43 45 52  NCLUDE_EXTRA_CER
1b460 54 53 0a 09 69 6e 63 6c 75 64 65 5f 65 78 74 72  TS..include_extr
1b470 61 5f 63 65 72 74 73 20 3d 20 31 3b 0a 23 65 6e  a_certs = 1;.#en
1b480 64 69 66 0a 0a 09 69 66 20 28 67 65 74 65 6e 76  dif...if (getenv
1b490 28 22 43 41 43 4b 45 59 5f 44 4f 44 5f 43 45 52  ("CACKEY_DOD_CER
1b4a0 54 53 5f 4f 4e 5f 48 57 5f 53 4c 4f 54 53 22 29  TS_ON_HW_SLOTS")
1b4b0 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 69 6e   != NULL) {...in
1b4c0 63 6c 75 64 65 5f 65 78 74 72 61 5f 63 65 72 74  clude_extra_cert
1b4d0 73 20 3d 20 31 3b 0a 09 7d 0a 0a 09 69 66 20 28  s = 1;..}...if (
1b4e0 67 65 74 65 6e 76 28 22 43 41 43 4b 45 59 5f 4e  getenv("CACKEY_N
1b4f0 4f 5f 44 4f 44 5f 43 45 52 54 53 5f 4f 4e 5f 48  O_DOD_CERTS_ON_H
1b500 57 5f 53 4c 4f 54 53 22 29 20 21 3d 20 4e 55 4c  W_SLOTS") != NUL
1b510 4c 29 20 7b 0a 09 09 69 6e 63 6c 75 64 65 5f 65  L) {...include_e
1b520 78 74 72 61 5f 63 65 72 74 73 20 3d 20 30 3b 0a  xtra_certs = 0;.
1b530 09 7d 0a 0a 23 69 66 64 65 66 20 43 41 43 4b 45  .}..#ifdef CACKE
1b540 59 5f 4e 4f 5f 45 58 54 52 41 5f 43 45 52 54 53  Y_NO_EXTRA_CERTS
1b550 0a 09 69 66 20 28 67 65 74 65 6e 76 28 22 43 41  ..if (getenv("CA
1b560 43 4b 45 59 5f 45 58 54 52 41 5f 43 45 52 54 53  CKEY_EXTRA_CERTS
1b570 22 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  ") != NULL) {...
1b580 69 6e 63 6c 75 64 65 5f 64 6f 64 5f 63 65 72 74  include_dod_cert
1b590 73 20 3d 20 31 3b 0a 09 7d 20 65 6c 73 65 20 7b  s = 1;..} else {
1b5a0 0a 09 09 69 6e 63 6c 75 64 65 5f 64 6f 64 5f 63  ...include_dod_c
1b5b0 65 72 74 73 20 3d 20 30 3b 0a 09 7d 0a 23 65 6c  erts = 0;..}.#el
1b5c0 73 65 0a 09 69 66 20 28 67 65 74 65 6e 76 28 22  se..if (getenv("
1b5d0 43 41 43 4b 45 59 5f 4e 4f 5f 45 58 54 52 41 5f  CACKEY_NO_EXTRA_
1b5e0 43 45 52 54 53 22 29 20 21 3d 20 4e 55 4c 4c 29  CERTS") != NULL)
1b5f0 20 7b 0a 09 09 69 6e 63 6c 75 64 65 5f 64 6f 64   {...include_dod
1b600 5f 63 65 72 74 73 20 3d 20 30 3b 0a 09 7d 20 65  _certs = 0;..} e
1b610 6c 73 65 20 7b 0a 09 09 69 6e 63 6c 75 64 65 5f  lse {...include_
1b620 64 6f 64 5f 63 65 72 74 73 20 3d 20 31 3b 0a 09  dod_certs = 1;..
1b630 7d 0a 23 65 6e 64 69 66 0a 0a 09 69 66 20 28 69  }.#endif...if (i
1b640 6e 63 6c 75 64 65 5f 64 6f 64 5f 63 65 72 74 73  nclude_dod_certs
1b650 29 20 7b 0a 09 09 6e 75 6d 5f 64 6f 64 5f 63 65  ) {...num_dod_ce
1b660 72 74 73 20 3d 20 73 69 7a 65 6f 66 28 65 78 74  rts = sizeof(ext
1b670 72 61 5f 63 65 72 74 73 29 20 2f 20 73 69 7a 65  ra_certs) / size
1b680 6f 66 28 65 78 74 72 61 5f 63 65 72 74 73 5b 30  of(extra_certs[0
1b690 5d 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09  ]);..} else {...
1b6a0 6e 75 6d 5f 64 6f 64 5f 63 65 72 74 73 20 3d 20  num_dod_certs = 
1b6b0 30 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74  0;..}...if (slot
1b6c0 2d 3e 69 6e 74 65 72 6e 61 6c 29 20 7b 0a 09 09  ->internal) {...
1b6d0 6e 75 6d 5f 69 64 73 20 3d 20 63 61 63 6b 65 79  num_ids = cackey
1b6e0 5f 72 65 61 64 5f 64 6f 64 5f 69 64 65 6e 74 69  _read_dod_identi
1b6f0 74 69 65 73 28 4e 55 4c 4c 2c 20 6e 75 6d 5f 64  ties(NULL, num_d
1b700 6f 64 5f 63 65 72 74 73 29 3b 0a 0a 09 09 69 66  od_certs);....if
1b710 20 28 6e 75 6d 5f 69 64 73 20 21 3d 20 30 29 20   (num_ids != 0) 
1b720 7b 0a 09 09 09 69 64 65 6e 74 69 74 69 65 73 20  {....identities 
1b730 3d 20 6d 61 6c 6c 6f 63 28 6e 75 6d 5f 69 64 73  = malloc(num_ids
1b740 20 2a 20 73 69 7a 65 6f 66 28 2a 69 64 65 6e 74   * sizeof(*ident
1b750 69 74 69 65 73 29 29 3b 0a 0a 09 09 09 63 61 63  ities));.....cac
1b760 6b 65 79 5f 72 65 61 64 5f 64 6f 64 5f 69 64 65  key_read_dod_ide
1b770 6e 74 69 74 69 65 73 28 69 64 65 6e 74 69 74 69  ntities(identiti
1b780 65 73 2c 20 6e 75 6d 5f 64 6f 64 5f 63 65 72 74  es, num_dod_cert
1b790 73 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09  s);...} else {..
1b7a0 09 09 69 64 65 6e 74 69 74 69 65 73 20 3d 20 4e  ..identities = N
1b7b0 55 4c 4c 3b 0a 09 09 7d 0a 0a 09 09 2a 69 64 73  ULL;...}....*ids
1b7c0 5f 66 6f 75 6e 64 20 3d 20 6e 75 6d 5f 69 64 73  _found = num_ids
1b7d0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 69 64 65 6e  ;....return(iden
1b7e0 74 69 74 69 65 73 29 3b 0a 09 7d 0a 0a 09 70 63  tities);..}...pc
1b7f0 73 63 5f 69 64 65 6e 74 69 74 69 65 73 20 3d 20  sc_identities = 
1b800 63 61 63 6b 65 79 5f 72 65 61 64 5f 63 65 72 74  cackey_read_cert
1b810 73 28 73 6c 6f 74 2c 20 4e 55 4c 4c 2c 20 26 6e  s(slot, NULL, &n
1b820 75 6d 5f 63 65 72 74 73 29 3b 0a 09 69 66 20 28  um_certs);..if (
1b830 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 20  pcsc_identities 
1b840 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 2f 2a 20  != NULL) {.../* 
1b850 43 6f 6e 76 65 72 74 20 6e 75 6d 62 65 72 20 6f  Convert number o
1b860 66 20 43 65 72 74 73 20 74 6f 20 6e 75 6d 62 65  f Certs to numbe
1b870 72 20 6f 66 20 6f 62 6a 65 63 74 73 20 2a 2f 0a  r of objects */.
1b880 09 09 6e 75 6d 5f 69 64 73 20 3d 20 28 43 4b 4f  ..num_ids = (CKO
1b890 5f 50 52 49 56 41 54 45 5f 4b 45 59 20 2d 20 43  _PRIVATE_KEY - C
1b8a0 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 45 20 2b  KO_CERTIFICATE +
1b8b0 20 31 29 20 2a 20 6e 75 6d 5f 63 65 72 74 73 3b   1) * num_certs;
1b8c0 0a 0a 09 09 69 66 20 28 69 6e 63 6c 75 64 65 5f  ....if (include_
1b8d0 65 78 74 72 61 5f 63 65 72 74 73 29 20 7b 0a 09  extra_certs) {..
1b8e0 09 09 6e 75 6d 5f 69 64 73 20 2b 3d 20 63 61 63  ..num_ids += cac
1b8f0 6b 65 79 5f 72 65 61 64 5f 64 6f 64 5f 69 64 65  key_read_dod_ide
1b900 6e 74 69 74 69 65 73 28 4e 55 4c 4c 2c 20 6e 75  ntities(NULL, nu
1b910 6d 5f 64 6f 64 5f 63 65 72 74 73 29 3b 0a 09 09  m_dod_certs);...
1b920 7d 0a 0a 09 09 69 64 65 6e 74 69 74 69 65 73 20  }....identities 
1b930 3d 20 6d 61 6c 6c 6f 63 28 6e 75 6d 5f 69 64 73  = malloc(num_ids
1b940 20 2a 20 73 69 7a 65 6f 66 28 2a 69 64 65 6e 74   * sizeof(*ident
1b950 69 74 69 65 73 29 29 3b 0a 0a 09 09 2f 2a 20 41  ities));..../* A
1b960 64 64 20 63 65 72 74 69 66 69 63 61 74 65 73 2c  dd certificates,
1b970 20 70 75 62 6c 69 63 20 6b 65 79 73 2c 20 61 6e   public keys, an
1b980 64 20 70 72 69 76 61 74 65 20 6b 65 79 73 20 66  d private keys f
1b990 72 6f 6d 20 74 68 65 20 73 6d 61 72 74 63 61 72  rom the smartcar
1b9a0 64 20 2a 2f 0a 09 09 69 64 5f 69 64 78 20 3d 20  d */...id_idx = 
1b9b0 30 3b 0a 09 09 66 6f 72 20 28 63 65 72 74 5f 69  0;...for (cert_i
1b9c0 64 78 20 3d 20 30 3b 20 63 65 72 74 5f 69 64 78  dx = 0; cert_idx
1b9d0 20 3c 20 6e 75 6d 5f 63 65 72 74 73 3b 20 63 65   < num_certs; ce
1b9e0 72 74 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 09 66  rt_idx++) {....f
1b9f0 6f 72 20 28 63 75 72 72 5f 69 64 5f 74 79 70 65  or (curr_id_type
1ba00 20 3d 20 43 4b 4f 5f 43 45 52 54 49 46 49 43 41   = CKO_CERTIFICA
1ba10 54 45 3b 20 63 75 72 72 5f 69 64 5f 74 79 70 65  TE; curr_id_type
1ba20 20 3c 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f   <= CKO_PRIVATE_
1ba30 4b 45 59 3b 20 63 75 72 72 5f 69 64 5f 74 79 70  KEY; curr_id_typ
1ba40 65 2b 2b 29 20 7b 0a 09 09 09 09 69 64 65 6e 74  e++) {.....ident
1ba50 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74  ities[id_idx].at
1ba60 74 72 69 62 75 74 65 73 20 3d 20 63 61 63 6b 65  tributes = cacke
1ba70 79 5f 67 65 74 5f 61 74 74 72 69 62 75 74 65 73  y_get_attributes
1ba80 28 63 75 72 72 5f 69 64 5f 74 79 70 65 2c 20 26  (curr_id_type, &
1ba90 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 5b  pcsc_identities[
1baa0 63 65 72 74 5f 69 64 78 5d 2c 20 63 65 72 74 5f  cert_idx], cert_
1bab0 69 64 78 2c 20 26 69 64 65 6e 74 69 74 69 65 73  idx, &identities
1bac0 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75  [id_idx].attribu
1bad0 74 65 73 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09 09  tes_count);.....
1bae0 09 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69  .identities[id_i
1baf0 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69 74  dx].pcsc_identit
1bb00 79 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f  y = malloc(sizeo
1bb10 66 28 2a 69 64 65 6e 74 69 74 69 65 73 5b 69 64  f(*identities[id
1bb20 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e 74  _idx].pcsc_ident
1bb30 69 74 79 29 29 3b 0a 09 09 09 09 6d 65 6d 63 70  ity));.....memcp
1bb40 79 28 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f  y(identities[id_
1bb50 69 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69  idx].pcsc_identi
1bb60 74 79 2c 20 26 70 63 73 63 5f 69 64 65 6e 74 69  ty, &pcsc_identi
1bb70 74 69 65 73 5b 63 65 72 74 5f 69 64 78 5d 2c 20  ties[cert_idx], 
1bb80 73 69 7a 65 6f 66 28 2a 69 64 65 6e 74 69 74 69  sizeof(*identiti
1bb90 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f  es[id_idx].pcsc_
1bba0 69 64 65 6e 74 69 74 79 29 29 3b 0a 0a 09 09 09  identity));.....
1bbb0 09 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69  .identities[id_i
1bbc0 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69 74  dx].pcsc_identit
1bbd0 79 2d 3e 63 65 72 74 69 66 69 63 61 74 65 20 3d  y->certificate =
1bbe0 20 6d 61 6c 6c 6f 63 28 70 63 73 63 5f 69 64 65   malloc(pcsc_ide
1bbf0 6e 74 69 74 69 65 73 5b 63 65 72 74 5f 69 64 78  ntities[cert_idx
1bc00 5d 2e 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65  ].certificate_le
1bc10 6e 29 3b 0a 09 09 09 09 6d 65 6d 63 70 79 28 69  n);.....memcpy(i
1bc20 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78  dentities[id_idx
1bc30 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d  ].pcsc_identity-
1bc40 3e 63 65 72 74 69 66 69 63 61 74 65 2c 20 70 63  >certificate, pc
1bc50 73 63 5f 69 64 65 6e 74 69 74 69 65 73 5b 63 65  sc_identities[ce
1bc60 72 74 5f 69 64 78 5d 2e 63 65 72 74 69 66 69 63  rt_idx].certific
1bc70 61 74 65 2c 20 70 63 73 63 5f 69 64 65 6e 74 69  ate, pcsc_identi
1bc80 74 69 65 73 5b 63 65 72 74 5f 69 64 78 5d 2e 63  ties[cert_idx].c
1bc90 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b  ertificate_len);
1bca0 0a 0a 09 09 09 09 69 64 5f 69 64 78 2b 2b 3b 0a  ......id_idx++;.
1bcb0 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 69 66 20 28  ...}...}....if (
1bcc0 69 6e 63 6c 75 64 65 5f 65 78 74 72 61 5f 63 65  include_extra_ce
1bcd0 72 74 73 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  rts) {....CACKEY
1bce0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 49  _DEBUG_PRINTF("I
1bcf0 6e 63 6c 75 64 69 6e 67 20 55 53 20 47 6f 76 65  ncluding US Gove
1bd00 72 6e 6d 65 6e 74 20 43 65 72 74 69 66 69 63 61  rnment Certifica
1bd10 74 65 73 20 6f 6e 20 68 61 72 64 77 61 72 65 20  tes on hardware 
1bd20 73 6c 6f 74 22 29 3b 0a 0a 09 09 09 63 61 63 6b  slot");.....cack
1bd30 65 79 5f 72 65 61 64 5f 64 6f 64 5f 69 64 65 6e  ey_read_dod_iden
1bd40 74 69 74 69 65 73 28 69 64 65 6e 74 69 74 69 65  tities(identitie
1bd50 73 20 2b 20 69 64 5f 69 64 78 2c 20 6e 75 6d 5f  s + id_idx, num_
1bd60 64 6f 64 5f 63 65 72 74 73 29 3b 0a 09 09 7d 0a  dod_certs);...}.
1bd70 0a 09 09 63 61 63 6b 65 79 5f 66 72 65 65 5f 63  ...cackey_free_c
1bd80 65 72 74 73 28 70 63 73 63 5f 69 64 65 6e 74 69  erts(pcsc_identi
1bd90 74 69 65 73 2c 20 6e 75 6d 5f 63 65 72 74 73 2c  ties, num_certs,
1bda0 20 31 29 3b 0a 0a 09 09 2a 69 64 73 5f 66 6f 75   1);....*ids_fou
1bdb0 6e 64 20 3d 20 6e 75 6d 5f 69 64 73 3b 0a 0a 09  nd = num_ids;...
1bdc0 09 72 65 74 75 72 6e 28 69 64 65 6e 74 69 74 69  .return(identiti
1bdd0 65 73 29 3b 0a 09 7d 0a 0a 0a 09 2a 69 64 73 5f  es);..}....*ids_
1bde0 66 6f 75 6e 64 20 3d 20 30 3b 0a 09 72 65 74 75  found = 0;..retu
1bdf0 72 6e 28 4e 55 4c 4c 29 3b 0a 7d 0a 0a 43 4b 5f  rn(NULL);.}..CK_
1be00 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
1be10 43 4b 5f 52 56 2c 20 43 5f 49 6e 69 74 69 61 6c  CK_RV, C_Initial
1be20 69 7a 65 29 28 43 4b 5f 56 4f 49 44 5f 50 54 52  ize)(CK_VOID_PTR
1be30 20 70 49 6e 69 74 41 72 67 73 29 20 7b 0a 09 43   pInitArgs) {..C
1be40 4b 5f 43 5f 49 4e 49 54 49 41 4c 49 5a 45 5f 41  K_C_INITIALIZE_A
1be50 52 47 53 20 43 4b 5f 50 54 52 20 61 72 67 73 3b  RGS CK_PTR args;
1be60 0a 09 75 69 6e 74 33 32 5f 74 20 69 64 78 2c 20  ..uint32_t idx, 
1be70 68 69 67 68 65 73 74 5f 73 6c 6f 74 3b 0a 09 69  highest_slot;..i
1be80 6e 74 20 6d 75 74 65 78 5f 69 6e 69 74 5f 72 65  nt mutex_init_re
1be90 74 3b 0a 09 69 6e 74 20 69 6e 63 6c 75 64 65 5f  t;..int include_
1bea0 64 6f 64 5f 63 65 72 74 73 3b 0a 0a 09 43 41 43  dod_certs;...CAC
1beb0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1bec0 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
1bed0 66 20 28 63 61 63 6b 65 79 5f 69 6e 69 74 69 61  f (cackey_initia
1bee0 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
1bef0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1bf00 45 72 72 6f 72 2e 20 20 41 6c 72 65 61 64 79 20  Error.  Already 
1bf10 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
1bf20 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
1bf30 59 50 54 4f 4b 49 5f 41 4c 52 45 41 44 59 5f 49  YPTOKI_ALREADY_I
1bf40 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
1bf50 0a 09 69 66 20 28 70 49 6e 69 74 41 72 67 73 20  ..if (pInitArgs 
1bf60 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 61 72 67  != NULL) {...arg
1bf70 73 20 3d 20 70 49 6e 69 74 41 72 67 73 3b 0a 09  s = pInitArgs;..
1bf80 09 6d 65 6d 63 70 79 28 26 63 61 63 6b 65 79 5f  .memcpy(&cackey_
1bf90 61 72 67 73 2c 20 61 72 67 73 2c 20 73 69 7a 65  args, args, size
1bfa0 6f 66 28 63 61 63 6b 65 79 5f 61 72 67 73 29 29  of(cackey_args))
1bfb0 3b 0a 0a 09 09 69 66 20 28 61 72 67 73 2d 3e 43  ;....if (args->C
1bfc0 72 65 61 74 65 4d 75 74 65 78 20 3d 3d 20 4e 55  reateMutex == NU
1bfd0 4c 4c 20 7c 7c 20 61 72 67 73 2d 3e 44 65 73 74  LL || args->Dest
1bfe0 72 6f 79 4d 75 74 65 78 20 3d 3d 20 4e 55 4c 4c  royMutex == NULL
1bff0 20 7c 7c 20 61 72 67 73 2d 3e 4c 6f 63 6b 4d 75   || args->LockMu
1c000 74 65 78 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61  tex == NULL || a
1c010 72 67 73 2d 3e 55 6e 6c 6f 63 6b 4d 75 74 65 78  rgs->UnlockMutex
1c020 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 69   == NULL) {....i
1c030 66 20 28 61 72 67 73 2d 3e 43 72 65 61 74 65 4d  f (args->CreateM
1c040 75 74 65 78 20 21 3d 20 4e 55 4c 4c 20 7c 7c 20  utex != NULL || 
1c050 61 72 67 73 2d 3e 44 65 73 74 72 6f 79 4d 75 74  args->DestroyMut
1c060 65 78 20 21 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72  ex != NULL || ar
1c070 67 73 2d 3e 4c 6f 63 6b 4d 75 74 65 78 20 21 3d  gs->LockMutex !=
1c080 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 73 2d 3e 55   NULL || args->U
1c090 6e 6c 6f 63 6b 4d 75 74 65 78 20 21 3d 20 4e 55  nlockMutex != NU
1c0a0 4c 4c 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59  LL) {.....CACKEY
1c0b0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1c0c0 72 72 6f 72 2e 20 53 6f 6d 65 2c 20 62 75 74 20  rror. Some, but 
1c0d0 6e 6f 74 20 41 6c 6c 20 74 68 72 65 61 64 69 6e  not All threadin
1c0e0 67 20 70 72 69 6d 69 74 69 76 65 73 20 70 72 6f  g primitives pro
1c0f0 76 69 64 65 64 2e 22 29 3b 0a 0a 09 09 09 09 72  vided.");......r
1c100 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45  eturn(CKR_ARGUME
1c110 4e 54 53 5f 42 41 44 29 3b 0a 09 09 09 7d 0a 09  NTS_BAD);....}..
1c120 09 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 63  .}..} else {...c
1c130 61 63 6b 65 79 5f 61 72 67 73 2e 43 72 65 61 74  ackey_args.Creat
1c140 65 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 09  eMutex = NULL;..
1c150 09 63 61 63 6b 65 79 5f 61 72 67 73 2e 44 65 73  .cackey_args.Des
1c160 74 72 6f 79 4d 75 74 65 78 20 3d 20 4e 55 4c 4c  troyMutex = NULL
1c170 3b 0a 09 09 63 61 63 6b 65 79 5f 61 72 67 73 2e  ;...cackey_args.
1c180 4c 6f 63 6b 4d 75 74 65 78 20 3d 20 4e 55 4c 4c  LockMutex = NULL
1c190 3b 0a 09 09 63 61 63 6b 65 79 5f 61 72 67 73 2e  ;...cackey_args.
1c1a0 55 6e 6c 6f 63 6b 4d 75 74 65 78 20 3d 20 4e 55  UnlockMutex = NU
1c1b0 4c 4c 3b 0a 09 09 63 61 63 6b 65 79 5f 61 72 67  LL;...cackey_arg
1c1c0 73 2e 66 6c 61 67 73 20 3d 20 30 3b 0a 09 7d 0a  s.flags = 0;..}.
1c1d0 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20  ..for (idx = 0; 
1c1e0 69 64 78 20 3c 20 28 73 69 7a 65 6f 66 28 63 61  idx < (sizeof(ca
1c1f0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f  ckey_sessions) /
1c200 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73   sizeof(cackey_s
1c210 65 73 73 69 6f 6e 73 5b 30 5d 29 29 3b 20 69 64  essions[0])); id
1c220 78 2b 2b 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  x++) {...cackey_
1c230 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 61 63  sessions[idx].ac
1c240 74 69 76 65 20 3d 20 30 3b 0a 09 7d 0a 0a 09 66  tive = 0;..}...f
1c250 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78  or (idx = 0; idx
1c260 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65   < (sizeof(cacke
1c270 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f  y_slots) / sizeo
1c280 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30  f(cackey_slots[0
1c290 5d 29 29 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09  ])); idx++) {...
1c2a0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78  cackey_slots[idx
1c2b0 5d 2e 61 63 74 69 76 65 20 3d 20 30 3b 0a 09 09  ].active = 0;...
1c2c0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78  cackey_slots[idx
1c2d0 5d 2e 70 63 73 63 5f 72 65 61 64 65 72 20 3d 20  ].pcsc_reader = 
1c2e0 4e 55 4c 4c 3b 0a 09 09 63 61 63 6b 65 79 5f 73  NULL;...cackey_s
1c2f0 6c 6f 74 73 5b 69 64 78 5d 2e 74 72 61 6e 73 61  lots[idx].transa
1c300 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d 20 30 3b  ction_depth = 0;
1c310 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ...cackey_slots[
1c320 69 64 78 5d 2e 74 72 61 6e 73 61 63 74 69 6f 6e  idx].transaction
1c330 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b 20 3d 20  _need_hw_lock = 
1c340 30 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  0;...cackey_slot
1c350 73 5b 69 64 78 5d 2e 73 6c 6f 74 5f 72 65 73 65  s[idx].slot_rese
1c360 74 20 3d 20 30 3b 0a 09 09 63 61 63 6b 65 79 5f  t = 0;...cackey_
1c370 73 6c 6f 74 73 5b 69 64 78 5d 2e 74 6f 6b 65 6e  slots[idx].token
1c380 5f 66 6c 61 67 73 20 3d 20 30 3b 0a 09 09 63 61  _flags = 0;...ca
1c390 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e  ckey_slots[idx].
1c3a0 6c 61 62 65 6c 20 3d 20 4e 55 4c 4c 3b 0a 09 09  label = NULL;...
1c3b0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78  cackey_slots[idx
1c3c0 5d 2e 69 6e 74 65 72 6e 61 6c 20 3d 20 30 3b 0a  ].internal = 0;.
1c3d0 09 7d 0a 0a 23 69 66 64 65 66 20 43 41 43 4b 45  .}..#ifdef CACKE
1c3e0 59 5f 4e 4f 5f 45 58 54 52 41 5f 43 45 52 54 53  Y_NO_EXTRA_CERTS
1c3f0 0a 09 69 66 20 28 67 65 74 65 6e 76 28 22 43 41  ..if (getenv("CA
1c400 43 4b 45 59 5f 45 58 54 52 41 5f 43 45 52 54 53  CKEY_EXTRA_CERTS
1c410 22 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  ") != NULL) {...
1c420 69 6e 63 6c 75 64 65 5f 64 6f 64 5f 63 65 72 74  include_dod_cert
1c430 73 20 3d 20 31 3b 0a 09 7d 20 65 6c 73 65 20 7b  s = 1;..} else {
1c440 0a 09 09 69 6e 63 6c 75 64 65 5f 64 6f 64 5f 63  ...include_dod_c
1c450 65 72 74 73 20 3d 20 30 3b 0a 09 7d 0a 23 65 6c  erts = 0;..}.#el
1c460 73 65 0a 09 69 66 20 28 67 65 74 65 6e 76 28 22  se..if (getenv("
1c470 43 41 43 4b 45 59 5f 4e 4f 5f 45 58 54 52 41 5f  CACKEY_NO_EXTRA_
1c480 43 45 52 54 53 22 29 20 21 3d 20 4e 55 4c 4c 29  CERTS") != NULL)
1c490 20 7b 0a 09 09 69 6e 63 6c 75 64 65 5f 64 6f 64   {...include_dod
1c4a0 5f 63 65 72 74 73 20 3d 20 30 3b 0a 09 7d 20 65  _certs = 0;..} e
1c4b0 6c 73 65 20 7b 0a 09 09 69 6e 63 6c 75 64 65 5f  lse {...include_
1c4c0 64 6f 64 5f 63 65 72 74 73 20 3d 20 31 3b 0a 09  dod_certs = 1;..
1c4d0 7d 0a 23 65 6e 64 69 66 0a 0a 09 69 66 20 28 69  }.#endif...if (i
1c4e0 6e 63 6c 75 64 65 5f 64 6f 64 5f 63 65 72 74 73  nclude_dod_certs
1c4f0 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   == 0) {...CACKE
1c500 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1c510 41 73 6b 65 64 20 6e 6f 74 20 74 6f 20 69 6e 63  Asked not to inc
1c520 6c 75 64 65 20 44 6f 44 20 63 65 72 74 69 66 69  lude DoD certifi
1c530 63 61 74 65 73 22 29 3b 0a 09 7d 20 65 6c 73 65  cates");..} else
1c540 20 7b 0a 09 09 68 69 67 68 65 73 74 5f 73 6c 6f   {...highest_slo
1c550 74 20 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b  t = (sizeof(cack
1c560 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65  ey_slots) / size
1c570 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  of(cackey_slots[
1c580 30 5d 29 29 20 2d 20 31 3b 0a 0a 09 09 43 41 43  0])) - 1;....CAC
1c590 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1c5a0 28 22 49 6e 63 6c 75 64 69 6e 67 20 44 6f 44 20  ("Including DoD 
1c5b0 63 65 72 74 73 20 69 6e 20 73 6c 6f 74 20 25 6c  certs in slot %l
1c5c0 75 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  u", (unsigned lo
1c5d0 6e 67 29 20 68 69 67 68 65 73 74 5f 73 6c 6f 74  ng) highest_slot
1c5e0 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f  );....cackey_slo
1c5f0 74 73 5b 68 69 67 68 65 73 74 5f 73 6c 6f 74 5d  ts[highest_slot]
1c600 2e 61 63 74 69 76 65 20 3d 20 31 3b 0a 09 09 63  .active = 1;...c
1c610 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 68 69 67 68  ackey_slots[high
1c620 65 73 74 5f 73 6c 6f 74 5d 2e 69 6e 74 65 72 6e  est_slot].intern
1c630 61 6c 20 3d 20 31 3b 0a 09 09 63 61 63 6b 65 79  al = 1;...cackey
1c640 5f 73 6c 6f 74 73 5b 68 69 67 68 65 73 74 5f 73  _slots[highest_s
1c650 6c 6f 74 5d 2e 6c 61 62 65 6c 20 3d 20 28 75 6e  lot].label = (un
1c660 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 22  signed char *) "
1c670 55 53 20 47 6f 76 65 72 6e 6d 65 6e 74 20 43 65  US Government Ce
1c680 72 74 69 66 69 63 61 74 65 73 22 3b 0a 09 09 63  rtificates";...c
1c690 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 68 69 67 68  ackey_slots[high
1c6a0 65 73 74 5f 73 6c 6f 74 5d 2e 70 63 73 63 5f 72  est_slot].pcsc_r
1c6b0 65 61 64 65 72 20 3d 20 22 43 41 43 4b 65 79 22  eader = "CACKey"
1c6c0 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ;...cackey_slots
1c6d0 5b 68 69 67 68 65 73 74 5f 73 6c 6f 74 5d 2e 74  [highest_slot].t
1c6e0 6f 6b 65 6e 5f 66 6c 61 67 73 20 3d 20 30 3b 0a  oken_flags = 0;.
1c6f0 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 69 6e 69 74  .}...cackey_init
1c700 69 61 6c 69 7a 65 64 20 3d 20 31 3b 0a 0a 09 69  ialized = 1;...i
1c710 66 20 28 21 63 61 63 6b 65 79 5f 62 69 67 6c 6f  f (!cackey_biglo
1c720 63 6b 5f 69 6e 69 74 29 20 7b 0a 09 09 6d 75 74  ck_init) {...mut
1c730 65 78 5f 69 6e 69 74 5f 72 65 74 20 3d 20 63 61  ex_init_ret = ca
1c740 63 6b 65 79 5f 6d 75 74 65 78 5f 63 72 65 61 74  ckey_mutex_creat
1c750 65 28 26 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  e(&cackey_bigloc
1c760 6b 29 3b 0a 0a 09 09 69 66 20 28 6d 75 74 65 78  k);....if (mutex
1c770 5f 69 6e 69 74 5f 72 65 74 20 21 3d 20 30 29 20  _init_ret != 0) 
1c780 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
1c790 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1c7a0 20 20 4d 75 74 65 78 20 69 6e 69 74 69 61 6c 69    Mutex initiali
1c7b0 7a 61 74 69 6f 6e 20 66 61 69 6c 65 64 2e 22 29  zation failed.")
1c7c0 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 4b 52  ;.....return(CKR
1c7d0 5f 43 41 4e 54 5f 4c 4f 43 4b 29 3b 0a 09 09 7d  _CANT_LOCK);...}
1c7e0 0a 0a 09 09 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ....cackey_biglo
1c7f0 63 6b 5f 69 6e 69 74 20 3d 20 31 3b 0a 09 7d 0a  ck_init = 1;..}.
1c800 0a 09 2f 2a 20 44 65 66 69 6e 65 20 61 20 63 6f  ../* Define a co
1c810 6d 6d 61 6e 64 20 74 6f 20 70 72 6f 6d 70 74 20  mmand to prompt 
1c820 75 73 65 72 20 66 6f 72 20 61 20 50 49 4e 20 2a  user for a PIN *
1c830 2f 0a 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f  /.#ifdef CACKEY_
1c840 50 49 4e 5f 43 4f 4d 4d 41 4e 44 5f 44 45 46 41  PIN_COMMAND_DEFA
1c850 55 4c 54 0a 09 63 61 63 6b 65 79 5f 70 69 6e 5f  ULT..cackey_pin_
1c860 63 6f 6d 6d 61 6e 64 20 3d 20 43 41 43 4b 45 59  command = CACKEY
1c870 5f 50 49 4e 5f 43 4f 4d 4d 41 4e 44 5f 44 45 46  _PIN_COMMAND_DEF
1c880 41 55 4c 54 5f 58 53 54 52 28 43 41 43 4b 45 59  AULT_XSTR(CACKEY
1c890 5f 50 49 4e 5f 43 4f 4d 4d 41 4e 44 5f 44 45 46  _PIN_COMMAND_DEF
1c8a0 41 55 4c 54 29 3b 0a 23 65 6e 64 69 66 0a 0a 23  AULT);.#endif..#
1c8b0 69 66 64 65 66 20 43 41 43 4b 45 59 5f 50 49 4e  ifdef CACKEY_PIN
1c8c0 5f 43 4f 4d 4d 41 4e 44 5f 58 4f 4e 4c 59 5f 44  _COMMAND_XONLY_D
1c8d0 45 46 41 55 4c 54 0a 09 69 66 20 28 67 65 74 65  EFAULT..if (gete
1c8e0 6e 76 28 22 44 49 53 50 4c 41 59 22 29 20 21 3d  nv("DISPLAY") !=
1c8f0 20 4e 55 4c 4c 29 20 7b 0a 09 09 63 61 63 6b 65   NULL) {...cacke
1c900 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20 3d 20  y_pin_command = 
1c910 43 41 43 4b 45 59 5f 50 49 4e 5f 43 4f 4d 4d 41  CACKEY_PIN_COMMA
1c920 4e 44 5f 44 45 46 41 55 4c 54 5f 58 53 54 52 28  ND_DEFAULT_XSTR(
1c930 43 41 43 4b 45 59 5f 50 49 4e 5f 43 4f 4d 4d 41  CACKEY_PIN_COMMA
1c940 4e 44 5f 58 4f 4e 4c 59 5f 44 45 46 41 55 4c 54  ND_XONLY_DEFAULT
1c950 29 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a 0a 09 69  );..}.#endif...i
1c960 66 20 28 67 65 74 65 6e 76 28 22 43 41 43 4b 45  f (getenv("CACKE
1c970 59 5f 50 49 4e 5f 43 4f 4d 4d 41 4e 44 22 29 20  Y_PIN_COMMAND") 
1c980 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 63 61 63  != NULL) {...cac
1c990 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20  key_pin_command 
1c9a0 3d 20 67 65 74 65 6e 76 28 22 43 41 43 4b 45 59  = getenv("CACKEY
1c9b0 5f 50 49 4e 5f 43 4f 4d 4d 41 4e 44 22 29 3b 0a  _PIN_COMMAND");.
1c9c0 09 7d 0a 0a 09 69 66 20 28 67 65 74 65 6e 76 28  .}...if (getenv(
1c9d0 22 43 41 43 4b 45 59 5f 50 49 4e 5f 43 4f 4d 4d  "CACKEY_PIN_COMM
1c9e0 41 4e 44 5f 58 4f 4e 4c 59 22 29 20 21 3d 20 4e  AND_XONLY") != N
1c9f0 55 4c 4c 20 26 26 20 67 65 74 65 6e 76 28 22 44  ULL && getenv("D
1ca00 49 53 50 4c 41 59 22 29 20 21 3d 20 4e 55 4c 4c  ISPLAY") != NULL
1ca10 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 70 69 6e  ) {...cackey_pin
1ca20 5f 63 6f 6d 6d 61 6e 64 20 3d 20 67 65 74 65 6e  _command = geten
1ca30 76 28 22 43 41 43 4b 45 59 5f 50 49 4e 5f 43 4f  v("CACKEY_PIN_CO
1ca40 4d 4d 41 4e 44 5f 58 4f 4e 4c 59 22 29 3b 0a 09  MMAND_XONLY");..
1ca50 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
1ca60 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
1ca70 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c  ng CKR_OK (%i)",
1ca80 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75   CKR_OK);...retu
1ca90 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43  rn(CKR_OK);.}..C
1caa0 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
1cab0 4e 28 43 4b 5f 52 56 2c 20 43 5f 46 69 6e 61 6c  N(CK_RV, C_Final
1cac0 69 7a 65 29 28 43 4b 5f 56 4f 49 44 5f 50 54 52  ize)(CK_VOID_PTR
1cad0 20 70 52 65 73 65 72 76 65 64 29 20 7b 0a 09 75   pReserved) {..u
1cae0 69 6e 74 33 32 5f 74 20 69 64 78 3b 0a 0a 09 43  int32_t idx;...C
1caf0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1cb00 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
1cb10 09 69 66 20 28 70 52 65 73 65 72 76 65 64 20 21  .if (pReserved !
1cb20 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
1cb30 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1cb40 22 45 72 72 6f 72 2e 20 70 52 65 73 65 72 76 65  "Error. pReserve
1cb50 64 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 22 29  d is not NULL.")
1cb60 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
1cb70 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a  ARGUMENTS_BAD);.
1cb80 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  .}...if (!cackey
1cb90 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
1cba0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1cbb0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
1cbc0 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
1cbd0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1cbe0 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
1cbf0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
1cc00 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69  .for (idx = 0; i
1cc10 64 78 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63  dx < (sizeof(cac
1cc20 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20  key_sessions) / 
1cc30 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
1cc40 73 73 69 6f 6e 73 5b 30 5d 29 29 3b 20 69 64 78  ssions[0])); idx
1cc50 2b 2b 29 20 7b 0a 09 09 69 66 20 28 63 61 63 6b  ++) {...if (cack
1cc60 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d  ey_sessions[idx]
1cc70 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 09 43 5f  .active) {....C_
1cc80 43 6c 6f 73 65 53 65 73 73 69 6f 6e 28 69 64 78  CloseSession(idx
1cc90 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 63 61 63 6b  );...}..}...cack
1cca0 65 79 5f 73 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e  ey_slots_disconn
1ccb0 65 63 74 5f 61 6c 6c 28 29 3b 0a 0a 09 66 6f 72  ect_all();...for
1ccc0 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c   (idx = 0; idx <
1ccd0 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
1cce0 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28  slots) / sizeof(
1ccf0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29  cackey_slots[0])
1cd00 29 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66  ); idx++) {...if
1cd10 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69   (cackey_slots[i
1cd20 64 78 5d 2e 69 6e 74 65 72 6e 61 6c 29 20 7b 0a  dx].internal) {.
1cd30 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 7d  ...continue;...}
1cd40 0a 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73  ....if (cackey_s
1cd50 6c 6f 74 73 5b 69 64 78 5d 2e 70 63 73 63 5f 72  lots[idx].pcsc_r
1cd60 65 61 64 65 72 29 20 7b 0a 09 09 09 66 72 65 65  eader) {....free
1cd70 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64  (cackey_slots[id
1cd80 78 5d 2e 70 63 73 63 5f 72 65 61 64 65 72 29 3b  x].pcsc_reader);
1cd90 0a 09 09 7d 0a 0a 09 09 69 66 20 28 63 61 63 6b  ...}....if (cack
1cda0 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 63 61  ey_slots[idx].ca
1cdb0 63 68 65 64 5f 63 65 72 74 73 29 20 7b 0a 09 09  ched_certs) {...
1cdc0 09 63 61 63 6b 65 79 5f 66 72 65 65 5f 63 65 72  .cackey_free_cer
1cdd0 74 73 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ts(cackey_slots[
1cde0 69 64 78 5d 2e 63 61 63 68 65 64 5f 63 65 72 74  idx].cached_cert
1cdf0 73 2c 20 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  s, cackey_slots[
1ce00 69 64 78 5d 2e 63 61 63 68 65 64 5f 63 65 72 74  idx].cached_cert
1ce10 73 5f 63 6f 75 6e 74 2c 20 31 29 3b 0a 0a 09 09  s_count, 1);....
1ce20 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64  .cackey_slots[id
1ce30 78 5d 2e 63 61 63 68 65 64 5f 63 65 72 74 73 20  x].cached_certs 
1ce40 3d 20 4e 55 4c 4c 3b 0a 09 09 7d 0a 09 7d 0a 0a  = NULL;...}..}..
1ce50 09 63 61 63 6b 65 79 5f 70 63 73 63 5f 64 69 73  .cackey_pcsc_dis
1ce60 63 6f 6e 6e 65 63 74 28 29 3b 0a 0a 09 63 61 63  connect();...cac
1ce70 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 20  key_initialized 
1ce80 3d 20 30 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  = 0;...CACKEY_DE
1ce90 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
1cea0 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69  rning CKR_OK (%i
1ceb0 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72  )", CKR_OK);...r
1cec0 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d  eturn(CKR_OK);.}
1ced0 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
1cee0 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65  TION(CK_RV, C_Ge
1cef0 74 49 6e 66 6f 29 28 43 4b 5f 49 4e 46 4f 5f 50  tInfo)(CK_INFO_P
1cf00 54 52 20 70 49 6e 66 6f 29 20 7b 0a 09 73 74 61  TR pInfo) {..sta
1cf10 74 69 63 20 43 4b 5f 55 54 46 38 43 48 41 52 20  tic CK_UTF8CHAR 
1cf20 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 5b 5d  manufacturerID[]
1cf30 20 3d 20 22 55 2e 53 2e 20 47 6f 76 65 72 6e 6d   = "U.S. Governm
1cf40 65 6e 74 22 3b 0a 09 73 74 61 74 69 63 20 43 4b  ent";..static CK
1cf50 5f 55 54 46 38 43 48 41 52 20 6c 69 62 72 61 72  _UTF8CHAR librar
1cf60 79 44 65 73 63 72 69 70 74 69 6f 6e 5b 5d 20 3d  yDescription[] =
1cf70 20 22 43 41 43 4b 65 79 22 3b 0a 0a 09 43 41 43   "CACKey";...CAC
1cf80 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1cf90 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
1cfa0 66 20 28 70 49 6e 66 6f 20 3d 3d 20 4e 55 4c 4c  f (pInfo == NULL
1cfb0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1cfc0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1cfd0 2e 20 70 49 6e 66 6f 20 69 73 20 4e 55 4c 4c 2e  . pInfo is NULL.
1cfe0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
1cff0 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29  R_ARGUMENTS_BAD)
1d000 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b  ;..}...if (!cack
1d010 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
1d020 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1d030 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1d040 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
1d050 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
1d060 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
1d070 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
1d080 0a 0a 09 70 49 6e 66 6f 2d 3e 63 72 79 70 74 6f  ...pInfo->crypto
1d090 6b 69 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20  kiVersion.major 
1d0a0 3d 20 28 28 43 41 43 4b 45 59 5f 43 52 59 50 54  = ((CACKEY_CRYPT
1d0b0 4f 4b 49 5f 56 45 52 53 49 4f 4e 5f 43 4f 44 45  OKI_VERSION_CODE
1d0c0 29 20 3e 3e 20 31 36 29 20 26 20 30 78 66 66 3b  ) >> 16) & 0xff;
1d0d0 0a 09 70 49 6e 66 6f 2d 3e 63 72 79 70 74 6f 6b  ..pInfo->cryptok
1d0e0 69 56 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d  iVersion.minor =
1d0f0 20 28 28 43 41 43 4b 45 59 5f 43 52 59 50 54 4f   ((CACKEY_CRYPTO
1d100 4b 49 5f 56 45 52 53 49 4f 4e 5f 43 4f 44 45 29  KI_VERSION_CODE)
1d110 20 3e 3e 20 38 29 20 26 20 30 78 66 66 3b 0a 0a   >> 8) & 0xff;..
1d120 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 6d  .memset(pInfo->m
1d130 61 6e 75 66 61 63 74 75 72 65 72 49 44 2c 20 27  anufacturerID, '
1d140 20 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f   ', sizeof(pInfo
1d150 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44  ->manufacturerID
1d160 29 29 3b 0a 09 6d 65 6d 63 70 79 28 70 49 6e 66  ));..memcpy(pInf
1d170 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49  o->manufacturerI
1d180 44 2c 20 6d 61 6e 75 66 61 63 74 75 72 65 72 49  D, manufacturerI
1d190 44 2c 20 73 69 7a 65 6f 66 28 6d 61 6e 75 66 61  D, sizeof(manufa
1d1a0 63 74 75 72 65 72 49 44 29 20 2d 20 31 29 3b 0a  cturerID) - 1);.
1d1b0 0a 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20 3d  ..pInfo->flags =
1d1c0 20 30 78 30 30 3b 0a 0a 09 6d 65 6d 73 65 74 28   0x00;...memset(
1d1d0 70 49 6e 66 6f 2d 3e 6c 69 62 72 61 72 79 44 65  pInfo->libraryDe
1d1e0 73 63 72 69 70 74 69 6f 6e 2c 20 27 20 27 2c 20  scription, ' ', 
1d1f0 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6c 69  sizeof(pInfo->li
1d200 62 72 61 72 79 44 65 73 63 72 69 70 74 69 6f 6e  braryDescription
1d210 29 29 3b 0a 09 6d 65 6d 63 70 79 28 70 49 6e 66  ));..memcpy(pInf
1d220 6f 2d 3e 6c 69 62 72 61 72 79 44 65 73 63 72 69  o->libraryDescri
1d230 70 74 69 6f 6e 2c 20 6c 69 62 72 61 72 79 44 65  ption, libraryDe
1d240 73 63 72 69 70 74 69 6f 6e 2c 20 73 69 7a 65 6f  scription, sizeo
1d250 66 28 6c 69 62 72 61 72 79 44 65 73 63 72 69 70  f(libraryDescrip
1d260 74 69 6f 6e 29 20 2d 20 31 29 3b 0a 0a 09 70 49  tion) - 1);...pI
1d270 6e 66 6f 2d 3e 6c 69 62 72 61 72 79 56 65 72 73  nfo->libraryVers
1d280 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 28 63 61 63  ion.major = (cac
1d290 6b 65 79 5f 67 65 74 76 65 72 73 69 6f 6e 28 29  key_getversion()
1d2a0 20 3e 3e 20 31 36 29 20 26 20 30 78 66 66 3b 0a   >> 16) & 0xff;.
1d2b0 09 70 49 6e 66 6f 2d 3e 6c 69 62 72 61 72 79 56  .pInfo->libraryV
1d2c0 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 28  ersion.minor = (
1d2d0 63 61 63 6b 65 79 5f 67 65 74 76 65 72 73 69 6f  cackey_getversio
1d2e0 6e 28 29 20 3e 3e 20 38 29 20 26 20 30 78 66 66  n() >> 8) & 0xff
1d2f0 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
1d300 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
1d310 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c  ng CKR_OK (%i)",
1d320 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75   CKR_OK);...retu
1d330 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 2f  rn(CKR_OK);.}../
1d340 2a 0a 20 2a 20 50 72 6f 63 65 73 73 20 6c 69 73  *. * Process lis
1d350 74 20 6f 66 20 72 65 61 64 65 72 73 2c 20 61 6e  t of readers, an
1d360 64 20 63 72 65 61 74 65 20 6d 61 70 70 69 6e 67  d create mapping
1d370 20 62 65 74 77 65 65 6e 20 72 65 61 64 65 72 20   between reader 
1d380 6e 61 6d 65 20 61 6e 64 20 73 6c 6f 74 20 49 44  name and slot ID
1d390 0a 20 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  . */.CK_DEFINE_F
1d3a0 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
1d3b0 5f 47 65 74 53 6c 6f 74 4c 69 73 74 29 28 43 4b  _GetSlotList)(CK
1d3c0 5f 42 42 4f 4f 4c 20 74 6f 6b 65 6e 50 72 65 73  _BBOOL tokenPres
1d3d0 65 6e 74 2c 20 43 4b 5f 53 4c 4f 54 5f 49 44 5f  ent, CK_SLOT_ID_
1d3e0 50 54 52 20 70 53 6c 6f 74 4c 69 73 74 2c 20 43  PTR pSlotList, C
1d3f0 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 43  K_ULONG_PTR pulC
1d400 6f 75 6e 74 29 20 7b 0a 09 73 74 61 74 69 63 20  ount) {..static 
1d410 69 6e 74 20 66 69 72 73 74 5f 63 61 6c 6c 20 3d  int first_call =
1d420 20 31 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72   1;..int mutex_r
1d430 65 74 76 61 6c 3b 0a 09 69 6e 74 20 70 63 73 63  etval;..int pcsc
1d440 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 3b 0a 09 43  _connect_ret;..C
1d450 4b 5f 55 4c 4f 4e 47 20 63 6f 75 6e 74 2c 20 73  K_ULONG count, s
1d460 6c 6f 74 5f 63 6f 75 6e 74 20 3d 20 30 2c 20 63  lot_count = 0, c
1d470 75 72 72 73 6c 6f 74 2c 20 73 6c 6f 74 5f 69 64  urrslot, slot_id
1d480 78 3b 0a 09 63 68 61 72 20 2a 70 63 73 63 5f 72  x;..char *pcsc_r
1d490 65 61 64 65 72 73 2c 20 2a 70 63 73 63 5f 72 65  eaders, *pcsc_re
1d4a0 61 64 65 72 73 5f 73 2c 20 2a 70 63 73 63 5f 72  aders_s, *pcsc_r
1d4b0 65 61 64 65 72 73 5f 65 3b 0a 09 44 57 4f 52 44  eaders_e;..DWORD
1d4c0 20 70 63 73 63 5f 72 65 61 64 65 72 73 5f 6c 65   pcsc_readers_le
1d4d0 6e 3b 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f 6c  n;..LONG scard_l
1d4e0 69 73 74 72 65 61 64 65 72 73 5f 72 65 74 3b 0a  istreaders_ret;.
1d4f0 09 73 69 7a 65 5f 74 20 63 75 72 72 5f 72 65 61  .size_t curr_rea
1d500 64 65 72 5f 6c 65 6e 3b 0a 09 69 6e 74 20 73 6c  der_len;..int sl
1d510 6f 74 5f 72 65 73 65 74 3b 0a 0a 09 43 41 43 4b  ot_reset;...CACK
1d520 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1d530 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
1d540 20 28 70 75 6c 43 6f 75 6e 74 20 3d 3d 20 4e 55   (pulCount == NU
1d550 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
1d560 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1d570 6f 72 2e 20 70 75 6c 43 6f 75 6e 74 20 69 73 20  or. pulCount is 
1d580 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75  NULL.");....retu
1d590 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53  rn(CKR_ARGUMENTS
1d5a0 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  _BAD);..}...if (
1d5b0 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
1d5c0 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
1d5d0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1d5e0 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
1d5f0 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
1d600 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
1d610 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
1d620 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65  );..}...mutex_re
1d630 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
1d640 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  tex_lock(cackey_
1d650 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
1d660 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
1d670 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1d680 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1d690 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65  .  Locking faile
1d6a0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
1d6b0 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
1d6c0 52 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 43 6c 65 61  R);..}.../* Clea
1d6d0 72 20 6c 69 73 74 20 6f 66 20 73 6c 6f 74 73 20  r list of slots 
1d6e0 2a 2f 0a 09 73 6c 6f 74 5f 72 65 73 65 74 20 3d  */..slot_reset =
1d6f0 20 30 3b 0a 09 69 66 20 28 70 53 6c 6f 74 4c 69   0;..if (pSlotLi
1d700 73 74 29 20 7b 0a 09 09 69 66 20 28 66 69 72 73  st) {...if (firs
1d710 74 5f 63 61 6c 6c 29 20 7b 0a 09 09 09 66 69 72  t_call) {....fir
1d720 73 74 5f 63 61 6c 6c 20 3d 20 30 3b 0a 0a 09 09  st_call = 0;....
1d730 09 73 6c 6f 74 5f 72 65 73 65 74 20 3d 20 31 3b  .slot_reset = 1;
1d740 0a 09 09 7d 0a 0a 09 09 2f 2a 20 49 66 20 61 6e  ...}..../* If an
1d750 79 20 6f 66 20 74 68 65 20 73 6c 6f 74 73 20 68  y of the slots h
1d760 61 76 65 20 62 65 65 6e 20 72 65 73 65 74 20 74  ave been reset t
1d770 68 65 6e 20 70 75 72 67 65 20 61 6c 6c 20 69 6e  hen purge all in
1d780 66 6f 72 6d 61 74 69 6f 6e 20 61 6e 64 20 63 68  formation and ch
1d790 65 63 6b 20 61 67 61 69 6e 20 2a 2f 0a 09 09 66  eck again */...f
1d7a0 6f 72 20 28 63 75 72 72 73 6c 6f 74 20 3d 20 30  or (currslot = 0
1d7b0 3b 20 63 75 72 72 73 6c 6f 74 20 3c 20 28 73 69  ; currslot < (si
1d7c0 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
1d7d0 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
1d7e0 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b 20 63  ey_slots[0])); c
1d7f0 75 72 72 73 6c 6f 74 2b 2b 29 20 7b 0a 09 09 09  urrslot++) {....
1d800 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  if (cackey_slots
1d810 5b 63 75 72 72 73 6c 6f 74 5d 2e 69 6e 74 65 72  [currslot].inter
1d820 6e 61 6c 29 20 7b 0a 09 09 09 09 63 6f 6e 74 69  nal) {.....conti
1d830 6e 75 65 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66  nue;....}.....if
1d840 20 28 21 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b   (!cackey_slots[
1d850 63 75 72 72 73 6c 6f 74 5d 2e 61 63 74 69 76 65  currslot].active
1d860 29 20 7b 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65  ) {.....continue
1d870 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 63  ;....}.....if (c
1d880 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72  ackey_slots[curr
1d890 73 6c 6f 74 5d 2e 73 6c 6f 74 5f 72 65 73 65 74  slot].slot_reset
1d8a0 29 20 7b 0a 09 09 09 09 73 6c 6f 74 5f 72 65 73  ) {.....slot_res
1d8b0 65 74 20 3d 20 31 3b 0a 0a 09 09 09 09 62 72 65  et = 1;......bre
1d8c0 61 6b 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09  ak;....}...}....
1d8d0 69 66 20 28 73 6c 6f 74 5f 72 65 73 65 74 29 20  if (slot_reset) 
1d8e0 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
1d8f0 47 5f 50 52 49 4e 54 46 28 22 50 75 72 67 69 6e  G_PRINTF("Purgin
1d900 67 20 61 6c 6c 20 73 6c 6f 74 20 69 6e 66 6f 72  g all slot infor
1d910 6d 61 74 69 6f 6e 2e 22 29 3b 0a 0a 09 09 09 2f  mation.");...../
1d920 2a 20 4f 6e 6c 79 20 75 70 64 61 74 65 20 74 68  * Only update th
1d930 65 20 6c 69 73 74 20 6f 66 20 73 6c 6f 74 73 20  e list of slots 
1d940 69 66 20 77 65 20 61 72 65 20 61 63 74 75 61 6c  if we are actual
1d950 6c 79 20 62 65 69 6e 67 20 73 75 70 70 6c 79 20  ly being supply 
1d960 74 68 65 20 73 6c 6f 74 20 69 6e 66 6f 72 6d 61  the slot informa
1d970 74 69 6f 6e 20 2a 2f 0a 09 09 09 63 61 63 6b 65  tion */....cacke
1d980 79 5f 73 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e 65  y_slots_disconne
1d990 63 74 5f 61 6c 6c 28 29 3b 0a 0a 09 09 09 66 6f  ct_all();.....fo
1d9a0 72 20 28 63 75 72 72 73 6c 6f 74 20 3d 20 30 3b  r (currslot = 0;
1d9b0 20 63 75 72 72 73 6c 6f 74 20 3c 20 28 73 69 7a   currslot < (siz
1d9c0 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
1d9d0 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
1d9e0 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b 20 63 75  y_slots[0])); cu
1d9f0 72 72 73 6c 6f 74 2b 2b 29 20 7b 0a 09 09 09 09  rrslot++) {.....
1da00 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  if (cackey_slots
1da10 5b 63 75 72 72 73 6c 6f 74 5d 2e 69 6e 74 65 72  [currslot].inter
1da20 6e 61 6c 29 20 7b 0a 09 09 09 09 09 63 6f 6e 74  nal) {......cont
1da30 69 6e 75 65 3b 0a 09 09 09 09 7d 0a 0a 09 09 09  inue;.....}.....
1da40 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74  .if (cackey_slot
1da50 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 70 63 73 63  s[currslot].pcsc
1da60 5f 72 65 61 64 65 72 29 20 7b 0a 09 09 09 09 09  _reader) {......
1da70 66 72 65 65 28 63 61 63 6b 65 79 5f 73 6c 6f 74  free(cackey_slot
1da80 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 70 63 73 63  s[currslot].pcsc
1da90 5f 72 65 61 64 65 72 29 3b 0a 0a 09 09 09 09 09  _reader);.......
1daa0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72  cackey_slots[cur
1dab0 72 73 6c 6f 74 5d 2e 70 63 73 63 5f 72 65 61 64  rslot].pcsc_read
1dac0 65 72 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 7d  er = NULL;.....}
1dad0 0a 0a 09 09 09 09 69 66 20 28 63 61 63 6b 65 79  ......if (cackey
1dae0 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d  _slots[currslot]
1daf0 2e 6c 61 62 65 6c 29 20 7b 0a 09 09 09 09 09 66  .label) {......f
1db00 72 65 65 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ree(cackey_slots
1db10 5b 63 75 72 72 73 6c 6f 74 5d 2e 6c 61 62 65 6c  [currslot].label
1db20 29 3b 0a 0a 09 09 09 09 09 63 61 63 6b 65 79 5f  );.......cackey_
1db30 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e  slots[currslot].
1db40 6c 61 62 65 6c 20 3d 20 4e 55 4c 4c 3b 0a 09 09  label = NULL;...
1db50 09 09 7d 0a 0a 09 09 09 09 63 61 63 6b 65 79 5f  ..}......cackey_
1db60 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e  slots[currslot].
1db70 61 63 74 69 76 65 20 3d 20 30 3b 0a 09 09 09 7d  active = 0;....}
1db80 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 0a  ...} else {.....
1db90 09 09 7d 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74 65  ..}..}.../* Dete
1dba0 72 6d 69 6e 65 20 6c 69 73 74 20 6f 66 20 72 65  rmine list of re
1dbb0 61 64 65 72 73 20 2a 2f 0a 09 70 63 73 63 5f 63  aders */..pcsc_c
1dbc0 6f 6e 6e 65 63 74 5f 72 65 74 20 3d 20 63 61 63  onnect_ret = cac
1dbd0 6b 65 79 5f 70 63 73 63 5f 63 6f 6e 6e 65 63 74  key_pcsc_connect
1dbe0 28 29 3b 0a 2f 2a 20 58 58 58 3a 20 43 41 4e 20  ();./* XXX: CAN 
1dbf0 48 41 4e 47 20 48 45 52 45 20 21 20 2a 2f 0a 09  HANG HERE ! */..
1dc00 69 66 20 28 70 63 73 63 5f 63 6f 6e 6e 65 63 74  if (pcsc_connect
1dc10 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50  _ret != CACKEY_P
1dc20 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41  CSC_S_OK) {...CA
1dc30 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1dc40 46 28 22 43 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f  F("Connection to
1dc50 20 50 43 2f 53 43 20 66 61 69 6c 65 64 2c 20 61   PC/SC failed, a
1dc60 73 73 75 6d 69 6e 67 20 6e 6f 20 73 6c 6f 74 73  ssuming no slots
1dc70 22 29 3b 0a 0a 09 09 73 6c 6f 74 5f 63 6f 75 6e  ");....slot_coun
1dc80 74 20 3d 20 30 3b 0a 09 7d 20 65 6c 73 65 20 7b  t = 0;..} else {
1dc90 0a 09 09 70 63 73 63 5f 72 65 61 64 65 72 73 5f  ...pcsc_readers_
1dca0 6c 65 6e 20 3d 20 30 3b 0a 0a 09 09 73 63 61 72  len = 0;....scar
1dcb0 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65  d_listreaders_re
1dcc0 74 20 3d 20 53 43 61 72 64 4c 69 73 74 52 65 61  t = SCardListRea
1dcd0 64 65 72 73 28 2a 63 61 63 6b 65 79 5f 70 63 73  ders(*cackey_pcs
1dce0 63 5f 68 61 6e 64 6c 65 2c 20 4e 55 4c 4c 2c 20  c_handle, NULL, 
1dcf0 4e 55 4c 4c 2c 20 26 70 63 73 63 5f 72 65 61 64  NULL, &pcsc_read
1dd00 65 72 73 5f 6c 65 6e 29 3b 0a 0a 09 09 69 66 20  ers_len);....if 
1dd10 28 73 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65  (scard_listreade
1dd20 72 73 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f  rs_ret == SCARD_
1dd30 46 5f 43 4f 4d 4d 5f 45 52 52 4f 52 29 20 7b 0a  F_COMM_ERROR) {.
1dd40 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1dd50 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 53  PRINTF("Error. S
1dd60 43 61 72 64 4c 69 73 74 52 65 61 64 65 72 73 28  CardListReaders(
1dd70 29 20 72 65 74 75 72 6e 65 64 20 53 43 41 52 44  ) returned SCARD
1dd80 5f 46 5f 43 4f 4d 4d 5f 45 52 52 4f 52 2c 20 61  _F_COMM_ERROR, a
1dd90 73 73 75 6d 69 6e 67 20 43 6f 6e 6e 65 63 74 69  ssuming Connecti
1dda0 6f 6e 20 74 6f 20 50 43 2f 53 43 20 77 65 6e 74  on to PC/SC went
1ddb0 20 61 77 61 79 2e 20 52 65 63 6f 6e 6e 65 63 74   away. Reconnect
1ddc0 69 6e 67 2e 22 29 3b 0a 0a 09 09 09 63 61 63 6b  ing.");.....cack
1ddd0 65 79 5f 70 63 73 63 5f 64 69 73 63 6f 6e 6e 65  ey_pcsc_disconne
1dde0 63 74 28 29 3b 0a 09 09 09 63 61 63 6b 65 79 5f  ct();....cackey_
1ddf0 70 63 73 63 5f 63 6f 6e 6e 65 63 74 28 29 3b 0a  pcsc_connect();.
1de00 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
1de10 5f 50 52 49 4e 54 46 28 22 54 72 79 69 6e 67 20  _PRINTF("Trying 
1de20 53 43 61 72 64 4c 69 73 74 52 65 61 64 65 72 73  SCardListReaders
1de30 28 29 20 61 67 61 69 6e 22 29 3b 0a 09 09 09 73  () again");....s
1de40 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73  card_listreaders
1de50 5f 72 65 74 20 3d 20 53 43 61 72 64 4c 69 73 74  _ret = SCardList
1de60 52 65 61 64 65 72 73 28 2a 63 61 63 6b 65 79 5f  Readers(*cackey_
1de70 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20 4e 55 4c  pcsc_handle, NUL
1de80 4c 2c 20 4e 55 4c 4c 2c 20 26 70 63 73 63 5f 72  L, NULL, &pcsc_r
1de90 65 61 64 65 72 73 5f 6c 65 6e 29 3b 0a 09 09 7d  eaders_len);...}
1dea0 0a 0a 09 09 69 66 20 28 73 63 61 72 64 5f 6c 69  ....if (scard_li
1deb0 73 74 72 65 61 64 65 72 73 5f 72 65 74 20 3d 3d  streaders_ret ==
1dec0 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53   SCARD_S_SUCCESS
1ded0 20 26 26 20 70 63 73 63 5f 72 65 61 64 65 72 73   && pcsc_readers
1dee0 5f 6c 65 6e 20 21 3d 20 30 29 20 7b 0a 09 09 09  _len != 0) {....
1def0 70 63 73 63 5f 72 65 61 64 65 72 73 20 3d 20 6d  pcsc_readers = m
1df00 61 6c 6c 6f 63 28 70 63 73 63 5f 72 65 61 64 65  alloc(pcsc_reade
1df10 72 73 5f 6c 65 6e 29 3b 0a 09 09 09 70 63 73 63  rs_len);....pcsc
1df20 5f 72 65 61 64 65 72 73 5f 73 20 3d 20 70 63 73  _readers_s = pcs
1df30 63 5f 72 65 61 64 65 72 73 3b 0a 0a 09 09 09 73  c_readers;.....s
1df40 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73  card_listreaders
1df50 5f 72 65 74 20 3d 20 53 43 61 72 64 4c 69 73 74  _ret = SCardList
1df60 52 65 61 64 65 72 73 28 2a 63 61 63 6b 65 79 5f  Readers(*cackey_
1df70 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20 4e 55 4c  pcsc_handle, NUL
1df80 4c 2c 20 70 63 73 63 5f 72 65 61 64 65 72 73 2c  L, pcsc_readers,
1df90 20 26 70 63 73 63 5f 72 65 61 64 65 72 73 5f 6c   &pcsc_readers_l
1dfa0 65 6e 29 3b 0a 09 09 09 69 66 20 28 73 63 61 72  en);....if (scar
1dfb0 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65  d_listreaders_re
1dfc0 74 20 3d 3d 20 53 43 41 52 44 5f 53 5f 53 55 43  t == SCARD_S_SUC
1dfd0 43 45 53 53 29 20 7b 0a 09 09 09 09 70 63 73 63  CESS) {.....pcsc
1dfe0 5f 72 65 61 64 65 72 73 5f 65 20 3d 20 70 63 73  _readers_e = pcs
1dff0 63 5f 72 65 61 64 65 72 73 20 2b 20 70 63 73 63  c_readers + pcsc
1e000 5f 72 65 61 64 65 72 73 5f 6c 65 6e 3b 0a 0a 09  _readers_len;...
1e010 09 09 09 2f 2a 20 53 74 61 72 74 20 77 69 74 68  .../* Start with
1e020 20 53 6c 6f 74 20 49 44 20 31 2c 20 74 6f 20 61   Slot ID 1, to a
1e030 76 6f 69 64 20 61 20 62 75 67 20 69 6e 20 47 44  void a bug in GD
1e040 4d 20 6f 6e 20 52 48 45 4c 20 2a 2f 0a 09 09 09  M on RHEL */....
1e050 09 2f 2a 20 42 75 67 20 35 39 34 39 31 31 3a 20  ./* Bug 594911: 
1e060 68 74 74 70 73 3a 2f 2f 62 75 67 7a 69 6c 6c 61  https://bugzilla
1e070 2e 72 65 64 68 61 74 2e 63 6f 6d 2f 73 68 6f 77  .redhat.com/show
1e080 5f 62 75 67 2e 63 67 69 3f 69 64 3d 35 39 34 39  _bug.cgi?id=5949
1e090 31 31 20 2a 2f 0a 09 09 09 09 63 75 72 72 73 6c  11 */.....currsl
1e0a0 6f 74 20 3d 20 31 3b 0a 09 09 09 09 73 6c 6f 74  ot = 1;.....slot
1e0b0 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 09 09 09 09  _count = 0;.....
1e0c0 77 68 69 6c 65 20 28 70 63 73 63 5f 72 65 61 64  while (pcsc_read
1e0d0 65 72 73 20 3c 20 70 63 73 63 5f 72 65 61 64 65  ers < pcsc_reade
1e0e0 72 73 5f 65 29 20 7b 0a 09 09 09 09 09 2f 2a 20  rs_e) {....../* 
1e0f0 46 69 6e 64 20 6e 65 78 74 20 61 76 61 69 6c 61  Find next availa
1e100 62 6c 65 20 73 6c 6f 74 20 2a 2f 0a 09 09 09 09  ble slot */.....
1e110 09 66 6f 72 20 28 3b 20 63 75 72 72 73 6c 6f 74  .for (; currslot
1e120 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65   < (sizeof(cacke
1e130 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f  y_slots) / sizeo
1e140 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30  f(cackey_slots[0
1e150 5d 29 29 3b 20 63 75 72 72 73 6c 6f 74 2b 2b 29  ])); currslot++)
1e160 20 7b 0a 09 09 09 09 09 09 69 66 20 28 21 63 61   {.......if (!ca
1e170 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73  ckey_slots[currs
1e180 6c 6f 74 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09  lot].active) {..
1e190 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
1e1a0 09 09 09 7d 0a 09 09 09 09 09 7d 0a 0a 09 09 09  ...}......}.....
1e1b0 09 09 63 75 72 72 5f 72 65 61 64 65 72 5f 6c 65  ..curr_reader_le
1e1c0 6e 20 3d 20 73 74 72 6c 65 6e 28 70 63 73 63 5f  n = strlen(pcsc_
1e1d0 72 65 61 64 65 72 73 29 3b 0a 0a 09 09 09 09 09  readers);.......
1e1e0 69 66 20 28 28 70 63 73 63 5f 72 65 61 64 65 72  if ((pcsc_reader
1e1f0 73 20 2b 20 63 75 72 72 5f 72 65 61 64 65 72 5f  s + curr_reader_
1e200 6c 65 6e 29 20 3e 20 70 63 73 63 5f 72 65 61 64  len) > pcsc_read
1e210 65 72 73 5f 65 29 20 7b 0a 09 09 09 09 09 09 62  ers_e) {.......b
1e220 72 65 61 6b 3b 0a 09 09 09 09 09 7d 0a 0a 09 09  reak;......}....
1e230 09 09 09 69 66 20 28 63 75 72 72 5f 72 65 61 64  ...if (curr_read
1e240 65 72 5f 6c 65 6e 20 3d 3d 20 30 29 20 7b 0a 09  er_len == 0) {..
1e250 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09  .....break;.....
1e260 09 7d 0a 0a 09 09 09 09 09 69 66 20 28 63 75 72  .}.......if (cur
1e270 72 73 6c 6f 74 20 3e 3d 20 28 73 69 7a 65 6f 66  rslot >= (sizeof
1e280 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f  (cackey_slots) /
1e290 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73   sizeof(cackey_s
1e2a0 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 09  lots[0]))) {....
1e2b0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1e2c0 50 52 49 4e 54 46 28 22 46 6f 75 6e 64 20 6d 6f  PRINTF("Found mo
1e2d0 72 65 20 72 65 61 64 65 72 73 20 74 68 61 6e 20  re readers than 
1e2e0 73 6c 6f 74 73 20 61 72 65 20 61 76 61 69 6c 61  slots are availa
1e2f0 62 6c 65 21 22 29 3b 0a 0a 09 09 09 09 09 09 62  ble!");........b
1e300 72 65 61 6b 3b 0a 09 09 09 09 09 7d 0a 0a 09 09  reak;......}....
1e310 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1e320 50 52 49 4e 54 46 28 22 46 6f 75 6e 64 20 72 65  PRINTF("Found re
1e330 61 64 65 72 3a 20 25 73 20 28 63 75 72 72 73 6c  ader: %s (currsl
1e340 6f 74 20 3d 20 25 6c 75 29 22 2c 20 70 63 73 63  ot = %lu)", pcsc
1e350 5f 72 65 61 64 65 72 73 2c 20 28 75 6e 73 69 67  _readers, (unsig
1e360 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 73 6c  ned long) currsl
1e370 6f 74 29 3b 0a 0a 09 09 09 09 09 2f 2a 20 4f 6e  ot);......./* On
1e380 6c 79 20 75 70 64 61 74 65 20 74 68 65 20 6c 69  ly update the li
1e390 73 74 20 6f 66 20 73 6c 6f 74 73 20 69 66 20 77  st of slots if w
1e3a0 65 20 61 72 65 20 61 63 74 75 61 6c 6c 79 20 62  e are actually b
1e3b0 65 69 6e 67 20 61 73 6b 65 64 20 73 75 70 70 6c  eing asked suppl
1e3c0 79 20 74 68 65 20 73 6c 6f 74 20 69 6e 66 6f 72  y the slot infor
1e3d0 6d 61 74 69 6f 6e 20 2a 2f 0a 09 09 09 09 09 69  mation */......i
1e3e0 66 20 28 70 53 6c 6f 74 4c 69 73 74 29 20 7b 0a  f (pSlotList) {.
1e3f0 09 09 09 09 09 09 69 66 20 28 73 6c 6f 74 5f 72  ......if (slot_r
1e400 65 73 65 74 29 20 7b 0a 09 09 09 09 09 09 09 63  eset) {........c
1e410 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72  ackey_slots[curr
1e420 73 6c 6f 74 5d 2e 61 63 74 69 76 65 20 3d 20 31  slot].active = 1
1e430 3b 0a 09 09 09 09 09 09 09 63 61 63 6b 65 79 5f  ;........cackey_
1e440 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e  slots[currslot].
1e450 69 6e 74 65 72 6e 61 6c 20 3d 20 30 3b 0a 09 09  internal = 0;...
1e460 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  .....cackey_slot
1e470 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 70 63 73 63  s[currslot].pcsc
1e480 5f 72 65 61 64 65 72 20 3d 20 73 74 72 64 75 70  _reader = strdup
1e490 28 70 63 73 63 5f 72 65 61 64 65 72 73 29 3b 0a  (pcsc_readers);.
1e4a0 09 09 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c  .......cackey_sl
1e4b0 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 70 63  ots[currslot].pc
1e4c0 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65  sc_card_connecte
1e4d0 64 20 3d 20 30 3b 0a 09 09 09 09 09 09 09 63 61  d = 0;........ca
1e4e0 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73  ckey_slots[currs
1e4f0 6c 6f 74 5d 2e 74 72 61 6e 73 61 63 74 69 6f 6e  lot].transaction
1e500 5f 64 65 70 74 68 20 3d 20 30 3b 0a 09 09 09 09  _depth = 0;.....
1e510 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ...cackey_slots[
1e520 63 75 72 72 73 6c 6f 74 5d 2e 74 72 61 6e 73 61  currslot].transa
1e530 63 74 69 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f  ction_need_hw_lo
1e540 63 6b 20 3d 20 30 3b 0a 09 09 09 09 09 09 09 69  ck = 0;........i
1e550 66 20 28 63 61 63 6b 65 79 5f 70 69 6e 5f 63 6f  f (cackey_pin_co
1e560 6d 6d 61 6e 64 20 3d 3d 20 4e 55 4c 4c 29 20 7b  mmand == NULL) {
1e570 0a 09 09 09 09 09 09 09 09 63 61 63 6b 65 79 5f  .........cackey_
1e580 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e  slots[currslot].
1e590 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 3d 20 43 4b  token_flags = CK
1e5a0 46 5f 4c 4f 47 49 4e 5f 52 45 51 55 49 52 45 44  F_LOGIN_REQUIRED
1e5b0 3b 0a 09 09 09 09 09 09 09 7d 20 65 6c 73 65 20  ;........} else 
1e5c0 7b 0a 09 09 09 09 09 09 09 09 63 61 63 6b 65 79  {.........cackey
1e5d0 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d  _slots[currslot]
1e5e0 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 3d 20 30  .token_flags = 0
1e5f0 3b 0a 09 09 09 09 09 09 09 7d 0a 09 09 09 09 09  ;........}......
1e600 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63  ..cackey_slots[c
1e610 75 72 72 73 6c 6f 74 5d 2e 6c 61 62 65 6c 20 3d  urrslot].label =
1e620 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09 09 09 09 63   NULL;.........c
1e630 61 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f  ackey_mark_slot_
1e640 72 65 73 65 74 28 26 63 61 63 6b 65 79 5f 73 6c  reset(&cackey_sl
1e650 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 29 3b 0a  ots[currslot]);.
1e660 09 09 09 09 09 09 7d 0a 09 09 09 09 09 7d 20 65  ......}......} e
1e670 6c 73 65 20 7b 0a 09 09 09 09 09 09 69 66 20 28  lse {.......if (
1e680 21 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75  !cackey_slots[cu
1e690 72 72 73 6c 6f 74 5d 2e 61 63 74 69 76 65 29 20  rrslot].active) 
1e6a0 7b 0a 09 09 09 09 09 09 09 2f 2a 20 41 72 74 69  {......../* Arti
1e6b0 66 69 63 69 61 6c 6c 79 20 69 6e 63 72 65 61 73  ficially increas
1e6c0 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
1e6d0 61 63 74 69 76 65 20 73 6c 6f 74 73 20 62 79 20  active slots by 
1e6e0 77 68 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65  what will become
1e6f0 20 61 63 74 69 76 65 20 2a 2f 0a 09 09 09 09 09   active */......
1e700 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1e710 52 49 4e 54 46 28 22 46 6f 75 6e 64 20 69 6e 2d  RINTF("Found in-
1e720 61 63 74 69 76 65 20 73 6c 6f 74 20 25 6c 75 2c  active slot %lu,
1e730 20 62 75 74 20 69 74 20 77 69 6c 6c 20 62 65 20   but it will be 
1e740 61 63 74 69 76 65 20 61 66 74 65 72 20 61 20 72  active after a r
1e750 65 73 65 74 20 2d 2d 20 6d 61 72 6b 69 6e 67 20  eset -- marking 
1e760 61 73 20 61 63 74 69 76 65 20 66 6f 72 20 61 63  as active for ac
1e770 63 6f 75 6e 74 69 6e 67 20 70 75 72 70 6f 73 65  counting purpose
1e780 73 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  s", (unsigned lo
1e790 6e 67 29 20 63 75 72 72 73 6c 6f 74 29 3b 0a 0a  ng) currslot);..
1e7a0 09 09 09 09 09 09 09 73 6c 6f 74 5f 63 6f 75 6e  .......slot_coun
1e7b0 74 2b 2b 3b 0a 09 09 09 09 09 09 7d 0a 09 09 09  t++;.......}....
1e7c0 09 09 7d 0a 09 09 09 09 09 63 75 72 72 73 6c 6f  ..}......currslo
1e7d0 74 2b 2b 3b 0a 0a 09 09 09 09 09 70 63 73 63 5f  t++;.......pcsc_
1e7e0 72 65 61 64 65 72 73 20 2b 3d 20 63 75 72 72 5f  readers += curr_
1e7f0 72 65 61 64 65 72 5f 6c 65 6e 20 2b 20 31 3b 0a  reader_len + 1;.
1e800 09 09 09 09 7d 0a 0a 09 09 09 09 66 6f 72 20 28  ....}......for (
1e810 63 75 72 72 73 6c 6f 74 20 3d 20 30 3b 20 63 75  currslot = 0; cu
1e820 72 72 73 6c 6f 74 20 3c 20 28 73 69 7a 65 6f 66  rrslot < (sizeof
1e830 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f  (cackey_slots) /
1e840 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73   sizeof(cackey_s
1e850 6c 6f 74 73 5b 30 5d 29 29 3b 20 63 75 72 72 73  lots[0])); currs
1e860 6c 6f 74 2b 2b 29 20 7b 0a 09 09 09 09 09 69 66  lot++) {......if
1e870 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63   (cackey_slots[c
1e880 75 72 72 73 6c 6f 74 5d 2e 61 63 74 69 76 65 29  urrslot].active)
1e890 20 7b 0a 09 09 09 09 09 09 43 41 43 4b 45 59 5f   {.......CACKEY_
1e8a0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 6f  DEBUG_PRINTF("Fo
1e8b0 75 6e 64 20 61 63 74 69 76 65 20 73 6c 6f 74 20  und active slot 
1e8c0 25 6c 75 2c 20 72 65 61 64 65 72 20 3d 20 25 73  %lu, reader = %s
1e8d0 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
1e8e0 67 29 20 63 75 72 72 73 6c 6f 74 2c 20 63 61 63  g) currslot, cac
1e8f0 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c  key_slots[currsl
1e900 6f 74 5d 2e 70 63 73 63 5f 72 65 61 64 65 72 29  ot].pcsc_reader)
1e910 3b 0a 0a 09 09 09 09 09 09 73 6c 6f 74 5f 63 6f  ;........slot_co
1e920 75 6e 74 2b 2b 3b 0a 09 09 09 09 09 7d 0a 09 09  unt++;......}...
1e930 09 09 7d 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a  ..}....} else {.
1e940 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
1e950 5f 50 52 49 4e 54 46 28 22 53 65 63 6f 6e 64 20  _PRINTF("Second 
1e960 63 61 6c 6c 20 74 6f 20 53 43 61 72 64 4c 69 73  call to SCardLis
1e970 74 52 65 61 64 65 72 73 20 66 61 69 6c 65 64 2c  tReaders failed,
1e980 20 72 65 74 75 72 6e 20 25 73 2f 25 6c 69 22 2c   return %s/%li",
1e990 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55   CACKEY_DEBUG_FU
1e9a0 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53  NC_SCARDERR_TO_S
1e9b0 54 52 28 73 63 61 72 64 5f 6c 69 73 74 72 65 61  TR(scard_listrea
1e9c0 64 65 72 73 5f 72 65 74 29 2c 20 28 6c 6f 6e 67  ders_ret), (long
1e9d0 29 20 73 63 61 72 64 5f 6c 69 73 74 72 65 61 64  ) scard_listread
1e9e0 65 72 73 5f 72 65 74 29 3b 0a 09 09 09 7d 0a 0a  ers_ret);....}..
1e9f0 09 09 09 66 72 65 65 28 70 63 73 63 5f 72 65 61  ...free(pcsc_rea
1ea00 64 65 72 73 5f 73 29 3b 0a 09 09 7d 20 65 6c 73  ders_s);...} els
1ea10 65 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  e {....CACKEY_DE
1ea20 42 55 47 5f 50 52 49 4e 54 46 28 22 46 69 72 73  BUG_PRINTF("Firs
1ea30 74 20 63 61 6c 6c 20 74 6f 20 53 43 61 72 64 4c  t call to SCardL
1ea40 69 73 74 52 65 61 64 65 72 73 20 66 61 69 6c 65  istReaders faile
1ea50 64 2c 20 72 65 74 75 72 6e 20 25 73 2f 25 6c 69  d, return %s/%li
1ea60 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ", CACKEY_DEBUG_
1ea70 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f  FUNC_SCARDERR_TO
1ea80 5f 53 54 52 28 73 63 61 72 64 5f 6c 69 73 74 72  _STR(scard_listr
1ea90 65 61 64 65 72 73 5f 72 65 74 29 2c 20 28 6c 6f  eaders_ret), (lo
1eaa0 6e 67 29 20 73 63 61 72 64 5f 6c 69 73 74 72 65  ng) scard_listre
1eab0 61 64 65 72 73 5f 72 65 74 29 3b 0a 09 09 7d 0a  aders_ret);...}.
1eac0 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  .}...mutex_retva
1ead0 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
1eae0 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
1eaf0 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
1eb00 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
1eb10 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1eb20 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1eb30 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c    Unlocking fail
1eb40 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
1eb50 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
1eb60 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 53  OR);..}...if (pS
1eb70 6c 6f 74 4c 69 73 74 20 3d 3d 20 4e 55 4c 4c 29  lotList == NULL)
1eb80 20 7b 0a 09 09 2a 70 75 6c 43 6f 75 6e 74 20 3d   {...*pulCount =
1eb90 20 73 6c 6f 74 5f 63 6f 75 6e 74 3b 0a 0a 09 09   slot_count;....
1eba0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1ebb0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
1ebc0 4b 52 5f 4f 4b 20 28 25 69 29 2e 20 20 46 6f 75  KR_OK (%i).  Fou
1ebd0 6e 64 20 25 6c 75 20 72 65 61 64 65 72 73 2c 20  nd %lu readers, 
1ebe0 62 75 74 20 6e 6f 74 20 73 74 6f 72 69 6e 67 20  but not storing 
1ebf0 49 44 73 20 28 70 53 6c 6f 74 4c 69 73 74 20 3d  IDs (pSlotList =
1ec00 3d 20 4e 55 4c 4c 29 22 2c 20 43 4b 52 5f 4f 4b  = NULL)", CKR_OK
1ec10 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
1ec20 29 20 73 6c 6f 74 5f 63 6f 75 6e 74 29 3b 0a 0a  ) slot_count);..
1ec30 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29  ..return(CKR_OK)
1ec40 3b 0a 09 7d 0a 0a 09 63 6f 75 6e 74 20 3d 20 2a  ;..}...count = *
1ec50 70 75 6c 43 6f 75 6e 74 3b 0a 09 69 66 20 28 63  pulCount;..if (c
1ec60 6f 75 6e 74 20 3c 20 73 6c 6f 74 5f 63 6f 75 6e  ount < slot_coun
1ec70 74 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  t) {...CACKEY_DE
1ec80 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1ec90 72 2e 20 55 73 65 72 20 61 6c 6c 6f 63 61 74 65  r. User allocate
1eca0 64 20 25 6c 75 20 65 6e 74 72 69 65 73 2c 20 62  d %lu entries, b
1ecb0 75 74 20 77 65 20 68 61 76 65 20 25 6c 75 20 65  ut we have %lu e
1ecc0 6e 74 72 69 65 73 2e 22 2c 20 63 6f 75 6e 74 2c  ntries.", count,
1ecd0 20 73 6c 6f 74 5f 63 6f 75 6e 74 29 3b 0a 0a 09   slot_count);...
1ece0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1ecf0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
1ed00 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53  CKR_BUFFER_TOO_S
1ed10 4d 41 4c 4c 22 29 3b 0a 0a 09 09 72 65 74 75 72  MALL");....retur
1ed20 6e 28 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f  n(CKR_BUFFER_TOO
1ed30 5f 53 4d 41 4c 4c 29 3b 09 0a 09 7d 0a 0a 09 6d  _SMALL);...}...m
1ed40 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
1ed50 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28  ckey_mutex_lock(
1ed60 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
1ed70 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
1ed80 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
1ed90 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1eda0 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e  ("Error.  Lockin
1edb0 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
1edc0 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
1edd0 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
1ede0 73 6c 6f 74 5f 69 64 78 20 3d 20 30 3b 0a 09 66  slot_idx = 0;..f
1edf0 6f 72 20 28 63 75 72 72 73 6c 6f 74 20 3d 20 30  or (currslot = 0
1ee00 3b 20 28 63 75 72 72 73 6c 6f 74 20 3c 20 28 73  ; (currslot < (s
1ee10 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f  izeof(cackey_slo
1ee20 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63  ts) / sizeof(cac
1ee30 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 3b  key_slots[0])));
1ee40 20 63 75 72 72 73 6c 6f 74 2b 2b 29 20 7b 0a 09   currslot++) {..
1ee50 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 6c 6f  .if (!cackey_slo
1ee60 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 61 63 74  ts[currslot].act
1ee70 69 76 65 29 20 7b 0a 09 09 09 63 6f 6e 74 69 6e  ive) {....contin
1ee80 75 65 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 73  ue;...}....if (s
1ee90 6c 6f 74 5f 69 64 78 20 3e 3d 20 63 6f 75 6e 74  lot_idx >= count
1eea0 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
1eeb0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1eec0 72 2e 20 55 73 65 72 20 61 6c 6c 6f 63 61 74 65  r. User allocate
1eed0 64 20 25 6c 75 20 65 6e 74 72 69 65 73 2c 20 62  d %lu entries, b
1eee0 75 74 20 77 65 20 6a 75 73 74 20 74 72 69 65 64  ut we just tried
1eef0 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65   to write to the
1ef00 20 25 6c 75 20 69 6e 64 65 78 20 2d 2d 20 69 67   %lu index -- ig
1ef10 6e 6f 72 69 6e 67 22 2c 20 63 6f 75 6e 74 2c 20  noring", count, 
1ef20 73 6c 6f 74 5f 69 64 78 29 3b 0a 0a 09 09 09 63  slot_idx);.....c
1ef30 6f 6e 74 69 6e 75 65 3b 0a 09 09 7d 0a 0a 09 09  ontinue;...}....
1ef40 70 53 6c 6f 74 4c 69 73 74 5b 73 6c 6f 74 5f 69  pSlotList[slot_i
1ef50 64 78 5d 20 3d 20 63 75 72 72 73 6c 6f 74 3b 0a  dx] = currslot;.
1ef60 09 09 73 6c 6f 74 5f 69 64 78 2b 2b 3b 0a 09 7d  ..slot_idx++;..}
1ef70 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
1ef80 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  = cackey_mutex_u
1ef90 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
1efa0 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
1efb0 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
1efc0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1efd0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
1efe0 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64  Unlocking failed
1eff0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
1f000 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
1f010 29 3b 0a 09 7d 0a 0a 09 2a 70 75 6c 43 6f 75 6e  );..}...*pulCoun
1f020 74 20 3d 20 73 6c 6f 74 5f 63 6f 75 6e 74 3b 0a  t = slot_count;.
1f030 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1f040 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
1f050 20 43 4b 52 5f 4f 4b 20 28 25 69 29 2e 20 20 46   CKR_OK (%i).  F
1f060 6f 75 6e 64 20 25 6c 75 20 72 65 61 64 65 72 73  ound %lu readers
1f070 2e 22 2c 20 43 4b 52 5f 4f 4b 2c 20 28 75 6e 73  .", CKR_OK, (uns
1f080 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 6c 6f 74  igned long) slot
1f090 5f 63 6f 75 6e 74 29 3b 0a 0a 09 72 65 74 75 72  _count);...retur
1f0a0 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 74 6f 6b  n(CKR_OK);...tok
1f0b0 65 6e 50 72 65 73 65 6e 74 20 3d 20 74 6f 6b 65  enPresent = toke
1f0c0 6e 50 72 65 73 65 6e 74 3b 20 2f 2a 20 53 75 70  nPresent; /* Sup
1f0d0 72 65 73 73 20 75 6e 75 73 65 64 20 76 61 72 69  ress unused vari
1f0e0 61 62 6c 65 20 77 61 72 6e 69 6e 67 20 2a 2f 0a  able warning */.
1f0f0 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
1f100 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47  CTION(CK_RV, C_G
1f110 65 74 53 6c 6f 74 49 6e 66 6f 29 28 43 4b 5f 53  etSlotInfo)(CK_S
1f120 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 2c 20 43  LOT_ID slotID, C
1f130 4b 5f 53 4c 4f 54 5f 49 4e 46 4f 5f 50 54 52 20  K_SLOT_INFO_PTR 
1f140 70 49 6e 66 6f 29 20 7b 0a 09 73 74 61 74 69 63  pInfo) {..static
1f150 20 43 4b 5f 55 54 46 38 43 48 41 52 20 73 6c 6f   CK_UTF8CHAR slo
1f160 74 44 65 73 63 72 69 70 74 69 6f 6e 5b 5d 20 3d  tDescription[] =
1f170 20 22 43 41 43 4b 65 79 20 53 6c 6f 74 22 3b 0a   "CACKey Slot";.
1f180 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61  .int mutex_retva
1f190 6c 3b 0a 09 69 6e 74 20 62 79 74 65 73 5f 74 6f  l;..int bytes_to
1f1a0 5f 63 6f 70 79 3b 0a 0a 09 43 41 43 4b 45 59 5f  _copy;...CACKEY_
1f1b0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
1f1c0 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70  lled.");...if (p
1f1d0 49 6e 66 6f 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  Info == NULL) {.
1f1e0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1f1f0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 49  RINTF("Error. pI
1f200 6e 66 6f 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a  nfo is NULL.");.
1f210 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52  ...return(CKR_AR
1f220 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d  GUMENTS_BAD);..}
1f230 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
1f240 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
1f250 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1f260 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
1f270 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
1f280 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
1f290 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
1f2a0 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69  IALIZED);..}...i
1f2b0 66 20 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c  f (slotID < 0 ||
1f2c0 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65   slotID >= (size
1f2d0 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29  of(cackey_slots)
1f2e0 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
1f2f0 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09  _slots[0]))) {..
1f300 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1f310 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76  INTF("Error. Inv
1f320 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73  alid slot reques
1f330 74 65 64 20 28 25 6c 75 29 2c 20 6f 75 74 73 69  ted (%lu), outsi
1f340 64 65 20 6f 66 20 76 61 6c 69 64 20 72 61 6e 67  de of valid rang
1f350 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09  e", slotID);....
1f360 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f  return(CKR_SLOT_
1f370 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  ID_INVALID);..}.
1f380 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
1f390 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f   cackey_mutex_lo
1f3a0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
1f3b0 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
1f3c0 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
1f3d0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1f3e0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63  NTF("Error.  Loc
1f3f0 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
1f400 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
1f410 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
1f420 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c  ...if (cackey_sl
1f430 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69  ots[slotID].acti
1f440 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43  ve == 0) {...CAC
1f450 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1f460 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64  ("Error. Invalid
1f470 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20   slot requested 
1f480 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20  (%lu), slot not 
1f490 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65  currently active
1f4a0 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63  ", slotID);....c
1f4b0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
1f4c0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
1f4d0 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  k);....return(CK
1f4e0 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49  R_SLOT_ID_INVALI
1f4f0 44 29 3b 0a 09 7d 0a 0a 09 70 49 6e 66 6f 2d 3e  D);..}...pInfo->
1f500 66 6c 61 67 73 20 3d 20 43 4b 46 5f 48 57 5f 53  flags = CKF_HW_S
1f510 4c 4f 54 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  LOT;...if (!cack
1f520 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
1f530 2e 69 6e 74 65 72 6e 61 6c 29 20 7b 0a 09 09 70  .internal) {...p
1f540 49 6e 66 6f 2d 3e 66 6c 61 67 73 20 7c 3d 20 43  Info->flags |= C
1f550 4b 46 5f 52 45 4d 4f 56 41 42 4c 45 5f 44 45 56  KF_REMOVABLE_DEV
1f560 49 43 45 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61  ICE;..}...if (ca
1f570 63 6b 65 79 5f 74 6f 6b 65 6e 5f 70 72 65 73 65  ckey_token_prese
1f580 6e 74 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73  nt(&cackey_slots
1f590 5b 73 6c 6f 74 49 44 5d 29 20 3d 3d 20 43 41 43  [slotID]) == CAC
1f5a0 4b 45 59 5f 50 43 53 43 5f 53 5f 54 4f 4b 45 4e  KEY_PCSC_S_TOKEN
1f5b0 50 52 45 53 45 4e 54 29 20 7b 0a 09 09 70 49 6e  PRESENT) {...pIn
1f5c0 66 6f 2d 3e 66 6c 61 67 73 20 7c 3d 20 43 4b 46  fo->flags |= CKF
1f5d0 5f 54 4f 4b 45 4e 5f 50 52 45 53 45 4e 54 3b 0a  _TOKEN_PRESENT;.
1f5e0 09 7d 0a 0a 09 62 79 74 65 73 5f 74 6f 5f 63 6f  .}...bytes_to_co
1f5f0 70 79 20 3d 20 73 74 72 6c 65 6e 28 63 61 63 6b  py = strlen(cack
1f600 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
1f610 2e 70 63 73 63 5f 72 65 61 64 65 72 29 3b 0a 09  .pcsc_reader);..
1f620 69 66 20 28 73 69 7a 65 6f 66 28 70 49 6e 66 6f  if (sizeof(pInfo
1f630 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44  ->manufacturerID
1f640 29 20 3c 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70  ) < bytes_to_cop
1f650 79 29 20 7b 0a 09 09 62 79 74 65 73 5f 74 6f 5f  y) {...bytes_to_
1f660 63 6f 70 79 20 3d 20 73 69 7a 65 6f 66 28 70 49  copy = sizeof(pI
1f670 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65  nfo->manufacture
1f680 72 49 44 29 3b 0a 09 7d 0a 09 6d 65 6d 63 70 79  rID);..}..memcpy
1f690 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74  (pInfo->manufact
1f6a0 75 72 65 72 49 44 2c 20 63 61 63 6b 65 79 5f 73  urerID, cackey_s
1f6b0 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 70 63 73  lots[slotID].pcs
1f6c0 63 5f 72 65 61 64 65 72 2c 20 62 79 74 65 73 5f  c_reader, bytes_
1f6d0 74 6f 5f 63 6f 70 79 29 3b 0a 0a 09 6d 75 74 65  to_copy);...mute
1f6e0 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
1f6f0 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
1f700 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
1f710 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
1f720 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
1f730 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1f740 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69  "Error.  Unlocki
1f750 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
1f760 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
1f770 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
1f780 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 73  .memset(pInfo->s
1f790 6c 6f 74 44 65 73 63 72 69 70 74 69 6f 6e 2c 20  lotDescription, 
1f7a0 27 20 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66  ' ', sizeof(pInf
1f7b0 6f 2d 3e 73 6c 6f 74 44 65 73 63 72 69 70 74 69  o->slotDescripti
1f7c0 6f 6e 29 29 3b 0a 09 6d 65 6d 63 70 79 28 70 49  on));..memcpy(pI
1f7d0 6e 66 6f 2d 3e 73 6c 6f 74 44 65 73 63 72 69 70  nfo->slotDescrip
1f7e0 74 69 6f 6e 2c 20 73 6c 6f 74 44 65 73 63 72 69  tion, slotDescri
1f7f0 70 74 69 6f 6e 2c 20 73 69 7a 65 6f 66 28 73 6c  ption, sizeof(sl
1f800 6f 74 44 65 73 63 72 69 70 74 69 6f 6e 29 20 2d  otDescription) -
1f810 20 31 29 3b 0a 0a 09 6d 65 6d 73 65 74 28 70 49   1);...memset(pI
1f820 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65  nfo->manufacture
1f830 72 49 44 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66  rID, ' ', sizeof
1f840 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74  (pInfo->manufact
1f850 75 72 65 72 49 44 29 29 3b 0a 0a 09 70 49 6e 66  urerID));...pInf
1f860 6f 2d 3e 68 61 72 64 77 61 72 65 56 65 72 73 69  o->hardwareVersi
1f870 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 28 63 61 63 6b  on.major = (cack
1f880 65 79 5f 67 65 74 76 65 72 73 69 6f 6e 28 29 20  ey_getversion() 
1f890 3e 3e 20 31 36 29 20 26 20 30 78 66 66 3b 0a 09  >> 16) & 0xff;..
1f8a0 70 49 6e 66 6f 2d 3e 68 61 72 64 77 61 72 65 56  pInfo->hardwareV
1f8b0 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 28  ersion.minor = (
1f8c0 63 61 63 6b 65 79 5f 67 65 74 76 65 72 73 69 6f  cackey_getversio
1f8d0 6e 28 29 20 3e 3e 20 38 29 20 26 20 30 78 66 66  n() >> 8) & 0xff
1f8e0 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 66 69 72 6d 77  ;...pInfo->firmw
1f8f0 61 72 65 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72  areVersion.major
1f900 20 3d 20 30 78 30 30 3b 0a 09 70 49 6e 66 6f 2d   = 0x00;..pInfo-
1f910 3e 66 69 72 6d 77 61 72 65 56 65 72 73 69 6f 6e  >firmwareVersion
1f920 2e 6d 69 6e 6f 72 20 3d 20 30 78 30 30 3b 0a 0a  .minor = 0x00;..
1f930 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1f940 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
1f950 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b  CKR_OK (%i)", CK
1f960 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28  R_OK);...return(
1f970 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44  CKR_OK);.}..CK_D
1f980 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
1f990 4b 5f 52 56 2c 20 43 5f 47 65 74 54 6f 6b 65 6e  K_RV, C_GetToken
1f9a0 49 6e 66 6f 29 28 43 4b 5f 53 4c 4f 54 5f 49 44  Info)(CK_SLOT_ID
1f9b0 20 73 6c 6f 74 49 44 2c 20 43 4b 5f 54 4f 4b 45   slotID, CK_TOKE
1f9c0 4e 5f 49 4e 46 4f 5f 50 54 52 20 70 49 6e 66 6f  N_INFO_PTR pInfo
1f9d0 29 20 7b 0a 09 73 74 61 74 69 63 20 43 4b 5f 55  ) {..static CK_U
1f9e0 54 46 38 43 48 41 52 20 6d 61 6e 75 66 61 63 74  TF8CHAR manufact
1f9f0 75 72 65 72 49 44 5b 5d 20 3d 20 22 55 2e 53 2e  urerID[] = "U.S.
1fa00 20 47 6f 76 65 72 6e 6d 65 6e 74 22 3b 0a 09 73   Government";..s
1fa10 74 61 74 69 63 20 43 4b 5f 55 54 46 38 43 48 41  tatic CK_UTF8CHA
1fa20 52 20 64 65 66 61 75 6c 74 4c 61 62 65 6c 5b 5d  R defaultLabel[]
1fa30 20 3d 20 22 55 6e 6b 6e 6f 77 6e 20 54 6f 6b 65   = "Unknown Toke
1fa40 6e 22 3b 0a 09 73 74 61 74 69 63 20 43 4b 5f 55  n";..static CK_U
1fa50 54 46 38 43 48 41 52 20 6d 6f 64 65 6c 5b 5d 20  TF8CHAR model[] 
1fa60 3d 20 22 43 41 43 20 54 6f 6b 65 6e 22 3b 0a 09  = "CAC Token";..
1fa70 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63  struct cackey_pc
1fa80 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 70 63 73  sc_identity *pcs
1fa90 63 5f 69 64 65 6e 74 69 74 69 65 73 3b 0a 09 75  c_identities;..u
1faa0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6e 75 6d  nsigned long num
1fab0 5f 63 65 72 74 73 3b 0a 09 73 73 69 7a 65 5f 74  _certs;..ssize_t
1fac0 20 6c 61 62 65 6c 5f 72 65 74 3b 0a 09 69 6e 74   label_ret;..int
1fad0 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09   mutex_retval;..
1fae0 69 6e 74 20 75 73 65 5f 64 65 66 61 75 6c 74 5f  int use_default_
1faf0 6c 61 62 65 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f  label;...CACKEY_
1fb00 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
1fb10 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70  lled.");...if (p
1fb20 49 6e 66 6f 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  Info == NULL) {.
1fb30 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1fb40 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 49  RINTF("Error. pI
1fb50 6e 66 6f 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a  nfo is NULL.");.
1fb60 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52  ...return(CKR_AR
1fb70 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d  GUMENTS_BAD);..}
1fb80 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
1fb90 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
1fba0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1fbb0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
1fbc0 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
1fbd0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
1fbe0 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
1fbf0 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69  IALIZED);..}...i
1fc00 66 20 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c  f (slotID < 0 ||
1fc10 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65   slotID >= (size
1fc20 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29  of(cackey_slots)
1fc30 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
1fc40 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09  _slots[0]))) {..
1fc50 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1fc60 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76  INTF("Error. Inv
1fc70 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73  alid slot reques
1fc80 74 65 64 20 28 25 6c 75 29 2c 20 6f 75 74 73 69  ted (%lu), outsi
1fc90 64 65 20 6f 66 20 76 61 6c 69 64 20 72 61 6e 67  de of valid rang
1fca0 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09  e", slotID);....
1fcb0 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f  return(CKR_SLOT_
1fcc0 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  ID_INVALID);..}.
1fcd0 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
1fce0 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f   cackey_mutex_lo
1fcf0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
1fd00 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
1fd10 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
1fd20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1fd30 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63  NTF("Error.  Loc
1fd40 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
1fd50 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
1fd60 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
1fd70 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c  ...if (cackey_sl
1fd80 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69  ots[slotID].acti
1fd90 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43  ve == 0) {...CAC
1fda0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1fdb0 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64  ("Error. Invalid
1fdc0 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20   slot requested 
1fdd0 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20  (%lu), slot not 
1fde0 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65  currently active
1fdf0 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63  ", slotID);....c
1fe00 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
1fe10 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
1fe20 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  k);....return(CK
1fe30 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49  R_SLOT_ID_INVALI
1fe40 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63  D);..}...if (cac
1fe50 6b 65 79 5f 74 6f 6b 65 6e 5f 70 72 65 73 65 6e  key_token_presen
1fe60 74 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  t(&cackey_slots[
1fe70 73 6c 6f 74 49 44 5d 29 20 21 3d 20 43 41 43 4b  slotID]) != CACK
1fe80 45 59 5f 50 43 53 43 5f 53 5f 54 4f 4b 45 4e 50  EY_PCSC_S_TOKENP
1fe90 52 45 53 45 4e 54 29 20 7b 0a 09 09 43 41 43 4b  RESENT) {...CACK
1fea0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1feb0 22 4e 6f 20 74 6f 6b 65 6e 20 69 73 20 70 72 65  "No token is pre
1fec0 73 65 6e 74 20 69 6e 20 73 6c 6f 74 49 44 20 3d  sent in slotID =
1fed0 20 25 6c 75 22 2c 20 73 6c 6f 74 49 44 29 3b 0a   %lu", slotID);.
1fee0 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
1fef0 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
1ff00 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72  glock);....retur
1ff10 6e 28 43 4b 52 5f 54 4f 4b 45 4e 5f 4e 4f 54 5f  n(CKR_TOKEN_NOT_
1ff20 50 52 45 53 45 4e 54 29 3b 0a 09 7d 0a 0a 09 6d  PRESENT);..}...m
1ff30 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
1ff40 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
1ff50 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
1ff60 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
1ff70 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
1ff80 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1ff90 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f  TF("Error.  Unlo
1ffa0 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
1ffb0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
1ffc0 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
1ffd0 7d 0a 0a 09 2f 2a 20 44 65 74 65 72 6d 69 6e 65  }.../* Determine
1ffe0 20 74 6f 6b 65 6e 20 6c 61 62 65 6c 20 66 72 6f   token label fro
1fff0 6d 20 63 65 72 74 69 66 69 63 61 74 65 73 20 2a  m certificates *
20000 2f 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d  /..memset(pInfo-
20010 3e 6c 61 62 65 6c 2c 20 27 20 27 2c 20 73 69 7a  >label, ' ', siz
20020 65 6f 66 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c  eof(pInfo->label
20030 29 29 3b 0a 09 75 73 65 5f 64 65 66 61 75 6c 74  ));..use_default
20040 5f 6c 61 62 65 6c 20 3d 20 31 3b 0a 0a 09 69 66  _label = 1;...if
20050 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73   (cackey_slots[s
20060 6c 6f 74 49 44 5d 2e 6c 61 62 65 6c 20 3d 3d 20  lotID].label == 
20070 4e 55 4c 4c 29 20 7b 0a 09 09 70 63 73 63 5f 69  NULL) {...pcsc_i
20080 64 65 6e 74 69 74 69 65 73 20 3d 20 63 61 63 6b  dentities = cack
20090 65 79 5f 72 65 61 64 5f 63 65 72 74 73 28 26 63  ey_read_certs(&c
200a0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
200b0 49 44 5d 2c 20 4e 55 4c 4c 2c 20 26 6e 75 6d 5f  ID], NULL, &num_
200c0 63 65 72 74 73 29 3b 0a 09 09 69 66 20 28 70 63  certs);...if (pc
200d0 73 63 5f 69 64 65 6e 74 69 74 69 65 73 20 21 3d  sc_identities !=
200e0 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 69 66 20 28   NULL) {....if (
200f0 6e 75 6d 5f 63 65 72 74 73 20 3e 20 30 29 20 7b  num_certs > 0) {
20100 0a 09 09 09 09 6c 61 62 65 6c 5f 72 65 74 20 3d  .....label_ret =
20110 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65   cackey_pcsc_ide
20120 6e 74 69 74 79 5f 74 6f 5f 6c 61 62 65 6c 28 70  ntity_to_label(p
20130 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 2c 20  csc_identities, 
20140 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 2c 20 73 69  pInfo->label, si
20150 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6c 61 62 65  zeof(pInfo->labe
20160 6c 29 29 3b 0a 09 09 09 09 69 66 20 28 6c 61 62  l));.....if (lab
20170 65 6c 5f 72 65 74 20 3e 20 30 29 20 7b 0a 09 09  el_ret > 0) {...
20180 09 09 09 75 73 65 5f 64 65 66 61 75 6c 74 5f 6c  ...use_default_l
20190 61 62 65 6c 20 3d 20 30 3b 0a 0a 09 09 09 09 09  abel = 0;.......
201a0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f  cackey_slots[slo
201b0 74 49 44 5d 2e 6c 61 62 65 6c 20 3d 20 6d 61 6c  tID].label = mal
201c0 6c 6f 63 28 73 69 7a 65 6f 66 28 70 49 6e 66 6f  loc(sizeof(pInfo
201d0 2d 3e 6c 61 62 65 6c 29 29 3b 0a 0a 09 09 09 09  ->label));......
201e0 09 6d 65 6d 63 70 79 28 63 61 63 6b 65 79 5f 73  .memcpy(cackey_s
201f0 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61 62  lots[slotID].lab
20200 65 6c 2c 20 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c  el, pInfo->label
20210 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e  , sizeof(pInfo->
20220 6c 61 62 65 6c 29 29 3b 0a 09 09 09 09 7d 0a 09  label));.....}..
20230 09 09 7d 0a 0a 09 09 09 63 61 63 6b 65 79 5f 66  ..}.....cackey_f
20240 72 65 65 5f 63 65 72 74 73 28 70 63 73 63 5f 69  ree_certs(pcsc_i
20250 64 65 6e 74 69 74 69 65 73 2c 20 6e 75 6d 5f 63  dentities, num_c
20260 65 72 74 73 2c 20 31 29 3b 0a 09 09 7d 0a 09 7d  erts, 1);...}..}
20270 20 65 6c 73 65 20 7b 0a 09 09 6d 65 6d 63 70 79   else {...memcpy
20280 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 2c 20 63  (pInfo->label, c
20290 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
202a0 49 44 5d 2e 6c 61 62 65 6c 2c 20 73 69 7a 65 6f  ID].label, sizeo
202b0 66 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 29 29  f(pInfo->label))
202c0 3b 0a 0a 09 09 75 73 65 5f 64 65 66 61 75 6c 74  ;....use_default
202d0 5f 6c 61 62 65 6c 20 3d 20 30 3b 0a 09 7d 0a 0a  _label = 0;..}..
202e0 09 69 66 20 28 75 73 65 5f 64 65 66 61 75 6c 74  .if (use_default
202f0 5f 6c 61 62 65 6c 29 20 7b 0a 09 09 6d 65 6d 63  _label) {...memc
20300 70 79 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 2c  py(pInfo->label,
20310 20 64 65 66 61 75 6c 74 4c 61 62 65 6c 2c 20 73   defaultLabel, s
20320 69 7a 65 6f 66 28 64 65 66 61 75 6c 74 4c 61 62  izeof(defaultLab
20330 65 6c 29 20 2d 20 31 29 3b 0a 09 7d 0a 0a 09 6d  el) - 1);..}...m
20340 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 6d 61 6e  emset(pInfo->man
20350 75 66 61 63 74 75 72 65 72 49 44 2c 20 27 20 27  ufacturerID, ' '
20360 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e  , sizeof(pInfo->
20370 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 29 29  manufacturerID))
20380 3b 0a 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d  ;..memcpy(pInfo-
20390 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 2c  >manufacturerID,
203a0 20 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 2c   manufacturerID,
203b0 20 73 69 7a 65 6f 66 28 6d 61 6e 75 66 61 63 74   sizeof(manufact
203c0 75 72 65 72 49 44 29 20 2d 20 31 29 3b 0a 0a 09  urerID) - 1);...
203d0 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 6d 6f  memset(pInfo->mo
203e0 64 65 6c 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66  del, ' ', sizeof
203f0 28 70 49 6e 66 6f 2d 3e 6d 6f 64 65 6c 29 29 3b  (pInfo->model));
20400 0a 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e  ..memcpy(pInfo->
20410 6d 6f 64 65 6c 2c 20 6d 6f 64 65 6c 2c 20 73 69  model, model, si
20420 7a 65 6f 66 28 6d 6f 64 65 6c 29 20 2d 20 31 29  zeof(model) - 1)
20430 3b 0a 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f  ;...memset(pInfo
20440 2d 3e 73 65 72 69 61 6c 4e 75 6d 62 65 72 2c 20  ->serialNumber, 
20450 27 20 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66  ' ', sizeof(pInf
20460 6f 2d 3e 73 65 72 69 61 6c 4e 75 6d 62 65 72 29  o->serialNumber)
20470 29 3b 0a 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66  );...memset(pInf
20480 6f 2d 3e 75 74 63 54 69 6d 65 2c 20 27 20 27 2c  o->utcTime, ' ',
20490 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 75   sizeof(pInfo->u
204a0 74 63 54 69 6d 65 29 29 3b 0a 0a 09 70 49 6e 66  tcTime));...pInf
204b0 6f 2d 3e 68 61 72 64 77 61 72 65 56 65 72 73 69  o->hardwareVersi
204c0 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 28 63 61 63 6b  on.major = (cack
204d0 65 79 5f 67 65 74 76 65 72 73 69 6f 6e 28 29 20  ey_getversion() 
204e0 3e 3e 20 31 36 29 20 26 20 30 78 66 66 3b 0a 09  >> 16) & 0xff;..
204f0 70 49 6e 66 6f 2d 3e 68 61 72 64 77 61 72 65 56  pInfo->hardwareV
20500 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 28  ersion.minor = (
20510 63 61 63 6b 65 79 5f 67 65 74 76 65 72 73 69 6f  cackey_getversio
20520 6e 28 29 20 3e 3e 20 38 29 20 26 20 30 78 66 66  n() >> 8) & 0xff
20530 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 66 69 72 6d 77  ;...pInfo->firmw
20540 61 72 65 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72  areVersion.major
20550 20 3d 20 30 78 30 30 3b 0a 09 70 49 6e 66 6f 2d   = 0x00;..pInfo-
20560 3e 66 69 72 6d 77 61 72 65 56 65 72 73 69 6f 6e  >firmwareVersion
20570 2e 6d 69 6e 6f 72 20 3d 20 30 78 30 30 3b 0a 0a  .minor = 0x00;..
20580 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20 3d 20  .pInfo->flags = 
20590 43 4b 46 5f 57 52 49 54 45 5f 50 52 4f 54 45 43  CKF_WRITE_PROTEC
205a0 54 45 44 20 7c 20 43 4b 46 5f 55 53 45 52 5f 50  TED | CKF_USER_P
205b0 49 4e 5f 49 4e 49 54 49 41 4c 49 5a 45 44 20 7c  IN_INITIALIZED |
205c0 20 43 4b 46 5f 54 4f 4b 45 4e 5f 49 4e 49 54 49   CKF_TOKEN_INITI
205d0 41 4c 49 5a 45 44 20 7c 20 63 61 63 6b 65 79 5f  ALIZED | cackey_
205e0 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 74 6f  slots[slotID].to
205f0 6b 65 6e 5f 66 6c 61 67 73 3b 0a 0a 09 69 66 20  ken_flags;...if 
20600 28 63 61 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d  (cackey_pin_comm
20610 61 6e 64 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  and != NULL) {..
20620 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20 7c 3d  .pInfo->flags |=
20630 20 43 4b 46 5f 50 52 4f 54 45 43 54 45 44 5f 41   CKF_PROTECTED_A
20640 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 5f 50 41  UTHENTICATION_PA
20650 54 48 3b 0a 09 7d 0a 0a 09 70 49 6e 66 6f 2d 3e  TH;..}...pInfo->
20660 75 6c 4d 61 78 53 65 73 73 69 6f 6e 43 6f 75 6e  ulMaxSessionCoun
20670 74 20 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b  t = (sizeof(cack
20680 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73  ey_sessions) / s
20690 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
206a0 73 69 6f 6e 73 5b 30 5d 29 29 20 2d 20 31 3b 0a  sions[0])) - 1;.
206b0 09 70 49 6e 66 6f 2d 3e 75 6c 53 65 73 73 69 6f  .pInfo->ulSessio
206c0 6e 43 6f 75 6e 74 20 3d 20 43 4b 5f 55 4e 41 56  nCount = CK_UNAV
206d0 41 49 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d 41 54  AILABLE_INFORMAT
206e0 49 4f 4e 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 4d  ION;..pInfo->ulM
206f0 61 78 52 77 53 65 73 73 69 6f 6e 43 6f 75 6e 74  axRwSessionCount
20700 20 3d 20 30 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c   = 0;..pInfo->ul
20710 52 77 53 65 73 73 69 6f 6e 43 6f 75 6e 74 20 3d  RwSessionCount =
20720 20 43 4b 5f 55 4e 41 56 41 49 4c 41 42 4c 45 5f   CK_UNAVAILABLE_
20730 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a 09 70 49  INFORMATION;..pI
20740 6e 66 6f 2d 3e 75 6c 4d 61 78 50 69 6e 4c 65 6e  nfo->ulMaxPinLen
20750 20 3d 20 31 32 38 3b 0a 09 70 49 6e 66 6f 2d 3e   = 128;..pInfo->
20760 75 6c 4d 69 6e 50 69 6e 4c 65 6e 20 3d 20 30 3b  ulMinPinLen = 0;
20770 0a 09 70 49 6e 66 6f 2d 3e 75 6c 54 6f 74 61 6c  ..pInfo->ulTotal
20780 50 75 62 6c 69 63 4d 65 6d 6f 72 79 20 3d 20 43  PublicMemory = C
20790 4b 5f 55 4e 41 56 41 49 4c 41 42 4c 45 5f 49 4e  K_UNAVAILABLE_IN
207a0 46 4f 52 4d 41 54 49 4f 4e 3b 0a 09 70 49 6e 66  FORMATION;..pInf
207b0 6f 2d 3e 75 6c 46 72 65 65 50 75 62 6c 69 63 4d  o->ulFreePublicM
207c0 65 6d 6f 72 79 20 3d 20 43 4b 5f 55 4e 41 56 41  emory = CK_UNAVA
207d0 49 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d 41 54 49  ILABLE_INFORMATI
207e0 4f 4e 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 54 6f  ON;..pInfo->ulTo
207f0 74 61 6c 50 72 69 76 61 74 65 4d 65 6d 6f 72 79  talPrivateMemory
20800 20 3d 20 43 4b 5f 55 4e 41 56 41 49 4c 41 42 4c   = CK_UNAVAILABL
20810 45 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a 09  E_INFORMATION;..
20820 70 49 6e 66 6f 2d 3e 75 6c 46 72 65 65 50 72 69  pInfo->ulFreePri
20830 76 61 74 65 4d 65 6d 6f 72 79 20 3d 20 43 4b 5f  vateMemory = CK_
20840 55 4e 41 56 41 49 4c 41 42 4c 45 5f 49 4e 46 4f  UNAVAILABLE_INFO
20850 52 4d 41 54 49 4f 4e 3b 0a 0a 09 43 41 43 4b 45  RMATION;...CACKE
20860 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
20870 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b  Returning CKR_OK
20880 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b   (%i)", CKR_OK);
20890 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b  ...return(CKR_OK
208a0 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
208b0 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
208c0 43 5f 57 61 69 74 46 6f 72 53 6c 6f 74 45 76 65  C_WaitForSlotEve
208d0 6e 74 29 28 43 4b 5f 46 4c 41 47 53 20 66 6c 61  nt)(CK_FLAGS fla
208e0 67 73 2c 20 43 4b 5f 53 4c 4f 54 5f 49 44 5f 50  gs, CK_SLOT_ID_P
208f0 54 52 20 70 53 6c 6f 74 49 44 2c 20 43 4b 5f 56  TR pSlotID, CK_V
20900 4f 49 44 5f 50 54 52 20 70 52 65 73 65 72 76 65  OID_PTR pReserve
20910 64 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  d) {..CACKEY_DEB
20920 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
20930 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70 52 65 73  d.");...if (pRes
20940 65 72 76 65 64 20 21 3d 20 4e 55 4c 4c 29 20 7b  erved != NULL) {
20950 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
20960 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70  PRINTF("Error. p
20970 52 65 73 65 72 76 65 64 20 69 73 20 6e 6f 74 20  Reserved is not 
20980 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75  NULL.");....retu
20990 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53  rn(CKR_ARGUMENTS
209a0 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  _BAD);..}...if (
209b0 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
209c0 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
209d0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
209e0 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
209f0 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
20a00 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
20a10 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
20a20 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 58 58 58 3a 20  );..}.../* XXX: 
20a30 54 4f 44 4f 3a 20 49 6d 70 6c 65 6d 65 6e 74 20  TODO: Implement 
20a40 74 68 69 73 2e 2e 2e 20 2a 2f 0a 09 43 41 43 4b  this... */..CACK
20a50 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
20a60 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
20a70 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
20a80 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
20a90 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
20aa0 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
20ab0 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
20ac0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
20ad0 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
20ae0 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47  CTION(CK_RV, C_G
20af0 65 74 4d 65 63 68 61 6e 69 73 6d 4c 69 73 74 29  etMechanismList)
20b00 28 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74  (CK_SLOT_ID slot
20b10 49 44 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d  ID, CK_MECHANISM
20b20 5f 54 59 50 45 5f 50 54 52 20 70 4d 65 63 68 61  _TYPE_PTR pMecha
20b30 6e 69 73 6d 4c 69 73 74 2c 20 43 4b 5f 55 4c 4f  nismList, CK_ULO
20b40 4e 47 5f 50 54 52 20 70 75 6c 43 6f 75 6e 74 29  NG_PTR pulCount)
20b50 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
20b60 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
20b70 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
20b80 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
20b90 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
20ba0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
20bb0 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
20bc0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
20bd0 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
20be0 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
20bf0 0a 09 69 66 20 28 70 75 6c 43 6f 75 6e 74 20 3d  ..if (pulCount =
20c00 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
20c10 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
20c20 22 45 72 72 6f 72 2e 20 20 70 75 6c 43 6f 75 6e  "Error.  pulCoun
20c30 74 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09  t is NULL.");...
20c40 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55  .return(CKR_ARGU
20c50 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a  MENTS_BAD);..}..
20c60 09 69 66 20 28 70 4d 65 63 68 61 6e 69 73 6d 4c  .if (pMechanismL
20c70 69 73 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ist == NULL) {..
20c80 09 2a 70 75 6c 43 6f 75 6e 74 20 3d 20 31 3b 0a  .*pulCount = 1;.
20c90 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
20ca0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
20cb0 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20  g CKR_OK (%i)", 
20cc0 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74 75  CKR_OK);....retu
20cd0 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a  rn(CKR_OK);..}..
20ce0 09 69 66 20 28 2a 70 75 6c 43 6f 75 6e 74 20 3c  .if (*pulCount <
20cf0 20 31 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   1) {...CACKEY_D
20d00 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
20d10 6f 72 2e 20 20 42 75 66 66 65 72 20 74 6f 6f 20  or.  Buffer too 
20d20 73 6d 61 6c 6c 2e 22 29 3b 0a 0a 09 09 72 65 74  small.");....ret
20d30 75 72 6e 28 43 4b 52 5f 42 55 46 46 45 52 5f 54  urn(CKR_BUFFER_T
20d40 4f 4f 5f 53 4d 41 4c 4c 29 3b 0a 09 7d 0a 0a 09  OO_SMALL);..}...
20d50 70 4d 65 63 68 61 6e 69 73 6d 4c 69 73 74 5b 30  pMechanismList[0
20d60 5d 20 3d 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53  ] = CKM_RSA_PKCS
20d70 3b 0a 09 2a 70 75 6c 43 6f 75 6e 74 20 3d 20 31  ;..*pulCount = 1
20d80 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
20d90 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
20da0 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c  ng CKR_OK (%i)",
20db0 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75   CKR_OK);...retu
20dc0 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43  rn(CKR_OK);.}..C
20dd0 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
20de0 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 4d 65  N(CK_RV, C_GetMe
20df0 63 68 61 6e 69 73 6d 49 6e 66 6f 29 28 43 4b 5f  chanismInfo)(CK_
20e00 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 2c 20  SLOT_ID slotID, 
20e10 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 54 59 50  CK_MECHANISM_TYP
20e20 45 20 74 79 70 65 2c 20 43 4b 5f 4d 45 43 48 41  E type, CK_MECHA
20e30 4e 49 53 4d 5f 49 4e 46 4f 5f 50 54 52 20 70 49  NISM_INFO_PTR pI
20e40 6e 66 6f 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65  nfo) {..int mute
20e50 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b  x_retval;...CACK
20e60 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
20e70 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
20e80 20 28 70 49 6e 66 6f 20 3d 3d 20 4e 55 4c 4c 29   (pInfo == NULL)
20e90 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
20ea0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
20eb0 20 70 49 6e 66 6f 20 69 73 20 4e 55 4c 4c 2e 22   pInfo is NULL."
20ec0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
20ed0 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b  _ARGUMENTS_BAD);
20ee0 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ..}...if (!cacke
20ef0 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
20f00 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
20f10 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
20f20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
20f30 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
20f40 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
20f50 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
20f60 0a 09 69 66 20 28 73 6c 6f 74 49 44 20 3c 20 30  ..if (slotID < 0
20f70 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73   || slotID >= (s
20f80 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f  izeof(cackey_slo
20f90 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63  ts) / sizeof(cac
20fa0 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20  key_slots[0]))) 
20fb0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
20fc0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
20fd0 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71  Invalid slot req
20fe0 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 6f 75  uested (%lu), ou
20ff0 74 73 69 64 65 20 6f 66 20 76 61 6c 69 64 20 72  tside of valid r
21000 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a  ange", slotID);.
21010 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c  ...return(CKR_SL
21020 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a  OT_ID_INVALID);.
21030 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  .}...mutex_retva
21040 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
21050 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  _lock(cackey_big
21060 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
21070 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
21080 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
21090 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
210a0 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  Locking failed."
210b0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
210c0 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
210d0 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79  ..}...if (cackey
210e0 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61  _slots[slotID].a
210f0 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09  ctive == 0) {...
21100 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
21110 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61  NTF("Error. Inva
21120 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74  lid slot request
21130 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e  ed (%lu), slot n
21140 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74  ot currently act
21150 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a  ive", slotID);..
21160 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
21170 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
21180 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e  lock);....return
21190 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56  (CKR_SLOT_ID_INV
211a0 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65  ALID);..}...mute
211b0 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
211c0 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
211d0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
211e0 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
211f0 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
21200 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
21210 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69  "Error.  Unlocki
21220 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
21230 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
21240 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
21250 09 73 77 69 74 63 68 20 28 74 79 70 65 29 20 7b  .switch (type) {
21260 0a 09 09 63 61 73 65 20 43 4b 4d 5f 52 53 41 5f  ...case CKM_RSA_
21270 50 4b 43 53 3a 0a 09 09 09 70 49 6e 66 6f 2d 3e  PKCS:....pInfo->
21280 75 6c 4d 69 6e 4b 65 79 53 69 7a 65 20 3d 20 35  ulMinKeySize = 5
21290 31 32 3b 0a 09 09 09 70 49 6e 66 6f 2d 3e 75 6c  12;....pInfo->ul
212a0 4d 61 78 4b 65 79 53 69 7a 65 20 3d 20 38 31 39  MaxKeySize = 819
212b0 32 3b 0a 09 09 09 70 49 6e 66 6f 2d 3e 66 6c 61  2;....pInfo->fla
212c0 67 73 20 3d 20 43 4b 46 5f 48 57 20 7c 20 43 4b  gs = CKF_HW | CK
212d0 46 5f 45 4e 43 52 59 50 54 20 7c 20 43 4b 46 5f  F_ENCRYPT | CKF_
212e0 44 45 43 52 59 50 54 20 7c 20 43 4b 46 5f 53 49  DECRYPT | CKF_SI
212f0 47 4e 20 7c 20 43 4b 46 5f 56 45 52 49 46 59 3b  GN | CKF_VERIFY;
21300 0a 09 09 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09  ....break;..}...
21310 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
21320 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
21330 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52  KR_OK (%i)", CKR
21340 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  _OK);...return(C
21350 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 20 57 65  KR_OK);.}../* We
21360 20 64 6f 6e 27 74 20 73 75 70 70 6f 72 74 20 74   don't support t
21370 68 69 73 20 6d 65 74 68 6f 64 2e 20 2a 2f 0a 43  his method. */.C
21380 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
21390 4e 28 43 4b 5f 52 56 2c 20 43 5f 49 6e 69 74 54  N(CK_RV, C_InitT
213a0 6f 6b 65 6e 29 28 43 4b 5f 53 4c 4f 54 5f 49 44  oken)(CK_SLOT_ID
213b0 20 73 6c 6f 74 49 44 2c 20 43 4b 5f 55 54 46 38   slotID, CK_UTF8
213c0 43 48 41 52 5f 50 54 52 20 70 50 69 6e 2c 20 43  CHAR_PTR pPin, C
213d0 4b 5f 55 4c 4f 4e 47 20 75 6c 50 69 6e 4c 65 6e  K_ULONG ulPinLen
213e0 2c 20 43 4b 5f 55 54 46 38 43 48 41 52 5f 50 54  , CK_UTF8CHAR_PT
213f0 52 20 70 4c 61 62 65 6c 29 20 7b 0a 09 43 41 43  R pLabel) {..CAC
21400 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
21410 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
21420 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
21430 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
21440 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
21450 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
21460 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
21470 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
21480 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
21490 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
214a0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
214b0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 54 4f  Returning CKR_TO
214c0 4b 45 4e 5f 57 52 49 54 45 5f 50 52 4f 54 45 43  KEN_WRITE_PROTEC
214d0 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 54  TED (%i)", CKR_T
214e0 4f 4b 45 4e 5f 57 52 49 54 45 5f 50 52 4f 54 45  OKEN_WRITE_PROTE
214f0 43 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  CTED);...return(
21500 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49 54 45 5f  CKR_TOKEN_WRITE_
21510 50 52 4f 54 45 43 54 45 44 29 3b 0a 7d 0a 0a 2f  PROTECTED);.}../
21520 2a 20 57 65 20 64 6f 6e 27 74 20 73 75 70 70 6f  * We don't suppo
21530 72 74 20 74 68 69 73 20 6d 65 74 68 6f 64 2e 20  rt this method. 
21540 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  */.CK_DEFINE_FUN
21550 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 49  CTION(CK_RV, C_I
21560 6e 69 74 50 49 4e 29 28 43 4b 5f 53 45 53 53 49  nitPIN)(CK_SESSI
21570 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
21580 6f 6e 2c 20 43 4b 5f 55 54 46 38 43 48 41 52 5f  on, CK_UTF8CHAR_
21590 50 54 52 20 70 50 69 6e 2c 20 43 4b 5f 55 4c 4f  PTR pPin, CK_ULO
215a0 4e 47 20 75 6c 50 69 6e 4c 65 6e 29 20 7b 0a 09  NG ulPinLen) {..
215b0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
215c0 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
215d0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
215e0 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
215f0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
21600 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
21610 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
21620 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
21630 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
21640 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
21650 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
21660 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
21670 5f 54 4f 4b 45 4e 5f 57 52 49 54 45 5f 50 52 4f  _TOKEN_WRITE_PRO
21680 54 45 43 54 45 44 20 28 25 69 29 22 2c 20 43 4b  TECTED (%i)", CK
21690 52 5f 54 4f 4b 45 4e 5f 57 52 49 54 45 5f 50 52  R_TOKEN_WRITE_PR
216a0 4f 54 45 43 54 45 44 29 3b 0a 0a 09 72 65 74 75  OTECTED);...retu
216b0 72 6e 28 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49  rn(CKR_TOKEN_WRI
216c0 54 45 5f 50 52 4f 54 45 43 54 45 44 29 3b 0a 7d  TE_PROTECTED);.}
216d0 0a 0a 2f 2a 20 57 65 20 64 6f 6e 27 74 20 73 75  ../* We don't su
216e0 70 70 6f 72 74 20 74 68 69 73 20 6d 65 74 68 6f  pport this metho
216f0 64 2e 20 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45 5f  d. */.CK_DEFINE_
21700 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
21710 43 5f 53 65 74 50 49 4e 29 28 43 4b 5f 53 45 53  C_SetPIN)(CK_SES
21720 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
21730 73 69 6f 6e 2c 20 43 4b 5f 55 54 46 38 43 48 41  sion, CK_UTF8CHA
21740 52 5f 50 54 52 20 70 4f 6c 64 50 69 6e 2c 20 43  R_PTR pOldPin, C
21750 4b 5f 55 4c 4f 4e 47 20 75 6c 4f 6c 64 50 69 6e  K_ULONG ulOldPin
21760 4c 65 6e 2c 20 43 4b 5f 55 54 46 38 43 48 41 52  Len, CK_UTF8CHAR
21770 5f 50 54 52 20 70 4e 65 77 50 69 6e 2c 20 43 4b  _PTR pNewPin, CK
21780 5f 55 4c 4f 4e 47 20 75 6c 4e 65 77 50 69 6e 4c  _ULONG ulNewPinL
21790 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  en) {..CACKEY_DE
217a0 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
217b0 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
217c0 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
217d0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
217e0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
217f0 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
21800 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
21810 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
21820 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
21830 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
21840 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
21850 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
21860 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
21870 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
21880 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
21890 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
218a0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
218b0 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
218c0 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
218d0 4b 5f 52 56 2c 20 43 5f 4f 70 65 6e 53 65 73 73  K_RV, C_OpenSess
218e0 69 6f 6e 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20  ion)(CK_SLOT_ID 
218f0 73 6c 6f 74 49 44 2c 20 43 4b 5f 46 4c 41 47 53  slotID, CK_FLAGS
21900 20 66 6c 61 67 73 2c 20 43 4b 5f 56 4f 49 44 5f   flags, CK_VOID_
21910 50 54 52 20 70 41 70 70 6c 69 63 61 74 69 6f 6e  PTR pApplication
21920 2c 20 43 4b 5f 4e 4f 54 49 46 59 20 6e 6f 74 69  , CK_NOTIFY noti
21930 66 79 2c 20 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  fy, CK_SESSION_H
21940 41 4e 44 4c 45 5f 50 54 52 20 70 68 53 65 73 73  ANDLE_PTR phSess
21950 69 6f 6e 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64  ion) {..unsigned
21960 20 6c 6f 6e 67 20 69 64 78 3b 0a 09 69 6e 74 20   long idx;..int 
21970 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09 69  mutex_retval;..i
21980 6e 74 20 66 6f 75 6e 64 5f 73 65 73 73 69 6f 6e  nt found_session
21990 20 3d 20 30 3b 0a 0a 09 43 41 43 4b 45 59 5f 44   = 0;...CACKEY_D
219a0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
219b0 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 28 66  led.");...if ((f
219c0 6c 61 67 73 20 26 20 43 4b 46 5f 53 45 52 49 41  lags & CKF_SERIA
219d0 4c 5f 53 45 53 53 49 4f 4e 29 20 21 3d 20 43 4b  L_SESSION) != CK
219e0 46 5f 53 45 52 49 41 4c 5f 53 45 53 53 49 4f 4e  F_SERIAL_SESSION
219f0 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ) {...return(CKR
21a00 5f 53 45 53 53 49 4f 4e 5f 50 41 52 41 4c 4c 45  _SESSION_PARALLE
21a10 4c 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  L_NOT_SUPPORTED)
21a20 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b  ;..}...if (!cack
21a30 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
21a40 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
21a50 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
21a60 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
21a70 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
21a80 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
21a90 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
21aa0 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44 20 3c 20  ...if (slotID < 
21ab0 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28  0 || slotID >= (
21ac0 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
21ad0 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ots) / sizeof(ca
21ae0 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29  ckey_slots[0])))
21af0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
21b00 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
21b10 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65   Invalid slot re
21b20 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 6f  quested (%lu), o
21b30 75 74 73 69 64 65 20 6f 66 20 76 61 6c 69 64 20  utside of valid 
21b40 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b  range", slotID);
21b50 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
21b60 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b  LOT_ID_INVALID);
21b70 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  ..}...mutex_retv
21b80 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
21b90 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  x_lock(cackey_bi
21ba0 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
21bb0 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
21bc0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
21bd0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
21be0 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e   Locking failed.
21bf0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
21c00 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
21c10 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65  ;..}...if (cacke
21c20 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e  y_slots[slotID].
21c30 61 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09  active == 0) {..
21c40 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
21c50 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76  INTF("Error. Inv
21c60 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73  alid slot reques
21c70 74 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20  ted (%lu), slot 
21c80 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61 63  not currently ac
21c90 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a  tive", slotID);.
21ca0 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
21cb0 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
21cc0 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72  glock);....retur
21cd0 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e  n(CKR_SLOT_ID_IN
21ce0 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 2f 2a 20  VALID);..}.../* 
21cf0 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  Verify that the 
21d00 63 61 72 64 20 69 73 20 61 63 74 75 61 6c 6c 79  card is actually
21d10 20 69 6e 20 74 68 65 20 73 6c 6f 74 2e 20 2a 2f   in the slot. */
21d20 0a 09 2f 2a 20 58 58 58 3a 20 43 68 65 63 6b 20  ../* XXX: Check 
21d30 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 69  to make sure thi
21d40 73 20 69 73 20 69 6e 20 74 68 65 20 50 4b 43 53  s is in the PKCS
21d50 23 31 31 20 73 70 65 63 69 66 69 63 61 74 69 6f  #11 specificatio
21d60 6e 20 2a 2f 0a 09 69 66 20 28 63 61 63 6b 65 79  n */..if (cackey
21d70 5f 74 6f 6b 65 6e 5f 70 72 65 73 65 6e 74 28 26  _token_present(&
21d80 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f  cackey_slots[slo
21d90 74 49 44 5d 29 20 21 3d 20 43 41 43 4b 45 59 5f  tID]) != CACKEY_
21da0 50 43 53 43 5f 53 5f 54 4f 4b 45 4e 50 52 45 53  PCSC_S_TOKENPRES
21db0 45 4e 54 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ENT) {...CACKEY_
21dc0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
21dd0 72 6f 72 2e 20 20 43 61 72 64 20 6e 6f 74 20 70  ror.  Card not p
21de0 72 65 73 65 6e 74 2e 20 20 52 65 74 75 72 6e 69  resent.  Returni
21df0 6e 67 20 43 4b 52 5f 44 45 56 49 43 45 5f 52 45  ng CKR_DEVICE_RE
21e00 4d 4f 56 45 44 22 29 3b 0a 0a 09 09 63 61 63 6b  MOVED");....cack
21e10 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
21e20 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
21e30 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 44  ....return(CKR_D
21e40 45 56 49 43 45 5f 52 45 4d 4f 56 45 44 29 3b 0a  EVICE_REMOVED);.
21e50 09 7d 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d 20  .}...for (idx = 
21e60 31 3b 20 69 64 78 20 3c 20 28 73 69 7a 65 6f 66  1; idx < (sizeof
21e70 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
21e80 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
21e90 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 3b  y_sessions[0]));
21ea0 20 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28   idx++) {...if (
21eb0 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  !cackey_sessions
21ec0 5b 69 64 78 5d 2e 61 63 74 69 76 65 29 20 7b 0a  [idx].active) {.
21ed0 09 09 09 66 6f 75 6e 64 5f 73 65 73 73 69 6f 6e  ...found_session
21ee0 20 3d 20 31 3b 0a 0a 09 09 09 2a 70 68 53 65 73   = 1;.....*phSes
21ef0 73 69 6f 6e 20 3d 20 69 64 78 3b 0a 0a 09 09 09  sion = idx;.....
21f00 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
21f10 69 64 78 5d 2e 61 63 74 69 76 65 20 3d 20 31 3b  idx].active = 1;
21f20 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ....cackey_sessi
21f30 6f 6e 73 5b 69 64 78 5d 2e 73 6c 6f 74 49 44 20  ons[idx].slotID 
21f40 3d 20 73 6c 6f 74 49 44 3b 0a 09 09 09 63 61 63  = slotID;....cac
21f50 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78  key_sessions[idx
21f60 5d 2e 73 74 61 74 65 20 3d 20 43 4b 53 5f 52 4f  ].state = CKS_RO
21f70 5f 50 55 42 4c 49 43 5f 53 45 53 53 49 4f 4e 3b  _PUBLIC_SESSION;
21f80 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ....cackey_sessi
21f90 6f 6e 73 5b 69 64 78 5d 2e 66 6c 61 67 73 20 3d  ons[idx].flags =
21fa0 20 66 6c 61 67 73 3b 0a 09 09 09 63 61 63 6b 65   flags;....cacke
21fb0 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e  y_sessions[idx].
21fc0 75 6c 44 65 76 69 63 65 45 72 72 6f 72 20 3d 20  ulDeviceError = 
21fd0 30 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73  0;....cackey_ses
21fe0 73 69 6f 6e 73 5b 69 64 78 5d 2e 70 41 70 70 6c  sions[idx].pAppl
21ff0 69 63 61 74 69 6f 6e 20 3d 20 70 41 70 70 6c 69  ication = pAppli
22000 63 61 74 69 6f 6e 3b 0a 09 09 09 63 61 63 6b 65  cation;....cacke
22010 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e  y_sessions[idx].
22020 4e 6f 74 69 66 79 20 3d 20 6e 6f 74 69 66 79 3b  Notify = notify;
22030 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73  .....cackey_sess
22040 69 6f 6e 73 5b 69 64 78 5d 2e 69 64 65 6e 74 69  ions[idx].identi
22050 74 69 65 73 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09  ties = NULL;....
22060 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
22070 69 64 78 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f  idx].identities_
22080 63 6f 75 6e 74 20 3d 20 30 3b 0a 0a 09 09 09 63  count = 0;.....c
22090 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69  ackey_sessions[i
220a0 64 78 5d 2e 73 65 61 72 63 68 5f 61 63 74 69 76  dx].search_activ
220b0 65 20 3d 20 30 3b 0a 0a 09 09 09 63 61 63 6b 65  e = 0;.....cacke
220c0 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e  y_sessions[idx].
220d0 73 69 67 6e 5f 61 63 74 69 76 65 20 3d 20 30 3b  sign_active = 0;
220e0 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73  .....cackey_sess
220f0 69 6f 6e 73 5b 69 64 78 5d 2e 64 65 63 72 79 70  ions[idx].decryp
22100 74 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a 0a 09  t_active = 0;...
22110 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
22120 73 5b 69 64 78 5d 2e 69 64 65 6e 74 69 74 69 65  s[idx].identitie
22130 73 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f  s = cackey_read_
22140 69 64 65 6e 74 69 74 69 65 73 28 26 63 61 63 6b  identities(&cack
22150 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
22160 2c 20 26 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  , &cackey_sessio
22170 6e 73 5b 69 64 78 5d 2e 69 64 65 6e 74 69 74 69  ns[idx].identiti
22180 65 73 5f 63 6f 75 6e 74 29 3b 0a 0a 0a 09 09 09  es_count);......
22190 62 72 65 61 6b 3b 0a 09 09 7d 0a 09 7d 0a 0a 09  break;...}..}...
221a0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
221b0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
221c0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
221d0 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
221e0 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
221f0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
22200 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c  NTF("Error.  Unl
22210 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
22220 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
22230 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
22240 09 7d 0a 0a 09 69 66 20 28 21 66 6f 75 6e 64 5f  .}...if (!found_
22250 73 65 73 73 69 6f 6e 29 20 7b 0a 09 09 43 41 43  session) {...CAC
22260 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
22270 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
22280 53 45 53 53 49 4f 4e 5f 43 4f 55 4e 54 20 28 25  SESSION_COUNT (%
22290 69 29 22 2c 20 43 4b 52 5f 53 45 53 53 49 4f 4e  i)", CKR_SESSION
222a0 5f 43 4f 55 4e 54 29 3b 0a 0a 09 09 72 65 74 75  _COUNT);....retu
222b0 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 43  rn(CKR_SESSION_C
222c0 4f 55 4e 54 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  OUNT);..}...CACK
222d0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
222e0 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
222f0 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29  K (%i)", CKR_OK)
22300 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ;...return(CKR_O
22310 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  K);.}..CK_DEFINE
22320 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
22330 20 43 5f 43 6c 6f 73 65 53 65 73 73 69 6f 6e 29   C_CloseSession)
22340 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
22350 4c 45 20 68 53 65 73 73 69 6f 6e 29 20 7b 0a 09  LE hSession) {..
22360 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c  int mutex_retval
22370 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
22380 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
22390 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
223a0 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
223b0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
223c0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
223d0 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
223e0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
223f0 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
22400 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
22410 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d  ..if (hSession =
22420 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20  = 0 || hSession 
22430 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65  >= (sizeof(cacke
22440 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69  y_sessions) / si
22450 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
22460 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43  ions[0]))) {...C
22470 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
22480 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73  TF("Error.  Sess
22490 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65  ion out of range
224a0 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
224b0 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  (CKR_SESSION_HAN
224c0 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  DLE_INVALID);..}
224d0 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
224e0 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c  = cackey_mutex_l
224f0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
22500 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
22510 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
22520 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
22530 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f  INTF("Error.  Lo
22540 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
22550 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
22560 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
22570 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  }...if (!cackey_
22580 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
22590 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63  n].active) {...c
225a0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
225b0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
225c0 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  k);....CACKEY_DE
225d0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
225e0 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20  r.  Session not 
225f0 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09  active.");......
22600 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
22610 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  ON_HANDLE_INVALI
22620 44 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f  D);..}...cackey_
22630 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
22640 6e 5d 2e 61 63 74 69 76 65 20 3d 20 30 3b 0a 09  n].active = 0;..
22650 63 61 63 6b 65 79 5f 66 72 65 65 5f 69 64 65 6e  cackey_free_iden
22660 74 69 74 69 65 73 28 63 61 63 6b 65 79 5f 73 65  tities(cackey_se
22670 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
22680 2e 69 64 65 6e 74 69 74 69 65 73 2c 20 63 61 63  .identities, cac
22690 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
226a0 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65  ssion].identitie
226b0 73 5f 63 6f 75 6e 74 29 3b 0a 0a 09 6d 75 74 65  s_count);...mute
226c0 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
226d0 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
226e0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
226f0 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
22700 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
22710 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
22720 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69  "Error.  Unlocki
22730 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
22740 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
22750 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
22760 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
22770 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
22780 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b  CKR_OK (%i)", CK
22790 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28  R_OK);...return(
227a0 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44  CKR_OK);.}..CK_D
227b0 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
227c0 4b 5f 52 56 2c 20 43 5f 43 6c 6f 73 65 41 6c 6c  K_RV, C_CloseAll
227d0 53 65 73 73 69 6f 6e 73 29 28 43 4b 5f 53 4c 4f  Sessions)(CK_SLO
227e0 54 5f 49 44 20 73 6c 6f 74 49 44 29 20 7b 0a 09  T_ID slotID) {..
227f0 75 69 6e 74 33 32 5f 74 20 69 64 78 3b 0a 09 69  uint32_t idx;..i
22800 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b  nt mutex_retval;
22810 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
22820 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
22830 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
22840 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
22850 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
22860 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
22870 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
22880 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
22890 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
228a0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
228b0 09 69 66 20 28 73 6c 6f 74 49 44 20 3c 20 30 20  .if (slotID < 0 
228c0 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69  || slotID >= (si
228d0 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
228e0 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
228f0 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b  ey_slots[0]))) {
22900 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
22910 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49  PRINTF("Error. I
22920 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75  nvalid slot requ
22930 65 73 74 65 64 20 28 25 6c 75 29 2c 20 6f 75 74  ested (%lu), out
22940 73 69 64 65 20 6f 66 20 76 61 6c 69 64 20 72 61  side of valid ra
22950 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a  nge", slotID);..
22960 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f  ..return(CKR_SLO
22970 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  T_ID_INVALID);..
22980 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  }...mutex_retval
22990 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
229a0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
229b0 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
229c0 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
229d0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
229e0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c  RINTF("Error.  L
229f0 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
22a00 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
22a10 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
22a20 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f  .}...if (cackey_
22a30 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63  slots[slotID].ac
22a40 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43  tive == 0) {...C
22a50 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
22a60 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c  TF("Error. Inval
22a70 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65  id slot requeste
22a80 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f  d (%lu), slot no
22a90 74 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69  t currently acti
22aa0 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09  ve", slotID);...
22ab0 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
22ac0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
22ad0 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  ock);....return(
22ae0 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41  CKR_SLOT_ID_INVA
22af0 4c 49 44 29 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28  LID);..}...for (
22b00 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 28  idx = 0; idx < (
22b10 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
22b20 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66  ssions) / sizeof
22b30 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
22b40 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29 20 7b 0a  [0])); idx++) {.
22b50 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73  ..if (cackey_ses
22b60 73 69 6f 6e 73 5b 69 64 78 5d 2e 61 63 74 69 76  sions[idx].activ
22b70 65 29 20 7b 0a 09 09 09 69 66 20 28 63 61 63 6b  e) {....if (cack
22b80 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d  ey_sessions[idx]
22b90 2e 73 6c 6f 74 49 44 20 21 3d 20 73 6c 6f 74 49  .slotID != slotI
22ba0 44 29 20 7b 0a 09 09 09 09 63 6f 6e 74 69 6e 75  D) {.....continu
22bb0 65 3b 0a 09 09 09 7d 0a 0a 09 09 09 63 61 63 6b  e;....}.....cack
22bc0 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
22bd0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
22be0 0a 09 09 09 43 5f 43 6c 6f 73 65 53 65 73 73 69  ....C_CloseSessi
22bf0 6f 6e 28 69 64 78 29 3b 0a 09 09 09 63 61 63 6b  on(idx);....cack
22c00 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61  ey_mutex_lock(ca
22c10 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
22c20 09 7d 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65  .}..}...mutex_re
22c30 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
22c40 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
22c50 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
22c60 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
22c70 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
22c80 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
22c90 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66  or.  Unlocking f
22ca0 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
22cb0 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
22cc0 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43  ERROR);..}...CAC
22cd0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
22ce0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
22cf0 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b  OK (%i)", CKR_OK
22d00 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
22d10 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  OK);.}..CK_DEFIN
22d20 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
22d30 2c 20 43 5f 47 65 74 53 65 73 73 69 6f 6e 49 6e  , C_GetSessionIn
22d40 66 6f 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  fo)(CK_SESSION_H
22d50 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
22d60 43 4b 5f 53 45 53 53 49 4f 4e 5f 49 4e 46 4f 5f  CK_SESSION_INFO_
22d70 50 54 52 20 70 49 6e 66 6f 29 20 7b 0a 09 69 6e  PTR pInfo) {..in
22d80 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a  t mutex_retval;.
22d90 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
22da0 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
22db0 3b 0a 0a 09 69 66 20 28 70 49 6e 66 6f 20 3d 3d  ;...if (pInfo ==
22dc0 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
22dd0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
22de0 45 72 72 6f 72 2e 20 70 49 6e 66 6f 20 69 73 20  Error. pInfo is 
22df0 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75  NULL.");....retu
22e00 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53  rn(CKR_ARGUMENTS
22e10 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  _BAD);..}...if (
22e20 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
22e30 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
22e40 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
22e50 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
22e60 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
22e70 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
22e80 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
22e90 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73  );..}...if (hSes
22ea0 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65  sion == 0 || hSe
22eb0 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66  ssion >= (sizeof
22ec0 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
22ed0 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
22ee0 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29  y_sessions[0])))
22ef0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
22f00 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
22f10 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66    Session out of
22f20 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09   range.");......
22f30 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
22f40 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  ON_HANDLE_INVALI
22f50 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  D);..}...mutex_r
22f60 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
22f70 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79  utex_lock(cackey
22f80 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
22f90 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
22fa0 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
22fb0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
22fc0 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c  r.  Locking fail
22fd0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
22fe0 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
22ff0 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63  OR);..}...if (!c
23000 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
23010 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29  Session].active)
23020 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65   {...cackey_mute
23030 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
23040 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43  biglock);....CAC
23050 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
23060 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f  ("Error.  Sessio
23070 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b  n not active.");
23080 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
23090 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
230a0 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 70  INVALID);..}...p
230b0 49 6e 66 6f 2d 3e 73 6c 6f 74 49 44 20 3d 20 63  Info->slotID = c
230c0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
230d0 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44 3b  Session].slotID;
230e0 0a 09 70 49 6e 66 6f 2d 3e 73 74 61 74 65 20 3d  ..pInfo->state =
230f0 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73   cackey_sessions
23100 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 74 61 74 65  [hSession].state
23110 3b 0a 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20  ;..pInfo->flags 
23120 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  = cackey_session
23130 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 66 6c 61 67  s[hSession].flag
23140 73 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 44 65 76  s;..pInfo->ulDev
23150 69 63 65 45 72 72 6f 72 20 3d 20 63 61 63 6b 65  iceError = cacke
23160 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
23170 69 6f 6e 5d 2e 75 6c 44 65 76 69 63 65 45 72 72  ion].ulDeviceErr
23180 6f 72 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  or;...mutex_retv
23190 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
231a0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
231b0 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
231c0 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
231d0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
231e0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
231f0 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69  .  Unlocking fai
23200 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
23210 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
23220 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ROR);..}...CACKE
23230 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
23240 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b  Returning CKR_OK
23250 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b   (%i)", CKR_OK);
23260 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b  ...return(CKR_OK
23270 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
23280 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
23290 43 5f 47 65 74 4f 70 65 72 61 74 69 6f 6e 53 74  C_GetOperationSt
232a0 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  ate)(CK_SESSION_
232b0 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
232c0 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 4f 70   CK_BYTE_PTR pOp
232d0 65 72 61 74 69 6f 6e 53 74 61 74 65 2c 20 43 4b  erationState, CK
232e0 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 4f 70  _ULONG_PTR pulOp
232f0 65 72 61 74 69 6f 6e 53 74 61 74 65 4c 65 6e 29  erationStateLen)
23300 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
23310 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
23320 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
23330 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
23340 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
23350 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
23360 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
23370 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
23380 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
23390 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
233a0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
233b0 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
233c0 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
233d0 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
233e0 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
233f0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
23400 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
23410 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
23420 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  TED);.}..CK_DEFI
23430 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
23440 56 2c 20 43 5f 53 65 74 4f 70 65 72 61 74 69 6f  V, C_SetOperatio
23450 6e 53 74 61 74 65 29 28 43 4b 5f 53 45 53 53 49  nState)(CK_SESSI
23460 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
23470 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  on, CK_BYTE_PTR 
23480 70 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 65 2c  pOperationState,
23490 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 4f 70 65 72   CK_ULONG ulOper
234a0 61 74 69 6f 6e 53 74 61 74 65 4c 65 6e 2c 20 43  ationStateLen, C
234b0 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20  K_OBJECT_HANDLE 
234c0 68 45 6e 63 72 79 70 74 69 6f 6e 4b 65 79 2c 20  hEncryptionKey, 
234d0 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45  CK_OBJECT_HANDLE
234e0 20 68 41 75 74 68 65 6e 74 69 63 61 74 69 6f 6e   hAuthentication
234f0 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  Key) {..CACKEY_D
23500 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
23510 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
23520 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
23530 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
23540 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
23550 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
23560 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
23570 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
23580 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
23590 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
235a0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
235b0 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
235c0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
235d0 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
235e0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
235f0 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
23600 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
23610 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
23620 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
23630 43 4b 5f 52 56 2c 20 5f 43 5f 4c 6f 67 69 6e 4d  CK_RV, _C_LoginM
23640 75 74 65 78 41 72 67 29 28 43 4b 5f 53 45 53 53  utexArg)(CK_SESS
23650 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
23660 69 6f 6e 2c 20 43 4b 5f 55 53 45 52 5f 54 59 50  ion, CK_USER_TYP
23670 45 20 75 73 65 72 54 79 70 65 2c 20 43 4b 5f 55  E userType, CK_U
23680 54 46 38 43 48 41 52 5f 50 54 52 20 70 50 69 6e  TF8CHAR_PTR pPin
23690 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 69 6e  , CK_ULONG ulPin
236a0 4c 65 6e 2c 20 69 6e 74 20 6c 6f 63 6b 5f 6d 75  Len, int lock_mu
236b0 74 65 78 29 20 7b 0a 09 43 4b 5f 53 4c 4f 54 5f  tex) {..CK_SLOT_
236c0 49 44 20 73 6c 6f 74 49 44 3b 0a 09 46 49 4c 45  ID slotID;..FILE
236d0 20 2a 70 69 6e 66 64 3b 0a 09 63 68 61 72 20 2a   *pinfd;..char *
236e0 70 69 6e 63 6d 64 2c 20 70 69 6e 62 75 66 5b 36  pincmd, pinbuf[6
236f0 34 5d 2c 20 2a 66 67 65 74 73 5f 72 65 74 3b 0a  4], *fgets_ret;.
23700 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61  .int mutex_retva
23710 6c 3b 0a 09 69 6e 74 20 74 72 69 65 73 5f 72 65  l;..int tries_re
23720 6d 61 69 6e 69 6e 67 3b 0a 09 69 6e 74 20 6c 6f  maining;..int lo
23730 67 69 6e 5f 72 65 74 3b 0a 09 69 6e 74 20 70 63  gin_ret;..int pc
23740 6c 6f 73 65 5f 72 65 74 3b 0a 0a 09 43 41 43 4b  lose_ret;...CACK
23750 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
23760 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
23770 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
23780 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
23790 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
237a0 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
237b0 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
237c0 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
237d0 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
237e0 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53  ED);..}...if (hS
237f0 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68  ession == 0 || h
23800 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65  Session >= (size
23810 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
23820 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63  ns) / sizeof(cac
23830 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29  key_sessions[0])
23840 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  )) {...CACKEY_DE
23850 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
23860 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20  r.  Session out 
23870 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a  of range.");....
23880 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53  ..return(CKR_SES
23890 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41  SION_HANDLE_INVA
238a0 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75  LID);..}...if (u
238b0 73 65 72 54 79 70 65 20 21 3d 20 43 4b 55 5f 55  serType != CKU_U
238c0 53 45 52 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  SER) {...CACKEY_
238d0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
238e0 72 6f 72 2e 20 20 57 65 20 6f 6e 6c 79 20 73 75  ror.  We only su
238f0 70 70 6f 72 74 20 55 53 45 52 20 6d 6f 64 65 2c  pport USER mode,
23900 20 61 73 6b 65 64 20 66 6f 72 20 25 6c 75 20 6d   asked for %lu m
23910 6f 64 65 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64  ode.", (unsigned
23920 20 6c 6f 6e 67 29 20 75 73 65 72 54 79 70 65 29   long) userType)
23930 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 55  ....return(CKR_U
23940 53 45 52 5f 54 59 50 45 5f 49 4e 56 41 4c 49 44  SER_TYPE_INVALID
23950 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 6c 6f 63 6b  );..}...if (lock
23960 5f 6d 75 74 65 78 29 20 7b 0a 09 09 6d 75 74 65  _mutex) {...mute
23970 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
23980 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63  y_mutex_lock(cac
23990 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 09  key_biglock);...
239a0 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
239b0 20 21 3d 20 30 29 20 7b 0a 09 09 09 43 41 43 4b   != 0) {....CACK
239c0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
239d0 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67  "Error.  Locking
239e0 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 09   failed.");.....
239f0 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
23a00 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 09 7d 0a 09  AL_ERROR);...}..
23a10 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  }...if (!cackey_
23a20 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
23a30 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 69  n].active) {...i
23a40 66 20 28 6c 6f 63 6b 5f 6d 75 74 65 78 29 20 7b  f (lock_mutex) {
23a50 0a 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  ....cackey_mutex
23a60 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
23a70 69 67 6c 6f 63 6b 29 3b 0a 09 09 7d 0a 0a 09 09  iglock);...}....
23a80 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
23a90 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73  NTF("Error.  Ses
23aa0 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e  sion not active.
23ab0 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
23ac0 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  CKR_SESSION_HAND
23ad0 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  LE_INVALID);..}.
23ae0 0a 09 73 6c 6f 74 49 44 20 3d 20 63 61 63 6b 65  ..slotID = cacke
23af0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
23b00 69 6f 6e 5d 2e 73 6c 6f 74 49 44 3b 0a 0a 09 69  ion].slotID;...i
23b10 66 20 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c  f (slotID < 0 ||
23b20 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65   slotID >= (size
23b30 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29  of(cackey_slots)
23b40 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
23b50 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09  _slots[0]))) {..
23b60 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
23b70 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76  INTF("Error. Inv
23b80 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73  alid slot reques
23b90 74 65 64 20 28 25 6c 75 29 2c 20 6f 75 74 73 69  ted (%lu), outsi
23ba0 64 65 20 6f 66 20 76 61 6c 69 64 20 72 61 6e 67  de of valid rang
23bb0 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09  e", slotID);....
23bc0 69 66 20 28 6c 6f 63 6b 5f 6d 75 74 65 78 29 20  if (lock_mutex) 
23bd0 7b 0a 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65  {....cackey_mute
23be0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
23bf0 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 7d 0a 0a 09  biglock);...}...
23c00 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
23c10 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
23c20 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74  .if (cackey_slot
23c30 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65  s[slotID].active
23c40 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   == 0) {...CACKE
23c50 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
23c60 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73  Error. Invalid s
23c70 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25  lot requested (%
23c80 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75  lu), slot not cu
23c90 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 22 2c  rrently active",
23ca0 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 69 66 20   slotID);....if 
23cb0 28 6c 6f 63 6b 5f 6d 75 74 65 78 29 20 7b 0a 09  (lock_mutex) {..
23cc0 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
23cd0 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
23ce0 6c 6f 63 6b 29 3b 0a 09 09 7d 0a 0a 09 09 72 65  lock);...}....re
23cf0 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
23d00 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 70 69  _ERROR);..}...pi
23d10 6e 63 6d 64 20 3d 20 63 61 63 6b 65 79 5f 70 69  ncmd = cackey_pi
23d20 6e 5f 63 6f 6d 6d 61 6e 64 3b 0a 09 69 66 20 28  n_command;..if (
23d30 70 69 6e 63 6d 64 20 21 3d 20 4e 55 4c 4c 29 20  pincmd != NULL) 
23d40 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
23d50 5f 50 52 49 4e 54 46 28 22 43 41 43 4b 45 59 5f  _PRINTF("CACKEY_
23d60 50 49 4e 5f 43 4f 4d 4d 41 4e 44 20 3d 20 25 73  PIN_COMMAND = %s
23d70 22 2c 20 70 69 6e 63 6d 64 29 3b 0a 0a 09 09 69  ", pincmd);....i
23d80 66 20 28 70 50 69 6e 20 21 3d 20 4e 55 4c 4c 29  f (pPin != NULL)
23d90 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
23da0 55 47 5f 50 52 49 4e 54 46 28 22 50 72 6f 74 65  UG_PRINTF("Prote
23db0 63 74 65 64 20 61 75 74 68 65 6e 74 69 63 61 74  cted authenticat
23dc0 69 6f 6e 20 70 61 74 68 20 69 6e 20 65 66 66 65  ion path in effe
23dd0 63 74 20 61 6e 64 20 50 49 4e 20 70 72 6f 76 69  ct and PIN provi
23de0 64 65 64 20 21 3f 22 29 3b 0a 09 09 7d 0a 0a 09  ded !?");...}...
23df0 09 70 69 6e 66 64 20 3d 20 70 6f 70 65 6e 28 70  .pinfd = popen(p
23e00 69 6e 63 6d 64 2c 20 22 72 22 29 3b 0a 09 09 69  incmd, "r");...i
23e10 66 20 28 70 69 6e 66 64 20 3d 3d 20 4e 55 4c 4c  f (pinfd == NULL
23e20 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
23e30 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
23e40 72 2e 20 20 25 73 3a 20 55 6e 61 62 6c 65 20 74  r.  %s: Unable t
23e50 6f 20 72 75 6e 22 2c 20 70 69 6e 63 6d 64 29 3b  o run", pincmd);
23e60 0a 0a 09 09 09 69 66 20 28 6c 6f 63 6b 5f 6d 75  .....if (lock_mu
23e70 74 65 78 29 20 7b 0a 09 09 09 09 63 61 63 6b 65  tex) {.....cacke
23e80 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
23e90 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
23ea0 09 09 09 7d 0a 0a 09 09 09 43 41 43 4b 45 59 5f  ...}.....CACKEY_
23eb0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
23ec0 74 75 72 6e 69 6e 67 20 43 4b 52 5f 50 49 4e 5f  turning CKR_PIN_
23ed0 49 4e 43 4f 52 52 45 43 54 20 28 25 69 29 22 2c  INCORRECT (%i)",
23ee0 20 28 69 6e 74 29 20 43 4b 52 5f 50 49 4e 5f 49   (int) CKR_PIN_I
23ef0 4e 43 4f 52 52 45 43 54 29 3b 0a 0a 09 09 09 72  NCORRECT);.....r
23f00 65 74 75 72 6e 28 43 4b 52 5f 50 49 4e 5f 49 4e  eturn(CKR_PIN_IN
23f10 43 4f 52 52 45 43 54 29 3b 0a 09 09 7d 0a 0a 09  CORRECT);...}...
23f20 09 66 67 65 74 73 5f 72 65 74 20 3d 20 66 67 65  .fgets_ret = fge
23f30 74 73 28 70 69 6e 62 75 66 2c 20 73 69 7a 65 6f  ts(pinbuf, sizeo
23f40 66 28 70 69 6e 62 75 66 29 2c 20 70 69 6e 66 64  f(pinbuf), pinfd
23f50 29 3b 0a 09 09 69 66 20 28 66 67 65 74 73 5f 72  );...if (fgets_r
23f60 65 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  et == NULL) {...
23f70 09 70 69 6e 62 75 66 5b 30 5d 20 3d 20 27 5c 30  .pinbuf[0] = '\0
23f80 27 3b 0a 09 09 7d 0a 0a 09 09 70 63 6c 6f 73 65  ';...}....pclose
23f90 5f 72 65 74 20 3d 20 70 63 6c 6f 73 65 28 70 69  _ret = pclose(pi
23fa0 6e 66 64 29 3b 0a 09 09 69 66 20 28 70 63 6c 6f  nfd);...if (pclo
23fb0 73 65 5f 72 65 74 20 3d 3d 20 2d 31 20 26 26 20  se_ret == -1 && 
23fc0 65 72 72 6e 6f 20 3d 3d 20 45 43 48 49 4c 44 29  errno == ECHILD)
23fd0 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
23fe0 55 47 5f 50 52 49 4e 54 46 28 22 4e 6f 74 69 63  UG_PRINTF("Notic
23ff0 65 2e 20 20 70 63 6c 6f 73 65 28 29 20 69 6e 64  e.  pclose() ind
24000 69 63 61 74 65 64 20 69 74 20 63 6f 75 6c 64 20  icated it could 
24010 6e 6f 74 20 67 65 74 20 74 68 65 20 73 74 61 74  not get the stat
24020 75 73 20 6f 66 20 74 68 65 20 63 68 69 6c 64 2c  us of the child,
24030 20 61 73 73 75 6d 69 6e 67 20 69 74 20 73 75 63   assuming it suc
24040 63 65 65 65 64 65 64 20 21 22 29 3b 0a 0a 09 09  ceeeded !");....
24050 09 70 63 6c 6f 73 65 5f 72 65 74 20 3d 20 30 3b  .pclose_ret = 0;
24060 0a 09 09 7d 0a 0a 09 09 69 66 20 28 70 63 6c 6f  ...}....if (pclo
24070 73 65 5f 72 65 74 20 21 3d 20 30 29 20 7b 0a 09  se_ret != 0) {..
24080 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
24090 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 25  RINTF("Error.  %
240a0 73 3a 20 65 78 69 74 65 64 20 77 69 74 68 20 6e  s: exited with n
240b0 6f 6e 2d 7a 65 72 6f 20 73 74 61 74 75 73 20 6f  on-zero status o
240c0 66 20 25 69 22 2c 20 70 69 6e 63 6d 64 2c 20 70  f %i", pincmd, p
240d0 63 6c 6f 73 65 5f 72 65 74 29 3b 0a 0a 09 09 09  close_ret);.....
240e0 69 66 20 28 6c 6f 63 6b 5f 6d 75 74 65 78 29 20  if (lock_mutex) 
240f0 7b 0a 09 09 09 09 63 61 63 6b 65 79 5f 6d 75 74  {.....cackey_mut
24100 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
24110 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 09 7d 0a  _biglock);....}.
24120 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
24130 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
24140 6e 67 20 43 4b 52 5f 50 49 4e 5f 49 4e 43 4f 52  ng CKR_PIN_INCOR
24150 52 45 43 54 20 28 25 69 29 22 2c 20 28 69 6e 74  RECT (%i)", (int
24160 29 20 43 4b 52 5f 50 49 4e 5f 49 4e 43 4f 52 52  ) CKR_PIN_INCORR
24170 45 43 54 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e  ECT);.....return
24180 28 43 4b 52 5f 50 49 4e 5f 49 4e 43 4f 52 52 45  (CKR_PIN_INCORRE
24190 43 54 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28  CT);...}....if (
241a0 73 74 72 6c 65 6e 28 70 69 6e 62 75 66 29 20 3c  strlen(pinbuf) <
241b0 20 31 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f   1) {....CACKEY_
241c0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
241d0 72 6f 72 2e 20 20 25 73 3a 20 72 65 74 75 72 6e  ror.  %s: return
241e0 65 64 20 6e 6f 20 64 61 74 61 22 2c 20 70 69 6e  ed no data", pin
241f0 63 6d 64 29 3b 0a 0a 09 09 09 69 66 20 28 6c 6f  cmd);.....if (lo
24200 63 6b 5f 6d 75 74 65 78 29 20 7b 0a 09 09 09 09  ck_mutex) {.....
24210 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
24220 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
24230 63 6b 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 43 41  ck);....}.....CA
24240 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
24250 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
24260 5f 50 49 4e 5f 49 4e 43 4f 52 52 45 43 54 20 28  _PIN_INCORRECT (
24270 25 69 29 22 2c 20 28 69 6e 74 29 20 43 4b 52 5f  %i)", (int) CKR_
24280 50 49 4e 5f 49 4e 43 4f 52 52 45 43 54 29 3b 0a  PIN_INCORRECT);.
24290 0a 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 50  ....return(CKR_P
242a0 49 4e 5f 49 4e 43 4f 52 52 45 43 54 29 3b 0a 09  IN_INCORRECT);..
242b0 09 7d 0a 0a 09 09 69 66 20 28 70 69 6e 62 75 66  .}....if (pinbuf
242c0 5b 73 74 72 6c 65 6e 28 70 69 6e 62 75 66 29 20  [strlen(pinbuf) 
242d0 2d 20 31 5d 20 3d 3d 20 27 5c 6e 27 29 20 7b 0a  - 1] == '\n') {.
242e0 09 09 09 70 69 6e 62 75 66 5b 73 74 72 6c 65 6e  ...pinbuf[strlen
242f0 28 70 69 6e 62 75 66 29 20 2d 20 31 5d 20 3d 20  (pinbuf) - 1] = 
24300 27 5c 30 27 3b 0a 09 09 7d 0a 0a 09 09 70 50 69  '\0';...}....pPi
24310 6e 20 3d 20 28 43 4b 5f 55 54 46 38 43 48 41 52  n = (CK_UTF8CHAR
24320 5f 50 54 52 29 20 70 69 6e 62 75 66 3b 0a 09 09  _PTR) pinbuf;...
24330 75 6c 50 69 6e 4c 65 6e 20 3d 20 73 74 72 6c 65  ulPinLen = strle
24340 6e 28 70 69 6e 62 75 66 29 3b 0a 09 7d 0a 0a 09  n(pinbuf);..}...
24350 6c 6f 67 69 6e 5f 72 65 74 20 3d 20 63 61 63 6b  login_ret = cack
24360 65 79 5f 6c 6f 67 69 6e 28 26 63 61 63 6b 65 79  ey_login(&cackey
24370 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c 20  _slots[slotID], 
24380 70 50 69 6e 2c 20 75 6c 50 69 6e 4c 65 6e 2c 20  pPin, ulPinLen, 
24390 26 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67  &tries_remaining
243a0 29 3b 0a 09 69 66 20 28 6c 6f 67 69 6e 5f 72 65  );..if (login_re
243b0 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43  t != CACKEY_PCSC
243c0 5f 53 5f 4f 4b 29 20 7b 0a 09 09 69 66 20 28 6c  _S_OK) {...if (l
243d0 6f 63 6b 5f 6d 75 74 65 78 29 20 7b 0a 09 09 09  ock_mutex) {....
243e0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
243f0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
24400 63 6b 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28  ck);...}....if (
24410 6c 6f 67 69 6e 5f 72 65 74 20 3d 3d 20 43 41 43  login_ret == CAC
24420 4b 45 59 5f 50 43 53 43 5f 45 5f 4c 4f 43 4b 45  KEY_PCSC_E_LOCKE
24430 44 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  D) {....CACKEY_D
24440 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
24450 6f 72 2e 20 20 54 6f 6b 65 6e 20 69 73 20 6c 6f  or.  Token is lo
24460 63 6b 65 64 2e 22 29 3b 0a 0a 09 09 09 63 61 63  cked.");.....cac
24470 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44  key_slots[slotID
24480 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 7c 3d  ].token_flags |=
24490 20 43 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 4c 4f   CKF_USER_PIN_LO
244a0 43 4b 45 44 3b 0a 0a 09 09 09 43 41 43 4b 45 59  CKED;.....CACKEY
244b0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
244c0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 50 49 4e  eturning CKR_PIN
244d0 5f 4c 4f 43 4b 45 44 20 28 25 69 29 22 2c 20 28  _LOCKED (%i)", (
244e0 69 6e 74 29 20 43 4b 52 5f 50 49 4e 5f 4c 4f 43  int) CKR_PIN_LOC
244f0 4b 45 44 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e  KED);.....return
24500 28 43 4b 52 5f 50 49 4e 5f 4c 4f 43 4b 45 44 29  (CKR_PIN_LOCKED)
24510 3b 0a 09 09 7d 20 65 6c 73 65 20 69 66 20 28 6c  ;...} else if (l
24520 6f 67 69 6e 5f 72 65 74 20 3d 3d 20 43 41 43 4b  ogin_ret == CACK
24530 45 59 5f 50 43 53 43 5f 45 5f 42 41 44 50 49 4e  EY_PCSC_E_BADPIN
24540 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
24550 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
24560 72 2e 20 20 49 6e 76 61 6c 69 64 20 50 49 4e 2e  r.  Invalid PIN.
24570 22 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73  ");.....cackey_s
24580 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 74 6f 6b  lots[slotID].tok
24590 65 6e 5f 66 6c 61 67 73 20 7c 3d 20 43 4b 46 5f  en_flags |= CKF_
245a0 55 53 45 52 5f 50 49 4e 5f 43 4f 55 4e 54 5f 4c  USER_PIN_COUNT_L
245b0 4f 57 3b 0a 0a 09 09 09 69 66 20 28 74 72 69 65  OW;.....if (trie
245c0 73 5f 72 65 6d 61 69 6e 69 6e 67 20 3d 3d 20 31  s_remaining == 1
245d0 29 20 7b 0a 09 09 09 09 63 61 63 6b 65 79 5f 73  ) {.....cackey_s
245e0 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 74 6f 6b  lots[slotID].tok
245f0 65 6e 5f 66 6c 61 67 73 20 7c 3d 20 43 4b 46 5f  en_flags |= CKF_
24600 55 53 45 52 5f 50 49 4e 5f 46 49 4e 41 4c 5f 54  USER_PIN_FINAL_T
24610 52 59 3b 0a 09 09 09 7d 0a 0a 09 09 09 43 41 43  RY;....}.....CAC
24620 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
24630 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
24640 50 49 4e 5f 49 4e 43 4f 52 52 45 43 54 20 28 25  PIN_INCORRECT (%
24650 69 29 22 2c 20 28 69 6e 74 29 20 43 4b 52 5f 50  i)", (int) CKR_P
24660 49 4e 5f 49 4e 43 4f 52 52 45 43 54 29 3b 0a 0a  IN_INCORRECT);..
24670 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 50 49  ...return(CKR_PI
24680 4e 5f 49 4e 43 4f 52 52 45 43 54 29 3b 0a 09 09  N_INCORRECT);...
24690 7d 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  }....CACKEY_DEBU
246a0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
246b0 20 20 55 6e 6b 6e 6f 77 6e 20 65 72 72 6f 72 20    Unknown error 
246c0 72 65 74 75 72 6e 65 64 20 66 72 6f 6d 20 63 61  returned from ca
246d0 63 6b 65 79 5f 6c 6f 67 69 6e 28 29 20 28 25 69  ckey_login() (%i
246e0 29 22 2c 20 6c 6f 67 69 6e 5f 72 65 74 29 3b 0a  )", login_ret);.
246f0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
24700 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
24710 0a 0a 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ...cackey_slots[
24720 73 6c 6f 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c  slotID].token_fl
24730 61 67 73 20 26 3d 20 7e 28 43 4b 46 5f 55 53 45  ags &= ~(CKF_USE
24740 52 5f 50 49 4e 5f 4c 4f 43 4b 45 44 20 7c 20 43  R_PIN_LOCKED | C
24750 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 43 4f 55 4e  KF_USER_PIN_COUN
24760 54 5f 4c 4f 57 20 7c 20 43 4b 46 5f 4c 4f 47 49  T_LOW | CKF_LOGI
24770 4e 5f 52 45 51 55 49 52 45 44 20 7c 20 43 4b 46  N_REQUIRED | CKF
24780 5f 55 53 45 52 5f 50 49 4e 5f 46 49 4e 41 4c 5f  _USER_PIN_FINAL_
24790 54 52 59 29 3b 0a 0a 09 63 61 63 6b 65 79 5f 73  TRY);...cackey_s
247a0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
247b0 5d 2e 73 74 61 74 65 20 3d 20 43 4b 53 5f 52 4f  ].state = CKS_RO
247c0 5f 55 53 45 52 5f 46 55 4e 43 54 49 4f 4e 53 3b  _USER_FUNCTIONS;
247d0 0a 0a 09 69 66 20 28 6c 6f 63 6b 5f 6d 75 74 65  ...if (lock_mute
247e0 78 29 20 7b 0a 09 09 6d 75 74 65 78 5f 72 65 74  x) {...mutex_ret
247f0 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
24800 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
24810 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 69 66 20  _biglock);...if 
24820 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
24830 20 30 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f   0) {....CACKEY_
24840 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
24850 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20  ror.  Unlocking 
24860 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 09 72  failed.");.....r
24870 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
24880 4c 5f 45 52 52 4f 52 29 3b 0a 09 09 7d 0a 09 7d  L_ERROR);...}..}
24890 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
248a0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
248b0 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20  g CKR_OK (%i)", 
248c0 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72  CKR_OK);...retur
248d0 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b  n(CKR_OK);.}..CK
248e0 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
248f0 28 43 4b 5f 52 56 2c 20 43 5f 4c 6f 67 69 6e 29  (CK_RV, C_Login)
24900 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
24910 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
24920 55 53 45 52 5f 54 59 50 45 20 75 73 65 72 54 79  USER_TYPE userTy
24930 70 65 2c 20 43 4b 5f 55 54 46 38 43 48 41 52 5f  pe, CK_UTF8CHAR_
24940 50 54 52 20 70 50 69 6e 2c 20 43 4b 5f 55 4c 4f  PTR pPin, CK_ULO
24950 4e 47 20 75 6c 50 69 6e 4c 65 6e 29 20 7b 0a 09  NG ulPinLen) {..
24960 72 65 74 75 72 6e 28 5f 43 5f 4c 6f 67 69 6e 4d  return(_C_LoginM
24970 75 74 65 78 41 72 67 28 68 53 65 73 73 69 6f 6e  utexArg(hSession
24980 2c 20 75 73 65 72 54 79 70 65 2c 20 70 50 69 6e  , userType, pPin
24990 2c 20 75 6c 50 69 6e 4c 65 6e 2c 20 31 29 29 3b  , ulPinLen, 1));
249a0 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
249b0 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
249c0 4c 6f 67 6f 75 74 29 28 43 4b 5f 53 45 53 53 49  Logout)(CK_SESSI
249d0 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
249e0 6f 6e 29 20 7b 0a 09 43 4b 5f 53 4c 4f 54 5f 49  on) {..CK_SLOT_I
249f0 44 20 73 6c 6f 74 49 44 3b 0a 09 69 6e 74 20 6d  D slotID;..int m
24a00 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43  utex_retval;...C
24a10 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
24a20 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
24a30 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
24a40 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
24a50 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
24a60 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
24a70 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
24a80 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
24a90 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
24aa0 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  LIZED);..}...if 
24ab0 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c  (hSession == 0 |
24ac0 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73  | hSession >= (s
24ad0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
24ae0 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28  sions) / sizeof(
24af0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
24b00 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59  0]))) {...CACKEY
24b10 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
24b20 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f  rror.  Session o
24b30 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a  ut of range.");.
24b40 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
24b50 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49  SESSION_HANDLE_I
24b60 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75  NVALID);..}...mu
24b70 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
24b80 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63  key_mutex_lock(c
24b90 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
24ba0 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
24bb0 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
24bc0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
24bd0 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67  "Error.  Locking
24be0 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
24bf0 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
24c00 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69  L_ERROR);..}...i
24c10 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69  f (!cackey_sessi
24c20 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63  ons[hSession].ac
24c30 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79  tive) {...cackey
24c40 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
24c50 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
24c60 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
24c70 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
24c80 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76  ession not activ
24c90 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
24ca0 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41  n(CKR_SESSION_HA
24cb0 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
24cc0 7d 0a 0a 09 73 6c 6f 74 49 44 20 3d 20 63 61 63  }...slotID = cac
24cd0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
24ce0 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44 3b 0a 0a  ssion].slotID;..
24cf0 09 69 66 20 28 73 6c 6f 74 49 44 20 3c 20 30 20  .if (slotID < 0 
24d00 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69  || slotID >= (si
24d10 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
24d20 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
24d30 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b  ey_slots[0]))) {
24d40 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
24d50 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49  PRINTF("Error. I
24d60 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75  nvalid slot requ
24d70 65 73 74 65 64 20 28 25 6c 75 29 2c 20 6f 75 74  ested (%lu), out
24d80 73 69 64 65 20 6f 66 20 76 61 6c 69 64 20 72 61  side of valid ra
24d90 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a  nge", slotID);..
24da0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
24db0 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
24dc0 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f  ..if (cackey_slo
24dd0 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76  ts[slotID].activ
24de0 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  e == 0) {...CACK
24df0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
24e00 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20  "Error. Invalid 
24e10 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28  slot requested (
24e20 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63  %lu), slot not c
24e30 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 22  urrently active"
24e40 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61  , slotID);....ca
24e50 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
24e60 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
24e70 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
24e80 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
24e90 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73  ..}...cackey_ses
24ea0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
24eb0 73 74 61 74 65 20 3d 20 43 4b 53 5f 52 4f 5f 50  state = CKS_RO_P
24ec0 55 42 4c 49 43 5f 53 45 53 53 49 4f 4e 3b 0a 0a  UBLIC_SESSION;..
24ed0 09 69 66 20 28 63 61 63 6b 65 79 5f 70 69 6e 5f  .if (cackey_pin_
24ee0 63 6f 6d 6d 61 6e 64 20 3d 3d 20 4e 55 4c 4c 29  command == NULL)
24ef0 20 7b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74   {...cackey_slot
24f00 73 5b 73 6c 6f 74 49 44 5d 2e 74 6f 6b 65 6e 5f  s[slotID].token_
24f10 66 6c 61 67 73 20 3d 20 43 4b 46 5f 4c 4f 47 49  flags = CKF_LOGI
24f20 4e 5f 52 45 51 55 49 52 45 44 3b 0a 09 7d 20 65  N_REQUIRED;..} e
24f30 6c 73 65 20 7b 0a 09 09 63 61 63 6b 65 79 5f 73  lse {...cackey_s
24f40 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 74 6f 6b  lots[slotID].tok
24f50 65 6e 5f 66 6c 61 67 73 20 3d 20 30 3b 0a 09 7d  en_flags = 0;..}
24f60 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
24f70 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  = cackey_mutex_u
24f80 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
24f90 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
24fa0 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
24fb0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
24fc0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
24fd0 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64  Unlocking failed
24fe0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
24ff0 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
25000 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
25010 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
25020 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25  urning CKR_OK (%
25030 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09  i)", CKR_OK);...
25040 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a  return(CKR_OK);.
25050 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
25060 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 43  CTION(CK_RV, C_C
25070 72 65 61 74 65 4f 62 6a 65 63 74 29 28 43 4b 5f  reateObject)(CK_
25080 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
25090 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 41 54 54 52  Session, CK_ATTR
250a0 49 42 55 54 45 5f 50 54 52 20 70 54 65 6d 70 6c  IBUTE_PTR pTempl
250b0 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  ate, CK_ULONG ul
250c0 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43 54  Count, CK_OBJECT
250d0 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 4f 62  _HANDLE_PTR phOb
250e0 6a 65 63 74 29 20 7b 0a 09 43 41 43 4b 45 59 5f  ject) {..CACKEY_
250f0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
25100 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
25110 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
25120 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
25130 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
25140 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
25150 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
25160 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
25170 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
25180 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
25190 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
251a0 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
251b0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
251c0 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
251d0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
251e0 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
251f0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
25200 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
25210 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
25220 28 43 4b 5f 52 56 2c 20 43 5f 43 6f 70 79 4f 62  (CK_RV, C_CopyOb
25230 6a 65 63 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e  ject)(CK_SESSION
25240 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
25250 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44  , CK_OBJECT_HAND
25260 4c 45 20 68 4f 62 6a 65 63 74 2c 20 43 4b 5f 41  LE hObject, CK_A
25270 54 54 52 49 42 55 54 45 5f 50 54 52 20 70 54 65  TTRIBUTE_PTR pTe
25280 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47  mplate, CK_ULONG
25290 20 75 6c 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a   ulCount, CK_OBJ
252a0 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70  ECT_HANDLE_PTR p
252b0 68 4e 65 77 4f 62 6a 65 63 74 29 20 7b 0a 09 43  hNewObject) {..C
252c0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
252d0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
252e0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
252f0 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
25300 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
25310 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
25320 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
25330 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
25340 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
25350 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
25360 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
25370 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
25380 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
25390 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
253a0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
253b0 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
253c0 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
253d0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
253e0 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
253f0 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
25400 44 65 73 74 72 6f 79 4f 62 6a 65 63 74 29 28 43  DestroyObject)(C
25410 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
25420 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42   hSession, CK_OB
25430 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4f 62 6a  JECT_HANDLE hObj
25440 65 63 74 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  ect) {..CACKEY_D
25450 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
25460 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
25470 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
25480 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
25490 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
254a0 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
254b0 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
254c0 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
254d0 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
254e0 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
254f0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
25500 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
25510 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
25520 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
25530 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
25540 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
25550 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
25560 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
25570 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
25580 43 4b 5f 52 56 2c 20 43 5f 47 65 74 4f 62 6a 65  CK_RV, C_GetObje
25590 63 74 53 69 7a 65 29 28 43 4b 5f 53 45 53 53 49  ctSize)(CK_SESSI
255a0 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
255b0 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41  on, CK_OBJECT_HA
255c0 4e 44 4c 45 20 68 4f 62 6a 65 63 74 2c 20 43 4b  NDLE hObject, CK
255d0 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 53 69  _ULONG_PTR pulSi
255e0 7a 65 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  ze) {..CACKEY_DE
255f0 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
25600 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
25610 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
25620 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
25630 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
25640 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
25650 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
25660 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
25670 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
25680 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
25690 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
256a0 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
256b0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
256c0 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
256d0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
256e0 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
256f0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
25700 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
25710 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
25720 4b 5f 52 56 2c 20 43 5f 47 65 74 41 74 74 72 69  K_RV, C_GetAttri
25730 62 75 74 65 56 61 6c 75 65 29 28 43 4b 5f 53 45  buteValue)(CK_SE
25740 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
25750 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54  ssion, CK_OBJECT
25760 5f 48 41 4e 44 4c 45 20 68 4f 62 6a 65 63 74 2c  _HANDLE hObject,
25770 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54   CK_ATTRIBUTE_PT
25780 52 20 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f  R pTemplate, CK_
25790 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e 74 29 20 7b  ULONG ulCount) {
257a0 0a 09 43 4b 5f 41 54 54 52 49 42 55 54 45 20 2a  ..CK_ATTRIBUTE *
257b0 63 75 72 72 5f 61 74 74 72 3b 0a 09 73 74 72 75  curr_attr;..stru
257c0 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69  ct cackey_identi
257d0 74 79 20 2a 69 64 65 6e 74 69 74 79 3b 0a 09 75  ty *identity;..u
257e0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 69 64 65  nsigned long ide
257f0 6e 74 69 74 79 5f 69 64 78 2c 20 61 74 74 72 5f  ntity_idx, attr_
25800 69 64 78 2c 20 73 65 73 73 5f 61 74 74 72 5f 69  idx, sess_attr_i
25810 64 78 2c 20 6e 75 6d 5f 69 64 73 3b 0a 09 69 6e  dx, num_ids;..in
25820 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a  t mutex_retval;.
25830 09 43 4b 5f 52 56 20 72 65 74 76 61 6c 20 3d 20  .CK_RV retval = 
25840 43 4b 52 5f 4f 4b 3b 0a 09 43 4b 5f 56 4f 49 44  CKR_OK;..CK_VOID
25850 5f 50 54 52 20 70 56 61 6c 75 65 3b 0a 09 43 4b  _PTR pValue;..CK
25860 5f 55 4c 4f 4e 47 20 75 6c 56 61 6c 75 65 4c 65  _ULONG ulValueLe
25870 6e 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  n;...CACKEY_DEBU
25880 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
25890 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
258a0 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
258b0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
258c0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
258d0 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
258e0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
258f0 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
25900 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
25910 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20  ...if (hSession 
25920 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e  == 0 || hSession
25930 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b   >= (sizeof(cack
25940 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73  ey_sessions) / s
25950 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
25960 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09  sions[0]))) {...
25970 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
25980 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73  NTF("Error.  Ses
25990 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67  sion out of rang
259a0 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
259b0 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41  n(CKR_SESSION_HA
259c0 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
259d0 7d 0a 0a 09 69 66 20 28 68 4f 62 6a 65 63 74 20  }...if (hObject 
259e0 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  == 0) {...CACKEY
259f0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
25a00 72 72 6f 72 2e 20 20 4f 62 6a 65 63 74 20 68 61  rror.  Object ha
25a10 6e 64 6c 65 20 6f 75 74 20 6f 66 20 72 61 6e 67  ndle out of rang
25a20 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
25a30 6e 28 43 4b 52 5f 4f 42 4a 45 43 54 5f 48 41 4e  n(CKR_OBJECT_HAN
25a40 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  DLE_INVALID);..}
25a50 0a 0a 09 69 66 20 28 75 6c 43 6f 75 6e 74 20 3d  ...if (ulCount =
25a60 3d 20 30 29 20 7b 0a 09 09 2f 2a 20 53 68 6f 72  = 0) {.../* Shor
25a70 74 20 63 69 72 63 75 69 74 2c 20 69 66 20 7a 65  t circuit, if ze
25a80 72 6f 20 6f 62 6a 65 63 74 73 20 77 65 72 65 20  ro objects were 
25a90 73 70 65 63 69 66 69 65 64 20 72 65 74 75 72 6e  specified return
25aa0 20 7a 65 72 6f 20 69 74 65 6d 73 20 69 6d 6d 65   zero items imme
25ab0 64 69 61 74 65 6c 79 20 2a 2f 0a 09 09 43 41 43  diately */...CAC
25ac0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
25ad0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
25ae0 4f 4b 20 28 25 69 29 20 28 73 68 6f 72 74 20 63  OK (%i) (short c
25af0 69 72 63 75 69 74 29 22 2c 20 43 4b 52 5f 4f 4b  ircuit)", CKR_OK
25b00 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
25b10 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70  _OK);..}...if (p
25b20 54 65 6d 70 6c 61 74 65 20 3d 3d 20 4e 55 4c 4c  Template == NULL
25b30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
25b40 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
25b50 2e 20 20 70 54 65 6d 70 6c 61 74 65 20 69 73 20  .  pTemplate is 
25b60 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75  NULL.");....retu
25b70 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53  rn(CKR_ARGUMENTS
25b80 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 64 65 6e  _BAD);..}...iden
25b90 74 69 74 79 5f 69 64 78 20 3d 20 68 4f 62 6a 65  tity_idx = hObje
25ba0 63 74 20 2d 20 31 3b 0a 0a 09 6d 75 74 65 78 5f  ct - 1;...mutex_
25bb0 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
25bc0 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65  mutex_lock(cacke
25bd0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
25be0 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
25bf0 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
25c00 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
25c10 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69  or.  Locking fai
25c20 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
25c30 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
25c40 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21  ROR);..}...if (!
25c50 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
25c60 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65  hSession].active
25c70 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  ) {...cackey_mut
25c80 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
25c90 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41  _biglock);....CA
25ca0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
25cb0 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69  F("Error.  Sessi
25cc0 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29  on not active.")
25cd0 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
25ce0 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  R_SESSION_HANDLE
25cf0 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
25d00 6e 75 6d 5f 69 64 73 20 3d 20 63 61 63 6b 65 79  num_ids = cackey
25d10 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
25d20 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63  on].identities_c
25d30 6f 75 6e 74 3b 0a 0a 09 69 66 20 28 69 64 65 6e  ount;...if (iden
25d40 74 69 74 79 5f 69 64 78 20 3e 3d 20 6e 75 6d 5f  tity_idx >= num_
25d50 69 64 73 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  ids) {...cackey_
25d60 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
25d70 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
25d80 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
25d90 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4f 62  INTF("Error.  Ob
25da0 6a 65 63 74 20 68 61 6e 64 6c 65 20 6f 75 74 20  ject handle out 
25db0 6f 66 20 72 61 6e 67 65 2e 20 20 69 64 65 6e 74  of range.  ident
25dc0 69 74 79 5f 69 64 78 20 3d 20 25 6c 75 2c 20 6e  ity_idx = %lu, n
25dd0 75 6d 5f 69 64 73 20 3d 20 25 6c 75 2e 22 2c 20  um_ids = %lu.", 
25de0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
25df0 69 64 65 6e 74 69 74 79 5f 69 64 78 2c 20 28 75  identity_idx, (u
25e00 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 6e 75  nsigned long) nu
25e10 6d 5f 69 64 73 29 3b 0a 0a 09 09 72 65 74 75 72  m_ids);....retur
25e20 6e 28 43 4b 52 5f 4f 42 4a 45 43 54 5f 48 41 4e  n(CKR_OBJECT_HAN
25e30 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  DLE_INVALID);..}
25e40 0a 0a 09 69 64 65 6e 74 69 74 79 20 3d 20 26 63  ...identity = &c
25e50 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
25e60 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74  Session].identit
25e70 69 65 73 5b 69 64 65 6e 74 69 74 79 5f 69 64 78  ies[identity_idx
25e80 5d 3b 0a 0a 09 66 6f 72 20 28 61 74 74 72 5f 69  ];...for (attr_i
25e90 64 78 20 3d 20 30 3b 20 61 74 74 72 5f 69 64 78  dx = 0; attr_idx
25ea0 20 3c 20 75 6c 43 6f 75 6e 74 3b 20 61 74 74 72   < ulCount; attr
25eb0 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 63 75 72 72  _idx++) {...curr
25ec0 5f 61 74 74 72 20 3d 20 26 70 54 65 6d 70 6c 61  _attr = &pTempla
25ed0 74 65 5b 61 74 74 72 5f 69 64 78 5d 3b 0a 0a 09  te[attr_idx];...
25ee0 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a  .pValue = NULL;.
25ef0 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 28  ..ulValueLen = (
25f00 43 4b 5f 4c 4f 4e 47 29 20 2d 31 3b 0a 0a 09 09  CK_LONG) -1;....
25f10 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
25f20 4e 54 46 28 22 4c 6f 6f 6b 69 6e 67 20 66 6f 72  NTF("Looking for
25f30 20 61 74 74 72 69 62 75 74 65 20 30 78 25 30 38   attribute 0x%08
25f40 6c 78 20 28 69 64 65 6e 74 69 74 79 3a 25 6c 75  lx (identity:%lu
25f50 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65  ) ...", (unsigne
25f60 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74  d long) curr_att
25f70 72 2d 3e 74 79 70 65 2c 20 28 75 6e 73 69 67 6e  r->type, (unsign
25f80 65 64 20 6c 6f 6e 67 29 20 69 64 65 6e 74 69 74  ed long) identit
25f90 79 5f 69 64 78 29 3b 0a 0a 09 09 66 6f 72 20 28  y_idx);....for (
25fa0 73 65 73 73 5f 61 74 74 72 5f 69 64 78 20 3d 20  sess_attr_idx = 
25fb0 30 3b 20 73 65 73 73 5f 61 74 74 72 5f 69 64 78  0; sess_attr_idx
25fc0 20 3c 20 69 64 65 6e 74 69 74 79 2d 3e 61 74 74   < identity->att
25fd0 72 69 62 75 74 65 73 5f 63 6f 75 6e 74 3b 20 73  ributes_count; s
25fe0 65 73 73 5f 61 74 74 72 5f 69 64 78 2b 2b 29 20  ess_attr_idx++) 
25ff0 7b 0a 09 09 09 69 66 20 28 69 64 65 6e 74 69 74  {....if (identit
26000 79 2d 3e 61 74 74 72 69 62 75 74 65 73 5b 73 65  y->attributes[se
26010 73 73 5f 61 74 74 72 5f 69 64 78 5d 2e 74 79 70  ss_attr_idx].typ
26020 65 20 3d 3d 20 63 75 72 72 5f 61 74 74 72 2d 3e  e == curr_attr->
26030 74 79 70 65 29 20 7b 0a 09 09 09 09 43 41 43 4b  type) {.....CACK
26040 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
26050 22 20 2e 2e 2e 20 66 6f 75 6e 64 20 69 74 2c 20  " ... found it, 
26060 70 56 61 6c 75 65 20 3d 20 25 70 2c 20 75 6c 56  pValue = %p, ulV
26070 61 6c 75 65 4c 65 6e 20 3d 20 25 6c 75 22 2c 20  alueLen = %lu", 
26080 69 64 65 6e 74 69 74 79 2d 3e 61 74 74 72 69 62  identity->attrib
26090 75 74 65 73 5b 73 65 73 73 5f 61 74 74 72 5f 69  utes[sess_attr_i
260a0 64 78 5d 2e 70 56 61 6c 75 65 2c 20 69 64 65 6e  dx].pValue, iden
260b0 74 69 74 79 2d 3e 61 74 74 72 69 62 75 74 65 73  tity->attributes
260c0 5b 73 65 73 73 5f 61 74 74 72 5f 69 64 78 5d 2e  [sess_attr_idx].
260d0 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 09 09 09  ulValueLen);....
260e0 09 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 69  ......pValue = i
260f0 64 65 6e 74 69 74 79 2d 3e 61 74 74 72 69 62 75  dentity->attribu
26100 74 65 73 5b 73 65 73 73 5f 61 74 74 72 5f 69 64  tes[sess_attr_id
26110 78 5d 2e 70 56 61 6c 75 65 3b 0a 09 09 09 09 75  x].pValue;.....u
26120 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 69 64 65 6e  lValueLen = iden
26130 74 69 74 79 2d 3e 61 74 74 72 69 62 75 74 65 73  tity->attributes
26140 5b 73 65 73 73 5f 61 74 74 72 5f 69 64 78 5d 2e  [sess_attr_idx].
26150 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 09 09 09 7d  ulValueLen;....}
26160 0a 09 09 7d 0a 0a 09 09 69 66 20 28 63 75 72 72  ...}....if (curr
26170 5f 61 74 74 72 2d 3e 70 56 61 6c 75 65 20 26 26  _attr->pValue &&
26180 20 70 56 61 6c 75 65 29 20 7b 0a 09 09 09 69 66   pValue) {....if
26190 20 28 63 75 72 72 5f 61 74 74 72 2d 3e 75 6c 56   (curr_attr->ulV
261a0 61 6c 75 65 4c 65 6e 20 3e 3d 20 75 6c 56 61 6c  alueLen >= ulVal
261b0 75 65 4c 65 6e 29 20 7b 0a 09 09 09 09 6d 65 6d  ueLen) {.....mem
261c0 63 70 79 28 63 75 72 72 5f 61 74 74 72 2d 3e 70  cpy(curr_attr->p
261d0 56 61 6c 75 65 2c 20 70 56 61 6c 75 65 2c 20 75  Value, pValue, u
261e0 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 09 09 09 7d  lValueLen);....}
261f0 20 65 6c 73 65 20 7b 0a 09 09 09 09 75 6c 56 61   else {.....ulVa
26200 6c 75 65 4c 65 6e 20 3d 20 28 43 4b 5f 4c 4f 4e  lueLen = (CK_LON
26210 47 29 20 2d 31 3b 0a 0a 09 09 09 09 72 65 74 76  G) -1;......retv
26220 61 6c 20 3d 20 43 4b 52 5f 42 55 46 46 45 52 5f  al = CKR_BUFFER_
26230 54 4f 4f 5f 53 4d 41 4c 4c 3b 0a 09 09 09 7d 0a  TOO_SMALL;....}.
26240 09 09 7d 0a 0a 09 09 63 75 72 72 5f 61 74 74 72  ..}....curr_attr
26250 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 75  ->ulValueLen = u
26260 6c 56 61 6c 75 65 4c 65 6e 3b 0a 09 7d 0a 0a 09  lValueLen;..}...
26270 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
26280 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
26290 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
262a0 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
262b0 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
262c0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
262d0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c  NTF("Error.  Unl
262e0 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
262f0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
26300 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
26310 09 7d 0a 0a 09 69 66 20 28 72 65 74 76 61 6c 20  .}...if (retval 
26320 3d 3d 20 43 4b 52 5f 41 54 54 52 49 42 55 54 45  == CKR_ATTRIBUTE
26330 5f 54 59 50 45 5f 49 4e 56 41 4c 49 44 29 20 7b  _TYPE_INVALID) {
26340 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
26350 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
26360 67 20 43 4b 52 5f 41 54 54 52 49 42 55 54 45 5f  g CKR_ATTRIBUTE_
26370 54 59 50 45 5f 49 4e 56 41 4c 49 44 20 28 25 69  TYPE_INVALID (%i
26380 29 22 2c 20 28 69 6e 74 29 20 72 65 74 76 61 6c  )", (int) retval
26390 29 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 72  );..} else if (r
263a0 65 74 76 61 6c 20 3d 3d 20 43 4b 52 5f 42 55 46  etval == CKR_BUF
263b0 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 20 7b  FER_TOO_SMALL) {
263c0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
263d0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
263e0 67 20 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f  g CKR_BUFFER_TOO
263f0 5f 53 4d 41 4c 4c 20 28 25 69 29 22 2c 20 28 69  _SMALL (%i)", (i
26400 6e 74 29 20 72 65 74 76 61 6c 29 3b 0a 09 7d 20  nt) retval);..} 
26410 65 6c 73 65 20 69 66 20 28 72 65 74 76 61 6c 20  else if (retval 
26420 3d 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 43  == CKR_OK) {...C
26430 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
26440 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
26450 52 5f 4f 4b 20 28 25 69 29 22 2c 20 28 69 6e 74  R_OK (%i)", (int
26460 29 20 72 65 74 76 61 6c 29 3b 0a 09 7d 20 65 6c  ) retval);..} el
26470 73 65 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  se {...CACKEY_DE
26480 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
26490 72 6e 69 6e 67 20 25 69 22 2c 20 28 69 6e 74 29  rning %i", (int)
264a0 20 72 65 74 76 61 6c 29 3b 0a 09 7d 0a 0a 09 72   retval);..}...r
264b0 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d  eturn(retval);.}
264c0 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
264d0 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 65  TION(CK_RV, C_Se
264e0 74 41 74 74 72 69 62 75 74 65 56 61 6c 75 65 29  tAttributeValue)
264f0 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
26500 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
26510 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4f  OBJECT_HANDLE hO
26520 62 6a 65 63 74 2c 20 43 4b 5f 41 54 54 52 49 42  bject, CK_ATTRIB
26530 55 54 45 5f 50 54 52 20 70 54 65 6d 70 6c 61 74  UTE_PTR pTemplat
26540 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f  e, CK_ULONG ulCo
26550 75 6e 74 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  unt) {..CACKEY_D
26560 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
26570 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
26580 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
26590 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
265a0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
265b0 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
265c0 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
265d0 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
265e0 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
265f0 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
26600 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
26610 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
26620 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
26630 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
26640 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
26650 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
26660 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
26670 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
26680 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
26690 43 4b 5f 52 56 2c 20 43 5f 46 69 6e 64 4f 62 6a  CK_RV, C_FindObj
266a0 65 63 74 73 49 6e 69 74 29 28 43 4b 5f 53 45 53  ectsInit)(CK_SES
266b0 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
266c0 73 69 6f 6e 2c 20 43 4b 5f 41 54 54 52 49 42 55  sion, CK_ATTRIBU
266d0 54 45 5f 50 54 52 20 70 54 65 6d 70 6c 61 74 65  TE_PTR pTemplate
266e0 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f 75  , CK_ULONG ulCou
266f0 6e 74 29 20 7b 0a 09 43 4b 5f 53 4c 4f 54 5f 49  nt) {..CK_SLOT_I
26700 44 20 73 6c 6f 74 49 44 3b 0a 09 43 4b 5f 55 4c  D slotID;..CK_UL
26710 4f 4e 47 20 69 64 78 3b 0a 09 69 6e 74 20 6d 75  ONG idx;..int mu
26720 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41  tex_retval;...CA
26730 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
26740 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
26750 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
26760 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
26770 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
26780 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
26790 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
267a0 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
267b0 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
267c0 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  IZED);..}...if (
267d0 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c  hSession == 0 ||
267e0 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69   hSession >= (si
267f0 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
26800 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  ions) / sizeof(c
26810 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30  ackey_sessions[0
26820 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ]))) {...CACKEY_
26830 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
26840 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75  ror.  Session ou
26850 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09  t of range.");..
26860 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
26870 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e  ESSION_HANDLE_IN
26880 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74  VALID);..}...mut
26890 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
268a0 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61  ey_mutex_lock(ca
268b0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
268c0 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
268d0 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
268e0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
268f0 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20  Error.  Locking 
26900 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
26910 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
26920 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66  _ERROR);..}...if
26930 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   (!cackey_sessio
26940 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74  ns[hSession].act
26950 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  ive) {...cackey_
26960 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
26970 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
26980 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
26990 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65  INTF("Error.  Se
269a0 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65  ssion not active
269b0 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
269c0 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  (CKR_SESSION_HAN
269d0 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  DLE_INVALID);..}
269e0 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65  ...if (cackey_se
269f0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
26a00 2e 73 65 61 72 63 68 5f 61 63 74 69 76 65 29 20  .search_active) 
26a10 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  {...cackey_mutex
26a20 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
26a30 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b  iglock);....CACK
26a40 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
26a50 22 45 72 72 6f 72 2e 20 20 53 65 61 72 63 68 20  "Error.  Search 
26a60 61 6c 72 65 61 64 79 20 61 63 74 69 76 65 2e 22  already active."
26a70 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
26a80 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 41 43 54  KR_OPERATION_ACT
26a90 49 56 45 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 49  IVE);..}...slotI
26aa0 44 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69  D = cackey_sessi
26ab0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 6c  ons[hSession].sl
26ac0 6f 74 49 44 3b 0a 0a 09 69 66 20 28 73 6c 6f 74  otID;...if (slot
26ad0 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44  ID < 0 || slotID
26ae0 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b   >= (sizeof(cack
26af0 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65  ey_slots) / size
26b00 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  of(cackey_slots[
26b10 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59  0]))) {...CACKEY
26b20 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
26b30 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c  rror. Invalid sl
26b40 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c  ot requested (%l
26b50 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 76  u), outside of v
26b60 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f  alid range", slo
26b70 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  tID);....return(
26b80 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
26b90 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63  R);..}...if (cac
26ba0 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44  key_slots[slotID
26bb0 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 29 20 7b  ].active == 0) {
26bc0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
26bd0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49  PRINTF("Error. I
26be0 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75  nvalid slot requ
26bf0 65 73 74 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f  ested (%lu), slo
26c00 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20  t not currently 
26c10 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 29  active", slotID)
26c20 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65  ;....cackey_mute
26c30 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
26c40 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74  biglock);....ret
26c50 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
26c60 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20  ERROR);..}...if 
26c70 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c  (cackey_slots[sl
26c80 6f 74 49 44 5d 2e 73 6c 6f 74 5f 72 65 73 65 74  otID].slot_reset
26c90 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
26ca0 55 47 5f 50 52 49 4e 54 46 28 22 54 68 65 20 73  UG_PRINTF("The s
26cb0 6c 6f 74 20 68 61 73 20 62 65 65 6e 20 72 65 73  lot has been res
26cc0 65 74 20 73 69 6e 63 65 20 77 65 20 6c 61 73 74  et since we last
26cd0 20 6c 6f 6f 6b 65 64 20 66 6f 72 20 69 64 65 6e   looked for iden
26ce0 74 69 74 69 65 73 20 2d 2d 20 72 65 73 63 61 6e  tities -- rescan
26cf0 6e 69 6e 67 22 29 3b 0a 0a 09 09 69 66 20 28 63  ning");....if (c
26d00 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
26d10 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74  Session].identit
26d20 69 65 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ies != NULL) {..
26d30 09 09 63 61 63 6b 65 79 5f 66 72 65 65 5f 69 64  ..cackey_free_id
26d40 65 6e 74 69 74 69 65 73 28 63 61 63 6b 65 79 5f  entities(cackey_
26d50 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
26d60 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 2c 20 63  n].identities, c
26d70 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
26d80 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74  Session].identit
26d90 69 65 73 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09 09  ies_count);.....
26da0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
26db0 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69  hSession].identi
26dc0 74 69 65 73 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09  ties = NULL;....
26dd0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
26de0 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69  hSession].identi
26df0 74 69 65 73 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a  ties_count = 0;.
26e00 09 09 7d 0a 0a 09 09 69 66 20 28 63 61 63 6b 65  ..}....if (cacke
26e10 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e  y_slots[slotID].
26e20 6c 61 62 65 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b  label != NULL) {
26e30 0a 09 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f  ....free(cackey_
26e40 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61  slots[slotID].la
26e50 62 65 6c 29 3b 0a 09 09 09 63 61 63 6b 65 79 5f  bel);....cackey_
26e60 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61  slots[slotID].la
26e70 62 65 6c 20 3d 20 4e 55 4c 4c 3b 0a 09 09 7d 0a  bel = NULL;...}.
26e80 0a 09 09 63 61 63 6b 65 79 5f 6d 61 72 6b 5f 73  ...cackey_mark_s
26e90 6c 6f 74 5f 72 65 73 65 74 28 26 63 61 63 6b 65  lot_reset(&cacke
26ea0 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 29  y_slots[slotID])
26eb0 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ;...cackey_slots
26ec0 5b 73 6c 6f 74 49 44 5d 2e 73 6c 6f 74 5f 72 65  [slotID].slot_re
26ed0 73 65 74 20 3d 20 30 3b 0a 09 7d 0a 0a 09 69 66  set = 0;..}...if
26ee0 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e   (cackey_session
26ef0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e  s[hSession].iden
26f00 74 69 74 69 65 73 20 3d 3d 20 4e 55 4c 4c 29 20  tities == NULL) 
26f10 7b 0a 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69  {...cackey_sessi
26f20 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64  ons[hSession].id
26f30 65 6e 74 69 74 69 65 73 20 3d 20 63 61 63 6b 65  entities = cacke
26f40 79 5f 72 65 61 64 5f 69 64 65 6e 74 69 74 69 65  y_read_identitie
26f50 73 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  s(&cackey_slots[
26f60 73 6c 6f 74 49 44 5d 2c 20 26 63 61 63 6b 65 79  slotID], &cackey
26f70 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
26f80 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63  on].identities_c
26f90 6f 75 6e 74 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  ount);..}...if (
26fa0 70 54 65 6d 70 6c 61 74 65 20 21 3d 20 4e 55 4c  pTemplate != NUL
26fb0 4c 29 20 7b 0a 09 09 69 66 20 28 75 6c 43 6f 75  L) {...if (ulCou
26fc0 6e 74 20 21 3d 20 30 29 20 7b 0a 09 09 09 63 61  nt != 0) {....ca
26fd0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
26fe0 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71  ession].search_q
26ff0 75 65 72 79 5f 63 6f 75 6e 74 20 3d 20 75 6c 43  uery_count = ulC
27000 6f 75 6e 74 3b 0a 09 09 09 63 61 63 6b 65 79 5f  ount;....cackey_
27010 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
27020 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 20  n].search_query 
27030 3d 20 6d 61 6c 6c 6f 63 28 75 6c 43 6f 75 6e 74  = malloc(ulCount
27040 20 2a 20 73 69 7a 65 6f 66 28 2a 70 54 65 6d 70   * sizeof(*pTemp
27050 6c 61 74 65 29 29 3b 0a 0a 09 09 09 6d 65 6d 63  late));.....memc
27060 70 79 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  py(cackey_sessio
27070 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61  ns[hSession].sea
27080 72 63 68 5f 71 75 65 72 79 2c 20 70 54 65 6d 70  rch_query, pTemp
27090 6c 61 74 65 2c 20 75 6c 43 6f 75 6e 74 20 2a 20  late, ulCount * 
270a0 73 69 7a 65 6f 66 28 2a 70 54 65 6d 70 6c 61 74  sizeof(*pTemplat
270b0 65 29 29 3b 0a 09 09 09 66 6f 72 20 28 69 64 78  e));....for (idx
270c0 20 3d 20 30 3b 20 69 64 78 20 3c 20 75 6c 43 6f   = 0; idx < ulCo
270d0 75 6e 74 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09  unt; idx++) {...
270e0 09 09 69 66 20 28 70 54 65 6d 70 6c 61 74 65 5b  ..if (pTemplate[
270f0 69 64 78 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e 20  idx].ulValueLen 
27100 3d 3d 20 30 29 20 7b 0a 09 09 09 09 09 63 61 63  == 0) {......cac
27110 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
27120 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75  ssion].search_qu
27130 65 72 79 5b 69 64 78 5d 2e 70 56 61 6c 75 65 20  ery[idx].pValue 
27140 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09 09 63 6f  = NULL;.......co
27150 6e 74 69 6e 75 65 3b 0a 09 09 09 09 7d 0a 0a 09  ntinue;.....}...
27160 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
27170 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61  ns[hSession].sea
27180 72 63 68 5f 71 75 65 72 79 5b 69 64 78 5d 2e 70  rch_query[idx].p
27190 56 61 6c 75 65 20 3d 20 6d 61 6c 6c 6f 63 28 70  Value = malloc(p
271a0 54 65 6d 70 6c 61 74 65 5b 69 64 78 5d 2e 75 6c  Template[idx].ul
271b0 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09  ValueLen);......
271c0 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69  if (cackey_sessi
271d0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65  ons[hSession].se
271e0 61 72 63 68 5f 71 75 65 72 79 5b 69 64 78 5d 2e  arch_query[idx].
271f0 70 56 61 6c 75 65 29 20 7b 0a 09 09 09 09 09 6d  pValue) {......m
27200 65 6d 63 70 79 28 63 61 63 6b 65 79 5f 73 65 73  emcpy(cackey_ses
27210 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
27220 73 65 61 72 63 68 5f 71 75 65 72 79 5b 69 64 78  search_query[idx
27230 5d 2e 70 56 61 6c 75 65 2c 20 70 54 65 6d 70 6c  ].pValue, pTempl
27240 61 74 65 5b 69 64 78 5d 2e 70 56 61 6c 75 65 2c  ate[idx].pValue,
27250 20 70 54 65 6d 70 6c 61 74 65 5b 69 64 78 5d 2e   pTemplate[idx].
27260 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 09 09 09  ulValueLen);....
27270 09 7d 0a 09 09 09 7d 0a 09 09 7d 20 65 6c 73 65  .}....}...} else
27280 20 7b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73   {....cackey_ses
27290 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
272a0 73 65 61 72 63 68 5f 71 75 65 72 79 5f 63 6f 75  search_query_cou
272b0 6e 74 20 3d 20 30 3b 0a 09 09 09 63 61 63 6b 65  nt = 0;....cacke
272c0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
272d0 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72  ion].search_quer
272e0 79 20 3d 20 4e 55 4c 4c 3b 0a 09 09 7d 0a 09 7d  y = NULL;...}..}
272f0 20 65 6c 73 65 20 7b 0a 09 09 69 66 20 28 75 6c   else {...if (ul
27300 43 6f 75 6e 74 20 21 3d 20 30 29 20 7b 0a 09 09  Count != 0) {...
27310 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
27320 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
27330 6f 63 6b 29 3b 0a 0a 09 09 09 43 41 43 4b 45 59  ock);.....CACKEY
27340 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
27350 72 72 6f 72 2e 20 20 53 65 61 72 63 68 20 71 75  rror.  Search qu
27360 65 72 79 20 73 70 65 63 69 66 69 65 64 20 61 73  ery specified as
27370 20 4e 55 4c 4c 2c 20 62 75 74 20 6e 75 6d 62 65   NULL, but numbe
27380 72 20 6f 66 20 71 75 65 72 79 20 74 65 72 6d 73  r of query terms
27390 20 6e 6f 74 20 73 70 65 63 69 66 69 65 64 20 61   not specified a
273a0 73 20 30 2e 22 29 3b 0a 0a 09 09 09 72 65 74 75  s 0.");.....retu
273b0 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53  rn(CKR_ARGUMENTS
273c0 5f 42 41 44 29 3b 0a 09 09 7d 0a 0a 09 09 63 61  _BAD);...}....ca
273d0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
273e0 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71  ession].search_q
273f0 75 65 72 79 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a  uery_count = 0;.
27400 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
27410 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72  s[hSession].sear
27420 63 68 5f 71 75 65 72 79 20 3d 20 4e 55 4c 4c 3b  ch_query = NULL;
27430 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73  ..}...cackey_ses
27440 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
27450 73 65 61 72 63 68 5f 61 63 74 69 76 65 20 3d 20  search_active = 
27460 31 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69  1;..cackey_sessi
27470 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65  ons[hSession].se
27480 61 72 63 68 5f 63 75 72 72 5f 69 64 20 3d 20 30  arch_curr_id = 0
27490 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  ;...mutex_retval
274a0 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
274b0 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
274c0 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
274d0 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
274e0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
274f0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
27500 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65   Unlocking faile
27510 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
27520 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
27530 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  R);..}...CACKEY_
27540 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
27550 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28  turning CKR_OK (
27560 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a  %i)", CKR_OK);..
27570 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b  .return(CKR_OK);
27580 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .}..static int c
27590 61 63 6b 65 79 5f 70 6b 63 73 31 31 5f 63 6f 6d  ackey_pkcs11_com
275a0 70 61 72 65 5f 61 74 74 72 69 62 75 74 65 73 28  pare_attributes(
275b0 43 4b 5f 41 54 54 52 49 42 55 54 45 20 2a 61 2c  CK_ATTRIBUTE *a,
275c0 20 43 4b 5f 41 54 54 52 49 42 55 54 45 20 2a 62   CK_ATTRIBUTE *b
275d0 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68  ) {..unsigned ch
275e0 61 72 20 2a 73 6d 61 6c 6c 62 75 66 2c 20 2a 6c  ar *smallbuf, *l
275f0 61 72 67 65 62 75 66 3b 0a 09 73 69 7a 65 5f 74  argebuf;..size_t
27600 20 73 6d 61 6c 6c 62 75 66 5f 6c 65 6e 2c 20 6c   smallbuf_len, l
27610 61 72 67 65 62 75 66 5f 6c 65 6e 3b 0a 0a 09 69  argebuf_len;...i
27620 66 20 28 61 2d 3e 74 79 70 65 20 21 3d 20 62 2d  f (a->type != b-
27630 3e 74 79 70 65 29 20 7b 0a 09 09 72 65 74 75 72  >type) {...retur
27640 6e 28 30 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  n(0);..}...CACKE
27650 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
27660 20 20 20 20 2e 2e 2e 20 66 6f 75 6e 64 20 6d 61      ... found ma
27670 74 63 68 69 6e 67 20 74 79 70 65 20 2e 2e 2e 22  tching type ..."
27680 29 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  );...CACKEY_DEBU
27690 47 5f 50 52 49 4e 54 42 55 46 28 22 20 20 20 20  G_PRINTBUF("    
276a0 2e 2e 2e 20 6f 75 72 20 76 61 6c 75 65 3a 22 2c  ... our value:",
276b0 20 61 2d 3e 70 56 61 6c 75 65 2c 20 61 2d 3e 75   a->pValue, a->u
276c0 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 69 66  lValueLen);...if
276d0 20 28 62 2d 3e 70 56 61 6c 75 65 20 3d 3d 20 4e   (b->pValue == N
276e0 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
276f0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 20  DEBUG_PRINTF("  
27700 20 20 20 20 20 2e 2e 2e 20 66 6f 75 6e 64 20 77       ... found w
27710 69 6c 64 63 61 72 64 20 6d 61 74 63 68 22 29 3b  ildcard match");
27720 0a 0a 09 09 72 65 74 75 72 6e 28 31 29 3b 0a 09  ....return(1);..
27730 7d 0a 0a 09 69 66 20 28 61 2d 3e 70 56 61 6c 75  }...if (a->pValu
27740 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72  e == NULL) {...r
27750 65 74 75 72 6e 28 30 29 3b 0a 09 7d 0a 0a 20 09  eturn(0);..}.. .
27760 69 66 20 28 62 2d 3e 75 6c 56 61 6c 75 65 4c 65  if (b->ulValueLe
27770 6e 20 3d 3d 20 61 2d 3e 75 6c 56 61 6c 75 65 4c  n == a->ulValueL
27780 65 6e 20 26 26 20 6d 65 6d 63 6d 70 28 61 2d 3e  en && memcmp(a->
27790 70 56 61 6c 75 65 2c 20 62 2d 3e 70 56 61 6c 75  pValue, b->pValu
277a0 65 2c 20 62 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e  e, b->ulValueLen
277b0 29 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  ) == 0) {...CACK
277c0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
277d0 22 20 20 20 20 20 20 20 2e 2e 2e 20 66 6f 75 6e  "       ... foun
277e0 64 20 65 78 61 63 74 20 6d 61 74 63 68 22 29 3b  d exact match");
277f0 0a 0a 09 09 72 65 74 75 72 6e 28 31 29 3b 0a 09  ....return(1);..
27800 7d 0a 0a 09 73 77 69 74 63 68 20 28 61 2d 3e 74  }...switch (a->t
27810 79 70 65 29 20 7b 0a 09 09 63 61 73 65 20 43 4b  ype) {...case CK
27820 41 5f 4d 4f 44 55 4c 55 53 3a 0a 09 09 09 69 66  A_MODULUS:....if
27830 20 28 61 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 20   (a->ulValueLen 
27840 3d 3d 20 62 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e  == b->ulValueLen
27850 29 20 7b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  ) {.....break;..
27860 09 09 7d 0a 0a 09 09 09 69 66 20 28 61 2d 3e 75  ..}.....if (a->u
27870 6c 56 61 6c 75 65 4c 65 6e 20 3e 20 62 2d 3e 75  lValueLen > b->u
27880 6c 56 61 6c 75 65 4c 65 6e 29 20 7b 0a 09 09 09  lValueLen) {....
27890 09 73 6d 61 6c 6c 62 75 66 20 3d 20 62 2d 3e 70  .smallbuf = b->p
278a0 56 61 6c 75 65 3b 0a 09 09 09 09 73 6d 61 6c 6c  Value;.....small
278b0 62 75 66 5f 6c 65 6e 20 3d 20 62 2d 3e 75 6c 56  buf_len = b->ulV
278c0 61 6c 75 65 4c 65 6e 3b 0a 0a 09 09 09 09 6c 61  alueLen;......la
278d0 72 67 65 62 75 66 20 3d 20 61 2d 3e 70 56 61 6c  rgebuf = a->pVal
278e0 75 65 3b 0a 09 09 09 09 6c 61 72 67 65 62 75 66  ue;.....largebuf
278f0 5f 6c 65 6e 20 3d 20 61 2d 3e 75 6c 56 61 6c 75  _len = a->ulValu
27900 65 4c 65 6e 3b 0a 09 09 09 7d 20 65 6c 73 65 20  eLen;....} else 
27910 7b 0a 09 09 09 09 73 6d 61 6c 6c 62 75 66 20 3d  {.....smallbuf =
27920 20 61 2d 3e 70 56 61 6c 75 65 3b 0a 09 09 09 09   a->pValue;.....
27930 73 6d 61 6c 6c 62 75 66 5f 6c 65 6e 20 3d 20 61  smallbuf_len = a
27940 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 0a 09  ->ulValueLen;...
27950 09 09 09 6c 61 72 67 65 62 75 66 20 3d 20 62 2d  ...largebuf = b-
27960 3e 70 56 61 6c 75 65 3b 0a 09 09 09 09 6c 61 72  >pValue;.....lar
27970 67 65 62 75 66 5f 6c 65 6e 20 3d 20 62 2d 3e 75  gebuf_len = b->u
27980 6c 56 61 6c 75 65 4c 65 6e 3b 0a 09 09 09 7d 0a  lValueLen;....}.
27990 0a 09 09 09 66 6f 72 20 28 3b 20 6c 61 72 67 65  ....for (; large
279a0 62 75 66 5f 6c 65 6e 20 21 3d 20 73 6d 61 6c 6c  buf_len != small
279b0 62 75 66 5f 6c 65 6e 3b 20 6c 61 72 67 65 62 75  buf_len; largebu
279c0 66 2b 2b 2c 6c 61 72 67 65 62 75 66 5f 6c 65 6e  f++,largebuf_len
279d0 2d 2d 29 20 7b 0a 09 09 09 09 69 66 20 28 6c 61  --) {.....if (la
279e0 72 67 65 62 75 66 5b 30 5d 20 21 3d 20 30 29 20  rgebuf[0] != 0) 
279f0 7b 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  {......break;...
27a00 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20  ..}....}.....if 
27a10 28 6c 61 72 67 65 62 75 66 5f 6c 65 6e 20 21 3d  (largebuf_len !=
27a20 20 73 6d 61 6c 6c 62 75 66 5f 6c 65 6e 29 20 7b   smallbuf_len) {
27a30 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 7d  .....break;....}
27a40 0a 0a 09 09 09 69 66 20 28 6d 65 6d 63 6d 70 28  .....if (memcmp(
27a50 6c 61 72 67 65 62 75 66 2c 20 73 6d 61 6c 6c 62  largebuf, smallb
27a60 75 66 2c 20 73 6d 61 6c 6c 62 75 66 5f 6c 65 6e  uf, smallbuf_len
27a70 29 20 3d 3d 20 30 29 20 7b 0a 09 09 09 09 43 41  ) == 0) {.....CA
27a80 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
27a90 46 28 22 20 20 20 20 20 20 20 2e 2e 2e 20 66 6f  F("       ... fo
27aa0 75 6e 64 20 61 70 70 72 6f 78 69 6d 61 74 65 20  und approximate 
27ab0 6d 61 74 63 68 22 29 3b 0a 0a 09 09 09 09 72 65  match");......re
27ac0 74 75 72 6e 28 31 29 3b 0a 09 09 09 7d 0a 0a 09  turn(1);....}...
27ad0 09 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 72 65  ..break;..}...re
27ae0 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a 43 4b 5f 44  turn(0);.}..CK_D
27af0 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
27b00 4b 5f 52 56 2c 20 43 5f 46 69 6e 64 4f 62 6a 65  K_RV, C_FindObje
27b10 63 74 73 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  cts)(CK_SESSION_
27b20 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
27b30 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c   CK_OBJECT_HANDL
27b40 45 5f 50 54 52 20 70 68 4f 62 6a 65 63 74 2c 20  E_PTR phObject, 
27b50 43 4b 5f 55 4c 4f 4e 47 20 75 6c 4d 61 78 4f 62  CK_ULONG ulMaxOb
27b60 6a 65 63 74 43 6f 75 6e 74 2c 20 43 4b 5f 55 4c  jectCount, CK_UL
27b70 4f 4e 47 5f 50 54 52 20 70 75 6c 4f 62 6a 65 63  ONG_PTR pulObjec
27b80 74 43 6f 75 6e 74 29 20 7b 0a 09 73 74 72 75 63  tCount) {..struc
27b90 74 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 74  t cackey_identit
27ba0 79 20 2a 63 75 72 72 5f 69 64 3b 0a 09 43 4b 5f  y *curr_id;..CK_
27bb0 41 54 54 52 49 42 55 54 45 20 2a 63 75 72 72 5f  ATTRIBUTE *curr_
27bc0 61 74 74 72 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20  attr;..CK_ULONG 
27bd0 63 75 72 72 5f 69 64 5f 69 64 78 2c 20 63 75 72  curr_id_idx, cur
27be0 72 5f 6f 75 74 5f 69 64 5f 69 64 78 2c 20 63 75  r_out_id_idx, cu
27bf0 72 72 5f 61 74 74 72 5f 69 64 78 2c 20 73 65 73  rr_attr_idx, ses
27c00 73 5f 61 74 74 72 5f 69 64 78 3b 0a 09 43 4b 5f  s_attr_idx;..CK_
27c10 55 4c 4f 4e 47 20 6d 61 74 63 68 65 64 5f 63 6f  ULONG matched_co
27c20 75 6e 74 2c 20 70 72 65 76 5f 6d 61 74 63 68 65  unt, prev_matche
27c30 64 5f 63 6f 75 6e 74 3b 0a 09 69 6e 74 20 6d 75  d_count;..int mu
27c40 74 65 78 5f 72 65 74 76 61 6c 3b 0a 23 69 66 64  tex_retval;.#ifd
27c50 65 66 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ef CACKEY_DEBUG_
27c60 53 45 41 52 43 48 5f 53 50 45 45 44 54 45 53 54  SEARCH_SPEEDTEST
27c70 0a 09 73 74 72 75 63 74 20 74 69 6d 65 76 61 6c  ..struct timeval
27c80 20 73 74 61 72 74 2c 20 65 6e 64 3b 0a 09 75 69   start, end;..ui
27c90 6e 74 36 34 5f 74 20 73 74 61 72 74 5f 69 6e 74  nt64_t start_int
27ca0 2c 20 65 6e 64 5f 69 6e 74 3b 0a 23 65 6e 64 69  , end_int;.#endi
27cb0 66 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  f...CACKEY_DEBUG
27cc0 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
27cd0 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
27ce0 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
27cf0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
27d00 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
27d10 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
27d20 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
27d30 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
27d40 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
27d50 0a 09 69 66 20 28 70 75 6c 4f 62 6a 65 63 74 43  ..if (pulObjectC
27d60 6f 75 6e 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  ount == NULL) {.
27d70 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
27d80 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 70  RINTF("Error.  p
27d90 75 6c 4f 62 6a 65 63 74 43 6f 75 6e 74 20 69 73  ulObjectCount is
27da0 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74   NULL.");....ret
27db0 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54  urn(CKR_ARGUMENT
27dc0 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  S_BAD);..}...if 
27dd0 28 70 68 4f 62 6a 65 63 74 20 3d 3d 20 4e 55 4c  (phObject == NUL
27de0 4c 20 26 26 20 75 6c 4d 61 78 4f 62 6a 65 63 74  L && ulMaxObject
27df0 43 6f 75 6e 74 20 3d 3d 20 30 29 20 7b 0a 09 09  Count == 0) {...
27e00 2f 2a 20 53 68 6f 72 74 20 63 69 72 63 75 69 74  /* Short circuit
27e10 2c 20 69 66 20 7a 65 72 6f 20 6f 62 6a 65 63 74  , if zero object
27e20 73 20 77 65 72 65 20 73 70 65 63 69 66 69 65 64  s were specified
27e30 20 72 65 74 75 72 6e 20 7a 65 72 6f 20 69 74 65   return zero ite
27e40 6d 73 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 2a  ms immediately *
27e50 2f 0a 09 09 2a 70 75 6c 4f 62 6a 65 63 74 43 6f  /...*pulObjectCo
27e60 75 6e 74 20 3d 20 30 3b 0a 0a 09 09 43 41 43 4b  unt = 0;....CACK
27e70 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
27e80 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
27e90 4b 20 28 25 69 29 20 28 73 68 6f 72 74 20 63 69  K (%i) (short ci
27ea0 72 63 75 69 74 29 22 2c 20 43 4b 52 5f 4f 4b 29  rcuit)", CKR_OK)
27eb0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
27ec0 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 68  OK);..}...if (ph
27ed0 4f 62 6a 65 63 74 20 3d 3d 20 4e 55 4c 4c 29 20  Object == NULL) 
27ee0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
27ef0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
27f00 20 70 68 4f 62 6a 65 63 74 20 69 73 20 4e 55 4c   phObject is NUL
27f10 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  L.");....return(
27f20 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41  CKR_ARGUMENTS_BA
27f30 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 6c 4d  D);..}...if (ulM
27f40 61 78 4f 62 6a 65 63 74 43 6f 75 6e 74 20 3d 3d  axObjectCount ==
27f50 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
27f60 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
27f70 6f 72 2e 20 20 4d 61 78 69 6d 75 6d 20 6e 75 6d  or.  Maximum num
27f80 62 65 72 20 6f 66 20 6f 62 6a 65 63 74 73 20 73  ber of objects s
27f90 70 65 63 69 66 69 65 64 20 61 73 20 7a 65 72 6f  pecified as zero
27fa0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
27fb0 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44  KR_ARGUMENTS_BAD
27fc0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73  );..}...if (hSes
27fd0 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65  sion == 0 || hSe
27fe0 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66  ssion >= (sizeof
27ff0 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
28000 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
28010 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29  y_sessions[0])))
28020 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
28030 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
28040 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66    Session out of
28050 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09   range.");......
28060 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
28070 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  ON_HANDLE_INVALI
28080 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  D);..}...mutex_r
28090 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
280a0 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79  utex_lock(cackey
280b0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
280c0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
280d0 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
280e0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
280f0 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c  r.  Locking fail
28100 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
28110 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
28120 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63  OR);..}...if (!c
28130 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
28140 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29  Session].active)
28150 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65   {...cackey_mute
28160 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
28170 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43  biglock);....CAC
28180 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
28190 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f  ("Error.  Sessio
281a0 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b  n not active.");
281b0 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
281c0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
281d0 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69  INVALID);..}...i
281e0 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69  f (!cackey_sessi
281f0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65  ons[hSession].se
28200 61 72 63 68 5f 61 63 74 69 76 65 29 20 7b 0a 09  arch_active) {..
28210 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
28220 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
28230 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f  ock);....CACKEY_
28240 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
28250 72 6f 72 2e 20 20 53 65 61 72 63 68 20 6e 6f 74  ror.  Search not
28260 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09   active.");.....
28270 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52  .return(CKR_OPER
28280 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41  ATION_NOT_INITIA
28290 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 23 69 66 64  LIZED);..}..#ifd
282a0 65 66 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ef CACKEY_DEBUG_
282b0 53 45 41 52 43 48 5f 53 50 45 45 44 54 45 53 54  SEARCH_SPEEDTEST
282c0 0a 09 67 65 74 74 69 6d 65 6f 66 64 61 79 28 26  ..gettimeofday(&
282d0 73 74 61 72 74 2c 20 4e 55 4c 4c 29 3b 0a 23 65  start, NULL);.#e
282e0 6e 64 69 66 0a 0a 09 63 75 72 72 5f 6f 75 74 5f  ndif...curr_out_
282f0 69 64 5f 69 64 78 20 3d 20 30 3b 0a 09 66 6f 72  id_idx = 0;..for
28300 20 28 63 75 72 72 5f 69 64 5f 69 64 78 20 3d 20   (curr_id_idx = 
28310 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
28320 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68  hSession].search
28330 5f 63 75 72 72 5f 69 64 3b 20 63 75 72 72 5f 69  _curr_id; curr_i
28340 64 5f 69 64 78 20 3c 20 63 61 63 6b 65 79 5f 73  d_idx < cackey_s
28350 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
28360 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75  ].identities_cou
28370 6e 74 20 26 26 20 75 6c 4d 61 78 4f 62 6a 65 63  nt && ulMaxObjec
28380 74 43 6f 75 6e 74 3b 20 63 75 72 72 5f 69 64 5f  tCount; curr_id_
28390 69 64 78 2b 2b 29 20 7b 0a 09 09 63 75 72 72 5f  idx++) {...curr_
283a0 69 64 20 3d 20 26 63 61 63 6b 65 79 5f 73 65 73  id = &cackey_ses
283b0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
283c0 69 64 65 6e 74 69 74 69 65 73 5b 63 75 72 72 5f  identities[curr_
283d0 69 64 5f 69 64 78 5d 3b 0a 0a 09 09 43 41 43 4b  id_idx];....CACK
283e0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
283f0 22 50 72 6f 63 65 73 73 69 6e 67 20 69 64 65 6e  "Processing iden
28400 74 69 74 79 3a 25 6c 75 22 2c 20 28 75 6e 73 69  tity:%lu", (unsi
28410 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f  gned long) curr_
28420 69 64 5f 69 64 78 29 3b 0a 0a 09 09 6d 61 74 63  id_idx);....matc
28430 68 65 64 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 0a  hed_count = 0;..
28440 09 09 66 6f 72 20 28 63 75 72 72 5f 61 74 74 72  ..for (curr_attr
28450 5f 69 64 78 20 3d 20 30 3b 20 63 75 72 72 5f 61  _idx = 0; curr_a
28460 74 74 72 5f 69 64 78 20 3c 20 63 61 63 6b 65 79  ttr_idx < cackey
28470 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
28480 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79  on].search_query
28490 5f 63 6f 75 6e 74 3b 20 63 75 72 72 5f 61 74 74  _count; curr_att
284a0 72 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 09 70 72  r_idx++) {....pr
284b0 65 76 5f 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74  ev_matched_count
284c0 20 3d 20 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74   = matched_count
284d0 3b 0a 0a 09 09 09 63 75 72 72 5f 61 74 74 72 20  ;.....curr_attr 
284e0 3d 20 26 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  = &cackey_sessio
284f0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61  ns[hSession].sea
28500 72 63 68 5f 71 75 65 72 79 5b 63 75 72 72 5f 61  rch_query[curr_a
28510 74 74 72 5f 69 64 78 5d 3b 0a 0a 09 09 09 43 41  ttr_idx];.....CA
28520 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
28530 46 28 22 20 20 43 68 65 63 6b 69 6e 67 20 66 6f  F("  Checking fo
28540 72 20 61 74 74 72 69 62 75 74 65 20 25 73 20 28  r attribute %s (
28550 30 78 25 30 38 6c 78 29 20 69 6e 20 69 64 65 6e  0x%08lx) in iden
28560 74 69 74 79 3a 25 69 2e 2e 2e 22 2c 20 43 41 43  tity:%i...", CAC
28570 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 41  KEY_DEBUG_FUNC_A
28580 54 54 52 49 42 55 54 45 5f 54 4f 5f 53 54 52 28  TTRIBUTE_TO_STR(
28590 63 75 72 72 5f 61 74 74 72 2d 3e 74 79 70 65 29  curr_attr->type)
285a0 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
285b0 29 20 63 75 72 72 5f 61 74 74 72 2d 3e 74 79 70  ) curr_attr->typ
285c0 65 2c 20 28 69 6e 74 29 20 63 75 72 72 5f 69 64  e, (int) curr_id
285d0 5f 69 64 78 29 3b 0a 09 09 09 43 41 43 4b 45 59  _idx);....CACKEY
285e0 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28  _DEBUG_PRINTBUF(
285f0 22 20 20 20 20 56 61 6c 75 65 20 6c 6f 6f 6b 69  "    Value looki
28600 6e 67 20 66 6f 72 3a 22 2c 20 63 75 72 72 5f 61  ng for:", curr_a
28610 74 74 72 2d 3e 70 56 61 6c 75 65 2c 20 63 75 72  ttr->pValue, cur
28620 72 5f 61 74 74 72 2d 3e 75 6c 56 61 6c 75 65 4c  r_attr->ulValueL
28630 65 6e 29 3b 0a 0a 09 09 09 66 6f 72 20 28 73 65  en);.....for (se
28640 73 73 5f 61 74 74 72 5f 69 64 78 20 3d 20 30 3b  ss_attr_idx = 0;
28650 20 73 65 73 73 5f 61 74 74 72 5f 69 64 78 20 3c   sess_attr_idx <
28660 20 63 75 72 72 5f 69 64 2d 3e 61 74 74 72 69 62   curr_id->attrib
28670 75 74 65 73 5f 63 6f 75 6e 74 3b 20 73 65 73 73  utes_count; sess
28680 5f 61 74 74 72 5f 69 64 78 2b 2b 29 20 7b 0a 09  _attr_idx++) {..
28690 09 09 09 69 66 20 28 63 61 63 6b 65 79 5f 70 6b  ...if (cackey_pk
286a0 63 73 31 31 5f 63 6f 6d 70 61 72 65 5f 61 74 74  cs11_compare_att
286b0 72 69 62 75 74 65 73 28 26 63 75 72 72 5f 69 64  ributes(&curr_id
286c0 2d 3e 61 74 74 72 69 62 75 74 65 73 5b 73 65 73  ->attributes[ses
286d0 73 5f 61 74 74 72 5f 69 64 78 5d 2c 20 63 75 72  s_attr_idx], cur
286e0 72 5f 61 74 74 72 29 29 20 7b 0a 09 09 09 09 09  r_attr)) {......
286f0 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 2b 2b 3b  matched_count++;
28700 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .......break;...
28710 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 09 2f 2a 20  ..}....}...../* 
28720 49 66 20 74 68 65 20 61 74 74 72 69 62 75 74 65  If the attribute
28730 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 6d 61   could not be ma
28740 74 63 68 65 64 2c 20 64 6f 20 6e 6f 74 20 74 72  tched, do not tr
28750 79 20 74 6f 20 6d 61 74 63 68 20 61 64 64 69 74  y to match addit
28760 69 6f 6e 61 6c 20 61 74 74 72 69 62 75 74 65 73  ional attributes
28770 20 2a 2f 0a 09 09 09 69 66 20 28 70 72 65 76 5f   */....if (prev_
28780 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 20 3d 3d  matched_count ==
28790 20 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 29 20   matched_count) 
287a0 7b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  {.....break;....
287b0 7d 0a 09 09 7d 0a 0a 09 09 69 66 20 28 6d 61 74  }...}....if (mat
287c0 63 68 65 64 5f 63 6f 75 6e 74 20 3d 3d 20 63 61  ched_count == ca
287d0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
287e0 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71  ession].search_q
287f0 75 65 72 79 5f 63 6f 75 6e 74 29 20 7b 0a 09 09  uery_count) {...
28800 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
28810 49 4e 54 46 28 22 20 20 2e 2e 2e 20 41 6c 6c 20  INTF("  ... All 
28820 25 69 20 61 74 74 72 69 62 75 74 65 73 20 63 68  %i attributes ch
28830 65 63 6b 65 64 20 66 6f 72 20 66 6f 75 6e 64 2c  ecked for found,
28840 20 61 64 64 69 6e 67 20 69 64 65 6e 74 69 74 79   adding identity
28850 3a 25 69 20 74 6f 20 72 65 74 75 72 6e 65 64 20  :%i to returned 
28860 6c 69 73 74 22 2c 20 28 69 6e 74 29 20 63 61 63  list", (int) cac
28870 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
28880 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75  ssion].search_qu
28890 65 72 79 5f 63 6f 75 6e 74 2c 20 28 69 6e 74 29  ery_count, (int)
288a0 20 63 75 72 72 5f 69 64 5f 69 64 78 29 3b 0a 0a   curr_id_idx);..
288b0 09 09 09 70 68 4f 62 6a 65 63 74 5b 63 75 72 72  ...phObject[curr
288c0 5f 6f 75 74 5f 69 64 5f 69 64 78 5d 20 3d 20 63  _out_id_idx] = c
288d0 75 72 72 5f 69 64 5f 69 64 78 20 2b 20 31 3b 0a  urr_id_idx + 1;.
288e0 0a 09 09 09 75 6c 4d 61 78 4f 62 6a 65 63 74 43  ....ulMaxObjectC
288f0 6f 75 6e 74 2d 2d 3b 0a 0a 09 09 09 63 75 72 72  ount--;.....curr
28900 5f 6f 75 74 5f 69 64 5f 69 64 78 2b 2b 3b 0a 09  _out_id_idx++;..
28910 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 43 41 43  .} else {....CAC
28920 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
28930 28 22 20 20 2e 2e 2e 20 4e 6f 74 20 61 6c 6c 20  ("  ... Not all 
28940 25 69 20 28 6f 6e 6c 79 20 66 6f 75 6e 64 20 25  %i (only found %
28950 69 29 20 61 74 74 72 69 62 75 74 65 73 20 63 68  i) attributes ch
28960 65 63 6b 65 64 20 66 6f 72 20 66 6f 75 6e 64 2c  ecked for found,
28970 20 6e 6f 74 20 61 64 64 69 6e 67 20 69 64 65 6e   not adding iden
28980 74 69 74 79 3a 25 69 22 2c 20 28 69 6e 74 29 20  tity:%i", (int) 
28990 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
289a0 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68  hSession].search
289b0 5f 71 75 65 72 79 5f 63 6f 75 6e 74 2c 20 28 69  _query_count, (i
289c0 6e 74 29 20 6d 61 74 63 68 65 64 5f 63 6f 75 6e  nt) matched_coun
289d0 74 2c 20 28 69 6e 74 29 20 63 75 72 72 5f 69 64  t, (int) curr_id
289e0 5f 69 64 78 29 3b 0a 09 09 7d 0a 09 7d 0a 09 63  _idx);...}..}..c
289f0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
28a00 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f  Session].search_
28a10 63 75 72 72 5f 69 64 20 3d 20 63 75 72 72 5f 69  curr_id = curr_i
28a20 64 5f 69 64 78 3b 0a 09 2a 70 75 6c 4f 62 6a 65  d_idx;..*pulObje
28a30 63 74 43 6f 75 6e 74 20 3d 20 63 75 72 72 5f 6f  ctCount = curr_o
28a40 75 74 5f 69 64 5f 69 64 78 3b 0a 0a 23 69 66 64  ut_id_idx;..#ifd
28a50 65 66 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ef CACKEY_DEBUG_
28a60 53 45 41 52 43 48 5f 53 50 45 45 44 54 45 53 54  SEARCH_SPEEDTEST
28a70 0a 09 67 65 74 74 69 6d 65 6f 66 64 61 79 28 26  ..gettimeofday(&
28a80 65 6e 64 2c 20 4e 55 4c 4c 29 3b 0a 09 73 74 61  end, NULL);..sta
28a90 72 74 5f 69 6e 74 20 3d 20 28 73 74 61 72 74 2e  rt_int = (start.
28aa0 74 76 5f 73 65 63 20 2a 20 31 30 30 30 30 30 30  tv_sec * 1000000
28ab0 29 20 2b 20 73 74 61 72 74 2e 74 76 5f 75 73 65  ) + start.tv_use
28ac0 63 3b 0a 09 65 6e 64 5f 69 6e 74 20 3d 20 28 65  c;..end_int = (e
28ad0 6e 64 2e 74 76 5f 73 65 63 20 2a 20 31 30 30 30  nd.tv_sec * 1000
28ae0 30 30 30 29 20 2b 20 65 6e 64 2e 74 76 5f 75 73  000) + end.tv_us
28af0 65 63 3b 0a 09 66 70 72 69 6e 74 66 28 73 74 64  ec;..fprintf(std
28b00 65 72 72 2c 20 22 53 65 61 72 63 68 20 74 6f 6f  err, "Search too
28b10 6b 20 25 6c 75 20 6d 69 63 72 6f 73 65 63 6f 6e  k %lu microsecon
28b20 64 73 5c 6e 22 2c 20 28 75 6e 73 69 67 6e 65 64  ds\n", (unsigned
28b30 20 6c 6f 6e 67 29 20 28 65 6e 64 5f 69 6e 74 20   long) (end_int 
28b40 2d 20 73 74 61 72 74 5f 69 6e 74 29 29 3b 0a 23  - start_int));.#
28b50 65 6e 64 69 66 0a 0a 09 6d 75 74 65 78 5f 72 65  endif...mutex_re
28b60 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
28b70 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
28b80 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
28b90 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
28ba0 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
28bb0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
28bc0 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66  or.  Unlocking f
28bd0 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
28be0 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
28bf0 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43  ERROR);..}...CAC
28c00 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
28c10 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
28c20 4f 4b 20 28 25 69 29 2c 20 6e 75 6d 20 6f 62 6a  OK (%i), num obj
28c30 65 63 74 73 20 3d 20 25 6c 75 22 2c 20 43 4b 52  ects = %lu", CKR
28c40 5f 4f 4b 2c 20 2a 70 75 6c 4f 62 6a 65 63 74 43  _OK, *pulObjectC
28c50 6f 75 6e 74 29 3b 0a 0a 09 72 65 74 75 72 6e 28  ount);...return(
28c60 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44  CKR_OK);.}..CK_D
28c70 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
28c80 4b 5f 52 56 2c 20 43 5f 46 69 6e 64 4f 62 6a 65  K_RV, C_FindObje
28c90 63 74 73 46 69 6e 61 6c 29 28 43 4b 5f 53 45 53  ctsFinal)(CK_SES
28ca0 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
28cb0 73 69 6f 6e 29 20 7b 0a 09 43 4b 5f 55 4c 4f 4e  sion) {..CK_ULON
28cc0 47 20 69 64 78 3b 0a 09 69 6e 74 20 6d 75 74 65  G idx;..int mute
28cd0 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b  x_retval;...CACK
28ce0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
28cf0 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
28d00 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
28d10 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
28d20 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
28d30 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
28d40 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
28d50 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
28d60 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
28d70 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53  ED);..}...if (hS
28d80 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68  ession == 0 || h
28d90 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65  Session >= (size
28da0 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
28db0 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63  ns) / sizeof(cac
28dc0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29  key_sessions[0])
28dd0 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  )) {...CACKEY_DE
28de0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
28df0 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20  r.  Session out 
28e00 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a  of range.");....
28e10 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53  ..return(CKR_SES
28e20 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41  SION_HANDLE_INVA
28e30 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78  LID);..}...mutex
28e40 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
28e50 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b  _mutex_lock(cack
28e60 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
28e70 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
28e80 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
28e90 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
28ea0 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61  ror.  Locking fa
28eb0 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
28ec0 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
28ed0 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  RROR);..}...if (
28ee0 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  !cackey_sessions
28ef0 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76  [hSession].activ
28f00 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75  e) {...cackey_mu
28f10 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
28f20 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43  y_biglock);....C
28f30 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
28f40 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73  TF("Error.  Sess
28f50 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22  ion not active."
28f60 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
28f70 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  KR_SESSION_HANDL
28f80 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
28f90 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73  .if (!cackey_ses
28fa0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
28fb0 73 65 61 72 63 68 5f 61 63 74 69 76 65 29 20 7b  search_active) {
28fc0 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
28fd0 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
28fe0 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45  glock);....CACKE
28ff0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
29000 45 72 72 6f 72 2e 20 20 53 65 61 72 63 68 20 6e  Error.  Search n
29010 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09  ot active.");...
29020 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50  ...return(CKR_OP
29030 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54  ERATION_NOT_INIT
29040 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 63  IALIZED);..}...c
29050 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
29060 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f  Session].search_
29070 61 63 74 69 76 65 20 3d 20 30 3b 0a 0a 09 66 6f  active = 0;...fo
29080 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20  r (idx = 0; idx 
29090 3c 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  < cackey_session
290a0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72  s[hSession].sear
290b0 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74 3b 20  ch_query_count; 
290c0 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28 63  idx++) {...if (c
290d0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
290e0 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f  Session].search_
290f0 71 75 65 72 79 5b 69 64 78 5d 2e 70 56 61 6c 75  query[idx].pValu
29100 65 29 20 7b 0a 09 09 09 66 72 65 65 28 63 61 63  e) {....free(cac
29110 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
29120 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75  ssion].search_qu
29130 65 72 79 5b 69 64 78 5d 2e 70 56 61 6c 75 65 29  ery[idx].pValue)
29140 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28 63  ;...}..}...if (c
29150 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
29160 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f  Session].search_
29170 71 75 65 72 79 29 20 7b 0a 09 09 66 72 65 65 28  query) {...free(
29180 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
29190 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68  hSession].search
291a0 5f 71 75 65 72 79 29 3b 0a 09 7d 0a 0a 09 6d 75  _query);..}...mu
291b0 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
291c0 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
291d0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
291e0 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
291f0 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
29200 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
29210 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63  F("Error.  Unloc
29220 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
29230 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
29240 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
29250 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
29260 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
29270 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20  g CKR_OK (%i)", 
29280 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72  CKR_OK);...retur
29290 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b  n(CKR_OK);.}..CK
292a0 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
292b0 28 43 4b 5f 52 56 2c 20 43 5f 45 6e 63 72 79 70  (CK_RV, C_Encryp
292c0 74 49 6e 69 74 29 28 43 4b 5f 53 45 53 53 49 4f  tInit)(CK_SESSIO
292d0 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
292e0 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f  n, CK_MECHANISM_
292f0 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20  PTR pMechanism, 
29300 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45  CK_OBJECT_HANDLE
29310 20 68 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59   hKey) {..CACKEY
29320 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
29330 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
29340 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
29350 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
29360 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
29370 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
29380 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
29390 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
293a0 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
293b0 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
293c0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
293d0 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
293e0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
293f0 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
29400 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
29410 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
29420 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
29430 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
29440 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
29450 4e 28 43 4b 5f 52 56 2c 20 43 5f 45 6e 63 72 79  N(CK_RV, C_Encry
29460 70 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  pt)(CK_SESSION_H
29470 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
29480 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 44 61 74  CK_BYTE_PTR pDat
29490 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 44 61  a, CK_ULONG ulDa
294a0 74 61 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  taLen, CK_BYTE_P
294b0 54 52 20 70 45 6e 63 72 79 70 74 65 64 44 61 74  TR pEncryptedDat
294c0 61 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20  a, CK_ULONG_PTR 
294d0 70 75 6c 45 6e 63 72 79 70 74 65 64 44 61 74 61  pulEncryptedData
294e0 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  Len) {..CACKEY_D
294f0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
29500 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
29510 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
29520 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
29530 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
29540 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
29550 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
29560 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
29570 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
29580 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
29590 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
295a0 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
295b0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
295c0 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
295d0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
295e0 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
295f0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
29600 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
29610 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
29620 43 4b 5f 52 56 2c 20 43 5f 45 6e 63 72 79 70 74  CK_RV, C_Encrypt
29630 55 70 64 61 74 65 29 28 43 4b 5f 53 45 53 53 49  Update)(CK_SESSI
29640 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
29650 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  on, CK_BYTE_PTR 
29660 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20  pPart, CK_ULONG 
29670 75 6c 50 61 72 74 4c 65 6e 2c 20 43 4b 5f 42 59  ulPartLen, CK_BY
29680 54 45 5f 50 54 52 20 70 45 6e 63 72 79 70 74 65  TE_PTR pEncrypte
29690 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f  dPart, CK_ULONG_
296a0 50 54 52 20 70 75 6c 45 6e 63 72 79 70 74 65 64  PTR pulEncrypted
296b0 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b  PartLen) {..CACK
296c0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
296d0 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
296e0 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
296f0 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
29700 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
29710 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
29720 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
29730 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
29740 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
29750 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
29760 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
29770 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
29780 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
29790 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
297a0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
297b0 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
297c0 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
297d0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
297e0 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
297f0 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 45 6e 63  ION(CK_RV, C_Enc
29800 72 79 70 74 46 69 6e 61 6c 29 28 43 4b 5f 53 45  ryptFinal)(CK_SE
29810 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
29820 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  ssion, CK_BYTE_P
29830 54 52 20 70 4c 61 73 74 45 6e 63 72 79 70 74 65  TR pLastEncrypte
29840 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f  dPart, CK_ULONG_
29850 50 54 52 20 70 75 6c 4c 61 73 74 45 6e 63 72 79  PTR pulLastEncry
29860 70 74 65 64 50 61 72 74 4c 65 6e 29 20 7b 0a 09  ptedPartLen) {..
29870 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
29880 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
29890 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
298a0 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
298b0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
298c0 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
298d0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
298e0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
298f0 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
29900 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
29910 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
29920 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
29930 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
29940 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
29950 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
29960 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
29970 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
29980 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
29990 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
299a0 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
299b0 5f 44 65 63 72 79 70 74 49 6e 69 74 29 28 43 4b  _DecryptInit)(CK
299c0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
299d0 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43  hSession, CK_MEC
299e0 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68  HANISM_PTR pMech
299f0 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54  anism, CK_OBJECT
29a00 5f 48 41 4e 44 4c 45 20 68 4b 65 79 29 20 7b 0a  _HANDLE hKey) {.
29a10 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61  .int mutex_retva
29a20 6c 3b 0a 0a 09 68 4b 65 79 2d 2d 3b 0a 0a 09 43  l;...hKey--;...C
29a30 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
29a40 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
29a50 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
29a60 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
29a70 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
29a80 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
29a90 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
29aa0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
29ab0 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
29ac0 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  LIZED);..}...if 
29ad0 28 70 4d 65 63 68 61 6e 69 73 6d 20 3d 3d 20 4e  (pMechanism == N
29ae0 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
29af0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
29b00 72 6f 72 2e 20 70 4d 65 63 68 61 6e 69 73 6d 20  ror. pMechanism 
29b10 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72  is NULL.");....r
29b20 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45  eturn(CKR_ARGUME
29b30 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69  NTS_BAD);..}...i
29b40 66 20 28 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d  f (pMechanism->m
29b50 65 63 68 61 6e 69 73 6d 20 21 3d 20 43 4b 4d 5f  echanism != CKM_
29b60 52 53 41 5f 50 4b 43 53 29 20 7b 0a 09 09 43 41  RSA_PKCS) {...CA
29b70 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
29b80 46 28 22 45 72 72 6f 72 2e 20 70 4d 65 63 68 61  F("Error. pMecha
29b90 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d 20  nism->mechanism 
29ba0 6e 6f 74 20 73 70 65 63 69 66 69 65 64 20 61 73  not specified as
29bb0 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 22 29 3b   CKM_RSA_PKCS");
29bc0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4d  ....return(CKR_M
29bd0 45 43 48 41 4e 49 53 4d 5f 50 41 52 41 4d 5f 49  ECHANISM_PARAM_I
29be0 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66  NVALID);..}...if
29bf0 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20   (hSession == 0 
29c00 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28  || hSession >= (
29c10 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
29c20 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66  ssions) / sizeof
29c30 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
29c40 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45  [0]))) {...CACKE
29c50 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
29c60 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20  Error.  Session 
29c70 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b  out of range.");
29c80 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
29c90 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
29ca0 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d  INVALID);..}...m
29cb0 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
29cc0 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28  ckey_mutex_lock(
29cd0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
29ce0 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
29cf0 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
29d00 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
29d10 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e  ("Error.  Lockin
29d20 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
29d30 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
29d40 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
29d50 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73  if (!cackey_sess
29d60 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61  ions[hSession].a
29d70 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65  ctive) {...cacke
29d80 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
29d90 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
29da0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
29db0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
29dc0 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69  Session not acti
29dd0 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ve.");......retu
29de0 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48  rn(CKR_SESSION_H
29df0 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a  ANDLE_INVALID);.
29e00 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f  .}...if (cackey_
29e10 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
29e20 6e 5d 2e 64 65 63 72 79 70 74 5f 61 63 74 69 76  n].decrypt_activ
29e30 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75  e) {...cackey_mu
29e40 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
29e50 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43  y_biglock);....C
29e60 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
29e70 54 46 28 22 45 72 72 6f 72 2e 20 20 44 65 63 72  TF("Error.  Decr
29e80 79 70 74 20 61 6c 72 65 61 64 79 20 69 6e 20 70  ypt already in p
29e90 72 6f 67 72 65 73 73 2e 22 29 3b 0a 09 09 0a 09  rogress.");.....
29ea0 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52  .return(CKR_OPER
29eb0 41 54 49 4f 4e 5f 41 43 54 49 56 45 29 3b 0a 09  ATION_ACTIVE);..
29ec0 7d 0a 0a 09 69 66 20 28 68 4b 65 79 20 3e 3d 20  }...if (hKey >= 
29ed0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
29ee0 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69  hSession].identi
29ef0 74 69 65 73 5f 63 6f 75 6e 74 29 20 7b 0a 09 09  ties_count) {...
29f00 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
29f10 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
29f20 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ck);....CACKEY_D
29f30 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
29f40 6f 72 2e 20 20 4b 65 79 20 68 61 6e 64 6c 65 20  or.  Key handle 
29f50 6f 75 74 20 6f 66 20 72 61 6e 67 65 20 28 72 65  out of range (re
29f60 71 75 65 73 74 65 64 20 6b 65 79 20 25 6c 75 2c  quested key %lu,
29f70 20 6f 6e 6c 79 20 25 6c 75 20 69 64 65 6e 74 69   only %lu identi
29f80 74 69 65 73 20 61 76 61 69 6c 61 62 6c 65 29 2e  ties available).
29f90 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
29fa0 67 29 20 68 4b 65 79 2c 20 28 75 6e 73 69 67 6e  g) hKey, (unsign
29fb0 65 64 20 6c 6f 6e 67 29 20 63 61 63 6b 65 79 5f  ed long) cackey_
29fc0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
29fd0 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 6f  n].identities_co
29fe0 75 6e 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  unt);....return(
29ff0 43 4b 52 5f 4b 45 59 5f 48 41 4e 44 4c 45 5f 49  CKR_KEY_HANDLE_I
2a000 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 63 61  NVALID);..}...ca
2a010 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
2a020 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f  ession].decrypt_
2a030 61 63 74 69 76 65 20 3d 20 31 3b 0a 0a 09 63 61  active = 1;...ca
2a040 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
2a050 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f  ession].decrypt_
2a060 6d 65 63 68 61 6e 69 73 6d 20 3d 20 70 4d 65 63  mechanism = pMec
2a070 68 61 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e 69 73  hanism->mechanis
2a080 6d 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69  m;..cackey_sessi
2a090 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65  ons[hSession].de
2a0a0 63 72 79 70 74 5f 6d 65 63 68 5f 70 61 72 6d 20  crypt_mech_parm 
2a0b0 3d 20 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 70 50  = pMechanism->pP
2a0c0 61 72 61 6d 65 74 65 72 3b 0a 09 63 61 63 6b 65  arameter;..cacke
2a0d0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
2a0e0 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 6d 65 63  ion].decrypt_mec
2a0f0 68 5f 70 61 72 6d 6c 65 6e 20 3d 20 70 4d 65 63  h_parmlen = pMec
2a100 68 61 6e 69 73 6d 2d 3e 75 6c 50 61 72 61 6d 65  hanism->ulParame
2a110 74 65 72 4c 65 6e 3b 0a 09 63 61 63 6b 65 79 5f  terLen;..cackey_
2a120 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
2a130 6e 5d 2e 64 65 63 72 79 70 74 5f 69 64 65 6e 74  n].decrypt_ident
2a140 69 74 79 20 3d 20 26 63 61 63 6b 65 79 5f 73 65  ity = &cackey_se
2a150 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
2a160 2e 69 64 65 6e 74 69 74 69 65 73 5b 68 4b 65 79  .identities[hKey
2a170 5d 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  ];...mutex_retva
2a180 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
2a190 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
2a1a0 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
2a1b0 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
2a1c0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
2a1d0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2a1e0 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c    Unlocking fail
2a1f0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
2a200 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
2a210 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  OR);..}...CACKEY
2a220 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
2a230 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20  eturning CKR_OK 
2a240 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a  (%i)", CKR_OK);.
2a250 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29  ..return(CKR_OK)
2a260 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
2a270 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
2a280 5f 44 65 63 72 79 70 74 29 28 43 4b 5f 53 45 53  _Decrypt)(CK_SES
2a290 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
2a2a0 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  sion, CK_BYTE_PT
2a2b0 52 20 70 45 6e 63 72 79 70 74 65 64 44 61 74 61  R pEncryptedData
2a2c0 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 45 6e 63  , CK_ULONG ulEnc
2a2d0 72 79 70 74 65 64 44 61 74 61 4c 65 6e 2c 20 43  ryptedDataLen, C
2a2e0 4b 5f 42 59 54 45 5f 50 54 52 20 70 44 61 74 61  K_BYTE_PTR pData
2a2f0 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70  , CK_ULONG_PTR p
2a300 75 6c 44 61 74 61 4c 65 6e 29 20 7b 0a 09 43 4b  ulDataLen) {..CK
2a310 5f 55 4c 4f 4e 47 20 64 61 74 61 6c 65 6e 5f 75  _ULONG datalen_u
2a320 70 64 61 74 65 2c 20 64 61 74 61 6c 65 6e 5f 66  pdate, datalen_f
2a330 69 6e 61 6c 3b 0a 09 43 4b 5f 52 56 20 64 65 63  inal;..CK_RV dec
2a340 72 79 70 74 5f 72 65 74 3b 0a 09 69 6e 74 20 6d  rypt_ret;..int m
2a350 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43  utex_retval;...C
2a360 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2a370 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
2a380 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
2a390 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
2a3a0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2a3b0 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
2a3c0 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
2a3d0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
2a3e0 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
2a3f0 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  LIZED);..}...if 
2a400 28 70 75 6c 44 61 74 61 4c 65 6e 20 3d 3d 20 4e  (pulDataLen == N
2a410 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
2a420 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2a430 72 6f 72 2e 20 70 75 6c 44 61 74 61 4c 65 6e 20  ror. pulDataLen 
2a440 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72  is NULL.");....r
2a450 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45  eturn(CKR_ARGUME
2a460 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 64  NTS_BAD);..}...d
2a470 61 74 61 6c 65 6e 5f 75 70 64 61 74 65 20 3d 20  atalen_update = 
2a480 2a 70 75 6c 44 61 74 61 4c 65 6e 3b 0a 0a 09 64  *pulDataLen;...d
2a490 65 63 72 79 70 74 5f 72 65 74 20 3d 20 43 5f 44  ecrypt_ret = C_D
2a4a0 65 63 72 79 70 74 55 70 64 61 74 65 28 68 53 65  ecryptUpdate(hSe
2a4b0 73 73 69 6f 6e 2c 20 70 45 6e 63 72 79 70 74 65  ssion, pEncrypte
2a4c0 64 44 61 74 61 2c 20 75 6c 45 6e 63 72 79 70 74  dData, ulEncrypt
2a4d0 65 64 44 61 74 61 4c 65 6e 2c 20 70 44 61 74 61  edDataLen, pData
2a4e0 2c 20 26 64 61 74 61 6c 65 6e 5f 75 70 64 61 74  , &datalen_updat
2a4f0 65 29 3b 0a 09 69 66 20 28 64 65 63 72 79 70 74  e);..if (decrypt
2a500 5f 72 65 74 20 21 3d 20 43 4b 52 5f 4f 4b 29 20  _ret != CKR_OK) 
2a510 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
2a520 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2a530 20 44 65 63 72 79 70 74 55 70 64 61 74 65 28 29   DecryptUpdate()
2a540 20 72 65 74 75 72 6e 65 64 20 66 61 69 6c 75 72   returned failur
2a550 65 20 28 72 76 20 3d 20 25 6c 75 29 2e 22 2c 20  e (rv = %lu).", 
2a560 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
2a570 64 65 63 72 79 70 74 5f 72 65 74 29 3b 0a 0a 09  decrypt_ret);...
2a580 09 69 66 20 28 64 65 63 72 79 70 74 5f 72 65 74  .if (decrypt_ret
2a590 20 21 3d 20 43 4b 52 5f 42 55 46 46 45 52 5f 54   != CKR_BUFFER_T
2a5a0 4f 4f 5f 53 4d 41 4c 4c 29 20 7b 0a 09 09 09 2f  OO_SMALL) {..../
2a5b0 2a 20 54 65 72 6d 69 6e 61 74 65 20 64 65 63 72  * Terminate decr
2a5c0 79 70 74 69 6f 6e 20 6f 70 65 72 61 74 69 6f 6e  yption operation
2a5d0 20 2a 2f 0a 0a 09 09 09 6d 75 74 65 78 5f 72 65   */.....mutex_re
2a5e0 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
2a5f0 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  tex_lock(cackey_
2a600 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 09 69 66 20  biglock);....if 
2a610 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
2a620 20 30 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59   0) {.....CACKEY
2a630 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2a640 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66  rror.  Locking f
2a650 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 09 09 72  ailed.");......r
2a660 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
2a670 4c 5f 45 52 52 4f 52 29 3b 0a 09 09 09 7d 0a 0a  L_ERROR);....}..
2a680 09 09 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73  ...if (!cackey_s
2a690 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
2a6a0 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 09 09  ].active) {.....
2a6b0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
2a6c0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
2a6d0 63 6b 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59  ck);......CACKEY
2a6e0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2a6f0 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e  rror.  Session n
2a700 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09  ot active.");...
2a710 0a 09 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
2a720 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49  SESSION_HANDLE_I
2a730 4e 56 41 4c 49 44 29 3b 0a 09 09 09 7d 0a 0a 09  NVALID);....}...
2a740 09 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65  ..if (!cackey_se
2a750 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
2a760 2e 64 65 63 72 79 70 74 5f 61 63 74 69 76 65 29  .decrypt_active)
2a770 20 7b 0a 09 09 09 09 63 61 63 6b 65 79 5f 6d 75   {.....cackey_mu
2a780 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
2a790 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 09  y_biglock);.....
2a7a0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2a7b0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 44 65  INTF("Error.  De
2a7c0 63 72 79 70 74 20 6e 6f 74 20 61 63 74 69 76 65  crypt not active
2a7d0 2e 22 29 3b 0a 09 09 0a 09 09 09 09 72 65 74 75  .");........retu
2a7e0 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e  rn(CKR_OPERATION
2a7f0 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
2a800 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 63 61 63 6b  );....}.....cack
2a810 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
2a820 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 61 63  sion].decrypt_ac
2a830 74 69 76 65 20 3d 20 30 3b 0a 0a 09 09 09 6d 75  tive = 0;.....mu
2a840 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
2a850 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
2a860 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
2a870 3b 0a 09 09 09 69 66 20 28 6d 75 74 65 78 5f 72  ;....if (mutex_r
2a880 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
2a890 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2a8a0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55  RINTF("Error.  U
2a8b0 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e  nlocking failed.
2a8c0 22 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28  ");......return(
2a8d0 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
2a8e0 52 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09  R);....}...}....
2a8f0 72 65 74 75 72 6e 28 64 65 63 72 79 70 74 5f 72  return(decrypt_r
2a900 65 74 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 44  et);..}...if (pD
2a910 61 74 61 29 20 7b 0a 09 09 70 44 61 74 61 20 2b  ata) {...pData +
2a920 3d 20 64 61 74 61 6c 65 6e 5f 75 70 64 61 74 65  = datalen_update
2a930 3b 0a 09 7d 0a 09 64 61 74 61 6c 65 6e 5f 66 69  ;..}..datalen_fi
2a940 6e 61 6c 20 3d 20 2a 70 75 6c 44 61 74 61 4c 65  nal = *pulDataLe
2a950 6e 20 2d 20 64 61 74 61 6c 65 6e 5f 75 70 64 61  n - datalen_upda
2a960 74 65 3b 0a 0a 09 64 65 63 72 79 70 74 5f 72 65  te;...decrypt_re
2a970 74 20 3d 20 43 5f 44 65 63 72 79 70 74 46 69 6e  t = C_DecryptFin
2a980 61 6c 28 68 53 65 73 73 69 6f 6e 2c 20 70 44 61  al(hSession, pDa
2a990 74 61 2c 20 26 64 61 74 61 6c 65 6e 5f 66 69 6e  ta, &datalen_fin
2a9a0 61 6c 29 3b 0a 09 69 66 20 28 64 65 63 72 79 70  al);..if (decryp
2a9b0 74 5f 72 65 74 20 21 3d 20 43 4b 52 5f 4f 4b 29  t_ret != CKR_OK)
2a9c0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
2a9d0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2a9e0 20 20 44 65 63 72 79 70 74 46 69 6e 61 6c 28 29    DecryptFinal()
2a9f0 20 72 65 74 75 72 6e 65 64 20 66 61 69 6c 75 72   returned failur
2aa00 65 20 28 72 76 20 3d 20 25 6c 75 29 2e 22 2c 20  e (rv = %lu).", 
2aa10 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
2aa20 64 65 63 72 79 70 74 5f 72 65 74 29 3b 0a 0a 09  decrypt_ret);...
2aa30 09 72 65 74 75 72 6e 28 64 65 63 72 79 70 74 5f  .return(decrypt_
2aa40 72 65 74 29 3b 0a 09 7d 0a 0a 09 2a 70 75 6c 44  ret);..}...*pulD
2aa50 61 74 61 4c 65 6e 20 3d 20 64 61 74 61 6c 65 6e  ataLen = datalen
2aa60 5f 75 70 64 61 74 65 20 2b 20 64 61 74 61 6c 65  _update + datale
2aa70 6e 5f 66 69 6e 61 6c 3b 0a 0a 09 43 41 43 4b 45  n_final;...CACKE
2aa80 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2aa90 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b  Returning CKR_OK
2aaa0 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b   (%i)", CKR_OK);
2aab0 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b  ...return(CKR_OK
2aac0 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
2aad0 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
2aae0 43 5f 44 65 63 72 79 70 74 55 70 64 61 74 65 29  C_DecryptUpdate)
2aaf0 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
2ab00 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
2ab10 42 59 54 45 5f 50 54 52 20 70 45 6e 63 72 79 70  BYTE_PTR pEncryp
2ab20 74 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e  tedPart, CK_ULON
2ab30 47 20 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72  G ulEncryptedPar
2ab40 74 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  tLen, CK_BYTE_PT
2ab50 52 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e  R pPart, CK_ULON
2ab60 47 5f 50 54 52 20 70 75 6c 50 61 72 74 4c 65 6e  G_PTR pulPartLen
2ab70 29 20 7b 0a 09 73 74 61 74 69 63 20 43 4b 5f 42  ) {..static CK_B
2ab80 59 54 45 20 62 75 66 5b 31 36 33 38 34 5d 3b 0a  YTE buf[16384];.
2ab90 09 73 73 69 7a 65 5f 74 20 62 75 66 6c 65 6e 3b  .ssize_t buflen;
2aba0 0a 09 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f  ..CK_SLOT_ID slo
2abb0 74 49 44 3b 0a 09 43 4b 5f 52 56 20 72 65 74 76  tID;..CK_RV retv
2abc0 61 6c 20 3d 20 43 4b 52 5f 47 45 4e 45 52 41 4c  al = CKR_GENERAL
2abd0 5f 45 52 52 4f 52 3b 0a 09 69 6e 74 20 6d 75 74  _ERROR;..int mut
2abe0 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43  ex_retval;...CAC
2abf0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2ac00 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
2ac10 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
2ac20 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
2ac30 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2ac40 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
2ac50 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
2ac60 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
2ac70 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
2ac80 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68  ZED);..}...if (h
2ac90 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20  Session == 0 || 
2aca0 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a  hSession >= (siz
2acb0 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
2acc0 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ons) / sizeof(ca
2acd0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d  ckey_sessions[0]
2ace0 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ))) {...CACKEY_D
2acf0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2ad00 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74  or.  Session out
2ad10 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09   of range.");...
2ad20 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
2ad30 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56  SSION_HANDLE_INV
2ad40 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  ALID);..}...if (
2ad50 70 45 6e 63 72 79 70 74 65 64 50 61 72 74 20 3d  pEncryptedPart =
2ad60 3d 20 4e 55 4c 4c 20 26 26 20 75 6c 45 6e 63 72  = NULL && ulEncr
2ad70 79 70 74 65 64 50 61 72 74 4c 65 6e 20 3d 3d 20  yptedPartLen == 
2ad80 30 29 20 7b 0a 09 09 2f 2a 20 53 68 6f 72 74 20  0) {.../* Short 
2ad90 63 69 72 63 75 69 74 20 69 66 20 77 65 20 61 72  circuit if we ar
2ada0 65 20 61 73 6b 65 64 20 74 6f 20 64 65 63 72 79  e asked to decry
2adb0 70 74 20 6e 6f 74 68 69 6e 67 2e 2e 2e 20 2a 2f  pt nothing... */
2adc0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2add0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
2ade0 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 20 28 73  g CKR_OK (%i) (s
2adf0 68 6f 72 74 20 63 69 72 63 75 69 74 29 22 2c 20  hort circuit)", 
2ae00 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74 75  CKR_OK);....retu
2ae10 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a  rn(CKR_OK);..}..
2ae20 09 69 66 20 28 70 45 6e 63 72 79 70 74 65 64 50  .if (pEncryptedP
2ae30 61 72 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  art == NULL) {..
2ae40 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2ae50 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 45 6e  INTF("Error. pEn
2ae60 63 72 79 70 74 65 64 50 61 72 74 20 69 73 20 4e  cryptedPart is N
2ae70 55 4c 4c 2c 20 62 75 74 20 75 6c 45 6e 63 72 79  ULL, but ulEncry
2ae80 70 74 65 64 50 61 72 74 4c 65 6e 20 69 73 20 6e  ptedPartLen is n
2ae90 6f 74 20 30 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ot 0.");....retu
2aea0 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53  rn(CKR_ARGUMENTS
2aeb0 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  _BAD);..}...if (
2aec0 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c  ulEncryptedPartL
2aed0 65 6e 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43  en == 0) {...CAC
2aee0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2aef0 28 22 45 72 72 6f 72 2e 20 75 6c 45 6e 63 72 79  ("Error. ulEncry
2af00 70 74 65 64 50 61 72 74 4c 65 6e 20 69 73 20 30  ptedPartLen is 0
2af10 2c 20 62 75 74 20 70 50 61 72 74 20 69 73 20 6e  , but pPart is n
2af20 6f 74 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72  ot NULL.");....r
2af30 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45  eturn(CKR_ARGUME
2af40 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69  NTS_BAD);..}...i
2af50 66 20 28 70 75 6c 50 61 72 74 4c 65 6e 20 3d 3d  f (pulPartLen ==
2af60 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
2af70 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2af80 45 72 72 6f 72 2e 20 70 75 6c 50 61 72 74 4c 65  Error. pulPartLe
2af90 6e 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09  n is NULL.");...
2afa0 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55  .return(CKR_ARGU
2afb0 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a  MENTS_BAD);..}..
2afc0 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
2afd0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63  cackey_mutex_loc
2afe0 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
2aff0 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
2b000 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
2b010 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2b020 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b  TF("Error.  Lock
2b030 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
2b040 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
2b050 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
2b060 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65  ..if (!cackey_se
2b070 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
2b080 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63  .active) {...cac
2b090 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
2b0a0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
2b0b0 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  ;....CACKEY_DEBU
2b0c0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2b0d0 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63    Session not ac
2b0e0 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  tive.");......re
2b0f0 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e  turn(CKR_SESSION
2b100 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29  _HANDLE_INVALID)
2b110 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b  ;..}...if (!cack
2b120 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
2b130 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 61 63  sion].decrypt_ac
2b140 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79  tive) {...cackey
2b150 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
2b160 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
2b170 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2b180 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 44  RINTF("Error.  D
2b190 65 63 72 79 70 74 20 6e 6f 74 20 61 63 74 69 76  ecrypt not activ
2b1a0 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
2b1b0 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f  n(CKR_OPERATION_
2b1c0 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
2b1d0 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 49 44 20 3d 20  ;..}...slotID = 
2b1e0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2b1f0 68 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44  hSession].slotID
2b200 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44 20 3c  ;...if (slotID <
2b210 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20   0 || slotID >= 
2b220 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
2b230 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  lots) / sizeof(c
2b240 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29  ackey_slots[0]))
2b250 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
2b260 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2b270 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72  . Invalid slot r
2b280 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20  equested (%lu), 
2b290 6f 75 74 73 69 64 65 20 6f 66 20 76 61 6c 69 64  outside of valid
2b2a0 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29   range", slotID)
2b2b0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
2b2c0 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
2b2d0 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f  .}...if (cackey_
2b2e0 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63  slots[slotID].ac
2b2f0 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43  tive == 0) {...C
2b300 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2b310 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c  TF("Error. Inval
2b320 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65  id slot requeste
2b330 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f  d (%lu), slot no
2b340 74 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69  t currently acti
2b350 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09  ve", slotID);...
2b360 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
2b370 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
2b380 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  ock);....return(
2b390 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
2b3a0 52 29 3b 0a 09 7d 0a 0a 09 73 77 69 74 63 68 20  R);..}...switch 
2b3b0 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
2b3c0 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79  [hSession].decry
2b3d0 70 74 5f 6d 65 63 68 61 6e 69 73 6d 29 20 7b 0a  pt_mechanism) {.
2b3e0 09 09 63 61 73 65 20 43 4b 4d 5f 52 53 41 5f 50  ..case CKM_RSA_P
2b3f0 4b 43 53 3a 0a 09 09 09 2f 2a 20 41 73 6b 20 63  KCS:..../* Ask c
2b400 61 72 64 20 74 6f 20 64 65 63 72 79 70 74 20 2a  ard to decrypt *
2b410 2f 0a 09 09 09 62 75 66 6c 65 6e 20 3d 20 63 61  /....buflen = ca
2b420 63 6b 65 79 5f 73 69 67 6e 64 65 63 72 79 70 74  ckey_signdecrypt
2b430 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73  (&cackey_slots[s
2b440 6c 6f 74 49 44 5d 2c 20 63 61 63 6b 65 79 5f 73  lotID], cackey_s
2b450 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
2b460 5d 2e 64 65 63 72 79 70 74 5f 69 64 65 6e 74 69  ].decrypt_identi
2b470 74 79 2c 20 70 45 6e 63 72 79 70 74 65 64 50 61  ty, pEncryptedPa
2b480 72 74 2c 20 75 6c 45 6e 63 72 79 70 74 65 64 50  rt, ulEncryptedP
2b490 61 72 74 4c 65 6e 2c 20 62 75 66 2c 20 73 69 7a  artLen, buf, siz
2b4a0 65 6f 66 28 62 75 66 29 2c 20 30 2c 20 31 29 3b  eof(buf), 0, 1);
2b4b0 0a 0a 09 09 09 69 66 20 28 62 75 66 6c 65 6e 20  .....if (buflen 
2b4c0 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  == CACKEY_PCSC_E
2b4d0 5f 4e 45 45 44 4c 4f 47 49 4e 20 26 26 20 63 61  _NEEDLOGIN && ca
2b4e0 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64  ckey_pin_command
2b4f0 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09   != NULL) {.....
2b500 69 66 20 28 5f 43 5f 4c 6f 67 69 6e 4d 75 74 65  if (_C_LoginMute
2b510 78 41 72 67 28 68 53 65 73 73 69 6f 6e 2c 20 43  xArg(hSession, C
2b520 4b 55 5f 55 53 45 52 2c 20 4e 55 4c 4c 2c 20 30  KU_USER, NULL, 0
2b530 2c 20 30 29 20 3d 3d 20 43 4b 52 5f 4f 4b 29 20  , 0) == CKR_OK) 
2b540 7b 0a 09 09 09 09 09 62 75 66 6c 65 6e 20 3d 20  {......buflen = 
2b550 63 61 63 6b 65 79 5f 73 69 67 6e 64 65 63 72 79  cackey_signdecry
2b560 70 74 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73  pt(&cackey_slots
2b570 5b 73 6c 6f 74 49 44 5d 2c 20 63 61 63 6b 65 79  [slotID], cackey
2b580 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
2b590 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 69 64 65 6e  on].decrypt_iden
2b5a0 74 69 74 79 2c 20 70 45 6e 63 72 79 70 74 65 64  tity, pEncrypted
2b5b0 50 61 72 74 2c 20 75 6c 45 6e 63 72 79 70 74 65  Part, ulEncrypte
2b5c0 64 50 61 72 74 4c 65 6e 2c 20 62 75 66 2c 20 73  dPartLen, buf, s
2b5d0 69 7a 65 6f 66 28 62 75 66 29 2c 20 30 2c 20 31  izeof(buf), 0, 1
2b5e0 29 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09  );.....}....}...
2b5f0 09 09 69 66 20 28 62 75 66 6c 65 6e 20 3c 20 30  ..if (buflen < 0
2b600 29 20 7b 0a 09 09 09 09 2f 2a 20 44 65 63 72 79  ) {...../* Decry
2b610 70 74 69 6f 6e 20 66 61 69 6c 65 64 2e 20 2a 2f  ption failed. */
2b620 0a 09 09 09 09 69 66 20 28 62 75 66 6c 65 6e 20  .....if (buflen 
2b630 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  == CACKEY_PCSC_E
2b640 5f 4e 45 45 44 4c 4f 47 49 4e 29 20 7b 0a 09 09  _NEEDLOGIN) {...
2b650 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f  ...retval = CKR_
2b660 55 53 45 52 5f 4e 4f 54 5f 4c 4f 47 47 45 44 5f  USER_NOT_LOGGED_
2b670 49 4e 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 69  IN;.....} else i
2b680 66 20 28 62 75 66 6c 65 6e 20 3d 3d 20 43 41 43  f (buflen == CAC
2b690 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e  KEY_PCSC_E_TOKEN
2b6a0 41 42 53 45 4e 54 29 20 7b 0a 09 09 09 09 09 72  ABSENT) {......r
2b6b0 65 74 76 61 6c 20 3d 20 43 4b 52 5f 44 45 56 49  etval = CKR_DEVI
2b6c0 43 45 5f 52 45 4d 4f 56 45 44 3b 0a 09 09 09 09  CE_REMOVED;.....
2b6d0 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 43 41  } else {......CA
2b6e0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2b6f0 46 28 22 46 61 69 6c 65 64 20 74 6f 20 73 65 6e  F("Failed to sen
2b700 64 20 41 50 44 55 2c 20 65 72 72 6f 72 20 3d 20  d APDU, error = 
2b710 25 6c 69 22 2c 20 28 6c 6f 6e 67 20 69 6e 74 29  %li", (long int)
2b720 20 62 75 66 6c 65 6e 29 3b 0a 0a 09 09 09 09 09   buflen);.......
2b730 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 47 45 4e  retval = CKR_GEN
2b740 45 52 41 4c 5f 45 52 52 4f 52 3b 0a 09 09 09 09  ERAL_ERROR;.....
2b750 7d 0a 09 09 09 7d 20 65 6c 73 65 20 69 66 20 28  }....} else if (
2b760 28 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29  ((unsigned long)
2b770 20 62 75 66 6c 65 6e 29 20 3e 20 2a 70 75 6c 50   buflen) > *pulP
2b780 61 72 74 4c 65 6e 20 26 26 20 70 50 61 72 74 29  artLen && pPart)
2b790 20 7b 0a 09 09 09 09 2f 2a 20 44 65 63 72 79 70   {...../* Decryp
2b7a0 74 65 64 20 64 61 74 61 20 74 6f 6f 20 6c 61 72  ted data too lar
2b7b0 67 65 20 2a 2f 0a 09 09 09 09 72 65 74 76 61 6c  ge */.....retval
2b7c0 20 3d 20 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f   = CKR_BUFFER_TO
2b7d0 4f 5f 53 4d 41 4c 4c 3b 0a 09 09 09 7d 20 65 6c  O_SMALL;....} el
2b7e0 73 65 20 7b 0a 09 09 09 09 69 66 20 28 70 50 61  se {.....if (pPa
2b7f0 72 74 29 20 7b 0a 09 09 09 09 09 6d 65 6d 63 70  rt) {......memcp
2b800 79 28 70 50 61 72 74 2c 20 62 75 66 2c 20 62 75  y(pPart, buf, bu
2b810 66 6c 65 6e 29 3b 0a 09 09 09 09 7d 0a 0a 09 09  flen);.....}....
2b820 09 09 2a 70 75 6c 50 61 72 74 4c 65 6e 20 3d 20  ..*pulPartLen = 
2b830 62 75 66 6c 65 6e 3b 0a 0a 09 09 09 09 72 65 74  buflen;......ret
2b840 76 61 6c 20 3d 20 43 4b 52 5f 4f 4b 3b 0a 09 09  val = CKR_OK;...
2b850 09 7d 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 7d  .}.....break;..}
2b860 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
2b870 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  = cackey_mutex_u
2b880 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
2b890 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
2b8a0 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
2b8b0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2b8c0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
2b8d0 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64  Unlocking failed
2b8e0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
2b8f0 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
2b900 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
2b910 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
2b920 75 72 6e 69 6e 67 20 25 69 22 2c 20 28 69 6e 74  urning %i", (int
2b930 29 20 72 65 74 76 61 6c 29 3b 0a 0a 09 72 65 74  ) retval);...ret
2b940 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a  urn(retval);.}..
2b950 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
2b960 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65 63 72  ON(CK_RV, C_Decr
2b970 79 70 74 46 69 6e 61 6c 29 28 43 4b 5f 53 45 53  yptFinal)(CK_SES
2b980 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
2b990 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  sion, CK_BYTE_PT
2b9a0 52 20 70 4c 61 73 74 50 61 72 74 2c 20 43 4b 5f  R pLastPart, CK_
2b9b0 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 4c 61 73  ULONG_PTR pulLas
2b9c0 74 50 61 72 74 4c 65 6e 29 20 7b 0a 09 69 6e 74  tPartLen) {..int
2b9d0 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09   mutex_retval;..
2b9e0 69 6e 74 20 74 65 72 6d 69 6e 61 74 65 5f 64 65  int terminate_de
2b9f0 63 72 79 70 74 20 3d 20 31 3b 0a 0a 09 43 41 43  crypt = 1;...CAC
2ba00 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2ba10 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
2ba20 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
2ba30 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
2ba40 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2ba50 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
2ba60 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
2ba70 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
2ba80 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
2ba90 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68  ZED);..}...if (h
2baa0 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20  Session == 0 || 
2bab0 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a  hSession >= (siz
2bac0 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
2bad0 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ons) / sizeof(ca
2bae0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d  ckey_sessions[0]
2baf0 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ))) {...CACKEY_D
2bb00 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2bb10 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74  or.  Session out
2bb20 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09   of range.");...
2bb30 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
2bb40 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56  SSION_HANDLE_INV
2bb50 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  ALID);..}...if (
2bb60 70 75 6c 4c 61 73 74 50 61 72 74 4c 65 6e 20 3d  pulLastPartLen =
2bb70 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
2bb80 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2bb90 22 45 72 72 6f 72 2e 20 70 75 6c 4c 61 73 74 50  "Error. pulLastP
2bba0 61 72 74 4c 65 6e 20 69 73 20 4e 55 4c 4c 2e 22  artLen is NULL."
2bbb0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
2bbc0 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b  _ARGUMENTS_BAD);
2bbd0 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  ..}...mutex_retv
2bbe0 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
2bbf0 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  x_lock(cackey_bi
2bc00 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
2bc10 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
2bc20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
2bc30 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2bc40 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e   Locking failed.
2bc50 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
2bc60 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
2bc70 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b  ;..}...if (!cack
2bc80 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
2bc90 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a  sion].active) {.
2bca0 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
2bcb0 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
2bcc0 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59  lock);....CACKEY
2bcd0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2bce0 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e  rror.  Session n
2bcf0 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09  ot active.");...
2bd00 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
2bd10 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56  SSION_HANDLE_INV
2bd20 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  ALID);..}...if (
2bd30 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  !cackey_sessions
2bd40 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79  [hSession].decry
2bd50 70 74 5f 61 63 74 69 76 65 29 20 7b 0a 09 09 63  pt_active) {...c
2bd60 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
2bd70 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
2bd80 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  k);....CACKEY_DE
2bd90 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2bda0 72 2e 20 20 44 65 63 72 79 70 74 20 6e 6f 74 20  r.  Decrypt not 
2bdb0 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09  active.");......
2bdc0 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41  return(CKR_OPERA
2bdd0 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TION_NOT_INITIAL
2bde0 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 2a 70 75 6c  IZED);..}...*pul
2bdf0 4c 61 73 74 50 61 72 74 4c 65 6e 20 3d 20 30 3b  LastPartLen = 0;
2be00 0a 0a 09 69 66 20 28 70 4c 61 73 74 50 61 72 74  ...if (pLastPart
2be10 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 74 65   == NULL) {...te
2be20 72 6d 69 6e 61 74 65 5f 64 65 63 72 79 70 74 20  rminate_decrypt 
2be30 3d 20 30 3b 0a 09 7d 0a 0a 09 69 66 20 28 74 65  = 0;..}...if (te
2be40 72 6d 69 6e 61 74 65 5f 64 65 63 72 79 70 74 29  rminate_decrypt)
2be50 20 7b 0a 09 09 63 61 63 6b 65 79 5f 73 65 73 73   {...cackey_sess
2be60 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64  ions[hSession].d
2be70 65 63 72 79 70 74 5f 61 63 74 69 76 65 20 3d 20  ecrypt_active = 
2be80 30 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65  0;..}...mutex_re
2be90 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
2bea0 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
2beb0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
2bec0 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
2bed0 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
2bee0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2bef0 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66  or.  Unlocking f
2bf00 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
2bf10 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
2bf20 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43  ERROR);..}...CAC
2bf30 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2bf40 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
2bf50 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b  OK (%i)", CKR_OK
2bf60 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
2bf70 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  OK);.}..CK_DEFIN
2bf80 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
2bf90 2c 20 43 5f 44 69 67 65 73 74 49 6e 69 74 29 28  , C_DigestInit)(
2bfa0 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
2bfb0 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d  E hSession, CK_M
2bfc0 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65  ECHANISM_PTR pMe
2bfd0 63 68 61 6e 69 73 6d 29 20 7b 0a 09 43 41 43 4b  chanism) {..CACK
2bfe0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2bff0 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
2c000 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
2c010 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
2c020 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2c030 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
2c040 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
2c050 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
2c060 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
2c070 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
2c080 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
2c090 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
2c0a0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
2c0b0 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
2c0c0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
2c0d0 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
2c0e0 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
2c0f0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
2c100 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
2c110 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 69 67  ION(CK_RV, C_Dig
2c120 65 73 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  est)(CK_SESSION_
2c130 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
2c140 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 44 61   CK_BYTE_PTR pDa
2c150 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 44  ta, CK_ULONG ulD
2c160 61 74 61 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f  ataLen, CK_BYTE_
2c170 50 54 52 20 70 44 69 67 65 73 74 2c 20 43 4b 5f  PTR pDigest, CK_
2c180 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 44 69 67  ULONG_PTR pulDig
2c190 65 73 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45  estLen) {..CACKE
2c1a0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2c1b0 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
2c1c0 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
2c1d0 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
2c1e0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2c1f0 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
2c200 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
2c210 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
2c220 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
2c230 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
2c240 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
2c250 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
2c260 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
2c270 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
2c280 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
2c290 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
2c2a0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
2c2b0 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
2c2c0 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
2c2d0 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 69 67 65  ON(CK_RV, C_Dige
2c2e0 73 74 55 70 64 61 74 65 29 28 43 4b 5f 53 45 53  stUpdate)(CK_SES
2c2f0 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
2c300 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  sion, CK_BYTE_PT
2c310 52 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e  R pPart, CK_ULON
2c320 47 20 75 6c 50 61 72 74 4c 65 6e 29 20 7b 0a 09  G ulPartLen) {..
2c330 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2c340 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
2c350 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
2c360 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
2c370 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2c380 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
2c390 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
2c3a0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
2c3b0 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
2c3c0 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
2c3d0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2c3e0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
2c3f0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
2c400 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
2c410 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
2c420 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
2c430 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
2c440 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
2c450 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
2c460 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
2c470 5f 44 69 67 65 73 74 4b 65 79 29 28 43 4b 5f 53  _DigestKey)(CK_S
2c480 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
2c490 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43  ession, CK_OBJEC
2c4a0 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79 29 20 7b  T_HANDLE hKey) {
2c4b0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2c4c0 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
2c4d0 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
2c4e0 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
2c4f0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2c500 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
2c510 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
2c520 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
2c530 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
2c540 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
2c550 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2c560 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
2c570 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
2c580 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
2c590 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
2c5a0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
2c5b0 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
2c5c0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
2c5d0 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
2c5e0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
2c5f0 20 43 5f 44 69 67 65 73 74 46 69 6e 61 6c 29 28   C_DigestFinal)(
2c600 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
2c610 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42  E hSession, CK_B
2c620 59 54 45 5f 50 54 52 20 70 44 69 67 65 73 74 2c  YTE_PTR pDigest,
2c630 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75   CK_ULONG_PTR pu
2c640 6c 44 69 67 65 73 74 4c 65 6e 29 20 7b 0a 09 43  lDigestLen) {..C
2c650 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2c660 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
2c670 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
2c680 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
2c690 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2c6a0 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
2c6b0 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
2c6c0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
2c6d0 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
2c6e0 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
2c6f0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2c700 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
2c710 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
2c720 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
2c730 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2c740 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
2c750 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
2c760 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
2c770 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
2c780 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
2c790 53 69 67 6e 49 6e 69 74 29 28 43 4b 5f 53 45 53  SignInit)(CK_SES
2c7a0 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
2c7b0 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49  sion, CK_MECHANI
2c7c0 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73  SM_PTR pMechanis
2c7d0 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e  m, CK_OBJECT_HAN
2c7e0 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09 69 6e 74  DLE hKey) {..int
2c7f0 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a   mutex_retval;..
2c800 09 68 4b 65 79 2d 2d 3b 0a 0a 09 43 41 43 4b 45  .hKey--;...CACKE
2c810 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2c820 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
2c830 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
2c840 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
2c850 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2c860 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
2c870 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
2c880 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
2c890 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
2c8a0 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 4d 65  D);..}...if (pMe
2c8b0 63 68 61 6e 69 73 6d 20 3d 3d 20 4e 55 4c 4c 29  chanism == NULL)
2c8c0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
2c8d0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2c8e0 20 70 4d 65 63 68 61 6e 69 73 6d 20 69 73 20 4e   pMechanism is N
2c8f0 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  ULL.");....retur
2c900 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f  n(CKR_ARGUMENTS_
2c910 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70  BAD);..}...if (p
2c920 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d 65 63 68 61  Mechanism->mecha
2c930 6e 69 73 6d 20 21 3d 20 43 4b 4d 5f 52 53 41 5f  nism != CKM_RSA_
2c940 50 4b 43 53 29 20 7b 0a 09 09 43 41 43 4b 45 59  PKCS) {...CACKEY
2c950 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2c960 72 72 6f 72 2e 20 70 4d 65 63 68 61 6e 69 73 6d  rror. pMechanism
2c970 2d 3e 6d 65 63 68 61 6e 69 73 6d 20 6e 6f 74 20  ->mechanism not 
2c980 73 70 65 63 69 66 69 65 64 20 61 73 20 43 4b 4d  specified as CKM
2c990 5f 52 53 41 5f 50 4b 43 53 22 29 3b 0a 0a 09 09  _RSA_PKCS");....
2c9a0 72 65 74 75 72 6e 28 43 4b 52 5f 4d 45 43 48 41  return(CKR_MECHA
2c9b0 4e 49 53 4d 5f 50 41 52 41 4d 5f 49 4e 56 41 4c  NISM_PARAM_INVAL
2c9c0 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53  ID);..}...if (hS
2c9d0 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68  ession == 0 || h
2c9e0 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65  Session >= (size
2c9f0 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
2ca00 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63  ns) / sizeof(cac
2ca10 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29  key_sessions[0])
2ca20 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  )) {...CACKEY_DE
2ca30 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2ca40 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20  r.  Session out 
2ca50 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a  of range.");....
2ca60 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53  ..return(CKR_SES
2ca70 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41  SION_HANDLE_INVA
2ca80 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78  LID);..}...mutex
2ca90 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
2caa0 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b  _mutex_lock(cack
2cab0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
2cac0 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
2cad0 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
2cae0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2caf0 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61  ror.  Locking fa
2cb00 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
2cb10 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
2cb20 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  RROR);..}...if (
2cb30 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  !cackey_sessions
2cb40 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76  [hSession].activ
2cb50 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75  e) {...cackey_mu
2cb60 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
2cb70 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43  y_biglock);....C
2cb80 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2cb90 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73  TF("Error.  Sess
2cba0 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22  ion not active."
2cbb0 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
2cbc0 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  KR_SESSION_HANDL
2cbd0 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
2cbe0 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73  .if (cackey_sess
2cbf0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
2cc00 69 67 6e 5f 61 63 74 69 76 65 29 20 7b 0a 09 09  ign_active) {...
2cc10 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
2cc20 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
2cc30 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ck);....CACKEY_D
2cc40 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2cc50 6f 72 2e 20 20 53 69 67 6e 20 61 6c 72 65 61 64  or.  Sign alread
2cc60 79 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 22 29  y in progress.")
2cc70 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
2cc80 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 41 43 54 49  R_OPERATION_ACTI
2cc90 56 45 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 4b  VE);..}...if (hK
2cca0 65 79 20 3e 3d 20 63 61 63 6b 65 79 5f 73 65 73  ey >= cackey_ses
2ccb0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
2ccc0 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74  identities_count
2ccd0 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  ) {...cackey_mut
2cce0 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
2ccf0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41  _biglock);....CA
2cd00 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2cd10 46 28 22 45 72 72 6f 72 2e 20 20 4b 65 79 20 68  F("Error.  Key h
2cd20 61 6e 64 6c 65 20 6f 75 74 20 6f 66 20 72 61 6e  andle out of ran
2cd30 67 65 20 28 72 65 71 75 65 73 74 65 64 20 6b 65  ge (requested ke
2cd40 79 20 25 6c 75 2c 20 6f 6e 6c 79 20 25 6c 75 20  y %lu, only %lu 
2cd50 69 64 65 6e 74 69 74 69 65 73 20 61 76 61 69 6c  identities avail
2cd60 61 62 6c 65 29 2e 22 2c 20 28 75 6e 73 69 67 6e  able).", (unsign
2cd70 65 64 20 6c 6f 6e 67 29 20 68 4b 65 79 2c 20 28  ed long) hKey, (
2cd80 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63  unsigned long) c
2cd90 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
2cda0 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74  Session].identit
2cdb0 69 65 73 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09 72  ies_count);....r
2cdc0 65 74 75 72 6e 28 43 4b 52 5f 4b 45 59 5f 48 41  eturn(CKR_KEY_HA
2cdd0 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
2cde0 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69  }...cackey_sessi
2cdf0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
2ce00 67 6e 5f 61 63 74 69 76 65 20 3d 20 31 3b 0a 0a  gn_active = 1;..
2ce10 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
2ce20 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
2ce30 6d 65 63 68 61 6e 69 73 6d 20 3d 20 70 4d 65 63  mechanism = pMec
2ce40 68 61 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e 69 73  hanism->mechanis
2ce50 6d 3b 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73  m;...cackey_sess
2ce60 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
2ce70 69 67 6e 5f 62 75 66 6c 65 6e 20 3d 20 31 32 38  ign_buflen = 128
2ce80 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ;..cackey_sessio
2ce90 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
2cea0 6e 5f 62 75 66 75 73 65 64 20 3d 20 30 3b 0a 09  n_bufused = 0;..
2ceb0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2cec0 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62  hSession].sign_b
2ced0 75 66 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65  uf = malloc(size
2cee0 6f 66 28 2a 63 61 63 6b 65 79 5f 73 65 73 73 69  of(*cackey_sessi
2cef0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
2cf00 67 6e 5f 62 75 66 29 20 2a 20 63 61 63 6b 65 79  gn_buf) * cackey
2cf10 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
2cf20 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 6c 65 6e 29  on].sign_buflen)
2cf30 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
2cf40 5f 50 52 49 4e 54 46 28 22 53 65 73 73 69 6f 6e  _PRINTF("Session
2cf50 20 25 6c 75 20 73 69 67 6e 5f 69 64 65 6e 74 69   %lu sign_identi
2cf60 74 79 20 69 73 20 25 70 20 28 69 64 65 6e 74 69  ty is %p (identi
2cf70 74 79 20 23 25 6c 75 29 22 2c 20 28 75 6e 73 69  ty #%lu)", (unsi
2cf80 67 6e 65 64 20 6c 6f 6e 67 29 20 68 53 65 73 73  gned long) hSess
2cf90 69 6f 6e 2c 20 28 76 6f 69 64 20 2a 29 20 26 63  ion, (void *) &c
2cfa0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
2cfb0 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74  Session].identit
2cfc0 69 65 73 5b 68 4b 65 79 5d 2c 20 28 75 6e 73 69  ies[hKey], (unsi
2cfd0 67 6e 65 64 20 6c 6f 6e 67 29 20 68 4b 65 79 29  gned long) hKey)
2cfe0 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ;..cackey_sessio
2cff0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
2d000 6e 5f 69 64 65 6e 74 69 74 79 20 3d 20 26 63 61  n_identity = &ca
2d010 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
2d020 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69  ession].identiti
2d030 65 73 5b 68 4b 65 79 5d 3b 0a 0a 09 6d 75 74 65  es[hKey];...mute
2d040 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
2d050 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
2d060 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
2d070 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
2d080 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
2d090 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2d0a0 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69  "Error.  Unlocki
2d0b0 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
2d0c0 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
2d0d0 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
2d0e0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2d0f0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
2d100 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b  CKR_OK (%i)", CK
2d110 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28  R_OK);...return(
2d120 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44  CKR_OK);.}..CK_D
2d130 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
2d140 4b 5f 52 56 2c 20 43 5f 53 69 67 6e 29 28 43 4b  K_RV, C_Sign)(CK
2d150 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
2d160 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54  hSession, CK_BYT
2d170 45 5f 50 54 52 20 70 44 61 74 61 2c 20 43 4b 5f  E_PTR pData, CK_
2d180 55 4c 4f 4e 47 20 75 6c 44 61 74 61 4c 65 6e 2c  ULONG ulDataLen,
2d190 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 53 69   CK_BYTE_PTR pSi
2d1a0 67 6e 61 74 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e  gnature, CK_ULON
2d1b0 47 5f 50 54 52 20 70 75 6c 53 69 67 6e 61 74 75  G_PTR pulSignatu
2d1c0 72 65 4c 65 6e 29 20 7b 0a 09 75 6e 73 69 67 6e  reLen) {..unsign
2d1d0 65 64 20 6c 6f 6e 67 20 73 74 61 72 74 5f 73 69  ed long start_si
2d1e0 67 6e 5f 62 75 66 75 73 65 64 3b 0a 09 43 4b 5f  gn_bufused;..CK_
2d1f0 52 56 20 73 69 67 6e 5f 72 65 74 3b 0a 09 69 6e  RV sign_ret;..in
2d200 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a  t mutex_retval;.
2d210 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2d220 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
2d230 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
2d240 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
2d250 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2d260 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
2d270 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
2d280 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
2d290 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
2d2a0 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
2d2b0 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20  if (hSession == 
2d2c0 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d  0 || hSession >=
2d2d0 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
2d2e0 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65  sessions) / size
2d2f0 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
2d300 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43  ns[0]))) {...CAC
2d310 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2d320 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f  ("Error.  Sessio
2d330 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22  n out of range."
2d340 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
2d350 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  KR_SESSION_HANDL
2d360 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
2d370 09 73 74 61 72 74 5f 73 69 67 6e 5f 62 75 66 75  .start_sign_bufu
2d380 73 65 64 20 3d 20 63 61 63 6b 65 79 5f 73 65 73  sed = cackey_ses
2d390 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
2d3a0 73 69 67 6e 5f 62 75 66 75 73 65 64 3b 0a 0a 09  sign_bufused;...
2d3b0 73 69 67 6e 5f 72 65 74 20 3d 20 43 5f 53 69 67  sign_ret = C_Sig
2d3c0 6e 55 70 64 61 74 65 28 68 53 65 73 73 69 6f 6e  nUpdate(hSession
2d3d0 2c 20 70 44 61 74 61 2c 20 75 6c 44 61 74 61 4c  , pData, ulDataL
2d3e0 65 6e 29 3b 0a 09 69 66 20 28 73 69 67 6e 5f 72  en);..if (sign_r
2d3f0 65 74 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a  et != CKR_OK) {.
2d400 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2d410 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
2d420 69 67 6e 55 70 64 61 74 65 28 29 20 72 65 74 75  ignUpdate() retu
2d430 72 6e 65 64 20 66 61 69 6c 75 72 65 20 28 72 76  rned failure (rv
2d440 20 3d 20 25 6c 75 29 2e 22 2c 20 28 75 6e 73 69   = %lu).", (unsi
2d450 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69 67 6e 5f  gned long) sign_
2d460 72 65 74 29 3b 0a 0a 09 09 69 66 20 28 73 69 67  ret);....if (sig
2d470 6e 5f 72 65 74 20 21 3d 20 43 4b 52 5f 42 55 46  n_ret != CKR_BUF
2d480 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 20 7b  FER_TOO_SMALL) {
2d490 0a 09 09 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  ....mutex_retval
2d4a0 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
2d4b0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
2d4c0 6f 63 6b 29 3b 0a 09 09 09 69 66 20 28 6d 75 74  ock);....if (mut
2d4d0 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
2d4e0 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  {.....CACKEY_DEB
2d4f0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2d500 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65  .  Locking faile
2d510 64 2e 22 29 3b 0a 0a 09 09 09 09 72 65 74 75 72  d.");......retur
2d520 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
2d530 52 4f 52 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 69  ROR);....}.....i
2d540 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69  f (!cackey_sessi
2d550 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63  ons[hSession].ac
2d560 74 69 76 65 29 20 7b 0a 09 09 09 09 63 61 63 6b  tive) {.....cack
2d570 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
2d580 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
2d590 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
2d5a0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2d5b0 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61  .  Session not a
2d5c0 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 09  ctive.");.......
2d5d0 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
2d5e0 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
2d5f0 49 44 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66  ID);....}.....if
2d600 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   (!cackey_sessio
2d610 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
2d620 6e 5f 61 63 74 69 76 65 29 20 7b 0a 09 09 09 09  n_active) {.....
2d630 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
2d640 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
2d650 63 6b 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59  ck);......CACKEY
2d660 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2d670 72 72 6f 72 2e 20 20 53 69 67 6e 20 6e 6f 74 20  rror.  Sign not 
2d680 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09  active.");......
2d690 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45  ..return(CKR_OPE
2d6a0 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49  RATION_NOT_INITI
2d6b0 41 4c 49 5a 45 44 29 3b 0a 09 09 09 7d 0a 0a 09  ALIZED);....}...
2d6c0 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
2d6d0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
2d6e0 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a 0a 09 09  _active = 0;....
2d6f0 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
2d700 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
2d710 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
2d720 63 6b 29 3b 0a 09 09 09 69 66 20 28 6d 75 74 65  ck);....if (mute
2d730 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
2d740 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
2d750 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2d760 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c    Unlocking fail
2d770 65 64 2e 22 29 3b 0a 0a 09 09 09 09 72 65 74 75  ed.");......retu
2d780 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
2d790 52 52 4f 52 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a  RROR);....}...}.
2d7a0 0a 09 09 72 65 74 75 72 6e 28 73 69 67 6e 5f 72  ...return(sign_r
2d7b0 65 74 29 3b 0a 09 7d 0a 0a 09 73 69 67 6e 5f 72  et);..}...sign_r
2d7c0 65 74 20 3d 20 43 5f 53 69 67 6e 46 69 6e 61 6c  et = C_SignFinal
2d7d0 28 68 53 65 73 73 69 6f 6e 2c 20 70 53 69 67 6e  (hSession, pSign
2d7e0 61 74 75 72 65 2c 20 70 75 6c 53 69 67 6e 61 74  ature, pulSignat
2d7f0 75 72 65 4c 65 6e 29 3b 0a 09 69 66 20 28 73 69  ureLen);..if (si
2d800 67 6e 5f 72 65 74 20 21 3d 20 43 4b 52 5f 4f 4b  gn_ret != CKR_OK
2d810 29 20 7b 0a 09 09 69 66 20 28 73 69 67 6e 5f 72  ) {...if (sign_r
2d820 65 74 20 3d 3d 20 43 4b 52 5f 42 55 46 46 45 52  et == CKR_BUFFER
2d830 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 20 7b 0a 09 09  _TOO_SMALL) {...
2d840 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2d850 49 4e 54 46 28 22 53 69 67 6e 46 69 6e 61 6c 28  INTF("SignFinal(
2d860 29 20 72 65 74 75 72 6e 65 64 20 43 4b 52 5f 42  ) returned CKR_B
2d870 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 20  UFFER_TOO_SMALL 
2d880 28 72 76 20 3d 20 25 6c 75 29 2c 20 75 6e 64 6f  (rv = %lu), undo
2d890 69 6e 67 20 43 5f 53 69 67 6e 55 70 64 61 74 65  ing C_SignUpdate
2d8a0 28 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ()", (unsigned l
2d8b0 6f 6e 67 29 20 73 69 67 6e 5f 72 65 74 29 3b 0a  ong) sign_ret);.
2d8c0 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ....cackey_sessi
2d8d0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
2d8e0 67 6e 5f 62 75 66 75 73 65 64 20 3d 20 73 74 61  gn_bufused = sta
2d8f0 72 74 5f 73 69 67 6e 5f 62 75 66 75 73 65 64 3b  rt_sign_bufused;
2d900 0a 0a 09 09 09 72 65 74 75 72 6e 28 73 69 67 6e  .....return(sign
2d910 5f 72 65 74 29 3b 0a 09 09 7d 0a 0a 09 09 43 41  _ret);...}....CA
2d920 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2d930 46 28 22 45 72 72 6f 72 2e 20 20 53 69 67 6e 46  F("Error.  SignF
2d940 69 6e 61 6c 28 29 20 72 65 74 75 72 6e 65 64 20  inal() returned 
2d950 66 61 69 6c 75 72 65 20 28 72 76 20 3d 20 25 6c  failure (rv = %l
2d960 75 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  u).", (unsigned 
2d970 6c 6f 6e 67 29 20 73 69 67 6e 5f 72 65 74 29 3b  long) sign_ret);
2d980 0a 0a 09 09 72 65 74 75 72 6e 28 73 69 67 6e 5f  ....return(sign_
2d990 72 65 74 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70  ret);..}...if (p
2d9a0 53 69 67 6e 61 74 75 72 65 20 3d 3d 20 4e 55 4c  Signature == NUL
2d9b0 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
2d9c0 42 55 47 5f 50 52 49 4e 54 46 28 22 70 53 69 67  BUG_PRINTF("pSig
2d9d0 6e 61 74 75 72 65 20 73 70 65 63 69 66 69 65 64  nature specified
2d9e0 20 61 73 20 4e 55 4c 4c 2c 20 75 6e 64 6f 69 6e   as NULL, undoin
2d9f0 67 20 43 5f 53 69 67 6e 55 70 64 61 74 65 28 29  g C_SignUpdate()
2da00 22 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 73 65  ");....cackey_se
2da10 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
2da20 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 20 3d 20  .sign_bufused = 
2da30 73 74 61 72 74 5f 73 69 67 6e 5f 62 75 66 75 73  start_sign_bufus
2da40 65 64 3b 0a 0a 09 09 72 65 74 75 72 6e 28 73 69  ed;....return(si
2da50 67 6e 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09 43 41  gn_ret);..}...CA
2da60 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2da70 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
2da80 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f  _OK (%i)", CKR_O
2da90 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  K);...return(CKR
2daa0 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  _OK);.}..CK_DEFI
2dab0 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
2dac0 56 2c 20 43 5f 53 69 67 6e 55 70 64 61 74 65 29  V, C_SignUpdate)
2dad0 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
2dae0 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
2daf0 42 59 54 45 5f 50 54 52 20 70 50 61 72 74 2c 20  BYTE_PTR pPart, 
2db00 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 61 72 74 4c  CK_ULONG ulPartL
2db10 65 6e 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78  en) {..int mutex
2db20 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45  _retval;...CACKE
2db30 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2db40 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
2db50 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
2db60 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
2db70 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2db80 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
2db90 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
2dba0 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
2dbb0 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
2dbc0 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65  D);..}...if (hSe
2dbd0 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53  ssion == 0 || hS
2dbe0 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f  ession >= (sizeo
2dbf0 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
2dc00 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
2dc10 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29  ey_sessions[0]))
2dc20 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
2dc30 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2dc40 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f  .  Session out o
2dc50 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09  f range.");.....
2dc60 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
2dc70 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
2dc80 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 50  ID);..}...if (pP
2dc90 61 72 74 20 3d 3d 20 4e 55 4c 4c 20 26 26 20 75  art == NULL && u
2dca0 6c 50 61 72 74 4c 65 6e 20 3d 3d 20 30 29 20 7b  lPartLen == 0) {
2dcb0 0a 09 09 2f 2a 20 53 68 6f 72 74 20 63 69 72 63  .../* Short circ
2dcc0 75 69 74 20 69 66 20 77 65 20 61 72 65 20 61 73  uit if we are as
2dcd0 6b 65 64 20 74 6f 20 73 69 67 6e 20 6e 6f 74 68  ked to sign noth
2dce0 69 6e 67 2e 2e 2e 20 2a 2f 0a 09 09 43 41 43 4b  ing... */...CACK
2dcf0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2dd00 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
2dd10 4b 20 28 25 69 29 20 28 73 68 6f 72 74 20 63 69  K (%i) (short ci
2dd20 72 63 75 69 74 29 22 2c 20 43 4b 52 5f 4f 4b 29  rcuit)", CKR_OK)
2dd30 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
2dd40 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 50  OK);..}...if (pP
2dd50 61 72 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  art == NULL) {..
2dd60 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2dd70 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 50 61  INTF("Error. pPa
2dd80 72 74 20 69 73 20 4e 55 4c 4c 2c 20 62 75 74 20  rt is NULL, but 
2dd90 75 6c 50 61 72 74 4c 65 6e 20 69 73 20 6e 6f 74  ulPartLen is not
2dda0 20 30 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e   0.");....return
2ddb0 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42  (CKR_ARGUMENTS_B
2ddc0 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 6c  AD);..}...if (ul
2ddd0 50 61 72 74 4c 65 6e 20 3d 3d 20 30 29 20 7b 0a  PartLen == 0) {.
2dde0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2ddf0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 75 6c  RINTF("Error. ul
2de00 50 61 72 74 4c 65 6e 20 69 73 20 30 2c 20 62 75  PartLen is 0, bu
2de10 74 20 70 50 61 72 74 20 69 73 20 6e 6f 74 20 4e  t pPart is not N
2de20 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  ULL.");....retur
2de30 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f  n(CKR_ARGUMENTS_
2de40 42 41 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78  BAD);..}...mutex
2de50 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
2de60 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b  _mutex_lock(cack
2de70 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
2de80 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
2de90 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
2dea0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2deb0 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61  ror.  Locking fa
2dec0 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
2ded0 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
2dee0 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  RROR);..}...if (
2def0 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  !cackey_sessions
2df00 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76  [hSession].activ
2df10 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75  e) {...cackey_mu
2df20 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
2df30 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43  y_biglock);....C
2df40 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2df50 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73  TF("Error.  Sess
2df60 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22  ion not active."
2df70 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
2df80 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  KR_SESSION_HANDL
2df90 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
2dfa0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73  .if (!cackey_ses
2dfb0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
2dfc0 73 69 67 6e 5f 61 63 74 69 76 65 29 20 7b 0a 09  sign_active) {..
2dfd0 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
2dfe0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
2dff0 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f  ock);....CACKEY_
2e000 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2e010 72 6f 72 2e 20 20 53 69 67 6e 20 6e 6f 74 20 61  ror.  Sign not a
2e020 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72  ctive.");......r
2e030 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54  eturn(CKR_OPERAT
2e040 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  ION_NOT_INITIALI
2e050 5a 45 44 29 3b 0a 09 7d 0a 0a 09 73 77 69 74 63  ZED);..}...switc
2e060 68 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  h (cackey_sessio
2e070 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
2e080 6e 5f 6d 65 63 68 61 6e 69 73 6d 29 20 7b 0a 09  n_mechanism) {..
2e090 09 63 61 73 65 20 43 4b 4d 5f 52 53 41 5f 50 4b  .case CKM_RSA_PK
2e0a0 43 53 3a 0a 09 09 09 2f 2a 20 41 63 63 75 6d 75  CS:..../* Accumu
2e0b0 6c 61 74 65 20 64 69 72 65 63 74 6c 79 20 2a 2f  late directly */
2e0c0 0a 09 09 09 69 66 20 28 28 63 61 63 6b 65 79 5f  ....if ((cackey_
2e0d0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
2e0e0 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 20  n].sign_bufused 
2e0f0 2b 20 75 6c 50 61 72 74 4c 65 6e 29 20 3e 20 63  + ulPartLen) > c
2e100 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
2e110 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75  Session].sign_bu
2e120 66 6c 65 6e 29 20 7b 0a 09 09 09 09 63 61 63 6b  flen) {.....cack
2e130 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
2e140 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 6c 65  sion].sign_bufle
2e150 6e 20 2a 3d 20 32 3b 0a 0a 09 09 09 09 63 61 63  n *= 2;......cac
2e160 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
2e170 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 20  ssion].sign_buf 
2e180 3d 20 72 65 61 6c 6c 6f 63 28 63 61 63 6b 65 79  = realloc(cackey
2e190 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
2e1a0 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 2c 20 73 69  on].sign_buf, si
2e1b0 7a 65 6f 66 28 2a 63 61 63 6b 65 79 5f 73 65 73  zeof(*cackey_ses
2e1c0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
2e1d0 73 69 67 6e 5f 62 75 66 29 20 2a 20 63 61 63 6b  sign_buf) * cack
2e1e0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
2e1f0 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 6c 65  sion].sign_bufle
2e200 6e 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 6d 65 6d  n);....}.....mem
2e210 63 70 79 28 63 61 63 6b 65 79 5f 73 65 73 73 69  cpy(cackey_sessi
2e220 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
2e230 67 6e 5f 62 75 66 20 2b 20 63 61 63 6b 65 79 5f  gn_buf + cackey_
2e240 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
2e250 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 2c  n].sign_bufused,
2e260 20 70 50 61 72 74 2c 20 75 6c 50 61 72 74 4c 65   pPart, ulPartLe
2e270 6e 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73  n);.....cackey_s
2e280 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
2e290 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 20 2b  ].sign_bufused +
2e2a0 3d 20 75 6c 50 61 72 74 4c 65 6e 3b 0a 0a 09 09  = ulPartLen;....
2e2b0 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 6d 75 74  .break;..}...mut
2e2c0 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
2e2d0 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
2e2e0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
2e2f0 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
2e300 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
2e310 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2e320 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b  ("Error.  Unlock
2e330 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
2e340 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
2e350 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
2e360 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2e370 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
2e380 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43   CKR_OK (%i)", C
2e390 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e  KR_OK);...return
2e3a0 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f  (CKR_OK);.}..CK_
2e3b0 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
2e3c0 43 4b 5f 52 56 2c 20 43 5f 53 69 67 6e 46 69 6e  CK_RV, C_SignFin
2e3d0 61 6c 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  al)(CK_SESSION_H
2e3e0 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
2e3f0 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 53 69 67  CK_BYTE_PTR pSig
2e400 6e 61 74 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47  nature, CK_ULONG
2e410 5f 50 54 52 20 70 75 6c 53 69 67 6e 61 74 75 72  _PTR pulSignatur
2e420 65 4c 65 6e 29 20 7b 0a 09 73 74 61 74 69 63 20  eLen) {..static 
2e430 43 4b 5f 42 59 54 45 20 73 69 67 62 75 66 5b 31  CK_BYTE sigbuf[1
2e440 30 32 34 5d 3b 0a 09 73 73 69 7a 65 5f 74 20 73  024];..ssize_t s
2e450 69 67 62 75 66 6c 65 6e 3b 0a 09 43 4b 5f 53 4c  igbuflen;..CK_SL
2e460 4f 54 5f 49 44 20 73 6c 6f 74 49 44 3b 0a 09 43  OT_ID slotID;..C
2e470 4b 5f 52 56 20 72 65 74 76 61 6c 20 3d 20 43 4b  K_RV retval = CK
2e480 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 3b  R_GENERAL_ERROR;
2e490 0a 09 69 6e 74 20 74 65 72 6d 69 6e 61 74 65 5f  ..int terminate_
2e4a0 73 69 67 6e 20 3d 20 31 3b 0a 09 69 6e 74 20 6d  sign = 1;..int m
2e4b0 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43  utex_retval;...C
2e4c0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2e4d0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
2e4e0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
2e4f0 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
2e500 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2e510 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
2e520 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
2e530 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
2e540 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
2e550 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  LIZED);..}...if 
2e560 28 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e  (pulSignatureLen
2e570 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
2e580 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2e590 46 28 22 45 72 72 6f 72 2e 20 70 75 6c 53 69 67  F("Error. pulSig
2e5a0 6e 61 74 75 72 65 4c 65 6e 20 69 73 20 4e 55 4c  natureLen is NUL
2e5b0 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  L.");....return(
2e5c0 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41  CKR_ARGUMENTS_BA
2e5d0 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65  D);..}...if (hSe
2e5e0 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53  ssion == 0 || hS
2e5f0 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f  ession >= (sizeo
2e600 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
2e610 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
2e620 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29  ey_sessions[0]))
2e630 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
2e640 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2e650 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f  .  Session out o
2e660 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09  f range.");.....
2e670 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
2e680 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
2e690 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f  ID);..}...mutex_
2e6a0 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
2e6b0 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65  mutex_lock(cacke
2e6c0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
2e6d0 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
2e6e0 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
2e6f0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2e700 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69  or.  Locking fai
2e710 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
2e720 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
2e730 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21  ROR);..}...if (!
2e740 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2e750 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65  hSession].active
2e760 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  ) {...cackey_mut
2e770 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
2e780 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41  _biglock);....CA
2e790 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2e7a0 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69  F("Error.  Sessi
2e7b0 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29  on not active.")
2e7c0 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
2e7d0 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  R_SESSION_HANDLE
2e7e0 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
2e7f0 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73  if (!cackey_sess
2e800 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
2e810 69 67 6e 5f 61 63 74 69 76 65 29 20 7b 0a 09 09  ign_active) {...
2e820 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
2e830 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
2e840 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ck);....CACKEY_D
2e850 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2e860 6f 72 2e 20 20 53 69 67 6e 20 6e 6f 74 20 61 63  or.  Sign not ac
2e870 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  tive.");......re
2e880 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49  turn(CKR_OPERATI
2e890 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  ON_NOT_INITIALIZ
2e8a0 45 44 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 49 44  ED);..}...slotID
2e8b0 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   = cackey_sessio
2e8c0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f  ns[hSession].slo
2e8d0 74 49 44 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 49  tID;...if (slotI
2e8e0 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20  D < 0 || slotID 
2e8f0 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65  >= (sizeof(cacke
2e900 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f  y_slots) / sizeo
2e910 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30  f(cackey_slots[0
2e920 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ]))) {...CACKEY_
2e930 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2e940 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f  ror. Invalid slo
2e950 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75  t requested (%lu
2e960 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 76 61  ), outside of va
2e970 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74  lid range", slot
2e980 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  ID);....return(C
2e990 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
2e9a0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b  );..}...if (cack
2e9b0 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
2e9c0 2e 61 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a  .active == 0) {.
2e9d0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2e9e0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e  RINTF("Error. In
2e9f0 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65  valid slot reque
2ea00 73 74 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74  sted (%lu), slot
2ea10 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61   not currently a
2ea20 63 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b  ctive", slotID);
2ea30 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  ....cackey_mutex
2ea40 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
2ea50 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75  iglock);....retu
2ea60 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
2ea70 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 73 77 69 74  RROR);..}...swit
2ea80 63 68 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69  ch (cackey_sessi
2ea90 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
2eaa0 67 6e 5f 6d 65 63 68 61 6e 69 73 6d 29 20 7b 0a  gn_mechanism) {.
2eab0 09 09 63 61 73 65 20 43 4b 4d 5f 52 53 41 5f 50  ..case CKM_RSA_P
2eac0 4b 43 53 3a 0a 09 09 09 2f 2a 20 41 73 6b 20 63  KCS:..../* Ask c
2ead0 61 72 64 20 74 6f 20 73 69 67 6e 20 2a 2f 0a 09  ard to sign */..
2eae0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2eaf0 52 49 4e 54 46 28 22 41 73 6b 69 6e 67 20 74 6f  RINTF("Asking to
2eb00 20 73 69 67 6e 20 66 72 6f 6d 20 69 64 65 6e 74   sign from ident
2eb10 69 74 79 20 25 70 20 69 6e 20 73 65 73 73 69 6f  ity %p in sessio
2eb20 6e 20 25 6c 75 22 2c 20 28 76 6f 69 64 20 2a 29  n %lu", (void *)
2eb30 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73   cackey_sessions
2eb40 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
2eb50 69 64 65 6e 74 69 74 79 2c 20 28 75 6e 73 69 67  identity, (unsig
2eb60 6e 65 64 20 6c 6f 6e 67 29 20 68 53 65 73 73 69  ned long) hSessi
2eb70 6f 6e 29 3b 0a 09 09 09 73 69 67 62 75 66 6c 65  on);....sigbufle
2eb80 6e 20 3d 20 63 61 63 6b 65 79 5f 73 69 67 6e 64  n = cackey_signd
2eb90 65 63 72 79 70 74 28 26 63 61 63 6b 65 79 5f 73  ecrypt(&cackey_s
2eba0 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c 20 63 61  lots[slotID], ca
2ebb0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
2ebc0 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 69 64 65  ession].sign_ide
2ebd0 6e 74 69 74 79 2c 20 63 61 63 6b 65 79 5f 73 65  ntity, cackey_se
2ebe0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
2ebf0 2e 73 69 67 6e 5f 62 75 66 2c 20 63 61 63 6b 65  .sign_buf, cacke
2ec00 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
2ec10 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65  ion].sign_bufuse
2ec20 64 2c 20 73 69 67 62 75 66 2c 20 73 69 7a 65 6f  d, sigbuf, sizeo
2ec30 66 28 73 69 67 62 75 66 29 2c 20 31 2c 20 30 29  f(sigbuf), 1, 0)
2ec40 3b 0a 0a 09 09 09 69 66 20 28 73 69 67 62 75 66  ;.....if (sigbuf
2ec50 6c 65 6e 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43  len == CACKEY_PC
2ec60 53 43 5f 45 5f 4e 45 45 44 4c 4f 47 49 4e 20 26  SC_E_NEEDLOGIN &
2ec70 26 20 63 61 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d  & cackey_pin_com
2ec80 6d 61 6e 64 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  mand != NULL) {.
2ec90 09 09 09 09 69 66 20 28 5f 43 5f 4c 6f 67 69 6e  ....if (_C_Login
2eca0 4d 75 74 65 78 41 72 67 28 68 53 65 73 73 69 6f  MutexArg(hSessio
2ecb0 6e 2c 20 43 4b 55 5f 55 53 45 52 2c 20 4e 55 4c  n, CKU_USER, NUL
2ecc0 4c 2c 20 30 2c 20 30 29 20 3d 3d 20 43 4b 52 5f  L, 0, 0) == CKR_
2ecd0 4f 4b 29 20 7b 0a 09 09 09 09 09 73 69 67 62 75  OK) {......sigbu
2ece0 66 6c 65 6e 20 3d 20 63 61 63 6b 65 79 5f 73 69  flen = cackey_si
2ecf0 67 6e 64 65 63 72 79 70 74 28 26 63 61 63 6b 65  gndecrypt(&cacke
2ed00 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c  y_slots[slotID],
2ed10 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73   cackey_sessions
2ed20 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
2ed30 69 64 65 6e 74 69 74 79 2c 20 63 61 63 6b 65 79  identity, cackey
2ed40 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
2ed50 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 2c 20 63 61  on].sign_buf, ca
2ed60 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
2ed70 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66  ession].sign_buf
2ed80 75 73 65 64 2c 20 73 69 67 62 75 66 2c 20 73 69  used, sigbuf, si
2ed90 7a 65 6f 66 28 73 69 67 62 75 66 29 2c 20 31 2c  zeof(sigbuf), 1,
2eda0 20 30 29 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a   0);.....}....}.
2edb0 0a 09 09 09 69 66 20 28 73 69 67 62 75 66 6c 65  ....if (sigbufle
2edc0 6e 20 3c 20 30 29 20 7b 0a 09 09 09 09 2f 2a 20  n < 0) {...../* 
2edd0 53 69 67 6e 69 6e 67 20 66 61 69 6c 65 64 2e 20  Signing failed. 
2ede0 2a 2f 0a 09 09 09 09 69 66 20 28 73 69 67 62 75  */.....if (sigbu
2edf0 66 6c 65 6e 20 3d 3d 20 43 41 43 4b 45 59 5f 50  flen == CACKEY_P
2ee00 43 53 43 5f 45 5f 4e 45 45 44 4c 4f 47 49 4e 29  CSC_E_NEEDLOGIN)
2ee10 20 7b 0a 09 09 09 09 09 72 65 74 76 61 6c 20 3d   {......retval =
2ee20 20 43 4b 52 5f 55 53 45 52 5f 4e 4f 54 5f 4c 4f   CKR_USER_NOT_LO
2ee30 47 47 45 44 5f 49 4e 3b 0a 09 09 09 09 7d 20 65  GGED_IN;.....} e
2ee40 6c 73 65 20 69 66 20 28 73 69 67 62 75 66 6c 65  lse if (sigbufle
2ee50 6e 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43  n == CACKEY_PCSC
2ee60 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 20  _E_TOKENABSENT) 
2ee70 7b 0a 09 09 09 09 09 72 65 74 76 61 6c 20 3d 20  {......retval = 
2ee80 43 4b 52 5f 44 45 56 49 43 45 5f 52 45 4d 4f 56  CKR_DEVICE_REMOV
2ee90 45 44 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b  ED;.....} else {
2eea0 0a 09 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43  ......retval = C
2eeb0 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
2eec0 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 20 65 6c 73  ;.....}....} els
2eed0 65 20 69 66 20 28 28 28 75 6e 73 69 67 6e 65 64  e if (((unsigned
2eee0 20 6c 6f 6e 67 29 20 73 69 67 62 75 66 6c 65 6e   long) sigbuflen
2eef0 29 20 3e 20 2a 70 75 6c 53 69 67 6e 61 74 75 72  ) > *pulSignatur
2ef00 65 4c 65 6e 20 26 26 20 70 53 69 67 6e 61 74 75  eLen && pSignatu
2ef10 72 65 29 20 7b 0a 09 09 09 09 2f 2a 20 53 69 67  re) {...../* Sig
2ef20 6e 65 64 20 64 61 74 61 20 74 6f 6f 20 6c 61 72  ned data too lar
2ef30 67 65 20 2a 2f 0a 09 09 09 09 43 41 43 4b 45 59  ge */.....CACKEY
2ef40 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 72  _DEBUG_PRINTF("r
2ef50 65 74 76 61 6c 20 3d 20 43 4b 52 5f 42 55 46 46  etval = CKR_BUFF
2ef60 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 3b 20 20 73  ER_TOO_SMALL;  s
2ef70 69 67 62 75 66 6c 65 6e 20 3d 20 25 6c 75 2c 20  igbuflen = %lu, 
2ef80 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 20  pulSignatureLen 
2ef90 3d 20 25 6c 75 22 2c 20 28 75 6e 73 69 67 6e 65  = %lu", (unsigne
2efa0 64 20 6c 6f 6e 67 29 20 73 69 67 62 75 66 6c 65  d long) sigbufle
2efb0 6e 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  n, (unsigned lon
2efc0 67 29 20 2a 70 75 6c 53 69 67 6e 61 74 75 72 65  g) *pulSignature
2efd0 4c 65 6e 29 3b 0a 0a 09 09 09 09 72 65 74 76 61  Len);......retva
2efe0 6c 20 3d 20 43 4b 52 5f 42 55 46 46 45 52 5f 54  l = CKR_BUFFER_T
2eff0 4f 4f 5f 53 4d 41 4c 4c 3b 0a 0a 09 09 09 09 74  OO_SMALL;......t
2f000 65 72 6d 69 6e 61 74 65 5f 73 69 67 6e 20 3d 20  erminate_sign = 
2f010 30 3b 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09  0;....} else {..
2f020 09 09 09 74 65 72 6d 69 6e 61 74 65 5f 73 69 67  ...terminate_sig
2f030 6e 20 3d 20 30 3b 0a 0a 09 09 09 09 69 66 20 28  n = 0;......if (
2f040 70 53 69 67 6e 61 74 75 72 65 29 20 7b 0a 09 09  pSignature) {...
2f050 09 09 09 6d 65 6d 63 70 79 28 70 53 69 67 6e 61  ...memcpy(pSigna
2f060 74 75 72 65 2c 20 73 69 67 62 75 66 2c 20 73 69  ture, sigbuf, si
2f070 67 62 75 66 6c 65 6e 29 3b 0a 0a 09 09 09 09 09  gbuflen);.......
2f080 74 65 72 6d 69 6e 61 74 65 5f 73 69 67 6e 20 3d  terminate_sign =
2f090 20 31 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 2a   1;.....}......*
2f0a0 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 20  pulSignatureLen 
2f0b0 3d 20 73 69 67 62 75 66 6c 65 6e 3b 0a 0a 09 09  = sigbuflen;....
2f0c0 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 4f  ..retval = CKR_O
2f0d0 4b 3b 0a 09 09 09 7d 0a 0a 09 09 09 62 72 65 61  K;....}.....brea
2f0e0 6b 3b 0a 09 7d 0a 0a 09 69 66 20 28 74 65 72 6d  k;..}...if (term
2f0f0 69 6e 61 74 65 5f 73 69 67 6e 29 20 7b 0a 09 09  inate_sign) {...
2f100 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69  if (cackey_sessi
2f110 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
2f120 67 6e 5f 62 75 66 29 20 7b 0a 09 09 09 66 72 65  gn_buf) {....fre
2f130 65 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  e(cackey_session
2f140 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
2f150 5f 62 75 66 29 3b 0a 09 09 7d 0a 0a 09 09 63 61  _buf);...}....ca
2f160 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
2f170 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 61 63 74  ession].sign_act
2f180 69 76 65 20 3d 20 30 3b 0a 09 7d 0a 0a 09 6d 75  ive = 0;..}...mu
2f190 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
2f1a0 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
2f1b0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
2f1c0 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
2f1d0 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
2f1e0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2f1f0 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63  F("Error.  Unloc
2f200 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
2f210 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
2f220 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
2f230 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2f240 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
2f250 67 20 25 69 22 2c 20 28 69 6e 74 29 20 72 65 74  g %i", (int) ret
2f260 76 61 6c 29 3b 0a 0a 09 72 65 74 75 72 6e 28 72  val);...return(r
2f270 65 74 76 61 6c 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  etval);.}..CK_DE
2f280 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
2f290 5f 52 56 2c 20 43 5f 53 69 67 6e 52 65 63 6f 76  _RV, C_SignRecov
2f2a0 65 72 49 6e 69 74 29 28 43 4b 5f 53 45 53 53 49  erInit)(CK_SESSI
2f2b0 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
2f2c0 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d  on, CK_MECHANISM
2f2d0 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c  _PTR pMechanism,
2f2e0 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c   CK_OBJECT_HANDL
2f2f0 45 20 68 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45  E hKey) {..CACKE
2f300 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2f310 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
2f320 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
2f330 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
2f340 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2f350 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
2f360 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
2f370 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
2f380 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
2f390 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
2f3a0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
2f3b0 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
2f3c0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
2f3d0 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
2f3e0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
2f3f0 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
2f400 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
2f410 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
2f420 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
2f430 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 69 67 6e  ON(CK_RV, C_Sign
2f440 52 65 63 6f 76 65 72 29 28 43 4b 5f 53 45 53 53  Recover)(CK_SESS
2f450 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
2f460 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  ion, CK_BYTE_PTR
2f470 20 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47   pData, CK_ULONG
2f480 20 75 6c 44 61 74 61 4c 65 6e 2c 20 43 4b 5f 42   ulDataLen, CK_B
2f490 59 54 45 5f 50 54 52 20 70 53 69 67 6e 61 74 75  YTE_PTR pSignatu
2f4a0 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52  re, CK_ULONG_PTR
2f4b0 20 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e   pulSignatureLen
2f4c0 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
2f4d0 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
2f4e0 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
2f4f0 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
2f500 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
2f510 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2f520 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
2f530 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
2f540 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
2f550 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
2f560 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2f570 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
2f580 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
2f590 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
2f5a0 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
2f5b0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
2f5c0 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
2f5d0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
2f5e0 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
2f5f0 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
2f600 52 56 2c 20 43 5f 56 65 72 69 66 79 49 6e 69 74  RV, C_VerifyInit
2f610 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
2f620 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
2f630 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70  _MECHANISM_PTR p
2f640 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42  Mechanism, CK_OB
2f650 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79  JECT_HANDLE hKey
2f660 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
2f670 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
2f680 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
2f690 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
2f6a0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
2f6b0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2f6c0 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
2f6d0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
2f6e0 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
2f6f0 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
2f700 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2f710 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
2f720 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
2f730 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
2f740 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
2f750 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
2f760 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
2f770 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
2f780 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
2f790 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
2f7a0 52 56 2c 20 43 5f 56 65 72 69 66 79 29 28 43 4b  RV, C_Verify)(CK
2f7b0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
2f7c0 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54  hSession, CK_BYT
2f7d0 45 5f 50 54 52 20 70 44 61 74 61 2c 20 43 4b 5f  E_PTR pData, CK_
2f7e0 55 4c 4f 4e 47 20 75 6c 44 61 74 61 4c 65 6e 2c  ULONG ulDataLen,
2f7f0 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 53 69   CK_BYTE_PTR pSi
2f800 67 6e 61 74 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e  gnature, CK_ULON
2f810 47 20 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e  G ulSignatureLen
2f820 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
2f830 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
2f840 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
2f850 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
2f860 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
2f870 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2f880 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
2f890 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
2f8a0 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
2f8b0 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
2f8c0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2f8d0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
2f8e0 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
2f8f0 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
2f900 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
2f910 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
2f920 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
2f930 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
2f940 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
2f950 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
2f960 52 56 2c 20 43 5f 56 65 72 69 66 79 55 70 64 61  RV, C_VerifyUpda
2f970 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  te)(CK_SESSION_H
2f980 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
2f990 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 61 72  CK_BYTE_PTR pPar
2f9a0 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 61  t, CK_ULONG ulPa
2f9b0 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59  rtLen) {..CACKEY
2f9c0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
2f9d0 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
2f9e0 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
2f9f0 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
2fa00 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2fa10 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
2fa20 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
2fa30 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
2fa40 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
2fa50 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
2fa60 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
2fa70 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
2fa80 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
2fa90 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
2faa0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
2fab0 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
2fac0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
2fad0 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
2fae0 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
2faf0 4e 28 43 4b 5f 52 56 2c 20 43 5f 56 65 72 69 66  N(CK_RV, C_Verif
2fb00 79 46 69 6e 61 6c 29 28 43 4b 5f 53 45 53 53 49  yFinal)(CK_SESSI
2fb10 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
2fb20 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  on, CK_BYTE_PTR 
2fb30 70 53 69 67 6e 61 74 75 72 65 2c 20 43 4b 5f 55  pSignature, CK_U
2fb40 4c 4f 4e 47 20 75 6c 53 69 67 6e 61 74 75 72 65  LONG ulSignature
2fb50 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  Len) {..CACKEY_D
2fb60 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
2fb70 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
2fb80 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
2fb90 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
2fba0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2fbb0 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
2fbc0 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
2fbd0 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
2fbe0 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
2fbf0 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
2fc00 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
2fc10 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
2fc20 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
2fc30 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
2fc40 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
2fc50 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
2fc60 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
2fc70 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
2fc80 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
2fc90 43 4b 5f 52 56 2c 20 43 5f 56 65 72 69 66 79 52  CK_RV, C_VerifyR
2fca0 65 63 6f 76 65 72 49 6e 69 74 29 28 43 4b 5f 53  ecoverInit)(CK_S
2fcb0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
2fcc0 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41  ession, CK_MECHA
2fcd0 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e  NISM_PTR pMechan
2fce0 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48  ism, CK_OBJECT_H
2fcf0 41 4e 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09 43  ANDLE hKey) {..C
2fd00 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2fd10 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
2fd20 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
2fd30 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
2fd40 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2fd50 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
2fd60 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
2fd70 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
2fd80 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
2fd90 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
2fda0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2fdb0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
2fdc0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
2fdd0 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
2fde0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2fdf0 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
2fe00 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
2fe10 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
2fe20 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
2fe30 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
2fe40 56 65 72 69 66 79 52 65 63 6f 76 65 72 29 28 43  VerifyRecover)(C
2fe50 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
2fe60 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59   hSession, CK_BY
2fe70 54 45 5f 50 54 52 20 70 53 69 67 6e 61 74 75 72  TE_PTR pSignatur
2fe80 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 53 69  e, CK_ULONG ulSi
2fe90 67 6e 61 74 75 72 65 4c 65 6e 2c 20 43 4b 5f 42  gnatureLen, CK_B
2fea0 59 54 45 5f 50 54 52 20 70 44 61 74 61 2c 20 43  YTE_PTR pData, C
2feb0 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 44  K_ULONG_PTR pulD
2fec0 61 74 61 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45  ataLen) {..CACKE
2fed0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2fee0 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
2fef0 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
2ff00 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
2ff10 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2ff20 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
2ff30 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
2ff40 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
2ff50 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
2ff60 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
2ff70 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
2ff80 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
2ff90 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
2ffa0 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
2ffb0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
2ffc0 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
2ffd0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
2ffe0 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
2fff0 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
30000 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 69 67 65  ON(CK_RV, C_Dige
30010 73 74 45 6e 63 72 79 70 74 55 70 64 61 74 65 29  stEncryptUpdate)
30020 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
30030 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
30040 42 59 54 45 5f 50 54 52 20 70 50 61 72 74 2c 20  BYTE_PTR pPart, 
30050 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 61 72 74 4c  CK_ULONG ulPartL
30060 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  en, CK_BYTE_PTR 
30070 70 45 6e 63 72 79 70 74 65 64 50 61 72 74 2c 20  pEncryptedPart, 
30080 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c  CK_ULONG_PTR pul
30090 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e  EncryptedPartLen
300a0 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
300b0 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
300c0 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
300d0 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
300e0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
300f0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
30100 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
30110 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
30120 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
30130 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
30140 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
30150 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
30160 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
30170 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
30180 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
30190 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
301a0 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
301b0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
301c0 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
301d0 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
301e0 52 56 2c 20 43 5f 44 65 63 72 79 70 74 44 69 67  RV, C_DecryptDig
301f0 65 73 74 55 70 64 61 74 65 29 28 43 4b 5f 53 45  estUpdate)(CK_SE
30200 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
30210 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  ssion, CK_BYTE_P
30220 54 52 20 70 45 6e 63 72 79 70 74 65 64 50 61 72  TR pEncryptedPar
30230 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 45 6e  t, CK_ULONG ulEn
30240 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e 2c 20  cryptedPartLen, 
30250 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 61 72  CK_BYTE_PTR pPar
30260 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20  t, CK_ULONG_PTR 
30270 70 75 6c 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43  pulPartLen) {..C
30280 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
30290 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
302a0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
302b0 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
302c0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
302d0 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
302e0 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
302f0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
30300 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
30310 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
30320 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
30330 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
30340 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
30350 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
30360 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
30370 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
30380 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
30390 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
303a0 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
303b0 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
303c0 53 69 67 6e 45 6e 63 72 79 70 74 55 70 64 61 74  SignEncryptUpdat
303d0 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  e)(CK_SESSION_HA
303e0 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
303f0 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 61 72 74  K_BYTE_PTR pPart
30400 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 61 72  , CK_ULONG ulPar
30410 74 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  tLen, CK_BYTE_PT
30420 52 20 70 45 6e 63 72 79 70 74 65 64 50 61 72 74  R pEncryptedPart
30430 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70  , CK_ULONG_PTR p
30440 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c  ulEncryptedPartL
30450 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  en) {..CACKEY_DE
30460 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
30470 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
30480 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
30490 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
304a0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
304b0 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
304c0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
304d0 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
304e0 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
304f0 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
30500 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
30510 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
30520 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
30530 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
30540 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
30550 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
30560 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
30570 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
30580 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
30590 4b 5f 52 56 2c 20 43 5f 44 65 63 72 79 70 74 56  K_RV, C_DecryptV
305a0 65 72 69 66 79 55 70 64 61 74 65 29 28 43 4b 5f  erifyUpdate)(CK_
305b0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
305c0 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45  Session, CK_BYTE
305d0 5f 50 54 52 20 70 45 6e 63 72 79 70 74 65 64 50  _PTR pEncryptedP
305e0 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  art, CK_ULONG ul
305f0 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e  EncryptedPartLen
30600 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50  , CK_BYTE_PTR pP
30610 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54  art, CK_ULONG_PT
30620 52 20 70 75 6c 50 61 72 74 4c 65 6e 29 20 7b 0a  R pulPartLen) {.
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 47 65 6e 65 72 61 74 65 4b 65 79 29 28 43  C_GenerateKey)(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 4d 45   hSession, CK_ME
307a0 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63  CHANISM_PTR pMec
307b0 68 61 6e 69 73 6d 2c 20 43 4b 5f 41 54 54 52 49  hanism, CK_ATTRI
307c0 42 55 54 45 5f 50 54 52 20 70 54 65 6d 70 6c 61  BUTE_PTR pTempla
307d0 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43  te, CK_ULONG ulC
307e0 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f  ount, CK_OBJECT_
307f0 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 4b 65 79  HANDLE_PTR phKey
30800 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
30810 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
30820 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
30830 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
30840 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
30850 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
30860 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
30870 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
30880 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
30890 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
308a0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
308b0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
308c0 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
308d0 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
308e0 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
308f0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
30900 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
30910 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
30920 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
30930 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
30940 52 56 2c 20 43 5f 47 65 6e 65 72 61 74 65 4b 65  RV, C_GenerateKe
30950 79 50 61 69 72 29 28 43 4b 5f 53 45 53 53 49 4f  yPair)(CK_SESSIO
30960 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
30970 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f  n, CK_MECHANISM_
30980 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20  PTR pMechanism, 
30990 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52  CK_ATTRIBUTE_PTR
309a0 20 70 50 75 62 6c 69 63 4b 65 79 54 65 6d 70 6c   pPublicKeyTempl
309b0 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  ate, CK_ULONG ul
309c0 50 75 62 6c 69 63 4b 65 79 41 74 74 72 69 62 75  PublicKeyAttribu
309d0 74 65 43 6f 75 6e 74 2c 20 43 4b 5f 41 54 54 52  teCount, CK_ATTR
309e0 49 42 55 54 45 5f 50 54 52 20 70 50 72 69 76 61  IBUTE_PTR pPriva
309f0 74 65 4b 65 79 54 65 6d 70 6c 61 74 65 2c 20 43  teKeyTemplate, C
30a00 4b 5f 55 4c 4f 4e 47 20 75 6c 50 72 69 76 61 74  K_ULONG ulPrivat
30a10 65 4b 65 79 41 74 74 72 69 62 75 74 65 43 6f 75  eKeyAttributeCou
30a20 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41  nt, CK_OBJECT_HA
30a30 4e 44 4c 45 5f 50 54 52 20 70 68 50 75 62 6c 69  NDLE_PTR phPubli
30a40 63 4b 65 79 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f  cKey, CK_OBJECT_
30a50 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 50 72 69  HANDLE_PTR phPri
30a60 76 61 74 65 4b 65 79 29 20 7b 0a 09 43 41 43 4b  vateKey) {..CACK
30a70 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
30a80 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
30a90 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
30aa0 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
30ab0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
30ac0 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
30ad0 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
30ae0 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
30af0 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
30b00 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
30b10 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
30b20 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
30b30 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
30b40 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
30b50 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
30b60 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
30b70 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
30b80 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
30b90 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
30ba0 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 57 72 61  ION(CK_RV, C_Wra
30bb0 70 4b 65 79 29 28 43 4b 5f 53 45 53 53 49 4f 4e  pKey)(CK_SESSION
30bc0 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
30bd0 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50  , CK_MECHANISM_P
30be0 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43  TR pMechanism, C
30bf0 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20  K_OBJECT_HANDLE 
30c00 68 57 72 61 70 70 69 6e 67 4b 65 79 2c 20 43 4b  hWrappingKey, CK
30c10 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68  _OBJECT_HANDLE h
30c20 4b 65 79 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  Key, CK_BYTE_PTR
30c30 20 70 57 72 61 70 70 65 64 4b 65 79 2c 20 43 4b   pWrappedKey, CK
30c40 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 57 72  _ULONG_PTR pulWr
30c50 61 70 70 65 64 4b 65 79 4c 65 6e 29 20 7b 0a 09  appedKeyLen) {..
30c60 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
30c70 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
30c80 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
30c90 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
30ca0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
30cb0 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
30cc0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
30cd0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
30ce0 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
30cf0 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...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 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
30d20 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
30d30 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
30d40 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
30d50 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
30d60 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
30d70 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
30d80 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
30d90 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
30da0 5f 55 6e 77 72 61 70 4b 65 79 29 28 43 4b 5f 53  _UnwrapKey)(CK_S
30db0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
30dc0 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41  ession, CK_MECHA
30dd0 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e  NISM_PTR pMechan
30de0 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48  ism, CK_OBJECT_H
30df0 41 4e 44 4c 45 20 68 55 6e 77 72 61 70 70 69 6e  ANDLE hUnwrappin
30e00 67 4b 65 79 2c 20 43 4b 5f 42 59 54 45 5f 50 54  gKey, CK_BYTE_PT
30e10 52 20 70 57 72 61 70 70 65 64 4b 65 79 2c 20 43  R pWrappedKey, C
30e20 4b 5f 55 4c 4f 4e 47 20 75 6c 57 72 61 70 70 65  K_ULONG ulWrappe
30e30 64 4b 65 79 4c 65 6e 2c 20 43 4b 5f 41 54 54 52  dKeyLen, CK_ATTR
30e40 49 42 55 54 45 5f 50 54 52 20 70 54 65 6d 70 6c  IBUTE_PTR pTempl
30e50 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  ate, CK_ULONG ul
30e60 41 74 74 72 69 62 75 74 65 43 6f 75 6e 74 2c 20  AttributeCount, 
30e70 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45  CK_OBJECT_HANDLE
30e80 5f 50 54 52 20 70 68 4b 65 79 29 20 7b 0a 09 43  _PTR phKey) {..C
30e90 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
30ea0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
30eb0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
30ec0 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
30ed0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
30ee0 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
30ef0 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
30f00 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
30f10 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
30f20 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
30f30 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
30f40 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
30f50 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
30f60 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
30f70 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
30f80 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
30f90 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
30fa0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
30fb0 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
30fc0 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
30fd0 44 65 72 69 76 65 4b 65 79 29 28 43 4b 5f 53 45  DeriveKey)(CK_SE
30fe0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
30ff0 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e  ssion, CK_MECHAN
31000 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69  ISM_PTR pMechani
31010 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41  sm, CK_OBJECT_HA
31020 4e 44 4c 45 20 68 42 61 73 65 4b 65 79 2c 20 43  NDLE hBaseKey, C
31030 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52 20  K_ATTRIBUTE_PTR 
31040 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c  pTemplate, CK_UL
31050 4f 4e 47 20 75 6c 41 74 74 72 69 62 75 74 65 43  ONG ulAttributeC
31060 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f  ount, CK_OBJECT_
31070 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 4b 65 79  HANDLE_PTR phKey
31080 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
31090 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
310a0 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
310b0 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
310c0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
310d0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
310e0 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
310f0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
31100 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
31110 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
31120 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
31130 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
31140 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
31150 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
31160 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
31170 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
31180 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
31190 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
311a0 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
311b0 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
311c0 52 56 2c 20 43 5f 53 65 65 64 52 61 6e 64 6f 6d  RV, C_SeedRandom
311d0 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
311e0 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
311f0 5f 42 59 54 45 5f 50 54 52 20 70 53 65 65 64 2c  _BYTE_PTR pSeed,
31200 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 53 65 65 64   CK_ULONG ulSeed
31210 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  Len) {..CACKEY_D
31220 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
31230 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
31240 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
31250 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
31260 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
31270 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
31280 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
31290 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
312a0 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
312b0 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
312c0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
312d0 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
312e0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
312f0 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
31300 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
31310 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
31320 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
31330 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
31340 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
31350 43 4b 5f 52 56 2c 20 43 5f 47 65 6e 65 72 61 74  CK_RV, C_Generat
31360 65 52 61 6e 64 6f 6d 29 28 43 4b 5f 53 45 53 53  eRandom)(CK_SESS
31370 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
31380 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  ion, CK_BYTE_PTR
31390 20 70 52 61 6e 64 6f 6d 44 61 74 61 2c 20 43 4b   pRandomData, CK
313a0 5f 55 4c 4f 4e 47 20 75 6c 52 61 6e 64 6f 6d 4c  _ULONG ulRandomL
313b0 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  en) {..CACKEY_DE
313c0 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
313d0 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
313e0 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
313f0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
31400 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
31410 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
31420 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
31430 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
31440 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
31450 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
31460 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
31470 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
31480 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
31490 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
314a0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
314b0 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
314c0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
314d0 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 2f 2a 20 44  PORTED);.}../* D
314e0 65 70 72 65 63 61 74 65 64 20 46 75 6e 63 74 69  eprecated Functi
314f0 6f 6e 20 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45 5f  on */.CK_DEFINE_
31500 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
31510 43 5f 47 65 74 46 75 6e 63 74 69 6f 6e 53 74 61  C_GetFunctionSta
31520 74 75 73 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  tus)(CK_SESSION_
31530 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 29  HANDLE hSession)
31540 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
31550 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
31560 22 29 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ");...CACKEY_DEB
31570 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
31580 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
31590 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c 20 28  N_NOT_PARALLEL (
315a0 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
315b0 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c 29  ON_NOT_PARALLEL)
315c0 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
315d0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41  UNCTION_NOT_PARA
315e0 4c 4c 45 4c 29 3b 0a 0a 09 68 53 65 73 73 69 6f  LLEL);...hSessio
315f0 6e 20 3d 20 68 53 65 73 73 69 6f 6e 3b 20 2f 2a  n = hSession; /*
31600 20 53 75 70 72 65 73 73 20 75 6e 75 73 65 64 20   Supress unused 
31610 76 61 72 69 61 62 6c 65 20 77 61 72 6e 69 6e 67  variable warning
31620 20 2a 2f 0a 7d 0a 0a 2f 2a 20 44 65 70 72 65 63   */.}../* Deprec
31630 61 74 65 64 20 46 75 6e 63 74 69 6f 6e 20 2a 2f  ated Function */
31640 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
31650 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 43 61 6e  ION(CK_RV, C_Can
31660 63 65 6c 46 75 6e 63 74 69 6f 6e 29 28 43 4b 5f  celFunction)(CK_
31670 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
31680 53 65 73 73 69 6f 6e 29 20 7b 0a 09 43 41 43 4b  Session) {..CACK
31690 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
316a0 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 43 41  "Called.");...CA
316b0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
316c0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
316d0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 50 41  _FUNCTION_NOT_PA
316e0 52 41 4c 4c 45 4c 20 28 25 69 29 22 2c 20 43 4b  RALLEL (%i)", CK
316f0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 50  R_FUNCTION_NOT_P
31700 41 52 41 4c 4c 45 4c 29 3b 0a 0a 09 72 65 74 75  ARALLEL);...retu
31710 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
31720 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c 29 3b 0a 0a  NOT_PARALLEL);..
31730 09 68 53 65 73 73 69 6f 6e 20 3d 20 68 53 65 73  .hSession = hSes
31740 73 69 6f 6e 3b 20 2f 2a 20 53 75 70 72 65 73 73  sion; /* Supress
31750 20 75 6e 75 73 65 64 20 76 61 72 69 61 62 6c 65   unused variable
31760 20 77 61 72 6e 69 6e 67 20 2a 2f 0a 7d 0a 0a 43   warning */.}..C
31770 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
31780 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 46 75  N(CK_RV, C_GetFu
31790 6e 63 74 69 6f 6e 4c 69 73 74 29 28 43 4b 5f 46  nctionList)(CK_F
317a0 55 4e 43 54 49 4f 4e 5f 4c 49 53 54 5f 50 54 52  UNCTION_LIST_PTR
317b0 5f 50 54 52 20 70 70 46 75 6e 63 74 69 6f 6e 4c  _PTR ppFunctionL
317c0 69 73 74 29 20 7b 0a 09 43 4b 5f 46 55 4e 43 54  ist) {..CK_FUNCT
317d0 49 4f 4e 5f 4c 49 53 54 5f 50 54 52 20 70 46 75  ION_LIST_PTR pFu
317e0 6e 63 74 69 6f 6e 4c 69 73 74 3b 0a 0a 09 43 41  nctionList;...CA
317f0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
31800 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
31810 69 66 20 28 70 70 46 75 6e 63 74 69 6f 6e 4c 69  if (ppFunctionLi
31820 73 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  st == NULL) {...
31830 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
31840 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 70 46 75  NTF("Error. ppFu
31850 6e 63 74 69 6f 6e 4c 69 73 74 20 69 73 20 4e 55  nctionList is NU
31860 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  LL.");....return
31870 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42  (CKR_ARGUMENTS_B
31880 41 44 29 3b 0a 09 7d 0a 0a 09 70 46 75 6e 63 74  AD);..}...pFunct
31890 69 6f 6e 4c 69 73 74 20 3d 20 6d 61 6c 6c 6f 63  ionList = malloc
318a0 28 73 69 7a 65 6f 66 28 2a 70 46 75 6e 63 74 69  (sizeof(*pFuncti
318b0 6f 6e 4c 69 73 74 29 29 3b 0a 0a 09 70 46 75 6e  onList));...pFun
318c0 63 74 69 6f 6e 4c 69 73 74 2d 3e 76 65 72 73 69  ctionList->versi
318d0 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 28 28 43 41 43  on.major = ((CAC
318e0 4b 45 59 5f 43 52 59 50 54 4f 4b 49 5f 56 45 52  KEY_CRYPTOKI_VER
318f0 53 49 4f 4e 5f 43 4f 44 45 29 20 3e 3e 20 31 36  SION_CODE) >> 16
31900 29 20 26 20 30 78 66 66 3b 0a 09 70 46 75 6e 63  ) & 0xff;..pFunc
31910 74 69 6f 6e 4c 69 73 74 2d 3e 76 65 72 73 69 6f  tionList->versio
31920 6e 2e 6d 69 6e 6f 72 20 3d 20 28 28 43 41 43 4b  n.minor = ((CACK
31930 45 59 5f 43 52 59 50 54 4f 4b 49 5f 56 45 52 53  EY_CRYPTOKI_VERS
31940 49 4f 4e 5f 43 4f 44 45 29 20 3e 3e 20 38 29 20  ION_CODE) >> 8) 
31950 26 20 30 78 66 66 3b 0a 0a 09 70 46 75 6e 63 74  & 0xff;...pFunct
31960 69 6f 6e 4c 69 73 74 2d 3e 43 5f 49 6e 69 74 69  ionList->C_Initi
31970 61 6c 69 7a 65 20 3d 20 43 5f 49 6e 69 74 69 61  alize = C_Initia
31980 6c 69 7a 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  lize;..pFunction
31990 4c 69 73 74 2d 3e 43 5f 46 69 6e 61 6c 69 7a 65  List->C_Finalize
319a0 20 3d 20 43 5f 46 69 6e 61 6c 69 7a 65 3b 0a 09   = C_Finalize;..
319b0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
319c0 5f 47 65 74 49 6e 66 6f 20 3d 20 43 5f 47 65 74  _GetInfo = C_Get
319d0 49 6e 66 6f 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  Info;..pFunction
319e0 4c 69 73 74 2d 3e 43 5f 47 65 74 53 6c 6f 74 4c  List->C_GetSlotL
319f0 69 73 74 20 3d 20 43 5f 47 65 74 53 6c 6f 74 4c  ist = C_GetSlotL
31a00 69 73 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  ist;..pFunctionL
31a10 69 73 74 2d 3e 43 5f 47 65 74 53 6c 6f 74 49 6e  ist->C_GetSlotIn
31a20 66 6f 20 3d 20 43 5f 47 65 74 53 6c 6f 74 49 6e  fo = C_GetSlotIn
31a30 66 6f 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  fo;..pFunctionLi
31a40 73 74 2d 3e 43 5f 47 65 74 54 6f 6b 65 6e 49 6e  st->C_GetTokenIn
31a50 66 6f 20 3d 20 43 5f 47 65 74 54 6f 6b 65 6e 49  fo = C_GetTokenI
31a60 6e 66 6f 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  nfo;..pFunctionL
31a70 69 73 74 2d 3e 43 5f 57 61 69 74 46 6f 72 53 6c  ist->C_WaitForSl
31a80 6f 74 45 76 65 6e 74 20 3d 20 43 5f 57 61 69 74  otEvent = C_Wait
31a90 46 6f 72 53 6c 6f 74 45 76 65 6e 74 3b 0a 09 70  ForSlotEvent;..p
31aa0 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
31ab0 47 65 74 4d 65 63 68 61 6e 69 73 6d 4c 69 73 74  GetMechanismList
31ac0 20 3d 20 43 5f 47 65 74 4d 65 63 68 61 6e 69 73   = C_GetMechanis
31ad0 6d 4c 69 73 74 3b 0a 09 70 46 75 6e 63 74 69 6f  mList;..pFunctio
31ae0 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 4d 65 63 68  nList->C_GetMech
31af0 61 6e 69 73 6d 49 6e 66 6f 20 3d 20 43 5f 47 65  anismInfo = C_Ge
31b00 74 4d 65 63 68 61 6e 69 73 6d 49 6e 66 6f 3b 0a  tMechanismInfo;.
31b10 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
31b20 43 5f 49 6e 69 74 54 6f 6b 65 6e 20 3d 20 43 5f  C_InitToken = C_
31b30 49 6e 69 74 54 6f 6b 65 6e 3b 0a 09 70 46 75 6e  InitToken;..pFun
31b40 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 49 6e 69  ctionList->C_Ini
31b50 74 50 49 4e 20 3d 20 43 5f 49 6e 69 74 50 49 4e  tPIN = C_InitPIN
31b60 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
31b70 2d 3e 43 5f 53 65 74 50 49 4e 20 3d 20 43 5f 53  ->C_SetPIN = C_S
31b80 65 74 50 49 4e 3b 0a 09 70 46 75 6e 63 74 69 6f  etPIN;..pFunctio
31b90 6e 4c 69 73 74 2d 3e 43 5f 4f 70 65 6e 53 65 73  nList->C_OpenSes
31ba0 73 69 6f 6e 20 3d 20 43 5f 4f 70 65 6e 53 65 73  sion = C_OpenSes
31bb0 73 69 6f 6e 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  sion;..pFunction
31bc0 4c 69 73 74 2d 3e 43 5f 43 6c 6f 73 65 53 65 73  List->C_CloseSes
31bd0 73 69 6f 6e 20 3d 20 43 5f 43 6c 6f 73 65 53 65  sion = C_CloseSe
31be0 73 73 69 6f 6e 3b 0a 09 70 46 75 6e 63 74 69 6f  ssion;..pFunctio
31bf0 6e 4c 69 73 74 2d 3e 43 5f 43 6c 6f 73 65 41 6c  nList->C_CloseAl
31c00 6c 53 65 73 73 69 6f 6e 73 20 3d 20 43 5f 43 6c  lSessions = C_Cl
31c10 6f 73 65 41 6c 6c 53 65 73 73 69 6f 6e 73 3b 0a  oseAllSessions;.
31c20 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
31c30 43 5f 47 65 74 53 65 73 73 69 6f 6e 49 6e 66 6f  C_GetSessionInfo
31c40 20 3d 20 43 5f 47 65 74 53 65 73 73 69 6f 6e 49   = C_GetSessionI
31c50 6e 66 6f 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  nfo;..pFunctionL
31c60 69 73 74 2d 3e 43 5f 47 65 74 4f 70 65 72 61 74  ist->C_GetOperat
31c70 69 6f 6e 53 74 61 74 65 20 3d 20 43 5f 47 65 74  ionState = C_Get
31c80 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 65 3b 0a  OperationState;.
31c90 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
31ca0 43 5f 53 65 74 4f 70 65 72 61 74 69 6f 6e 53 74  C_SetOperationSt
31cb0 61 74 65 20 3d 20 43 5f 53 65 74 4f 70 65 72 61  ate = C_SetOpera
31cc0 74 69 6f 6e 53 74 61 74 65 3b 0a 09 70 46 75 6e  tionState;..pFun
31cd0 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 4c 6f 67  ctionList->C_Log
31ce0 69 6e 20 3d 20 43 5f 4c 6f 67 69 6e 3b 0a 09 70  in = C_Login;..p
31cf0 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
31d00 4c 6f 67 6f 75 74 20 3d 20 43 5f 4c 6f 67 6f 75  Logout = C_Logou
31d10 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  t;..pFunctionLis
31d20 74 2d 3e 43 5f 43 72 65 61 74 65 4f 62 6a 65 63  t->C_CreateObjec
31d30 74 20 3d 20 43 5f 43 72 65 61 74 65 4f 62 6a 65  t = C_CreateObje
31d40 63 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  ct;..pFunctionLi
31d50 73 74 2d 3e 43 5f 43 6f 70 79 4f 62 6a 65 63 74  st->C_CopyObject
31d60 20 3d 20 43 5f 43 6f 70 79 4f 62 6a 65 63 74 3b   = C_CopyObject;
31d70 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
31d80 3e 43 5f 44 65 73 74 72 6f 79 4f 62 6a 65 63 74  >C_DestroyObject
31d90 20 3d 20 43 5f 44 65 73 74 72 6f 79 4f 62 6a 65   = C_DestroyObje
31da0 63 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  ct;..pFunctionLi
31db0 73 74 2d 3e 43 5f 47 65 74 4f 62 6a 65 63 74 53  st->C_GetObjectS
31dc0 69 7a 65 20 3d 20 43 5f 47 65 74 4f 62 6a 65 63  ize = C_GetObjec
31dd0 74 53 69 7a 65 3b 0a 09 70 46 75 6e 63 74 69 6f  tSize;..pFunctio
31de0 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 41 74 74 72  nList->C_GetAttr
31df0 69 62 75 74 65 56 61 6c 75 65 20 3d 20 43 5f 47  ibuteValue = C_G
31e00 65 74 41 74 74 72 69 62 75 74 65 56 61 6c 75 65  etAttributeValue
31e10 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
31e20 2d 3e 43 5f 53 65 74 41 74 74 72 69 62 75 74 65  ->C_SetAttribute
31e30 56 61 6c 75 65 20 3d 20 43 5f 53 65 74 41 74 74  Value = C_SetAtt
31e40 72 69 62 75 74 65 56 61 6c 75 65 3b 0a 09 70 46  ributeValue;..pF
31e50 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 46  unctionList->C_F
31e60 69 6e 64 4f 62 6a 65 63 74 73 49 6e 69 74 20 3d  indObjectsInit =
31e70 20 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73 49 6e   C_FindObjectsIn
31e80 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  it;..pFunctionLi
31e90 73 74 2d 3e 43 5f 46 69 6e 64 4f 62 6a 65 63 74  st->C_FindObject
31ea0 73 20 3d 20 43 5f 46 69 6e 64 4f 62 6a 65 63 74  s = C_FindObject
31eb0 73 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  s;..pFunctionLis
31ec0 74 2d 3e 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73  t->C_FindObjects
31ed0 46 69 6e 61 6c 20 3d 20 43 5f 46 69 6e 64 4f 62  Final = C_FindOb
31ee0 6a 65 63 74 73 46 69 6e 61 6c 3b 0a 09 70 46 75  jectsFinal;..pFu
31ef0 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 45 6e  nctionList->C_En
31f00 63 72 79 70 74 49 6e 69 74 20 3d 20 43 5f 45 6e  cryptInit = C_En
31f10 63 72 79 70 74 49 6e 69 74 3b 0a 09 70 46 75 6e  cryptInit;..pFun
31f20 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 45 6e 63  ctionList->C_Enc
31f30 72 79 70 74 20 3d 20 43 5f 45 6e 63 72 79 70 74  rypt = C_Encrypt
31f40 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
31f50 2d 3e 43 5f 45 6e 63 72 79 70 74 55 70 64 61 74  ->C_EncryptUpdat
31f60 65 20 3d 20 43 5f 45 6e 63 72 79 70 74 55 70 64  e = C_EncryptUpd
31f70 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  ate;..pFunctionL
31f80 69 73 74 2d 3e 43 5f 45 6e 63 72 79 70 74 46 69  ist->C_EncryptFi
31f90 6e 61 6c 20 3d 20 43 5f 45 6e 63 72 79 70 74 46  nal = C_EncryptF
31fa0 69 6e 61 6c 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  inal;..pFunction
31fb0 4c 69 73 74 2d 3e 43 5f 44 65 63 72 79 70 74 49  List->C_DecryptI
31fc0 6e 69 74 20 3d 20 43 5f 44 65 63 72 79 70 74 49  nit = C_DecryptI
31fd0 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  nit;..pFunctionL
31fe0 69 73 74 2d 3e 43 5f 44 65 63 72 79 70 74 20 3d  ist->C_Decrypt =
31ff0 20 43 5f 44 65 63 72 79 70 74 3b 0a 09 70 46 75   C_Decrypt;..pFu
32000 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65  nctionList->C_De
32010 63 72 79 70 74 55 70 64 61 74 65 20 3d 20 43 5f  cryptUpdate = C_
32020 44 65 63 72 79 70 74 55 70 64 61 74 65 3b 0a 09  DecryptUpdate;..
32030 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
32040 5f 44 65 63 72 79 70 74 46 69 6e 61 6c 20 3d 20  _DecryptFinal = 
32050 43 5f 44 65 63 72 79 70 74 46 69 6e 61 6c 3b 0a  C_DecryptFinal;.
32060 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
32070 43 5f 44 69 67 65 73 74 49 6e 69 74 20 3d 20 43  C_DigestInit = C
32080 5f 44 69 67 65 73 74 49 6e 69 74 3b 0a 09 70 46  _DigestInit;..pF
32090 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44  unctionList->C_D
320a0 69 67 65 73 74 20 3d 20 43 5f 44 69 67 65 73 74  igest = C_Digest
320b0 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
320c0 2d 3e 43 5f 44 69 67 65 73 74 55 70 64 61 74 65  ->C_DigestUpdate
320d0 20 3d 20 43 5f 44 69 67 65 73 74 55 70 64 61 74   = C_DigestUpdat
320e0 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  e;..pFunctionLis
320f0 74 2d 3e 43 5f 44 69 67 65 73 74 4b 65 79 20 3d  t->C_DigestKey =
32100 20 43 5f 44 69 67 65 73 74 4b 65 79 3b 0a 09 70   C_DigestKey;..p
32110 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
32120 44 69 67 65 73 74 46 69 6e 61 6c 20 3d 20 43 5f  DigestFinal = C_
32130 44 69 67 65 73 74 46 69 6e 61 6c 3b 0a 09 70 46  DigestFinal;..pF
32140 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53  unctionList->C_S
32150 69 67 6e 49 6e 69 74 20 3d 20 43 5f 53 69 67 6e  ignInit = C_Sign
32160 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  Init;..pFunction
32170 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 20 3d 20 43  List->C_Sign = C
32180 5f 53 69 67 6e 3b 0a 09 70 46 75 6e 63 74 69 6f  _Sign;..pFunctio
32190 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 55 70 64  nList->C_SignUpd
321a0 61 74 65 20 3d 20 43 5f 53 69 67 6e 55 70 64 61  ate = C_SignUpda
321b0 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  te;..pFunctionLi
321c0 73 74 2d 3e 43 5f 53 69 67 6e 46 69 6e 61 6c 20  st->C_SignFinal 
321d0 3d 20 43 5f 53 69 67 6e 46 69 6e 61 6c 3b 0a 09  = C_SignFinal;..
321e0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
321f0 5f 53 69 67 6e 52 65 63 6f 76 65 72 49 6e 69 74  _SignRecoverInit
32200 20 3d 20 43 5f 53 69 67 6e 52 65 63 6f 76 65 72   = C_SignRecover
32210 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  Init;..pFunction
32220 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 52 65 63 6f  List->C_SignReco
32230 76 65 72 20 3d 20 43 5f 53 69 67 6e 52 65 63 6f  ver = C_SignReco
32240 76 65 72 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  ver;..pFunctionL
32250 69 73 74 2d 3e 43 5f 56 65 72 69 66 79 49 6e 69  ist->C_VerifyIni
32260 74 20 3d 20 43 5f 56 65 72 69 66 79 49 6e 69 74  t = C_VerifyInit
32270 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
32280 2d 3e 43 5f 56 65 72 69 66 79 20 3d 20 43 5f 56  ->C_Verify = C_V
32290 65 72 69 66 79 3b 0a 09 70 46 75 6e 63 74 69 6f  erify;..pFunctio
322a0 6e 4c 69 73 74 2d 3e 43 5f 56 65 72 69 66 79 55  nList->C_VerifyU
322b0 70 64 61 74 65 20 3d 20 43 5f 56 65 72 69 66 79  pdate = C_Verify
322c0 55 70 64 61 74 65 3b 0a 09 70 46 75 6e 63 74 69  Update;..pFuncti
322d0 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65 72 69 66 79  onList->C_Verify
322e0 46 69 6e 61 6c 20 3d 20 43 5f 56 65 72 69 66 79  Final = C_Verify
322f0 46 69 6e 61 6c 3b 0a 09 70 46 75 6e 63 74 69 6f  Final;..pFunctio
32300 6e 4c 69 73 74 2d 3e 43 5f 56 65 72 69 66 79 52  nList->C_VerifyR
32310 65 63 6f 76 65 72 49 6e 69 74 20 3d 20 43 5f 56  ecoverInit = C_V
32320 65 72 69 66 79 52 65 63 6f 76 65 72 49 6e 69 74  erifyRecoverInit
32330 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
32340 2d 3e 43 5f 56 65 72 69 66 79 52 65 63 6f 76 65  ->C_VerifyRecove
32350 72 20 3d 20 43 5f 56 65 72 69 66 79 52 65 63 6f  r = C_VerifyReco
32360 76 65 72 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  ver;..pFunctionL
32370 69 73 74 2d 3e 43 5f 44 69 67 65 73 74 45 6e 63  ist->C_DigestEnc
32380 72 79 70 74 55 70 64 61 74 65 20 3d 20 43 5f 44  ryptUpdate = C_D
32390 69 67 65 73 74 45 6e 63 72 79 70 74 55 70 64 61  igestEncryptUpda
323a0 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  te;..pFunctionLi
323b0 73 74 2d 3e 43 5f 44 65 63 72 79 70 74 44 69 67  st->C_DecryptDig
323c0 65 73 74 55 70 64 61 74 65 20 3d 20 43 5f 44 65  estUpdate = C_De
323d0 63 72 79 70 74 44 69 67 65 73 74 55 70 64 61 74  cryptDigestUpdat
323e0 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  e;..pFunctionLis
323f0 74 2d 3e 43 5f 53 69 67 6e 45 6e 63 72 79 70 74  t->C_SignEncrypt
32400 55 70 64 61 74 65 20 3d 20 43 5f 53 69 67 6e 45  Update = C_SignE
32410 6e 63 72 79 70 74 55 70 64 61 74 65 3b 0a 09 70  ncryptUpdate;..p
32420 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
32430 44 65 63 72 79 70 74 56 65 72 69 66 79 55 70 64  DecryptVerifyUpd
32440 61 74 65 20 3d 20 43 5f 44 65 63 72 79 70 74 56  ate = C_DecryptV
32450 65 72 69 66 79 55 70 64 61 74 65 3b 0a 09 70 46  erifyUpdate;..pF
32460 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47  unctionList->C_G
32470 65 6e 65 72 61 74 65 4b 65 79 20 3d 20 43 5f 47  enerateKey = C_G
32480 65 6e 65 72 61 74 65 4b 65 79 3b 0a 09 70 46 75  enerateKey;..pFu
32490 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65  nctionList->C_Ge
324a0 6e 65 72 61 74 65 4b 65 79 50 61 69 72 20 3d 20  nerateKeyPair = 
324b0 43 5f 47 65 6e 65 72 61 74 65 4b 65 79 50 61 69  C_GenerateKeyPai
324c0 72 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  r;..pFunctionLis
324d0 74 2d 3e 43 5f 57 72 61 70 4b 65 79 20 3d 20 43  t->C_WrapKey = C
324e0 5f 57 72 61 70 4b 65 79 3b 0a 09 70 46 75 6e 63  _WrapKey;..pFunc
324f0 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 55 6e 77 72  tionList->C_Unwr
32500 61 70 4b 65 79 20 3d 20 43 5f 55 6e 77 72 61 70  apKey = C_Unwrap
32510 4b 65 79 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  Key;..pFunctionL
32520 69 73 74 2d 3e 43 5f 44 65 72 69 76 65 4b 65 79  ist->C_DeriveKey
32530 20 3d 20 43 5f 44 65 72 69 76 65 4b 65 79 3b 0a   = C_DeriveKey;.
32540 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
32550 43 5f 53 65 65 64 52 61 6e 64 6f 6d 20 3d 20 43  C_SeedRandom = C
32560 5f 53 65 65 64 52 61 6e 64 6f 6d 3b 0a 09 70 46  _SeedRandom;..pF
32570 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47  unctionList->C_G
32580 65 6e 65 72 61 74 65 52 61 6e 64 6f 6d 20 3d 20  enerateRandom = 
32590 43 5f 47 65 6e 65 72 61 74 65 52 61 6e 64 6f 6d  C_GenerateRandom
325a0 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
325b0 2d 3e 43 5f 47 65 74 46 75 6e 63 74 69 6f 6e 53  ->C_GetFunctionS
325c0 74 61 74 75 73 20 3d 20 43 5f 47 65 74 46 75 6e  tatus = C_GetFun
325d0 63 74 69 6f 6e 53 74 61 74 75 73 3b 0a 09 70 46  ctionStatus;..pF
325e0 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 43  unctionList->C_C
325f0 61 6e 63 65 6c 46 75 6e 63 74 69 6f 6e 20 3d 20  ancelFunction = 
32600 43 5f 43 61 6e 63 65 6c 46 75 6e 63 74 69 6f 6e  C_CancelFunction
32610 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
32620 2d 3e 43 5f 47 65 74 46 75 6e 63 74 69 6f 6e 4c  ->C_GetFunctionL
32630 69 73 74 20 3d 20 43 5f 47 65 74 46 75 6e 63 74  ist = C_GetFunct
32640 69 6f 6e 4c 69 73 74 3b 0a 0a 09 2a 70 70 46 75  ionList;...*ppFu
32650 6e 63 74 69 6f 6e 4c 69 73 74 20 3d 20 70 46 75  nctionList = pFu
32660 6e 63 74 69 6f 6e 4c 69 73 74 3b 0a 0a 09 43 41  nctionList;...CA
32670 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
32680 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
32690 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f  _OK (%i)", CKR_O
326a0 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  K);...return(CKR
326b0 5f 4f 4b 29 3b 0a 7d 0a 0a                       _OK);.}..