Hex Artifact Content

Artifact 486977c92eff009bcc694eafd69cd181fc47b90e:


0000: 23 69 66 64 65 66 20 48 41 56 45 5f 43 4f 4e 46  #ifdef HAVE_CONF
0010: 49 47 5f 48 0a 23 69 6e 63 6c 75 64 65 20 22 63  IG_H.#include "c
0020: 6f 6e 66 69 67 2e 68 22 0a 23 65 6e 64 69 66 0a  onfig.h".#endif.
0030: 0a 23 69 66 64 65 66 20 48 41 56 45 5f 57 49 4e  .#ifdef HAVE_WIN
0040: 54 59 50 45 53 5f 48 0a 23 20 20 69 6e 63 6c 75  TYPES_H.#  inclu
0050: 64 65 20 3c 77 69 6e 74 79 70 65 73 2e 68 3e 0a  de <wintypes.h>.
0060: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 48 41  #endif.#ifdef HA
0070: 56 45 5f 50 43 53 43 4c 49 54 45 5f 48 0a 23 20  VE_PCSCLITE_H.# 
0080: 20 69 6e 63 6c 75 64 65 20 3c 70 63 73 63 6c 69   include <pcscli
0090: 74 65 2e 68 3e 0a 23 65 6e 64 69 66 0a 23 69 66  te.h>.#endif.#if
00a0: 64 65 66 20 48 41 56 45 5f 57 49 4e 53 43 41 52  def HAVE_WINSCAR
00b0: 44 5f 48 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c  D_H.#  include <
00c0: 77 69 6e 73 63 61 72 64 2e 68 3e 0a 23 65 6e 64  winscard.h>.#end
00d0: 69 66 0a 23 69 66 64 65 66 20 48 41 56 45 5f 53  if.#ifdef HAVE_S
00e0: 54 44 49 4e 54 5f 48 0a 23 20 20 69 6e 63 6c 75  TDINT_H.#  inclu
00f0: 64 65 20 3c 73 74 64 69 6e 74 2e 68 3e 0a 23 65  de <stdint.h>.#e
0100: 6e 64 69 66 0a 23 69 66 64 65 66 20 48 41 56 45  ndif.#ifdef HAVE
0110: 5f 49 4e 54 54 59 50 45 53 5f 48 0a 23 20 20 69  _INTTYPES_H.#  i
0120: 6e 63 6c 75 64 65 20 3c 69 6e 74 74 79 70 65 73  nclude <inttypes
0130: 2e 68 3e 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  .h>.#endif.#ifde
0140: 66 20 48 41 56 45 5f 53 54 44 4c 49 42 5f 48 0a  f HAVE_STDLIB_H.
0150: 23 20 20 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c  #  include <stdl
0160: 69 62 2e 68 3e 0a 23 65 6e 64 69 66 0a 23 69 66  ib.h>.#endif.#if
0170: 64 65 66 20 48 41 56 45 5f 55 4e 49 53 54 44 5f  def HAVE_UNISTD_
0180: 48 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 75 6e  H.#  include <un
0190: 69 73 74 64 2e 68 3e 0a 23 65 6e 64 69 66 0a 23  istd.h>.#endif.#
01a0: 69 66 64 65 66 20 48 41 56 45 5f 53 54 52 49 4e  ifdef HAVE_STRIN
01b0: 47 5f 48 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c  G_H.#  include <
01c0: 73 74 72 69 6e 67 2e 68 3e 0a 23 65 6e 64 69 66  string.h>.#endif
01d0: 0a 23 69 66 64 65 66 20 48 41 56 45 5f 50 54 48  .#ifdef HAVE_PTH
01e0: 52 45 41 44 5f 48 0a 23 20 20 69 6e 63 6c 75 64  READ_H.#  includ
01f0: 65 20 3c 70 74 68 72 65 61 64 2e 68 3e 0a 23 65  e <pthread.h>.#e
0200: 6e 64 69 66 0a 23 69 66 64 65 66 20 48 41 56 45  ndif.#ifdef HAVE
0210: 5f 4c 49 4d 49 54 53 5f 48 0a 23 20 20 69 6e 63  _LIMITS_H.#  inc
0220: 6c 75 64 65 20 3c 6c 69 6d 69 74 73 2e 68 3e 0a  lude <limits.h>.
0230: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 48 41  #endif.#ifdef HA
0240: 56 45 5f 53 54 44 49 4f 5f 48 0a 23 20 20 69 6e  VE_STDIO_H.#  in
0250: 63 6c 75 64 65 20 3c 73 74 64 69 6f 2e 68 3e 0a  clude <stdio.h>.
0260: 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 48  #endif.#define H
0270: 41 56 45 5f 45 52 52 4e 4f 5f 48 20 31 0a 23 69  AVE_ERRNO_H 1.#i
0280: 66 64 65 66 20 48 41 56 45 5f 45 52 52 4e 4f 5f  fdef HAVE_ERRNO_
0290: 48 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 65 72  H.#  include <er
02a0: 72 6e 6f 2e 68 3e 0a 23 65 6e 64 69 66 0a 23 69  rno.h>.#endif.#i
02b0: 66 64 65 66 20 48 41 56 45 5f 5a 4c 49 42 5f 48  fdef HAVE_ZLIB_H
02c0: 0a 23 20 20 69 66 64 65 66 20 48 41 56 45 5f 4c  .#  ifdef HAVE_L
02d0: 49 42 5a 0a 23 20 20 20 20 69 6e 63 6c 75 64 65  IBZ.#    include
02e0: 20 3c 7a 6c 69 62 2e 68 3e 0a 23 20 20 65 6e 64   <zlib.h>.#  end
02f0: 69 66 0a 23 65 6c 73 65 0a 23 20 20 69 66 64 65  if.#else.#  ifde
0300: 66 20 48 41 56 45 5f 4c 49 42 5a 0a 23 20 20 20  f HAVE_LIBZ.#   
0310: 20 75 6e 64 65 66 20 48 41 56 45 5f 4c 49 42 5a   undef HAVE_LIBZ
0320: 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69 66  .#  endif.#endif
0330: 0a 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f 44  .#ifdef CACKEY_D
0340: 45 42 55 47 5f 53 45 41 52 43 48 5f 53 50 45 45  EBUG_SEARCH_SPEE
0350: 44 54 45 53 54 0a 23 20 20 69 6e 63 6c 75 64 65  DTEST.#  include
0360: 20 3c 73 79 73 2f 74 69 6d 65 2e 68 3e 0a 23 65   <sys/time.h>.#e
0370: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 43 4b  ndif..#define CK
0380: 5f 50 54 52 20 2a 0a 23 64 65 66 69 6e 65 20 43  _PTR *.#define C
0390: 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
03a0: 4e 28 72 65 74 75 72 6e 54 79 70 65 2c 20 6e 61  N(returnType, na
03b0: 6d 65 29 20 72 65 74 75 72 6e 54 79 70 65 20 6e  me) returnType n
03c0: 61 6d 65 0a 23 64 65 66 69 6e 65 20 43 4b 5f 44  ame.#define CK_D
03d0: 45 43 4c 41 52 45 5f 46 55 4e 43 54 49 4f 4e 28  ECLARE_FUNCTION(
03e0: 72 65 74 75 72 6e 54 79 70 65 2c 20 6e 61 6d 65  returnType, name
03f0: 29 20 72 65 74 75 72 6e 54 79 70 65 20 6e 61 6d  ) returnType nam
0400: 65 0a 23 64 65 66 69 6e 65 20 43 4b 5f 44 45 43  e.#define CK_DEC
0410: 4c 41 52 45 5f 46 55 4e 43 54 49 4f 4e 5f 50 4f  LARE_FUNCTION_PO
0420: 49 4e 54 45 52 28 72 65 74 75 72 6e 54 79 70 65  INTER(returnType
0430: 2c 20 6e 61 6d 65 29 20 72 65 74 75 72 6e 54 79  , name) returnTy
0440: 70 65 20 28 2a 20 6e 61 6d 65 29 0a 23 64 65 66  pe (* name).#def
0450: 69 6e 65 20 43 4b 5f 43 41 4c 4c 42 41 43 4b 5f  ine CK_CALLBACK_
0460: 46 55 4e 43 54 49 4f 4e 28 72 65 74 75 72 6e 54  FUNCTION(returnT
0470: 79 70 65 2c 20 6e 61 6d 65 29 20 72 65 74 75 72  ype, name) retur
0480: 6e 54 79 70 65 20 28 2a 20 6e 61 6d 65 29 0a 23  nType (* name).#
0490: 69 66 6e 64 65 66 20 4e 55 4c 4c 5f 50 54 52 0a  ifndef NULL_PTR.
04a0: 23 20 20 64 65 66 69 6e 65 20 4e 55 4c 4c 5f 50  #  define NULL_P
04b0: 54 52 20 30 0a 23 65 6e 64 69 66 0a 0a 23 69 6e  TR 0.#endif..#in
04c0: 63 6c 75 64 65 20 22 70 6b 63 73 31 31 2e 68 22  clude "pkcs11.h"
04d0: 0a 23 69 6e 63 6c 75 64 65 20 22 70 6b 63 73 31  .#include "pkcs1
04e0: 31 6e 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22  1n.h".#include "
04f0: 61 73 6e 31 2d 78 35 30 39 2e 68 22 0a 23 69 6e  asn1-x509.h".#in
0500: 63 6c 75 64 65 20 22 73 68 61 31 2e 68 22 0a 23  clude "sha1.h".#
0510: 69 6e 63 6c 75 64 65 20 22 6d 64 35 2e 68 22 0a  include "md5.h".
0520: 0a 23 69 66 6e 64 65 66 20 43 41 43 4b 45 59 5f  .#ifndef CACKEY_
0530: 43 52 59 50 54 4f 4b 49 5f 56 45 52 53 49 4f 4e  CRYPTOKI_VERSION
0540: 5f 43 4f 44 45 0a 23 20 20 64 65 66 69 6e 65 20  _CODE.#  define 
0550: 43 41 43 4b 45 59 5f 43 52 59 50 54 4f 4b 49 5f  CACKEY_CRYPTOKI_
0560: 56 45 52 53 49 4f 4e 5f 43 4f 44 45 20 30 78 30  VERSION_CODE 0x0
0570: 32 31 65 30 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a  21e00.#endif../*
0580: 20 47 53 43 2d 49 53 20 76 32 2e 31 20 44 65 66   GSC-IS v2.1 Def
0590: 69 6e 69 74 69 6f 6e 73 20 2a 2f 0a 2f 2a 2a 20  initions */./** 
05a0: 43 6c 61 73 73 65 73 20 2a 2a 2f 0a 23 64 65 66  Classes **/.#def
05b0: 69 6e 65 20 47 53 43 49 53 5f 43 4c 41 53 53 5f  ine GSCIS_CLASS_
05c0: 49 53 4f 37 38 31 36 20 20 20 20 20 20 20 20 20  ISO7816         
05d0: 20 20 30 78 30 30 0a 23 64 65 66 69 6e 65 20 47    0x00.#define G
05e0: 53 43 49 53 5f 43 4c 41 53 53 5f 47 4c 4f 42 41  SCIS_CLASS_GLOBA
05f0: 4c 5f 50 4c 41 54 46 4f 52 4d 20 20 20 30 78 38  L_PLATFORM   0x8
0600: 30 0a 0a 2f 2a 2a 20 49 6e 73 74 72 75 63 74 69  0../** Instructi
0610: 6f 6e 73 20 2a 2a 2f 0a 23 64 65 66 69 6e 65 20  ons **/.#define 
0620: 47 53 43 49 53 5f 49 4e 53 54 52 5f 47 45 54 5f  GSCIS_INSTR_GET_
0630: 52 45 53 50 4f 4e 53 45 20 20 20 20 20 20 30 78  RESPONSE      0x
0640: 43 30 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53  C0.#define GSCIS
0650: 5f 49 4e 53 54 52 5f 52 45 41 44 5f 42 49 4e 41  _INSTR_READ_BINA
0660: 52 59 20 20 20 20 20 20 20 30 78 42 30 0a 23 64  RY       0xB0.#d
0670: 65 66 69 6e 65 20 47 53 43 49 53 5f 49 4e 53 54  efine GSCIS_INST
0680: 52 5f 55 50 44 41 54 45 5f 42 49 4e 41 52 59 20  R_UPDATE_BINARY 
0690: 20 20 20 20 30 78 44 36 0a 23 64 65 66 69 6e 65      0xD6.#define
06a0: 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 53 45 4c   GSCIS_INSTR_SEL
06b0: 45 43 54 20 20 20 20 20 20 20 20 20 20 20 20 30  ECT            0
06c0: 78 41 34 0a 23 64 65 66 69 6e 65 20 47 53 43 49  xA4.#define GSCI
06d0: 53 5f 49 4e 53 54 52 5f 45 58 54 45 52 4e 41 4c  S_INSTR_EXTERNAL
06e0: 5f 41 55 54 48 20 20 20 20 20 30 78 38 32 0a 23  _AUTH     0x82.#
06f0: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 49 4e 53  define GSCIS_INS
0700: 54 52 5f 47 45 54 5f 43 48 41 4c 4c 45 4e 47 45  TR_GET_CHALLENGE
0710: 20 20 20 20 20 30 78 38 34 0a 23 64 65 66 69 6e       0x84.#defin
0720: 65 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 49 4e  e GSCIS_INSTR_IN
0730: 54 45 52 4e 41 4c 5f 41 55 54 48 20 20 20 20 20  TERNAL_AUTH     
0740: 30 78 38 38 0a 23 64 65 66 69 6e 65 20 47 53 43  0x88.#define GSC
0750: 49 53 5f 49 4e 53 54 52 5f 56 45 52 49 46 59 20  IS_INSTR_VERIFY 
0760: 20 20 20 20 20 20 20 20 20 20 20 30 78 32 30 0a             0x20.
0770: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 49 4e  #define GSCIS_IN
0780: 53 54 52 5f 43 48 41 4e 47 45 5f 52 45 46 45 52  STR_CHANGE_REFER
0790: 45 4e 43 45 20 20 30 78 32 34 0a 23 64 65 66 69  ENCE  0x24.#defi
07a0: 6e 65 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 53  ne GSCIS_INSTR_S
07b0: 49 47 4e 20 20 20 20 20 20 20 20 20 20 20 20 20  IGN             
07c0: 20 30 78 32 41 0a 23 64 65 66 69 6e 65 20 47 53   0x2A.#define GS
07d0: 43 49 53 5f 49 4e 53 54 52 5f 47 45 54 5f 50 52  CIS_INSTR_GET_PR
07e0: 4f 50 20 20 20 20 20 20 20 20 20 20 30 78 35 36  OP          0x56
07f0: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 49  .#define GSCIS_I
0800: 4e 53 54 52 5f 47 45 54 5f 41 43 52 20 20 20 20  NSTR_GET_ACR    
0810: 20 20 20 20 20 20 20 30 78 34 43 0a 23 64 65 66         0x4C.#def
0820: 69 6e 65 20 47 53 43 49 53 5f 49 4e 53 54 52 5f  ine GSCIS_INSTR_
0830: 52 45 41 44 5f 42 55 46 46 45 52 20 20 20 20 20  READ_BUFFER     
0840: 20 20 30 78 35 32 0a 23 64 65 66 69 6e 65 20 47    0x52.#define G
0850: 53 43 49 53 5f 49 4e 53 54 52 5f 53 49 47 4e 44  SCIS_INSTR_SIGND
0860: 45 43 52 59 50 54 20 20 20 20 20 20 20 30 78 34  ECRYPT       0x4
0870: 32 0a 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53  2..#define GSCIS
0880: 5f 50 41 52 41 4d 5f 53 45 4c 45 43 54 5f 41 50  _PARAM_SELECT_AP
0890: 50 4c 45 54 20 20 20 20 20 30 78 30 34 0a 0a 2f  PLET     0x04../
08a0: 2a 2a 20 54 61 67 73 20 2a 2a 2f 0a 2f 2a 2a 2a  ** Tags **/./***
08b0: 20 43 43 43 20 54 61 67 73 20 2a 2a 2a 2f 0a 23   CCC Tags ***/.#
08c0: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47  define GSCIS_TAG
08d0: 5f 43 41 52 44 49 44 20 20 20 20 20 20 20 20 20  _CARDID         
08e0: 20 20 20 20 20 30 78 46 30 0a 23 64 65 66 69 6e       0xF0.#defin
08f0: 65 20 47 53 43 49 53 5f 54 41 47 5f 43 43 43 5f  e GSCIS_TAG_CCC_
0900: 56 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20  VER             
0910: 30 78 46 31 0a 23 64 65 66 69 6e 65 20 47 53 43  0xF1.#define GSC
0920: 49 53 5f 54 41 47 5f 43 43 47 5f 56 45 52 20 20  IS_TAG_CCG_VER  
0930: 20 20 20 20 20 20 20 20 20 20 20 30 78 46 32 0a             0xF2.
0940: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
0950: 47 5f 43 41 52 44 55 52 4c 20 20 20 20 20 20 20  G_CARDURL       
0960: 20 20 20 20 20 20 30 78 46 33 0a 23 64 65 66 69        0xF3.#defi
0970: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 50 4b 43  ne GSCIS_TAG_PKC
0980: 53 31 35 20 20 20 20 20 20 20 20 20 20 20 20 20  S15             
0990: 20 30 78 46 34 0a 23 64 65 66 69 6e 65 20 47 53   0xF4.#define GS
09a0: 43 49 53 5f 54 41 47 5f 52 45 47 5f 44 41 54 41  CIS_TAG_REG_DATA
09b0: 5f 4d 4f 44 45 4c 20 20 20 20 20 20 30 78 46 35  _MODEL      0xF5
09c0: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54  .#define GSCIS_T
09d0: 41 47 5f 41 43 52 5f 54 41 42 4c 45 20 20 20 20  AG_ACR_TABLE    
09e0: 20 20 20 20 20 20 20 30 78 46 36 0a 23 64 65 66         0xF6.#def
09f0: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 43 41  ine GSCIS_TAG_CA
0a00: 52 44 5f 41 50 44 55 20 20 20 20 20 20 20 20 20  RD_APDU         
0a10: 20 20 30 78 46 37 0a 23 64 65 66 69 6e 65 20 47    0xF7.#define G
0a20: 53 43 49 53 5f 54 41 47 5f 52 45 44 49 52 45 43  SCIS_TAG_REDIREC
0a30: 54 49 4f 4e 20 20 20 20 20 20 20 20 20 30 78 46  TION         0xF
0a40: 41 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f  A.#define GSCIS_
0a50: 54 41 47 5f 43 54 20 20 20 20 20 20 20 20 20 20  TAG_CT          
0a60: 20 20 20 20 20 20 20 20 30 78 46 42 0a 23 64 65          0xFB.#de
0a70: 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 53  fine GSCIS_TAG_S
0a80: 54 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  T               
0a90: 20 20 20 30 78 46 43 0a 23 64 65 66 69 6e 65 20     0xFC.#define 
0aa0: 47 53 43 49 53 5f 54 41 47 5f 4e 45 58 54 43 43  GSCIS_TAG_NEXTCC
0ab0: 43 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78  C             0x
0ac0: 46 44 0a 0a 2f 2a 2a 2a 20 47 65 6e 65 72 61 6c  FD../*** General
0ad0: 20 2d 20 45 46 20 32 32 30 30 20 2a 2a 2a 2f 0a   - EF 2200 ***/.
0ae0: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
0af0: 47 5f 46 4e 41 4d 45 20 20 20 20 20 20 20 20 20  G_FNAME         
0b00: 20 20 20 20 20 20 30 78 30 31 0a 23 64 65 66 69        0x01.#defi
0b10: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 4d 4e 41  ne GSCIS_TAG_MNA
0b20: 4d 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ME              
0b30: 20 30 78 30 32 0a 23 64 65 66 69 6e 65 20 47 53   0x02.#define GS
0b40: 43 49 53 5f 54 41 47 5f 4c 4e 41 4d 45 20 20 20  CIS_TAG_LNAME   
0b50: 20 20 20 20 20 20 20 20 20 20 20 20 30 78 30 33              0x03
0b60: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54  .#define GSCIS_T
0b70: 41 47 5f 53 55 46 46 49 58 20 20 20 20 20 20 20  AG_SUFFIX       
0b80: 20 20 20 20 20 20 20 30 78 30 34 0a 23 64 65 66         0x04.#def
0b90: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 47 4f  ine GSCIS_TAG_GO
0ba0: 56 54 5f 41 47 45 4e 43 59 20 20 20 20 20 20 20  VT_AGENCY       
0bb0: 20 20 30 78 30 35 0a 23 64 65 66 69 6e 65 20 47    0x05.#define G
0bc0: 53 43 49 53 5f 54 41 47 5f 42 55 52 45 41 55 20  SCIS_TAG_BUREAU 
0bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78 30               0x0
0be0: 36 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f  6.#define GSCIS_
0bf0: 54 41 47 5f 42 55 52 45 41 55 5f 43 4f 44 45 20  TAG_BUREAU_CODE 
0c00: 20 20 20 20 20 20 20 20 30 78 30 37 0a 23 64 65          0x07.#de
0c10: 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 44  fine GSCIS_TAG_D
0c20: 45 50 54 5f 43 4f 44 45 20 20 20 20 20 20 20 20  EPT_CODE        
0c30: 20 20 20 30 78 30 38 0a 23 64 65 66 69 6e 65 20     0x08.#define 
0c40: 47 53 43 49 53 5f 54 41 47 5f 54 49 54 4c 45 20  GSCIS_TAG_TITLE 
0c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78                0x
0c60: 30 39 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53  09.#define GSCIS
0c70: 5f 54 41 47 5f 42 55 49 4c 44 49 4e 47 20 20 20  _TAG_BUILDING   
0c80: 20 20 20 20 20 20 20 20 20 30 78 31 30 0a 23 64           0x10.#d
0c90: 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f  efine GSCIS_TAG_
0ca0: 4f 46 46 49 43 45 5f 41 44 44 52 31 20 20 20 20  OFFICE_ADDR1    
0cb0: 20 20 20 20 30 78 31 31 0a 23 64 65 66 69 6e 65      0x11.#define
0cc0: 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43   GSCIS_TAG_OFFIC
0cd0: 45 5f 41 44 44 52 32 20 20 20 20 20 20 20 20 30  E_ADDR2        0
0ce0: 78 31 32 0a 23 64 65 66 69 6e 65 20 47 53 43 49  x12.#define GSCI
0cf0: 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 43 49 54  S_TAG_OFFICE_CIT
0d00: 59 20 20 20 20 20 20 20 20 20 30 78 31 33 0a 23  Y         0x13.#
0d10: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47  define GSCIS_TAG
0d20: 5f 4f 46 46 49 43 45 5f 53 54 41 54 45 20 20 20  _OFFICE_STATE   
0d30: 20 20 20 20 20 30 78 31 34 0a 23 64 65 66 69 6e       0x14.#defin
0d40: 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49  e GSCIS_TAG_OFFI
0d50: 43 45 5f 5a 49 50 20 20 20 20 20 20 20 20 20 20  CE_ZIP          
0d60: 30 78 31 35 0a 23 64 65 66 69 6e 65 20 47 53 43  0x15.#define GSC
0d70: 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 43 4f  IS_TAG_OFFICE_CO
0d80: 55 4e 54 52 59 20 20 20 20 20 20 30 78 31 36 0a  UNTRY      0x16.
0d90: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
0da0: 47 5f 4f 46 46 49 43 45 5f 50 48 4f 4e 45 20 20  G_OFFICE_PHONE  
0db0: 20 20 20 20 20 20 30 78 31 37 0a 23 64 65 66 69        0x17.#defi
0dc0: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46  ne GSCIS_TAG_OFF
0dd0: 49 43 45 5f 50 48 4f 4e 45 5f 45 58 54 20 20 20  ICE_PHONE_EXT   
0de0: 20 30 78 31 38 0a 23 64 65 66 69 6e 65 20 47 53   0x18.#define GS
0df0: 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 46  CIS_TAG_OFFICE_F
0e00: 41 58 20 20 20 20 20 20 20 20 20 20 30 78 31 39  AX          0x19
0e10: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54  .#define GSCIS_T
0e20: 41 47 5f 4f 46 46 49 43 45 5f 45 4d 41 49 4c 20  AG_OFFICE_EMAIL 
0e30: 20 20 20 20 20 20 20 30 78 31 41 0a 23 64 65 66         0x1A.#def
0e40: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46  ine GSCIS_TAG_OF
0e50: 46 49 43 45 5f 52 4f 4f 4d 20 20 20 20 20 20 20  FICE_ROOM       
0e60: 20 20 30 78 31 42 0a 23 64 65 66 69 6e 65 20 47    0x1B.#define G
0e70: 53 43 49 53 5f 54 41 47 5f 4e 4f 4e 47 4f 56 5f  SCIS_TAG_NONGOV_
0e80: 41 47 45 4e 43 59 20 20 20 20 20 20 20 30 78 31  AGENCY       0x1
0e90: 43 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f  C.#define GSCIS_
0ea0: 54 41 47 5f 53 53 4e 5f 44 45 53 49 47 4e 41 54  TAG_SSN_DESIGNAT
0eb0: 4f 52 20 20 20 20 20 20 30 78 31 44 0a 0a 2f 2a  OR      0x1D../*
0ec0: 2a 2a 20 50 49 49 20 2d 20 45 46 20 32 31 30 30  ** PII - EF 2100
0ed0: 20 2a 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 47 53   ***/.#define GS
0ee0: 43 49 53 5f 54 41 47 5f 53 53 4e 20 20 20 20 20  CIS_TAG_SSN     
0ef0: 20 20 20 20 20 20 20 20 20 20 20 20 30 78 32 30              0x20
0f00: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54  .#define GSCIS_T
0f10: 41 47 5f 44 4f 42 20 20 20 20 20 20 20 20 20 20  AG_DOB          
0f20: 20 20 20 20 20 20 20 30 78 32 31 0a 23 64 65 66         0x21.#def
0f30: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 47 45  ine GSCIS_TAG_GE
0f40: 4e 44 45 52 20 20 20 20 20 20 20 20 20 20 20 20  NDER            
0f50: 20 20 30 78 32 32 0a 0a 2f 2a 2a 2a 20 4c 6f 67    0x22../*** Log
0f60: 69 6e 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d  in Information -
0f70: 20 45 46 20 34 30 30 30 20 2a 2a 2a 2f 0a 23 64   EF 4000 ***/.#d
0f80: 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f  efine GSCIS_TAG_
0f90: 55 53 45 52 49 44 20 20 20 20 20 20 20 20 20 20  USERID          
0fa0: 20 20 20 20 30 78 34 30 0a 23 64 65 66 69 6e 65      0x40.#define
0fb0: 20 47 53 43 49 53 5f 54 41 47 5f 44 4f 4d 41 49   GSCIS_TAG_DOMAI
0fc0: 4e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30  N              0
0fd0: 78 34 31 0a 23 64 65 66 69 6e 65 20 47 53 43 49  x41.#define GSCI
0fe0: 53 5f 54 41 47 5f 50 41 53 53 57 4f 52 44 20 20  S_TAG_PASSWORD  
0ff0: 20 20 20 20 20 20 20 20 20 20 30 78 34 32 0a 0a            0x42..
1000: 2f 2a 2a 2a 20 43 61 72 64 20 49 6e 66 6f 72 6d  /*** Card Inform
1010: 61 74 69 6f 6e 20 2d 20 45 46 20 35 30 30 30 20  ation - EF 5000 
1020: 2a 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 47 53 43  ***/.#define GSC
1030: 49 53 5f 54 41 47 5f 49 53 53 55 45 52 49 44 20  IS_TAG_ISSUERID 
1040: 20 20 20 20 20 20 20 20 20 20 20 30 78 35 30 0a             0x50.
1050: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
1060: 47 5f 53 45 52 4e 4f 20 20 20 20 20 20 20 20 20  G_SERNO         
1070: 20 20 20 20 20 20 30 78 35 31 0a 23 64 65 66 69        0x51.#defi
1080: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 49 53 53  ne GSCIS_TAG_ISS
1090: 55 45 5f 44 41 54 45 20 20 20 20 20 20 20 20 20  UE_DATE         
10a0: 20 30 78 35 32 0a 23 64 65 66 69 6e 65 20 47 53   0x52.#define GS
10b0: 43 49 53 5f 54 41 47 5f 45 58 50 49 52 45 5f 44  CIS_TAG_EXPIRE_D
10c0: 41 54 45 20 20 20 20 20 20 20 20 20 30 78 35 33  ATE         0x53
10d0: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54  .#define GSCIS_T
10e0: 41 47 5f 43 41 52 44 5f 54 59 50 45 20 20 20 20  AG_CARD_TYPE    
10f0: 20 20 20 20 20 20 20 30 78 35 34 0a 23 64 65 66         0x54.#def
1100: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 53 45  ine GSCIS_TAG_SE
1110: 43 55 52 49 54 59 5f 43 4f 44 45 20 20 20 20 20  CURITY_CODE     
1120: 20 20 30 78 35 37 0a 23 64 65 66 69 6e 65 20 47    0x57.#define G
1130: 53 43 49 53 5f 54 41 47 5f 43 41 52 44 49 44 5f  SCIS_TAG_CARDID_
1140: 41 49 44 20 20 20 20 20 20 20 20 20 20 30 78 35  AID          0x5
1150: 38 0a 0a 2f 2a 2a 2a 20 50 49 56 20 43 6f 64 65  8../*** PIV Code
1160: 73 20 2a 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e  s ***/.#define N
1170: 49 53 54 53 50 38 30 30 5f 37 33 5f 33 5f 49 4e  ISTSP800_73_3_IN
1180: 53 54 52 5f 47 45 54 5f 44 41 54 41 20 30 78 43  STR_GET_DATA 0xC
1190: 42 0a 23 64 65 66 69 6e 65 20 4e 49 53 54 53 50  B.#define NISTSP
11a0: 38 30 30 5f 37 33 5f 33 5f 49 4e 53 54 52 5f 47  800_73_3_INSTR_G
11b0: 45 4e 41 55 54 48 20 20 30 78 38 37 0a 0a 2f 2a  ENAUTH  0x87../*
11c0: 2a 2a 20 50 4b 49 20 49 6e 66 6f 72 6d 61 74 69  ** PKI Informati
11d0: 6f 6e 20 2d 20 45 46 20 37 30 30 30 20 2a 2a 2a  on - EF 7000 ***
11e0: 2f 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f  /.#define GSCIS_
11f0: 54 41 47 5f 43 45 52 54 49 46 49 43 41 54 45 20  TAG_CERTIFICATE 
1200: 20 20 20 20 20 20 20 20 30 78 37 30 0a 23 64 65          0x70.#de
1210: 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 43  fine GSCIS_TAG_C
1220: 45 52 54 5f 49 53 53 55 45 5f 44 41 54 45 20 20  ERT_ISSUE_DATE  
1230: 20 20 20 30 78 37 31 0a 23 64 65 66 69 6e 65 20     0x71.#define 
1240: 47 53 43 49 53 5f 54 41 47 5f 43 45 52 54 5f 45  GSCIS_TAG_CERT_E
1250: 58 50 49 52 45 5f 44 41 54 45 20 20 20 20 30 78  XPIRE_DATE    0x
1260: 37 32 0a 0a 2f 2a 2a 20 41 70 70 6c 65 74 20 49  72../** Applet I
1270: 44 73 20 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 47  Ds **/.#define G
1280: 53 43 49 53 5f 41 49 44 5f 43 43 43 20 20 20 20  SCIS_AID_CCC    
1290: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78 41               0xA
12a0: 30 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30  0, 0x00, 0x00, 0
12b0: 78 30 31 2c 20 30 78 31 36 2c 20 30 78 44 42 2c  x01, 0x16, 0xDB,
12c0: 20 30 78 30 30 0a 23 64 65 66 69 6e 65 20 4e 49   0x00.#define NI
12d0: 53 54 53 50 38 30 30 5f 37 33 5f 33 5f 50 49 56  STSP800_73_3_PIV
12e0: 5f 41 49 44 20 20 20 20 20 20 20 20 30 78 41 30  _AID        0xA0
12f0: 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78  , 0x00, 0x00, 0x
1300: 30 33 2c 20 30 78 30 38 2c 20 30 78 30 30 2c 20  03, 0x08, 0x00, 
1310: 30 78 30 30 2c 20 30 78 31 30 2c 20 30 78 30 30  0x00, 0x10, 0x00
1320: 2c 20 30 78 30 31 2c 20 30 78 30 30 0a 0a 2f 2a  , 0x01, 0x00../*
1330: 20 50 49 56 20 49 44 73 20 2a 2f 0a 2f 2a 2a 20   PIV IDs */./** 
1340: 4b 65 79 20 49 64 65 6e 74 69 66 69 65 72 73 20  Key Identifiers 
1350: 28 4e 49 53 54 20 53 50 20 38 30 30 2d 37 38 2d  (NIST SP 800-78-
1360: 33 2c 20 54 61 62 6c 65 20 36 2d 31 20 2a 2a 2f  3, Table 6-1 **/
1370: 0a 23 64 65 66 69 6e 65 20 4e 49 53 54 53 50 38  .#define NISTSP8
1380: 30 30 5f 37 38 5f 33 5f 4b 45 59 5f 50 49 56 41  00_78_3_KEY_PIVA
1390: 55 54 48 20 20 20 30 78 39 41 0a 23 64 65 66 69  UTH   0x9A.#defi
13a0: 6e 65 20 4e 49 53 54 53 50 38 30 30 5f 37 38 5f  ne NISTSP800_78_
13b0: 33 5f 4b 45 59 5f 53 49 47 4e 41 54 55 52 45 20  3_KEY_SIGNATURE 
13c0: 30 78 39 43 0a 23 64 65 66 69 6e 65 20 4e 49 53  0x9C.#define NIS
13d0: 54 53 50 38 30 30 5f 37 38 5f 33 5f 4b 45 59 5f  TSP800_78_3_KEY_
13e0: 4b 45 59 4d 47 54 20 20 20 20 30 78 39 44 0a 23  KEYMGT    0x9D.#
13f0: 64 65 66 69 6e 65 20 4e 49 53 54 53 50 38 30 30  define NISTSP800
1400: 5f 37 38 5f 33 5f 4b 45 59 5f 43 41 52 44 41 55  _78_3_KEY_CARDAU
1410: 54 48 20 20 30 78 39 45 0a 0a 2f 2a 2a 20 41 6c  TH  0x9E../** Al
1420: 67 6f 72 69 74 68 6d 20 49 64 65 6e 74 69 66 69  gorithm Identifi
1430: 65 72 73 20 28 4e 49 53 54 20 53 50 20 38 30 30  ers (NIST SP 800
1440: 2d 37 38 2d 33 2c 20 54 61 62 6c 65 20 36 2d 32  -78-3, Table 6-2
1450: 20 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 49 53   **/.#define NIS
1460: 54 53 50 38 30 30 5f 37 38 5f 33 5f 41 4c 47 4f  TSP800_78_3_ALGO
1470: 5f 52 53 41 31 30 32 34 20 20 30 78 30 36 0a 23  _RSA1024  0x06.#
1480: 64 65 66 69 6e 65 20 4e 49 53 54 53 50 38 30 30  define NISTSP800
1490: 5f 37 38 5f 33 5f 41 4c 47 4f 5f 52 53 41 32 30  _78_3_ALGO_RSA20
14a0: 34 38 20 20 30 78 30 37 0a 0a 2f 2a 2a 20 4f 62  48  0x07../** Ob
14b0: 6a 65 63 74 20 49 64 65 6e 74 69 66 69 65 72 73  ject Identifiers
14c0: 20 28 4e 49 53 54 20 53 50 20 38 30 30 2d 37 33   (NIST SP 800-73
14d0: 2d 33 20 50 61 72 74 20 31 2c 20 54 61 62 6c 65  -3 Part 1, Table
14e0: 20 32 29 20 2a 2a 2f 0a 23 64 65 66 69 6e 65 20   2) **/.#define 
14f0: 4e 49 53 54 53 50 38 30 30 5f 37 33 5f 33 5f 4f  NISTSP800_73_3_O
1500: 49 44 5f 50 49 56 41 55 54 48 20 20 20 30 78 35  ID_PIVAUTH   0x5
1510: 46 2c 20 30 78 43 31 2c 20 30 78 30 35 0a 23 64  F, 0xC1, 0x05.#d
1520: 65 66 69 6e 65 20 4e 49 53 54 53 50 38 30 30 5f  efine NISTSP800_
1530: 37 33 5f 33 5f 4f 49 44 5f 53 49 47 4e 41 54 55  73_3_OID_SIGNATU
1540: 52 45 20 30 78 35 46 2c 20 30 78 43 31 2c 20 30  RE 0x5F, 0xC1, 0
1550: 78 30 41 0a 23 64 65 66 69 6e 65 20 4e 49 53 54  x0A.#define NIST
1560: 53 50 38 30 30 5f 37 33 5f 33 5f 4f 49 44 5f 4b  SP800_73_3_OID_K
1570: 45 59 4d 47 54 20 20 20 20 30 78 35 46 2c 20 30  EYMGT    0x5F, 0
1580: 78 43 31 2c 20 30 78 30 42 0a 23 64 65 66 69 6e  xC1, 0x0B.#defin
1590: 65 20 4e 49 53 54 53 50 38 30 30 5f 37 33 5f 33  e NISTSP800_73_3
15a0: 5f 4f 49 44 5f 43 41 52 44 41 55 54 48 20 20 30  _OID_CARDAUTH  0
15b0: 78 35 46 2c 20 30 78 43 31 2c 20 30 78 30 31 0a  x5F, 0xC1, 0x01.
15c0: 0a 2f 2a 20 4d 61 78 69 6d 75 6d 20 73 69 7a 65  ./* Maximum size
15d0: 20 6f 66 20 64 61 74 61 20 70 6f 72 74 69 6f 6e   of data portion
15e0: 20 6f 66 20 41 50 44 55 73 20 2a 2f 0a 2f 2a 2a   of APDUs */./**
15f0: 20 44 6f 20 6e 6f 74 20 73 65 74 20 74 68 69 73   Do not set this
1600: 20 61 62 6f 76 65 20 32 35 30 20 2a 2a 2f 0a 23   above 250 **/.#
1610: 64 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 41 50  define CACKEY_AP
1620: 44 55 5f 4d 54 55 20 20 20 20 20 20 20 20 20 20  DU_MTU          
1630: 20 20 20 20 20 32 35 30 0a 0a 2f 2a 20 41 54 52       250../* ATR
1640: 20 49 66 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c   If not availabl
1650: 65 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4d 41 58  e */.#ifndef MAX
1660: 5f 41 54 52 5f 53 49 5a 45 0a 23 64 65 66 69 6e  _ATR_SIZE.#defin
1670: 65 20 4d 41 58 5f 41 54 52 5f 53 49 5a 45 20 31  e MAX_ATR_SIZE 1
1680: 30 32 34 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64  024.#endif..#ifd
1690: 65 66 20 43 41 43 4b 45 59 5f 44 45 42 55 47 0a  ef CACKEY_DEBUG.
16a0: 23 20 20 69 66 64 65 66 20 48 41 56 45 5f 54 49  #  ifdef HAVE_TI
16b0: 4d 45 5f 48 0a 23 20 20 20 20 69 6e 63 6c 75 64  ME_H.#    includ
16c0: 65 20 3c 74 69 6d 65 2e 68 3e 0a 73 74 61 74 69  e <time.h>.stati
16d0: 63 20 74 69 6d 65 5f 74 20 63 61 63 6b 65 79 5f  c time_t cackey_
16e0: 64 65 62 75 67 5f 73 74 61 72 74 5f 74 69 6d 65  debug_start_time
16f0: 20 3d 20 30 3b 0a 73 74 61 74 69 63 20 75 6e 73   = 0;.static uns
1700: 69 67 6e 65 64 20 6c 6f 6e 67 20 43 41 43 4b 45  igned long CACKE
1710: 59 5f 44 45 42 55 47 5f 47 45 54 54 49 4d 45 28  Y_DEBUG_GETTIME(
1720: 76 6f 69 64 29 20 7b 0a 09 69 66 20 28 63 61 63  void) {..if (cac
1730: 6b 65 79 5f 64 65 62 75 67 5f 73 74 61 72 74 5f  key_debug_start_
1740: 74 69 6d 65 20 3d 3d 20 30 29 20 7b 0a 09 09 63  time == 0) {...c
1750: 61 63 6b 65 79 5f 64 65 62 75 67 5f 73 74 61 72  ackey_debug_star
1760: 74 5f 74 69 6d 65 20 3d 20 74 69 6d 65 28 4e 55  t_time = time(NU
1770: 4c 4c 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e  LL);..}...return
1780: 28 74 69 6d 65 28 4e 55 4c 4c 29 20 2d 20 63 61  (time(NULL) - ca
1790: 63 6b 65 79 5f 64 65 62 75 67 5f 73 74 61 72 74  ckey_debug_start
17a0: 5f 74 69 6d 65 29 3b 0a 7d 0a 23 20 20 65 6c 73  _time);.}.#  els
17b0: 65 0a 73 74 61 74 69 63 20 75 6e 73 69 67 6e 65  e.static unsigne
17c0: 64 20 6c 6f 6e 67 20 43 41 43 4b 45 59 5f 44 45  d long CACKEY_DE
17d0: 42 55 47 5f 47 45 54 54 49 4d 45 28 76 6f 69 64  BUG_GETTIME(void
17e0: 29 20 7b 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a  ) {..return(0);.
17f0: 7d 0a 23 20 20 65 6e 64 69 66 0a 0a 23 20 20 64  }.#  endif..#  d
1800: 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 44 45 42  efine CACKEY_DEB
1810: 55 47 5f 50 52 49 4e 54 46 28 78 2e 2e 2e 29 20  UG_PRINTF(x...) 
1820: 7b 20 5c 0a 09 73 74 61 74 69 63 20 63 68 61 72  { \..static char
1830: 20 62 75 66 5f 75 73 65 72 5b 34 30 39 36 5d 20   buf_user[4096] 
1840: 3d 20 7b 30 7d 3b 20 5c 0a 09 73 6e 70 72 69 6e  = {0}; \..snprin
1850: 74 66 28 62 75 66 5f 75 73 65 72 2c 20 73 69 7a  tf(buf_user, siz
1860: 65 6f 66 28 62 75 66 5f 75 73 65 72 29 2c 20 78  eof(buf_user), x
1870: 29 3b 20 5c 0a 09 62 75 66 5f 75 73 65 72 5b 73  ); \..buf_user[s
1880: 69 7a 65 6f 66 28 62 75 66 5f 75 73 65 72 29 20  izeof(buf_user) 
1890: 2d 20 31 5d 20 3d 20 27 5c 30 27 3b 20 5c 0a 09  - 1] = '\0'; \..
18a0: 66 70 72 69 6e 74 66 28 63 61 63 6b 65 79 5f 64  fprintf(cackey_d
18b0: 65 62 75 67 5f 66 64 28 29 2c 20 22 5b 25 6c 75  ebug_fd(), "[%lu
18c0: 5d 3a 20 25 73 28 29 3a 25 69 3a 20 25 73 5c 6e  ]: %s():%i: %s\n
18d0: 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ", CACKEY_DEBUG_
18e0: 47 45 54 54 49 4d 45 28 29 2c 20 5f 5f 66 75 6e  GETTIME(), __fun
18f0: 63 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f 5f 2c 20 62  c__, __LINE__, b
1900: 75 66 5f 75 73 65 72 29 3b 20 5c 0a 09 66 66 6c  uf_user); \..ffl
1910: 75 73 68 28 63 61 63 6b 65 79 5f 64 65 62 75 67  ush(cackey_debug
1920: 5f 66 64 28 29 29 3b 20 5c 0a 7d 0a 23 20 20 64  _fd()); \.}.#  d
1930: 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 44 45 42  efine CACKEY_DEB
1940: 55 47 5f 50 52 49 4e 54 42 55 46 28 66 2c 20 78  UG_PRINTBUF(f, x
1950: 2c 20 79 29 20 7b 20 5c 0a 09 73 74 61 74 69 63  , y) { \..static
1960: 20 63 68 61 72 20 62 75 66 5f 75 73 65 72 5b 34   char buf_user[4
1970: 30 39 36 5d 20 3d 20 7b 30 7d 2c 20 2a 62 75 66  096] = {0}, *buf
1980: 5f 75 73 65 72 5f 70 2c 20 2a 62 75 66 5f 75 73  _user_p, *buf_us
1990: 65 72 5f 70 72 69 6e 74 3b 20 5c 0a 09 75 6e 73  er_print; \..uns
19a0: 69 67 6e 65 64 20 6c 6f 6e 67 20 62 75 66 5f 75  igned long buf_u
19b0: 73 65 72 5f 73 69 7a 65 3b 20 5c 0a 09 75 6e 73  ser_size; \..uns
19c0: 69 67 6e 65 64 20 63 68 61 72 20 2a 54 4d 50 42  igned char *TMPB
19d0: 55 46 3b 20 5c 0a 09 75 6e 73 69 67 6e 65 64 20  UF; \..unsigned 
19e0: 6c 6f 6e 67 20 69 64 78 3b 20 5c 0a 09 69 6e 74  long idx; \..int
19f0: 20 73 6e 70 72 69 6e 74 66 5f 72 65 74 3b 20 5c   snprintf_ret; \
1a00: 0a 09 54 4d 50 42 55 46 20 3d 20 28 75 6e 73 69  ..TMPBUF = (unsi
1a10: 67 6e 65 64 20 63 68 61 72 20 2a 29 20 28 78 29  gned char *) (x)
1a20: 3b 20 5c 0a 09 62 75 66 5f 75 73 65 72 5b 30 5d  ; \..buf_user[0]
1a30: 20 3d 20 30 3b 20 5c 0a 09 62 75 66 5f 75 73 65   = 0; \..buf_use
1a40: 72 5b 32 5d 20 3d 20 30 3b 20 5c 0a 09 62 75 66  r[2] = 0; \..buf
1a50: 5f 75 73 65 72 5f 70 20 3d 20 62 75 66 5f 75 73  _user_p = buf_us
1a60: 65 72 3b 20 5c 0a 09 62 75 66 5f 75 73 65 72 5f  er; \..buf_user_
1a70: 73 69 7a 65 20 3d 20 73 69 7a 65 6f 66 28 62 75  size = sizeof(bu
1a80: 66 5f 75 73 65 72 29 3b 20 5c 0a 09 66 6f 72 20  f_user); \..for 
1a90: 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20  (idx = 0; idx < 
1aa0: 28 79 29 3b 20 69 64 78 2b 2b 29 20 7b 20 5c 0a  (y); idx++) { \.
1ab0: 09 09 69 66 20 28 62 75 66 5f 75 73 65 72 5f 73  ..if (buf_user_s
1ac0: 69 7a 65 20 3c 3d 20 30 29 20 7b 20 5c 0a 09 09  ize <= 0) { \...
1ad0: 09 62 72 65 61 6b 3b 20 5c 0a 09 09 7d 3b 20 5c  .break; \...}; \
1ae0: 0a 09 09 73 6e 70 72 69 6e 74 66 5f 72 65 74 20  ...snprintf_ret 
1af0: 3d 20 73 6e 70 72 69 6e 74 66 28 62 75 66 5f 75  = snprintf(buf_u
1b00: 73 65 72 5f 70 2c 20 62 75 66 5f 75 73 65 72 5f  ser_p, buf_user_
1b10: 73 69 7a 65 2c 20 22 2c 20 25 30 32 78 22 2c 20  size, ", %02x", 
1b20: 54 4d 50 42 55 46 5b 69 64 78 5d 29 3b 20 5c 0a  TMPBUF[idx]); \.
1b30: 09 09 69 66 20 28 73 6e 70 72 69 6e 74 66 5f 72  ..if (snprintf_r
1b40: 65 74 20 3c 3d 20 30 29 20 7b 20 5c 0a 09 09 09  et <= 0) { \....
1b50: 62 72 65 61 6b 3b 20 5c 0a 09 09 7d 3b 20 5c 0a  break; \...}; \.
1b60: 09 09 62 75 66 5f 75 73 65 72 5f 70 20 2b 3d 20  ..buf_user_p += 
1b70: 73 6e 70 72 69 6e 74 66 5f 72 65 74 3b 20 5c 0a  snprintf_ret; \.
1b80: 09 09 62 75 66 5f 75 73 65 72 5f 73 69 7a 65 20  ..buf_user_size 
1b90: 2d 3d 20 73 6e 70 72 69 6e 74 66 5f 72 65 74 3b  -= snprintf_ret;
1ba0: 20 5c 0a 09 7d 3b 20 5c 0a 09 62 75 66 5f 75 73   \..}; \..buf_us
1bb0: 65 72 5b 73 69 7a 65 6f 66 28 62 75 66 5f 75 73  er[sizeof(buf_us
1bc0: 65 72 29 20 2d 20 31 5d 20 3d 20 27 5c 30 27 3b  er) - 1] = '\0';
1bd0: 20 5c 0a 09 62 75 66 5f 75 73 65 72 5f 70 72 69   \..buf_user_pri
1be0: 6e 74 20 3d 20 62 75 66 5f 75 73 65 72 20 2b 20  nt = buf_user + 
1bf0: 32 3b 20 5c 0a 09 66 70 72 69 6e 74 66 28 63 61  2; \..fprintf(ca
1c00: 63 6b 65 79 5f 64 65 62 75 67 5f 66 64 28 29 2c  ckey_debug_fd(),
1c10: 20 22 5b 25 6c 75 5d 3a 20 25 73 28 29 3a 25 69   "[%lu]: %s():%i
1c20: 3a 20 25 73 20 20 28 25 73 2f 25 6c 75 20 3d 20  : %s  (%s/%lu = 
1c30: 7b 25 73 7d 29 5c 6e 22 2c 20 43 41 43 4b 45 59  {%s})\n", CACKEY
1c40: 5f 44 45 42 55 47 5f 47 45 54 54 49 4d 45 28 29  _DEBUG_GETTIME()
1c50: 2c 20 5f 5f 66 75 6e 63 5f 5f 2c 20 5f 5f 4c 49  , __func__, __LI
1c60: 4e 45 5f 5f 2c 20 66 2c 20 23 78 2c 20 28 75 6e  NE__, f, #x, (un
1c70: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 28 79 29  signed long) (y)
1c80: 2c 20 62 75 66 5f 75 73 65 72 5f 70 72 69 6e 74  , buf_user_print
1c90: 29 3b 20 5c 0a 09 66 66 6c 75 73 68 28 63 61 63  ); \..fflush(cac
1ca0: 6b 65 79 5f 64 65 62 75 67 5f 66 64 28 29 29 3b  key_debug_fd());
1cb0: 20 5c 0a 7d 0a 23 20 20 64 65 66 69 6e 65 20 66   \.}.#  define f
1cc0: 72 65 65 28 78 29 20 7b 20 43 41 43 4b 45 59 5f  ree(x) { CACKEY_
1cd0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 52  DEBUG_PRINTF("FR
1ce0: 45 45 28 25 70 29 20 28 25 73 29 22 2c 20 28 76  EE(%p) (%s)", (v
1cf0: 6f 69 64 20 2a 29 20 78 2c 20 23 78 29 3b 20 66  oid *) x, #x); f
1d00: 72 65 65 28 78 29 3b 20 7d 0a 0a 73 74 61 74 69  ree(x); }..stati
1d10: 63 20 46 49 4c 45 20 2a 63 61 63 6b 65 79 5f 64  c FILE *cackey_d
1d20: 65 62 75 67 5f 66 64 28 76 6f 69 64 29 20 7b 0a  ebug_fd(void) {.
1d30: 09 73 74 61 74 69 63 20 46 49 4c 45 20 2a 66 64  .static FILE *fd
1d40: 20 3d 20 4e 55 4c 4c 3b 0a 09 63 68 61 72 20 2a   = NULL;..char *
1d50: 6c 6f 67 66 69 6c 65 3b 0a 0a 09 69 66 20 28 66  logfile;...if (f
1d60: 64 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72  d != NULL) {...r
1d70: 65 74 75 72 6e 28 66 64 29 3b 0a 09 7d 0a 0a 09  eturn(fd);..}...
1d80: 2f 2a 0a 09 20 2a 20 4c 6f 67 20 74 6f 20 73 74  /*.. * Log to st
1d90: 64 65 72 72 20 69 6e 69 74 69 61 6c 6c 79 20 73  derr initially s
1da0: 6f 20 77 65 20 63 61 6e 20 75 73 65 20 64 65 62  o we can use deb
1db0: 75 67 67 69 6e 67 20 77 69 74 68 69 6e 0a 09 20  ugging within.. 
1dc0: 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * this function 
1dd0: 77 69 74 68 6f 75 74 20 67 65 74 74 69 6e 67 20  without getting 
1de0: 69 6e 74 6f 20 61 6e 20 69 6e 66 69 6e 69 74 65  into an infinite
1df0: 20 6c 6f 6f 70 0a 09 20 2a 2f 0a 09 66 64 20 3d   loop.. */..fd =
1e00: 20 73 74 64 65 72 72 3b 0a 0a 09 6c 6f 67 66 69   stderr;...logfi
1e10: 6c 65 20 3d 20 67 65 74 65 6e 76 28 22 43 41 43  le = getenv("CAC
1e20: 4b 45 59 5f 44 45 42 55 47 5f 4c 4f 47 46 49 4c  KEY_DEBUG_LOGFIL
1e30: 45 22 29 3b 0a 09 69 66 20 28 6c 6f 67 66 69 6c  E");..if (logfil
1e40: 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  e != NULL) {...C
1e50: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1e60: 54 46 28 22 46 6f 75 6e 64 20 65 6e 76 69 72 6f  TF("Found enviro
1e70: 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65 3a 20  nment variable: 
1e80: 25 73 22 2c 20 6c 6f 67 66 69 6c 65 29 3b 0a 0a  %s", logfile);..
1e90: 09 09 6c 6f 67 66 69 6c 65 20 3d 20 73 74 72 63  ..logfile = strc
1ea0: 68 72 28 6c 6f 67 66 69 6c 65 2c 20 27 3d 27 29  hr(logfile, '=')
1eb0: 3b 0a 09 09 69 66 20 28 6c 6f 67 66 69 6c 65 20  ;...if (logfile 
1ec0: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 6c 6f  == NULL) {....lo
1ed0: 67 66 69 6c 65 20 3d 20 67 65 74 65 6e 76 28 22  gfile = getenv("
1ee0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 4c 4f 47  CACKEY_DEBUG_LOG
1ef0: 46 49 4c 45 22 29 3b 0a 09 09 7d 20 65 6c 73 65  FILE");...} else
1f00: 20 7b 0a 09 09 09 6c 6f 67 66 69 6c 65 2b 2b 3b   {....logfile++;
1f10: 0a 09 09 7d 0a 09 7d 0a 0a 23 69 66 64 65 66 20  ...}..}..#ifdef 
1f20: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 4c 4f 47  CACKEY_DEBUG_LOG
1f30: 46 49 4c 45 0a 09 69 66 20 28 6c 6f 67 66 69 6c  FILE..if (logfil
1f40: 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 6c  e == NULL) {...l
1f50: 6f 67 66 69 6c 65 20 3d 20 43 41 43 4b 45 59 5f  ogfile = CACKEY_
1f60: 44 45 42 55 47 5f 4c 4f 47 46 49 4c 45 3b 0a 09  DEBUG_LOGFILE;..
1f70: 7d 0a 23 65 6e 64 69 66 0a 0a 09 69 66 20 28 6c  }.#endif...if (l
1f80: 6f 67 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20  ogfile != NULL) 
1f90: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1fa0: 5f 50 52 49 4e 54 46 28 22 46 6f 75 6e 64 20 6c  _PRINTF("Found l
1fb0: 6f 67 20 66 69 6c 65 3a 20 25 73 22 2c 20 6c 6f  og file: %s", lo
1fc0: 67 66 69 6c 65 29 3b 0a 0a 09 09 66 64 20 3d 20  gfile);....fd = 
1fd0: 66 6f 70 65 6e 28 6c 6f 67 66 69 6c 65 2c 20 22  fopen(logfile, "
1fe0: 61 22 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 66 64  a");..}...if (fd
1ff0: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 66 64   == NULL) {...fd
2000: 20 3d 20 73 74 64 65 72 72 3b 0a 09 7d 0a 0a 09   = stderr;..}...
2010: 69 66 20 28 66 64 20 3d 3d 20 73 74 64 65 72 72  if (fd == stderr
2020: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
2030: 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
2040: 6e 69 6e 67 20 73 74 64 65 72 72 22 29 3b 0a 09  ning stderr");..
2050: 7d 20 65 6c 73 65 20 7b 0a 09 09 43 41 43 4b 45  } else {...CACKE
2060: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2070: 52 65 74 75 72 6e 69 6e 67 20 25 70 22 2c 20 28  Returning %p", (
2080: 76 6f 69 64 20 2a 29 20 66 64 29 3b 0a 09 7d 0a  void *) fd);..}.
2090: 0a 09 72 65 74 75 72 6e 28 66 64 29 3b 0a 7d 0a  ..return(fd);.}.
20a0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 43 41  .static void *CA
20b0: 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
20c0: 4d 41 4c 4c 4f 43 28 73 69 7a 65 5f 74 20 73 69  MALLOC(size_t si
20d0: 7a 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ze, const char *
20e0: 66 75 6e 63 2c 20 69 6e 74 20 6c 69 6e 65 29 20  func, int line) 
20f0: 7b 0a 09 76 6f 69 64 20 2a 72 65 74 76 61 6c 3b  {..void *retval;
2100: 0a 0a 09 72 65 74 76 61 6c 20 3d 20 6d 61 6c 6c  ...retval = mall
2110: 6f 63 28 73 69 7a 65 29 3b 0a 0a 09 66 70 72 69  oc(size);...fpri
2120: 6e 74 66 28 63 61 63 6b 65 79 5f 64 65 62 75 67  ntf(cackey_debug
2130: 5f 66 64 28 29 2c 20 22 5b 25 6c 75 5d 3a 20 25  _fd(), "[%lu]: %
2140: 73 28 29 3a 25 69 3a 20 4d 41 4c 4c 4f 43 28 29  s():%i: MALLOC()
2150: 20 3d 20 25 70 5c 6e 22 2c 20 43 41 43 4b 45 59   = %p\n", CACKEY
2160: 5f 44 45 42 55 47 5f 47 45 54 54 49 4d 45 28 29  _DEBUG_GETTIME()
2170: 2c 20 66 75 6e 63 2c 20 6c 69 6e 65 2c 20 72 65  , func, line, re
2180: 74 76 61 6c 29 3b 0a 09 66 66 6c 75 73 68 28 63  tval);..fflush(c
2190: 61 63 6b 65 79 5f 64 65 62 75 67 5f 66 64 28 29  ackey_debug_fd()
21a0: 29 3b 0a 0a 09 72 65 74 75 72 6e 28 72 65 74 76  );...return(retv
21b0: 61 6c 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  al);.}..static v
21c0: 6f 69 64 20 2a 43 41 43 4b 45 59 5f 44 45 42 55  oid *CACKEY_DEBU
21d0: 47 5f 46 55 4e 43 5f 52 45 41 4c 4c 4f 43 28 76  G_FUNC_REALLOC(v
21e0: 6f 69 64 20 2a 70 74 72 2c 20 73 69 7a 65 5f 74  oid *ptr, size_t
21f0: 20 73 69 7a 65 2c 20 63 6f 6e 73 74 20 63 68 61   size, const cha
2200: 72 20 2a 66 75 6e 63 2c 20 69 6e 74 20 6c 69 6e  r *func, int lin
2210: 65 29 20 7b 0a 09 76 6f 69 64 20 2a 72 65 74 76  e) {..void *retv
2220: 61 6c 3b 0a 0a 09 72 65 74 76 61 6c 20 3d 20 72  al;...retval = r
2230: 65 61 6c 6c 6f 63 28 70 74 72 2c 20 73 69 7a 65  ealloc(ptr, size
2240: 29 3b 0a 0a 09 69 66 20 28 72 65 74 76 61 6c 20  );...if (retval 
2250: 21 3d 20 70 74 72 29 20 7b 0a 09 09 66 70 72 69  != ptr) {...fpri
2260: 6e 74 66 28 63 61 63 6b 65 79 5f 64 65 62 75 67  ntf(cackey_debug
2270: 5f 66 64 28 29 2c 20 22 5b 25 6c 75 5d 3a 20 25  _fd(), "[%lu]: %
2280: 73 28 29 3a 25 69 3a 20 52 45 41 4c 4c 4f 43 28  s():%i: REALLOC(
2290: 25 70 29 20 3d 20 25 70 5c 6e 22 2c 20 43 41 43  %p) = %p\n", CAC
22a0: 4b 45 59 5f 44 45 42 55 47 5f 47 45 54 54 49 4d  KEY_DEBUG_GETTIM
22b0: 45 28 29 2c 20 66 75 6e 63 2c 20 6c 69 6e 65 2c  E(), func, line,
22c0: 20 70 74 72 2c 20 72 65 74 76 61 6c 29 3b 0a 09   ptr, retval);..
22d0: 09 66 66 6c 75 73 68 28 63 61 63 6b 65 79 5f 64  .fflush(cackey_d
22e0: 65 62 75 67 5f 66 64 28 29 29 3b 0a 09 7d 0a 0a  ebug_fd());..}..
22f0: 09 69 66 20 28 72 65 74 76 61 6c 20 3d 3d 20 4e  .if (retval == N
2300: 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
2310: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2a  DEBUG_PRINTF(" *
2320: 2a 2a 20 45 52 52 4f 52 20 2a 2a 2a 20 72 65 61  ** ERROR *** rea
2330: 6c 6c 6f 63 20 72 65 74 75 72 6e 65 64 20 4e 55  lloc returned NU
2340: 4c 4c 20 28 73 69 7a 65 20 3d 20 25 6c 75 29 22  LL (size = %lu)"
2350: 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
2360: 29 20 73 69 7a 65 29 3b 0a 09 7d 0a 0a 09 72 65  ) size);..}...re
2370: 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a  turn(retval);.}.
2380: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 43 41  .static char *CA
2390: 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
23a0: 53 54 52 44 55 50 28 63 6f 6e 73 74 20 63 68 61  STRDUP(const cha
23b0: 72 20 2a 70 74 72 2c 20 63 6f 6e 73 74 20 63 68  r *ptr, const ch
23c0: 61 72 20 2a 66 75 6e 63 2c 20 69 6e 74 20 6c 69  ar *func, int li
23d0: 6e 65 29 20 7b 0a 09 63 68 61 72 20 2a 72 65 74  ne) {..char *ret
23e0: 76 61 6c 3b 0a 0a 09 72 65 74 76 61 6c 20 3d 20  val;...retval = 
23f0: 73 74 72 64 75 70 28 70 74 72 29 3b 0a 0a 09 66  strdup(ptr);...f
2400: 70 72 69 6e 74 66 28 63 61 63 6b 65 79 5f 64 65  printf(cackey_de
2410: 62 75 67 5f 66 64 28 29 2c 20 22 5b 25 6c 75 5d  bug_fd(), "[%lu]
2420: 3a 20 25 73 28 29 3a 25 69 3a 20 53 54 52 44 55  : %s():%i: STRDU
2430: 50 5f 4d 41 4c 4c 4f 43 28 29 20 3d 20 25 70 5c  P_MALLOC() = %p\
2440: 6e 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47  n", CACKEY_DEBUG
2450: 5f 47 45 54 54 49 4d 45 28 29 2c 20 66 75 6e 63  _GETTIME(), func
2460: 2c 20 6c 69 6e 65 2c 20 72 65 74 76 61 6c 29 3b  , line, retval);
2470: 0a 09 66 66 6c 75 73 68 28 63 61 63 6b 65 79 5f  ..fflush(cackey_
2480: 64 65 62 75 67 5f 66 64 28 29 29 3b 0a 0a 09 72  debug_fd());...r
2490: 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d  eturn(retval);.}
24a0: 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  ..static const c
24b0: 68 61 72 20 2a 43 41 43 4b 45 59 5f 44 45 42 55  har *CACKEY_DEBU
24c0: 47 5f 46 55 4e 43 5f 54 41 47 5f 54 4f 5f 53 54  G_FUNC_TAG_TO_ST
24d0: 52 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  R(unsigned char 
24e0: 74 61 67 29 20 7b 0a 09 73 77 69 74 63 68 20 28  tag) {..switch (
24f0: 74 61 67 29 20 7b 0a 09 09 63 61 73 65 20 47 53  tag) {...case GS
2500: 43 49 53 5f 54 41 47 5f 43 41 52 44 49 44 3a 0a  CIS_TAG_CARDID:.
2510: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
2520: 5f 54 41 47 5f 43 41 52 44 49 44 22 29 3b 0a 09  _TAG_CARDID");..
2530: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
2540: 43 43 43 5f 56 45 52 3a 0a 09 09 09 72 65 74 75  CCC_VER:....retu
2550: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 43 43  rn("GSCIS_TAG_CC
2560: 43 5f 56 45 52 22 29 3b 0a 09 09 63 61 73 65 20  C_VER");...case 
2570: 47 53 43 49 53 5f 54 41 47 5f 43 43 47 5f 56 45  GSCIS_TAG_CCG_VE
2580: 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  R:....return("GS
2590: 43 49 53 5f 54 41 47 5f 43 43 47 5f 56 45 52 22  CIS_TAG_CCG_VER"
25a0: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
25b0: 54 41 47 5f 43 41 52 44 55 52 4c 3a 0a 09 09 09  TAG_CARDURL:....
25c0: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
25d0: 47 5f 43 41 52 44 55 52 4c 22 29 3b 0a 09 09 63  G_CARDURL");...c
25e0: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 50 4b  ase GSCIS_TAG_PK
25f0: 43 53 31 35 3a 0a 09 09 09 72 65 74 75 72 6e 28  CS15:....return(
2600: 22 47 53 43 49 53 5f 54 41 47 5f 50 4b 43 53 31  "GSCIS_TAG_PKCS1
2610: 35 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  5");...case GSCI
2620: 53 5f 54 41 47 5f 52 45 47 5f 44 41 54 41 5f 4d  S_TAG_REG_DATA_M
2630: 4f 44 45 4c 3a 0a 09 09 09 72 65 74 75 72 6e 28  ODEL:....return(
2640: 22 47 53 43 49 53 5f 54 41 47 5f 52 45 47 5f 44  "GSCIS_TAG_REG_D
2650: 41 54 41 5f 4d 4f 44 45 4c 22 29 3b 0a 09 09 63  ATA_MODEL");...c
2660: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 41 43  ase GSCIS_TAG_AC
2670: 52 5f 54 41 42 4c 45 3a 0a 09 09 09 72 65 74 75  R_TABLE:....retu
2680: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 41 43  rn("GSCIS_TAG_AC
2690: 52 5f 54 41 42 4c 45 22 29 3b 0a 09 09 63 61 73  R_TABLE");...cas
26a0: 65 20 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44  e GSCIS_TAG_CARD
26b0: 5f 41 50 44 55 3a 0a 09 09 09 72 65 74 75 72 6e  _APDU:....return
26c0: 28 22 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44  ("GSCIS_TAG_CARD
26d0: 5f 41 50 44 55 22 29 3b 0a 09 09 63 61 73 65 20  _APDU");...case 
26e0: 47 53 43 49 53 5f 54 41 47 5f 52 45 44 49 52 45  GSCIS_TAG_REDIRE
26f0: 43 54 49 4f 4e 3a 0a 09 09 09 72 65 74 75 72 6e  CTION:....return
2700: 28 22 47 53 43 49 53 5f 54 41 47 5f 52 45 44 49  ("GSCIS_TAG_REDI
2710: 52 45 43 54 49 4f 4e 22 29 3b 0a 09 09 63 61 73  RECTION");...cas
2720: 65 20 47 53 43 49 53 5f 54 41 47 5f 43 54 3a 0a  e GSCIS_TAG_CT:.
2730: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
2740: 5f 54 41 47 5f 43 54 22 29 3b 0a 09 09 63 61 73  _TAG_CT");...cas
2750: 65 20 47 53 43 49 53 5f 54 41 47 5f 53 54 3a 0a  e GSCIS_TAG_ST:.
2760: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
2770: 5f 54 41 47 5f 53 54 22 29 3b 0a 09 09 63 61 73  _TAG_ST");...cas
2780: 65 20 47 53 43 49 53 5f 54 41 47 5f 4e 45 58 54  e GSCIS_TAG_NEXT
2790: 43 43 43 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  CCC:....return("
27a0: 47 53 43 49 53 5f 54 41 47 5f 4e 45 58 54 43 43  GSCIS_TAG_NEXTCC
27b0: 43 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  C");...case GSCI
27c0: 53 5f 54 41 47 5f 46 4e 41 4d 45 3a 0a 09 09 09  S_TAG_FNAME:....
27d0: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
27e0: 47 5f 46 4e 41 4d 45 22 29 3b 0a 09 09 63 61 73  G_FNAME");...cas
27f0: 65 20 47 53 43 49 53 5f 54 41 47 5f 4d 4e 41 4d  e GSCIS_TAG_MNAM
2800: 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  E:....return("GS
2810: 43 49 53 5f 54 41 47 5f 4d 4e 41 4d 45 22 29 3b  CIS_TAG_MNAME");
2820: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
2830: 47 5f 4c 4e 41 4d 45 3a 0a 09 09 09 72 65 74 75  G_LNAME:....retu
2840: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4c 4e  rn("GSCIS_TAG_LN
2850: 41 4d 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53  AME");...case GS
2860: 43 49 53 5f 54 41 47 5f 53 55 46 46 49 58 3a 0a  CIS_TAG_SUFFIX:.
2870: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
2880: 5f 54 41 47 5f 53 55 46 46 49 58 22 29 3b 0a 09  _TAG_SUFFIX");..
2890: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
28a0: 47 4f 56 54 5f 41 47 45 4e 43 59 3a 0a 09 09 09  GOVT_AGENCY:....
28b0: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
28c0: 47 5f 47 4f 56 54 5f 41 47 45 4e 43 59 22 29 3b  G_GOVT_AGENCY");
28d0: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
28e0: 47 5f 42 55 52 45 41 55 3a 0a 09 09 09 72 65 74  G_BUREAU:....ret
28f0: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 42  urn("GSCIS_TAG_B
2900: 55 52 45 41 55 22 29 3b 0a 09 09 63 61 73 65 20  UREAU");...case 
2910: 47 53 43 49 53 5f 54 41 47 5f 42 55 52 45 41 55  GSCIS_TAG_BUREAU
2920: 5f 43 4f 44 45 3a 0a 09 09 09 72 65 74 75 72 6e  _CODE:....return
2930: 28 22 47 53 43 49 53 5f 54 41 47 5f 42 55 52 45  ("GSCIS_TAG_BURE
2940: 41 55 5f 43 4f 44 45 22 29 3b 0a 09 09 63 61 73  AU_CODE");...cas
2950: 65 20 47 53 43 49 53 5f 54 41 47 5f 44 45 50 54  e GSCIS_TAG_DEPT
2960: 5f 43 4f 44 45 3a 0a 09 09 09 72 65 74 75 72 6e  _CODE:....return
2970: 28 22 47 53 43 49 53 5f 54 41 47 5f 44 45 50 54  ("GSCIS_TAG_DEPT
2980: 5f 43 4f 44 45 22 29 3b 0a 09 09 63 61 73 65 20  _CODE");...case 
2990: 47 53 43 49 53 5f 54 41 47 5f 54 49 54 4c 45 3a  GSCIS_TAG_TITLE:
29a0: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49  ....return("GSCI
29b0: 53 5f 54 41 47 5f 54 49 54 4c 45 22 29 3b 0a 09  S_TAG_TITLE");..
29c0: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
29d0: 42 55 49 4c 44 49 4e 47 3a 0a 09 09 09 72 65 74  BUILDING:....ret
29e0: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 42  urn("GSCIS_TAG_B
29f0: 55 49 4c 44 49 4e 47 22 29 3b 0a 09 09 63 61 73  UILDING");...cas
2a00: 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49  e GSCIS_TAG_OFFI
2a10: 43 45 5f 41 44 44 52 31 3a 0a 09 09 09 72 65 74  CE_ADDR1:....ret
2a20: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4f  urn("GSCIS_TAG_O
2a30: 46 46 49 43 45 5f 41 44 44 52 31 22 29 3b 0a 09  FFICE_ADDR1");..
2a40: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
2a50: 4f 46 46 49 43 45 5f 41 44 44 52 32 3a 0a 09 09  OFFICE_ADDR2:...
2a60: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
2a70: 41 47 5f 4f 46 46 49 43 45 5f 41 44 44 52 32 22  AG_OFFICE_ADDR2"
2a80: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
2a90: 54 41 47 5f 4f 46 46 49 43 45 5f 43 49 54 59 3a  TAG_OFFICE_CITY:
2aa0: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49  ....return("GSCI
2ab0: 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 43 49 54  S_TAG_OFFICE_CIT
2ac0: 59 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  Y");...case GSCI
2ad0: 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 53 54 41  S_TAG_OFFICE_STA
2ae0: 54 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47  TE:....return("G
2af0: 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f  SCIS_TAG_OFFICE_
2b00: 53 54 41 54 45 22 29 3b 0a 09 09 63 61 73 65 20  STATE");...case 
2b10: 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45  GSCIS_TAG_OFFICE
2b20: 5f 5a 49 50 3a 0a 09 09 09 72 65 74 75 72 6e 28  _ZIP:....return(
2b30: 22 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43  "GSCIS_TAG_OFFIC
2b40: 45 5f 5a 49 50 22 29 3b 0a 09 09 63 61 73 65 20  E_ZIP");...case 
2b50: 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45  GSCIS_TAG_OFFICE
2b60: 5f 43 4f 55 4e 54 52 59 3a 0a 09 09 09 72 65 74  _COUNTRY:....ret
2b70: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4f  urn("GSCIS_TAG_O
2b80: 46 46 49 43 45 5f 43 4f 55 4e 54 52 59 22 29 3b  FFICE_COUNTRY");
2b90: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
2ba0: 47 5f 4f 46 46 49 43 45 5f 50 48 4f 4e 45 3a 0a  G_OFFICE_PHONE:.
2bb0: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
2bc0: 5f 54 41 47 5f 4f 46 46 49 43 45 5f 50 48 4f 4e  _TAG_OFFICE_PHON
2bd0: 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  E");...case GSCI
2be0: 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 50 48 4f  S_TAG_OFFICE_PHO
2bf0: 4e 45 5f 45 58 54 3a 0a 09 09 09 72 65 74 75 72  NE_EXT:....retur
2c00: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4f 46 46  n("GSCIS_TAG_OFF
2c10: 49 43 45 5f 50 48 4f 4e 45 5f 45 58 54 22 29 3b  ICE_PHONE_EXT");
2c20: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
2c30: 47 5f 4f 46 46 49 43 45 5f 46 41 58 3a 0a 09 09  G_OFFICE_FAX:...
2c40: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
2c50: 41 47 5f 4f 46 46 49 43 45 5f 46 41 58 22 29 3b  AG_OFFICE_FAX");
2c60: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
2c70: 47 5f 4f 46 46 49 43 45 5f 45 4d 41 49 4c 3a 0a  G_OFFICE_EMAIL:.
2c80: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
2c90: 5f 54 41 47 5f 4f 46 46 49 43 45 5f 45 4d 41 49  _TAG_OFFICE_EMAI
2ca0: 4c 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  L");...case GSCI
2cb0: 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 52 4f 4f  S_TAG_OFFICE_ROO
2cc0: 4d 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  M:....return("GS
2cd0: 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 52  CIS_TAG_OFFICE_R
2ce0: 4f 4f 4d 22 29 3b 0a 09 09 63 61 73 65 20 47 53  OOM");...case GS
2cf0: 43 49 53 5f 54 41 47 5f 4e 4f 4e 47 4f 56 5f 41  CIS_TAG_NONGOV_A
2d00: 47 45 4e 43 59 3a 0a 09 09 09 72 65 74 75 72 6e  GENCY:....return
2d10: 28 22 47 53 43 49 53 5f 54 41 47 5f 4e 4f 4e 47  ("GSCIS_TAG_NONG
2d20: 4f 56 5f 41 47 45 4e 43 59 22 29 3b 0a 09 09 63  OV_AGENCY");...c
2d30: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 53 53  ase GSCIS_TAG_SS
2d40: 4e 5f 44 45 53 49 47 4e 41 54 4f 52 3a 0a 09 09  N_DESIGNATOR:...
2d50: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
2d60: 41 47 5f 53 53 4e 5f 44 45 53 49 47 4e 41 54 4f  AG_SSN_DESIGNATO
2d70: 52 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  R");...case GSCI
2d80: 53 5f 54 41 47 5f 53 53 4e 3a 0a 09 09 09 72 65  S_TAG_SSN:....re
2d90: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
2da0: 53 53 4e 22 29 3b 0a 09 09 63 61 73 65 20 47 53  SSN");...case GS
2db0: 43 49 53 5f 54 41 47 5f 44 4f 42 3a 0a 09 09 09  CIS_TAG_DOB:....
2dc0: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
2dd0: 47 5f 44 4f 42 22 29 3b 0a 09 09 63 61 73 65 20  G_DOB");...case 
2de0: 47 53 43 49 53 5f 54 41 47 5f 47 45 4e 44 45 52  GSCIS_TAG_GENDER
2df0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
2e00: 49 53 5f 54 41 47 5f 47 45 4e 44 45 52 22 29 3b  IS_TAG_GENDER");
2e10: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
2e20: 47 5f 55 53 45 52 49 44 3a 0a 09 09 09 72 65 74  G_USERID:....ret
2e30: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 55  urn("GSCIS_TAG_U
2e40: 53 45 52 49 44 22 29 3b 0a 09 09 63 61 73 65 20  SERID");...case 
2e50: 47 53 43 49 53 5f 54 41 47 5f 44 4f 4d 41 49 4e  GSCIS_TAG_DOMAIN
2e60: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
2e70: 49 53 5f 54 41 47 5f 44 4f 4d 41 49 4e 22 29 3b  IS_TAG_DOMAIN");
2e80: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
2e90: 47 5f 50 41 53 53 57 4f 52 44 3a 0a 09 09 09 72  G_PASSWORD:....r
2ea0: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
2eb0: 5f 50 41 53 53 57 4f 52 44 22 29 3b 0a 09 09 63  _PASSWORD");...c
2ec0: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 49 53  ase GSCIS_TAG_IS
2ed0: 53 55 45 52 49 44 3a 0a 09 09 09 72 65 74 75 72  SUERID:....retur
2ee0: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 49 53 53  n("GSCIS_TAG_ISS
2ef0: 55 45 52 49 44 22 29 3b 0a 09 09 63 61 73 65 20  UERID");...case 
2f00: 47 53 43 49 53 5f 54 41 47 5f 53 45 52 4e 4f 3a  GSCIS_TAG_SERNO:
2f10: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49  ....return("GSCI
2f20: 53 5f 54 41 47 5f 53 45 52 4e 4f 22 29 3b 0a 09  S_TAG_SERNO");..
2f30: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
2f40: 49 53 53 55 45 5f 44 41 54 45 3a 0a 09 09 09 72  ISSUE_DATE:....r
2f50: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
2f60: 5f 49 53 53 55 45 5f 44 41 54 45 22 29 3b 0a 09  _ISSUE_DATE");..
2f70: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
2f80: 45 58 50 49 52 45 5f 44 41 54 45 3a 0a 09 09 09  EXPIRE_DATE:....
2f90: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
2fa0: 47 5f 45 58 50 49 52 45 5f 44 41 54 45 22 29 3b  G_EXPIRE_DATE");
2fb0: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
2fc0: 47 5f 43 41 52 44 5f 54 59 50 45 3a 0a 09 09 09  G_CARD_TYPE:....
2fd0: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
2fe0: 47 5f 43 41 52 44 5f 54 59 50 45 22 29 3b 0a 09  G_CARD_TYPE");..
2ff0: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
3000: 53 45 43 55 52 49 54 59 5f 43 4f 44 45 3a 0a 09  SECURITY_CODE:..
3010: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
3020: 54 41 47 5f 53 45 43 55 52 49 54 59 5f 43 4f 44  TAG_SECURITY_COD
3030: 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  E");...case GSCI
3040: 53 5f 54 41 47 5f 43 41 52 44 49 44 5f 41 49 44  S_TAG_CARDID_AID
3050: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
3060: 49 53 5f 54 41 47 5f 43 41 52 44 49 44 5f 41 49  IS_TAG_CARDID_AI
3070: 44 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  D");...case GSCI
3080: 53 5f 54 41 47 5f 43 45 52 54 49 46 49 43 41 54  S_TAG_CERTIFICAT
3090: 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  E:....return("GS
30a0: 43 49 53 5f 54 41 47 5f 43 45 52 54 49 46 49 43  CIS_TAG_CERTIFIC
30b0: 41 54 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53  ATE");...case GS
30c0: 43 49 53 5f 54 41 47 5f 43 45 52 54 5f 49 53 53  CIS_TAG_CERT_ISS
30d0: 55 45 5f 44 41 54 45 3a 0a 09 09 09 72 65 74 75  UE_DATE:....retu
30e0: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 43 45  rn("GSCIS_TAG_CE
30f0: 52 54 5f 49 53 53 55 45 5f 44 41 54 45 22 29 3b  RT_ISSUE_DATE");
3100: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
3110: 47 5f 43 45 52 54 5f 45 58 50 49 52 45 5f 44 41  G_CERT_EXPIRE_DA
3120: 54 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47  TE:....return("G
3130: 53 43 49 53 5f 54 41 47 5f 43 45 52 54 5f 45 58  SCIS_TAG_CERT_EX
3140: 50 49 52 45 5f 44 41 54 45 22 29 3b 0a 09 7d 0a  PIRE_DATE");..}.
3150: 0a 09 72 65 74 75 72 6e 28 22 55 4e 4b 4e 4f 57  ..return("UNKNOW
3160: 4e 22 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 63  N");.}..static c
3170: 6f 6e 73 74 20 63 68 61 72 20 2a 43 41 43 4b 45  onst char *CACKE
3180: 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41  Y_DEBUG_FUNC_SCA
3190: 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 4c 4f 4e  RDERR_TO_STR(LON
31a0: 47 20 72 65 74 63 6f 64 65 29 20 7b 0a 09 73 77  G retcode) {..sw
31b0: 69 74 63 68 20 28 72 65 74 63 6f 64 65 29 20 7b  itch (retcode) {
31c0: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 53 5f  ...case SCARD_S_
31d0: 53 55 43 43 45 53 53 3a 0a 09 09 09 72 65 74 75  SUCCESS:....retu
31e0: 72 6e 28 22 53 43 41 52 44 5f 53 5f 53 55 43 43  rn("SCARD_S_SUCC
31f0: 45 53 53 22 29 3b 0a 09 09 63 61 73 65 20 53 43  ESS");...case SC
3200: 41 52 44 5f 45 5f 43 41 4e 43 45 4c 4c 45 44 3a  ARD_E_CANCELLED:
3210: 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52  ....return("SCAR
3220: 44 5f 45 5f 43 41 4e 43 45 4c 4c 45 44 22 29 3b  D_E_CANCELLED");
3230: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
3240: 43 41 4e 54 5f 44 49 53 50 4f 53 45 3a 0a 09 09  CANT_DISPOSE:...
3250: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45  .return("SCARD_E
3260: 5f 43 41 4e 54 5f 44 49 53 50 4f 53 45 22 29 3b  _CANT_DISPOSE");
3270: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
3280: 49 4e 53 55 46 46 49 43 49 45 4e 54 5f 42 55 46  INSUFFICIENT_BUF
3290: 46 45 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  FER:....return("
32a0: 53 43 41 52 44 5f 45 5f 49 4e 53 55 46 46 49 43  SCARD_E_INSUFFIC
32b0: 49 45 4e 54 5f 42 55 46 46 45 52 22 29 3b 0a 09  IENT_BUFFER");..
32c0: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 49 4e  .case SCARD_E_IN
32d0: 56 41 4c 49 44 5f 41 54 52 3a 0a 09 09 09 72 65  VALID_ATR:....re
32e0: 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 49 4e  turn("SCARD_E_IN
32f0: 56 41 4c 49 44 5f 41 54 52 22 29 3b 0a 09 09 63  VALID_ATR");...c
3300: 61 73 65 20 53 43 41 52 44 5f 45 5f 49 4e 56 41  ase SCARD_E_INVA
3310: 4c 49 44 5f 48 41 4e 44 4c 45 3a 0a 09 09 09 72  LID_HANDLE:....r
3320: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 49  eturn("SCARD_E_I
3330: 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 22 29 3b  NVALID_HANDLE");
3340: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
3350: 49 4e 56 41 4c 49 44 5f 50 41 52 41 4d 45 54 45  INVALID_PARAMETE
3360: 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43  R:....return("SC
3370: 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 50 41  ARD_E_INVALID_PA
3380: 52 41 4d 45 54 45 52 22 29 3b 0a 09 09 63 61 73  RAMETER");...cas
3390: 65 20 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49  e SCARD_E_INVALI
33a0: 44 5f 54 41 52 47 45 54 3a 0a 09 09 09 72 65 74  D_TARGET:....ret
33b0: 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 49 4e 56  urn("SCARD_E_INV
33c0: 41 4c 49 44 5f 54 41 52 47 45 54 22 29 3b 0a 09  ALID_TARGET");..
33d0: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 49 4e  .case SCARD_E_IN
33e0: 56 41 4c 49 44 5f 56 41 4c 55 45 3a 0a 09 09 09  VALID_VALUE:....
33f0: 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f  return("SCARD_E_
3400: 49 4e 56 41 4c 49 44 5f 56 41 4c 55 45 22 29 3b  INVALID_VALUE");
3410: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
3420: 4e 4f 5f 4d 45 4d 4f 52 59 3a 0a 09 09 09 72 65  NO_MEMORY:....re
3430: 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 4e 4f  turn("SCARD_E_NO
3440: 5f 4d 45 4d 4f 52 59 22 29 3b 0a 09 09 63 61 73  _MEMORY");...cas
3450: 65 20 53 43 41 52 44 5f 45 5f 55 4e 4b 4e 4f 57  e SCARD_E_UNKNOW
3460: 4e 5f 52 45 41 44 45 52 3a 0a 09 09 09 72 65 74  N_READER:....ret
3470: 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 55 4e 4b  urn("SCARD_E_UNK
3480: 4e 4f 57 4e 5f 52 45 41 44 45 52 22 29 3b 0a 09  NOWN_READER");..
3490: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 54 49  .case SCARD_E_TI
34a0: 4d 45 4f 55 54 3a 0a 09 09 09 72 65 74 75 72 6e  MEOUT:....return
34b0: 28 22 53 43 41 52 44 5f 45 5f 54 49 4d 45 4f 55  ("SCARD_E_TIMEOU
34c0: 54 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52  T");...case SCAR
34d0: 44 5f 45 5f 53 48 41 52 49 4e 47 5f 56 49 4f 4c  D_E_SHARING_VIOL
34e0: 41 54 49 4f 4e 3a 0a 09 09 09 72 65 74 75 72 6e  ATION:....return
34f0: 28 22 53 43 41 52 44 5f 45 5f 53 48 41 52 49 4e  ("SCARD_E_SHARIN
3500: 47 5f 56 49 4f 4c 41 54 49 4f 4e 22 29 3b 0a 09  G_VIOLATION");..
3510: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 4e 4f  .case SCARD_E_NO
3520: 5f 53 4d 41 52 54 43 41 52 44 3a 0a 09 09 09 72  _SMARTCARD:....r
3530: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 4e  eturn("SCARD_E_N
3540: 4f 5f 53 4d 41 52 54 43 41 52 44 22 29 3b 0a 09  O_SMARTCARD");..
3550: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 55 4e  .case SCARD_E_UN
3560: 4b 4e 4f 57 4e 5f 43 41 52 44 3a 0a 09 09 09 72  KNOWN_CARD:....r
3570: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 55  eturn("SCARD_E_U
3580: 4e 4b 4e 4f 57 4e 5f 43 41 52 44 22 29 3b 0a 09  NKNOWN_CARD");..
3590: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 50 52  .case SCARD_E_PR
35a0: 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 3a 0a 09 09  OTO_MISMATCH:...
35b0: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45  .return("SCARD_E
35c0: 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 22  _PROTO_MISMATCH"
35d0: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  );...case SCARD_
35e0: 45 5f 4e 4f 54 5f 52 45 41 44 59 3a 0a 09 09 09  E_NOT_READY:....
35f0: 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f  return("SCARD_E_
3600: 4e 4f 54 5f 52 45 41 44 59 22 29 3b 0a 09 09 63  NOT_READY");...c
3610: 61 73 65 20 53 43 41 52 44 5f 45 5f 53 59 53 54  ase SCARD_E_SYST
3620: 45 4d 5f 43 41 4e 43 45 4c 4c 45 44 3a 0a 09 09  EM_CANCELLED:...
3630: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45  .return("SCARD_E
3640: 5f 53 59 53 54 45 4d 5f 43 41 4e 43 45 4c 4c 45  _SYSTEM_CANCELLE
3650: 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52  D");...case SCAR
3660: 44 5f 45 5f 4e 4f 54 5f 54 52 41 4e 53 41 43 54  D_E_NOT_TRANSACT
3670: 45 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53  ED:....return("S
3680: 43 41 52 44 5f 45 5f 4e 4f 54 5f 54 52 41 4e 53  CARD_E_NOT_TRANS
3690: 41 43 54 45 44 22 29 3b 0a 09 09 63 61 73 65 20  ACTED");...case 
36a0: 53 43 41 52 44 5f 45 5f 52 45 41 44 45 52 5f 55  SCARD_E_READER_U
36b0: 4e 41 56 41 49 4c 41 42 4c 45 3a 0a 09 09 09 72  NAVAILABLE:....r
36c0: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 52  eturn("SCARD_E_R
36d0: 45 41 44 45 52 5f 55 4e 41 56 41 49 4c 41 42 4c  EADER_UNAVAILABL
36e0: 45 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52  E");...case SCAR
36f0: 44 5f 57 5f 55 4e 53 55 50 50 4f 52 54 45 44 5f  D_W_UNSUPPORTED_
3700: 43 41 52 44 3a 0a 09 09 09 72 65 74 75 72 6e 28  CARD:....return(
3710: 22 53 43 41 52 44 5f 57 5f 55 4e 53 55 50 50 4f  "SCARD_W_UNSUPPO
3720: 52 54 45 44 5f 43 41 52 44 22 29 3b 0a 09 09 63  RTED_CARD");...c
3730: 61 73 65 20 53 43 41 52 44 5f 57 5f 55 4e 52 45  ase SCARD_W_UNRE
3740: 53 50 4f 4e 53 49 56 45 5f 43 41 52 44 3a 0a 09  SPONSIVE_CARD:..
3750: 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f  ..return("SCARD_
3760: 57 5f 55 4e 52 45 53 50 4f 4e 53 49 56 45 5f 43  W_UNRESPONSIVE_C
3770: 41 52 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43  ARD");...case SC
3780: 41 52 44 5f 57 5f 55 4e 50 4f 57 45 52 45 44 5f  ARD_W_UNPOWERED_
3790: 43 41 52 44 3a 0a 09 09 09 72 65 74 75 72 6e 28  CARD:....return(
37a0: 22 53 43 41 52 44 5f 57 5f 55 4e 50 4f 57 45 52  "SCARD_W_UNPOWER
37b0: 45 44 5f 43 41 52 44 22 29 3b 0a 09 09 63 61 73  ED_CARD");...cas
37c0: 65 20 53 43 41 52 44 5f 57 5f 52 45 53 45 54 5f  e SCARD_W_RESET_
37d0: 43 41 52 44 3a 0a 09 09 09 72 65 74 75 72 6e 28  CARD:....return(
37e0: 22 53 43 41 52 44 5f 57 5f 52 45 53 45 54 5f 43  "SCARD_W_RESET_C
37f0: 41 52 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43  ARD");...case SC
3800: 41 52 44 5f 57 5f 52 45 4d 4f 56 45 44 5f 43 41  ARD_W_REMOVED_CA
3810: 52 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53  RD:....return("S
3820: 43 41 52 44 5f 57 5f 52 45 4d 4f 56 45 44 5f 43  CARD_W_REMOVED_C
3830: 41 52 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43  ARD");...case SC
3840: 41 52 44 5f 45 5f 50 43 49 5f 54 4f 4f 5f 53 4d  ARD_E_PCI_TOO_SM
3850: 41 4c 4c 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ALL:....return("
3860: 53 43 41 52 44 5f 45 5f 50 43 49 5f 54 4f 4f 5f  SCARD_E_PCI_TOO_
3870: 53 4d 41 4c 4c 22 29 3b 0a 09 09 63 61 73 65 20  SMALL");...case 
3880: 53 43 41 52 44 5f 45 5f 52 45 41 44 45 52 5f 55  SCARD_E_READER_U
3890: 4e 53 55 50 50 4f 52 54 45 44 3a 0a 09 09 09 72  NSUPPORTED:....r
38a0: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 52  eturn("SCARD_E_R
38b0: 45 41 44 45 52 5f 55 4e 53 55 50 50 4f 52 54 45  EADER_UNSUPPORTE
38c0: 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52  D");...case SCAR
38d0: 44 5f 45 5f 44 55 50 4c 49 43 41 54 45 5f 52 45  D_E_DUPLICATE_RE
38e0: 41 44 45 52 3a 0a 09 09 09 72 65 74 75 72 6e 28  ADER:....return(
38f0: 22 53 43 41 52 44 5f 45 5f 44 55 50 4c 49 43 41  "SCARD_E_DUPLICA
3900: 54 45 5f 52 45 41 44 45 52 22 29 3b 0a 09 09 63  TE_READER");...c
3910: 61 73 65 20 53 43 41 52 44 5f 45 5f 43 41 52 44  ase SCARD_E_CARD
3920: 5f 55 4e 53 55 50 50 4f 52 54 45 44 3a 0a 09 09  _UNSUPPORTED:...
3930: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45  .return("SCARD_E
3940: 5f 43 41 52 44 5f 55 4e 53 55 50 50 4f 52 54 45  _CARD_UNSUPPORTE
3950: 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52  D");...case SCAR
3960: 44 5f 45 5f 4e 4f 5f 53 45 52 56 49 43 45 3a 0a  D_E_NO_SERVICE:.
3970: 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44  ...return("SCARD
3980: 5f 45 5f 4e 4f 5f 53 45 52 56 49 43 45 22 29 3b  _E_NO_SERVICE");
3990: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
39a0: 53 45 52 56 49 43 45 5f 53 54 4f 50 50 45 44 3a  SERVICE_STOPPED:
39b0: 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52  ....return("SCAR
39c0: 44 5f 45 5f 53 45 52 56 49 43 45 5f 53 54 4f 50  D_E_SERVICE_STOP
39d0: 50 45 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43  PED");...case SC
39e0: 41 52 44 5f 45 5f 55 4e 53 55 50 50 4f 52 54 45  ARD_E_UNSUPPORTE
39f0: 44 5f 46 45 41 54 55 52 45 3a 0a 09 09 09 72 65  D_FEATURE:....re
3a00: 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 55 4e  turn("SCARD_E_UN
3a10: 53 55 50 50 4f 52 54 45 44 5f 46 45 41 54 55 52  SUPPORTED_FEATUR
3a20: 45 22 29 3b 0a 23 69 66 64 65 66 20 53 43 41 52  E");.#ifdef SCAR
3a30: 44 5f 57 5f 49 4e 53 45 52 54 45 44 5f 43 41 52  D_W_INSERTED_CAR
3a40: 44 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 57  D...case SCARD_W
3a50: 5f 49 4e 53 45 52 54 45 44 5f 43 41 52 44 3a 0a  _INSERTED_CARD:.
3a60: 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44  ...return("SCARD
3a70: 5f 57 5f 49 4e 53 45 52 54 45 44 5f 43 41 52 44  _W_INSERTED_CARD
3a80: 22 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  ");.#endif.#ifde
3a90: 66 20 53 43 41 52 44 5f 45 5f 4e 4f 5f 52 45 41  f SCARD_E_NO_REA
3aa0: 44 45 52 53 5f 41 56 41 49 4c 41 42 4c 45 0a 09  DERS_AVAILABLE..
3ab0: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 4e 4f  .case SCARD_E_NO
3ac0: 5f 52 45 41 44 45 52 53 5f 41 56 41 49 4c 41 42  _READERS_AVAILAB
3ad0: 4c 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53  LE:....return("S
3ae0: 43 41 52 44 5f 45 5f 4e 4f 5f 52 45 41 44 45 52  CARD_E_NO_READER
3af0: 53 5f 41 56 41 49 4c 41 42 4c 45 22 29 3b 0a 23  S_AVAILABLE");.#
3b00: 65 6e 64 69 66 0a 09 7d 0a 0a 09 72 65 74 75 72  endif..}...retur
3b10: 6e 28 22 55 4e 4b 4e 4f 57 4e 22 29 3b 0a 7d 0a  n("UNKNOWN");.}.
3b20: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
3b30: 61 72 20 2a 43 41 43 4b 45 59 5f 44 45 42 55 47  ar *CACKEY_DEBUG
3b40: 5f 46 55 4e 43 5f 4f 42 4a 49 44 5f 54 4f 5f 53  _FUNC_OBJID_TO_S
3b50: 54 52 28 75 69 6e 74 31 36 5f 74 20 6f 62 6a 69  TR(uint16_t obji
3b60: 64 29 20 7b 0a 09 73 77 69 74 63 68 20 28 6f 62  d) {..switch (ob
3b70: 6a 69 64 29 20 7b 0a 09 09 63 61 73 65 20 30 78  jid) {...case 0x
3b80: 32 30 30 30 3a 0a 09 09 09 72 65 74 75 72 6e 28  2000:....return(
3b90: 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49  "CACKEY_TLV_OBJI
3ba0: 44 5f 47 45 4e 45 52 41 4c 49 4e 46 4f 22 29 3b  D_GENERALINFO");
3bb0: 0a 09 09 63 61 73 65 20 30 78 32 31 30 30 3a 0a  ...case 0x2100:.
3bc0: 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45  ...return("CACKE
3bd0: 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 50 52 4f 50  Y_TLV_OBJID_PROP
3be0: 45 52 53 4f 4e 41 4c 49 4e 46 4f 22 29 3b 0a 09  ERSONALINFO");..
3bf0: 09 63 61 73 65 20 30 78 33 30 30 30 3a 0a 09 09  .case 0x3000:...
3c00: 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f  .return("CACKEY_
3c10: 54 4c 56 5f 4f 42 4a 49 44 5f 41 43 43 45 53 53  TLV_OBJID_ACCESS
3c20: 43 4f 4e 54 52 4f 4c 22 29 3b 0a 09 09 63 61 73  CONTROL");...cas
3c30: 65 20 30 78 34 30 30 30 3a 0a 09 09 09 72 65 74  e 0x4000:....ret
3c40: 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f  urn("CACKEY_TLV_
3c50: 4f 42 4a 49 44 5f 4c 4f 47 49 4e 22 29 3b 0a 09  OBJID_LOGIN");..
3c60: 09 63 61 73 65 20 30 78 35 30 30 30 3a 0a 09 09  .case 0x5000:...
3c70: 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f  .return("CACKEY_
3c80: 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 52 44 49 4e  TLV_OBJID_CARDIN
3c90: 46 4f 22 29 3b 0a 09 09 63 61 73 65 20 30 78 36  FO");...case 0x6
3ca0: 30 30 30 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  000:....return("
3cb0: 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44  CACKEY_TLV_OBJID
3cc0: 5f 42 49 4f 4d 45 54 52 49 43 53 22 29 3b 0a 09  _BIOMETRICS");..
3cd0: 09 63 61 73 65 20 30 78 37 30 30 30 3a 0a 09 09  .case 0x7000:...
3ce0: 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f  .return("CACKEY_
3cf0: 54 4c 56 5f 4f 42 4a 49 44 5f 44 49 47 49 54 41  TLV_OBJID_DIGITA
3d00: 4c 53 49 47 43 45 52 54 22 29 3b 0a 09 09 63 61  LSIGCERT");...ca
3d10: 73 65 20 30 78 30 32 30 30 3a 0a 09 09 09 72 65  se 0x0200:....re
3d20: 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56  turn("CACKEY_TLV
3d30: 5f 4f 42 4a 49 44 5f 43 41 43 5f 50 45 52 53 4f  _OBJID_CAC_PERSO
3d40: 4e 22 29 3b 0a 09 09 63 61 73 65 20 30 78 30 32  N");...case 0x02
3d50: 30 32 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  02:....return("C
3d60: 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f  ACKEY_TLV_OBJID_
3d70: 43 41 43 5f 42 45 4e 45 46 49 54 53 22 29 3b 0a  CAC_BENEFITS");.
3d80: 09 09 63 61 73 65 20 30 78 30 32 30 33 3a 0a 09  ..case 0x0203:..
3d90: 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59  ..return("CACKEY
3da0: 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 4f  _TLV_OBJID_CAC_O
3db0: 54 48 45 52 42 45 4e 45 46 49 54 53 22 29 3b 0a  THERBENEFITS");.
3dc0: 09 09 63 61 73 65 20 30 78 30 32 30 31 3a 0a 09  ..case 0x0201:..
3dd0: 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59  ..return("CACKEY
3de0: 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 50  _TLV_OBJID_CAC_P
3df0: 45 52 53 4f 4e 4e 45 4c 22 29 3b 0a 09 09 63 61  ERSONNEL");...ca
3e00: 73 65 20 30 78 30 32 46 45 3a 0a 09 09 09 72 65  se 0x02FE:....re
3e10: 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56  turn("CACKEY_TLV
3e20: 5f 4f 42 4a 49 44 5f 43 41 43 5f 50 4b 49 43 45  _OBJID_CAC_PKICE
3e30: 52 54 22 29 3b 0a 09 7d 0a 09 0a 09 72 65 74 75  RT");..}....retu
3e40: 72 6e 28 22 55 4e 4b 4e 4f 57 4e 22 29 3b 0a 7d  rn("UNKNOWN");.}
3e50: 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  ..static const c
3e60: 68 61 72 20 2a 43 41 43 4b 45 59 5f 44 45 42 55  har *CACKEY_DEBU
3e70: 47 5f 46 55 4e 43 5f 41 50 50 54 59 50 45 5f 54  G_FUNC_APPTYPE_T
3e80: 4f 5f 53 54 52 28 75 69 6e 74 38 5f 74 20 61 70  O_STR(uint8_t ap
3e90: 70 74 79 70 65 29 20 7b 0a 09 73 77 69 74 63 68  ptype) {..switch
3ea0: 20 28 61 70 70 74 79 70 65 29 20 7b 0a 09 09 63   (apptype) {...c
3eb0: 61 73 65 20 30 78 30 30 3a 0a 09 09 09 72 65 74  ase 0x00:....ret
3ec0: 75 72 6e 28 22 4e 4f 4e 45 22 29 3b 0a 09 09 63  urn("NONE");...c
3ed0: 61 73 65 20 30 78 30 31 3a 0a 09 09 09 72 65 74  ase 0x01:....ret
3ee0: 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f  urn("CACKEY_TLV_
3ef0: 41 50 50 5f 47 45 4e 45 52 49 43 22 29 3b 0a 09  APP_GENERIC");..
3f00: 09 63 61 73 65 20 30 78 30 32 3a 0a 09 09 09 72  .case 0x02:....r
3f10: 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c  eturn("CACKEY_TL
3f20: 56 5f 41 50 50 5f 53 4b 49 22 29 3b 0a 09 09 63  V_APP_SKI");...c
3f30: 61 73 65 20 30 78 30 33 3a 0a 09 09 09 72 65 74  ase 0x03:....ret
3f40: 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f  urn("CACKEY_TLV_
3f50: 41 50 50 5f 47 45 4e 45 52 49 43 20 7c 20 43 41  APP_GENERIC | CA
3f60: 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 53 4b 49  CKEY_TLV_APP_SKI
3f70: 22 29 3b 0a 09 09 63 61 73 65 20 30 78 30 34 3a  ");...case 0x04:
3f80: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b  ....return("CACK
3f90: 45 59 5f 54 4c 56 5f 41 50 50 5f 50 4b 49 22 29  EY_TLV_APP_PKI")
3fa0: 3b 0a 09 09 63 61 73 65 20 30 78 30 35 3a 0a 09  ;...case 0x05:..
3fb0: 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59  ..return("CACKEY
3fc0: 5f 54 4c 56 5f 41 50 50 5f 47 45 4e 45 52 49 43  _TLV_APP_GENERIC
3fd0: 20 7c 20 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50   | CACKEY_TLV_AP
3fe0: 50 5f 50 4b 49 22 29 3b 0a 09 09 63 61 73 65 20  P_PKI");...case 
3ff0: 30 78 30 36 3a 0a 09 09 09 72 65 74 75 72 6e 28  0x06:....return(
4000: 22 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f  "CACKEY_TLV_APP_
4010: 53 4b 49 20 7c 20 43 41 43 4b 45 59 5f 54 4c 56  SKI | CACKEY_TLV
4020: 5f 41 50 50 5f 50 4b 49 22 29 3b 0a 09 09 63 61  _APP_PKI");...ca
4030: 73 65 20 30 78 30 37 3a 0a 09 09 09 72 65 74 75  se 0x07:....retu
4040: 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 41  rn("CACKEY_TLV_A
4050: 50 50 5f 47 45 4e 45 52 49 43 20 7c 20 43 41 43  PP_GENERIC | CAC
4060: 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 53 4b 49 20  KEY_TLV_APP_SKI 
4070: 7c 20 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50  | CACKEY_TLV_APP
4080: 5f 50 4b 49 22 29 3b 0a 09 7d 0a 0a 09 72 65 74  _PKI");..}...ret
4090: 75 72 6e 28 22 49 4e 56 41 4c 49 44 22 29 3b 0a  urn("INVALID");.
40a0: 7d 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  }..static const 
40b0: 63 68 61 72 20 2a 43 41 43 4b 45 59 5f 44 45 42  char *CACKEY_DEB
40c0: 55 47 5f 46 55 4e 43 5f 41 54 54 52 49 42 55 54  UG_FUNC_ATTRIBUT
40d0: 45 5f 54 4f 5f 53 54 52 28 43 4b 5f 41 54 54 52  E_TO_STR(CK_ATTR
40e0: 49 42 55 54 45 5f 54 59 50 45 20 61 74 74 72 29  IBUTE_TYPE attr)
40f0: 20 7b 0a 09 73 77 69 74 63 68 20 28 61 74 74 72   {..switch (attr
4100: 29 20 7b 0a 09 09 63 61 73 65 20 43 4b 41 5f 43  ) {...case CKA_C
4110: 4c 41 53 53 3a 0a 09 09 09 72 65 74 75 72 6e 28  LASS:....return(
4120: 22 43 4b 41 5f 43 4c 41 53 53 22 29 3b 0a 09 09  "CKA_CLASS");...
4130: 63 61 73 65 20 43 4b 41 5f 54 4f 4b 45 4e 3a 0a  case CKA_TOKEN:.
4140: 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 54  ...return("CKA_T
4150: 4f 4b 45 4e 22 29 3b 0a 09 09 63 61 73 65 20 43  OKEN");...case C
4160: 4b 41 5f 50 52 49 56 41 54 45 3a 0a 09 09 09 72  KA_PRIVATE:....r
4170: 65 74 75 72 6e 28 22 43 4b 41 5f 50 52 49 56 41  eturn("CKA_PRIVA
4180: 54 45 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  TE");...case CKA
4190: 5f 4c 41 42 45 4c 3a 0a 09 09 09 72 65 74 75 72  _LABEL:....retur
41a0: 6e 28 22 43 4b 41 5f 4c 41 42 45 4c 22 29 3b 0a  n("CKA_LABEL");.
41b0: 09 09 63 61 73 65 20 43 4b 41 5f 41 50 50 4c 49  ..case CKA_APPLI
41c0: 43 41 54 49 4f 4e 3a 0a 09 09 09 72 65 74 75 72  CATION:....retur
41d0: 6e 28 22 43 4b 41 5f 41 50 50 4c 49 43 41 54 49  n("CKA_APPLICATI
41e0: 4f 4e 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  ON");...case CKA
41f0: 5f 56 41 4c 55 45 3a 0a 09 09 09 72 65 74 75 72  _VALUE:....retur
4200: 6e 28 22 43 4b 41 5f 56 41 4c 55 45 22 29 3b 0a  n("CKA_VALUE");.
4210: 09 09 63 61 73 65 20 43 4b 41 5f 4f 42 4a 45 43  ..case CKA_OBJEC
4220: 54 5f 49 44 3a 0a 09 09 09 72 65 74 75 72 6e 28  T_ID:....return(
4230: 22 43 4b 41 5f 4f 42 4a 45 43 54 5f 49 44 22 29  "CKA_OBJECT_ID")
4240: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 43 45 52  ;...case CKA_CER
4250: 54 49 46 49 43 41 54 45 5f 54 59 50 45 3a 0a 09  TIFICATE_TYPE:..
4260: 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 43 45  ..return("CKA_CE
4270: 52 54 49 46 49 43 41 54 45 5f 54 59 50 45 22 29  RTIFICATE_TYPE")
4280: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 49 53 53  ;...case CKA_ISS
4290: 55 45 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  UER:....return("
42a0: 43 4b 41 5f 49 53 53 55 45 52 22 29 3b 0a 09 09  CKA_ISSUER");...
42b0: 63 61 73 65 20 43 4b 41 5f 53 45 52 49 41 4c 5f  case CKA_SERIAL_
42c0: 4e 55 4d 42 45 52 3a 0a 09 09 09 72 65 74 75 72  NUMBER:....retur
42d0: 6e 28 22 43 4b 41 5f 53 45 52 49 41 4c 5f 4e 55  n("CKA_SERIAL_NU
42e0: 4d 42 45 52 22 29 3b 0a 09 09 63 61 73 65 20 43  MBER");...case C
42f0: 4b 41 5f 41 43 5f 49 53 53 55 45 52 3a 0a 09 09  KA_AC_ISSUER:...
4300: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 41 43 5f  .return("CKA_AC_
4310: 49 53 53 55 45 52 22 29 3b 0a 09 09 63 61 73 65  ISSUER");...case
4320: 20 43 4b 41 5f 4f 57 4e 45 52 3a 0a 09 09 09 72   CKA_OWNER:....r
4330: 65 74 75 72 6e 28 22 43 4b 41 5f 4f 57 4e 45 52  eturn("CKA_OWNER
4340: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 41  ");...case CKA_A
4350: 54 54 52 5f 54 59 50 45 53 3a 0a 09 09 09 72 65  TTR_TYPES:....re
4360: 74 75 72 6e 28 22 43 4b 41 5f 41 54 54 52 5f 54  turn("CKA_ATTR_T
4370: 59 50 45 53 22 29 3b 0a 09 09 63 61 73 65 20 43  YPES");...case C
4380: 4b 41 5f 54 52 55 53 54 45 44 3a 0a 09 09 09 72  KA_TRUSTED:....r
4390: 65 74 75 72 6e 28 22 43 4b 41 5f 54 52 55 53 54  eturn("CKA_TRUST
43a0: 45 44 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  ED");...case CKA
43b0: 5f 4b 45 59 5f 54 59 50 45 3a 0a 09 09 09 72 65  _KEY_TYPE:....re
43c0: 74 75 72 6e 28 22 43 4b 41 5f 4b 45 59 5f 54 59  turn("CKA_KEY_TY
43d0: 50 45 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  PE");...case CKA
43e0: 5f 53 55 42 4a 45 43 54 3a 0a 09 09 09 72 65 74  _SUBJECT:....ret
43f0: 75 72 6e 28 22 43 4b 41 5f 53 55 42 4a 45 43 54  urn("CKA_SUBJECT
4400: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 49  ");...case CKA_I
4410: 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b  D:....return("CK
4420: 41 5f 49 44 22 29 3b 0a 09 09 63 61 73 65 20 43  A_ID");...case C
4430: 4b 41 5f 53 45 4e 53 49 54 49 56 45 3a 0a 09 09  KA_SENSITIVE:...
4440: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 53 45 4e  .return("CKA_SEN
4450: 53 49 54 49 56 45 22 29 3b 0a 09 09 63 61 73 65  SITIVE");...case
4460: 20 43 4b 41 5f 45 4e 43 52 59 50 54 3a 0a 09 09   CKA_ENCRYPT:...
4470: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 45 4e 43  .return("CKA_ENC
4480: 52 59 50 54 22 29 3b 0a 09 09 63 61 73 65 20 43  RYPT");...case C
4490: 4b 41 5f 44 45 43 52 59 50 54 3a 0a 09 09 09 72  KA_DECRYPT:....r
44a0: 65 74 75 72 6e 28 22 43 4b 41 5f 44 45 43 52 59  eturn("CKA_DECRY
44b0: 50 54 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  PT");...case CKA
44c0: 5f 57 52 41 50 3a 0a 09 09 09 72 65 74 75 72 6e  _WRAP:....return
44d0: 28 22 43 4b 41 5f 57 52 41 50 22 29 3b 0a 09 09  ("CKA_WRAP");...
44e0: 63 61 73 65 20 43 4b 41 5f 55 4e 57 52 41 50 3a  case CKA_UNWRAP:
44f0: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f  ....return("CKA_
4500: 55 4e 57 52 41 50 22 29 3b 0a 09 09 63 61 73 65  UNWRAP");...case
4510: 20 43 4b 41 5f 53 49 47 4e 3a 0a 09 09 09 72 65   CKA_SIGN:....re
4520: 74 75 72 6e 28 22 43 4b 41 5f 53 49 47 4e 22 29  turn("CKA_SIGN")
4530: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 53 49 47  ;...case CKA_SIG
4540: 4e 5f 52 45 43 4f 56 45 52 3a 0a 09 09 09 72 65  N_RECOVER:....re
4550: 74 75 72 6e 28 22 43 4b 41 5f 53 49 47 4e 5f 52  turn("CKA_SIGN_R
4560: 45 43 4f 56 45 52 22 29 3b 0a 09 09 63 61 73 65  ECOVER");...case
4570: 20 43 4b 41 5f 56 45 52 49 46 59 3a 0a 09 09 09   CKA_VERIFY:....
4580: 72 65 74 75 72 6e 28 22 43 4b 41 5f 56 45 52 49  return("CKA_VERI
4590: 46 59 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  FY");...case CKA
45a0: 5f 56 45 52 49 46 59 5f 52 45 43 4f 56 45 52 3a  _VERIFY_RECOVER:
45b0: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f  ....return("CKA_
45c0: 56 45 52 49 46 59 5f 52 45 43 4f 56 45 52 22 29  VERIFY_RECOVER")
45d0: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 44 45 52  ;...case CKA_DER
45e0: 49 56 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  IVE:....return("
45f0: 43 4b 41 5f 44 45 52 49 56 45 22 29 3b 0a 09 09  CKA_DERIVE");...
4600: 63 61 73 65 20 43 4b 41 5f 53 54 41 52 54 5f 44  case CKA_START_D
4610: 41 54 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ATE:....return("
4620: 43 4b 41 5f 53 54 41 52 54 5f 44 41 54 45 22 29  CKA_START_DATE")
4630: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 45 4e 44  ;...case CKA_END
4640: 5f 44 41 54 45 3a 0a 09 09 09 72 65 74 75 72 6e  _DATE:....return
4650: 28 22 43 4b 41 5f 45 4e 44 5f 44 41 54 45 22 29  ("CKA_END_DATE")
4660: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 4d 4f 44  ;...case CKA_MOD
4670: 55 4c 55 53 3a 0a 09 09 09 72 65 74 75 72 6e 28  ULUS:....return(
4680: 22 43 4b 41 5f 4d 4f 44 55 4c 55 53 22 29 3b 0a  "CKA_MODULUS");.
4690: 09 09 63 61 73 65 20 43 4b 41 5f 4d 4f 44 55 4c  ..case CKA_MODUL
46a0: 55 53 5f 42 49 54 53 3a 0a 09 09 09 72 65 74 75  US_BITS:....retu
46b0: 72 6e 28 22 43 4b 41 5f 4d 4f 44 55 4c 55 53 5f  rn("CKA_MODULUS_
46c0: 42 49 54 53 22 29 3b 0a 09 09 63 61 73 65 20 43  BITS");...case C
46d0: 4b 41 5f 50 55 42 4c 49 43 5f 45 58 50 4f 4e 45  KA_PUBLIC_EXPONE
46e0: 4e 54 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  NT:....return("C
46f0: 4b 41 5f 50 55 42 4c 49 43 5f 45 58 50 4f 4e 45  KA_PUBLIC_EXPONE
4700: 4e 54 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  NT");...case CKA
4710: 5f 50 52 49 56 41 54 45 5f 45 58 50 4f 4e 45 4e  _PRIVATE_EXPONEN
4720: 54 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b  T:....return("CK
4730: 41 5f 50 52 49 56 41 54 45 5f 45 58 50 4f 4e 45  A_PRIVATE_EXPONE
4740: 4e 54 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  NT");...case CKA
4750: 5f 50 52 49 4d 45 5f 31 3a 0a 09 09 09 72 65 74  _PRIME_1:....ret
4760: 75 72 6e 28 22 43 4b 41 5f 50 52 49 4d 45 5f 31  urn("CKA_PRIME_1
4770: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 50  ");...case CKA_P
4780: 52 49 4d 45 5f 32 3a 0a 09 09 09 72 65 74 75 72  RIME_2:....retur
4790: 6e 28 22 43 4b 41 5f 50 52 49 4d 45 5f 32 22 29  n("CKA_PRIME_2")
47a0: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 45 58 50  ;...case CKA_EXP
47b0: 4f 4e 45 4e 54 5f 31 3a 0a 09 09 09 72 65 74 75  ONENT_1:....retu
47c0: 72 6e 28 22 43 4b 41 5f 45 58 50 4f 4e 45 4e 54  rn("CKA_EXPONENT
47d0: 5f 31 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  _1");...case CKA
47e0: 5f 45 58 50 4f 4e 45 4e 54 5f 32 3a 0a 09 09 09  _EXPONENT_2:....
47f0: 72 65 74 75 72 6e 28 22 43 4b 41 5f 45 58 50 4f  return("CKA_EXPO
4800: 4e 45 4e 54 5f 32 22 29 3b 0a 09 09 63 61 73 65  NENT_2");...case
4810: 20 43 4b 41 5f 43 4f 45 46 46 49 43 49 45 4e 54   CKA_COEFFICIENT
4820: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41  :....return("CKA
4830: 5f 43 4f 45 46 46 49 43 49 45 4e 54 22 29 3b 0a  _COEFFICIENT");.
4840: 09 09 63 61 73 65 20 43 4b 41 5f 50 52 49 4d 45  ..case CKA_PRIME
4850: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41  :....return("CKA
4860: 5f 50 52 49 4d 45 22 29 3b 0a 09 09 63 61 73 65  _PRIME");...case
4870: 20 43 4b 41 5f 53 55 42 50 52 49 4d 45 3a 0a 09   CKA_SUBPRIME:..
4880: 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 53 55  ..return("CKA_SU
4890: 42 50 52 49 4d 45 22 29 3b 0a 09 09 63 61 73 65  BPRIME");...case
48a0: 20 43 4b 41 5f 42 41 53 45 3a 0a 09 09 09 72 65   CKA_BASE:....re
48b0: 74 75 72 6e 28 22 43 4b 41 5f 42 41 53 45 22 29  turn("CKA_BASE")
48c0: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 50 52 49  ;...case CKA_PRI
48d0: 4d 45 5f 42 49 54 53 3a 0a 09 09 09 72 65 74 75  ME_BITS:....retu
48e0: 72 6e 28 22 43 4b 41 5f 50 52 49 4d 45 5f 42 49  rn("CKA_PRIME_BI
48f0: 54 53 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  TS");...case CKA
4900: 5f 53 55 42 5f 50 52 49 4d 45 5f 42 49 54 53 3a  _SUB_PRIME_BITS:
4910: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f  ....return("CKA_
4920: 53 55 42 5f 50 52 49 4d 45 5f 42 49 54 53 22 29  SUB_PRIME_BITS")
4930: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 56 41 4c  ;...case CKA_VAL
4940: 55 45 5f 42 49 54 53 3a 0a 09 09 09 72 65 74 75  UE_BITS:....retu
4950: 72 6e 28 22 43 4b 41 5f 56 41 4c 55 45 5f 42 49  rn("CKA_VALUE_BI
4960: 54 53 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  TS");...case CKA
4970: 5f 56 41 4c 55 45 5f 4c 45 4e 3a 0a 09 09 09 72  _VALUE_LEN:....r
4980: 65 74 75 72 6e 28 22 43 4b 41 5f 56 41 4c 55 45  eturn("CKA_VALUE
4990: 5f 4c 45 4e 22 29 3b 0a 09 09 63 61 73 65 20 43  _LEN");...case C
49a0: 4b 41 5f 45 58 54 52 41 43 54 41 42 4c 45 3a 0a  KA_EXTRACTABLE:.
49b0: 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 45  ...return("CKA_E
49c0: 58 54 52 41 43 54 41 42 4c 45 22 29 3b 0a 09 09  XTRACTABLE");...
49d0: 63 61 73 65 20 43 4b 41 5f 4c 4f 43 41 4c 3a 0a  case CKA_LOCAL:.
49e0: 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 4c  ...return("CKA_L
49f0: 4f 43 41 4c 22 29 3b 0a 09 09 63 61 73 65 20 43  OCAL");...case C
4a00: 4b 41 5f 4e 45 56 45 52 5f 45 58 54 52 41 43 54  KA_NEVER_EXTRACT
4a10: 41 42 4c 45 3a 0a 09 09 09 72 65 74 75 72 6e 28  ABLE:....return(
4a20: 22 43 4b 41 5f 4e 45 56 45 52 5f 45 58 54 52 41  "CKA_NEVER_EXTRA
4a30: 43 54 41 42 4c 45 22 29 3b 0a 09 09 63 61 73 65  CTABLE");...case
4a40: 20 43 4b 41 5f 41 4c 57 41 59 53 5f 53 45 4e 53   CKA_ALWAYS_SENS
4a50: 49 54 49 56 45 3a 0a 09 09 09 72 65 74 75 72 6e  ITIVE:....return
4a60: 28 22 43 4b 41 5f 41 4c 57 41 59 53 5f 53 45 4e  ("CKA_ALWAYS_SEN
4a70: 53 49 54 49 56 45 22 29 3b 0a 09 09 63 61 73 65  SITIVE");...case
4a80: 20 43 4b 41 5f 4b 45 59 5f 47 45 4e 5f 4d 45 43   CKA_KEY_GEN_MEC
4a90: 48 41 4e 49 53 4d 3a 0a 09 09 09 72 65 74 75 72  HANISM:....retur
4aa0: 6e 28 22 43 4b 41 5f 4b 45 59 5f 47 45 4e 5f 4d  n("CKA_KEY_GEN_M
4ab0: 45 43 48 41 4e 49 53 4d 22 29 3b 0a 09 09 63 61  ECHANISM");...ca
4ac0: 73 65 20 43 4b 41 5f 4d 4f 44 49 46 49 41 42 4c  se CKA_MODIFIABL
4ad0: 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b  E:....return("CK
4ae0: 41 5f 4d 4f 44 49 46 49 41 42 4c 45 22 29 3b 0a  A_MODIFIABLE");.
4af0: 09 09 63 61 73 65 20 43 4b 41 5f 45 43 44 53 41  ..case CKA_ECDSA
4b00: 5f 50 41 52 41 4d 53 3a 0a 09 09 09 72 65 74 75  _PARAMS:....retu
4b10: 72 6e 28 22 43 4b 41 5f 45 43 44 53 41 5f 50 41  rn("CKA_ECDSA_PA
4b20: 52 41 4d 53 22 29 3b 0a 09 09 63 61 73 65 20 43  RAMS");...case C
4b30: 4b 41 5f 45 43 5f 50 4f 49 4e 54 3a 0a 09 09 09  KA_EC_POINT:....
4b40: 72 65 74 75 72 6e 28 22 43 4b 41 5f 45 43 5f 50  return("CKA_EC_P
4b50: 4f 49 4e 54 22 29 3b 0a 09 09 63 61 73 65 20 43  OINT");...case C
4b60: 4b 41 5f 53 45 43 4f 4e 44 41 52 59 5f 41 55 54  KA_SECONDARY_AUT
4b70: 48 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b  H:....return("CK
4b80: 41 5f 53 45 43 4f 4e 44 41 52 59 5f 41 55 54 48  A_SECONDARY_AUTH
4b90: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 41  ");...case CKA_A
4ba0: 55 54 48 5f 50 49 4e 5f 46 4c 41 47 53 3a 0a 09  UTH_PIN_FLAGS:..
4bb0: 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 41 55  ..return("CKA_AU
4bc0: 54 48 5f 50 49 4e 5f 46 4c 41 47 53 22 29 3b 0a  TH_PIN_FLAGS");.
4bd0: 09 09 63 61 73 65 20 43 4b 41 5f 48 57 5f 46 45  ..case CKA_HW_FE
4be0: 41 54 55 52 45 5f 54 59 50 45 3a 0a 09 09 09 72  ATURE_TYPE:....r
4bf0: 65 74 75 72 6e 28 22 43 4b 41 5f 48 57 5f 46 45  eturn("CKA_HW_FE
4c00: 41 54 55 52 45 5f 54 59 50 45 22 29 3b 0a 09 09  ATURE_TYPE");...
4c10: 63 61 73 65 20 43 4b 41 5f 52 45 53 45 54 5f 4f  case CKA_RESET_O
4c20: 4e 5f 49 4e 49 54 3a 0a 09 09 09 72 65 74 75 72  N_INIT:....retur
4c30: 6e 28 22 43 4b 41 5f 52 45 53 45 54 5f 4f 4e 5f  n("CKA_RESET_ON_
4c40: 49 4e 49 54 22 29 3b 0a 09 09 63 61 73 65 20 43  INIT");...case C
4c50: 4b 41 5f 48 41 53 5f 52 45 53 45 54 3a 0a 09 09  KA_HAS_RESET:...
4c60: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 48 41 53  .return("CKA_HAS
4c70: 5f 52 45 53 45 54 22 29 3b 0a 09 09 63 61 73 65  _RESET");...case
4c80: 20 43 4b 41 5f 56 45 4e 44 4f 52 5f 44 45 46 49   CKA_VENDOR_DEFI
4c90: 4e 45 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  NED:....return("
4ca0: 43 4b 41 5f 56 45 4e 44 4f 52 5f 44 45 46 49 4e  CKA_VENDOR_DEFIN
4cb0: 45 44 22 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72  ED");..}...retur
4cc0: 6e 28 22 55 4e 4b 4e 4f 57 4e 22 29 3b 0a 7d 0a  n("UNKNOWN");.}.
4cd0: 0a 23 20 20 64 65 66 69 6e 65 20 6d 61 6c 6c 6f  .#  define mallo
4ce0: 63 28 78 29 20 43 41 43 4b 45 59 5f 44 45 42 55  c(x) CACKEY_DEBU
4cf0: 47 5f 46 55 4e 43 5f 4d 41 4c 4c 4f 43 28 78 2c  G_FUNC_MALLOC(x,
4d00: 20 5f 5f 66 75 6e 63 5f 5f 2c 20 5f 5f 4c 49 4e   __func__, __LIN
4d10: 45 5f 5f 29 0a 23 20 20 64 65 66 69 6e 65 20 72  E__).#  define r
4d20: 65 61 6c 6c 6f 63 28 78 2c 20 79 29 20 43 41 43  ealloc(x, y) CAC
4d30: 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 52  KEY_DEBUG_FUNC_R
4d40: 45 41 4c 4c 4f 43 28 78 2c 20 79 2c 20 5f 5f 66  EALLOC(x, y, __f
4d50: 75 6e 63 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f 5f 29  unc__, __LINE__)
4d60: 0a 23 20 20 69 66 64 65 66 20 73 74 72 64 75 70  .#  ifdef strdup
4d70: 0a 23 20 20 20 20 75 6e 64 65 66 20 73 74 72 64  .#    undef strd
4d80: 75 70 0a 23 20 20 65 6e 64 69 66 0a 23 20 20 64  up.#  endif.#  d
4d90: 65 66 69 6e 65 20 73 74 72 64 75 70 28 78 29 20  efine strdup(x) 
4da0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e  CACKEY_DEBUG_FUN
4db0: 43 5f 53 54 52 44 55 50 28 78 2c 20 5f 5f 66 75  C_STRDUP(x, __fu
4dc0: 6e 63 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 0a  nc__, __LINE__).
4dd0: 23 65 6c 73 65 0a 23 20 20 64 65 66 69 6e 65 20  #else.#  define 
4de0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
4df0: 4e 54 46 28 78 2e 2e 2e 29 20 2f 2a 2a 2f 0a 23  NTF(x...) /**/.#
4e00: 20 20 64 65 66 69 6e 65 20 43 41 43 4b 45 59 5f    define CACKEY_
4e10: 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 66  DEBUG_PRINTBUF(f
4e20: 2c 20 78 2c 20 79 29 20 2f 2a 2a 2f 0a 23 20 20  , x, y) /**/.#  
4e30: 64 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 44 45  define CACKEY_DE
4e40: 42 55 47 5f 46 55 4e 43 5f 54 41 47 5f 54 4f 5f  BUG_FUNC_TAG_TO_
4e50: 53 54 52 28 78 29 20 22 44 45 42 55 47 5f 44 49  STR(x) "DEBUG_DI
4e60: 53 41 42 4c 45 44 22 0a 23 20 20 64 65 66 69 6e  SABLED".#  defin
4e70: 65 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46  e CACKEY_DEBUG_F
4e80: 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f  UNC_SCARDERR_TO_
4e90: 53 54 52 28 78 29 20 22 44 45 42 55 47 5f 44 49  STR(x) "DEBUG_DI
4ea0: 53 41 42 4c 45 44 22 0a 23 20 20 64 65 66 69 6e  SABLED".#  defin
4eb0: 65 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46  e CACKEY_DEBUG_F
4ec0: 55 4e 43 5f 4f 42 4a 49 44 5f 54 4f 5f 53 54 52  UNC_OBJID_TO_STR
4ed0: 28 78 29 20 22 44 45 42 55 47 5f 44 49 53 41 42  (x) "DEBUG_DISAB
4ee0: 4c 45 44 22 0a 23 20 20 64 65 66 69 6e 65 20 43  LED".#  define C
4ef0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43  ACKEY_DEBUG_FUNC
4f00: 5f 41 50 50 54 59 50 45 5f 54 4f 5f 53 54 52 28  _APPTYPE_TO_STR(
4f10: 78 29 20 22 44 45 42 55 47 5f 44 49 53 41 42 4c  x) "DEBUG_DISABL
4f20: 45 44 22 0a 23 20 20 64 65 66 69 6e 65 20 43 41  ED".#  define CA
4f30: 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
4f40: 41 54 54 52 49 42 55 54 45 5f 54 4f 5f 53 54 52  ATTRIBUTE_TO_STR
4f50: 28 78 29 20 22 44 45 42 55 47 5f 44 49 53 41 42  (x) "DEBUG_DISAB
4f60: 4c 45 44 22 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  LED".#endif../*.
4f70: 20 2a 20 49 6e 63 6c 75 64 65 20 74 68 65 73 65   * Include these
4f80: 20 73 6f 75 72 63 65 20 66 69 6c 65 73 20 69 6e   source files in
4f90: 20 74 68 69 73 20 74 72 61 6e 73 6c 61 74 69 6f   this translatio
4fa0: 6e 20 75 6e 69 74 20 73 6f 20 74 68 61 74 20 77  n unit so that w
4fb0: 65 20 63 61 6e 20 62 69 6e 64 20 74 6f 0a 20 2a  e can bind to. *
4fc0: 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20 6e   functions and n
4fd0: 6f 74 20 69 6e 63 6c 75 64 65 20 61 6e 79 20 73  ot include any s
4fe0: 79 6d 62 6f 6c 73 20 69 6e 20 74 68 65 20 6f 75  ymbols in the ou
4ff0: 74 70 75 74 20 73 68 61 72 65 64 20 6f 62 6a 65  tput shared obje
5000: 63 74 2e 0a 20 2a 2f 0a 23 69 6e 63 6c 75 64 65  ct.. */.#include
5010: 20 22 61 73 6e 31 2d 78 35 30 39 2e 63 22 0a 23   "asn1-x509.c".#
5020: 69 6e 63 6c 75 64 65 20 22 73 68 61 31 2e 63 22  include "sha1.c"
5030: 0a 23 69 6e 63 6c 75 64 65 20 22 6d 64 35 2e 63  .#include "md5.c
5040: 22 0a 0a 74 79 70 65 64 65 66 20 65 6e 75 6d 20  "..typedef enum 
5050: 7b 0a 09 43 41 43 4b 45 59 5f 49 44 5f 54 59 50  {..CACKEY_ID_TYP
5060: 45 5f 43 41 43 2c 0a 09 43 41 43 4b 45 59 5f 49  E_CAC,..CACKEY_I
5070: 44 5f 54 59 50 45 5f 50 49 56 2c 0a 09 43 41 43  D_TYPE_PIV,..CAC
5080: 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43 45 52 54  KEY_ID_TYPE_CERT
5090: 5f 4f 4e 4c 59 0a 7d 20 63 61 63 6b 65 79 5f 70  _ONLY.} cackey_p
50a0: 63 73 63 5f 69 64 5f 74 79 70 65 3b 0a 0a 73 74  csc_id_type;..st
50b0: 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63  ruct cackey_pcsc
50c0: 5f 69 64 65 6e 74 69 74 79 20 7b 0a 09 63 61 63  _identity {..cac
50d0: 6b 65 79 5f 70 63 73 63 5f 69 64 5f 74 79 70 65  key_pcsc_id_type
50e0: 20 69 64 5f 74 79 70 65 3b 0a 0a 09 73 69 7a 65   id_type;...size
50f0: 5f 74 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c  _t certificate_l
5100: 65 6e 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68  en;..unsigned ch
5110: 61 72 20 2a 63 65 72 74 69 66 69 63 61 74 65 3b  ar *certificate;
5120: 0a 0a 09 73 73 69 7a 65 5f 74 20 6b 65 79 73 69  ...ssize_t keysi
5130: 7a 65 3b 0a 0a 09 75 6e 69 6f 6e 20 7b 0a 09 09  ze;...union {...
5140: 73 74 72 75 63 74 20 7b 0a 09 09 09 75 6e 73 69  struct {....unsi
5150: 67 6e 65 64 20 63 68 61 72 20 61 70 70 6c 65 74  gned char applet
5160: 5b 37 5d 3b 0a 09 09 09 75 69 6e 74 31 36 5f 74  [7];....uint16_t
5170: 20 66 69 6c 65 3b 0a 09 09 7d 20 63 61 63 3b 0a   file;...} cac;.
5180: 0a 09 09 73 74 72 75 63 74 20 7b 0a 09 09 09 75  ...struct {....u
5190: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6b 65 79  nsigned char key
51a0: 5f 69 64 3b 0a 09 09 09 63 68 61 72 20 6c 61 62  _id;....char lab
51b0: 65 6c 5b 33 32 5d 3b 0a 09 09 7d 20 70 69 76 3b  el[32];...} piv;
51c0: 0a 09 7d 20 63 61 72 64 3b 0a 7d 3b 0a 0a 73 74  ..} card;.};..st
51d0: 72 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e  ruct cackey_iden
51e0: 74 69 74 79 20 7b 0a 09 73 74 72 75 63 74 20 63  tity {..struct c
51f0: 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74  ackey_pcsc_ident
5200: 69 74 79 20 2a 70 63 73 63 5f 69 64 65 6e 74 69  ity *pcsc_identi
5210: 74 79 3b 0a 0a 09 43 4b 5f 41 54 54 52 49 42 55  ty;...CK_ATTRIBU
5220: 54 45 20 2a 61 74 74 72 69 62 75 74 65 73 3b 0a  TE *attributes;.
5230: 09 43 4b 5f 55 4c 4f 4e 47 20 61 74 74 72 69 62  .CK_ULONG attrib
5240: 75 74 65 73 5f 63 6f 75 6e 74 3b 0a 7d 3b 0a 0a  utes_count;.};..
5250: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 65  struct cackey_se
5260: 73 73 69 6f 6e 20 7b 0a 09 69 6e 74 20 61 63 74  ssion {..int act
5270: 69 76 65 3b 0a 0a 09 43 4b 5f 53 4c 4f 54 5f 49  ive;...CK_SLOT_I
5280: 44 20 73 6c 6f 74 49 44 3b 0a 0a 09 43 4b 5f 53  D slotID;...CK_S
5290: 54 41 54 45 20 73 74 61 74 65 3b 0a 09 43 4b 5f  TATE state;..CK_
52a0: 46 4c 41 47 53 20 66 6c 61 67 73 3b 0a 09 43 4b  FLAGS flags;..CK
52b0: 5f 55 4c 4f 4e 47 20 75 6c 44 65 76 69 63 65 45  _ULONG ulDeviceE
52c0: 72 72 6f 72 3b 0a 09 43 4b 5f 56 4f 49 44 5f 50  rror;..CK_VOID_P
52d0: 54 52 20 70 41 70 70 6c 69 63 61 74 69 6f 6e 3b  TR pApplication;
52e0: 0a 09 43 4b 5f 4e 4f 54 49 46 59 20 4e 6f 74 69  ..CK_NOTIFY Noti
52f0: 66 79 3b 0a 0a 09 73 74 72 75 63 74 20 63 61 63  fy;...struct cac
5300: 6b 65 79 5f 69 64 65 6e 74 69 74 79 20 2a 69 64  key_identity *id
5310: 65 6e 74 69 74 69 65 73 3b 0a 09 75 6e 73 69 67  entities;..unsig
5320: 6e 65 64 20 6c 6f 6e 67 20 69 64 65 6e 74 69 74  ned long identit
5330: 69 65 73 5f 63 6f 75 6e 74 3b 0a 0a 09 69 6e 74  ies_count;...int
5340: 20 73 65 61 72 63 68 5f 61 63 74 69 76 65 3b 0a   search_active;.
5350: 09 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54  .CK_ATTRIBUTE_PT
5360: 52 20 73 65 61 72 63 68 5f 71 75 65 72 79 3b 0a  R search_query;.
5370: 09 43 4b 5f 55 4c 4f 4e 47 20 73 65 61 72 63 68  .CK_ULONG search
5380: 5f 71 75 65 72 79 5f 63 6f 75 6e 74 3b 0a 09 75  _query_count;..u
5390: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 73 65 61  nsigned long sea
53a0: 72 63 68 5f 63 75 72 72 5f 69 64 3b 0a 0a 09 69  rch_curr_id;...i
53b0: 6e 74 20 73 69 67 6e 5f 61 63 74 69 76 65 3b 0a  nt sign_active;.
53c0: 09 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 54 59  .CK_MECHANISM_TY
53d0: 50 45 20 73 69 67 6e 5f 6d 65 63 68 61 6e 69 73  PE sign_mechanis
53e0: 6d 3b 0a 09 43 4b 5f 42 59 54 45 5f 50 54 52 20  m;..CK_BYTE_PTR 
53f0: 73 69 67 6e 5f 62 75 66 3b 0a 09 75 6e 73 69 67  sign_buf;..unsig
5400: 6e 65 64 20 6c 6f 6e 67 20 73 69 67 6e 5f 62 75  ned long sign_bu
5410: 66 6c 65 6e 3b 0a 09 75 6e 73 69 67 6e 65 64 20  flen;..unsigned 
5420: 6c 6f 6e 67 20 73 69 67 6e 5f 62 75 66 75 73 65  long sign_bufuse
5430: 64 3b 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65  d;..struct cacke
5440: 79 5f 69 64 65 6e 74 69 74 79 20 2a 73 69 67 6e  y_identity *sign
5450: 5f 69 64 65 6e 74 69 74 79 3b 0a 0a 09 69 6e 74  _identity;...int
5460: 20 64 65 63 72 79 70 74 5f 61 63 74 69 76 65 3b   decrypt_active;
5470: 0a 09 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 54  ..CK_MECHANISM_T
5480: 59 50 45 20 64 65 63 72 79 70 74 5f 6d 65 63 68  YPE decrypt_mech
5490: 61 6e 69 73 6d 3b 0a 09 43 4b 5f 56 4f 49 44 5f  anism;..CK_VOID_
54a0: 50 54 52 20 64 65 63 72 79 70 74 5f 6d 65 63 68  PTR decrypt_mech
54b0: 5f 70 61 72 6d 3b 0a 09 43 4b 5f 55 4c 4f 4e 47  _parm;..CK_ULONG
54c0: 20 64 65 63 72 79 70 74 5f 6d 65 63 68 5f 70 61   decrypt_mech_pa
54d0: 72 6d 6c 65 6e 3b 0a 09 73 74 72 75 63 74 20 63  rmlen;..struct c
54e0: 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79 20 2a  ackey_identity *
54f0: 64 65 63 72 79 70 74 5f 69 64 65 6e 74 69 74 79  decrypt_identity
5500: 3b 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 63 61 63  ;.};..struct cac
5510: 6b 65 79 5f 73 6c 6f 74 20 7b 0a 09 69 6e 74 20  key_slot {..int 
5520: 61 63 74 69 76 65 3b 0a 09 69 6e 74 20 69 6e 74  active;..int int
5530: 65 72 6e 61 6c 3b 0a 0a 09 63 68 61 72 20 2a 70  ernal;...char *p
5540: 63 73 63 5f 72 65 61 64 65 72 3b 0a 0a 09 69 6e  csc_reader;...in
5550: 74 20 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e  t pcsc_card_conn
5560: 65 63 74 65 64 3b 0a 09 53 43 41 52 44 48 41 4e  ected;..SCARDHAN
5570: 44 4c 45 20 70 63 73 63 5f 63 61 72 64 3b 0a 0a  DLE pcsc_card;..
5580: 09 69 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  .int transaction
5590: 5f 64 65 70 74 68 3b 0a 09 69 6e 74 20 74 72 61  _depth;..int tra
55a0: 6e 73 61 63 74 69 6f 6e 5f 6e 65 65 64 5f 68 77  nsaction_need_hw
55b0: 5f 6c 6f 63 6b 3b 0a 0a 09 69 6e 74 20 73 6c 6f  _lock;...int slo
55c0: 74 5f 72 65 73 65 74 3b 0a 0a 09 43 4b 5f 46 4c  t_reset;...CK_FL
55d0: 41 47 53 20 74 6f 6b 65 6e 5f 66 6c 61 67 73 3b  AGS token_flags;
55e0: 0a 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72  ...unsigned char
55f0: 20 2a 6c 61 62 65 6c 3b 0a 0a 09 44 57 4f 52 44   *label;...DWORD
5600: 20 70 72 6f 74 6f 63 6f 6c 3b 0a 0a 09 75 6e 73   protocol;...uns
5610: 69 67 6e 65 64 20 69 6e 74 20 63 61 63 68 65 64  igned int cached
5620: 5f 63 65 72 74 73 5f 63 6f 75 6e 74 3b 0a 09 73  _certs_count;..s
5630: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73  truct cackey_pcs
5640: 63 5f 69 64 65 6e 74 69 74 79 20 2a 63 61 63 68  c_identity *cach
5650: 65 64 5f 63 65 72 74 73 3b 0a 7d 3b 0a 0a 74 79  ed_certs;.};..ty
5660: 70 65 64 65 66 20 65 6e 75 6d 20 7b 0a 09 43 41  pedef enum {..CA
5670: 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 47 45 4e  CKEY_TLV_APP_GEN
5680: 45 52 49 43 20 3d 20 30 78 30 31 2c 0a 09 43 41  ERIC = 0x01,..CA
5690: 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 53 4b 49  CKEY_TLV_APP_SKI
56a0: 20 20 20 20 20 3d 20 30 78 30 32 2c 0a 09 43 41       = 0x02,..CA
56b0: 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 50 4b 49  CKEY_TLV_APP_PKI
56c0: 20 20 20 20 20 3d 20 30 78 30 34 0a 7d 20 63 61       = 0x04.} ca
56d0: 63 6b 65 79 5f 74 6c 76 5f 61 70 70 74 79 70 65  ckey_tlv_apptype
56e0: 3b 0a 0a 74 79 70 65 64 65 66 20 65 6e 75 6d 20  ;..typedef enum 
56f0: 7b 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42  {..CACKEY_TLV_OB
5700: 4a 49 44 5f 47 45 4e 45 52 41 4c 49 4e 46 4f 20  JID_GENERALINFO 
5710: 20 20 20 20 20 20 3d 20 30 78 32 30 30 30 2c 0a        = 0x2000,.
5720: 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49  .CACKEY_TLV_OBJI
5730: 44 5f 50 52 4f 50 45 52 53 4f 4e 41 4c 49 4e 46  D_PROPERSONALINF
5740: 4f 20 20 20 3d 20 30 78 32 31 30 30 2c 0a 09 43  O   = 0x2100,..C
5750: 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f  ACKEY_TLV_OBJID_
5760: 41 43 43 45 53 53 43 4f 4e 54 52 4f 4c 20 20 20  ACCESSCONTROL   
5770: 20 20 3d 20 30 78 33 30 30 30 2c 0a 09 43 41 43    = 0x3000,..CAC
5780: 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 4c 4f  KEY_TLV_OBJID_LO
5790: 47 49 4e 20 20 20 20 20 20 20 20 20 20 20 20 20  GIN             
57a0: 3d 20 30 78 34 30 30 30 2c 0a 09 43 41 43 4b 45  = 0x4000,..CACKE
57b0: 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 52 44  Y_TLV_OBJID_CARD
57c0: 49 4e 46 4f 20 20 20 20 20 20 20 20 20 20 3d 20  INFO          = 
57d0: 30 78 35 30 30 30 2c 0a 09 43 41 43 4b 45 59 5f  0x5000,..CACKEY_
57e0: 54 4c 56 5f 4f 42 4a 49 44 5f 42 49 4f 4d 45 54  TLV_OBJID_BIOMET
57f0: 52 49 43 53 20 20 20 20 20 20 20 20 3d 20 30 78  RICS        = 0x
5800: 36 30 30 30 2c 0a 09 43 41 43 4b 45 59 5f 54 4c  6000,..CACKEY_TL
5810: 56 5f 4f 42 4a 49 44 5f 44 49 47 49 54 41 4c 53  V_OBJID_DIGITALS
5820: 49 47 43 45 52 54 20 20 20 20 3d 20 30 78 37 30  IGCERT    = 0x70
5830: 30 30 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f  00,..CACKEY_TLV_
5840: 4f 42 4a 49 44 5f 43 41 43 5f 50 45 52 53 4f 4e  OBJID_CAC_PERSON
5850: 20 20 20 20 20 20 20 20 3d 20 30 78 30 32 30 30          = 0x0200
5860: 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42  ,..CACKEY_TLV_OB
5870: 4a 49 44 5f 43 41 43 5f 42 45 4e 45 46 49 54 53  JID_CAC_BENEFITS
5880: 20 20 20 20 20 20 3d 20 30 78 30 32 30 32 2c 0a        = 0x0202,.
5890: 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49  .CACKEY_TLV_OBJI
58a0: 44 5f 43 41 43 5f 4f 54 48 45 52 42 45 4e 45 46  D_CAC_OTHERBENEF
58b0: 49 54 53 20 3d 20 30 78 30 32 30 33 2c 0a 09 43  ITS = 0x0203,..C
58c0: 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f  ACKEY_TLV_OBJID_
58d0: 43 41 43 5f 50 45 52 53 4f 4e 4e 45 4c 20 20 20  CAC_PERSONNEL   
58e0: 20 20 3d 20 30 78 30 32 30 31 2c 0a 09 43 41 43    = 0x0201,..CAC
58f0: 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41  KEY_TLV_OBJID_CA
5900: 43 5f 50 4b 49 43 45 52 54 20 20 20 20 20 20 20  C_PKICERT       
5910: 3d 20 30 78 30 32 46 45 0a 7d 20 63 61 63 6b 65  = 0x02FE.} cacke
5920: 79 5f 74 6c 76 5f 6f 62 6a 65 63 74 69 64 3b 0a  y_tlv_objectid;.
5930: 0a 74 79 70 65 64 65 66 20 65 6e 75 6d 20 7b 0a  .typedef enum {.
5940: 09 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 54  .CACKEY_PCSC_S_T
5950: 4f 4b 45 4e 50 52 45 53 45 4e 54 20 20 20 20 3d  OKENPRESENT    =
5960: 20 31 2c 0a 09 43 41 43 4b 45 59 5f 50 43 53 43   1,..CACKEY_PCSC
5970: 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 20 20 20  _S_OK           
5980: 20 20 20 3d 20 30 2c 0a 09 43 41 43 4b 45 59 5f     = 0,..CACKEY_
5990: 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 20 20  PCSC_E_GENERIC  
59a0: 20 20 20 20 20 20 20 3d 20 2d 31 2c 0a 09 43 41         = -1,..CA
59b0: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 42 41 44 50  CKEY_PCSC_E_BADP
59c0: 49 4e 20 20 20 20 20 20 20 20 20 20 3d 20 2d 32  IN          = -2
59d0: 2c 0a 09 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  ,..CACKEY_PCSC_E
59e0: 5f 4c 4f 43 4b 45 44 20 20 20 20 20 20 20 20 20  _LOCKED         
59f0: 20 3d 20 2d 33 2c 0a 09 43 41 43 4b 45 59 5f 50   = -3,..CACKEY_P
5a00: 43 53 43 5f 45 5f 4e 45 45 44 4c 4f 47 49 4e 20  CSC_E_NEEDLOGIN 
5a10: 20 20 20 20 20 20 3d 20 2d 34 2c 0a 09 43 41 43        = -4,..CAC
5a20: 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e  KEY_PCSC_E_TOKEN
5a30: 41 42 53 45 4e 54 20 20 20 20 20 3d 20 2d 36 2c  ABSENT     = -6,
5a40: 0a 09 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  ..CACKEY_PCSC_E_
5a50: 52 45 54 52 59 20 20 20 20 20 20 20 20 20 20 20  RETRY           
5a60: 3d 20 2d 37 2c 0a 09 43 41 43 4b 45 59 5f 50 43  = -7,..CACKEY_PC
5a70: 53 43 5f 45 5f 4e 4f 44 41 54 41 20 20 20 20 20  SC_E_NODATA     
5a80: 20 20 20 20 20 3d 20 2d 38 0a 7d 20 63 61 63 6b       = -8.} cack
5a90: 65 79 5f 72 65 74 3b 0a 0a 73 74 72 75 63 74 20  ey_ret;..struct 
5aa0: 63 61 63 6b 65 79 5f 74 6c 76 5f 63 61 72 64 75  cackey_tlv_cardu
5ab0: 72 6c 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 63  rl {..unsigned c
5ac0: 68 61 72 20 20 20 20 20 20 20 20 72 69 64 5b 35  har        rid[5
5ad0: 5d 3b 0a 09 63 61 63 6b 65 79 5f 74 6c 76 5f 61  ];..cackey_tlv_a
5ae0: 70 70 74 79 70 65 20 20 20 61 70 70 74 79 70 65  pptype   apptype
5af0: 3b 0a 09 63 61 63 6b 65 79 5f 74 6c 76 5f 6f 62  ;..cackey_tlv_ob
5b00: 6a 65 63 74 69 64 20 20 6f 62 6a 65 63 74 69 64  jectid  objectid
5b10: 3b 0a 09 63 61 63 6b 65 79 5f 74 6c 76 5f 6f 62  ;..cackey_tlv_ob
5b20: 6a 65 63 74 69 64 20 20 61 70 70 69 64 3b 0a 09  jectid  appid;..
5b30: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 20 20  unsigned char   
5b40: 20 20 20 20 20 70 69 6e 69 64 3b 0a 7d 3b 0a 0a       pinid;.};..
5b50: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c  struct cackey_tl
5b60: 76 5f 65 6e 74 69 74 79 3b 0a 73 74 72 75 63 74  v_entity;.struct
5b70: 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69   cackey_tlv_enti
5b80: 74 79 20 7b 0a 09 75 69 6e 74 38 5f 74 20 74 61  ty {..uint8_t ta
5b90: 67 3b 0a 09 73 69 7a 65 5f 74 20 6c 65 6e 67 74  g;..size_t lengt
5ba0: 68 3b 0a 0a 09 75 6e 69 6f 6e 20 7b 0a 09 09 76  h;...union {...v
5bb0: 6f 69 64 20 2a 76 61 6c 75 65 3b 0a 09 09 73 74  oid *value;...st
5bc0: 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f  ruct cackey_tlv_
5bd0: 63 61 72 64 75 72 6c 20 2a 76 61 6c 75 65 5f 63  cardurl *value_c
5be0: 61 72 64 75 72 6c 3b 0a 09 09 75 69 6e 74 38 5f  ardurl;...uint8_
5bf0: 74 20 76 61 6c 75 65 5f 62 79 74 65 3b 0a 09 7d  t value_byte;..}
5c00: 3b 0a 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65  ;...struct cacke
5c10: 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20 2a 5f 6e  y_tlv_entity *_n
5c20: 65 78 74 3b 0a 7d 3b 0a 0a 2f 2a 20 43 41 43 4b  ext;.};../* CACK
5c30: 45 59 20 47 6c 6f 62 61 6c 20 48 61 6e 64 6c 65  EY Global Handle
5c40: 73 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  s */.static void
5c50: 20 2a 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b   *cackey_biglock
5c60: 20 3d 20 4e 55 4c 4c 3b 0a 73 74 61 74 69 63 20   = NULL;.static 
5c70: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 65  struct cackey_se
5c80: 73 73 69 6f 6e 20 63 61 63 6b 65 79 5f 73 65 73  ssion cackey_ses
5c90: 73 69 6f 6e 73 5b 31 32 38 5d 3b 0a 73 74 61 74  sions[128];.stat
5ca0: 69 63 20 73 74 72 75 63 74 20 63 61 63 6b 65 79  ic struct cackey
5cb0: 5f 73 6c 6f 74 20 63 61 63 6b 65 79 5f 73 6c 6f  _slot cackey_slo
5cc0: 74 73 5b 31 32 38 5d 3b 0a 73 74 61 74 69 63 20  ts[128];.static 
5cd0: 69 6e 74 20 63 61 63 6b 65 79 5f 69 6e 69 74 69  int cackey_initi
5ce0: 61 6c 69 7a 65 64 20 3d 20 30 3b 0a 73 74 61 74  alized = 0;.stat
5cf0: 69 63 20 69 6e 74 20 63 61 63 6b 65 79 5f 62 69  ic int cackey_bi
5d00: 67 6c 6f 63 6b 5f 69 6e 69 74 20 3d 20 30 3b 0a  glock_init = 0;.
5d10: 43 4b 5f 43 5f 49 4e 49 54 49 41 4c 49 5a 45 5f  CK_C_INITIALIZE_
5d20: 41 52 47 53 20 63 61 63 6b 65 79 5f 61 72 67 73  ARGS cackey_args
5d30: 3b 0a 0a 2f 2a 2a 20 45 78 74 72 61 20 63 65 72  ;../** Extra cer
5d40: 74 69 66 69 63 61 74 65 73 20 74 6f 20 69 6e 63  tificates to inc
5d50: 6c 75 64 65 20 69 6e 20 74 6f 6b 65 6e 20 2a 2a  lude in token **
5d60: 2f 0a 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  /.struct cackey_
5d70: 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 65 78  pcsc_identity ex
5d80: 74 72 61 5f 63 65 72 74 73 5b 5d 20 3d 20 7b 0a  tra_certs[] = {.
5d90: 23 69 6e 63 6c 75 64 65 20 22 63 61 63 6b 65 79  #include "cackey
5da0: 5f 62 75 69 6c 74 69 6e 5f 63 65 72 74 73 2e 68  _builtin_certs.h
5db0: 22 0a 7d 3b 0a 0a 23 64 65 66 69 6e 65 20 43 41  ".};..#define CA
5dc0: 43 4b 45 59 5f 4d 41 43 52 4f 5f 44 45 46 41 55  CKEY_MACRO_DEFAU
5dd0: 4c 54 5f 58 53 54 52 28 73 74 72 29 20 43 41 43  LT_XSTR(str) CAC
5de0: 4b 45 59 5f 4d 41 43 52 4f 5f 44 45 46 41 55 4c  KEY_MACRO_DEFAUL
5df0: 54 5f 53 54 52 28 73 74 72 29 0a 23 64 65 66 69  T_STR(str).#defi
5e00: 6e 65 20 43 41 43 4b 45 59 5f 4d 41 43 52 4f 5f  ne CACKEY_MACRO_
5e10: 44 45 46 41 55 4c 54 5f 53 54 52 28 73 74 72 29  DEFAULT_STR(str)
5e20: 20 23 73 74 72 0a 0a 2f 2a 20 50 72 6f 74 65 63   #str../* Protec
5e30: 74 65 64 20 41 75 74 68 65 6e 74 69 63 61 74 69  ted Authenticati
5e40: 6f 6e 20 50 61 74 68 20 63 6f 6d 6d 61 6e 64 20  on Path command 
5e50: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
5e60: 63 61 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61  cackey_pin_comma
5e70: 6e 64 20 3d 20 4e 55 4c 4c 3b 0a 0a 2f 2a 20 52  nd = NULL;../* R
5e80: 65 61 64 65 72 20 45 78 63 6c 75 73 69 6f 6e 20  eader Exclusion 
5e90: 6f 72 20 49 6e 63 6c 75 64 65 2d 6f 6e 6c 79 20  or Include-only 
5ea0: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
5eb0: 63 61 63 6b 65 79 5f 72 65 61 64 65 72 73 5f 69  cackey_readers_i
5ec0: 6e 63 6c 75 64 65 5f 6f 6e 6c 79 20 3d 20 4e 55  nclude_only = NU
5ed0: 4c 4c 3b 0a 73 74 61 74 69 63 20 63 68 61 72 20  LL;.static char 
5ee0: 2a 63 61 63 6b 65 79 5f 72 65 61 64 65 72 73 5f  *cackey_readers_
5ef0: 65 78 63 6c 75 64 65 20 3d 20 4e 55 4c 4c 3b 0a  exclude = NULL;.
5f00: 0a 2f 2a 20 50 43 53 43 20 47 6c 6f 62 61 6c 20  ./* PCSC Global 
5f10: 48 61 6e 64 6c 65 73 20 2a 2f 0a 73 74 61 74 69  Handles */.stati
5f20: 63 20 4c 50 53 43 41 52 44 43 4f 4e 54 45 58 54  c LPSCARDCONTEXT
5f30: 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e   cackey_pcsc_han
5f40: 64 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 73 74 61  dle = NULL;..sta
5f50: 74 69 63 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  tic unsigned lon
5f60: 67 20 63 61 63 6b 65 79 5f 67 65 74 76 65 72 73  g cackey_getvers
5f70: 69 6f 6e 28 76 6f 69 64 29 20 7b 0a 09 73 74 61  ion(void) {..sta
5f80: 74 69 63 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  tic unsigned lon
5f90: 67 20 72 65 74 76 61 6c 20 3d 20 32 35 35 3b 0a  g retval = 255;.
5fa0: 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6d  .unsigned long m
5fb0: 61 6a 6f 72 20 3d 20 30 3b 0a 09 75 6e 73 69 67  ajor = 0;..unsig
5fc0: 6e 65 64 20 6c 6f 6e 67 20 6d 69 6e 6f 72 20 3d  ned long minor =
5fd0: 20 30 3b 0a 09 63 68 61 72 20 2a 6d 61 6a 6f 72   0;..char *major
5fe0: 5f 73 74 72 20 3d 20 4e 55 4c 4c 3b 0a 09 63 68  _str = NULL;..ch
5ff0: 61 72 20 2a 6d 69 6e 6f 72 5f 73 74 72 20 3d 20  ar *minor_str = 
6000: 4e 55 4c 4c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  NULL;...CACKEY_D
6010: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
6020: 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 72 65  led.");...if (re
6030: 74 76 61 6c 20 21 3d 20 32 35 35 29 20 7b 0a 09  tval != 255) {..
6040: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
6050: 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
6060: 30 78 25 6c 78 20 28 63 61 63 68 65 64 29 2e 22  0x%lx (cached)."
6070: 2c 20 72 65 74 76 61 6c 29 3b 0a 0a 09 09 72 65  , retval);....re
6080: 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 09 7d  turn(retval);..}
6090: 0a 0a 09 72 65 74 76 61 6c 20 3d 20 30 3b 0a 0a  ...retval = 0;..
60a0: 23 69 66 64 65 66 20 50 41 43 4b 41 47 45 5f 56  #ifdef PACKAGE_V
60b0: 45 52 53 49 4f 4e 0a 20 20 20 20 20 20 20 20 6d  ERSION.        m
60c0: 61 6a 6f 72 5f 73 74 72 20 3d 20 50 41 43 4b 41  ajor_str = PACKA
60d0: 47 45 5f 56 45 52 53 49 4f 4e 3b 0a 09 69 66 20  GE_VERSION;..if 
60e0: 28 6d 61 6a 6f 72 5f 73 74 72 29 20 7b 0a 09 20  (major_str) {.. 
60f0: 20 20 20 20 20 20 20 6d 61 6a 6f 72 20 3d 20 73         major = s
6100: 74 72 74 6f 75 6c 28 6d 61 6a 6f 72 5f 73 74 72  trtoul(major_str
6110: 2c 20 26 6d 69 6e 6f 72 5f 73 74 72 2c 20 31 30  , &minor_str, 10
6120: 29 3b 0a 0a 09 09 69 66 20 28 6d 69 6e 6f 72 5f  );....if (minor_
6130: 73 74 72 29 20 7b 0a 09 09 09 6d 69 6e 6f 72 20  str) {....minor 
6140: 3d 20 73 74 72 74 6f 75 6c 28 6d 69 6e 6f 72 5f  = strtoul(minor_
6150: 73 74 72 20 2b 20 31 2c 20 4e 55 4c 4c 2c 20 31  str + 1, NULL, 1
6160: 30 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 72 65 74  0);...}..}...ret
6170: 76 61 6c 20 3d 20 28 6d 61 6a 6f 72 20 3c 3c 20  val = (major << 
6180: 31 36 29 20 7c 20 28 6d 69 6e 6f 72 20 3c 3c 20  16) | (minor << 
6190: 38 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 43 41 43  8);.#endif...CAC
61a0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
61b0: 28 22 52 65 74 75 72 6e 69 6e 67 20 30 78 25 6c  ("Returning 0x%l
61c0: 78 22 2c 20 72 65 74 76 61 6c 29 3b 0a 0a 09 72  x", retval);...r
61d0: 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d  eturn(retval);.}
61e0: 0a 0a 2f 2a 20 50 43 2f 53 43 20 52 65 6c 61 74  ../* PC/SC Relat
61f0: 65 64 20 46 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a  ed Functions */.
6200: 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20  /*. * SYNPOSIS. 
6210: 2a 20 20 20 20 20 76 6f 69 64 20 63 61 63 6b 65  *     void cacke
6220: 79 5f 73 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e 65  y_slots_disconne
6230: 63 74 5f 61 6c 6c 28 76 6f 69 64 29 3b 0a 20 2a  ct_all(void);. *
6240: 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a  . * ARGUMENTS. *
6250: 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 20       None. *. * 
6260: 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20  RETURN VALUE. * 
6270: 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 4e      None. *. * N
6280: 4f 54 45 53 0a 20 2a 20 20 20 20 20 54 68 69 73  OTES. *     This
6290: 20 66 75 6e 63 74 69 6f 6e 20 64 69 73 63 6f 6e   function discon
62a0: 6e 65 63 74 73 20 66 72 6f 6d 20 61 6c 6c 20 63  nects from all c
62b0: 61 72 64 73 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61  ards.. *. */.sta
62c0: 74 69 63 20 76 6f 69 64 20 63 61 63 6b 65 79 5f  tic void cackey_
62d0: 73 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e 65 63 74  slots_disconnect
62e0: 5f 61 6c 6c 28 76 6f 69 64 29 20 7b 0a 09 75 69  _all(void) {..ui
62f0: 6e 74 33 32 5f 74 20 69 64 78 3b 0a 0a 09 43 41  nt32_t idx;...CA
6300: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
6310: 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
6320: 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64  for (idx = 0; id
6330: 78 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b  x < (sizeof(cack
6340: 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65  ey_slots) / size
6350: 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  of(cackey_slots[
6360: 30 5d 29 29 3b 20 69 64 78 2b 2b 29 20 7b 0a 09  0])); idx++) {..
6370: 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74  .if (cackey_slot
6380: 73 5b 69 64 78 5d 2e 69 6e 74 65 72 6e 61 6c 29  s[idx].internal)
6390: 20 7b 0a 09 09 09 2f 2a 20 53 6b 69 70 20 69 6e   {..../* Skip in
63a0: 74 65 72 6e 61 6c 20 73 6c 6f 74 73 20 2a 2f 0a  ternal slots */.
63b0: 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 7d  ...continue;...}
63c0: 0a 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73  ....if (cackey_s
63d0: 6c 6f 74 73 5b 69 64 78 5d 2e 70 63 73 63 5f 63  lots[idx].pcsc_c
63e0: 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 29 20 7b  ard_connected) {
63f0: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
6400: 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64 44 69  _PRINTF("SCardDi
6410: 73 63 6f 6e 6e 65 63 74 28 25 6c 75 29 20 63 61  sconnect(%lu) ca
6420: 6c 6c 65 64 22 2c 20 28 75 6e 73 69 67 6e 65 64  lled", (unsigned
6430: 20 6c 6f 6e 67 29 20 69 64 78 29 3b 0a 0a 09 09   long) idx);....
6440: 09 53 43 61 72 64 44 69 73 63 6f 6e 6e 65 63 74  .SCardDisconnect
6450: 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64  (cackey_slots[id
6460: 78 5d 2e 70 63 73 63 5f 63 61 72 64 2c 20 53 43  x].pcsc_card, SC
6470: 41 52 44 5f 4c 45 41 56 45 5f 43 41 52 44 29 3b  ARD_LEAVE_CARD);
6480: 0a 09 09 7d 0a 0a 09 09 69 66 20 28 63 61 63 6b  ...}....if (cack
6490: 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 6c 61  ey_slots[idx].la
64a0: 62 65 6c 29 20 7b 0a 09 09 09 66 72 65 65 28 63  bel) {....free(c
64b0: 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d  ackey_slots[idx]
64c0: 2e 6c 61 62 65 6c 29 3b 0a 0a 09 09 09 63 61 63  .label);.....cac
64d0: 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 6c  key_slots[idx].l
64e0: 61 62 65 6c 20 3d 20 4e 55 4c 4c 3b 0a 09 09 7d  abel = NULL;...}
64f0: 0a 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ....cackey_slots
6500: 5b 69 64 78 5d 2e 70 63 73 63 5f 63 61 72 64 5f  [idx].pcsc_card_
6510: 63 6f 6e 6e 65 63 74 65 64 20 3d 20 30 3b 0a 09  connected = 0;..
6520: 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64  .cackey_slots[id
6530: 78 5d 2e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64  x].transaction_d
6540: 65 70 74 68 20 3d 20 30 3b 0a 09 09 63 61 63 6b  epth = 0;...cack
6550: 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 74 72  ey_slots[idx].tr
6560: 61 6e 73 61 63 74 69 6f 6e 5f 6e 65 65 64 5f 68  ansaction_need_h
6570: 77 5f 6c 6f 63 6b 20 3d 20 30 3b 0a 0a 09 09 69  w_lock = 0;....i
6580: 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  f (cackey_slots[
6590: 69 64 78 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09  idx].active) {..
65a0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
65b0: 52 49 4e 54 46 28 22 4d 61 72 6b 69 6e 67 20 61  RINTF("Marking a
65c0: 63 74 69 76 65 20 73 6c 6f 74 20 25 6c 75 20 61  ctive slot %lu a
65d0: 73 20 62 65 69 6e 67 20 72 65 73 65 74 22 2c 20  s being reset", 
65e0: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
65f0: 69 64 78 29 3b 0a 09 09 7d 0a 0a 09 09 63 61 63  idx);...}....cac
6600: 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 73  key_slots[idx].s
6610: 6c 6f 74 5f 72 65 73 65 74 20 3d 20 31 3b 0a 09  lot_reset = 1;..
6620: 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
6630: 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
6640: 6e 67 22 29 3b 0a 0a 09 72 65 74 75 72 6e 3b 0a  ng");...return;.
6650: 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49  }../*. * SYNPOSI
6660: 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f  S. *     cackey_
6670: 72 65 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f  ret cackey_pcsc_
6680: 63 6f 6e 6e 65 63 74 28 76 6f 69 64 29 3b 0a 20  connect(void);. 
6690: 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20  *. * ARGUMENTS. 
66a0: 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a  *     None. *. *
66b0: 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a   RETURN VALUE. *
66c0: 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43       CACKEY_PCSC
66d0: 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 20 4f 6e  _S_OK         On
66e0: 20 73 75 63 63 65 73 73 0a 20 2a 20 20 20 20 20   success. *     
66f0: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45  CACKEY_PCSC_E_GE
6700: 4e 45 52 49 43 20 20 20 20 4f 6e 20 65 72 72 6f  NERIC    On erro
6710: 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a  r. *. * NOTES. *
6720: 20 20 20 20 20 54 68 69 73 20 66 75 6e 63 74 69       This functi
6730: 6f 6e 20 63 6f 6e 6e 65 63 74 73 20 74 6f 20 74  on connects to t
6740: 68 65 20 50 43 2f 53 43 20 43 6f 6e 6e 65 63 74  he PC/SC Connect
6750: 69 6f 6e 20 4d 61 6e 61 67 65 72 20 61 6e 64 20  ion Manager and 
6760: 75 70 64 61 74 65 73 20 74 68 65 0a 20 2a 20 20  updates the. *  
6770: 20 20 20 67 6c 6f 62 61 6c 20 68 61 6e 64 6c 65     global handle
6780: 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20  .. *. */.static 
6790: 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65  cackey_ret cacke
67a0: 79 5f 70 63 73 63 5f 63 6f 6e 6e 65 63 74 28 76  y_pcsc_connect(v
67b0: 6f 69 64 29 20 7b 0a 09 4c 4f 4e 47 20 73 63 61  oid) {..LONG sca
67c0: 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72  rd_est_context_r
67d0: 65 74 3b 0a 23 69 66 64 65 66 20 48 41 56 45 5f  et;.#ifdef HAVE_
67e0: 53 43 41 52 44 49 53 56 41 4c 49 44 43 4f 4e 54  SCARDISVALIDCONT
67f0: 45 58 54 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f  EXT..LONG scard_
6800: 69 73 76 61 6c 69 64 5f 72 65 74 3b 0a 23 65 6e  isvalid_ret;.#en
6810: 64 69 66 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  dif...CACKEY_DEB
6820: 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
6830: 64 2e 22 29 3b 0a 0a 09 69 66 20 28 63 61 63 6b  d.");...if (cack
6840: 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d  ey_pcsc_handle =
6850: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 63 61 63 6b  = NULL) {...cack
6860: 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d  ey_pcsc_handle =
6870: 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a   malloc(sizeof(*
6880: 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64  cackey_pcsc_hand
6890: 6c 65 29 29 3b 0a 09 09 69 66 20 28 63 61 63 6b  le));...if (cack
68a0: 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d  ey_pcsc_handle =
68b0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 43 41 43  = NULL) {....CAC
68c0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
68d0: 28 22 43 61 6c 6c 20 74 6f 20 6d 61 6c 6c 6f 63  ("Call to malloc
68e0: 28 29 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72  () failed, retur
68f0: 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22  ning in failure"
6900: 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c  );.....cackey_sl
6910: 6f 74 73 5f 64 69 73 63 6f 6e 6e 65 63 74 5f 61  ots_disconnect_a
6920: 6c 6c 28 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e  ll();.....return
6930: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47  (CACKEY_PCSC_E_G
6940: 45 4e 45 52 49 43 29 3b 0a 09 09 7d 0a 0a 09 09  ENERIC);...}....
6950: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
6960: 4e 54 46 28 22 53 43 61 72 64 45 73 74 61 62 6c  NTF("SCardEstabl
6970: 69 73 68 43 6f 6e 74 65 78 74 28 29 20 63 61 6c  ishContext() cal
6980: 6c 65 64 22 29 3b 0a 09 09 73 63 61 72 64 5f 65  led");...scard_e
6990: 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74 20 3d  st_context_ret =
69a0: 20 53 43 61 72 64 45 73 74 61 62 6c 69 73 68 43   SCardEstablishC
69b0: 6f 6e 74 65 78 74 28 53 43 41 52 44 5f 53 43 4f  ontext(SCARD_SCO
69c0: 50 45 5f 53 59 53 54 45 4d 2c 20 4e 55 4c 4c 2c  PE_SYSTEM, NULL,
69d0: 20 4e 55 4c 4c 2c 20 63 61 63 6b 65 79 5f 70 63   NULL, cackey_pc
69e0: 73 63 5f 68 61 6e 64 6c 65 29 3b 0a 09 09 69 66  sc_handle);...if
69f0: 20 28 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74   (scard_est_cont
6a00: 65 78 74 5f 72 65 74 20 21 3d 20 53 43 41 52 44  ext_ret != SCARD
6a10: 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09  _S_SUCCESS) {...
6a20: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
6a30: 49 4e 54 46 28 22 43 61 6c 6c 20 74 6f 20 53 43  INTF("Call to SC
6a40: 61 72 64 45 73 74 61 62 6c 69 73 68 43 6f 6e 74  ardEstablishCont
6a50: 65 78 74 20 66 61 69 6c 65 64 20 28 72 65 74 75  ext failed (retu
6a60: 72 6e 65 64 20 25 73 2f 25 6c 69 29 2c 20 72 65  rned %s/%li), re
6a70: 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
6a80: 72 65 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55  re", CACKEY_DEBU
6a90: 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f  G_FUNC_SCARDERR_
6aa0: 54 4f 5f 53 54 52 28 73 63 61 72 64 5f 65 73 74  TO_STR(scard_est
6ab0: 5f 63 6f 6e 74 65 78 74 5f 72 65 74 29 2c 20 28  _context_ret), (
6ac0: 6c 6f 6e 67 29 20 73 63 61 72 64 5f 65 73 74 5f  long) scard_est_
6ad0: 63 6f 6e 74 65 78 74 5f 72 65 74 29 3b 0a 0a 09  context_ret);...
6ae0: 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f 70 63  ..free(cackey_pc
6af0: 73 63 5f 68 61 6e 64 6c 65 29 3b 0a 09 09 09 63  sc_handle);....c
6b00: 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c  ackey_pcsc_handl
6b10: 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 63 61  e = NULL;.....ca
6b20: 63 6b 65 79 5f 73 6c 6f 74 73 5f 64 69 73 63 6f  ckey_slots_disco
6b30: 6e 6e 65 63 74 5f 61 6c 6c 28 29 3b 0a 0a 09 09  nnect_all();....
6b40: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
6b50: 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a  CSC_E_GENERIC);.
6b60: 09 09 7d 0a 09 7d 0a 0a 23 69 66 64 65 66 20 48  ..}..}..#ifdef H
6b70: 41 56 45 5f 53 43 41 52 44 49 53 56 41 4c 49 44  AVE_SCARDISVALID
6b80: 43 4f 4e 54 45 58 54 0a 09 43 41 43 4b 45 59 5f  CONTEXT..CACKEY_
6b90: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43  DEBUG_PRINTF("SC
6ba0: 61 72 64 49 73 56 61 6c 69 64 43 6f 6e 74 65 78  ardIsValidContex
6bb0: 74 28 29 20 63 61 6c 6c 65 64 22 29 3b 0a 09 73  t() called");..s
6bc0: 63 61 72 64 5f 69 73 76 61 6c 69 64 5f 72 65 74  card_isvalid_ret
6bd0: 20 3d 20 53 43 61 72 64 49 73 56 61 6c 69 64 43   = SCardIsValidC
6be0: 6f 6e 74 65 78 74 28 2a 63 61 63 6b 65 79 5f 70  ontext(*cackey_p
6bf0: 63 73 63 5f 68 61 6e 64 6c 65 29 3b 0a 09 69 66  csc_handle);..if
6c00: 20 28 73 63 61 72 64 5f 69 73 76 61 6c 69 64 5f   (scard_isvalid_
6c10: 72 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f 53  ret != SCARD_S_S
6c20: 55 43 43 45 53 53 29 20 7b 0a 09 09 43 41 43 4b  UCCESS) {...CACK
6c30: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
6c40: 22 48 61 6e 64 6c 65 20 68 61 73 20 62 65 63 6f  "Handle has beco
6c50: 6d 65 20 69 6e 76 61 6c 69 64 20 28 53 43 61 72  me invalid (SCar
6c60: 64 49 73 56 61 6c 69 64 43 6f 6e 74 65 78 74 20  dIsValidContext 
6c70: 3d 20 25 73 2f 25 6c 69 29 2c 20 74 72 79 69 6e  = %s/%li), tryin
6c80: 67 20 74 6f 20 72 65 2d 65 73 74 61 62 6c 69 73  g to re-establis
6c90: 68 2e 2e 2e 22 2c 20 43 41 43 4b 45 59 5f 44 45  h...", CACKEY_DE
6ca0: 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52  BUG_FUNC_SCARDER
6cb0: 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 5f 69  R_TO_STR(scard_i
6cc0: 73 76 61 6c 69 64 5f 72 65 74 29 2c 20 28 6c 6f  svalid_ret), (lo
6cd0: 6e 67 29 20 73 63 61 72 64 5f 69 73 76 61 6c 69  ng) scard_isvali
6ce0: 64 5f 72 65 74 29 3b 0a 0a 09 09 43 41 43 4b 45  d_ret);....CACKE
6cf0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
6d00: 53 43 61 72 64 45 73 74 61 62 6c 69 73 68 43 6f  SCardEstablishCo
6d10: 6e 74 65 78 74 28 29 20 63 61 6c 6c 65 64 22 29  ntext() called")
6d20: 3b 0a 09 09 73 63 61 72 64 5f 65 73 74 5f 63 6f  ;...scard_est_co
6d30: 6e 74 65 78 74 5f 72 65 74 20 3d 20 53 43 61 72  ntext_ret = SCar
6d40: 64 45 73 74 61 62 6c 69 73 68 43 6f 6e 74 65 78  dEstablishContex
6d50: 74 28 53 43 41 52 44 5f 53 43 4f 50 45 5f 53 59  t(SCARD_SCOPE_SY
6d60: 53 54 45 4d 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c  STEM, NULL, NULL
6d70: 2c 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61  , cackey_pcsc_ha
6d80: 6e 64 6c 65 29 3b 0a 09 09 69 66 20 28 73 63 61  ndle);...if (sca
6d90: 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72  rd_est_context_r
6da0: 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f 53 55  et != SCARD_S_SU
6db0: 43 43 45 53 53 29 20 7b 0a 09 09 09 43 41 43 4b  CCESS) {....CACK
6dc0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
6dd0: 22 43 61 6c 6c 20 74 6f 20 53 43 61 72 64 45 73  "Call to SCardEs
6de0: 74 61 62 6c 69 73 68 43 6f 6e 74 65 78 74 20 66  tablishContext f
6df0: 61 69 6c 65 64 20 28 72 65 74 75 72 6e 65 64 20  ailed (returned 
6e00: 25 73 2f 25 6c 69 29 2c 20 72 65 74 75 72 6e 69  %s/%li), returni
6e10: 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 2c 20  ng in failure", 
6e20: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e  CACKEY_DEBUG_FUN
6e30: 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54  C_SCARDERR_TO_ST
6e40: 52 28 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74  R(scard_est_cont
6e50: 65 78 74 5f 72 65 74 29 2c 20 28 6c 6f 6e 67 29  ext_ret), (long)
6e60: 20 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65   scard_est_conte
6e70: 78 74 5f 72 65 74 29 3b 0a 0a 09 09 09 66 72 65  xt_ret);.....fre
6e80: 65 28 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61  e(cackey_pcsc_ha
6e90: 6e 64 6c 65 29 3b 0a 09 09 09 63 61 63 6b 65 79  ndle);....cackey
6ea0: 5f 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d 20 4e  _pcsc_handle = N
6eb0: 55 4c 4c 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f  ULL;.....cackey_
6ec0: 73 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e 65 63 74  slots_disconnect
6ed0: 5f 61 6c 6c 28 29 3b 0a 0a 09 09 09 72 65 74 75  _all();.....retu
6ee0: 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  rn(CACKEY_PCSC_E
6ef0: 5f 47 45 4e 45 52 49 43 29 3b 0a 09 09 7d 0a 0a  _GENERIC);...}..
6f00: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
6f10: 52 49 4e 54 46 28 22 48 61 6e 64 6c 65 20 68 61  RINTF("Handle ha
6f20: 73 20 62 65 65 6e 20 72 65 2d 65 73 74 61 62 6c  s been re-establ
6f30: 69 73 68 65 64 22 29 3b 0a 09 7d 0a 23 65 6e 64  ished");..}.#end
6f40: 69 66 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  if...CACKEY_DEBU
6f50: 47 5f 50 52 49 4e 54 46 28 22 53 75 63 65 73 73  G_PRINTF("Sucess
6f60: 66 75 6c 6c 79 20 63 6f 6e 6e 65 63 74 65 64 20  fully connected 
6f70: 74 6f 20 50 43 2f 53 43 2c 20 72 65 74 75 72 6e  to PC/SC, return
6f80: 69 6e 67 20 69 6e 20 73 75 63 63 65 73 73 22 29  ing in success")
6f90: 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ;...return(CACKE
6fa0: 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a  Y_PCSC_S_OK);.}.
6fb0: 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a  ./*. * SYNPOSIS.
6fc0: 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 72 65   *     cackey_re
6fd0: 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 64 69  t cackey_pcsc_di
6fe0: 73 63 6f 6e 6e 65 63 74 28 76 6f 69 64 29 3b 0a  sconnect(void);.
6ff0: 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a   *. * ARGUMENTS.
7000: 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20   *     None. *. 
7010: 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20  * RETURN VALUE. 
7020: 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53  *     CACKEY_PCS
7030: 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 20 4f  C_S_OK         O
7040: 6e 20 73 75 63 63 65 73 73 0a 20 2a 20 20 20 20  n success. *    
7050: 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47   CACKEY_PCSC_E_G
7060: 45 4e 45 52 49 43 20 20 20 20 4f 6e 20 65 72 72  ENERIC    On err
7070: 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20  or. *. * NOTES. 
7080: 2a 20 20 20 20 20 54 68 69 73 20 66 75 6e 63 74  *     This funct
7090: 69 6f 6e 20 64 69 73 63 6f 6e 6e 65 63 74 73 20  ion disconnects 
70a0: 66 72 6f 6d 20 74 68 65 20 50 43 2f 53 43 20 43  from the PC/SC C
70b0: 6f 6e 6e 65 63 74 69 6f 6e 20 6d 61 6e 61 67 65  onnection manage
70c0: 72 20 61 6e 64 20 75 70 64 61 74 65 73 0a 20 2a  r and updates. *
70d0: 20 20 20 20 20 74 68 65 20 67 6c 6f 62 61 6c 20       the global 
70e0: 68 61 6e 64 6c 65 2e 0a 20 2a 0a 20 2a 2f 0a 73  handle.. *. */.s
70f0: 74 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74  tatic cackey_ret
7100: 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 64 69 73   cackey_pcsc_dis
7110: 63 6f 6e 6e 65 63 74 28 76 6f 69 64 29 20 7b 0a  connect(void) {.
7120: 09 4c 4f 4e 47 20 73 63 61 72 64 5f 72 65 6c 5f  .LONG scard_rel_
7130: 63 6f 6e 74 65 78 74 5f 72 65 74 3b 0a 0a 09 43  context_ret;...C
7140: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
7150: 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
7160: 09 69 66 20 28 63 61 63 6b 65 79 5f 70 63 73 63  .if (cackey_pcsc
7170: 5f 68 61 6e 64 6c 65 20 3d 3d 20 4e 55 4c 4c 29  _handle == NULL)
7180: 20 7b 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b   {...return(CACK
7190: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 09  EY_PCSC_S_OK);..
71a0: 7d 0a 0a 09 73 63 61 72 64 5f 72 65 6c 5f 63 6f  }...scard_rel_co
71b0: 6e 74 65 78 74 5f 72 65 74 20 3d 20 53 43 61 72  ntext_ret = SCar
71c0: 64 52 65 6c 65 61 73 65 43 6f 6e 74 65 78 74 28  dReleaseContext(
71d0: 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e  *cackey_pcsc_han
71e0: 64 6c 65 29 3b 0a 0a 09 69 66 20 28 63 61 63 6b  dle);...if (cack
71f0: 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 29 20  ey_pcsc_handle) 
7200: 7b 0a 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f  {...free(cackey_
7210: 70 63 73 63 5f 68 61 6e 64 6c 65 29 3b 0a 09 0a  pcsc_handle);...
7220: 09 09 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61  ..cackey_pcsc_ha
7230: 6e 64 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a  ndle = NULL;..}.
7240: 0a 09 69 66 20 28 73 63 61 72 64 5f 72 65 6c 5f  ..if (scard_rel_
7250: 63 6f 6e 74 65 78 74 5f 72 65 74 20 21 3d 20 53  context_ret != S
7260: 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20  CARD_S_SUCCESS) 
7270: 7b 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  {...return(CACKE
7280: 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43  Y_PCSC_E_GENERIC
7290: 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 43  );..}...return(C
72a0: 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29  ACKEY_PCSC_S_OK)
72b0: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f  ;.}../*. * SYNPO
72c0: 53 49 53 0a 20 2a 20 20 20 20 20 76 6f 69 64 20  SIS. *     void 
72d0: 63 61 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74  cackey_mark_slot
72e0: 5f 72 65 73 65 74 28 73 74 72 75 63 74 20 63 61  _reset(struct ca
72f0: 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29  ckey_slot *slot)
7300: 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54  ;. *. * ARGUMENT
7310: 53 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a  S. *     None. *
7320: 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45  . * RETURN VALUE
7330: 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a  . *     None. *.
7340: 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20   * NOTES. *     
7350: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  This function ma
7360: 72 6b 73 20 61 20 73 6c 6f 74 20 68 61 73 20 68  rks a slot has h
7370: 61 76 69 6e 67 20 62 65 65 6e 20 72 65 73 65 74  aving been reset
7380: 2c 20 74 6f 20 6c 61 74 65 72 20 62 65 20 63 6c  , to later be cl
7390: 65 61 6e 65 64 20 75 70 2e 0a 20 2a 20 20 20 20  eaned up.. *    
73a0: 20 43 6c 65 61 6e 75 70 20 6f 6e 6c 79 20 68 61   Cleanup only ha
73b0: 70 70 65 6e 73 20 77 68 65 6e 20 61 20 50 4b 43  ppens when a PKC
73c0: 53 23 31 31 20 63 6c 69 65 6e 74 20 63 61 6c 6c  S#11 client call
73d0: 73 20 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73 49  s C_FindObjectsI
73e0: 6e 69 74 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74  nit.. *. */.stat
73f0: 69 63 20 76 6f 69 64 20 63 61 63 6b 65 79 5f 6d  ic void cackey_m
7400: 61 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74 28 73  ark_slot_reset(s
7410: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f  truct cackey_slo
7420: 74 20 2a 73 6c 6f 74 29 20 7b 0a 09 69 66 20 28  t *slot) {..if (
7430: 73 6c 6f 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  slot == NULL) {.
7440: 09 09 72 65 74 75 72 6e 3b 0a 09 7d 0a 0a 09 43  ..return;..}...C
7450: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
7460: 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
7470: 09 69 66 20 28 73 6c 6f 74 2d 3e 70 63 73 63 5f  .if (slot->pcsc_
7480: 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 29 20  card_connected) 
7490: 7b 0a 09 09 53 43 61 72 64 44 69 73 63 6f 6e 6e  {...SCardDisconn
74a0: 65 63 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63  ect(slot->pcsc_c
74b0: 61 72 64 2c 20 53 43 41 52 44 5f 4c 45 41 56 45  ard, SCARD_LEAVE
74c0: 5f 43 41 52 44 29 3b 0a 09 7d 0a 0a 09 73 6c 6f  _CARD);..}...slo
74d0: 74 2d 3e 73 6c 6f 74 5f 72 65 73 65 74 20 3d 20  t->slot_reset = 
74e0: 31 3b 0a 09 73 6c 6f 74 2d 3e 70 63 73 63 5f 63  1;..slot->pcsc_c
74f0: 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 20 3d 20  ard_connected = 
7500: 30 3b 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 70  0;..if (cackey_p
7510: 69 6e 5f 63 6f 6d 6d 61 6e 64 20 3d 3d 20 4e 55  in_command == NU
7520: 4c 4c 29 20 7b 0a 09 09 73 6c 6f 74 2d 3e 74 6f  LL) {...slot->to
7530: 6b 65 6e 5f 66 6c 61 67 73 20 3d 20 43 4b 46 5f  ken_flags = CKF_
7540: 4c 4f 47 49 4e 5f 52 45 51 55 49 52 45 44 3b 0a  LOGIN_REQUIRED;.
7550: 09 7d 20 65 6c 73 65 20 7b 0a 09 09 73 6c 6f 74  .} else {...slot
7560: 2d 3e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 3d 20  ->token_flags = 
7570: 30 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  0;..}...CACKEY_D
7580: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
7590: 75 72 6e 69 6e 67 2e 22 29 3b 0a 0a 09 72 65 74  urning.");...ret
75a0: 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59  urn;.}../*. * SY
75b0: 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 4c 4f  NPOSIS. *     LO
75c0: 4e 47 20 63 61 63 6b 65 79 5f 72 65 63 6f 6e 6e  NG cackey_reconn
75d0: 65 63 74 5f 63 61 72 64 28 73 74 72 75 63 74 20  ect_card(struct 
75e0: 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f  cackey_slot *slo
75f0: 74 2c 20 44 57 4f 52 44 20 64 65 66 61 75 6c 74  t, DWORD default
7600: 5f 70 72 6f 74 6f 63 6f 6c 29 3b 0a 20 2a 0a 20  _protocol);. *. 
7610: 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20  * ARGUMENTS. *  
7620: 20 20 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a     cackey_slot *
7630: 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20  slot. *         
7640: 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d  Slot to send com
7650: 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 20  mands to. *. *  
7660: 20 20 20 44 57 4f 52 44 20 64 65 66 61 75 6c 74     DWORD default
7670: 5f 70 72 6f 74 6f 63 6f 6c 0a 20 2a 20 20 20 20  _protocol. *    
7680: 20 20 20 20 20 50 72 6f 74 6f 63 6f 6c 20 74 6f       Protocol to
7690: 20 61 74 74 65 6d 70 74 20 66 69 72 73 74 0a 20   attempt first. 
76a0: 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55  *. * RETURN VALU
76b0: 45 0a 20 2a 20 20 20 20 20 54 68 65 20 72 65 74  E. *     The ret
76c0: 75 72 6e 20 76 61 6c 75 65 20 66 72 6f 6d 20 53  urn value from S
76d0: 43 61 72 64 52 65 63 6f 6e 6e 65 63 74 28 29 0a  CardReconnect().
76e0: 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20   *. * NOTES. *  
76f0: 20 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e     This function
7700: 20 69 73 20 61 20 77 72 61 70 70 65 72 20 61 72   is a wrapper ar
7710: 6f 75 6e 64 20 53 43 61 72 64 52 65 63 6f 6e 6e  ound SCardReconn
7720: 65 63 74 28 29 0a 20 2a 0a 20 2a 20 20 20 20 20  ect(). *. *     
7730: 54 68 65 20 53 43 61 72 64 52 65 63 6f 6e 6e 65  The SCardReconne
7740: 63 74 28 29 20 66 75 6e 63 74 69 6f 6e 20 63 61  ct() function ca
7750: 6c 6c 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65  ll will be calle
7760: 64 20 66 69 72 73 74 20 77 69 74 68 20 74 68 65  d first with the
7770: 0a 20 2a 20 20 20 20 20 64 77 50 72 65 66 65 72  . *     dwPrefer
7780: 72 65 64 50 72 6f 74 6f 63 6f 6c 73 20 6f 66 20  redProtocols of 
7790: 22 64 65 66 61 75 6c 74 5f 70 72 6f 74 6f 63 6f  "default_protoco
77a0: 6c 22 2e 20 20 49 66 20 74 68 61 74 20 63 61 6c  l".  If that cal
77b0: 6c 20 72 65 74 75 72 6e 73 0a 20 2a 20 20 20 20  l returns. *    
77c0: 20 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d   SCARD_E_PROTO_M
77d0: 49 53 4d 41 54 43 48 20 74 72 79 20 61 67 61 69  ISMATCH try agai
77e0: 6e 20 77 69 74 68 20 61 20 70 72 6f 74 6f 63 6f  n with a protoco
77f0: 6c 20 6f 66 20 54 3d 30 2c 20 61 6e 64 20 66 61  l of T=0, and fa
7800: 69 6c 69 6e 67 0a 20 2a 20 20 20 20 20 74 68 61  iling. *     tha
7810: 74 20 54 3d 31 2e 0a 20 2a 0a 20 2a 2f 0a 73 74  t T=1.. *. */.st
7820: 61 74 69 63 20 4c 4f 4e 47 20 63 61 63 6b 65 79  atic LONG cackey
7830: 5f 72 65 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28  _reconnect_card(
7840: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c  struct cackey_sl
7850: 6f 74 20 2a 73 6c 6f 74 2c 20 44 57 4f 52 44 20  ot *slot, DWORD 
7860: 64 65 66 61 75 6c 74 5f 70 72 6f 74 6f 63 6f 6c  default_protocol
7870: 29 20 7b 0a 09 44 57 4f 52 44 20 73 65 6c 65 63  ) {..DWORD selec
7880: 74 65 64 5f 70 72 6f 74 6f 63 6f 6c 3b 0a 09 4c  ted_protocol;..L
7890: 4f 4e 47 20 73 63 61 72 64 5f 63 6f 6e 6e 5f 72  ONG scard_conn_r
78a0: 65 74 3b 0a 0a 09 73 65 6c 65 63 74 65 64 5f 70  et;...selected_p
78b0: 72 6f 74 6f 63 6f 6c 20 3d 20 30 3b 0a 0a 09 73  rotocol = 0;...s
78c0: 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20  card_conn_ret = 
78d0: 53 43 61 72 64 52 65 63 6f 6e 6e 65 63 74 28 73  SCardReconnect(s
78e0: 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20  lot->pcsc_card, 
78f0: 53 43 41 52 44 5f 53 48 41 52 45 5f 53 48 41 52  SCARD_SHARE_SHAR
7900: 45 44 2c 20 64 65 66 61 75 6c 74 5f 70 72 6f 74  ED, default_prot
7910: 6f 63 6f 6c 2c 20 53 43 41 52 44 5f 52 45 53 45  ocol, SCARD_RESE
7920: 54 5f 43 41 52 44 2c 20 26 73 65 6c 65 63 74 65  T_CARD, &selecte
7930: 64 5f 70 72 6f 74 6f 63 6f 6c 29 3b 0a 0a 09 69  d_protocol);...i
7940: 66 20 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65  f (scard_conn_re
7950: 74 20 3d 3d 20 53 43 41 52 44 5f 45 5f 50 52 4f  t == SCARD_E_PRO
7960: 54 4f 5f 4d 49 53 4d 41 54 43 48 29 20 7b 0a 09  TO_MISMATCH) {..
7970: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
7980: 49 4e 54 46 28 22 53 43 61 72 64 52 65 63 6f 6e  INTF("SCardRecon
7990: 6e 65 63 74 28 29 20 72 65 74 75 72 6e 65 64 20  nect() returned 
79a0: 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49  SCARD_E_PROTO_MI
79b0: 53 4d 41 54 43 48 2c 20 74 72 79 69 6e 67 20 77  SMATCH, trying w
79c0: 69 74 68 20 6a 75 73 74 20 54 3d 30 22 29 0a 09  ith just T=0")..
79d0: 09 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20  .scard_conn_ret 
79e0: 3d 20 53 43 61 72 64 52 65 63 6f 6e 6e 65 63 74  = SCardReconnect
79f0: 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64  (slot->pcsc_card
7a00: 2c 20 53 43 41 52 44 5f 53 48 41 52 45 5f 53 48  , SCARD_SHARE_SH
7a10: 41 52 45 44 2c 20 53 43 41 52 44 5f 50 52 4f 54  ARED, SCARD_PROT
7a20: 4f 43 4f 4c 5f 54 30 2c 20 53 43 41 52 44 5f 52  OCOL_T0, SCARD_R
7a30: 45 53 45 54 5f 43 41 52 44 2c 20 26 73 65 6c 65  ESET_CARD, &sele
7a40: 63 74 65 64 5f 70 72 6f 74 6f 63 6f 6c 29 3b 0a  cted_protocol);.
7a50: 0a 09 09 69 66 20 28 73 63 61 72 64 5f 63 6f 6e  ...if (scard_con
7a60: 6e 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 45  n_ret == SCARD_E
7a70: 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 29  _PROTO_MISMATCH)
7a80: 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
7a90: 55 47 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64  UG_PRINTF("SCard
7aa0: 52 65 63 6f 6e 6e 65 63 74 28 29 20 72 65 74 75  Reconnect() retu
7ab0: 72 6e 65 64 20 53 43 41 52 44 5f 45 5f 50 52 4f  rned SCARD_E_PRO
7ac0: 54 4f 5f 4d 49 53 4d 41 54 43 48 2c 20 74 72 79  TO_MISMATCH, try
7ad0: 69 6e 67 20 77 69 74 68 20 6a 75 73 74 20 54 3d  ing with just T=
7ae0: 31 22 29 0a 09 09 09 73 63 61 72 64 5f 63 6f 6e  1")....scard_con
7af0: 6e 5f 72 65 74 20 3d 20 53 43 61 72 64 52 65 63  n_ret = SCardRec
7b00: 6f 6e 6e 65 63 74 28 73 6c 6f 74 2d 3e 70 63 73  onnect(slot->pcs
7b10: 63 5f 63 61 72 64 2c 20 53 43 41 52 44 5f 53 48  c_card, SCARD_SH
7b20: 41 52 45 5f 53 48 41 52 45 44 2c 20 53 43 41 52  ARE_SHARED, SCAR
7b30: 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31 2c 20 53  D_PROTOCOL_T1, S
7b40: 43 41 52 44 5f 52 45 53 45 54 5f 43 41 52 44 2c  CARD_RESET_CARD,
7b50: 20 26 73 65 6c 65 63 74 65 64 5f 70 72 6f 74 6f   &selected_proto
7b60: 63 6f 6c 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69  col);...}..}...i
7b70: 66 20 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65  f (scard_conn_re
7b80: 74 20 3d 3d 20 53 43 41 52 44 5f 53 5f 53 55 43  t == SCARD_S_SUC
7b90: 43 45 53 53 29 20 7b 0a 09 09 73 6c 6f 74 2d 3e  CESS) {...slot->
7ba0: 70 72 6f 74 6f 63 6f 6c 20 3d 20 73 65 6c 65 63  protocol = selec
7bb0: 74 65 64 5f 70 72 6f 74 6f 63 6f 6c 3b 0a 09 7d  ted_protocol;..}
7bc0: 0a 0a 09 72 65 74 75 72 6e 28 73 63 61 72 64 5f  ...return(scard_
7bd0: 63 6f 6e 6e 5f 72 65 74 29 3b 0a 7d 0a 0a 2f 2a  conn_ret);.}../*
7be0: 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20  . * SYNPOSIS. * 
7bf0: 20 20 20 20 63 61 63 6b 65 79 5f 72 65 74 20 63      cackey_ret c
7c00: 61 63 6b 65 79 5f 63 6f 6e 6e 65 63 74 5f 63 61  ackey_connect_ca
7c10: 72 64 28 73 74 72 75 63 74 20 63 61 63 6b 65 79  rd(struct cackey
7c20: 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 3b 0a 20 2a  _slot *slot);. *
7c30: 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a  . * ARGUMENTS. *
7c40: 20 20 20 20 20 63 61 63 6b 65 79 5f 73 6c 6f 74       cackey_slot
7c50: 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20   *slot. *       
7c60: 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63    Slot to send c
7c70: 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a  ommands to. *. *
7c80: 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a   RETURN VALUE. *
7c90: 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43       CACKEY_PCSC
7ca0: 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 20 4f 6e  _S_OK         On
7cb0: 20 73 75 63 63 65 73 73 0a 20 2a 20 20 20 20 20   success. *     
7cc0: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45  CACKEY_PCSC_E_GE
7cd0: 4e 45 52 49 43 20 20 20 20 4f 6e 20 65 72 72 6f  NERIC    On erro
7ce0: 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a  r. *. * NOTES. *
7cf0: 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 2f       None. *. */
7d00: 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f 72  .static cackey_r
7d10: 65 74 20 63 61 63 6b 65 79 5f 63 6f 6e 6e 65 63  et cackey_connec
7d20: 74 5f 63 61 72 64 28 73 74 72 75 63 74 20 63 61  t_card(struct ca
7d30: 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29  ckey_slot *slot)
7d40: 20 7b 0a 09 63 61 63 6b 65 79 5f 72 65 74 20 70   {..cackey_ret p
7d50: 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 3b  csc_connect_ret;
7d60: 0a 09 44 57 4f 52 44 20 70 72 6f 74 6f 63 6f 6c  ..DWORD protocol
7d70: 3b 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f 63 6f  ;..LONG scard_co
7d80: 6e 6e 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59  nn_ret;...CACKEY
7d90: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
7da0: 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
7db0: 21 73 6c 6f 74 29 20 7b 0a 09 09 43 41 43 4b 45  !slot) {...CACKE
7dc0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
7dd0: 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 73 70 65  Invalid slot spe
7de0: 63 69 66 69 65 64 2c 20 72 65 74 75 72 6e 69 6e  cified, returnin
7df0: 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a  g in failure");.
7e00: 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
7e10: 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29  _PCSC_E_GENERIC)
7e20: 3b 0a 09 7d 0a 0a 09 70 63 73 63 5f 63 6f 6e 6e  ;..}...pcsc_conn
7e30: 65 63 74 5f 72 65 74 20 3d 20 63 61 63 6b 65 79  ect_ret = cackey
7e40: 5f 70 63 73 63 5f 63 6f 6e 6e 65 63 74 28 29 3b  _pcsc_connect();
7e50: 0a 09 69 66 20 28 70 63 73 63 5f 63 6f 6e 6e 65  ..if (pcsc_conne
7e60: 63 74 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59  ct_ret != CACKEY
7e70: 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09  _PCSC_S_OK) {...
7e80: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
7e90: 4e 54 46 28 22 43 6f 6e 6e 65 63 74 69 6f 6e 20  NTF("Connection 
7ea0: 74 6f 20 50 43 2f 53 43 20 66 61 69 6c 65 64 2c  to PC/SC failed,
7eb0: 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61   returning in fa
7ec0: 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75  ilure");....retu
7ed0: 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  rn(CACKEY_PCSC_E
7ee0: 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09  _GENERIC);..}...
7ef0: 2f 2a 20 43 6f 6e 6e 65 63 74 20 74 6f 20 72 65  /* Connect to re
7f00: 61 64 65 72 2c 20 69 66 20 6e 65 65 64 65 64 20  ader, if needed 
7f10: 2a 2f 0a 09 69 66 20 28 21 73 6c 6f 74 2d 3e 70  */..if (!slot->p
7f20: 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74  csc_card_connect
7f30: 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
7f40: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43 61  EBUG_PRINTF("SCa
7f50: 72 64 43 6f 6e 6e 65 63 74 28 25 73 29 20 63 61  rdConnect(%s) ca
7f60: 6c 6c 65 64 20 66 6f 72 20 73 6c 6f 74 20 25 70  lled for slot %p
7f70: 22 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 65  ", slot->pcsc_re
7f80: 61 64 65 72 2c 20 73 6c 6f 74 29 3b 0a 09 09 73  ader, slot);...s
7f90: 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20  card_conn_ret = 
7fa0: 53 43 61 72 64 43 6f 6e 6e 65 63 74 28 2a 63 61  SCardConnect(*ca
7fb0: 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65  ckey_pcsc_handle
7fc0: 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61  , slot->pcsc_rea
7fd0: 64 65 72 2c 20 53 43 41 52 44 5f 53 48 41 52 45  der, SCARD_SHARE
7fe0: 5f 53 48 41 52 45 44 2c 20 53 43 41 52 44 5f 50  _SHARED, SCARD_P
7ff0: 52 4f 54 4f 43 4f 4c 5f 54 30 20 7c 20 53 43 41  ROTOCOL_T0 | SCA
8000: 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31 2c 20  RD_PROTOCOL_T1, 
8010: 26 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64  &slot->pcsc_card
8020: 2c 20 26 70 72 6f 74 6f 63 6f 6c 29 3b 0a 0a 09  , &protocol);...
8030: 09 69 66 20 28 73 63 61 72 64 5f 63 6f 6e 6e 5f  .if (scard_conn_
8040: 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 45 5f 50  ret == SCARD_E_P
8050: 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 29 20 7b  ROTO_MISMATCH) {
8060: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
8070: 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64 43 6f  _PRINTF("SCardCo
8080: 6e 6e 65 63 74 28 29 20 72 65 74 75 72 6e 65 64  nnect() returned
8090: 20 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d   SCARD_E_PROTO_M
80a0: 49 53 4d 41 54 43 48 2c 20 74 72 79 69 6e 67 20  ISMATCH, trying 
80b0: 77 69 74 68 20 6a 75 73 74 20 54 3d 30 22 29 0a  with just T=0").
80c0: 09 09 09 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65  ...scard_conn_re
80d0: 74 20 3d 20 53 43 61 72 64 43 6f 6e 6e 65 63 74  t = SCardConnect
80e0: 28 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61  (*cackey_pcsc_ha
80f0: 6e 64 6c 65 2c 20 73 6c 6f 74 2d 3e 70 63 73 63  ndle, slot->pcsc
8100: 5f 72 65 61 64 65 72 2c 20 53 43 41 52 44 5f 53  _reader, SCARD_S
8110: 48 41 52 45 5f 53 48 41 52 45 44 2c 20 53 43 41  HARE_SHARED, SCA
8120: 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 2c 20  RD_PROTOCOL_T0, 
8130: 26 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64  &slot->pcsc_card
8140: 2c 20 26 70 72 6f 74 6f 63 6f 6c 29 3b 0a 0a 09  , &protocol);...
8150: 09 09 69 66 20 28 73 63 61 72 64 5f 63 6f 6e 6e  ..if (scard_conn
8160: 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 45 5f  _ret == SCARD_E_
8170: 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 29 20  PROTO_MISMATCH) 
8180: 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  {.....CACKEY_DEB
8190: 55 47 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64  UG_PRINTF("SCard
81a0: 43 6f 6e 6e 65 63 74 28 29 20 72 65 74 75 72 6e  Connect() return
81b0: 65 64 20 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f  ed SCARD_E_PROTO
81c0: 5f 4d 49 53 4d 41 54 43 48 2c 20 74 72 79 69 6e  _MISMATCH, tryin
81d0: 67 20 77 69 74 68 20 6a 75 73 74 20 54 3d 31 22  g with just T=1"
81e0: 29 0a 09 09 09 09 73 63 61 72 64 5f 63 6f 6e 6e  ).....scard_conn
81f0: 5f 72 65 74 20 3d 20 53 43 61 72 64 43 6f 6e 6e  _ret = SCardConn
8200: 65 63 74 28 2a 63 61 63 6b 65 79 5f 70 63 73 63  ect(*cackey_pcsc
8210: 5f 68 61 6e 64 6c 65 2c 20 73 6c 6f 74 2d 3e 70  _handle, slot->p
8220: 63 73 63 5f 72 65 61 64 65 72 2c 20 53 43 41 52  csc_reader, SCAR
8230: 44 5f 53 48 41 52 45 5f 53 48 41 52 45 44 2c 20  D_SHARE_SHARED, 
8240: 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54  SCARD_PROTOCOL_T
8250: 31 2c 20 26 73 6c 6f 74 2d 3e 70 63 73 63 5f 63  1, &slot->pcsc_c
8260: 61 72 64 2c 20 26 70 72 6f 74 6f 63 6f 6c 29 3b  ard, &protocol);
8270: 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 69 66 20  ....}...}....if 
8280: 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20  (scard_conn_ret 
8290: 3d 3d 20 53 43 41 52 44 5f 57 5f 55 4e 50 4f 57  == SCARD_W_UNPOW
82a0: 45 52 45 44 5f 43 41 52 44 29 20 7b 0a 09 09 09  ERED_CARD) {....
82b0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
82c0: 4e 54 46 28 22 53 43 61 72 64 43 6f 6e 6e 65 63  NTF("SCardConnec
82d0: 74 28 29 20 72 65 74 75 72 6e 65 64 20 53 43 41  t() returned SCA
82e0: 52 44 5f 57 5f 55 4e 50 4f 57 45 52 45 44 5f 43  RD_W_UNPOWERED_C
82f0: 41 52 44 2c 20 74 72 79 69 6e 67 20 74 6f 20 72  ARD, trying to r
8300: 65 2d 63 6f 6e 6e 65 63 74 2e 2e 2e 22 29 3b 0a  e-connect...");.
8310: 0a 09 09 09 73 63 61 72 64 5f 63 6f 6e 6e 5f 72  ....scard_conn_r
8320: 65 74 20 3d 20 53 43 61 72 64 43 6f 6e 6e 65 63  et = SCardConnec
8330: 74 28 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f 68  t(*cackey_pcsc_h
8340: 61 6e 64 6c 65 2c 20 73 6c 6f 74 2d 3e 70 63 73  andle, slot->pcs
8350: 63 5f 72 65 61 64 65 72 2c 20 53 43 41 52 44 5f  c_reader, SCARD_
8360: 53 48 41 52 45 5f 44 49 52 45 43 54 2c 20 53 43  SHARE_DIRECT, SC
8370: 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 20  ARD_PROTOCOL_T0 
8380: 7c 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c  | SCARD_PROTOCOL
8390: 5f 54 31 2c 20 26 73 6c 6f 74 2d 3e 70 63 73 63  _T1, &slot->pcsc
83a0: 5f 63 61 72 64 2c 20 26 70 72 6f 74 6f 63 6f 6c  _card, &protocol
83b0: 29 3b 0a 0a 09 09 09 69 66 20 28 73 63 61 72 64  );.....if (scard
83c0: 5f 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53 43 41  _conn_ret == SCA
83d0: 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41  RD_E_PROTO_MISMA
83e0: 54 43 48 29 20 7b 0a 09 09 09 09 43 41 43 4b 45  TCH) {.....CACKE
83f0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
8400: 53 43 61 72 64 43 6f 6e 6e 65 63 74 28 29 20 72  SCardConnect() r
8410: 65 74 75 72 6e 65 64 20 53 43 41 52 44 5f 45 5f  eturned SCARD_E_
8420: 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 2c 20  PROTO_MISMATCH, 
8430: 74 72 79 69 6e 67 20 77 69 74 68 20 6a 75 73 74  trying with just
8440: 20 54 3d 30 22 29 0a 09 09 09 09 73 63 61 72 64   T=0").....scard
8450: 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 53 43 61 72  _conn_ret = SCar
8460: 64 43 6f 6e 6e 65 63 74 28 2a 63 61 63 6b 65 79  dConnect(*cackey
8470: 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20 73 6c  _pcsc_handle, sl
8480: 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64 65 72 2c  ot->pcsc_reader,
8490: 20 53 43 41 52 44 5f 53 48 41 52 45 5f 53 48 41   SCARD_SHARE_SHA
84a0: 52 45 44 2c 20 53 43 41 52 44 5f 50 52 4f 54 4f  RED, SCARD_PROTO
84b0: 43 4f 4c 5f 54 30 2c 20 26 73 6c 6f 74 2d 3e 70  COL_T0, &slot->p
84c0: 63 73 63 5f 63 61 72 64 2c 20 26 70 72 6f 74 6f  csc_card, &proto
84d0: 63 6f 6c 29 3b 0a 0a 09 09 09 09 69 66 20 28 73  col);......if (s
84e0: 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 3d  card_conn_ret ==
84f0: 20 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d   SCARD_E_PROTO_M
8500: 49 53 4d 41 54 43 48 29 20 7b 0a 09 09 09 09 09  ISMATCH) {......
8510: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
8520: 4e 54 46 28 22 53 43 61 72 64 43 6f 6e 6e 65 63  NTF("SCardConnec
8530: 74 28 29 20 72 65 74 75 72 6e 65 64 20 53 43 41  t() returned SCA
8540: 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41  RD_E_PROTO_MISMA
8550: 54 43 48 2c 20 74 72 79 69 6e 67 20 77 69 74 68  TCH, trying with
8560: 20 6a 75 73 74 20 54 3d 31 22 29 0a 09 09 09 09   just T=1").....
8570: 09 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20  .scard_conn_ret 
8580: 3d 20 53 43 61 72 64 43 6f 6e 6e 65 63 74 28 2a  = SCardConnect(*
8590: 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64  cackey_pcsc_hand
85a0: 6c 65 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72  le, slot->pcsc_r
85b0: 65 61 64 65 72 2c 20 53 43 41 52 44 5f 53 48 41  eader, SCARD_SHA
85c0: 52 45 5f 53 48 41 52 45 44 2c 20 53 43 41 52 44  RE_SHARED, SCARD
85d0: 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31 2c 20 26 73  _PROTOCOL_T1, &s
85e0: 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20  lot->pcsc_card, 
85f0: 26 70 72 6f 74 6f 63 6f 6c 29 3b 0a 09 09 09 09  &protocol);.....
8600: 7d 0a 09 09 09 7d 0a 0a 09 09 09 73 63 61 72 64  }....}.....scard
8610: 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 63 61 63 6b  _conn_ret = cack
8620: 65 79 5f 72 65 63 6f 6e 6e 65 63 74 5f 63 61 72  ey_reconnect_car
8630: 64 28 73 6c 6f 74 2c 20 70 72 6f 74 6f 63 6f 6c  d(slot, protocol
8640: 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 73 63  );...}....if (sc
8650: 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 21 3d 20  ard_conn_ret != 
8660: 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29  SCARD_S_SUCCESS)
8670: 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
8680: 55 47 5f 50 52 49 4e 54 46 28 22 43 6f 6e 6e 65  UG_PRINTF("Conne
8690: 63 74 69 6f 6e 20 74 6f 20 63 61 72 64 20 66 61  ction to card fa
86a0: 69 6c 65 64 2c 20 72 65 74 75 72 6e 69 6e 67 20  iled, returning 
86b0: 69 6e 20 66 61 69 6c 75 72 65 20 28 53 43 61 72  in failure (SCar
86c0: 64 43 6f 6e 6e 65 63 74 28 29 20 3d 20 25 73 2f  dConnect() = %s/
86d0: 25 6c 69 29 22 2c 20 43 41 43 4b 45 59 5f 44 45  %li)", CACKEY_DE
86e0: 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52  BUG_FUNC_SCARDER
86f0: 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 5f 63  R_TO_STR(scard_c
8700: 6f 6e 6e 5f 72 65 74 29 2c 20 28 6c 6f 6e 67 29  onn_ret), (long)
8710: 20 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 29   scard_conn_ret)
8720: 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43  ;.....return(CAC
8730: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52  KEY_PCSC_E_GENER
8740: 49 43 29 3b 0a 09 09 7d 0a 0a 09 09 73 6c 6f 74  IC);...}....slot
8750: 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e  ->pcsc_card_conn
8760: 65 63 74 65 64 20 3d 20 31 3b 0a 09 09 73 6c 6f  ected = 1;...slo
8770: 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64  t->transaction_d
8780: 65 70 74 68 20 3d 20 30 3b 0a 09 09 73 6c 6f 74  epth = 0;...slot
8790: 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 6e 65  ->transaction_ne
87a0: 65 64 5f 68 77 5f 6c 6f 63 6b 20 3d 20 30 3b 0a  ed_hw_lock = 0;.
87b0: 09 09 73 6c 6f 74 2d 3e 70 72 6f 74 6f 63 6f 6c  ..slot->protocol
87c0: 20 3d 20 70 72 6f 74 6f 63 6f 6c 3b 0a 09 7d 0a   = protocol;..}.
87d0: 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
87e0: 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
87f0: 20 69 6e 20 73 75 63 63 65 73 73 22 29 3b 0a 0a   in success");..
8800: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
8810: 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a  CSC_S_OK);.}../*
8820: 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20  . * SYNPOSIS. * 
8830: 20 20 20 20 63 61 63 6b 65 79 5f 72 65 74 20 63      cackey_ret c
8840: 61 63 6b 65 79 5f 62 65 67 69 6e 5f 74 72 61 6e  ackey_begin_tran
8850: 73 61 63 74 69 6f 6e 28 73 74 72 75 63 74 20 63  saction(struct c
8860: 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74  ackey_slot *slot
8870: 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e  );. *. * ARGUMEN
8880: 54 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79  TS. *     cackey
8890: 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20  _slot *slot. *  
88a0: 20 20 20 20 20 20 20 53 6c 6f 74 20 74 6f 20 73         Slot to s
88b0: 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a  end commands to.
88c0: 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c   *. * RETURN VAL
88d0: 55 45 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59  UE. *     CACKEY
88e0: 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20 20 20 20  _PCSC_S_OK      
88f0: 20 20 20 4f 6e 20 73 75 63 63 65 73 73 0a 20 2a     On success. *
8900: 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43       CACKEY_PCSC
8910: 5f 45 5f 47 45 4e 45 52 49 43 20 20 20 20 4f 6e  _E_GENERIC    On
8920: 20 65 72 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54   error. *. * NOT
8930: 45 53 0a 20 2a 20 20 20 20 20 54 68 65 20 74 72  ES. *     The tr
8940: 61 6e 73 61 63 74 69 6f 6e 20 73 68 6f 75 6c 64  ansaction should
8950: 20 62 65 20 74 65 72 6d 69 6e 61 74 65 64 20 75   be terminated u
8960: 73 69 6e 67 20 22 63 61 63 6b 65 79 5f 65 6e 64  sing "cackey_end
8970: 5f 74 72 61 6e 73 61 63 74 69 6f 6e 22 0a 20 2a  _transaction". *
8980: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 61 63 6b  . */.static cack
8990: 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 62 65  ey_ret cackey_be
89a0: 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  gin_transaction(
89b0: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c  struct cackey_sl
89c0: 6f 74 20 2a 73 6c 6f 74 29 20 7b 0a 09 63 61 63  ot *slot) {..cac
89d0: 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 63  key_ret cackey_c
89e0: 6f 6e 6e 5f 72 65 74 3b 0a 09 4c 4f 4e 47 20 73  onn_ret;..LONG s
89f0: 63 61 72 64 5f 74 72 61 6e 73 5f 72 65 74 3b 0a  card_trans_ret;.
8a00: 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
8a10: 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
8a20: 3b 0a 0a 09 63 61 63 6b 65 79 5f 63 6f 6e 6e 5f  ;...cackey_conn_
8a30: 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 63 6f 6e  ret = cackey_con
8a40: 6e 65 63 74 5f 63 61 72 64 28 73 6c 6f 74 29 3b  nect_card(slot);
8a50: 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 63 6f 6e  ..if (cackey_con
8a60: 6e 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f  n_ret != CACKEY_
8a70: 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43  PCSC_S_OK) {...C
8a80: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
8a90: 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 63 6f  TF("Unable to co
8aa0: 6e 6e 65 63 74 20 74 6f 20 63 61 72 64 2c 20 72  nnect to card, r
8ab0: 65 74 75 72 6e 69 6e 67 20 69 6e 20 65 72 72 6f  eturning in erro
8ac0: 72 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  r");....return(C
8ad0: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e  ACKEY_PCSC_E_GEN
8ae0: 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74  ERIC);..}...slot
8af0: 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65  ->transaction_de
8b00: 70 74 68 2b 2b 3b 0a 0a 09 69 66 20 28 73 6c 6f  pth++;...if (slo
8b10: 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64  t->transaction_d
8b20: 65 70 74 68 20 3e 20 31 20 26 26 20 21 73 6c 6f  epth > 1 && !slo
8b30: 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 6e  t->transaction_n
8b40: 65 65 64 5f 68 77 5f 6c 6f 63 6b 29 20 7b 0a 09  eed_hw_lock) {..
8b50: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
8b60: 49 4e 54 46 28 22 41 6c 72 65 61 64 79 20 69 6e  INTF("Already in
8b70: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20   a transaction, 
8b80: 70 65 72 66 6f 72 6d 69 6e 67 20 6e 6f 20 61 63  performing no ac
8b90: 74 69 6f 6e 20 28 6e 65 77 20 64 65 70 74 68 20  tion (new depth 
8ba0: 3d 20 25 69 29 22 2c 20 73 6c 6f 74 2d 3e 74 72  = %i)", slot->tr
8bb0: 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 29  ansaction_depth)
8bc0: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b  ;....return(CACK
8bd0: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 09  EY_PCSC_S_OK);..
8be0: 7d 0a 0a 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61  }...slot->transa
8bf0: 63 74 69 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f  ction_need_hw_lo
8c00: 63 6b 20 3d 20 30 3b 0a 0a 09 73 63 61 72 64 5f  ck = 0;...scard_
8c10: 74 72 61 6e 73 5f 72 65 74 20 3d 20 53 43 61 72  trans_ret = SCar
8c20: 64 42 65 67 69 6e 54 72 61 6e 73 61 63 74 69 6f  dBeginTransactio
8c30: 6e 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72  n(slot->pcsc_car
8c40: 64 29 3b 0a 09 69 66 20 28 73 63 61 72 64 5f 74  d);..if (scard_t
8c50: 72 61 6e 73 5f 72 65 74 20 21 3d 20 53 43 41 52  rans_ret != SCAR
8c60: 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09  D_S_SUCCESS) {..
8c70: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
8c80: 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20  INTF("Unable to 
8c90: 62 65 67 69 6e 20 74 72 61 6e 73 61 63 74 69 6f  begin transactio
8ca0: 6e 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20  n, returning in 
8cb0: 65 72 72 6f 72 22 29 3b 0a 0a 09 09 72 65 74 75  error");....retu
8cc0: 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  rn(CACKEY_PCSC_E
8cd0: 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09  _GENERIC);..}...
8ce0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
8cf0: 4e 54 46 28 22 53 75 63 65 73 73 66 75 6c 6c 79  NTF("Sucessfully
8d00: 20 62 65 67 61 6e 20 74 72 61 6e 73 61 63 74 69   began transacti
8d10: 6f 6e 20 6f 6e 20 73 6c 6f 74 20 28 25 73 29 22  on on slot (%s)"
8d20: 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61  , slot->pcsc_rea
8d30: 64 65 72 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  der);...return(C
8d40: 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29  ACKEY_PCSC_S_OK)
8d50: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f  ;.}../*. * SYNPO
8d60: 53 49 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65  SIS. *     cacke
8d70: 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 65 6e 64  y_ret cackey_end
8d80: 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 74 72  _transaction(str
8d90: 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20  uct cackey_slot 
8da0: 2a 73 6c 6f 74 29 3b 0a 20 2a 0a 20 2a 20 41 52  *slot);. *. * AR
8db0: 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 63  GUMENTS. *     c
8dc0: 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74  ackey_slot *slot
8dd0: 0a 20 2a 20 20 20 20 20 20 20 20 20 53 6c 6f 74  . *         Slot
8de0: 20 74 6f 20 73 65 6e 64 20 63 6f 6d 6d 61 6e 64   to send command
8df0: 73 20 74 6f 0a 20 2a 0a 20 2a 20 52 45 54 55 52  s to. *. * RETUR
8e00: 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 43  N VALUE. *     C
8e10: 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20  ACKEY_PCSC_S_OK 
8e20: 20 20 20 20 20 20 20 20 4f 6e 20 73 75 63 63 65          On succe
8e30: 73 73 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59  ss. *     CACKEY
8e40: 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 20  _PCSC_E_GENERIC 
8e50: 20 20 20 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a 20     On error. *. 
8e60: 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 54  * NOTES. *     T
8e70: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 71  his function req
8e80: 75 69 72 65 73 20 22 63 61 63 6b 65 79 5f 62 65  uires "cackey_be
8e90: 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e 22  gin_transaction"
8ea0: 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 66 69   to be called fi
8eb0: 72 73 74 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69  rst. *. */.stati
8ec0: 63 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63  c cackey_ret cac
8ed0: 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  key_end_transact
8ee0: 69 6f 6e 28 73 74 72 75 63 74 20 63 61 63 6b 65  ion(struct cacke
8ef0: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 20 7b 0a  y_slot *slot) {.
8f00: 09 4c 4f 4e 47 20 73 63 61 72 64 5f 74 72 61 6e  .LONG scard_tran
8f10: 73 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f  s_ret;...CACKEY_
8f20: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
8f30: 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
8f40: 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 5f  slot->pcsc_card_
8f50: 63 6f 6e 6e 65 63 74 65 64 29 20 7b 0a 09 09 43  connected) {...C
8f60: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
8f70: 54 46 28 22 43 61 72 64 20 69 73 20 6e 6f 74 20  TF("Card is not 
8f80: 63 6f 6e 6e 65 63 74 65 64 2c 20 75 6e 61 62 6c  connected, unabl
8f90: 65 20 74 6f 20 65 6e 64 20 74 72 61 6e 73 61 63  e to end transac
8fa0: 74 69 6f 6e 20 6f 6e 20 63 61 72 64 22 29 3b 0a  tion on card");.
8fb0: 0a 09 09 69 66 20 28 73 6c 6f 74 2d 3e 74 72 61  ...if (slot->tra
8fc0: 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3e  nsaction_depth >
8fd0: 20 30 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f   0) {....CACKEY_
8fe0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 44 65  DEBUG_PRINTF("De
8ff0: 63 72 65 61 73 69 6e 67 20 74 72 61 6e 73 61 63  creasing transac
9000: 74 69 6f 6e 20 64 65 70 74 68 20 61 6e 64 20 61  tion depth and a
9010: 73 6b 69 6e 67 20 66 6f 72 20 61 20 68 61 72 64  sking for a hard
9020: 77 61 72 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  ware lock on the
9030: 20 6e 65 78 74 20 62 65 67 69 6e 20 74 72 61 6e   next begin tran
9040: 73 61 63 74 69 6f 6e 20 28 63 75 72 72 65 6e 74  saction (current
9050: 20 64 65 70 74 68 20 3d 20 25 69 29 22 2c 20 73   depth = %i)", s
9060: 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e  lot->transaction
9070: 5f 64 65 70 74 68 29 3b 0a 0a 09 09 09 73 6c 6f  _depth);.....slo
9080: 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64  t->transaction_d
9090: 65 70 74 68 2d 2d 3b 0a 0a 09 09 09 69 66 20 28  epth--;.....if (
90a0: 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f  slot->transactio
90b0: 6e 5f 64 65 70 74 68 20 3e 20 30 29 20 7b 0a 09  n_depth > 0) {..
90c0: 09 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63  ...slot->transac
90d0: 74 69 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63  tion_need_hw_loc
90e0: 6b 20 3d 20 31 3b 0a 09 09 09 7d 0a 09 09 7d 0a  k = 1;....}...}.
90f0: 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
9100: 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29  _PCSC_E_GENERIC)
9110: 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 2d  ;..}...if (slot-
9120: 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70  >transaction_dep
9130: 74 68 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43  th == 0) {...CAC
9140: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
9150: 28 22 54 65 72 6d 69 6e 61 74 69 6e 67 20 61 20  ("Terminating a 
9160: 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 61 74  transaction that
9170: 20 68 61 73 20 6e 6f 74 20 62 65 67 75 6e 21 22   has not begun!"
9180: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43  );....return(CAC
9190: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52  KEY_PCSC_E_GENER
91a0: 49 43 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 2d 3e  IC);..}...slot->
91b0: 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74  transaction_dept
91c0: 68 2d 2d 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 2d  h--;...if (slot-
91d0: 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70  >transaction_dep
91e0: 74 68 20 3e 20 30 29 20 7b 0a 09 09 43 41 43 4b  th > 0) {...CACK
91f0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
9200: 22 54 72 61 6e 73 61 63 74 69 6f 6e 73 20 73 74  "Transactions st
9210: 69 6c 6c 20 69 6e 20 70 72 6f 67 72 65 73 73 2c  ill in progress,
9220: 20 6e 6f 74 20 74 65 72 6d 69 6e 61 74 69 6e 67   not terminating
9230: 20 6f 6e 2d 63 61 72 64 20 54 72 61 6e 73 61 63   on-card Transac
9240: 74 69 6f 6e 20 28 63 75 72 72 65 6e 74 20 64 65  tion (current de
9250: 70 74 68 20 3d 20 25 69 29 22 2c 20 73 6c 6f 74  pth = %i)", slot
9260: 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65  ->transaction_de
9270: 70 74 68 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  pth);....return(
9280: 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
9290: 29 3b 0a 09 7d 0a 0a 09 73 63 61 72 64 5f 74 72  );..}...scard_tr
92a0: 61 6e 73 5f 72 65 74 20 3d 20 53 43 61 72 64 45  ans_ret = SCardE
92b0: 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c  ndTransaction(sl
92c0: 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 53  ot->pcsc_card, S
92d0: 43 41 52 44 5f 4c 45 41 56 45 5f 43 41 52 44 29  CARD_LEAVE_CARD)
92e0: 3b 0a 09 69 66 20 28 73 63 61 72 64 5f 74 72 61  ;..if (scard_tra
92f0: 6e 73 5f 72 65 74 20 21 3d 20 53 43 41 52 44 5f  ns_ret != SCARD_
9300: 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09 43  S_SUCCESS) {...C
9310: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
9320: 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 65 6e  TF("Unable to en
9330: 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 72  d transaction, r
9340: 65 74 75 72 6e 69 6e 67 20 69 6e 20 65 72 72 6f  eturning in erro
9350: 72 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  r");....return(C
9360: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e  ACKEY_PCSC_E_GEN
9370: 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  ERIC);..}...CACK
9380: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
9390: 22 53 75 63 65 73 73 66 75 6c 6c 79 20 74 65 72  "Sucessfully ter
93a0: 6d 69 6e 61 74 65 64 20 74 72 61 6e 73 61 63 74  minated transact
93b0: 69 6f 6e 20 6f 6e 20 73 6c 6f 74 20 28 25 73 29  ion on slot (%s)
93c0: 22 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 65  ", slot->pcsc_re
93d0: 61 64 65 72 29 3b 0a 0a 09 72 65 74 75 72 6e 28  ader);...return(
93e0: 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
93f0: 29 3b 0a 7d 0a 0a 2f 2a 20 41 50 44 55 20 52 65  );.}../* APDU Re
9400: 6c 61 74 65 64 20 46 75 6e 63 74 69 6f 6e 73 20  lated Functions 
9410: 2a 2f 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49  */./*. * SYNPOSI
9420: 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f  S. *     cackey_
9430: 72 65 74 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f  ret cackey_send_
9440: 61 70 64 75 28 73 74 72 75 63 74 20 63 61 63 6b  apdu(struct cack
9450: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75  ey_slot *slot, u
9460: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63 6c 61  nsigned char cla
9470: 73 73 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ss, unsigned cha
9480: 72 20 69 6e 73 74 72 75 63 74 69 6f 6e 2c 20 75  r instruction, u
9490: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 70 31 2c  nsigned char p1,
94a0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 70   unsigned char p
94b0: 32 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  2, unsigned char
94c0: 20 6c 63 2c 20 75 6e 73 69 67 6e 65 64 20 63 68   lc, unsigned ch
94d0: 61 72 20 2a 64 61 74 61 2c 20 75 6e 73 69 67 6e  ar *data, unsign
94e0: 65 64 20 63 68 61 72 20 6c 65 2c 20 75 69 6e 74  ed char le, uint
94f0: 31 36 5f 74 20 2a 72 65 73 70 63 6f 64 65 2c 20  16_t *respcode, 
9500: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 72  unsigned char *r
9510: 65 73 70 64 61 74 61 2c 20 73 69 7a 65 5f 74 20  espdata, size_t 
9520: 2a 72 65 73 70 64 61 74 61 5f 6c 65 6e 29 3b 0a  *respdata_len);.
9530: 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a   *. * ARGUMENTS.
9540: 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 73 6c   *     cackey_sl
9550: 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20  ot *slot. *     
9560: 20 20 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64      Slot to send
9570: 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a   commands to. *.
9580: 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20   *     unsigned 
9590: 63 68 61 72 20 63 6c 61 73 73 0a 20 2a 20 20 20  char class. *   
95a0: 20 20 20 20 20 20 41 50 44 55 20 43 6c 61 73 73        APDU Class
95b0: 20 28 47 53 43 49 53 5f 43 4c 41 53 53 5f 49 53   (GSCIS_CLASS_IS
95c0: 4f 37 38 31 36 20 6f 72 20 47 53 43 49 53 5f 43  O7816 or GSCIS_C
95d0: 4c 41 53 53 5f 47 4c 4f 42 41 4c 5f 50 4c 41 54  LASS_GLOBAL_PLAT
95e0: 46 4f 52 4d 0a 20 2a 20 20 20 20 20 20 20 20 20  FORM. *         
95f0: 75 73 75 61 6c 6c 79 29 2c 20 28 43 4c 41 29 0a  usually), (CLA).
9600: 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e   *. *     unsign
9610: 65 64 20 63 68 61 72 20 69 6e 73 74 72 75 63 74  ed char instruct
9620: 69 6f 6e 0a 20 2a 20 20 20 20 20 20 20 20 20 41  ion. *         A
9630: 50 44 55 20 49 6e 73 74 72 75 63 74 69 6f 6e 20  PDU Instruction 
9640: 28 49 4e 53 29 0a 20 2a 0a 20 2a 20 20 20 20 20  (INS). *. *     
9650: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 70 31  unsigned char p1
9660: 0a 20 2a 20 20 20 20 20 20 20 20 20 41 50 44 55  . *         APDU
9670: 20 50 61 72 61 6d 65 74 65 72 20 31 20 28 50 31   Parameter 1 (P1
9680: 29 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69  ). *. *     unsi
9690: 67 6e 65 64 20 63 68 61 72 20 70 32 0a 20 2a 20  gned char p2. * 
96a0: 20 20 20 20 20 20 20 20 41 50 44 55 20 50 61 72          APDU Par
96b0: 61 6d 65 74 65 72 20 32 20 28 50 32 29 0a 20 2a  ameter 2 (P2). *
96c0: 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64  . *     unsigned
96d0: 20 63 68 61 72 20 6c 63 0a 20 2a 20 20 20 20 20   char lc. *     
96e0: 20 20 20 20 41 50 44 55 20 4c 65 6e 67 74 68 20      APDU Length 
96f0: 6f 66 20 43 6f 6e 74 65 6e 74 20 28 4c 63 29 20  of Content (Lc) 
9700: 2d 2d 20 74 68 69 73 20 69 73 20 74 68 65 20 6c  -- this is the l
9710: 65 6e 67 74 68 20 6f 66 20 22 64 61 74 61 22 0a  ength of "data".
9720: 20 2a 20 20 20 20 20 20 20 20 20 70 61 72 61 6d   *         param
9730: 65 74 65 72 2e 20 20 49 66 20 22 64 61 74 61 22  eter.  If "data"
9740: 20 69 73 20 73 70 65 63 69 66 69 65 64 20 61 73   is specified as
9750: 20 4e 55 4c 4c 2c 20 74 68 69 73 20 70 61 72 61   NULL, this para
9760: 6d 65 74 65 72 20 77 69 6c 6c 0a 20 2a 20 20 20  meter will. *   
9770: 20 20 20 20 20 20 62 65 20 69 67 6e 6f 72 65 64        be ignored
9780: 2e 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69  .. *. *     unsi
9790: 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 0a  gned char *data.
97a0: 20 2a 20 20 20 20 20 20 20 20 20 50 6f 69 6e 74   *         Point
97b0: 65 72 20 74 6f 20 62 75 66 66 65 72 20 74 6f 20  er to buffer to 
97c0: 73 65 6e 64 2e 20 20 49 74 20 73 68 6f 75 6c 64  send.  It should
97d0: 20 62 65 20 22 4c 63 22 20 62 79 74 65 73 20 6c   be "Lc" bytes l
97e0: 6f 6e 67 2e 20 20 49 66 0a 20 2a 20 20 20 20 20  ong.  If. *     
97f0: 20 20 20 20 73 70 65 63 69 66 69 65 64 20 61 73      specified as
9800: 20 4e 55 4c 4c 2c 20 22 4c 63 22 20 77 69 6c 6c   NULL, "Lc" will
9810: 20 6e 6f 74 20 62 65 20 73 65 6e 74 2c 20 61 6e   not be sent, an
9820: 64 20 74 68 69 73 20 62 75 66 66 65 72 20 77 69  d this buffer wi
9830: 6c 6c 20 62 65 0a 20 2a 20 20 20 20 20 20 20 20  ll be. *        
9840: 20 69 67 6e 6f 72 65 64 2e 0a 20 2a 0a 20 2a 20   ignored.. *. * 
9850: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
9860: 72 20 6c 65 0a 20 2a 20 20 20 20 20 20 20 20 20  r le. *         
9870: 41 50 44 55 20 4c 65 6e 67 74 68 20 6f 66 20 45  APDU Length of E
9880: 78 70 65 63 74 61 74 69 6f 6e 20 28 4c 65 29 20  xpectation (Le) 
9890: 2d 2d 20 74 68 69 73 20 69 73 20 74 68 65 20 6c  -- this is the l
98a0: 65 6e 67 74 68 20 6f 66 20 74 68 65 0a 20 2a 20  ength of the. * 
98b0: 20 20 20 20 20 20 20 20 65 78 70 65 63 74 65 64          expected
98c0: 20 72 65 70 6c 79 2e 20 20 49 66 20 74 68 69 73   reply.  If this
98d0: 20 69 73 20 73 70 65 63 69 66 69 65 64 20 61 73   is specified as
98e0: 20 30 20 74 68 65 6e 20 69 74 20 77 69 6c 6c 20   0 then it will 
98f0: 6e 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20 62  not. *         b
9900: 65 20 73 65 6e 74 2e 0a 20 2a 0a 20 2a 20 20 20  e sent.. *. *   
9910: 20 20 75 69 6e 74 31 36 5f 74 20 2a 72 65 73 70    uint16_t *resp
9920: 63 6f 64 65 0a 20 2a 20 20 20 20 20 20 20 20 20  code. *         
9930: 5b 4f 55 54 5d 20 50 6f 69 6e 74 65 72 20 74 6f  [OUT] Pointer to
9940: 20 73 74 6f 72 61 67 65 20 6f 66 20 41 50 44 55   storage of APDU
9950: 20 72 65 73 70 6f 6e 73 65 20 63 6f 64 65 2e 20   response code. 
9960: 20 49 66 20 74 68 69 73 20 69 73 0a 20 2a 20 20   If this is. *  
9970: 20 20 20 20 20 20 20 73 70 65 63 69 66 69 65 64         specified
9980: 20 61 73 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65   as NULL, the re
9990: 73 70 6f 6e 73 65 20 63 6f 64 65 20 77 69 6c 6c  sponse code will
99a0: 20 62 65 20 64 69 73 63 61 72 64 65 64 2e 0a 20   be discarded.. 
99b0: 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65  *. *     unsigne
99c0: 64 20 63 68 61 72 20 2a 72 65 73 70 64 61 74 61  d char *respdata
99d0: 0a 20 2a 20 20 20 20 20 20 20 20 20 5b 4f 55 54  . *         [OUT
99e0: 5d 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 74 6f  ] Pointer to sto
99f0: 72 61 67 65 20 6f 66 20 41 50 44 55 20 72 65 73  rage of APDU res
9a00: 70 6f 6e 73 65 20 64 61 74 61 2e 20 20 49 66 20  ponse data.  If 
9a10: 74 68 69 73 20 69 73 0a 20 2a 20 20 20 20 20 20  this is. *      
9a20: 20 20 20 73 70 65 63 69 66 69 65 64 20 61 73 20     specified as 
9a30: 4e 55 4c 4c 2c 20 74 68 65 20 72 65 73 70 6f 6e  NULL, the respon
9a40: 73 65 20 64 61 74 61 20 77 69 6c 6c 20 62 65 20  se data will be 
9a50: 64 69 73 63 61 72 64 65 64 2e 20 20 49 66 0a 20  discarded.  If. 
9a60: 2a 20 20 20 20 20 20 20 20 20 74 68 65 20 22 72  *         the "r
9a70: 65 73 70 64 61 74 61 5f 6c 65 6e 22 20 70 61 72  espdata_len" par
9a80: 61 6d 65 74 65 72 20 69 73 20 73 70 65 63 69 66  ameter is specif
9a90: 69 65 64 20 61 73 20 4e 55 4c 4c 2c 20 74 68 69  ied as NULL, thi
9aa0: 73 20 62 75 66 66 65 72 0a 20 2a 20 20 20 20 20  s buffer. *     
9ab0: 20 20 20 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20      will not be 
9ac0: 75 70 64 61 74 65 64 2e 0a 20 2a 0a 20 2a 20 20  updated.. *. *  
9ad0: 20 20 20 73 69 7a 65 5f 74 20 2a 72 65 73 70 64     size_t *respd
9ae0: 61 74 61 5f 6c 65 6e 0a 20 2a 20 20 20 20 20 20  ata_len. *      
9af0: 20 20 20 5b 49 4e 2c 20 4f 55 54 5d 20 50 6f 69     [IN, OUT] Poi
9b00: 6e 74 65 72 20 69 6e 69 74 69 61 6c 69 6e 67 20  nter initialing 
9b10: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 73  containing the s
9b20: 69 7a 65 20 6f 66 20 74 68 65 20 22 72 65 73 70  ize of the "resp
9b30: 64 61 74 61 22 0a 20 2a 20 20 20 20 20 20 20 20  data". *        
9b40: 20 62 75 66 66 65 72 2e 20 20 42 65 66 6f 72 65   buffer.  Before
9b50: 20 72 65 74 75 72 6e 69 6e 67 2c 20 74 68 65 20   returning, the 
9b60: 70 6f 69 6e 74 65 64 20 74 6f 20 76 61 6c 75 65  pointed to value
9b70: 20 69 73 20 75 70 64 61 74 65 64 20 74 6f 20 74   is updated to t
9b80: 68 65 0a 20 2a 20 20 20 20 20 20 20 20 20 6e 75  he. *         nu
9b90: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 77 72  mber of bytes wr
9ba0: 69 74 74 65 6e 20 74 6f 20 74 68 65 20 62 75 66  itten to the buf
9bb0: 66 65 72 2e 20 20 49 66 20 74 68 69 73 20 69 73  fer.  If this is
9bc0: 20 73 70 65 63 69 66 69 65 64 20 61 73 0a 20 2a   specified as. *
9bd0: 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c 20 69           NULL, i
9be0: 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75 70  t will not be up
9bf0: 64 61 74 65 64 2c 20 61 6e 64 20 22 72 65 73 70  dated, and "resp
9c00: 64 61 74 61 22 20 77 69 6c 6c 20 62 65 20 69 67  data" will be ig
9c10: 6e 6f 72 65 64 20 63 61 75 73 69 6e 67 0a 20 2a  nored causing. *
9c20: 20 20 20 20 20 20 20 20 20 74 68 65 20 72 65 73           the res
9c30: 70 6f 6e 73 65 20 64 61 74 61 20 74 6f 20 62 65  ponse data to be
9c40: 20 64 69 73 63 61 72 64 65 64 2e 0a 20 2a 0a 20   discarded.. *. 
9c50: 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20  * RETURN VALUE. 
9c60: 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53  *     CACKEY_PCS
9c70: 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 20 20  C_S_OK          
9c80: 20 4f 6e 20 73 75 63 63 65 73 73 0a 20 2a 20 20   On success. *  
9c90: 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45     CACKEY_PCSC_E
9ca0: 5f 47 45 4e 45 52 49 43 20 20 20 20 20 20 4f 6e  _GENERIC      On
9cb0: 20 65 72 72 6f 72 0a 20 2a 20 20 20 20 20 43 41   error. *     CA
9cc0: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45  CKEY_PCSC_E_TOKE
9cd0: 4e 41 42 53 45 4e 54 20 20 49 66 20 74 68 65 20  NABSENT  If the 
9ce0: 73 65 6e 64 69 6e 67 20 66 61 69 6c 65 64 20 62  sending failed b
9cf0: 65 63 61 75 73 65 20 74 68 65 20 74 6f 6b 65 6e  ecause the token
9d00: 20 69 73 0a 20 2a 20 20 20 20 20 20 20 20 20 20   is. *          
9d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d20: 20 20 20 20 20 20 61 62 73 65 6e 74 0a 20 2a 20        absent. * 
9d30: 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f      CACKEY_PCSC_
9d40: 45 5f 52 45 54 52 59 20 20 20 20 20 20 20 20 49  E_RETRY        I
9d50: 66 20 73 6f 6d 65 74 68 69 6e 67 20 74 68 61 74  f something that
9d60: 20 6c 6f 6f 6b 73 20 72 65 74 72 79 27 61 62 6c   looks retry'abl
9d70: 65 20 77 65 6e 74 0a 20 2a 20 20 20 20 20 20 20  e went. *       
9d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d90: 20 20 20 20 20 20 20 20 20 77 72 6f 6e 67 20 2d           wrong -
9da0: 2d 20 74 72 79 20 74 68 65 20 77 68 6f 6c 65 20  - try the whole 
9db0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 76 65 72  transaction over
9dc0: 0a 20 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  . *             
9dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9de0: 20 20 20 61 67 61 69 6e 0a 20 2a 0a 20 2a 20 4e     again. *. * N
9df0: 4f 54 45 53 0a 20 2a 20 20 20 20 20 54 68 69 73  OTES. *     This
9e00: 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 63   function will c
9e10: 6f 6e 6e 65 63 74 20 74 6f 20 74 68 65 20 50 43  onnect to the PC
9e20: 2f 53 43 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 4d  /SC Connection M
9e30: 61 6e 61 67 65 72 20 76 69 61 0a 20 2a 20 20 20  anager via. *   
9e40: 20 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 63 6f    cackey_pcsc_co
9e50: 6e 6e 65 63 74 28 29 20 69 66 20 6e 65 65 64 65  nnect() if neede
9e60: 64 2e 0a 20 2a 0a 20 2a 20 20 20 20 20 49 74 20  d.. *. *     It 
9e70: 77 69 6c 6c 20 63 6f 6e 6e 65 63 74 20 74 6f 20  will connect to 
9e80: 74 68 65 20 63 61 72 64 20 69 6e 20 74 68 65 20  the card in the 
9e90: 72 65 61 64 65 72 20 61 74 74 61 63 68 65 64 20  reader attached 
9ea0: 74 6f 20 74 68 65 20 73 6c 6f 74 0a 20 2a 20 20  to the slot. *  
9eb0: 20 20 20 73 70 65 63 69 66 69 65 64 2e 20 20 49     specified.  I
9ec0: 74 20 77 69 6c 6c 20 72 65 63 6f 6e 6e 65 63 74  t will reconnect
9ed0: 20 74 6f 20 74 68 65 20 63 61 72 64 20 69 66 20   to the card if 
9ee0: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20  the connection. 
9ef0: 2a 20 20 20 20 20 67 6f 65 73 20 61 77 61 79 2e  *     goes away.
9f00: 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63  . *. */.static c
9f10: 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79  ackey_ret cackey
9f20: 5f 73 65 6e 64 5f 61 70 64 75 28 73 74 72 75 63  _send_apdu(struc
9f30: 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73  t cackey_slot *s
9f40: 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  lot, unsigned ch
9f50: 61 72 20 63 6c 61 73 73 2c 20 75 6e 73 69 67 6e  ar class, unsign
9f60: 65 64 20 63 68 61 72 20 69 6e 73 74 72 75 63 74  ed char instruct
9f70: 69 6f 6e 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  ion, unsigned ch
9f80: 61 72 20 70 31 2c 20 75 6e 73 69 67 6e 65 64 20  ar p1, unsigned 
9f90: 63 68 61 72 20 70 32 2c 20 75 6e 73 69 67 6e 65  char p2, unsigne
9fa0: 64 20 69 6e 74 20 6c 63 2c 20 75 6e 73 69 67 6e  d int lc, unsign
9fb0: 65 64 20 63 68 61 72 20 2a 64 61 74 61 2c 20 75  ed char *data, u
9fc0: 6e 73 69 67 6e 65 64 20 69 6e 74 20 6c 65 2c 20  nsigned int le, 
9fd0: 75 69 6e 74 31 36 5f 74 20 2a 72 65 73 70 63 6f  uint16_t *respco
9fe0: 64 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  de, unsigned cha
9ff0: 72 20 2a 72 65 73 70 64 61 74 61 2c 20 73 69 7a  r *respdata, siz
a000: 65 5f 74 20 2a 72 65 73 70 64 61 74 61 5f 6c 65  e_t *respdata_le
a010: 6e 29 20 7b 0a 09 75 69 6e 74 38 5f 74 20 6d 61  n) {..uint8_t ma
a020: 6a 6f 72 5f 72 63 2c 20 6d 69 6e 6f 72 5f 72 63  jor_rc, minor_rc
a030: 3b 0a 09 73 69 7a 65 5f 74 20 62 79 74 65 73 5f  ;..size_t bytes_
a040: 74 6f 5f 63 6f 70 79 2c 20 74 6d 70 5f 72 65 73  to_copy, tmp_res
a050: 70 64 61 74 61 5f 6c 65 6e 3b 0a 09 4c 50 43 53  pdata_len;..LPCS
a060: 43 41 52 44 5f 49 4f 5f 52 45 51 55 45 53 54 20  CARD_IO_REQUEST 
a070: 70 69 6f 53 65 6e 64 50 63 69 3b 0a 09 44 57 4f  pioSendPci;..DWO
a080: 52 44 20 78 6d 69 74 5f 6c 65 6e 2c 20 72 65 63  RD xmit_len, rec
a090: 76 5f 6c 65 6e 3b 0a 09 4c 4f 4e 47 20 73 63 61  v_len;..LONG sca
a0a0: 72 64 5f 78 6d 69 74 5f 72 65 74 2c 20 73 63 61  rd_xmit_ret, sca
a0b0: 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 74 3b 0a 09  rd_reconn_ret;..
a0c0: 42 59 54 45 20 78 6d 69 74 5f 62 75 66 5b 31 30  BYTE xmit_buf[10
a0d0: 32 34 5d 2c 20 72 65 63 76 5f 62 75 66 5b 31 30  24], recv_buf[10
a0e0: 32 34 5d 3b 0a 09 69 6e 74 20 70 63 73 63 5f 63  24];..int pcsc_c
a0f0: 6f 6e 6e 65 63 74 5f 72 65 74 2c 20 70 63 73 63  onnect_ret, pcsc
a100: 5f 67 65 74 72 65 73 70 5f 72 65 74 3b 0a 09 69  _getresp_ret;..i
a110: 6e 74 20 69 64 78 3b 0a 0a 09 43 41 43 4b 45 59  nt idx;...CACKEY
a120: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
a130: 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
a140: 21 73 6c 6f 74 29 20 7b 0a 09 09 43 41 43 4b 45  !slot) {...CACKE
a150: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
a160: 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 73 70 65  Invalid slot spe
a170: 63 69 66 69 65 64 2e 22 29 3b 0a 0a 09 09 72 65  cified.");....re
a180: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
a190: 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a  _E_GENERIC);..}.
a1a0: 0a 09 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72  ..pcsc_connect_r
a1b0: 65 74 20 3d 20 63 61 63 6b 65 79 5f 63 6f 6e 6e  et = cackey_conn
a1c0: 65 63 74 5f 63 61 72 64 28 73 6c 6f 74 29 3b 0a  ect_card(slot);.
a1d0: 09 69 66 20 28 70 63 73 63 5f 63 6f 6e 6e 65 63  .if (pcsc_connec
a1e0: 74 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f  t_ret != CACKEY_
a1f0: 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43  PCSC_S_OK) {...C
a200: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
a210: 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 63 6f  TF("Unable to co
a220: 6e 6e 65 63 74 20 74 6f 20 63 61 72 64 2c 20 72  nnect to card, r
a230: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
a240: 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ure");....return
a250: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47  (CACKEY_PCSC_E_G
a260: 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 2f 2a  ENERIC);..}.../*
a270: 20 44 65 74 65 72 6d 69 6e 65 20 77 68 69 63 68   Determine which
a280: 20 70 72 6f 74 6f 63 6f 6c 20 74 6f 20 73 65 6e   protocol to sen
a290: 64 20 75 73 69 6e 67 20 2a 2f 0a 09 73 77 69 74  d using */..swit
a2a0: 63 68 20 28 73 6c 6f 74 2d 3e 70 72 6f 74 6f 63  ch (slot->protoc
a2b0: 6f 6c 29 20 7b 0a 09 09 63 61 73 65 20 53 43 41  ol) {...case SCA
a2c0: 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 3a 0a  RD_PROTOCOL_T0:.
a2d0: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
a2e0: 50 52 49 4e 54 46 28 22 50 72 6f 74 6f 63 6f 6c  PRINTF("Protocol
a2f0: 20 74 6f 20 73 65 6e 64 20 64 61 74 61 67 72 61   to send datagra
a300: 6d 20 69 73 20 54 3d 30 22 29 3b 0a 0a 09 09 09  m is T=0");.....
a310: 70 69 6f 53 65 6e 64 50 63 69 20 3d 20 53 43 41  pioSendPci = SCA
a320: 52 44 5f 50 43 49 5f 54 30 3b 0a 0a 09 09 09 62  RD_PCI_T0;.....b
a330: 72 65 61 6b 3b 0a 09 09 63 61 73 65 20 53 43 41  reak;...case SCA
a340: 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31 3a 0a  RD_PROTOCOL_T1:.
a350: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
a360: 50 52 49 4e 54 46 28 22 50 72 6f 74 6f 63 6f 6c  PRINTF("Protocol
a370: 20 74 6f 20 73 65 6e 64 20 64 61 74 61 67 72 61   to send datagra
a380: 6d 20 69 73 20 54 3d 31 22 29 3b 0a 0a 09 09 09  m is T=1");.....
a390: 70 69 6f 53 65 6e 64 50 63 69 20 3d 20 53 43 41  pioSendPci = SCA
a3a0: 52 44 5f 50 43 49 5f 54 31 3b 0a 0a 09 09 09 62  RD_PCI_T1;.....b
a3b0: 72 65 61 6b 3b 0a 09 09 64 65 66 61 75 6c 74 3a  reak;...default:
a3c0: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
a3d0: 5f 50 52 49 4e 54 46 28 22 49 6e 76 61 6c 69 64  _PRINTF("Invalid
a3e0: 20 70 72 6f 74 6f 63 6f 6c 20 66 6f 75 6e 64 2c   protocol found,
a3f0: 20 61 62 6f 72 74 69 6e 67 2e 22 29 3b 0a 0a 09   aborting.");...
a400: 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
a410: 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b  PCSC_E_GENERIC);
a420: 0a 09 7d 0a 0a 09 2f 2a 20 54 72 61 6e 73 6d 69  ..}.../* Transmi
a430: 74 20 2a 2f 0a 09 78 6d 69 74 5f 6c 65 6e 20 3d  t */..xmit_len =
a440: 20 30 3b 0a 09 78 6d 69 74 5f 62 75 66 5b 78 6d   0;..xmit_buf[xm
a450: 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 63 6c 61 73  it_len++] = clas
a460: 73 3b 0a 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69  s;..xmit_buf[xmi
a470: 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 69 6e 73 74 72  t_len++] = instr
a480: 75 63 74 69 6f 6e 3b 0a 09 78 6d 69 74 5f 62 75  uction;..xmit_bu
a490: 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20  f[xmit_len++] = 
a4a0: 70 31 3b 0a 09 78 6d 69 74 5f 62 75 66 5b 78 6d  p1;..xmit_buf[xm
a4b0: 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 70 32 3b 0a  it_len++] = p2;.
a4c0: 09 69 66 20 28 64 61 74 61 29 20 7b 0a 09 09 69  .if (data) {...i
a4d0: 66 20 28 6c 63 20 3e 20 32 35 35 29 20 7b 0a 09  f (lc > 255) {..
a4e0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
a4f0: 52 49 4e 54 46 28 22 43 41 55 54 49 4f 4e 21 20  RINTF("CAUTION! 
a500: 20 55 73 69 6e 67 20 61 6e 20 4c 63 20 67 72 65   Using an Lc gre
a510: 61 74 65 72 20 74 68 61 6e 20 32 35 35 20 69 73  ater than 255 is
a520: 20 75 6e 74 65 73 74 65 64 2e 20 20 4c 63 20 3d   untested.  Lc =
a530: 20 25 75 22 2c 20 6c 63 29 3b 0a 0a 09 09 09 78   %u", lc);.....x
a540: 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 6e  mit_buf[xmit_len
a550: 2b 2b 5d 20 3d 20 30 78 38 32 3b 20 2f 2a 20 58  ++] = 0x82; /* X
a560: 58 58 20 55 4e 54 45 53 54 45 44 20 2a 2f 0a 09  XX UNTESTED */..
a570: 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f  ..xmit_buf[xmit_
a580: 6c 65 6e 2b 2b 5d 20 3d 20 28 6c 63 20 26 20 30  len++] = (lc & 0
a590: 78 66 66 30 30 29 20 3e 3e 20 38 3b 0a 09 09 09  xff00) >> 8;....
a5a0: 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c 65  xmit_buf[xmit_le
a5b0: 6e 2b 2b 5d 20 3d 20 6c 63 20 26 20 30 78 66 66  n++] = lc & 0xff
a5c0: 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ;...} else {....
a5d0: 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c 65  xmit_buf[xmit_le
a5e0: 6e 2b 2b 5d 20 3d 20 6c 63 3b 0a 09 09 7d 0a 09  n++] = lc;...}..
a5f0: 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69  .for (idx = 0; i
a600: 64 78 20 3c 20 6c 63 3b 20 69 64 78 2b 2b 29 20  dx < lc; idx++) 
a610: 7b 0a 09 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d  {....xmit_buf[xm
a620: 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 64 61 74 61  it_len++] = data
a630: 5b 69 64 78 5d 3b 0a 09 09 7d 0a 09 7d 0a 0a 09  [idx];...}..}...
a640: 69 66 20 28 6c 65 20 21 3d 20 30 78 30 30 29 20  if (le != 0x00) 
a650: 7b 0a 09 09 69 66 20 28 6c 65 20 3e 20 32 35 36  {...if (le > 256
a660: 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
a670: 42 55 47 5f 50 52 49 4e 54 46 28 22 43 41 55 54  BUG_PRINTF("CAUT
a680: 49 4f 4e 21 20 20 55 73 69 6e 67 20 61 6e 20 4c  ION!  Using an L
a690: 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 32  e greater than 2
a6a0: 35 36 20 69 73 20 75 6e 74 65 73 74 65 64 2e 20  56 is untested. 
a6b0: 20 4c 65 20 3d 20 25 75 22 2c 20 6c 65 29 3b 0a   Le = %u", le);.
a6c0: 0a 09 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69  ....xmit_buf[xmi
a6d0: 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 30 78 38 32 3b  t_len++] = 0x82;
a6e0: 20 2f 2a 20 58 58 58 20 55 4e 54 45 53 54 45 44   /* XXX UNTESTED
a6f0: 20 2a 2f 0a 09 09 09 78 6d 69 74 5f 62 75 66 5b   */....xmit_buf[
a700: 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 28 6c  xmit_len++] = (l
a710: 65 20 26 20 30 78 66 66 30 30 29 20 3e 3e 20 38  e & 0xff00) >> 8
a720: 3b 0a 09 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d  ;....xmit_buf[xm
a730: 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 6c 65 20 26  it_len++] = le &
a740: 20 30 78 66 66 3b 0a 09 09 7d 20 65 6c 73 65 20   0xff;...} else 
a750: 69 66 20 28 6c 65 20 3d 3d 20 32 35 36 29 20 7b  if (le == 256) {
a760: 0a 09 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69  ....xmit_buf[xmi
a770: 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 30 78 30 30 3b  t_len++] = 0x00;
a780: 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 78  ...} else {....x
a790: 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 6e  mit_buf[xmit_len
a7a0: 2b 2b 5d 20 3d 20 6c 65 3b 0a 09 09 7d 0a 09 7d  ++] = le;...}..}
a7b0: 0a 0a 09 2f 2a 20 42 65 67 69 6e 20 53 6d 61 72  .../* Begin Smar
a7c0: 74 63 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f  tcard Transactio
a7d0: 6e 20 2a 2f 0a 09 63 61 63 6b 65 79 5f 62 65 67  n */..cackey_beg
a7e0: 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73  in_transaction(s
a7f0: 6c 6f 74 29 3b 0a 0a 09 69 66 20 28 63 6c 61 73  lot);...if (clas
a800: 73 20 3d 3d 20 47 53 43 49 53 5f 43 4c 41 53 53  s == GSCIS_CLASS
a810: 5f 49 53 4f 37 38 31 36 20 26 26 20 28 69 6e 73  _ISO7816 && (ins
a820: 74 72 75 63 74 69 6f 6e 20 3d 3d 20 47 53 43 49  truction == GSCI
a830: 53 5f 49 4e 53 54 52 5f 56 45 52 49 46 59 20 7c  S_INSTR_VERIFY |
a840: 7c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 3d 3d  | instruction ==
a850: 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 43 48 41   GSCIS_INSTR_CHA
a860: 4e 47 45 5f 52 45 46 45 52 45 4e 43 45 29 20 26  NGE_REFERENCE) &
a870: 26 20 70 31 20 3d 3d 20 30 78 30 30 29 20 7b 0a  & p1 == 0x00) {.
a880: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
a890: 52 49 4e 54 46 28 22 53 65 6e 64 69 6e 67 20 41  RINTF("Sending A
a8a0: 50 44 55 3a 20 3c 3c 63 65 6e 73 6f 72 65 64 3e  PDU: <<censored>
a8b0: 3e 22 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09  >");..} else {..
a8c0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
a8d0: 49 4e 54 42 55 46 28 22 53 65 6e 64 69 6e 67 20  INTBUF("Sending 
a8e0: 41 50 44 55 3a 22 2c 20 78 6d 69 74 5f 62 75 66  APDU:", xmit_buf
a8f0: 2c 20 78 6d 69 74 5f 6c 65 6e 29 3b 0a 09 7d 0a  , xmit_len);..}.
a900: 0a 09 72 65 63 76 5f 6c 65 6e 20 3d 20 73 69 7a  ..recv_len = siz
a910: 65 6f 66 28 72 65 63 76 5f 62 75 66 29 3b 0a 09  eof(recv_buf);..
a920: 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 20 3d  scard_xmit_ret =
a930: 20 53 43 61 72 64 54 72 61 6e 73 6d 69 74 28 73   SCardTransmit(s
a940: 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20  lot->pcsc_card, 
a950: 70 69 6f 53 65 6e 64 50 63 69 2c 20 78 6d 69 74  pioSendPci, xmit
a960: 5f 62 75 66 2c 20 78 6d 69 74 5f 6c 65 6e 2c 20  _buf, xmit_len, 
a970: 4e 55 4c 4c 2c 20 72 65 63 76 5f 62 75 66 2c 20  NULL, recv_buf, 
a980: 26 72 65 63 76 5f 6c 65 6e 29 3b 0a 0a 09 69 66  &recv_len);...if
a990: 20 28 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74   (scard_xmit_ret
a9a0: 20 3d 3d 20 53 43 41 52 44 5f 45 5f 4e 4f 54 5f   == SCARD_E_NOT_
a9b0: 54 52 41 4e 53 41 43 54 45 44 29 20 7b 0a 09 09  TRANSACTED) {...
a9c0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
a9d0: 4e 54 46 28 22 46 61 69 6c 65 64 20 74 6f 20 73  NTF("Failed to s
a9e0: 65 6e 64 20 41 50 44 55 20 74 6f 20 63 61 72 64  end APDU to card
a9f0: 20 28 53 43 61 72 64 54 72 61 6e 73 6d 69 74 28   (SCardTransmit(
aa00: 29 20 3d 20 25 73 2f 25 6c 78 29 2c 20 77 69 6c  ) = %s/%lx), wil
aa10: 6c 20 61 73 6b 20 63 61 6c 6c 69 6e 67 20 66 75  l ask calling fu
aa20: 6e 63 74 69 6f 6e 20 74 6f 20 72 65 74 72 79 20  nction to retry 
aa30: 28 6e 6f 74 20 72 65 73 65 74 74 69 6e 67 20 63  (not resetting c
aa40: 61 72 64 29 2e 2e 2e 22 2c 20 43 41 43 4b 45 59  ard)...", CACKEY
aa50: 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52  _DEBUG_FUNC_SCAR
aa60: 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72  DERR_TO_STR(scar
aa70: 64 5f 78 6d 69 74 5f 72 65 74 29 2c 20 28 75 6e  d_xmit_ret), (un
aa80: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 63 61  signed long) sca
aa90: 72 64 5f 78 6d 69 74 5f 72 65 74 29 3b 0a 0a 09  rd_xmit_ret);...
aaa0: 09 2f 2a 20 42 65 67 69 6e 20 53 6d 61 72 74 63  ./* Begin Smartc
aab0: 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20  ard Transaction 
aac0: 2a 2f 0a 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f  */...cackey_end_
aad0: 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74  transaction(slot
aae0: 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 72 65 63  );....cackey_rec
aaf0: 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73 6c 6f 74  onnect_card(slot
ab00: 2c 20 73 6c 6f 74 2d 3e 70 72 6f 74 6f 63 6f 6c  , slot->protocol
ab10: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43  );....return(CAC
ab20: 4b 45 59 5f 50 43 53 43 5f 45 5f 52 45 54 52 59  KEY_PCSC_E_RETRY
ab30: 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 63 61 72  );..}...if (scar
ab40: 64 5f 78 6d 69 74 5f 72 65 74 20 21 3d 20 53 43  d_xmit_ret != SC
ab50: 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b  ARD_S_SUCCESS) {
ab60: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
ab70: 50 52 49 4e 54 46 28 22 46 61 69 6c 65 64 20 74  PRINTF("Failed t
ab80: 6f 20 73 65 6e 64 20 41 50 44 55 20 74 6f 20 63  o send APDU to c
ab90: 61 72 64 20 28 53 43 61 72 64 54 72 61 6e 73 6d  ard (SCardTransm
aba0: 69 74 28 29 20 3d 20 25 73 2f 25 6c 78 29 22 2c  it() = %s/%lx)",
abb0: 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55   CACKEY_DEBUG_FU
abc0: 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53  NC_SCARDERR_TO_S
abd0: 54 52 28 73 63 61 72 64 5f 78 6d 69 74 5f 72 65  TR(scard_xmit_re
abe0: 74 29 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  t), (unsigned lo
abf0: 6e 67 29 20 73 63 61 72 64 5f 78 6d 69 74 5f 72  ng) scard_xmit_r
ac00: 65 74 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  et);....CACKEY_D
ac10: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4d 61 72  EBUG_PRINTF("Mar
ac20: 6b 69 6e 67 20 73 6c 6f 74 20 61 73 20 68 61 76  king slot as hav
ac30: 69 6e 67 20 62 65 65 6e 20 72 65 73 65 74 22 29  ing been reset")
ac40: 3b 0a 09 09 63 61 63 6b 65 79 5f 6d 61 72 6b 5f  ;...cackey_mark_
ac50: 73 6c 6f 74 5f 72 65 73 65 74 28 73 6c 6f 74 29  slot_reset(slot)
ac60: 3b 0a 0a 09 09 69 66 20 28 73 63 61 72 64 5f 78  ;....if (scard_x
ac70: 6d 69 74 5f 72 65 74 20 3d 3d 20 53 43 41 52 44  mit_ret == SCARD
ac80: 5f 57 5f 52 45 53 45 54 5f 43 41 52 44 29 20 7b  _W_RESET_CARD) {
ac90: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
aca0: 5f 50 52 49 4e 54 46 28 22 52 65 73 65 74 20 72  _PRINTF("Reset r
acb0: 65 71 75 69 72 65 64 2c 20 70 6c 65 61 73 65 20  equired, please 
acc0: 68 6f 6c 64 2e 2e 2e 22 29 3b 0a 0a 09 09 09 73  hold...");.....s
acd0: 63 61 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 74 20  card_reconn_ret 
ace0: 3d 20 63 61 63 6b 65 79 5f 72 65 63 6f 6e 6e 65  = cackey_reconne
acf0: 63 74 5f 63 61 72 64 28 73 6c 6f 74 2c 20 53 43  ct_card(slot, SC
ad00: 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 20  ARD_PROTOCOL_T0 
ad10: 7c 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c  | SCARD_PROTOCOL
ad20: 5f 54 31 29 3b 0a 0a 09 09 09 69 66 20 28 73 63  _T1);.....if (sc
ad30: 61 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 74 20 3d  ard_reconn_ret =
ad40: 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53  = SCARD_S_SUCCES
ad50: 53 29 20 7b 0a 09 09 09 09 73 77 69 74 63 68 20  S) {.....switch 
ad60: 28 73 6c 6f 74 2d 3e 70 72 6f 74 6f 63 6f 6c 29  (slot->protocol)
ad70: 20 7b 0a 09 09 09 09 09 63 61 73 65 20 53 43 41   {......case SCA
ad80: 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 3a 0a  RD_PROTOCOL_T0:.
ad90: 09 09 09 09 09 09 70 69 6f 53 65 6e 64 50 63 69  ......pioSendPci
ada0: 20 3d 20 53 43 41 52 44 5f 50 43 49 5f 54 30 3b   = SCARD_PCI_T0;
adb0: 0a 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09  ........break;..
adc0: 09 09 09 09 63 61 73 65 20 53 43 41 52 44 5f 50  ....case SCARD_P
add0: 52 4f 54 4f 43 4f 4c 5f 54 31 3a 0a 09 09 09 09  ROTOCOL_T1:.....
ade0: 09 09 70 69 6f 53 65 6e 64 50 63 69 20 3d 20 53  ..pioSendPci = S
adf0: 43 41 52 44 5f 50 43 49 5f 54 31 3b 0a 0a 09 09  CARD_PCI_T1;....
ae00: 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09  ....break;......
ae10: 64 65 66 61 75 6c 74 3a 0a 09 09 09 09 09 09 43  default:.......C
ae20: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
ae30: 54 46 28 22 49 6e 76 61 6c 69 64 20 70 72 6f 74  TF("Invalid prot
ae40: 6f 63 6f 6c 20 66 6f 75 6e 64 2c 20 62 75 74 20  ocol found, but 
ae50: 74 6f 6f 20 6c 61 74 65 20 74 6f 20 64 6f 20 61  too late to do a
ae60: 6e 79 74 68 69 6e 67 20 61 62 6f 75 74 20 69 74  nything about it
ae70: 20 6e 6f 77 20 2d 2d 20 74 72 79 69 6e 67 20 61   now -- trying a
ae80: 6e 79 77 61 79 2e 22 29 3b 0a 0a 09 09 09 09 09  nyway.");.......
ae90: 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09  .break;.....}...
aea0: 09 09 09 2f 2a 20 52 65 2d 65 73 74 61 62 6c 69  .../* Re-establi
aeb0: 73 68 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  sh transaction, 
aec0: 69 66 20 69 74 20 77 61 73 20 70 72 65 73 65 6e  if it was presen
aed0: 74 20 2a 2f 0a 09 09 09 09 69 66 20 28 73 6c 6f  t */.....if (slo
aee0: 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64  t->transaction_d
aef0: 65 70 74 68 20 3e 20 30 29 20 7b 0a 09 09 09 09  epth > 0) {.....
af00: 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69  .slot->transacti
af10: 6f 6e 5f 64 65 70 74 68 2d 2d 3b 0a 09 09 09 09  on_depth--;.....
af20: 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69  .slot->transacti
af30: 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b 20  on_need_hw_lock 
af40: 3d 20 31 3b 0a 09 09 09 09 09 63 61 63 6b 65 79  = 1;......cackey
af50: 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69  _begin_transacti
af60: 6f 6e 28 73 6c 6f 74 29 3b 0a 09 09 09 09 7d 0a  on(slot);.....}.
af70: 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
af80: 47 5f 50 52 49 4e 54 46 28 22 52 65 73 65 74 20  G_PRINTF("Reset 
af90: 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74 72  successful, retr
afa0: 61 6e 73 6d 69 74 74 69 6e 67 22 29 3b 0a 0a 09  ansmitting");...
afb0: 09 09 09 72 65 63 76 5f 6c 65 6e 20 3d 20 73 69  ...recv_len = si
afc0: 7a 65 6f 66 28 72 65 63 76 5f 62 75 66 29 3b 0a  zeof(recv_buf);.
afd0: 09 09 09 09 73 63 61 72 64 5f 78 6d 69 74 5f 72  ....scard_xmit_r
afe0: 65 74 20 3d 20 53 43 61 72 64 54 72 61 6e 73 6d  et = SCardTransm
aff0: 69 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61  it(slot->pcsc_ca
b000: 72 64 2c 20 70 69 6f 53 65 6e 64 50 63 69 2c 20  rd, pioSendPci, 
b010: 78 6d 69 74 5f 62 75 66 2c 20 78 6d 69 74 5f 6c  xmit_buf, xmit_l
b020: 65 6e 2c 20 4e 55 4c 4c 2c 20 72 65 63 76 5f 62  en, NULL, recv_b
b030: 75 66 2c 20 26 72 65 63 76 5f 6c 65 6e 29 3b 0a  uf, &recv_len);.
b040: 0a 09 09 09 09 69 66 20 28 73 63 61 72 64 5f 78  .....if (scard_x
b050: 6d 69 74 5f 72 65 74 20 21 3d 20 53 43 41 52 44  mit_ret != SCARD
b060: 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09  _S_SUCCESS) {...
b070: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
b080: 50 52 49 4e 54 46 28 22 52 65 74 72 61 6e 73 6d  PRINTF("Retransm
b090: 69 74 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72  it failed, retur
b0a0: 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 20  ning in failure 
b0b0: 61 66 74 65 72 20 64 69 73 63 6f 6e 6e 65 63 74  after disconnect
b0c0: 69 6e 67 20 74 68 65 20 63 61 72 64 20 28 53 43  ing the card (SC
b0d0: 61 72 64 54 72 61 6e 73 6d 69 74 20 3d 20 25 73  ardTransmit = %s
b0e0: 2f 25 6c 69 29 22 2c 20 43 41 43 4b 45 59 5f 44  /%li)", CACKEY_D
b0f0: 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45  EBUG_FUNC_SCARDE
b100: 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 5f  RR_TO_STR(scard_
b110: 78 6d 69 74 5f 72 65 74 29 2c 20 28 6c 6f 6e 67  xmit_ret), (long
b120: 29 20 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74  ) scard_xmit_ret
b130: 29 3b 0a 0a 09 09 09 09 09 53 43 61 72 64 44 69  );.......SCardDi
b140: 73 63 6f 6e 6e 65 63 74 28 73 6c 6f 74 2d 3e 70  sconnect(slot->p
b150: 63 73 63 5f 63 61 72 64 2c 20 53 43 41 52 44 5f  csc_card, SCARD_
b160: 4c 45 41 56 45 5f 43 41 52 44 29 3b 0a 09 09 09  LEAVE_CARD);....
b170: 09 09 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72  ..slot->pcsc_car
b180: 64 5f 63 6f 6e 6e 65 63 74 65 64 20 3d 20 30 3b  d_connected = 0;
b190: 0a 0a 09 09 09 09 09 2f 2a 20 45 6e 64 20 53 6d  ......./* End Sm
b1a0: 61 72 74 63 61 72 64 20 54 72 61 6e 73 61 63 74  artcard Transact
b1b0: 69 6f 6e 20 2a 2f 0a 09 09 09 09 09 73 6c 6f 74  ion */......slot
b1c0: 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65  ->transaction_de
b1d0: 70 74 68 20 3d 20 31 3b 0a 09 09 09 09 09 63 61  pth = 1;......ca
b1e0: 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ckey_end_transac
b1f0: 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 09  tion(slot);.....
b200: 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
b210: 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45  PCSC_E_TOKENABSE
b220: 4e 54 29 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 20  NT);.....}....} 
b230: 65 6c 73 65 20 7b 0a 09 09 09 09 43 41 43 4b 45  else {.....CACKE
b240: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
b250: 44 69 73 63 6f 6e 6e 65 63 74 69 6e 67 20 63 61  Disconnecting ca
b260: 72 64 22 29 3b 0a 0a 09 09 09 09 53 43 61 72 64  rd");......SCard
b270: 44 69 73 63 6f 6e 6e 65 63 74 28 73 6c 6f 74 2d  Disconnect(slot-
b280: 3e 70 63 73 63 5f 63 61 72 64 2c 20 53 43 41 52  >pcsc_card, SCAR
b290: 44 5f 4c 45 41 56 45 5f 43 41 52 44 29 3b 0a 09  D_LEAVE_CARD);..
b2a0: 09 09 09 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61  ...slot->pcsc_ca
b2b0: 72 64 5f 63 6f 6e 6e 65 63 74 65 64 20 3d 20 30  rd_connected = 0
b2c0: 3b 0a 0a 09 09 09 09 2f 2a 20 45 6e 64 20 53 6d  ;....../* End Sm
b2d0: 61 72 74 63 61 72 64 20 54 72 61 6e 73 61 63 74  artcard Transact
b2e0: 69 6f 6e 20 2a 2f 0a 09 09 09 09 73 6c 6f 74 2d  ion */.....slot-
b2f0: 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70  >transaction_dep
b300: 74 68 20 3d 20 31 3b 0a 09 09 09 09 63 61 63 6b  th = 1;.....cack
b310: 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  ey_end_transacti
b320: 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 09 09 43  on(slot);......C
b330: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
b340: 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e  TF("Returning in
b350: 20 66 61 69 6c 75 72 65 22 29 3b 0a 09 09 09 09   failure");.....
b360: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
b370: 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54  SC_E_TOKENABSENT
b380: 29 3b 0a 09 09 09 7d 0a 09 09 7d 20 65 6c 73 65  );....}...} else
b390: 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
b3a0: 55 47 5f 50 52 49 4e 54 46 28 22 44 69 73 63 6f  UG_PRINTF("Disco
b3b0: 6e 6e 65 63 74 69 6e 67 20 63 61 72 64 22 29 3b  nnecting card");
b3c0: 0a 0a 09 09 09 53 43 61 72 64 44 69 73 63 6f 6e  .....SCardDiscon
b3d0: 6e 65 63 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f  nect(slot->pcsc_
b3e0: 63 61 72 64 2c 20 53 43 41 52 44 5f 4c 45 41 56  card, SCARD_LEAV
b3f0: 45 5f 43 41 52 44 29 3b 0a 09 09 09 73 6c 6f 74  E_CARD);....slot
b400: 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e  ->pcsc_card_conn
b410: 65 63 74 65 64 20 3d 20 30 3b 0a 0a 09 09 09 2f  ected = 0;...../
b420: 2a 20 45 6e 64 20 53 6d 61 72 74 63 61 72 64 20  * End Smartcard 
b430: 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09  Transaction */..
b440: 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74  ..slot->transact
b450: 69 6f 6e 5f 64 65 70 74 68 20 3d 20 31 3b 0a 09  ion_depth = 1;..
b460: 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61  ..cackey_end_tra
b470: 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a  nsaction(slot);.
b480: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
b490: 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
b4a0: 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b  ng in failure");
b4b0: 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ....return(CACKE
b4c0: 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42  Y_PCSC_E_TOKENAB
b4d0: 53 45 4e 54 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09  SENT);...}..}...
b4e0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
b4f0: 4e 54 42 55 46 28 22 52 65 74 75 72 6e 65 64 20  NTBUF("Returned 
b500: 56 61 6c 75 65 3a 22 2c 20 72 65 63 76 5f 62 75  Value:", recv_bu
b510: 66 2c 20 72 65 63 76 5f 6c 65 6e 29 3b 0a 0a 09  f, recv_len);...
b520: 69 66 20 28 72 65 63 76 5f 6c 65 6e 20 3c 20 32  if (recv_len < 2
b530: 29 20 7b 0a 09 09 2f 2a 20 4d 69 6e 69 6d 61 6c  ) {.../* Minimal
b540: 20 72 65 73 70 6f 6e 73 65 20 6c 65 6e 67 74 68   response length
b550: 20 69 73 20 32 20 62 79 74 65 73 2c 20 72 65 74   is 2 bytes, ret
b560: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
b570: 65 20 2a 2f 0a 09 09 43 41 43 4b 45 59 5f 44 45  e */...CACKEY_DE
b580: 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 73 70  BUG_PRINTF("Resp
b590: 6f 6e 73 65 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20  onse too small, 
b5a0: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  returning in fai
b5b0: 6c 75 72 65 20 28 72 65 63 76 5f 6c 65 6e 20 3d  lure (recv_len =
b5c0: 20 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65   %lu)", (unsigne
b5d0: 64 20 6c 6f 6e 67 29 20 72 65 63 76 5f 6c 65 6e  d long) recv_len
b5e0: 29 3b 0a 0a 09 09 2f 2a 20 45 6e 64 20 53 6d 61  );..../* End Sma
b5f0: 72 74 63 61 72 64 20 54 72 61 6e 73 61 63 74 69  rtcard Transacti
b600: 6f 6e 20 2a 2f 0a 09 09 63 61 63 6b 65 79 5f 65  on */...cackey_e
b610: 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73  nd_transaction(s
b620: 6c 6f 74 29 3b 0a 0a 09 09 2f 2a 20 53 75 70 70  lot);..../* Supp
b630: 6c 79 20 61 6e 20 69 6e 76 61 6c 69 64 20 72 65  ly an invalid re
b640: 73 70 6f 6e 73 65 20 63 6f 64 65 20 2a 2f 0a 09  sponse code */..
b650: 09 69 66 20 28 72 65 73 70 63 6f 64 65 29 20 7b  .if (respcode) {
b660: 0a 09 09 09 2a 72 65 73 70 63 6f 64 65 20 3d 20  ....*respcode = 
b670: 30 3b 0a 09 09 7d 0a 0a 09 09 72 65 74 75 72 6e  0;...}....return
b680: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4e  (CACKEY_PCSC_E_N
b690: 4f 44 41 54 41 29 3b 0a 09 7d 0a 0a 09 2f 2a 20  ODATA);..}.../* 
b6a0: 44 65 74 65 72 6d 69 6e 65 20 72 65 73 75 6c 74  Determine result
b6b0: 20 63 6f 64 65 20 2a 2f 0a 09 6d 61 6a 6f 72 5f   code */..major_
b6c0: 72 63 20 3d 20 72 65 63 76 5f 62 75 66 5b 72 65  rc = recv_buf[re
b6d0: 63 76 5f 6c 65 6e 20 2d 20 32 5d 3b 0a 09 6d 69  cv_len - 2];..mi
b6e0: 6e 6f 72 5f 72 63 20 3d 20 72 65 63 76 5f 62 75  nor_rc = recv_bu
b6f0: 66 5b 72 65 63 76 5f 6c 65 6e 20 2d 20 31 5d 3b  f[recv_len - 1];
b700: 0a 09 69 66 20 28 72 65 73 70 63 6f 64 65 29 20  ..if (respcode) 
b710: 7b 0a 09 09 2a 72 65 73 70 63 6f 64 65 20 3d 20  {...*respcode = 
b720: 28 6d 61 6a 6f 72 5f 72 63 20 3c 3c 20 38 29 20  (major_rc << 8) 
b730: 7c 20 6d 69 6e 6f 72 5f 72 63 3b 0a 09 7d 0a 0a  | minor_rc;..}..
b740: 09 2f 2a 20 41 64 6a 75 73 74 20 6d 65 73 73 61  ./* Adjust messa
b750: 67 65 20 62 75 66 66 65 72 20 2a 2f 0a 09 72 65  ge buffer */..re
b760: 63 76 5f 6c 65 6e 20 2d 3d 20 32 3b 0a 0a 09 2f  cv_len -= 2;.../
b770: 2a 20 41 64 64 20 62 79 74 65 73 20 74 6f 20 72  * Add bytes to r
b780: 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 09  eturn value */..
b790: 74 6d 70 5f 72 65 73 70 64 61 74 61 5f 6c 65 6e  tmp_respdata_len
b7a0: 20 3d 20 30 3b 0a 09 69 66 20 28 72 65 73 70 64   = 0;..if (respd
b7b0: 61 74 61 20 26 26 20 72 65 73 70 64 61 74 61 5f  ata && respdata_
b7c0: 6c 65 6e 29 20 7b 0a 09 09 74 6d 70 5f 72 65 73  len) {...tmp_res
b7d0: 70 64 61 74 61 5f 6c 65 6e 20 3d 20 2a 72 65 73  pdata_len = *res
b7e0: 70 64 61 74 61 5f 6c 65 6e 3b 0a 0a 09 09 62 79  pdata_len;....by
b7f0: 74 65 73 5f 74 6f 5f 63 6f 70 79 20 3d 20 2a 72  tes_to_copy = *r
b800: 65 73 70 64 61 74 61 5f 6c 65 6e 3b 0a 0a 09 09  espdata_len;....
b810: 69 66 20 28 72 65 63 76 5f 6c 65 6e 20 3c 20 62  if (recv_len < b
b820: 79 74 65 73 5f 74 6f 5f 63 6f 70 79 29 20 7b 0a  ytes_to_copy) {.
b830: 09 09 09 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79  ...bytes_to_copy
b840: 20 3d 20 72 65 63 76 5f 6c 65 6e 3b 0a 09 09 7d   = recv_len;...}
b850: 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
b860: 5f 50 52 49 4e 54 46 28 22 43 6f 70 79 69 6e 67  _PRINTF("Copying
b870: 20 25 6c 75 20 62 79 74 65 73 20 74 6f 20 74 68   %lu bytes to th
b880: 65 20 62 75 66 66 65 72 20 28 72 65 63 76 27 64  e buffer (recv'd
b890: 20 25 6c 75 20 62 79 74 65 73 2c 20 62 75 74 20   %lu bytes, but 
b8a0: 6f 6e 6c 79 20 25 6c 75 20 62 79 74 65 73 20 6c  only %lu bytes l
b8b0: 65 66 74 20 69 6e 20 6f 75 72 20 62 75 66 66 65  eft in our buffe
b8c0: 72 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  r)", (unsigned l
b8d0: 6f 6e 67 29 20 62 79 74 65 73 5f 74 6f 5f 63 6f  ong) bytes_to_co
b8e0: 70 79 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  py, (unsigned lo
b8f0: 6e 67 29 20 72 65 63 76 5f 6c 65 6e 2c 20 28 75  ng) recv_len, (u
b900: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 72  nsigned long) *r
b910: 65 73 70 64 61 74 61 5f 6c 65 6e 29 3b 0a 0a 09  espdata_len);...
b920: 09 6d 65 6d 63 70 79 28 72 65 73 70 64 61 74 61  .memcpy(respdata
b930: 2c 20 72 65 63 76 5f 62 75 66 2c 20 62 79 74 65  , recv_buf, byte
b940: 73 5f 74 6f 5f 63 6f 70 79 29 3b 0a 09 09 72 65  s_to_copy);...re
b950: 73 70 64 61 74 61 20 2b 3d 20 62 79 74 65 73 5f  spdata += bytes_
b960: 74 6f 5f 63 6f 70 79 3b 0a 0a 09 09 2a 72 65 73  to_copy;....*res
b970: 70 64 61 74 61 5f 6c 65 6e 20 3d 20 62 79 74 65  pdata_len = byte
b980: 73 5f 74 6f 5f 63 6f 70 79 3b 0a 09 09 74 6d 70  s_to_copy;...tmp
b990: 5f 72 65 73 70 64 61 74 61 5f 6c 65 6e 20 2d 3d  _respdata_len -=
b9a0: 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 3b 0a   bytes_to_copy;.
b9b0: 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69 66 20 28  .} else {...if (
b9c0: 72 65 63 76 5f 6c 65 6e 20 21 3d 20 30 29 20 7b  recv_len != 0) {
b9d0: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
b9e0: 5f 50 52 49 4e 54 46 28 22 54 68 72 6f 77 69 6e  _PRINTF("Throwin
b9f0: 67 20 61 77 61 79 20 25 6c 75 20 62 79 74 65 73  g away %lu bytes
ba00: 2c 20 6e 6f 77 68 65 72 65 20 74 6f 20 70 75 74  , nowhere to put
ba10: 20 74 68 65 6d 21 22 2c 20 28 75 6e 73 69 67 6e   them!", (unsign
ba20: 65 64 20 6c 6f 6e 67 29 20 72 65 63 76 5f 6c 65  ed long) recv_le
ba30: 6e 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20  n);...}..}...if 
ba40: 28 6d 61 6a 6f 72 5f 72 63 20 3d 3d 20 30 78 36  (major_rc == 0x6
ba50: 31 29 20 7b 0a 09 09 2f 2a 20 57 65 20 6e 65 65  1) {.../* We nee
ba60: 64 20 74 6f 20 52 45 41 44 20 2a 2f 0a 09 09 43  d to READ */...C
ba70: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
ba80: 54 46 28 22 42 75 66 66 65 72 20 72 65 61 64 20  TF("Buffer read 
ba90: 72 65 71 75 69 72 65 64 22 29 3b 0a 0a 09 09 69  required");....i
baa0: 66 20 28 6d 69 6e 6f 72 5f 72 63 20 3d 3d 20 30  f (minor_rc == 0
bab0: 78 30 30 29 20 7b 0a 09 09 09 6d 69 6e 6f 72 5f  x00) {....minor_
bac0: 72 63 20 3d 20 43 41 43 4b 45 59 5f 41 50 44 55  rc = CACKEY_APDU
bad0: 5f 4d 54 55 3b 0a 09 09 7d 0a 0a 09 09 70 63 73  _MTU;...}....pcs
bae0: 63 5f 67 65 74 72 65 73 70 5f 72 65 74 20 3d 20  c_getresp_ret = 
baf0: 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75  cackey_send_apdu
bb00: 28 73 6c 6f 74 2c 20 47 53 43 49 53 5f 43 4c 41  (slot, GSCIS_CLA
bb10: 53 53 5f 49 53 4f 37 38 31 36 2c 20 47 53 43 49  SS_ISO7816, GSCI
bb20: 53 5f 49 4e 53 54 52 5f 47 45 54 5f 52 45 53 50  S_INSTR_GET_RESP
bb30: 4f 4e 53 45 2c 20 30 78 30 30 2c 20 30 78 30 30  ONSE, 0x00, 0x00
bb40: 2c 20 30 2c 20 4e 55 4c 4c 2c 20 6d 69 6e 6f 72  , 0, NULL, minor
bb50: 5f 72 63 2c 20 72 65 73 70 63 6f 64 65 2c 20 72  _rc, respcode, r
bb60: 65 73 70 64 61 74 61 2c 20 26 74 6d 70 5f 72 65  espdata, &tmp_re
bb70: 73 70 64 61 74 61 5f 6c 65 6e 29 3b 0a 0a 09 09  spdata_len);....
bb80: 69 66 20 28 70 63 73 63 5f 67 65 74 72 65 73 70  if (pcsc_getresp
bb90: 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50  _ret != CACKEY_P
bba0: 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 43  CSC_S_OK) {....C
bbb0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
bbc0: 54 46 28 22 42 75 66 66 65 72 20 72 65 61 64 20  TF("Buffer read 
bbd0: 66 61 69 6c 65 64 21 20 20 52 65 74 75 72 6e 69  failed!  Returni
bbe0: 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b  ng in failure");
bbf0: 0a 0a 09 09 09 2f 2a 20 45 6e 64 20 53 6d 61 72  ...../* End Smar
bc00: 74 63 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f  tcard Transactio
bc10: 6e 20 2a 2f 0a 09 09 09 63 61 63 6b 65 79 5f 65  n */....cackey_e
bc20: 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73  nd_transaction(s
bc30: 6c 6f 74 29 3b 0a 0a 09 09 09 69 66 20 28 70 63  lot);.....if (pc
bc40: 73 63 5f 67 65 74 72 65 73 70 5f 72 65 74 20 3d  sc_getresp_ret =
bc50: 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  = CACKEY_PCSC_E_
bc60: 52 45 54 52 59 29 20 7b 0a 09 09 09 09 72 65 74  RETRY) {.....ret
bc70: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
bc80: 45 5f 52 45 54 52 59 29 3b 0a 09 09 09 7d 0a 0a  E_RETRY);....}..
bc90: 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
bca0: 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29  _PCSC_E_GENERIC)
bcb0: 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 72 65 73  ;...}....if (res
bcc0: 70 64 61 74 61 5f 6c 65 6e 29 20 7b 0a 09 09 09  pdata_len) {....
bcd0: 2a 72 65 73 70 64 61 74 61 5f 6c 65 6e 20 2b 3d  *respdata_len +=
bce0: 20 74 6d 70 5f 72 65 73 70 64 61 74 61 5f 6c 65   tmp_respdata_le
bcf0: 6e 3b 0a 09 09 7d 0a 0a 09 09 2f 2a 20 45 6e 64  n;...}..../* End
bd00: 20 53 6d 61 72 74 63 61 72 64 20 54 72 61 6e 73   Smartcard Trans
bd10: 61 63 74 69 6f 6e 20 2a 2f 0a 09 09 63 61 63 6b  action */...cack
bd20: 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  ey_end_transacti
bd30: 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 43 41 43  on(slot);....CAC
bd40: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
bd50: 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 73  ("Returning in s
bd60: 75 63 63 65 73 73 20 28 62 75 66 66 65 72 20 72  uccess (buffer r
bd70: 65 61 64 20 63 6f 6d 70 6c 65 74 65 29 22 29 3b  ead complete)");
bd80: 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
bd90: 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 09 7d 0a  _PCSC_S_OK);..}.
bda0: 0a 09 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63 61  ../* End Smartca
bdb0: 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a  rd Transaction *
bdc0: 2f 0a 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72  /..cackey_end_tr
bdd0: 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b  ansaction(slot);
bde0: 0a 0a 09 69 66 20 28 6d 61 6a 6f 72 5f 72 63 20  ...if (major_rc 
bdf0: 3d 3d 20 30 78 39 30 29 20 7b 0a 09 09 2f 2a 20  == 0x90) {.../* 
be00: 53 75 63 63 65 73 73 20 2a 2f 0a 09 09 43 41 43  Success */...CAC
be10: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
be20: 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 73  ("Returning in s
be30: 75 63 63 65 73 73 20 28 6d 61 6a 6f 72 5f 72 63  uccess (major_rc
be40: 20 3d 20 30 78 39 30 29 22 29 3b 0a 0a 09 09 72   = 0x90)");....r
be50: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
be60: 43 5f 53 5f 4f 4b 29 3b 0a 09 7d 0a 0a 0a 09 43  C_S_OK);..}....C
be70: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
be80: 54 46 28 22 41 50 44 55 20 52 65 74 75 72 6e 65  TF("APDU Returne
be90: 64 20 61 6e 20 65 72 72 6f 72 2c 20 72 65 74 75  d an error, retu
bea0: 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65  rning in failure
beb0: 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41 43  ");...return(CAC
bec0: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52  KEY_PCSC_E_GENER
bed0: 49 43 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 75  IC);.}..static u
bee0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 63 61  nsigned char *ca
bef0: 63 6b 65 79 5f 72 65 61 64 5f 62 65 72 74 6c 76  ckey_read_bertlv
bf00: 5f 74 61 67 28 75 6e 73 69 67 6e 65 64 20 63 68  _tag(unsigned ch
bf10: 61 72 20 2a 62 75 66 66 65 72 2c 20 73 69 7a 65  ar *buffer, size
bf20: 5f 74 20 2a 62 75 66 66 65 72 5f 6c 65 6e 5f 70  _t *buffer_len_p
bf30: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
bf40: 74 61 67 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  tag, unsigned ch
bf50: 61 72 20 2a 6f 75 74 62 75 66 66 65 72 2c 20 73  ar *outbuffer, s
bf60: 69 7a 65 5f 74 20 2a 6f 75 74 62 75 66 66 65 72  ize_t *outbuffer
bf70: 5f 6c 65 6e 5f 70 29 20 7b 0a 09 75 6e 73 69 67  _len_p) {..unsig
bf80: 6e 65 64 20 63 68 61 72 20 2a 62 75 66 66 65 72  ned char *buffer
bf90: 5f 70 3b 0a 09 73 69 7a 65 5f 74 20 6f 75 74 62  _p;..size_t outb
bfa0: 75 66 66 65 72 5f 6c 65 6e 2c 20 62 75 66 66 65  uffer_len, buffe
bfb0: 72 5f 6c 65 6e 3b 0a 09 73 69 7a 65 5f 74 20 73  r_len;..size_t s
bfc0: 69 7a 65 3b 0a 09 69 6e 74 20 69 64 78 3b 0a 0a  ize;..int idx;..
bfd0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
bfe0: 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
bff0: 0a 0a 09 69 66 20 28 62 75 66 66 65 72 5f 6c 65  ...if (buffer_le
c000: 6e 5f 70 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  n_p == NULL) {..
c010: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
c020: 49 4e 54 46 28 22 62 75 66 66 65 72 5f 6c 65 6e  INTF("buffer_len
c030: 5f 70 20 69 73 20 4e 55 4c 4c 2e 20 20 52 65 74  _p is NULL.  Ret
c040: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
c050: 65 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  e.");....return(
c060: 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  NULL);..}...if (
c070: 6f 75 74 62 75 66 66 65 72 5f 6c 65 6e 5f 70 20  outbuffer_len_p 
c080: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43  == NULL) {...CAC
c090: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
c0a0: 28 22 6f 75 74 62 75 66 66 65 72 5f 6c 65 6e 5f  ("outbuffer_len_
c0b0: 70 20 69 73 20 4e 55 4c 4c 2e 20 20 52 65 74 75  p is NULL.  Retu
c0c0: 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65  rning in failure
c0d0: 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e  .");....return(N
c0e0: 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 62 75 66 66 65  ULL);..}...buffe
c0f0: 72 5f 6c 65 6e 20 3d 20 2a 6f 75 74 62 75 66 66  r_len = *outbuff
c100: 65 72 5f 6c 65 6e 5f 70 3b 0a 09 6f 75 74 62 75  er_len_p;..outbu
c110: 66 66 65 72 5f 6c 65 6e 20 3d 20 2a 6f 75 74 62  ffer_len = *outb
c120: 75 66 66 65 72 5f 6c 65 6e 5f 70 3b 0a 0a 09 69  uffer_len_p;...i
c130: 66 20 28 62 75 66 66 65 72 5f 6c 65 6e 20 3c 20  f (buffer_len < 
c140: 32 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  2) {...CACKEY_DE
c150: 42 55 47 5f 50 52 49 4e 54 46 28 22 62 75 66 66  BUG_PRINTF("buff
c160: 65 72 5f 6c 65 6e 20 69 73 20 6c 65 73 73 20 74  er_len is less t
c170: 68 61 6e 20 32 2c 20 73 6f 20 77 65 20 63 61 6e  han 2, so we can
c180: 27 74 20 72 65 61 64 20 61 6e 79 20 74 61 67 2e  't read any tag.
c190: 20 20 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 66    Returning in f
c1a0: 61 69 6c 75 72 65 2e 22 29 3b 0a 0a 09 09 72 65  ailure.");....re
c1b0: 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a  turn(NULL);..}..
c1c0: 09 62 75 66 66 65 72 5f 70 20 3d 20 62 75 66 66  .buffer_p = buff
c1d0: 65 72 3b 0a 09 69 66 20 28 62 75 66 66 65 72 5f  er;..if (buffer_
c1e0: 70 5b 30 5d 20 21 3d 20 74 61 67 29 20 7b 0a 09  p[0] != tag) {..
c1f0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
c200: 49 4e 54 46 28 22 54 61 67 20 66 6f 75 6e 64 20  INTF("Tag found 
c210: 77 61 73 20 6e 6f 74 20 74 61 67 20 65 78 70 65  was not tag expe
c220: 63 74 65 64 2e 20 20 54 61 67 20 3d 20 25 30 32  cted.  Tag = %02
c230: 78 2c 20 45 78 70 65 63 74 65 64 20 3d 20 25 30  x, Expected = %0
c240: 32 78 2e 20 20 52 65 74 75 72 6e 69 6e 67 20 69  2x.  Returning i
c250: 6e 20 66 61 69 6c 75 72 65 2e 22 2c 20 28 75 6e  n failure.", (un
c260: 73 69 67 6e 65 64 20 69 6e 74 29 20 62 75 66 66  signed int) buff
c270: 65 72 5f 70 5b 30 5d 2c 20 74 61 67 29 3b 0a 0a  er_p[0], tag);..
c280: 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a  ..return(NULL);.
c290: 09 7d 0a 0a 09 62 75 66 66 65 72 5f 70 2b 2b 3b  .}...buffer_p++;
c2a0: 0a 09 62 75 66 66 65 72 5f 6c 65 6e 2d 2d 3b 0a  ..buffer_len--;.
c2b0: 0a 09 69 66 20 28 28 62 75 66 66 65 72 5f 70 5b  ..if ((buffer_p[
c2c0: 30 5d 20 26 20 30 78 38 30 29 20 3d 3d 20 30 78  0] & 0x80) == 0x
c2d0: 38 30 29 20 7b 0a 09 09 73 69 7a 65 20 3d 20 30  80) {...size = 0
c2e0: 3b 0a 09 09 69 64 78 20 3d 20 28 62 75 66 66 65  ;...idx = (buffe
c2f0: 72 5f 70 5b 30 5d 20 26 20 30 78 37 66 29 3b 0a  r_p[0] & 0x7f);.
c300: 0a 09 09 69 66 20 28 69 64 78 20 3e 20 62 75 66  ...if (idx > buf
c310: 66 65 72 5f 6c 65 6e 29 20 7b 0a 09 09 09 43 41  fer_len) {....CA
c320: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
c330: 46 28 22 4d 61 6c 66 6f 72 6d 65 64 20 42 45 52  F("Malformed BER
c340: 20 76 61 6c 75 65 20 2d 2d 20 6e 6f 74 20 65 6e   value -- not en
c350: 6f 75 67 68 20 62 79 74 65 73 20 61 76 61 69 6c  ough bytes avail
c360: 61 62 6c 65 20 74 6f 20 72 65 61 64 20 6c 65 6e  able to read len
c370: 67 74 68 20 28 69 64 78 20 3d 20 25 69 2c 20 62  gth (idx = %i, b
c380: 75 66 66 65 72 5f 6c 65 6e 20 3d 20 25 6c 75 29  uffer_len = %lu)
c390: 22 2c 20 69 64 78 2c 20 28 75 6e 73 69 67 6e 65  ", idx, (unsigne
c3a0: 64 20 6c 6f 6e 67 29 20 62 75 66 66 65 72 5f 6c  d long) buffer_l
c3b0: 65 6e 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28  en);.....return(
c3c0: 4e 55 4c 4c 29 3b 0a 09 09 7d 0a 0a 09 09 66 6f  NULL);...}....fo
c3d0: 72 20 28 3b 20 69 64 78 20 3e 20 30 3b 20 69 64  r (; idx > 0; id
c3e0: 78 2d 2d 29 20 7b 0a 09 09 09 62 75 66 66 65 72  x--) {....buffer
c3f0: 5f 70 2b 2b 3b 0a 09 09 09 62 75 66 66 65 72 5f  _p++;....buffer_
c400: 6c 65 6e 2d 2d 3b 0a 0a 09 09 09 73 69 7a 65 20  len--;.....size 
c410: 3c 3c 3d 20 38 3b 0a 09 09 09 73 69 7a 65 20 7c  <<= 8;....size |
c420: 3d 20 62 75 66 66 65 72 5f 70 5b 30 5d 3b 0a 09  = buffer_p[0];..
c430: 09 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 73  .}..} else {...s
c440: 69 7a 65 20 3d 20 62 75 66 66 65 72 5f 70 5b 30  ize = buffer_p[0
c450: 5d 3b 0a 09 7d 0a 0a 09 62 75 66 66 65 72 5f 70  ];..}...buffer_p
c460: 2b 2b 3b 0a 09 62 75 66 66 65 72 5f 6c 65 6e 2d  ++;..buffer_len-
c470: 2d 3b 0a 0a 09 69 66 20 28 73 69 7a 65 20 3e 20  -;...if (size > 
c480: 6f 75 74 62 75 66 66 65 72 5f 6c 65 6e 29 20 7b  outbuffer_len) {
c490: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
c4a0: 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74  PRINTF("Unable t
c4b0: 6f 20 63 6f 70 79 20 76 61 6c 75 65 20 62 75 66  o copy value buf
c4c0: 66 65 72 20 74 6f 20 6f 75 74 62 75 66 66 65 72  fer to outbuffer
c4d0: 2c 20 6e 6f 74 20 65 6e 6f 75 67 68 20 72 6f 6f  , not enough roo
c4e0: 6d 2e 20 20 56 61 6c 75 65 20 62 75 66 66 65 72  m.  Value buffer
c4f0: 20 6c 65 6e 67 74 68 20 3d 20 25 6c 75 2c 20 6f   length = %lu, o
c500: 75 74 20 62 75 66 66 65 72 20 6c 65 6e 67 74 68  ut buffer length
c510: 20 3d 20 25 6c 75 22 2c 20 28 75 6e 73 69 67 6e   = %lu", (unsign
c520: 65 64 20 6c 6f 6e 67 29 20 73 69 7a 65 2c 20 28  ed long) size, (
c530: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 6f  unsigned long) o
c540: 75 74 62 75 66 66 65 72 5f 6c 65 6e 29 3b 0a 0a  utbuffer_len);..
c550: 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a  ..return(NULL);.
c560: 09 7d 0a 0a 09 2a 6f 75 74 62 75 66 66 65 72 5f  .}...*outbuffer_
c570: 6c 65 6e 5f 70 20 3d 20 73 69 7a 65 3b 0a 09 69  len_p = size;..i
c580: 66 20 28 6f 75 74 62 75 66 66 65 72 29 20 7b 0a  f (outbuffer) {.
c590: 09 09 6d 65 6d 63 70 79 28 6f 75 74 62 75 66 66  ..memcpy(outbuff
c5a0: 65 72 2c 20 62 75 66 66 65 72 5f 70 2c 20 73 69  er, buffer_p, si
c5b0: 7a 65 29 3b 0a 09 09 62 75 66 66 65 72 5f 70 20  ze);...buffer_p 
c5c0: 2b 3d 20 73 69 7a 65 3b 0a 09 09 62 75 66 66 65  += size;...buffe
c5d0: 72 5f 6c 65 6e 20 2d 3d 20 73 69 7a 65 3b 0a 0a  r_len -= size;..
c5e0: 09 09 2a 62 75 66 66 65 72 5f 6c 65 6e 5f 70 20  ..*buffer_len_p 
c5f0: 3d 20 62 75 66 66 65 72 5f 6c 65 6e 3b 0a 0a 09  = buffer_len;...
c600: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
c610: 49 4e 54 42 55 46 28 22 42 45 52 2d 54 4c 56 20  INTBUF("BER-TLV 
c620: 72 65 73 75 6c 74 73 3a 22 2c 20 6f 75 74 62 75  results:", outbu
c630: 66 66 65 72 2c 20 73 69 7a 65 29 3b 0a 09 7d 20  ffer, size);..} 
c640: 65 6c 73 65 20 7b 0a 09 09 6d 65 6d 6d 6f 76 65  else {...memmove
c650: 28 62 75 66 66 65 72 2c 20 62 75 66 66 65 72 5f  (buffer, buffer_
c660: 70 2c 20 73 69 7a 65 29 3b 0a 09 09 62 75 66 66  p, size);...buff
c670: 65 72 5f 70 20 3d 20 62 75 66 66 65 72 3b 0a 0a  er_p = buffer;..
c680: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
c690: 52 49 4e 54 42 55 46 28 22 42 45 52 2d 54 4c 56  RINTBUF("BER-TLV
c6a0: 20 72 65 73 75 6c 74 73 3a 22 2c 20 62 75 66 66   results:", buff
c6b0: 65 72 2c 20 73 69 7a 65 29 3b 0a 09 7d 0a 0a 09  er, size);..}...
c6c0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
c6d0: 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 69  NTF("Returning i
c6e0: 6e 20 73 75 63 63 65 73 73 2e 20 20 53 69 7a 65  n success.  Size
c6f0: 20 6f 66 20 63 6f 6e 74 65 6e 74 73 20 66 6f 72   of contents for
c700: 20 74 61 67 20 25 30 32 78 20 69 73 20 25 6c 75   tag %02x is %lu
c710: 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74  ", (unsigned int
c720: 29 20 74 61 67 2c 20 28 75 6e 73 69 67 6e 65 64  ) tag, (unsigned
c730: 20 6c 6f 6e 67 29 20 73 69 7a 65 29 3b 0a 0a 09   long) size);...
c740: 72 65 74 75 72 6e 28 62 75 66 66 65 72 5f 70 29  return(buffer_p)
c750: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f  ;.}../*. * SYNPO
c760: 53 49 53 0a 20 2a 20 20 20 20 20 73 73 69 7a 65  SIS. *     ssize
c770: 5f 74 20 63 61 63 6b 65 79 5f 67 65 74 5f 64 61  _t cackey_get_da
c780: 74 61 28 73 74 72 75 63 74 20 63 61 63 6b 65 79  ta(struct cackey
c790: 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73  _slot *slot, uns
c7a0: 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 66  igned char *buff
c7b0: 65 72 2c 20 73 69 7a 65 5f 74 20 62 75 66 66 65  er, size_t buffe
c7c0: 72 5f 6c 65 6e 2c 20 75 6e 73 69 67 6e 65 64 20  r_len, unsigned 
c7d0: 63 68 61 72 20 6f 69 64 5b 33 5d 29 3b 0a 20 2a  char oid[3]);. *
c7e0: 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a  . * ARGUMENTS. *
c7f0: 20 20 20 20 20 73 74 72 75 63 74 20 63 61 63 6b       struct cack
c800: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a  ey_slot *slot. *
c810: 20 20 20 20 20 20 20 20 20 53 6c 6f 74 20 74 6f           Slot to
c820: 20 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74   send commands t
c830: 6f 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69  o. *. *     unsi
c840: 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 66 65  gned char *buffe
c850: 72 0a 20 2a 20 20 20 20 20 20 20 20 20 5b 4f 55  r. *         [OU
c860: 54 5d 20 42 75 66 66 65 72 0a 20 2a 0a 20 2a 20  T] Buffer. *. * 
c870: 20 20 20 20 73 69 7a 65 5f 74 20 62 75 66 66 65      size_t buffe
c880: 72 5f 6c 65 6e 0a 20 2a 20 20 20 20 20 20 20 20  r_len. *        
c890: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
c8a0: 20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 72   to attempt to r
c8b0: 65 61 64 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e  ead. *. *     un
c8c0: 73 69 67 6e 65 64 20 63 68 61 72 20 6f 69 64 5b  signed char oid[
c8d0: 33 5d 0a 20 2a 20 20 20 20 20 20 20 20 20 33 2d  3]. *         3-
c8e0: 62 79 74 65 20 4f 49 44 20 74 6f 20 72 65 61 64  byte OID to read
c8f0: 0a 20 2a 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e  . *. *. * RETURN
c900: 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 54 68   VALUE. *     Th
c910: 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
c920: 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  rns the number o
c930: 66 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79  f bytes actually
c940: 20 72 65 61 64 2c 20 6f 72 20 2d 31 20 6f 6e 20   read, or -1 on 
c950: 65 72 72 6f 72 2e 0a 20 2a 0a 20 2a 20 4e 4f 54  error.. *. * NOT
c960: 45 53 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20  ES. *     None. 
c970: 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 73 73 69  *. */.static ssi
c980: 7a 65 5f 74 20 63 61 63 6b 65 79 5f 67 65 74 5f  ze_t cackey_get_
c990: 64 61 74 61 28 73 74 72 75 63 74 20 63 61 63 6b  data(struct cack
c9a0: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75  ey_slot *slot, u
c9b0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75  nsigned char *bu
c9c0: 66 66 65 72 2c 20 73 69 7a 65 5f 74 20 62 75 66  ffer, size_t buf
c9d0: 66 65 72 5f 6c 65 6e 2c 20 75 6e 73 69 67 6e 65  fer_len, unsigne
c9e0: 64 20 63 68 61 72 20 6f 69 64 5b 33 5d 29 20 7b  d char oid[3]) {
c9f0: 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  ..unsigned char 
ca00: 63 6d 64 5b 5d 20 3d 20 7b 30 78 35 43 2c 20 30  cmd[] = {0x5C, 0
ca10: 78 30 33 2c 20 30 78 30 30 2c 20 30 78 30 30 2c  x03, 0x00, 0x00,
ca20: 20 30 78 30 30 7d 3b 0a 09 75 6e 73 69 67 6e 65   0x00};..unsigne
ca30: 64 20 63 68 61 72 20 2a 62 75 66 66 65 72 5f 70  d char *buffer_p
ca40: 3b 0a 09 73 69 7a 65 5f 74 20 69 6e 69 74 5f 62  ;..size_t init_b
ca50: 75 66 66 65 72 5f 6c 65 6e 2c 20 73 69 7a 65 3b  uffer_len, size;
ca60: 0a 09 75 69 6e 74 31 36 5f 74 20 72 65 73 70 63  ..uint16_t respc
ca70: 6f 64 65 3b 0a 09 69 6e 74 20 73 65 6e 64 5f 72  ode;..int send_r
ca80: 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  et;...CACKEY_DEB
ca90: 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
caa0: 64 2e 22 29 3b 0a 0a 09 69 6e 69 74 5f 62 75 66  d.");...init_buf
cab0: 66 65 72 5f 6c 65 6e 20 3d 20 62 75 66 66 65 72  fer_len = buffer
cac0: 5f 6c 65 6e 3b 0a 0a 09 63 6d 64 5b 32 5d 20 3d  _len;...cmd[2] =
cad0: 20 6f 69 64 5b 30 5d 3b 0a 09 63 6d 64 5b 33 5d   oid[0];..cmd[3]
cae0: 20 3d 20 6f 69 64 5b 31 5d 3b 0a 09 63 6d 64 5b   = oid[1];..cmd[
caf0: 34 5d 20 3d 20 6f 69 64 5b 32 5d 3b 0a 0a 09 2f  4] = oid[2];.../
cb00: 2a 20 32 35 36 20 74 6f 20 69 6e 64 69 63 61 74  * 256 to indicat
cb10: 65 20 74 68 65 20 6c 61 72 67 65 73 74 20 6d 65  e the largest me
cb20: 73 73 61 67 65 20 73 69 7a 65 20 2d 2d 20 6e 6f  ssage size -- no
cb30: 74 20 63 6c 65 61 72 20 69 66 20 74 68 69 73 20  t clear if this 
cb40: 77 69 6c 6c 20 77 6f 72 6b 20 77 69 74 68 20 61  will work with a
cb50: 6c 6c 20 6d 65 73 73 61 67 65 73 20 2a 2f 0a 09  ll messages */..
cb60: 73 65 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b 65  send_ret = cacke
cb70: 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f 74  y_send_apdu(slot
cb80: 2c 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 49 53  , GSCIS_CLASS_IS
cb90: 4f 37 38 31 36 2c 20 4e 49 53 54 53 50 38 30 30  O7816, NISTSP800
cba0: 5f 37 33 5f 33 5f 49 4e 53 54 52 5f 47 45 54 5f  _73_3_INSTR_GET_
cbb0: 44 41 54 41 2c 20 30 78 33 46 2c 20 30 78 46 46  DATA, 0x3F, 0xFF
cbc0: 2c 20 73 69 7a 65 6f 66 28 63 6d 64 29 2c 20 63  , sizeof(cmd), c
cbd0: 6d 64 2c 20 32 35 36 2c 20 26 72 65 73 70 63 6f  md, 256, &respco
cbe0: 64 65 2c 20 62 75 66 66 65 72 2c 20 26 62 75 66  de, buffer, &buf
cbf0: 66 65 72 5f 6c 65 6e 29 3b 0a 0a 09 69 66 20 28  fer_len);...if (
cc00: 73 65 6e 64 5f 72 65 74 20 3d 3d 20 43 41 43 4b  send_ret == CACK
cc10: 45 59 5f 50 43 53 43 5f 45 5f 52 45 54 52 59 29  EY_PCSC_E_RETRY)
cc20: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
cc30: 47 5f 50 52 49 4e 54 46 28 22 41 44 50 55 20 53  G_PRINTF("ADPU S
cc40: 65 6e 64 69 6e 67 20 66 61 69 6c 65 64 2c 20 72  ending failed, r
cc50: 65 74 72 79 69 6e 67 20 72 65 61 64 20 62 75 66  etrying read buf
cc60: 66 65 72 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  fer");....return
cc70: 28 63 61 63 6b 65 79 5f 67 65 74 5f 64 61 74 61  (cackey_get_data
cc80: 28 73 6c 6f 74 2c 20 62 75 66 66 65 72 2c 20 69  (slot, buffer, i
cc90: 6e 69 74 5f 62 75 66 66 65 72 5f 6c 65 6e 2c 20  nit_buffer_len, 
cca0: 6f 69 64 29 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  oid));..}...if (
ccb0: 73 65 6e 64 5f 72 65 74 20 21 3d 20 43 41 43 4b  send_ret != CACK
ccc0: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a  EY_PCSC_S_OK) {.
ccd0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
cce0: 52 49 4e 54 46 28 22 63 61 63 6b 65 79 5f 73 65  RINTF("cackey_se
ccf0: 6e 64 5f 61 70 64 75 28 29 20 66 61 69 6c 65 64  nd_apdu() failed
cd00: 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66  , returning in f
cd10: 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74  ailure");....ret
cd20: 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 23 69 66  urn(-1);..}..#if
cd30: 64 65 66 20 43 41 43 4b 45 59 5f 50 41 52 41 4e  def CACKEY_PARAN
cd40: 4f 49 44 0a 23 20 20 69 66 64 65 66 20 5f 50 4f  OID.#  ifdef _PO
cd50: 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58 0a 09 69  SIX_SSIZE_MAX..i
cd60: 66 20 28 62 75 66 66 65 72 5f 6c 65 6e 20 3e 20  f (buffer_len > 
cd70: 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58  _POSIX_SSIZE_MAX
cd80: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
cd90: 55 47 5f 50 52 49 4e 54 46 28 22 52 65 61 64 20  UG_PRINTF("Read 
cda0: 62 79 74 65 73 20 28 62 75 66 66 65 72 5f 6c 65  bytes (buffer_le
cdb0: 6e 29 20 65 78 63 65 65 64 73 20 6d 61 78 69 6d  n) exceeds maxim
cdc0: 75 6d 20 76 61 6c 75 65 2c 20 72 65 74 75 72 6e  um value, return
cdd0: 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 2e 20  ing in failure. 
cde0: 28 6d 61 78 20 3d 20 25 6c 69 2c 20 62 75 66 66  (max = %li, buff
cdf0: 65 72 5f 6c 65 6e 20 3d 20 25 6c 75 29 22 2c 20  er_len = %lu)", 
ce00: 28 6c 6f 6e 67 29 20 5f 50 4f 53 49 58 5f 53 53  (long) _POSIX_SS
ce10: 49 5a 45 5f 4d 41 58 2c 20 28 75 6e 73 69 67 6e  IZE_MAX, (unsign
ce20: 65 64 20 6c 6f 6e 67 29 20 62 75 66 66 65 72 5f  ed long) buffer_
ce30: 6c 65 6e 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  len);....return(
ce40: 2d 31 29 3b 0a 09 7d 0a 23 20 20 65 6e 64 69 66  -1);..}.#  endif
ce50: 0a 23 65 6e 64 69 66 0a 0a 09 69 66 20 28 62 75  .#endif...if (bu
ce60: 66 66 65 72 5f 6c 65 6e 20 3c 20 32 29 20 7b 0a  ffer_len < 2) {.
ce70: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
ce80: 52 49 4e 54 46 28 22 41 50 44 55 20 47 45 54 20  RINTF("APDU GET 
ce90: 44 41 54 41 20 72 65 74 75 72 6e 65 64 20 25 6c  DATA returned %l
cea0: 75 20 62 79 74 65 73 2c 20 77 68 69 63 68 20 69  u bytes, which i
ceb0: 73 20 74 6f 6f 20 73 68 6f 72 74 20 66 6f 72 20  s too short for 
cec0: 61 20 42 45 52 2d 54 4c 56 20 72 65 73 70 6f 6e  a BER-TLV respon
ced0: 73 65 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  se", (unsigned l
cee0: 6f 6e 67 29 20 62 75 66 66 65 72 5f 6c 65 6e 29  ong) buffer_len)
cef0: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b  ;....return(-1);
cf00: 0a 09 7d 0a 0a 09 73 69 7a 65 20 3d 20 62 75 66  ..}...size = buf
cf10: 66 65 72 5f 6c 65 6e 3b 0a 09 62 75 66 66 65 72  fer_len;..buffer
cf20: 5f 70 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64  _p = cackey_read
cf30: 5f 62 65 72 74 6c 76 5f 74 61 67 28 62 75 66 66  _bertlv_tag(buff
cf40: 65 72 2c 20 26 62 75 66 66 65 72 5f 6c 65 6e 2c  er, &buffer_len,
cf50: 20 30 78 35 33 2c 20 4e 55 4c 4c 2c 20 26 73 69   0x53, NULL, &si
cf60: 7a 65 29 3b 0a 0a 09 69 66 20 28 62 75 66 66 65  ze);...if (buffe
cf70: 72 5f 70 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  r_p == NULL) {..
cf80: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
cf90: 49 4e 54 46 28 22 54 61 67 20 64 65 63 6f 64 69  INTF("Tag decodi
cfa0: 6e 67 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72  ng failed, retur
cfb0: 6e 69 6e 67 20 69 6e 20 65 72 72 6f 72 2e 22 29  ning in error.")
cfc0: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b  ;....return(-1);
cfd0: 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
cfe0: 55 47 5f 50 52 49 4e 54 42 55 46 28 22 47 45 54  UG_PRINTBUF("GET
cff0: 20 44 41 54 41 20 72 65 73 75 6c 74 22 2c 20 62   DATA result", b
d000: 75 66 66 65 72 2c 20 73 69 7a 65 29 3b 0a 0a 09  uffer, size);...
d010: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
d020: 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 69  NTF("Returning i
d030: 6e 20 73 75 63 63 65 73 73 2c 20 72 65 61 64 20  n success, read 
d040: 25 6c 75 20 62 79 74 65 73 22 2c 20 28 75 6e 73  %lu bytes", (uns
d050: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69 7a 65  igned long) size
d060: 29 3b 0a 0a 09 72 65 74 75 72 6e 28 73 69 7a 65  );...return(size
d070: 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50  );.}../*. * SYNP
d080: 4f 53 49 53 0a 20 2a 20 20 20 20 20 73 73 69 7a  OSIS. *     ssiz
d090: 65 5f 74 20 63 61 63 6b 65 79 5f 72 65 61 64 5f  e_t cackey_read_
d0a0: 62 75 66 66 65 72 28 73 74 72 75 63 74 20 63 61  buffer(struct ca
d0b0: 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c  ckey_slot *slot,
d0c0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
d0d0: 62 75 66 66 65 72 2c 20 73 69 7a 65 5f 74 20 63  buffer, size_t c
d0e0: 6f 75 6e 74 2c 20 75 6e 73 69 67 6e 65 64 20 63  ount, unsigned c
d0f0: 68 61 72 20 74 5f 6f 72 5f 76 2c 20 73 69 7a 65  har t_or_v, size
d100: 5f 74 20 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65  _t initial_offse
d110: 74 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45  t);. *. * ARGUME
d120: 4e 54 53 0a 20 2a 20 20 20 20 20 73 74 72 75 63  NTS. *     struc
d130: 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73  t cackey_slot *s
d140: 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20 53  lot. *         S
d150: 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d 6d  lot to send comm
d160: 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 20 20  ands to. *. *   
d170: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
d180: 2a 62 75 66 66 65 72 0a 20 2a 20 20 20 20 20 20  *buffer. *      
d190: 20 20 20 5b 4f 55 54 5d 20 42 75 66 66 65 72 0a     [OUT] Buffer.
d1a0: 20 2a 0a 20 2a 20 20 20 20 20 73 69 7a 65 5f 74   *. *     size_t
d1b0: 20 63 6f 75 6e 74 0a 20 2a 20 20 20 20 20 20 20   count. *       
d1c0: 20 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65    Number of byte
d1d0: 73 20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f 20  s to attempt to 
d1e0: 72 65 61 64 0a 20 2a 0a 20 2a 20 20 20 20 20 75  read. *. *     u
d1f0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 74 5f 6f  nsigned char t_o
d200: 72 5f 76 0a 20 2a 20 20 20 20 20 20 20 20 20 53  r_v. *         S
d210: 65 6c 65 63 74 20 74 68 65 20 54 2d 62 75 66 66  elect the T-buff
d220: 65 72 20 28 30 31 29 20 6f 72 20 56 2d 62 75 66  er (01) or V-buf
d230: 66 65 72 20 28 30 32 29 20 74 6f 20 72 65 61 64  fer (02) to read
d240: 20 66 72 6f 6d 2e 20 20 0a 20 2a 0a 20 2a 20 20   from.  . *. *  
d250: 20 20 20 73 69 7a 65 5f 74 20 69 6e 69 74 69 61     size_t initia
d260: 6c 5f 6f 66 66 73 65 74 0a 20 2a 20 20 20 20 20  l_offset. *     
d270: 20 20 20 20 53 70 65 63 69 66 79 20 74 68 65 20      Specify the 
d280: 6f 66 66 73 65 74 20 74 6f 20 62 65 67 69 6e 20  offset to begin 
d290: 74 68 65 20 72 65 61 64 20 66 72 6f 6d 0a 20 2a  the read from. *
d2a0: 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41  . *. * RETURN VA
d2b0: 4c 55 45 0a 20 2a 20 20 20 20 20 54 68 69 73 20  LUE. *     This 
d2c0: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
d2d0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
d2e0: 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20 72 65  ytes actually re
d2f0: 61 64 2c 20 6f 72 20 2d 31 20 6f 6e 20 65 72 72  ad, or -1 on err
d300: 6f 72 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a  or.. *. * NOTES.
d310: 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20   *     None. *. 
d320: 2a 2f 0a 73 74 61 74 69 63 20 73 73 69 7a 65 5f  */.static ssize_
d330: 74 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 62 75  t cackey_read_bu
d340: 66 66 65 72 28 73 74 72 75 63 74 20 63 61 63 6b  ffer(struct cack
d350: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75  ey_slot *slot, u
d360: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75  nsigned char *bu
d370: 66 66 65 72 2c 20 73 69 7a 65 5f 74 20 63 6f 75  ffer, size_t cou
d380: 6e 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nt, unsigned cha
d390: 72 20 74 5f 6f 72 5f 76 2c 20 73 69 7a 65 5f 74  r t_or_v, size_t
d3a0: 20 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65 74 29   initial_offset)
d3b0: 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61   {..unsigned cha
d3c0: 72 20 2a 69 6e 69 74 5f 62 75 66 66 65 72 3b 0a  r *init_buffer;.
d3d0: 09 73 69 7a 65 5f 74 20 69 6e 69 74 5f 63 6f 75  .size_t init_cou
d3e0: 6e 74 3b 0a 09 73 69 7a 65 5f 74 20 69 6e 69 74  nt;..size_t init
d3f0: 5f 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65 74 3b  _initial_offset;
d400: 0a 0a 09 73 69 7a 65 5f 74 20 6f 66 66 73 65 74  ...size_t offset
d410: 20 3d 20 30 2c 20 6d 61 78 5f 6f 66 66 73 65 74   = 0, max_offset
d420: 2c 20 6d 61 78 5f 63 6f 75 6e 74 3b 0a 09 75 6e  , max_count;..un
d430: 73 69 67 6e 65 64 20 63 68 61 72 20 63 6d 64 5b  signed char cmd[
d440: 32 5d 3b 0a 09 75 69 6e 74 31 36 5f 74 20 72 65  2];..uint16_t re
d450: 73 70 63 6f 64 65 3b 0a 09 69 6e 74 20 73 65 6e  spcode;..int sen
d460: 64 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f  d_ret;...CACKEY_
d470: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
d480: 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 6e 69 74 5f  lled.");...init_
d490: 62 75 66 66 65 72 20 3d 20 62 75 66 66 65 72 3b  buffer = buffer;
d4a0: 0a 09 69 6e 69 74 5f 63 6f 75 6e 74 20 3d 20 63  ..init_count = c
d4b0: 6f 75 6e 74 3b 0a 09 69 6e 69 74 5f 69 6e 69 74  ount;..init_init
d4c0: 69 61 6c 5f 6f 66 66 73 65 74 20 3d 20 69 6e 69  ial_offset = ini
d4d0: 74 69 61 6c 5f 6f 66 66 73 65 74 3b 0a 0a 09 6d  tial_offset;...m
d4e0: 61 78 5f 6f 66 66 73 65 74 20 3d 20 63 6f 75 6e  ax_offset = coun
d4f0: 74 3b 0a 09 6d 61 78 5f 63 6f 75 6e 74 20 3d 20  t;..max_count = 
d500: 43 41 43 4b 45 59 5f 41 50 44 55 5f 4d 54 55 3b  CACKEY_APDU_MTU;
d510: 0a 0a 09 69 66 20 28 74 5f 6f 72 5f 76 20 21 3d  ...if (t_or_v !=
d520: 20 31 20 26 26 20 74 5f 6f 72 5f 76 20 21 3d 20   1 && t_or_v != 
d530: 32 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  2) {...CACKEY_DE
d540: 42 55 47 5f 50 52 49 4e 54 46 28 22 49 6e 76 61  BUG_PRINTF("Inva
d550: 6c 69 64 20 54 20 6f 72 20 56 20 70 61 72 61 6d  lid T or V param
d560: 65 74 65 72 20 73 70 65 63 69 66 69 65 64 2c 20  eter specified, 
d570: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  returning in fai
d580: 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72  lure");....retur
d590: 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 63 6d 64 5b  n(-1);..}...cmd[
d5a0: 30 5d 20 3d 20 74 5f 6f 72 5f 76 3b 0a 0a 09 77  0] = t_or_v;...w
d5b0: 68 69 6c 65 20 28 31 29 20 7b 0a 09 09 69 66 20  hile (1) {...if 
d5c0: 28 6f 66 66 73 65 74 20 3e 3d 20 6d 61 78 5f 6f  (offset >= max_o
d5d0: 66 66 73 65 74 29 20 7b 0a 09 09 09 43 41 43 4b  ffset) {....CACK
d5e0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
d5f0: 22 42 75 66 66 65 72 20 74 6f 6f 20 73 6d 61 6c  "Buffer too smal
d600: 6c 2c 20 72 65 74 75 72 6e 69 6e 67 20 77 68 61  l, returning wha
d610: 74 20 77 65 20 67 6f 74 2e 2e 2e 22 29 3b 0a 0a  t we got...");..
d620: 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09  ...break;...}...
d630: 09 63 6f 75 6e 74 20 3d 20 6d 61 78 5f 6f 66 66  .count = max_off
d640: 73 65 74 20 2d 20 6f 66 66 73 65 74 3b 0a 09 09  set - offset;...
d650: 69 66 20 28 63 6f 75 6e 74 20 3e 20 6d 61 78 5f  if (count > max_
d660: 63 6f 75 6e 74 29 20 7b 0a 09 09 09 63 6f 75 6e  count) {....coun
d670: 74 20 3d 20 6d 61 78 5f 63 6f 75 6e 74 3b 0a 09  t = max_count;..
d680: 09 7d 0a 0a 09 09 63 6d 64 5b 31 5d 20 3d 20 63  .}....cmd[1] = c
d690: 6f 75 6e 74 3b 0a 0a 09 09 73 65 6e 64 5f 72 65  ount;....send_re
d6a0: 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f  t = cackey_send_
d6b0: 61 70 64 75 28 73 6c 6f 74 2c 20 47 53 43 49 53  apdu(slot, GSCIS
d6c0: 5f 43 4c 41 53 53 5f 47 4c 4f 42 41 4c 5f 50 4c  _CLASS_GLOBAL_PL
d6d0: 41 54 46 4f 52 4d 2c 20 47 53 43 49 53 5f 49 4e  ATFORM, GSCIS_IN
d6e0: 53 54 52 5f 52 45 41 44 5f 42 55 46 46 45 52 2c  STR_READ_BUFFER,
d6f0: 20 28 28 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65   ((initial_offse
d700: 74 20 2b 20 6f 66 66 73 65 74 29 20 3e 3e 20 38  t + offset) >> 8
d710: 29 20 26 20 30 78 66 66 2c 20 28 69 6e 69 74 69  ) & 0xff, (initi
d720: 61 6c 5f 6f 66 66 73 65 74 20 2b 20 6f 66 66 73  al_offset + offs
d730: 65 74 29 20 26 20 30 78 66 66 2c 20 73 69 7a 65  et) & 0xff, size
d740: 6f 66 28 63 6d 64 29 2c 20 63 6d 64 2c 20 30 78  of(cmd), cmd, 0x
d750: 30 30 2c 20 26 72 65 73 70 63 6f 64 65 2c 20 62  00, &respcode, b
d760: 75 66 66 65 72 20 2b 20 6f 66 66 73 65 74 2c 20  uffer + offset, 
d770: 26 63 6f 75 6e 74 29 3b 0a 0a 09 09 69 66 20 28  &count);....if (
d780: 73 65 6e 64 5f 72 65 74 20 3d 3d 20 43 41 43 4b  send_ret == CACK
d790: 45 59 5f 50 43 53 43 5f 45 5f 52 45 54 52 59 29  EY_PCSC_E_RETRY)
d7a0: 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
d7b0: 55 47 5f 50 52 49 4e 54 46 28 22 41 44 50 55 20  UG_PRINTF("ADPU 
d7c0: 53 65 6e 64 69 6e 67 20 66 61 69 6c 65 64 2c 20  Sending failed, 
d7d0: 72 65 74 72 79 69 6e 67 20 72 65 61 64 20 62 75  retrying read bu
d7e0: 66 66 65 72 22 29 3b 0a 0a 09 09 09 72 65 74 75  ffer");.....retu
d7f0: 72 6e 28 63 61 63 6b 65 79 5f 72 65 61 64 5f 62  rn(cackey_read_b
d800: 75 66 66 65 72 28 73 6c 6f 74 2c 20 69 6e 69 74  uffer(slot, init
d810: 5f 62 75 66 66 65 72 2c 20 69 6e 69 74 5f 63 6f  _buffer, init_co
d820: 75 6e 74 2c 20 74 5f 6f 72 5f 76 2c 20 69 6e 69  unt, t_or_v, ini
d830: 74 5f 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65 74  t_initial_offset
d840: 29 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 73  ));...}....if (s
d850: 65 6e 64 5f 72 65 74 20 21 3d 20 43 41 43 4b 45  end_ret != CACKE
d860: 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09  Y_PCSC_S_OK) {..
d870: 09 09 69 66 20 28 72 65 73 70 63 6f 64 65 20 3d  ..if (respcode =
d880: 3d 20 30 78 36 41 38 36 29 20 7b 0a 09 09 09 09  = 0x6A86) {.....
d890: 69 66 20 28 6d 61 78 5f 63 6f 75 6e 74 20 3d 3d  if (max_count ==
d8a0: 20 31 29 20 7b 0a 09 09 09 09 09 62 72 65 61 6b   1) {......break
d8b0: 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 6d 61 78  ;.....}......max
d8c0: 5f 63 6f 75 6e 74 20 3d 20 6d 61 78 5f 63 6f 75  _count = max_cou
d8d0: 6e 74 20 2f 20 32 3b 0a 0a 09 09 09 09 63 6f 6e  nt / 2;......con
d8e0: 74 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a 09 09 09  tinue;....}.....
d8f0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
d900: 4e 54 46 28 22 63 61 63 6b 65 79 5f 73 65 6e 64  NTF("cackey_send
d910: 5f 61 70 64 75 28 29 20 66 61 69 6c 65 64 2c 20  _apdu() failed, 
d920: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  returning in fai
d930: 6c 75 72 65 22 29 3b 0a 0a 09 09 09 72 65 74 75  lure");.....retu
d940: 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09 09 6f  rn(-1);...}....o
d950: 66 66 73 65 74 20 2b 3d 20 63 6f 75 6e 74 3b 0a  ffset += count;.
d960: 0a 09 09 69 66 20 28 63 6f 75 6e 74 20 3c 20 6d  ...if (count < m
d970: 61 78 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 09 43  ax_count) {....C
d980: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
d990: 54 46 28 22 53 68 6f 72 74 20 72 65 61 64 20 2d  TF("Short read -
d9a0: 2d 20 63 6f 75 6e 74 20 3d 20 25 69 2c 20 63 6d  - count = %i, cm
d9b0: 64 5b 31 5d 20 3d 20 25 69 22 2c 20 28 69 6e 74  d[1] = %i", (int
d9c0: 29 20 63 6f 75 6e 74 2c 20 28 69 6e 74 29 20 63  ) count, (int) c
d9d0: 6d 64 5b 31 5d 29 3b 0a 0a 09 09 09 62 72 65 61  md[1]);.....brea
d9e0: 6b 3b 0a 09 09 7d 0a 09 7d 0a 0a 23 69 66 64 65  k;...}..}..#ifde
d9f0: 66 20 43 41 43 4b 45 59 5f 50 41 52 41 4e 4f 49  f CACKEY_PARANOI
da00: 44 0a 23 20 20 69 66 64 65 66 20 5f 50 4f 53 49  D.#  ifdef _POSI
da10: 58 5f 53 53 49 5a 45 5f 4d 41 58 0a 09 69 66 20  X_SSIZE_MAX..if 
da20: 28 6f 66 66 73 65 74 20 3e 20 5f 50 4f 53 49 58  (offset > _POSIX
da30: 5f 53 53 49 5a 45 5f 4d 41 58 29 20 7b 0a 09 09  _SSIZE_MAX) {...
da40: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
da50: 4e 54 46 28 22 4f 66 66 73 65 74 20 65 78 63 65  NTF("Offset exce
da60: 65 64 73 20 6d 61 78 69 6d 75 6d 20 76 61 6c 75  eds maximum valu
da70: 65 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20  e, returning in 
da80: 66 61 69 6c 75 72 65 2e 20 28 6d 61 78 20 3d 20  failure. (max = 
da90: 25 6c 69 2c 20 6f 66 66 73 65 74 20 3d 20 25 6c  %li, offset = %l
daa0: 75 29 22 2c 20 28 6c 6f 6e 67 29 20 5f 50 4f 53  u)", (long) _POS
dab0: 49 58 5f 53 53 49 5a 45 5f 4d 41 58 2c 20 28 75  IX_SSIZE_MAX, (u
dac0: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 6f 66  nsigned long) of
dad0: 66 73 65 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e  fset);....return
dae0: 28 2d 31 29 3b 0a 09 7d 0a 23 20 20 65 6e 64 69  (-1);..}.#  endi
daf0: 66 0a 23 65 6e 64 69 66 0a 0a 09 43 41 43 4b 45  f.#endif...CACKE
db00: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
db10: 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 73 75 63  Returning in suc
db20: 63 65 73 73 2c 20 72 65 61 64 20 25 6c 75 20 62  cess, read %lu b
db30: 79 74 65 73 22 2c 20 28 75 6e 73 69 67 6e 65 64  ytes", (unsigned
db40: 20 6c 6f 6e 67 29 20 6f 66 66 73 65 74 29 3b 0a   long) offset);.
db50: 0a 09 72 65 74 75 72 6e 28 6f 66 66 73 65 74 29  ..return(offset)
db60: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f  ;.}../*. * SYNPO
db70: 53 49 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65  SIS. *     cacke
db80: 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 73 65 6c  y_ret cackey_sel
db90: 65 63 74 5f 61 70 70 6c 65 74 28 73 74 72 75 63  ect_applet(struc
dba0: 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73  t cackey_slot *s
dbb0: 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  lot, unsigned ch
dbc0: 61 72 20 2a 61 69 64 2c 20 73 69 7a 65 5f 74 20  ar *aid, size_t 
dbd0: 61 69 64 5f 6c 65 6e 29 3b 0a 20 2a 0a 20 2a 20  aid_len);. *. * 
dbe0: 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20  ARGUMENTS. *    
dbf0: 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73   struct cackey_s
dc00: 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20  lot *slot. *    
dc10: 20 20 20 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e       Slot to sen
dc20: 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a  d commands to. *
dc30: 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64  . *     unsigned
dc40: 20 63 68 61 72 20 2a 61 69 64 0a 20 2a 20 20 20   char *aid. *   
dc50: 20 20 20 20 20 20 42 75 66 66 65 72 20 63 6f 6e        Buffer con
dc60: 74 61 69 6e 69 6e 67 20 41 70 70 6c 65 74 20 49  taining Applet I
dc70: 44 20 74 6f 20 73 65 6c 65 63 74 0a 20 2a 0a 20  D to select. *. 
dc80: 2a 20 20 20 20 20 73 69 7a 65 5f 74 20 61 69 64  *     size_t aid
dc90: 5f 6c 65 6e 0a 20 2a 20 20 20 20 20 20 20 20 20  _len. *         
dca0: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
dcb0: 69 6e 20 74 68 65 20 22 61 69 64 22 20 28 41 70  in the "aid" (Ap
dcc0: 70 6c 65 74 20 49 44 29 20 70 61 72 61 6d 65 74  plet ID) paramet
dcd0: 65 72 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20  er. *. * RETURN 
dce0: 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 43 41 43  VALUE. *     CAC
dcf0: 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20  KEY_PCSC_S_OK   
dd00: 20 20 20 20 20 20 4f 6e 20 73 75 63 63 65 73 73        On success
dd10: 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50  . *     CACKEY_P
dd20: 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 20 20 20  CSC_E_GENERIC   
dd30: 20 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a 20 2a 20   On error. *. * 
dd40: 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 4e 6f 6e  NOTES. *     Non
dd50: 65 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20  e. *. */.static 
dd60: 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65  cackey_ret cacke
dd70: 79 5f 73 65 6c 65 63 74 5f 61 70 70 6c 65 74 28  y_select_applet(
dd80: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c  struct cackey_sl
dd90: 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e  ot *slot, unsign
dda0: 65 64 20 63 68 61 72 20 2a 61 69 64 2c 20 73 69  ed char *aid, si
ddb0: 7a 65 5f 74 20 61 69 64 5f 6c 65 6e 29 20 7b 0a  ze_t aid_len) {.
ddc0: 09 69 6e 74 20 73 65 6e 64 5f 72 65 74 3b 0a 0a  .int send_ret;..
ddd0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
dde0: 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
ddf0: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
de00: 50 52 49 4e 54 42 55 46 28 22 53 65 6c 65 63 74  PRINTBUF("Select
de10: 69 6e 67 20 61 70 70 6c 65 74 3a 22 2c 20 61 69  ing applet:", ai
de20: 64 2c 20 61 69 64 5f 6c 65 6e 29 3b 0a 0a 09 73  d, aid_len);...s
de30: 65 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79  end_ret = cackey
de40: 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f 74 2c  _send_apdu(slot,
de50: 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 49 53 4f   GSCIS_CLASS_ISO
de60: 37 38 31 36 2c 20 47 53 43 49 53 5f 49 4e 53 54  7816, GSCIS_INST
de70: 52 5f 53 45 4c 45 43 54 2c 20 47 53 43 49 53 5f  R_SELECT, GSCIS_
de80: 50 41 52 41 4d 5f 53 45 4c 45 43 54 5f 41 50 50  PARAM_SELECT_APP
de90: 4c 45 54 2c 20 30 78 30 30 2c 20 61 69 64 5f 6c  LET, 0x00, aid_l
dea0: 65 6e 2c 20 61 69 64 2c 20 30 78 30 30 2c 20 4e  en, aid, 0x00, N
deb0: 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29  ULL, NULL, NULL)
dec0: 3b 0a 0a 09 69 66 20 28 73 65 6e 64 5f 72 65 74  ;...if (send_ret
ded0: 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f   == CACKEY_PCSC_
dee0: 45 5f 52 45 54 52 59 29 20 7b 0a 09 09 43 41 43  E_RETRY) {...CAC
def0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
df00: 28 22 41 44 50 55 20 53 65 6e 64 69 6e 67 20 66  ("ADPU Sending f
df10: 61 69 6c 65 64 2c 20 72 65 74 72 79 69 6e 67 20  ailed, retrying 
df20: 73 65 6c 65 63 74 20 61 70 70 6c 65 74 22 29 3b  select applet");
df30: 0a 0a 09 09 72 65 74 75 72 6e 28 63 61 63 6b 65  ....return(cacke
df40: 79 5f 73 65 6c 65 63 74 5f 61 70 70 6c 65 74 28  y_select_applet(
df50: 73 6c 6f 74 2c 20 61 69 64 2c 20 61 69 64 5f 6c  slot, aid, aid_l
df60: 65 6e 29 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73  en));..}...if (s
df70: 65 6e 64 5f 72 65 74 20 21 3d 20 43 41 43 4b 45  end_ret != CACKE
df80: 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09  Y_PCSC_S_OK) {..
df90: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
dfa0: 49 4e 54 46 28 22 46 61 69 6c 65 64 20 74 6f 20  INTF("Failed to 
dfb0: 6f 70 65 6e 20 61 70 70 6c 65 74 2c 20 72 65 74  open applet, ret
dfc0: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
dfd0: 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  e");....return(C
dfe0: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e  ACKEY_PCSC_E_GEN
dff0: 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  ERIC);..}...CACK
e000: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
e010: 22 53 75 63 63 65 73 73 66 75 6c 6c 79 20 73 65  "Successfully se
e020: 6c 65 63 74 65 64 20 66 69 6c 65 22 29 3b 0a 0a  lected file");..
e030: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
e040: 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a  CSC_S_OK);.}../*
e050: 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20  . * SYNPOSIS. * 
e060: 20 20 20 20 63 61 63 6b 65 79 5f 72 65 74 20 63      cackey_ret c
e070: 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 66 69 6c  ackey_select_fil
e080: 65 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  e(struct cackey_
e090: 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 69 6e 74  slot *slot, uint
e0a0: 31 36 5f 74 20 65 66 29 3b 0a 20 2a 0a 20 2a 20  16_t ef);. *. * 
e0b0: 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20  ARGUMENTS. *    
e0c0: 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73   struct cackey_s
e0d0: 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20  lot *slot. *    
e0e0: 20 20 20 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e       Slot to sen
e0f0: 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a  d commands to. *
e100: 0a 20 2a 20 20 20 20 20 75 69 6e 74 31 36 5f 74  . *     uint16_t
e110: 20 65 66 0a 20 2a 20 20 20 20 20 20 20 20 20 45   ef. *         E
e120: 6c 65 6d 65 6e 74 61 6c 20 46 69 6c 65 20 74 6f  lemental File to
e130: 20 73 65 6c 65 63 74 0a 20 2a 0a 20 2a 20 52 45   select. *. * RE
e140: 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20  TURN VALUE. *   
e150: 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f    CACKEY_PCSC_S_
e160: 4f 4b 20 20 20 20 20 20 20 20 20 4f 6e 20 73 75  OK         On su
e170: 63 63 65 73 73 0a 20 2a 20 20 20 20 20 43 41 43  ccess. *     CAC
e180: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52  KEY_PCSC_E_GENER
e190: 49 43 20 20 20 20 4f 6e 20 65 72 72 6f 72 0a 20  IC    On error. 
e1a0: 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20  *. * NOTES. *   
e1b0: 20 20 54 68 69 73 20 73 65 6c 65 63 74 73 20 61    This selects a
e1c0: 6e 20 45 6c 65 6d 65 6e 74 61 72 79 20 46 69 6c  n Elementary Fil
e1d0: 65 20 28 45 46 29 20 75 6e 64 65 72 20 74 68 65  e (EF) under the
e1e0: 20 63 75 72 72 65 6e 74 6c 79 20 73 65 6c 65 63   currently selec
e1f0: 74 65 64 0a 20 2a 20 20 20 20 20 44 65 64 69 63  ted. *     Dedic
e200: 61 74 65 64 20 46 69 6c 65 20 28 44 46 29 0a 20  ated File (DF). 
e210: 2a 0a 20 2a 20 20 20 20 20 54 79 70 69 63 61 6c  *. *     Typical
e220: 6c 79 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65  ly this is calle
e230: 64 20 61 66 74 65 72 20 73 65 6c 65 63 74 69 6e  d after selectin
e240: 67 20 74 68 65 20 63 6f 72 72 65 63 74 20 41 70  g the correct Ap
e250: 70 6c 65 74 20 28 75 73 69 6e 67 0a 20 2a 20 20  plet (using. *  
e260: 20 20 20 63 61 63 6b 65 79 5f 73 65 6c 65 63 74     cackey_select
e270: 5f 61 70 70 6c 65 74 29 20 66 6f 72 20 56 4d 20  _applet) for VM 
e280: 63 61 72 64 73 0a 20 2a 0a 20 2a 2f 0a 73 74 61  cards. *. */.sta
e290: 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74 20 63  tic cackey_ret c
e2a0: 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 66 69 6c  ackey_select_fil
e2b0: 65 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  e(struct cackey_
e2c0: 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 69 6e 74  slot *slot, uint
e2d0: 31 36 5f 74 20 65 66 29 20 7b 0a 09 75 6e 73 69  16_t ef) {..unsi
e2e0: 67 6e 65 64 20 63 68 61 72 20 66 69 64 5f 62 75  gned char fid_bu
e2f0: 66 5b 32 5d 3b 0a 09 69 6e 74 20 73 65 6e 64 5f  f[2];..int send_
e300: 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ret;...CACKEY_DE
e310: 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
e320: 65 64 2e 22 29 3b 0a 0a 09 2f 2a 20 4f 70 65 6e  ed.");.../* Open
e330: 20 74 68 65 20 65 6c 65 6d 65 6e 74 61 72 79 20   the elementary 
e340: 66 69 6c 65 20 2a 2f 0a 09 66 69 64 5f 62 75 66  file */..fid_buf
e350: 5b 30 5d 20 3d 20 28 65 66 20 3e 3e 20 38 29 20  [0] = (ef >> 8) 
e360: 26 20 30 78 66 66 3b 0a 09 66 69 64 5f 62 75 66  & 0xff;..fid_buf
e370: 5b 31 5d 20 3d 20 65 66 20 26 20 30 78 66 66 3b  [1] = ef & 0xff;
e380: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
e390: 50 52 49 4e 54 46 28 22 53 65 6c 65 63 74 69 6e  PRINTF("Selectin
e3a0: 67 20 66 69 6c 65 3a 20 25 30 34 6c 78 22 2c 20  g file: %04lx", 
e3b0: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
e3c0: 65 66 29 3b 0a 0a 09 73 65 6e 64 5f 72 65 74 20  ef);...send_ret 
e3d0: 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70  = cackey_send_ap
e3e0: 64 75 28 73 6c 6f 74 2c 20 47 53 43 49 53 5f 43  du(slot, GSCIS_C
e3f0: 4c 41 53 53 5f 49 53 4f 37 38 31 36 2c 20 47 53  LASS_ISO7816, GS
e400: 43 49 53 5f 49 4e 53 54 52 5f 53 45 4c 45 43 54  CIS_INSTR_SELECT
e410: 2c 20 30 78 30 32 2c 20 30 78 30 43 2c 20 73 69  , 0x02, 0x0C, si
e420: 7a 65 6f 66 28 66 69 64 5f 62 75 66 29 2c 20 66  zeof(fid_buf), f
e430: 69 64 5f 62 75 66 2c 20 30 78 30 30 2c 20 4e 55  id_buf, 0x00, NU
e440: 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b  LL, NULL, NULL);
e450: 0a 09 69 66 20 28 73 65 6e 64 5f 72 65 74 20 21  ..if (send_ret !
e460: 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  = CACKEY_PCSC_S_
e470: 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  OK) {...CACKEY_D
e480: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 61 69  EBUG_PRINTF("Fai
e490: 6c 65 64 20 74 6f 20 6f 70 65 6e 20 66 69 6c 65  led to open file
e4a0: 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66  , returning in f
e4b0: 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74  ailure");....ret
e4c0: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
e4d0: 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a  E_GENERIC);..}..
e4e0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
e4f0: 49 4e 54 46 28 22 53 75 63 63 65 73 73 66 75 6c  INTF("Successful
e500: 6c 79 20 73 65 6c 65 63 74 65 64 20 66 69 6c 65  ly selected file
e510: 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41 43  ");...return(CAC
e520: 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a  KEY_PCSC_S_OK);.
e530: 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49  }../*. * SYNPOSI
e540: 53 0a 20 2a 20 20 20 20 20 76 6f 69 64 20 63 61  S. *     void ca
e550: 63 6b 65 79 5f 66 72 65 65 5f 74 6c 76 28 73 74  ckey_free_tlv(st
e560: 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f  ruct cackey_tlv_
e570: 65 6e 74 69 74 79 20 2a 72 6f 6f 74 29 3b 0a 20  entity *root);. 
e580: 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20  *. * ARGUMENTS. 
e590: 2a 20 20 20 20 20 73 74 72 75 63 74 20 63 61 63  *     struct cac
e5a0: 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20 2a  key_tlv_entity *
e5b0: 72 6f 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20  root. *         
e5c0: 52 6f 6f 74 20 6f 66 20 74 68 65 20 54 4c 56 20  Root of the TLV 
e5d0: 6c 69 73 74 20 74 6f 20 73 74 61 72 74 20 66 72  list to start fr
e5e0: 65 65 69 6e 67 0a 20 2a 0a 20 2a 20 52 45 54 55  eeing. *. * RETU
e5f0: 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20  RN VALUE. *     
e600: 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53  None. *. * NOTES
e610: 0a 20 2a 20 20 20 20 20 54 68 69 73 20 66 75 6e  . *     This fun
e620: 63 74 69 6f 6e 20 66 72 65 65 73 20 74 68 65 20  ction frees the 
e630: 54 4c 56 20 6c 69 6e 6b 65 64 20 6c 69 73 74 65  TLV linked liste
e640: 64 20 72 65 74 75 72 6e 65 64 20 66 72 6f 6d 0a  d returned from.
e650: 20 2a 20 20 20 20 20 22 63 61 63 6b 65 79 5f 72   *     "cackey_r
e660: 65 61 64 5f 74 6c 76 22 0a 20 2a 0a 20 2a 2f 0a  ead_tlv". *. */.
e670: 73 74 61 74 69 63 20 76 6f 69 64 20 63 61 63 6b  static void cack
e680: 65 79 5f 66 72 65 65 5f 74 6c 76 28 73 74 72 75  ey_free_tlv(stru
e690: 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e  ct cackey_tlv_en
e6a0: 74 69 74 79 20 2a 72 6f 6f 74 29 20 7b 0a 09 73  tity *root) {..s
e6b0: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76  truct cackey_tlv
e6c0: 5f 65 6e 74 69 74 79 20 2a 63 75 72 72 2c 20 2a  _entity *curr, *
e6d0: 6e 65 78 74 3b 0a 0a 09 69 66 20 28 72 6f 6f 74  next;...if (root
e6e0: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65   == NULL) {...re
e6f0: 74 75 72 6e 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28  turn;..}...for (
e700: 63 75 72 72 20 3d 20 72 6f 6f 74 3b 20 63 75 72  curr = root; cur
e710: 72 3b 20 63 75 72 72 20 3d 20 6e 65 78 74 29 20  r; curr = next) 
e720: 7b 0a 09 09 6e 65 78 74 20 3d 20 63 75 72 72 2d  {...next = curr-
e730: 3e 5f 6e 65 78 74 3b 0a 0a 09 09 73 77 69 74 63  >_next;....switc
e740: 68 20 28 63 75 72 72 2d 3e 74 61 67 29 20 7b 0a  h (curr->tag) {.
e750: 09 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
e760: 47 5f 41 43 52 5f 54 41 42 4c 45 3a 0a 09 09 09  G_ACR_TABLE:....
e770: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43  case GSCIS_TAG_C
e780: 45 52 54 49 46 49 43 41 54 45 3a 0a 09 09 09 09  ERTIFICATE:.....
e790: 69 66 20 28 63 75 72 72 2d 3e 76 61 6c 75 65 29  if (curr->value)
e7a0: 20 7b 0a 09 09 09 09 09 66 72 65 65 28 63 75 72   {......free(cur
e7b0: 72 2d 3e 76 61 6c 75 65 29 3b 0a 09 09 09 09 7d  r->value);.....}
e7c0: 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
e7d0: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43 41  ase GSCIS_TAG_CA
e7e0: 52 44 55 52 4c 3a 0a 09 09 09 09 69 66 20 28 63  RDURL:.....if (c
e7f0: 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75  urr->value_cardu
e800: 72 6c 29 20 7b 0a 09 09 09 09 09 66 72 65 65 28  rl) {......free(
e810: 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64  curr->value_card
e820: 75 72 6c 29 3b 0a 09 09 09 09 7d 0a 09 09 09 09  url);.....}.....
e830: 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09 66 72  break;...}....fr
e840: 65 65 28 63 75 72 72 29 3b 0a 09 7d 0a 0a 09 72  ee(curr);..}...r
e850: 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20  eturn;.}../*. * 
e860: 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20  SYNPOSIS. *     
e870: 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45  .... *. * ARGUME
e880: 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20  NTS. *     .... 
e890: 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55  *. * RETURN VALU
e8a0: 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a  E. *     .... *.
e8b0: 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20   * NOTES. *     
e8c0: 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69  .... *. */.stati
e8d0: 63 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  c struct cackey_
e8e0: 74 6c 76 5f 65 6e 74 69 74 79 20 2a 63 61 63 6b  tlv_entity *cack
e8f0: 65 79 5f 72 65 61 64 5f 74 6c 76 28 73 74 72 75  ey_read_tlv(stru
e900: 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a  ct cackey_slot *
e910: 73 6c 6f 74 29 20 7b 0a 09 73 74 72 75 63 74 20  slot) {..struct 
e920: 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74  cackey_tlv_entit
e930: 79 20 2a 63 75 72 72 5f 65 6e 74 69 74 79 2c 20  y *curr_entity, 
e940: 2a 72 6f 6f 74 20 3d 20 4e 55 4c 4c 2c 20 2a 6c  *root = NULL, *l
e950: 61 73 74 20 3d 20 4e 55 4c 4c 3b 0a 09 75 6e 73  ast = NULL;..uns
e960: 69 67 6e 65 64 20 63 68 61 72 20 74 6c 65 6e 5f  igned char tlen_
e970: 62 75 66 5b 32 5d 2c 20 74 76 61 6c 5f 62 75 66  buf[2], tval_buf
e980: 5b 31 30 32 34 5d 2c 20 2a 74 76 61 6c 3b 0a 09  [1024], *tval;..
e990: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 76 6c  unsigned char vl
e9a0: 65 6e 5f 62 75 66 5b 32 5d 2c 20 76 76 61 6c 5f  en_buf[2], vval_
e9b0: 62 75 66 5b 38 31 39 32 5d 2c 20 2a 76 76 61 6c  buf[8192], *vval
e9c0: 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72  ;..unsigned char
e9d0: 20 2a 74 6d 70 62 75 66 3b 0a 09 75 6e 73 69 67   *tmpbuf;..unsig
e9e0: 6e 65 64 20 6c 6f 6e 67 20 74 6d 70 62 75 66 6c  ned long tmpbufl
e9f0: 65 6e 3b 0a 09 73 73 69 7a 65 5f 74 20 74 6c 65  en;..ssize_t tle
ea00: 6e 2c 20 76 6c 65 6e 3b 0a 09 73 73 69 7a 65 5f  n, vlen;..ssize_
ea10: 74 20 72 65 61 64 5f 72 65 74 3b 0a 09 73 69 7a  t read_ret;..siz
ea20: 65 5f 74 20 6f 66 66 73 65 74 5f 74 20 3d 20 30  e_t offset_t = 0
ea30: 2c 20 6f 66 66 73 65 74 5f 76 20 3d 20 30 3b 0a  , offset_v = 0;.
ea40: 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 74  .unsigned char t
ea50: 61 67 3b 0a 09 73 69 7a 65 5f 74 20 6c 65 6e 67  ag;..size_t leng
ea60: 74 68 3b 0a 23 69 66 64 65 66 20 48 41 56 45 5f  th;.#ifdef HAVE_
ea70: 4c 49 42 5a 0a 09 69 6e 74 20 75 6e 63 6f 6d 70  LIBZ..int uncomp
ea80: 72 65 73 73 5f 72 65 74 3b 0a 23 65 6e 64 69 66  ress_ret;.#endif
ea90: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
eaa0: 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
eab0: 29 3b 0a 0a 09 72 65 61 64 5f 72 65 74 20 3d 20  );...read_ret = 
eac0: 63 61 63 6b 65 79 5f 72 65 61 64 5f 62 75 66 66  cackey_read_buff
ead0: 65 72 28 73 6c 6f 74 2c 20 74 6c 65 6e 5f 62 75  er(slot, tlen_bu
eae0: 66 2c 20 73 69 7a 65 6f 66 28 74 6c 65 6e 5f 62  f, sizeof(tlen_b
eaf0: 75 66 29 2c 20 31 2c 20 6f 66 66 73 65 74 5f 74  uf), 1, offset_t
eb00: 29 3b 0a 09 69 66 20 28 72 65 61 64 5f 72 65 74  );..if (read_ret
eb10: 20 21 3d 20 73 69 7a 65 6f 66 28 74 6c 65 6e 5f   != sizeof(tlen_
eb20: 62 75 66 29 29 20 7b 0a 09 09 43 41 43 4b 45 59  buf)) {...CACKEY
eb30: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
eb40: 65 61 64 20 66 61 69 6c 65 64 2c 20 72 65 74 75  ead failed, retu
eb50: 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65  rning in failure
eb60: 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55  ");....return(NU
eb70: 4c 4c 29 3b 0a 09 7d 0a 0a 09 74 6c 65 6e 20 3d  LL);..}...tlen =
eb80: 20 28 74 6c 65 6e 5f 62 75 66 5b 31 5d 20 3c 3c   (tlen_buf[1] <<
eb90: 20 38 29 20 7c 20 74 6c 65 6e 5f 62 75 66 5b 30   8) | tlen_buf[0
eba0: 5d 3b 0a 0a 09 72 65 61 64 5f 72 65 74 20 3d 20  ];...read_ret = 
ebb0: 63 61 63 6b 65 79 5f 72 65 61 64 5f 62 75 66 66  cackey_read_buff
ebc0: 65 72 28 73 6c 6f 74 2c 20 76 6c 65 6e 5f 62 75  er(slot, vlen_bu
ebd0: 66 2c 20 73 69 7a 65 6f 66 28 76 6c 65 6e 5f 62  f, sizeof(vlen_b
ebe0: 75 66 29 2c 20 32 2c 20 6f 66 66 73 65 74 5f 76  uf), 2, offset_v
ebf0: 29 3b 0a 09 69 66 20 28 72 65 61 64 5f 72 65 74  );..if (read_ret
ec00: 20 21 3d 20 73 69 7a 65 6f 66 28 76 6c 65 6e 5f   != sizeof(vlen_
ec10: 62 75 66 29 29 20 7b 0a 09 09 43 41 43 4b 45 59  buf)) {...CACKEY
ec20: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
ec30: 65 61 64 20 66 61 69 6c 65 64 2c 20 72 65 74 75  ead failed, retu
ec40: 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65  rning in failure
ec50: 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55  ");....return(NU
ec60: 4c 4c 29 3b 0a 09 7d 0a 0a 09 76 6c 65 6e 20 3d  LL);..}...vlen =
ec70: 20 28 76 6c 65 6e 5f 62 75 66 5b 31 5d 20 3c 3c   (vlen_buf[1] <<
ec80: 20 38 29 20 7c 20 76 6c 65 6e 5f 62 75 66 5b 30   8) | vlen_buf[0
ec90: 5d 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ];...CACKEY_DEBU
eca0: 47 5f 50 52 49 4e 54 46 28 22 54 61 67 20 4c 65  G_PRINTF("Tag Le
ecb0: 6e 67 74 68 20 3d 20 25 6c 75 2c 20 56 61 6c 75  ngth = %lu, Valu
ecc0: 65 20 4c 65 6e 67 74 68 20 3d 20 25 6c 75 22 2c  e Length = %lu",
ecd0: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
ece0: 20 74 6c 65 6e 2c 20 28 75 6e 73 69 67 6e 65 64   tlen, (unsigned
ecf0: 20 6c 6f 6e 67 29 20 76 6c 65 6e 29 3b 0a 0a 09   long) vlen);...
ed00: 6f 66 66 73 65 74 5f 74 20 2b 3d 20 32 3b 0a 09  offset_t += 2;..
ed10: 6f 66 66 73 65 74 5f 76 20 2b 3d 20 32 3b 0a 0a  offset_v += 2;..
ed20: 09 69 66 20 28 74 6c 65 6e 20 3e 20 73 69 7a 65  .if (tlen > size
ed30: 6f 66 28 74 76 61 6c 5f 62 75 66 29 29 20 7b 0a  of(tval_buf)) {.
ed40: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
ed50: 52 49 4e 54 46 28 22 54 61 67 20 6c 65 6e 67 74  RINTF("Tag lengt
ed60: 68 20 69 73 20 74 6f 6f 20 6c 61 72 67 65 2c 20  h is too large, 
ed70: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  returning in fai
ed80: 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72  lure");....retur
ed90: 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 69 66  n(NULL);..}...if
eda0: 20 28 76 6c 65 6e 20 3e 20 73 69 7a 65 6f 66 28   (vlen > sizeof(
edb0: 76 76 61 6c 5f 62 75 66 29 29 20 7b 0a 09 09 43  vval_buf)) {...C
edc0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
edd0: 54 46 28 22 56 61 6c 75 65 20 6c 65 6e 67 74 68  TF("Value length
ede0: 20 69 73 20 74 6f 6f 20 6c 61 72 67 65 2c 20 72   is too large, r
edf0: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
ee00: 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ure");....return
ee10: 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 72 65 61  (NULL);..}...rea
ee20: 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 72  d_ret = cackey_r
ee30: 65 61 64 5f 62 75 66 66 65 72 28 73 6c 6f 74 2c  ead_buffer(slot,
ee40: 20 74 76 61 6c 5f 62 75 66 2c 20 74 6c 65 6e 2c   tval_buf, tlen,
ee50: 20 31 2c 20 6f 66 66 73 65 74 5f 74 29 3b 0a 09   1, offset_t);..
ee60: 69 66 20 28 72 65 61 64 5f 72 65 74 20 21 3d 20  if (read_ret != 
ee70: 74 6c 65 6e 29 20 7b 0a 09 09 43 41 43 4b 45 59  tlen) {...CACKEY
ee80: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55  _DEBUG_PRINTF("U
ee90: 6e 61 62 6c 65 20 74 6f 20 72 65 61 64 20 65 6e  nable to read en
eea0: 74 69 72 65 20 54 2d 62 75 66 66 65 72 2c 20 72  tire T-buffer, r
eeb0: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
eec0: 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ure");....return
eed0: 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 72 65 61  (NULL);..}...rea
eee0: 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 72  d_ret = cackey_r
eef0: 65 61 64 5f 62 75 66 66 65 72 28 73 6c 6f 74 2c  ead_buffer(slot,
ef00: 20 76 76 61 6c 5f 62 75 66 2c 20 76 6c 65 6e 2c   vval_buf, vlen,
ef10: 20 32 2c 20 6f 66 66 73 65 74 5f 76 29 3b 0a 09   2, offset_v);..
ef20: 69 66 20 28 72 65 61 64 5f 72 65 74 20 21 3d 20  if (read_ret != 
ef30: 76 6c 65 6e 29 20 7b 0a 09 09 43 41 43 4b 45 59  vlen) {...CACKEY
ef40: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55  _DEBUG_PRINTF("U
ef50: 6e 61 62 6c 65 20 74 6f 20 72 65 61 64 20 65 6e  nable to read en
ef60: 74 69 72 65 20 56 2d 62 75 66 66 65 72 2c 20 72  tire V-buffer, r
ef70: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
ef80: 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ure");....return
ef90: 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 74 76 61  (NULL);..}...tva
efa0: 6c 20 3d 20 74 76 61 6c 5f 62 75 66 3b 0a 09 76  l = tval_buf;..v
efb0: 76 61 6c 20 3d 20 76 76 61 6c 5f 62 75 66 3b 0a  val = vval_buf;.
efc0: 09 77 68 69 6c 65 20 28 74 6c 65 6e 20 3e 20 30  .while (tlen > 0
efd0: 20 26 26 20 76 6c 65 6e 20 3e 20 30 29 20 7b 0a   && vlen > 0) {.
efe0: 09 09 74 61 67 20 3d 20 2a 74 76 61 6c 3b 0a 09  ..tag = *tval;..
eff0: 09 74 76 61 6c 2b 2b 3b 0a 09 09 74 6c 65 6e 2d  .tval++;...tlen-
f000: 2d 3b 0a 0a 09 09 69 66 20 28 2a 74 76 61 6c 20  -;....if (*tval 
f010: 3d 3d 20 30 78 66 66 29 20 7b 0a 09 09 09 6c 65  == 0xff) {....le
f020: 6e 67 74 68 20 3d 20 28 74 76 61 6c 5b 32 5d 20  ngth = (tval[2] 
f030: 3c 3c 20 38 29 20 7c 20 74 76 61 6c 5b 31 5d 3b  << 8) | tval[1];
f040: 0a 09 09 09 74 76 61 6c 20 2b 3d 20 33 3b 0a 09  ....tval += 3;..
f050: 09 09 74 6c 65 6e 20 2d 3d 20 33 3b 0a 09 09 7d  ..tlen -= 3;...}
f060: 20 65 6c 73 65 20 7b 0a 09 09 09 6c 65 6e 67 74   else {....lengt
f070: 68 20 3d 20 2a 74 76 61 6c 3b 0a 09 09 09 74 76  h = *tval;....tv
f080: 61 6c 2b 2b 3b 0a 09 09 09 74 6c 65 6e 2d 2d 3b  al++;....tlen--;
f090: 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ...}....CACKEY_D
f0a0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54 61 67  EBUG_PRINTF("Tag
f0b0: 3a 20 25 73 20 28 25 30 32 78 29 22 2c 20 43 41  : %s (%02x)", CA
f0c0: 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
f0d0: 54 41 47 5f 54 4f 5f 53 54 52 28 74 61 67 29 2c  TAG_TO_STR(tag),
f0e0: 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20   (unsigned int) 
f0f0: 74 61 67 29 3b 0a 09 09 43 41 43 4b 45 59 5f 44  tag);...CACKEY_D
f100: 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22 56  EBUG_PRINTBUF("V
f110: 61 6c 75 65 3a 22 2c 20 76 76 61 6c 2c 20 6c 65  alue:", vval, le
f120: 6e 67 74 68 29 3b 0a 0a 09 09 63 75 72 72 5f 65  ngth);....curr_e
f130: 6e 74 69 74 79 20 3d 20 4e 55 4c 4c 3b 0a 09 09  ntity = NULL;...
f140: 73 77 69 74 63 68 20 28 74 61 67 29 20 7b 0a 09  switch (tag) {..
f150: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47  ..case GSCIS_TAG
f160: 5f 43 41 52 44 55 52 4c 3a 0a 09 09 09 09 63 75  _CARDURL:.....cu
f170: 72 72 5f 65 6e 74 69 74 79 20 3d 20 6d 61 6c 6c  rr_entity = mall
f180: 6f 63 28 73 69 7a 65 6f 66 28 2a 63 75 72 72 5f  oc(sizeof(*curr_
f190: 65 6e 74 69 74 79 29 29 3b 0a 09 09 09 09 63 75  entity));.....cu
f1a0: 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65  rr_entity->value
f1b0: 5f 63 61 72 64 75 72 6c 20 3d 20 6d 61 6c 6c 6f  _cardurl = mallo
f1c0: 63 28 73 69 7a 65 6f 66 28 2a 63 75 72 72 5f 65  c(sizeof(*curr_e
f1d0: 6e 74 69 74 79 2d 3e 76 61 6c 75 65 5f 63 61 72  ntity->value_car
f1e0: 64 75 72 6c 29 29 3b 0a 0a 09 09 09 09 6d 65 6d  durl));......mem
f1f0: 63 70 79 28 63 75 72 72 5f 65 6e 74 69 74 79 2d  cpy(curr_entity-
f200: 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e  >value_cardurl->
f210: 72 69 64 2c 20 76 76 61 6c 2c 20 35 29 3b 0a 09  rid, vval, 5);..
f220: 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e  ...curr_entity->
f230: 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61  value_cardurl->a
f240: 70 70 74 79 70 65 20 3d 20 76 76 61 6c 5b 35 5d  pptype = vval[5]
f250: 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74  ;.....curr_entit
f260: 79 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c  y->value_cardurl
f270: 2d 3e 6f 62 6a 65 63 74 69 64 20 3d 20 28 76 76  ->objectid = (vv
f280: 61 6c 5b 36 5d 20 3c 3c 20 38 29 20 7c 20 76 76  al[6] << 8) | vv
f290: 61 6c 5b 37 5d 3b 0a 09 09 09 09 63 75 72 72 5f  al[7];.....curr_
f2a0: 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65 5f 63 61  entity->value_ca
f2b0: 72 64 75 72 6c 2d 3e 61 70 70 69 64 20 3d 20 28  rdurl->appid = (
f2c0: 76 76 61 6c 5b 38 5d 20 3c 3c 20 38 29 20 7c 20  vval[8] << 8) | 
f2d0: 76 76 61 6c 5b 39 5d 3b 0a 0a 09 09 09 09 63 75  vval[9];......cu
f2e0: 72 72 5f 65 6e 74 69 74 79 2d 3e 74 61 67 20 3d  rr_entity->tag =
f2f0: 20 74 61 67 3b 0a 09 09 09 09 63 75 72 72 5f 65   tag;.....curr_e
f300: 6e 74 69 74 79 2d 3e 5f 6e 65 78 74 20 3d 20 4e  ntity->_next = N
f310: 55 4c 4c 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b  ULL;......break;
f320: 0a 09 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ....case GSCIS_T
f330: 41 47 5f 41 43 52 5f 54 41 42 4c 45 3a 0a 09 09  AG_ACR_TABLE:...
f340: 09 09 63 75 72 72 5f 65 6e 74 69 74 79 20 3d 20  ..curr_entity = 
f350: 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63  malloc(sizeof(*c
f360: 75 72 72 5f 65 6e 74 69 74 79 29 29 3b 0a 09 09  urr_entity));...
f370: 09 09 74 6d 70 62 75 66 20 3d 20 6d 61 6c 6c 6f  ..tmpbuf = mallo
f380: 63 28 6c 65 6e 67 74 68 29 3b 0a 0a 09 09 09 09  c(length);......
f390: 6d 65 6d 63 70 79 28 74 6d 70 62 75 66 2c 20 76  memcpy(tmpbuf, v
f3a0: 76 61 6c 2c 20 6c 65 6e 67 74 68 29 3b 0a 0a 09  val, length);...
f3b0: 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e  ...curr_entity->
f3c0: 74 61 67 20 3d 20 74 61 67 3b 0a 09 09 09 09 63  tag = tag;.....c
f3d0: 75 72 72 5f 65 6e 74 69 74 79 2d 3e 6c 65 6e 67  urr_entity->leng
f3e0: 74 68 20 3d 20 6c 65 6e 67 74 68 3b 0a 09 09 09  th = length;....
f3f0: 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61  .curr_entity->va
f400: 6c 75 65 20 3d 20 74 6d 70 62 75 66 3b 0a 09 09  lue = tmpbuf;...
f410: 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 5f  ..curr_entity->_
f420: 6e 65 78 74 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09  next = NULL;....
f430: 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
f440: 20 47 53 43 49 53 5f 54 41 47 5f 43 45 52 54 49   GSCIS_TAG_CERTI
f450: 46 49 43 41 54 45 3a 0a 09 09 09 09 63 75 72 72  FICATE:.....curr
f460: 5f 65 6e 74 69 74 79 20 3d 20 6d 61 6c 6c 6f 63  _entity = malloc
f470: 28 73 69 7a 65 6f 66 28 2a 63 75 72 72 5f 65 6e  (sizeof(*curr_en
f480: 74 69 74 79 29 29 3b 0a 0a 23 69 66 64 65 66 20  tity));..#ifdef 
f490: 48 41 56 45 5f 4c 49 42 5a 0a 09 09 09 09 74 6d  HAVE_LIBZ.....tm
f4a0: 70 62 75 66 6c 65 6e 20 3d 20 6c 65 6e 67 74 68  pbuflen = length
f4b0: 20 2a 20 32 3b 0a 09 09 09 09 74 6d 70 62 75 66   * 2;.....tmpbuf
f4c0: 20 3d 20 6d 61 6c 6c 6f 63 28 74 6d 70 62 75 66   = malloc(tmpbuf
f4d0: 6c 65 6e 29 3b 0a 0a 09 09 09 09 75 6e 63 6f 6d  len);......uncom
f4e0: 70 72 65 73 73 5f 72 65 74 20 3d 20 75 6e 63 6f  press_ret = unco
f4f0: 6d 70 72 65 73 73 28 74 6d 70 62 75 66 2c 20 26  mpress(tmpbuf, &
f500: 74 6d 70 62 75 66 6c 65 6e 2c 20 76 76 61 6c 2c  tmpbuflen, vval,
f510: 20 6c 65 6e 67 74 68 29 3b 0a 09 09 09 09 69 66   length);.....if
f520: 20 28 75 6e 63 6f 6d 70 72 65 73 73 5f 72 65 74   (uncompress_ret
f530: 20 21 3d 20 5a 5f 4f 4b 29 20 7b 0a 09 09 09 09   != Z_OK) {.....
f540: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
f550: 49 4e 54 46 28 22 46 61 69 6c 65 64 20 74 6f 20  INTF("Failed to 
f560: 64 65 63 6f 6d 70 72 65 73 73 2c 20 75 6e 63 6f  decompress, unco
f570: 6d 70 72 65 73 73 28 29 20 72 65 74 75 72 6e 65  mpress() returne
f580: 64 20 25 69 20 2d 2d 20 72 65 73 6f 72 74 69 6e  d %i -- resortin
f590: 67 20 74 6f 20 64 69 72 65 63 74 20 63 6f 70 79  g to direct copy
f5a0: 22 2c 20 75 6e 63 6f 6d 70 72 65 73 73 5f 72 65  ", uncompress_re
f5b0: 74 29 3b 0a 0a 09 09 09 09 09 74 6d 70 62 75 66  t);.......tmpbuf
f5c0: 6c 65 6e 20 3d 20 6c 65 6e 67 74 68 3b 0a 09 09  len = length;...
f5d0: 09 09 09 6d 65 6d 63 70 79 28 74 6d 70 62 75 66  ...memcpy(tmpbuf
f5e0: 2c 20 76 76 61 6c 2c 20 6c 65 6e 67 74 68 29 3b  , vval, length);
f5f0: 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b  .....}......CACK
f600: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55  EY_DEBUG_PRINTBU
f610: 46 28 22 44 65 63 6f 6d 70 72 65 73 73 65 64 20  F("Decompressed 
f620: 74 6f 3a 22 2c 20 74 6d 70 62 75 66 2c 20 74 6d  to:", tmpbuf, tm
f630: 70 62 75 66 6c 65 6e 29 3b 0a 23 65 6c 73 65 0a  pbuflen);.#else.
f640: 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
f650: 5f 50 52 49 4e 54 46 28 22 4d 69 73 73 69 6e 67  _PRINTF("Missing
f660: 20 5a 4c 49 42 20 53 75 70 70 6f 72 74 2c 20 74   ZLIB Support, t
f670: 68 69 73 20 63 65 72 74 69 66 69 63 61 74 65 20  his certificate 
f680: 69 73 20 6c 69 6b 65 6c 79 20 75 73 65 6c 65 73  is likely useles
f690: 73 2e 2e 2e 22 29 3b 0a 0a 09 09 09 09 74 6d 70  s...");......tmp
f6a0: 62 75 66 6c 65 6e 20 3d 20 6c 65 6e 67 74 68 3b  buflen = length;
f6b0: 0a 09 09 09 09 6d 65 6d 63 70 79 28 74 6d 70 62  .....memcpy(tmpb
f6c0: 75 66 2c 20 76 76 61 6c 2c 20 6c 65 6e 67 74 68  uf, vval, length
f6d0: 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 09 09 09 63  );.#endif......c
f6e0: 75 72 72 5f 65 6e 74 69 74 79 2d 3e 74 61 67 20  urr_entity->tag 
f6f0: 3d 20 74 61 67 3b 0a 09 09 09 09 63 75 72 72 5f  = tag;.....curr_
f700: 65 6e 74 69 74 79 2d 3e 6c 65 6e 67 74 68 20 3d  entity->length =
f710: 20 74 6d 70 62 75 66 6c 65 6e 3b 0a 09 09 09 09   tmpbuflen;.....
f720: 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c  curr_entity->val
f730: 75 65 20 3d 20 74 6d 70 62 75 66 3b 0a 09 09 09  ue = tmpbuf;....
f740: 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 5f 6e  .curr_entity->_n
f750: 65 78 74 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09  ext = NULL;.....
f760: 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
f770: 47 53 43 49 53 5f 54 41 47 5f 50 4b 43 53 31 35  GSCIS_TAG_PKCS15
f780: 3a 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74  :.....curr_entit
f790: 79 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f  y = malloc(sizeo
f7a0: 66 28 2a 63 75 72 72 5f 65 6e 74 69 74 79 29 29  f(*curr_entity))
f7b0: 3b 0a 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69  ;......curr_enti
f7c0: 74 79 2d 3e 74 61 67 20 3d 20 74 61 67 3b 0a 09  ty->tag = tag;..
f7d0: 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e  ...curr_entity->
f7e0: 76 61 6c 75 65 5f 62 79 74 65 20 3d 20 76 76 61  value_byte = vva
f7f0: 6c 5b 30 5d 3b 0a 09 09 09 09 63 75 72 72 5f 65  l[0];.....curr_e
f800: 6e 74 69 74 79 2d 3e 5f 6e 65 78 74 20 3d 20 4e  ntity->_next = N
f810: 55 4c 4c 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b  ULL;......break;
f820: 0a 09 09 7d 0a 0a 09 09 76 76 61 6c 20 2b 3d 20  ...}....vval += 
f830: 6c 65 6e 67 74 68 3b 0a 09 09 76 6c 65 6e 20 2d  length;...vlen -
f840: 3d 20 6c 65 6e 67 74 68 3b 0a 0a 09 09 69 66 20  = length;....if 
f850: 28 63 75 72 72 5f 65 6e 74 69 74 79 20 21 3d 20  (curr_entity != 
f860: 4e 55 4c 4c 29 20 7b 0a 09 09 09 69 66 20 28 72  NULL) {....if (r
f870: 6f 6f 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  oot == NULL) {..
f880: 09 09 09 72 6f 6f 74 20 3d 20 63 75 72 72 5f 65  ...root = curr_e
f890: 6e 74 69 74 79 3b 0a 09 09 09 7d 0a 0a 09 09 09  ntity;....}.....
f8a0: 69 66 20 28 6c 61 73 74 20 21 3d 20 4e 55 4c 4c  if (last != NULL
f8b0: 29 20 7b 0a 09 09 09 09 6c 61 73 74 2d 3e 5f 6e  ) {.....last->_n
f8c0: 65 78 74 20 3d 20 63 75 72 72 5f 65 6e 74 69 74  ext = curr_entit
f8d0: 79 3b 0a 09 09 09 7d 0a 0a 09 09 09 6c 61 73 74  y;....}.....last
f8e0: 20 3d 20 63 75 72 72 5f 65 6e 74 69 74 79 3b 0a   = curr_entity;.
f8f0: 09 09 7d 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28  ..}..}...return(
f900: 72 6f 6f 74 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20  root);.}../*. * 
f910: 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20  SYNPOSIS. *     
f920: 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45  .... *. * ARGUME
f930: 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20  NTS. *     .... 
f940: 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55  *. * RETURN VALU
f950: 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a  E. *     .... *.
f960: 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20   * NOTES. *     
f970: 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69  .... *. */.stati
f980: 63 20 76 6f 69 64 20 63 61 63 6b 65 79 5f 66 72  c void cackey_fr
f990: 65 65 5f 63 65 72 74 73 28 73 74 72 75 63 74 20  ee_certs(struct 
f9a0: 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e  cackey_pcsc_iden
f9b0: 74 69 74 79 20 2a 73 74 61 72 74 2c 20 73 69 7a  tity *start, siz
f9c0: 65 5f 74 20 63 6f 75 6e 74 2c 20 69 6e 74 20 66  e_t count, int f
f9d0: 72 65 65 5f 73 74 61 72 74 29 20 7b 0a 09 73 69  ree_start) {..si
f9e0: 7a 65 5f 74 20 69 64 78 3b 0a 0a 09 69 66 20 28  ze_t idx;...if (
f9f0: 73 74 61 72 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b  start == NULL) {
fa00: 0a 09 09 72 65 74 75 72 6e 3b 0a 09 7d 0a 0a 09  ...return;..}...
fa10: 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64  for (idx = 0; id
fa20: 78 20 3c 20 63 6f 75 6e 74 3b 20 69 64 78 2b 2b  x < count; idx++
fa30: 29 20 7b 0a 09 09 69 66 20 28 73 74 61 72 74 5b  ) {...if (start[
fa40: 69 64 78 5d 2e 63 65 72 74 69 66 69 63 61 74 65  idx].certificate
fa50: 29 20 7b 0a 09 09 09 66 72 65 65 28 73 74 61 72  ) {....free(star
fa60: 74 5b 69 64 78 5d 2e 63 65 72 74 69 66 69 63 61  t[idx].certifica
fa70: 74 65 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66  te);...}..}...if
fa80: 20 28 66 72 65 65 5f 73 74 61 72 74 29 20 7b 0a   (free_start) {.
fa90: 09 09 66 72 65 65 28 73 74 61 72 74 29 3b 0a 09  ..free(start);..
faa0: 7d 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a 73  }...return;.}..s
fab0: 74 61 74 69 63 20 73 74 72 75 63 74 20 63 61 63  tatic struct cac
fac0: 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74  key_pcsc_identit
fad0: 79 20 2a 63 61 63 6b 65 79 5f 63 6f 70 79 5f 63  y *cackey_copy_c
fae0: 65 72 74 73 28 73 74 72 75 63 74 20 63 61 63 6b  erts(struct cack
faf0: 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79  ey_pcsc_identity
fb00: 20 2a 64 65 73 74 2c 20 73 74 72 75 63 74 20 63   *dest, struct c
fb10: 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74  ackey_pcsc_ident
fb20: 69 74 79 20 2a 73 74 61 72 74 2c 20 73 69 7a 65  ity *start, size
fb30: 5f 74 20 63 6f 75 6e 74 29 20 7b 0a 09 73 69 7a  _t count) {..siz
fb40: 65 5f 74 20 69 64 78 3b 0a 0a 09 69 66 20 28 73  e_t idx;...if (s
fb50: 74 61 72 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  tart == NULL) {.
fb60: 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a  ..return(NULL);.
fb70: 09 7d 0a 0a 09 69 66 20 28 64 65 73 74 20 3d 3d  .}...if (dest ==
fb80: 20 4e 55 4c 4c 29 20 7b 0a 09 09 64 65 73 74 20   NULL) {...dest 
fb90: 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28  = malloc(sizeof(
fba0: 2a 64 65 73 74 29 20 2a 20 63 6f 75 6e 74 29 3b  *dest) * count);
fbb0: 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d  ..}...for (idx =
fbc0: 20 30 3b 20 69 64 78 20 3c 20 63 6f 75 6e 74 3b   0; idx < count;
fbd0: 20 69 64 78 2b 2b 29 20 7b 0a 09 09 64 65 73 74   idx++) {...dest
fbe0: 5b 69 64 78 5d 2e 69 64 5f 74 79 70 65 20 3d 20  [idx].id_type = 
fbf0: 73 74 61 72 74 5b 69 64 78 5d 2e 69 64 5f 74 79  start[idx].id_ty
fc00: 70 65 3b 0a 0a 09 09 73 77 69 74 63 68 20 28 64  pe;....switch (d
fc10: 65 73 74 5b 69 64 78 5d 2e 69 64 5f 74 79 70 65  est[idx].id_type
fc20: 29 20 7b 0a 09 09 09 63 61 73 65 20 43 41 43 4b  ) {....case CACK
fc30: 45 59 5f 49 44 5f 54 59 50 45 5f 43 41 43 3a 0a  EY_ID_TYPE_CAC:.
fc40: 09 09 09 09 6d 65 6d 63 70 79 28 64 65 73 74 5b  ....memcpy(dest[
fc50: 69 64 78 5d 2e 63 61 72 64 2e 63 61 63 2e 61 70  idx].card.cac.ap
fc60: 70 6c 65 74 2c 20 73 74 61 72 74 5b 69 64 78 5d  plet, start[idx]
fc70: 2e 63 61 72 64 2e 63 61 63 2e 61 70 70 6c 65 74  .card.cac.applet
fc80: 2c 20 73 69 7a 65 6f 66 28 64 65 73 74 5b 69 64  , sizeof(dest[id
fc90: 78 5d 2e 63 61 72 64 2e 63 61 63 2e 61 70 70 6c  x].card.cac.appl
fca0: 65 74 29 29 3b 0a 09 09 09 09 64 65 73 74 5b 69  et));.....dest[i
fcb0: 64 78 5d 2e 63 61 72 64 2e 63 61 63 2e 66 69 6c  dx].card.cac.fil
fcc0: 65 20 3d 20 73 74 61 72 74 5b 69 64 78 5d 2e 63  e = start[idx].c
fcd0: 61 72 64 2e 63 61 63 2e 66 69 6c 65 3b 0a 09 09  ard.cac.file;...
fce0: 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
fcf0: 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f   CACKEY_ID_TYPE_
fd00: 50 49 56 3a 0a 09 09 09 09 64 65 73 74 5b 69 64  PIV:.....dest[id
fd10: 78 5d 2e 63 61 72 64 2e 70 69 76 2e 6b 65 79 5f  x].card.piv.key_
fd20: 69 64 20 3d 20 73 74 61 72 74 5b 69 64 78 5d 2e  id = start[idx].
fd30: 63 61 72 64 2e 70 69 76 2e 6b 65 79 5f 69 64 3b  card.piv.key_id;
fd40: 0a 09 09 09 09 6d 65 6d 63 70 79 28 64 65 73 74  .....memcpy(dest
fd50: 5b 69 64 78 5d 2e 63 61 72 64 2e 70 69 76 2e 6c  [idx].card.piv.l
fd60: 61 62 65 6c 2c 20 73 74 61 72 74 5b 69 64 78 5d  abel, start[idx]
fd70: 2e 63 61 72 64 2e 70 69 76 2e 6c 61 62 65 6c 2c  .card.piv.label,
fd80: 20 73 69 7a 65 6f 66 28 64 65 73 74 5b 69 64 78   sizeof(dest[idx
fd90: 5d 2e 63 61 72 64 2e 70 69 76 2e 6c 61 62 65 6c  ].card.piv.label
fda0: 29 29 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  ));.....break;..
fdb0: 09 09 63 61 73 65 20 43 41 43 4b 45 59 5f 49 44  ..case CACKEY_ID
fdc0: 5f 54 59 50 45 5f 43 45 52 54 5f 4f 4e 4c 59 3a  _TYPE_CERT_ONLY:
fdd0: 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a  .....break;...}.
fde0: 09 09 64 65 73 74 5b 69 64 78 5d 2e 63 65 72 74  ..dest[idx].cert
fdf0: 69 66 69 63 61 74 65 5f 6c 65 6e 20 3d 20 73 74  ificate_len = st
fe00: 61 72 74 5b 69 64 78 5d 2e 63 65 72 74 69 66 69  art[idx].certifi
fe10: 63 61 74 65 5f 6c 65 6e 3b 0a 09 09 64 65 73 74  cate_len;...dest
fe20: 5b 69 64 78 5d 2e 6b 65 79 73 69 7a 65 20 3d 20  [idx].keysize = 
fe30: 73 74 61 72 74 5b 69 64 78 5d 2e 6b 65 79 73 69  start[idx].keysi
fe40: 7a 65 3b 0a 0a 09 09 64 65 73 74 5b 69 64 78 5d  ze;....dest[idx]
fe50: 2e 63 65 72 74 69 66 69 63 61 74 65 20 3d 20 6d  .certificate = m
fe60: 61 6c 6c 6f 63 28 64 65 73 74 5b 69 64 78 5d 2e  alloc(dest[idx].
fe70: 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 29  certificate_len)
fe80: 3b 0a 09 09 6d 65 6d 63 70 79 28 64 65 73 74 5b  ;...memcpy(dest[
fe90: 69 64 78 5d 2e 63 65 72 74 69 66 69 63 61 74 65  idx].certificate
fea0: 2c 20 73 74 61 72 74 5b 69 64 78 5d 2e 63 65 72  , start[idx].cer
feb0: 74 69 66 69 63 61 74 65 2c 20 64 65 73 74 5b 69  tificate, dest[i
fec0: 64 78 5d 2e 63 65 72 74 69 66 69 63 61 74 65 5f  dx].certificate_
fed0: 6c 65 6e 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72  len);..}...retur
fee0: 6e 28 64 65 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 20  n(dest);.}../*. 
fef0: 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20  * SYNPOSIS. *   
ff00: 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55    .... *. * ARGU
ff10: 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e  MENTS. *     ...
ff20: 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41  . *. * RETURN VA
ff30: 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20  LUE. *     .... 
ff40: 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20  *. * NOTES. *   
ff50: 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61    .... *. */.sta
ff60: 74 69 63 20 73 74 72 75 63 74 20 63 61 63 6b 65  tic struct cacke
ff70: 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20  y_pcsc_identity 
ff80: 2a 63 61 63 6b 65 79 5f 72 65 61 64 5f 63 65 72  *cackey_read_cer
ff90: 74 73 28 73 74 72 75 63 74 20 63 61 63 6b 65 79  ts(struct cackey
ffa0: 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 73 74 72  _slot *slot, str
ffb0: 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f  uct cackey_pcsc_
ffc0: 69 64 65 6e 74 69 74 79 20 2a 63 65 72 74 73 2c  identity *certs,
ffd0: 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 2a   unsigned long *
ffe0: 63 6f 75 6e 74 29 20 7b 0a 09 73 74 72 75 63 74  count) {..struct
fff0: 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65   cackey_pcsc_ide
10000 6e 74 69 74 79 20 2a 63 75 72 72 5f 69 64 3b 0a  ntity *curr_id;.
10010 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74  .struct cackey_t
10020 6c 76 5f 65 6e 74 69 74 79 20 2a 63 63 63 5f 74  lv_entity *ccc_t
10030 6c 76 2c 20 2a 63 63 63 5f 63 75 72 72 2c 20 2a  lv, *ccc_curr, *
10040 61 70 70 5f 74 6c 76 2c 20 2a 61 70 70 5f 63 75  app_tlv, *app_cu
10050 72 72 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68  rr;..unsigned ch
10060 61 72 20 63 63 63 5f 61 69 64 5b 5d 20 3d 20 7b  ar ccc_aid[] = {
10070 47 53 43 49 53 5f 41 49 44 5f 43 43 43 7d 2c 20  GSCIS_AID_CCC}, 
10080 70 69 76 5f 61 69 64 5b 5d 20 3d 20 7b 4e 49 53  piv_aid[] = {NIS
10090 54 53 50 38 30 30 5f 37 33 5f 33 5f 50 49 56 5f  TSP800_73_3_PIV_
100a0 41 49 44 7d 3b 0a 09 75 6e 73 69 67 6e 65 64 20  AID};..unsigned 
100b0 63 68 61 72 20 2a 70 69 76 5f 6f 69 64 2c 20 70  char *piv_oid, p
100c0 69 76 5f 6f 69 64 5f 70 69 76 61 75 74 68 5b 5d  iv_oid_pivauth[]
100d0 20 3d 20 7b 4e 49 53 54 53 50 38 30 30 5f 37 33   = {NISTSP800_73
100e0 5f 33 5f 4f 49 44 5f 50 49 56 41 55 54 48 7d 2c  _3_OID_PIVAUTH},
100f0 20 70 69 76 5f 6f 69 64 5f 73 69 67 6e 61 74 75   piv_oid_signatu
10100 72 65 5b 5d 20 3d 20 7b 4e 49 53 54 53 50 38 30  re[] = {NISTSP80
10110 30 5f 37 33 5f 33 5f 4f 49 44 5f 53 49 47 4e 41  0_73_3_OID_SIGNA
10120 54 55 52 45 7d 2c 20 70 69 76 5f 6f 69 64 5f 6b  TURE}, piv_oid_k
10130 65 79 6d 67 74 5b 5d 20 3d 20 7b 4e 49 53 54 53  eymgt[] = {NISTS
10140 50 38 30 30 5f 37 33 5f 33 5f 4f 49 44 5f 4b 45  P800_73_3_OID_KE
10150 59 4d 47 54 7d 3b 0a 09 75 6e 73 69 67 6e 65 64  YMGT};..unsigned
10160 20 63 68 61 72 20 63 75 72 72 5f 61 69 64 5b 37   char curr_aid[7
10170 5d 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61  ];..unsigned cha
10180 72 20 62 75 66 66 65 72 5b 38 31 39 32 5d 2c 20  r buffer[8192], 
10190 2a 62 75 66 66 65 72 5f 70 2c 20 2a 74 6d 70 62  *buffer_p, *tmpb
101a0 75 66 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f  uf;..unsigned lo
101b0 6e 67 20 6f 75 74 69 64 78 20 3d 20 30 3b 0a 09  ng outidx = 0;..
101c0 63 68 61 72 20 2a 70 69 76 5f 6c 61 62 65 6c 3b  char *piv_label;
101d0 0a 09 63 61 63 6b 65 79 5f 72 65 74 20 74 72 61  ..cackey_ret tra
101e0 6e 73 61 63 74 69 6f 6e 5f 72 65 74 3b 0a 09 73  nsaction_ret;..s
101f0 73 69 7a 65 5f 74 20 72 65 61 64 5f 72 65 74 3b  size_t read_ret;
10200 0a 09 73 69 7a 65 5f 74 20 62 75 66 66 65 72 5f  ..size_t buffer_
10210 6c 65 6e 2c 20 74 6d 70 62 75 66 6c 65 6e 3b 0a  len, tmpbuflen;.
10220 09 69 6e 74 20 63 65 72 74 73 5f 72 65 73 69 7a  .int certs_resiz
10230 61 62 6c 65 3b 0a 09 69 6e 74 20 73 65 6e 64 5f  able;..int send_
10240 72 65 74 2c 20 73 65 6c 65 63 74 5f 72 65 74 3b  ret, select_ret;
10250 0a 09 69 6e 74 20 70 69 76 5f 6b 65 79 2c 20 70  ..int piv_key, p
10260 69 76 20 3d 20 30 3b 0a 09 69 6e 74 20 69 64 78  iv = 0;..int idx
10270 3b 0a 23 69 66 64 65 66 20 48 41 56 45 5f 4c 49  ;.#ifdef HAVE_LI
10280 42 5a 0a 09 69 6e 74 20 75 6e 63 6f 6d 70 72 65  BZ..int uncompre
10290 73 73 5f 72 65 74 3b 0a 09 7a 5f 73 74 72 65 61  ss_ret;..z_strea
102a0 6d 20 67 7a 69 70 5f 73 74 72 65 61 6d 3b 0a 23  m gzip_stream;.#
102b0 65 6e 64 69 66 0a 0a 09 43 41 43 4b 45 59 5f 44  endif...CACKEY_D
102c0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
102d0 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 63 6f  led.");...if (co
102e0 75 6e 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  unt == NULL) {..
102f0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
10300 49 4e 54 46 28 22 63 6f 75 6e 74 20 69 73 20 4e  INTF("count is N
10310 55 4c 4c 2c 20 72 65 74 75 72 6e 69 6e 67 20 69  ULL, returning i
10320 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09  n failure");....
10330 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d  return(NULL);..}
10340 0a 0a 09 69 66 20 28 63 65 72 74 73 20 21 3d 20  ...if (certs != 
10350 4e 55 4c 4c 29 20 7b 0a 09 09 69 66 20 28 2a 63  NULL) {...if (*c
10360 6f 75 6e 74 20 3d 3d 20 30 29 20 7b 0a 09 09 09  ount == 0) {....
10370 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
10380 4e 54 46 28 22 52 65 71 75 65 73 74 65 64 20 77  NTF("Requested w
10390 65 20 72 65 74 75 72 6e 20 30 20 6f 62 6a 65 63  e return 0 objec
103a0 74 73 2c 20 73 68 6f 72 74 2d 63 69 72 63 75 69  ts, short-circui
103b0 74 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28  t");.....return(
103c0 63 65 72 74 73 29 3b 0a 09 09 7d 0a 09 7d 0a 0a  certs);...}..}..
103d0 09 69 66 20 28 21 73 6c 6f 74 2d 3e 73 6c 6f 74  .if (!slot->slot
103e0 5f 72 65 73 65 74 29 20 7b 0a 09 09 69 66 20 28  _reset) {...if (
103f0 73 6c 6f 74 2d 3e 63 61 63 68 65 64 5f 63 65 72  slot->cached_cer
10400 74 73 29 20 7b 0a 09 09 09 69 66 20 28 63 65 72  ts) {....if (cer
10410 74 73 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  ts == NULL) {...
10420 09 09 63 65 72 74 73 20 3d 20 6d 61 6c 6c 6f 63  ..certs = malloc
10430 28 73 69 7a 65 6f 66 28 2a 63 65 72 74 73 29 20  (sizeof(*certs) 
10440 2a 20 73 6c 6f 74 2d 3e 63 61 63 68 65 64 5f 63  * slot->cached_c
10450 65 72 74 73 5f 63 6f 75 6e 74 29 3b 0a 09 09 09  erts_count);....
10460 09 2a 63 6f 75 6e 74 20 3d 20 73 6c 6f 74 2d 3e  .*count = slot->
10470 63 61 63 68 65 64 5f 63 65 72 74 73 5f 63 6f 75  cached_certs_cou
10480 6e 74 3b 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a  nt;....} else {.
10490 09 09 09 09 69 66 20 28 2a 63 6f 75 6e 74 20 3e  ....if (*count >
104a0 20 73 6c 6f 74 2d 3e 63 61 63 68 65 64 5f 63 65   slot->cached_ce
104b0 72 74 73 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 09  rts_count) {....
104c0 09 09 2a 63 6f 75 6e 74 20 3d 20 73 6c 6f 74 2d  ..*count = slot-
104d0 3e 63 61 63 68 65 64 5f 63 65 72 74 73 5f 63 6f  >cached_certs_co
104e0 75 6e 74 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a  unt;.....}....}.
104f0 0a 09 09 09 63 61 63 6b 65 79 5f 63 6f 70 79 5f  ....cackey_copy_
10500 63 65 72 74 73 28 63 65 72 74 73 2c 20 73 6c 6f  certs(certs, slo
10510 74 2d 3e 63 61 63 68 65 64 5f 63 65 72 74 73 2c  t->cached_certs,
10520 20 2a 63 6f 75 6e 74 29 3b 0a 0a 09 09 09 72 65   *count);.....re
10530 74 75 72 6e 28 63 65 72 74 73 29 3b 0a 09 09 7d  turn(certs);...}
10540 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 2d 3e  ..}...if (slot->
10550 63 61 63 68 65 64 5f 63 65 72 74 73 29 20 7b 0a  cached_certs) {.
10560 09 09 63 61 63 6b 65 79 5f 66 72 65 65 5f 63 65  ..cackey_free_ce
10570 72 74 73 28 73 6c 6f 74 2d 3e 63 61 63 68 65 64  rts(slot->cached
10580 5f 63 65 72 74 73 2c 20 73 6c 6f 74 2d 3e 63 61  _certs, slot->ca
10590 63 68 65 64 5f 63 65 72 74 73 5f 63 6f 75 6e 74  ched_certs_count
105a0 2c 20 31 29 3b 0a 0a 09 09 73 6c 6f 74 2d 3e 63  , 1);....slot->c
105b0 61 63 68 65 64 5f 63 65 72 74 73 20 3d 20 4e 55  ached_certs = NU
105c0 4c 4c 3b 0a 09 7d 0a 0a 09 2f 2a 20 42 65 67 69  LL;..}.../* Begi
105d0 6e 20 61 20 53 6d 61 72 74 43 61 72 64 20 74 72  n a SmartCard tr
105e0 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 74 72  ansaction */..tr
105f0 61 6e 73 61 63 74 69 6f 6e 5f 72 65 74 20 3d 20  ansaction_ret = 
10600 63 61 63 6b 65 79 5f 62 65 67 69 6e 5f 74 72 61  cackey_begin_tra
10610 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a  nsaction(slot);.
10620 09 69 66 20 28 74 72 61 6e 73 61 63 74 69 6f 6e  .if (transaction
10630 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50  _ret != CACKEY_P
10640 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41  CSC_S_OK) {...CA
10650 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
10660 46 28 22 55 6e 61 62 6c 65 20 62 65 67 69 6e 20  F("Unable begin 
10670 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 72 65 74  transaction, ret
10680 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
10690 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e  e");....return(N
106a0 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 65  ULL);..}.../* Se
106b0 6c 65 63 74 20 74 68 65 20 43 43 43 20 41 70 70  lect the CCC App
106c0 6c 65 74 20 2a 2f 0a 09 73 65 6e 64 5f 72 65 74  let */..send_ret
106d0 20 3d 20 63 61 63 6b 65 79 5f 73 65 6c 65 63 74   = cackey_select
106e0 5f 61 70 70 6c 65 74 28 73 6c 6f 74 2c 20 63 63  _applet(slot, cc
106f0 63 5f 61 69 64 2c 20 73 69 7a 65 6f 66 28 63 63  c_aid, sizeof(cc
10700 63 5f 61 69 64 29 29 3b 0a 09 69 66 20 28 73 65  c_aid));..if (se
10710 6e 64 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59  nd_ret != CACKEY
10720 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09  _PCSC_S_OK) {...
10730 2f 2a 20 54 72 79 20 50 49 56 20 61 70 70 6c 69  /* Try PIV appli
10740 63 61 74 69 6f 6e 20 2a 2f 0a 09 09 73 65 6e 64  cation */...send
10750 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65  _ret = cackey_se
10760 6c 65 63 74 5f 61 70 70 6c 65 74 28 73 6c 6f 74  lect_applet(slot
10770 2c 20 70 69 76 5f 61 69 64 2c 20 73 69 7a 65 6f  , piv_aid, sizeo
10780 66 28 70 69 76 5f 61 69 64 29 29 3b 0a 09 09 69  f(piv_aid));...i
10790 66 20 28 73 65 6e 64 5f 72 65 74 20 3d 3d 20 43  f (send_ret == C
107a0 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29  ACKEY_PCSC_S_OK)
107b0 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
107c0 55 47 5f 50 52 49 4e 54 46 28 22 57 65 20 68 61  UG_PRINTF("We ha
107d0 76 65 20 61 20 50 49 56 20 63 61 72 64 20 2d 2d  ve a PIV card --
107e0 20 6e 6f 74 20 75 73 69 6e 67 20 74 68 65 20 43   not using the C
107f0 43 43 2c 20 70 75 6c 6c 69 6e 67 20 70 72 65 2d  CC, pulling pre-
10800 73 65 6c 65 63 74 65 64 20 6b 65 79 73 22 29 3b  selected keys");
10810 0a 0a 09 09 09 70 69 76 20 3d 20 31 3b 0a 09 09  .....piv = 1;...
10820 7d 20 65 6c 73 65 20 7b 0a 09 09 09 43 41 43 4b  } else {....CACK
10830 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
10840 22 55 6e 61 62 6c 65 20 74 6f 20 73 65 6c 65 63  "Unable to selec
10850 74 20 43 43 43 20 41 70 70 6c 65 74 2c 20 72 65  t CCC Applet, re
10860 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
10870 72 65 22 29 3b 0a 0a 09 09 09 2f 2a 20 54 65 72  re");...../* Ter
10880 6d 69 6e 61 74 65 20 53 6d 61 72 74 43 61 72 64  minate SmartCard
10890 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a   Transaction */.
108a0 09 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72  ...cackey_end_tr
108b0 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b  ansaction(slot);
108c0 0a 0a 09 09 09 69 66 20 28 63 65 72 74 73 20 3d  .....if (certs =
108d0 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 2a 63  = NULL) {.....*c
108e0 6f 75 6e 74 20 3d 20 30 3b 0a 09 09 09 7d 0a 0a  ount = 0;....}..
108f0 09 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b  ...return(NULL);
10900 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28 63 65  ...}..}...if (ce
10910 72 74 73 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  rts == NULL) {..
10920 09 63 65 72 74 73 20 3d 20 6d 61 6c 6c 6f 63 28  .certs = malloc(
10930 73 69 7a 65 6f 66 28 2a 63 65 72 74 73 29 20 2a  sizeof(*certs) *
10940 20 35 29 3b 0a 09 09 2a 63 6f 75 6e 74 20 3d 20   5);...*count = 
10950 35 3b 0a 09 09 63 65 72 74 73 5f 72 65 73 69 7a  5;...certs_resiz
10960 61 62 6c 65 20 3d 20 31 3b 0a 09 7d 20 65 6c 73  able = 1;..} els
10970 65 20 7b 0a 09 09 63 65 72 74 73 5f 72 65 73 69  e {...certs_resi
10980 7a 61 62 6c 65 20 3d 20 30 3b 0a 09 7d 0a 0a 09  zable = 0;..}...
10990 69 66 20 28 70 69 76 29 20 7b 0a 09 09 66 6f 72  if (piv) {...for
109a0 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c   (idx = 0; idx <
109b0 20 33 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 09   3; idx++) {....
109c0 73 77 69 74 63 68 20 28 69 64 78 29 20 7b 0a 09  switch (idx) {..
109d0 09 09 09 63 61 73 65 20 30 3a 0a 09 09 09 09 09  ...case 0:......
109e0 70 69 76 5f 6f 69 64 20 3d 20 70 69 76 5f 6f 69  piv_oid = piv_oi
109f0 64 5f 70 69 76 61 75 74 68 3b 0a 09 09 09 09 09  d_pivauth;......
10a00 70 69 76 5f 6b 65 79 20 3d 20 4e 49 53 54 53 50  piv_key = NISTSP
10a10 38 30 30 5f 37 38 5f 33 5f 4b 45 59 5f 50 49 56  800_78_3_KEY_PIV
10a20 41 55 54 48 3b 0a 09 09 09 09 09 70 69 76 5f 6c  AUTH;......piv_l
10a30 61 62 65 6c 20 3d 20 22 41 75 74 68 65 6e 74 69  abel = "Authenti
10a40 63 61 74 69 6f 6e 22 3b 0a 09 09 09 09 09 62 72  cation";......br
10a50 65 61 6b 3b 0a 09 09 09 09 63 61 73 65 20 31 3a  eak;.....case 1:
10a60 0a 09 09 09 09 09 70 69 76 5f 6f 69 64 20 3d 20  ......piv_oid = 
10a70 70 69 76 5f 6f 69 64 5f 73 69 67 6e 61 74 75 72  piv_oid_signatur
10a80 65 3b 0a 09 09 09 09 09 70 69 76 5f 6b 65 79 20  e;......piv_key 
10a90 3d 20 4e 49 53 54 53 50 38 30 30 5f 37 38 5f 33  = NISTSP800_78_3
10aa0 5f 4b 45 59 5f 53 49 47 4e 41 54 55 52 45 3b 0a  _KEY_SIGNATURE;.
10ab0 09 09 09 09 09 70 69 76 5f 6c 61 62 65 6c 20 3d  .....piv_label =
10ac0 20 22 53 69 67 6e 61 74 75 72 65 22 3b 0a 09 09   "Signature";...
10ad0 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 63 61  ...break;.....ca
10ae0 73 65 20 32 3a 0a 09 09 09 09 09 70 69 76 5f 6f  se 2:......piv_o
10af0 69 64 20 3d 20 70 69 76 5f 6f 69 64 5f 6b 65 79  id = piv_oid_key
10b00 6d 67 74 3b 0a 09 09 09 09 09 70 69 76 5f 6b 65  mgt;......piv_ke
10b10 79 20 3d 20 4e 49 53 54 53 50 38 30 30 5f 37 38  y = NISTSP800_78
10b20 5f 33 5f 4b 45 59 5f 4b 45 59 4d 47 54 3b 0a 09  _3_KEY_KEYMGT;..
10b30 09 09 09 09 70 69 76 5f 6c 61 62 65 6c 20 3d 20  ....piv_label = 
10b40 22 4b 65 79 20 4d 61 6e 61 67 65 6d 65 6e 74 22  "Key Management"
10b50 3b 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  ;......break;...
10b60 09 7d 0a 0a 09 09 09 72 65 61 64 5f 72 65 74 20  .}.....read_ret 
10b70 3d 20 63 61 63 6b 65 79 5f 67 65 74 5f 64 61 74  = cackey_get_dat
10b80 61 28 73 6c 6f 74 2c 20 62 75 66 66 65 72 2c 20  a(slot, buffer, 
10b90 73 69 7a 65 6f 66 28 62 75 66 66 65 72 29 2c 20  sizeof(buffer), 
10ba0 70 69 76 5f 6f 69 64 29 3b 0a 0a 09 09 09 69 66  piv_oid);.....if
10bb0 20 28 72 65 61 64 5f 72 65 74 20 3c 3d 20 30 29   (read_ret <= 0)
10bc0 20 7b 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b   {.....continue;
10bd0 0a 09 09 09 7d 0a 0a 09 09 09 63 75 72 72 5f 69  ....}.....curr_i
10be0 64 20 3d 20 26 63 65 72 74 73 5b 6f 75 74 69 64  d = &certs[outid
10bf0 78 5d 3b 0a 09 09 09 6f 75 74 69 64 78 2b 2b 3b  x];....outidx++;
10c00 0a 0a 09 09 09 63 75 72 72 5f 69 64 2d 3e 6b 65  .....curr_id->ke
10c10 79 73 69 7a 65 20 3d 20 2d 31 3b 0a 09 09 09 63  ysize = -1;....c
10c20 75 72 72 5f 69 64 2d 3e 69 64 5f 74 79 70 65 20  urr_id->id_type 
10c30 3d 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45  = CACKEY_ID_TYPE
10c40 5f 50 49 56 3b 0a 09 09 09 63 75 72 72 5f 69 64  _PIV;....curr_id
10c50 2d 3e 63 61 72 64 2e 70 69 76 2e 6b 65 79 5f 69  ->card.piv.key_i
10c60 64 20 3d 20 70 69 76 5f 6b 65 79 3b 0a 09 09 09  d = piv_key;....
10c70 6d 65 6d 63 70 79 28 63 75 72 72 5f 69 64 2d 3e  memcpy(curr_id->
10c80 63 61 72 64 2e 70 69 76 2e 6c 61 62 65 6c 2c 20  card.piv.label, 
10c90 70 69 76 5f 6c 61 62 65 6c 2c 20 73 74 72 6c 65  piv_label, strle
10ca0 6e 28 70 69 76 5f 6c 61 62 65 6c 29 20 2b 20 31  n(piv_label) + 1
10cb0 29 3b 0a 0a 09 09 09 63 75 72 72 5f 69 64 2d 3e  );.....curr_id->
10cc0 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20  certificate_len 
10cd0 3d 20 72 65 61 64 5f 72 65 74 3b 0a 09 09 09 63  = read_ret;....c
10ce0 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63  urr_id->certific
10cf0 61 74 65 20 3d 20 6d 61 6c 6c 6f 63 28 63 75 72  ate = malloc(cur
10d00 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74  r_id->certificat
10d10 65 5f 6c 65 6e 29 3b 0a 0a 09 09 09 62 75 66 66  e_len);.....buff
10d20 65 72 5f 6c 65 6e 20 3d 20 73 69 7a 65 6f 66 28  er_len = sizeof(
10d30 62 75 66 66 65 72 29 3b 0a 09 09 09 62 75 66 66  buffer);....buff
10d40 65 72 5f 70 20 3d 20 63 61 63 6b 65 79 5f 72 65  er_p = cackey_re
10d50 61 64 5f 62 65 72 74 6c 76 5f 74 61 67 28 62 75  ad_bertlv_tag(bu
10d60 66 66 65 72 2c 20 26 62 75 66 66 65 72 5f 6c 65  ffer, &buffer_le
10d70 6e 2c 20 30 78 37 30 2c 20 63 75 72 72 5f 69 64  n, 0x70, curr_id
10d80 2d 3e 63 65 72 74 69 66 69 63 61 74 65 2c 20 26  ->certificate, &
10d90 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69  curr_id->certifi
10da0 63 61 74 65 5f 6c 65 6e 29 3b 0a 0a 09 09 09 69  cate_len);.....i
10db0 66 20 28 62 75 66 66 65 72 5f 70 20 3d 3d 20 4e  f (buffer_p == N
10dc0 55 4c 4c 29 20 7b 0a 09 09 09 09 43 41 43 4b 45  ULL) {.....CACKE
10dd0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
10de0 52 65 61 64 69 6e 67 20 63 65 72 74 69 66 69 63  Reading certific
10df0 61 74 65 20 66 72 6f 6d 20 42 45 52 2d 54 4c 56  ate from BER-TLV
10e00 20 72 65 73 70 6f 6e 73 65 20 66 61 69 6c 65 64   response failed
10e10 2c 20 73 6b 69 70 70 69 6e 67 20 6b 65 79 20 25  , skipping key %
10e20 69 22 2c 20 69 64 78 29 3b 0a 0a 09 09 09 09 66  i", idx);......f
10e30 72 65 65 28 63 75 72 72 5f 69 64 2d 3e 63 65 72  ree(curr_id->cer
10e40 74 69 66 69 63 61 74 65 29 3b 0a 0a 09 09 09 09  tificate);......
10e50 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69  curr_id->certifi
10e60 63 61 74 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09  cate = NULL;....
10e70 09 09 6f 75 74 69 64 78 2d 2d 3b 0a 0a 09 09 09  ..outidx--;.....
10e80 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 7d 0a  .continue;....}.
10e90 0a 23 69 66 64 65 66 20 48 41 56 45 5f 4c 49 42  .#ifdef HAVE_LIB
10ea0 5a 0a 09 09 09 69 66 20 28 63 75 72 72 5f 69 64  Z....if (curr_id
10eb0 2d 3e 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65  ->certificate_le
10ec0 6e 20 3e 20 34 29 20 7b 0a 09 09 09 09 69 66 20  n > 4) {.....if 
10ed0 28 6d 65 6d 63 6d 70 28 63 75 72 72 5f 69 64 2d  (memcmp(curr_id-
10ee0 3e 63 65 72 74 69 66 69 63 61 74 65 2c 20 22 5c  >certificate, "\
10ef0 78 31 66 5c 78 38 62 5c 78 30 38 5c 78 30 30 22  x1f\x8b\x08\x00"
10f00 2c 20 34 29 20 3d 3d 20 30 29 20 7b 0a 09 09 09  , 4) == 0) {....
10f10 09 09 74 6d 70 62 75 66 6c 65 6e 20 3d 20 63 75  ..tmpbuflen = cu
10f20 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61  rr_id->certifica
10f30 74 65 5f 6c 65 6e 20 2a 20 32 3b 0a 09 09 09 09  te_len * 2;.....
10f40 09 74 6d 70 62 75 66 20 3d 20 6d 61 6c 6c 6f 63  .tmpbuf = malloc
10f50 28 74 6d 70 62 75 66 6c 65 6e 29 3b 0a 0a 09 09  (tmpbuflen);....
10f60 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
10f70 50 52 49 4e 54 42 55 46 28 22 41 74 74 65 6d 70  PRINTBUF("Attemp
10f80 74 69 6e 67 20 74 6f 20 64 65 63 6f 6d 70 72 65  ting to decompre
10f90 73 73 3a 22 2c 20 63 75 72 72 5f 69 64 2d 3e 63  ss:", curr_id->c
10fa0 65 72 74 69 66 69 63 61 74 65 2c 20 63 75 72 72  ertificate, curr
10fb0 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65  _id->certificate
10fc0 5f 6c 65 6e 29 3b 0a 0a 09 09 09 09 09 67 7a 69  _len);.......gzi
10fd0 70 5f 73 74 72 65 61 6d 2e 7a 61 6c 6c 6f 63 20  p_stream.zalloc 
10fe0 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 67 7a 69  = NULL;......gzi
10ff0 70 5f 73 74 72 65 61 6d 2e 7a 66 72 65 65 20 3d  p_stream.zfree =
11000 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 67 7a 69 70   NULL;......gzip
11010 5f 73 74 72 65 61 6d 2e 6f 70 61 71 75 65 20 3d  _stream.opaque =
11020 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09 09 67 7a 69   NULL;.......gzi
11030 70 5f 73 74 72 65 61 6d 2e 6e 65 78 74 5f 69 6e  p_stream.next_in
11040 20 20 3d 20 63 75 72 72 5f 69 64 2d 3e 63 65 72    = curr_id->cer
11050 74 69 66 69 63 61 74 65 3b 0a 09 09 09 09 09 67  tificate;......g
11060 7a 69 70 5f 73 74 72 65 61 6d 2e 61 76 61 69 6c  zip_stream.avail
11070 5f 69 6e 20 3d 20 63 75 72 72 5f 69 64 2d 3e 63  _in = curr_id->c
11080 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 3b 0a  ertificate_len;.
11090 09 09 09 09 09 67 7a 69 70 5f 73 74 72 65 61 6d  .....gzip_stream
110a0 2e 6e 65 78 74 5f 6f 75 74 20 3d 20 74 6d 70 62  .next_out = tmpb
110b0 75 66 3b 0a 09 09 09 09 09 67 7a 69 70 5f 73 74  uf;......gzip_st
110c0 72 65 61 6d 2e 61 76 61 69 6c 5f 6f 75 74 20 3d  ream.avail_out =
110d0 20 74 6d 70 62 75 66 6c 65 6e 3b 0a 0a 09 09 09   tmpbuflen;.....
110e0 09 09 75 6e 63 6f 6d 70 72 65 73 73 5f 72 65 74  ..uncompress_ret
110f0 20 3d 20 69 6e 66 6c 61 74 65 49 6e 69 74 28 26   = inflateInit(&
11100 67 7a 69 70 5f 73 74 72 65 61 6d 29 3b 0a 09 09  gzip_stream);...
11110 09 09 09 69 66 20 28 75 6e 63 6f 6d 70 72 65 73  ...if (uncompres
11120 73 5f 72 65 74 20 3d 3d 20 5a 5f 4f 4b 29 20 7b  s_ret == Z_OK) {
11130 0a 09 09 09 09 09 09 75 6e 63 6f 6d 70 72 65 73  .......uncompres
11140 73 5f 72 65 74 20 3d 20 69 6e 66 6c 61 74 65 52  s_ret = inflateR
11150 65 73 65 74 32 28 26 67 7a 69 70 5f 73 74 72 65  eset2(&gzip_stre
11160 61 6d 2c 20 33 31 29 3b 0a 09 09 09 09 09 7d 0a  am, 31);......}.
11170 09 09 09 09 09 69 66 20 28 75 6e 63 6f 6d 70 72  .....if (uncompr
11180 65 73 73 5f 72 65 74 20 3d 3d 20 5a 5f 4f 4b 29  ess_ret == Z_OK)
11190 20 7b 0a 09 09 09 09 09 09 75 6e 63 6f 6d 70 72   {.......uncompr
111a0 65 73 73 5f 72 65 74 20 3d 20 69 6e 66 6c 61 74  ess_ret = inflat
111b0 65 28 26 67 7a 69 70 5f 73 74 72 65 61 6d 2c 20  e(&gzip_stream, 
111c0 30 29 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 09  0);......}......
111d0 69 66 20 28 75 6e 63 6f 6d 70 72 65 73 73 5f 72  if (uncompress_r
111e0 65 74 20 3d 3d 20 5a 5f 53 54 52 45 41 4d 5f 45  et == Z_STREAM_E
111f0 4e 44 29 20 7b 0a 09 09 09 09 09 09 75 6e 63 6f  ND) {.......unco
11200 6d 70 72 65 73 73 5f 72 65 74 20 3d 20 69 6e 66  mpress_ret = inf
11210 6c 61 74 65 45 6e 64 28 26 67 7a 69 70 5f 73 74  lateEnd(&gzip_st
11220 72 65 61 6d 29 3b 0a 09 09 09 09 09 7d 20 65 6c  ream);......} el
11230 73 65 20 7b 0a 09 09 09 09 09 09 75 6e 63 6f 6d  se {.......uncom
11240 70 72 65 73 73 5f 72 65 74 20 3d 20 5a 5f 44 41  press_ret = Z_DA
11250 54 41 5f 45 52 52 4f 52 3b 0a 09 09 09 09 09 7d  TA_ERROR;......}
11260 0a 09 09 09 09 09 69 66 20 28 75 6e 63 6f 6d 70  ......if (uncomp
11270 72 65 73 73 5f 72 65 74 20 3d 3d 20 5a 5f 4f 4b  ress_ret == Z_OK
11280 29 20 7b 0a 09 09 09 09 09 09 74 6d 70 62 75 66  ) {.......tmpbuf
11290 6c 65 6e 20 3d 20 67 7a 69 70 5f 73 74 72 65 61  len = gzip_strea
112a0 6d 2e 74 6f 74 61 6c 5f 6f 75 74 3b 0a 0a 09 09  m.total_out;....
112b0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
112c0 5f 50 52 49 4e 54 42 55 46 28 22 44 65 63 6f 6d  _PRINTBUF("Decom
112d0 70 72 65 73 73 65 64 20 74 6f 3a 22 2c 20 74 6d  pressed to:", tm
112e0 70 62 75 66 2c 20 74 6d 70 62 75 66 6c 65 6e 29  pbuf, tmpbuflen)
112f0 3b 0a 0a 09 09 09 09 09 09 66 72 65 65 28 63 75  ;........free(cu
11300 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61  rr_id->certifica
11310 74 65 29 3b 0a 0a 09 09 09 09 09 09 63 75 72 72  te);........curr
11320 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65  _id->certificate
11330 20 3d 20 74 6d 70 62 75 66 3b 0a 09 09 09 09 09   = tmpbuf;......
11340 09 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66  .curr_id->certif
11350 69 63 61 74 65 5f 6c 65 6e 20 3d 20 74 6d 70 62  icate_len = tmpb
11360 75 66 6c 65 6e 3b 0a 09 09 09 09 09 7d 20 65 6c  uflen;......} el
11370 73 65 20 7b 0a 09 09 09 09 09 09 43 41 43 4b 45  se {.......CACKE
11380 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
11390 44 65 63 6f 6d 70 72 65 73 73 69 6e 67 20 66 61  Decompressing fa
113a0 69 6c 65 64 21 20 75 6e 63 6f 6d 70 72 65 73 73  iled! uncompress
113b0 28 29 20 72 65 74 75 72 6e 65 64 20 25 69 22 2c  () returned %i",
113c0 20 75 6e 63 6f 6d 70 72 65 73 73 5f 72 65 74 29   uncompress_ret)
113d0 3b 0a 0a 09 09 09 09 09 09 66 72 65 65 28 74 6d  ;........free(tm
113e0 70 62 75 66 29 3b 0a 09 09 09 09 09 7d 0a 09 09  pbuf);......}...
113f0 09 09 7d 0a 09 09 09 7d 0a 23 65 6e 64 69 66 0a  ..}....}.#endif.
11400 09 09 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09  ..}..} else {...
11410 2f 2a 20 52 65 61 64 20 61 6c 6c 20 74 68 65 20  /* Read all the 
11420 61 70 70 6c 65 74 73 20 66 72 6f 6d 20 74 68 65  applets from the
11430 20 43 43 43 27 73 20 54 4c 56 20 2a 2f 0a 09 09   CCC's TLV */...
11440 63 63 63 5f 74 6c 76 20 3d 20 63 61 63 6b 65 79  ccc_tlv = cackey
11450 5f 72 65 61 64 5f 74 6c 76 28 73 6c 6f 74 29 3b  _read_tlv(slot);
11460 0a 0a 09 09 2f 2a 20 4c 6f 6f 6b 20 66 6f 72 20  ..../* Look for 
11470 43 41 52 44 55 52 4c 73 20 74 68 61 74 20 63 6f  CARDURLs that co
11480 6f 72 65 73 70 6f 6e 64 20 74 6f 20 50 4b 49 20  orespond to PKI 
11490 61 70 70 6c 65 74 73 20 2a 2f 0a 09 09 66 6f 72  applets */...for
114a0 20 28 63 63 63 5f 63 75 72 72 20 3d 20 63 63 63   (ccc_curr = ccc
114b0 5f 74 6c 76 3b 20 63 63 63 5f 63 75 72 72 3b 20  _tlv; ccc_curr; 
114c0 63 63 63 5f 63 75 72 72 20 3d 20 63 63 63 5f 63  ccc_curr = ccc_c
114d0 75 72 72 2d 3e 5f 6e 65 78 74 29 20 7b 0a 09 09  urr->_next) {...
114e0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
114f0 49 4e 54 46 28 22 46 6f 75 6e 64 20 74 61 67 3a  INTF("Found tag:
11500 20 25 73 20 2e 2e 2e 20 22 2c 20 43 41 43 4b 45   %s ... ", CACKE
11510 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 54 41 47  Y_DEBUG_FUNC_TAG
11520 5f 54 4f 5f 53 54 52 28 63 63 63 5f 63 75 72 72  _TO_STR(ccc_curr
11530 2d 3e 74 61 67 29 29 3b 0a 0a 09 09 09 69 66 20  ->tag));.....if 
11540 28 63 63 63 5f 63 75 72 72 2d 3e 74 61 67 20 21  (ccc_curr->tag !
11550 3d 20 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44  = GSCIS_TAG_CARD
11560 55 52 4c 29 20 7b 0a 09 09 09 09 43 41 43 4b 45  URL) {.....CACKE
11570 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
11580 20 20 2e 2e 2e 20 73 6b 69 70 70 69 6e 67 20 69    ... skipping i
11590 74 20 28 77 65 20 6f 6e 6c 79 20 63 61 72 65 20  t (we only care 
115a0 61 62 6f 75 74 20 43 41 52 44 55 52 4c 73 29 22  about CARDURLs)"
115b0 29 3b 0a 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65  );......continue
115c0 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 28  ;....}.....if ((
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 61 70 70 74 79 70 65  cardurl->apptype
115f0 20 26 20 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50   & CACKEY_TLV_AP
11600 50 5f 50 4b 49 29 20 21 3d 20 43 41 43 4b 45 59  P_PKI) != CACKEY
11610 5f 54 4c 56 5f 41 50 50 5f 50 4b 49 29 20 7b 0a  _TLV_APP_PKI) {.
11620 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
11630 5f 50 52 49 4e 54 46 28 22 20 20 2e 2e 2e 20 73  _PRINTF("  ... s
11640 6b 69 70 70 69 6e 67 20 69 74 20 28 77 65 20 6f  kipping it (we o
11650 6e 6c 79 20 63 61 72 65 20 61 62 6f 75 74 20 50  nly care about P
11660 4b 49 20 61 70 70 6c 65 74 73 2c 20 74 68 69 73  KI applets, this
11670 20 61 70 70 6c 65 74 20 73 75 70 70 6f 72 74 73   applet supports
11680 3a 20 25 73 2f 25 30 32 78 29 22 2c 20 43 41 43  : %s/%02x)", CAC
11690 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 41  KEY_DEBUG_FUNC_A
116a0 50 50 54 59 50 45 5f 54 4f 5f 53 54 52 28 63 63  PPTYPE_TO_STR(cc
116b0 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61  c_curr->value_ca
116c0 72 64 75 72 6c 2d 3e 61 70 70 74 79 70 65 29 2c  rdurl->apptype),
116d0 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20   (unsigned int) 
116e0 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f  ccc_curr->value_
116f0 63 61 72 64 75 72 6c 2d 3e 61 70 70 74 79 70 65  cardurl->apptype
11700 29 3b 0a 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65  );......continue
11710 3b 0a 09 09 09 7d 0a 0a 09 09 09 43 41 43 4b 45  ;....}.....CACKE
11720 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46  Y_DEBUG_PRINTBUF
11730 28 22 52 49 44 3a 22 2c 20 63 63 63 5f 63 75 72  ("RID:", ccc_cur
11740 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c  r->value_cardurl
11750 2d 3e 72 69 64 2c 20 73 69 7a 65 6f 66 28 63 63  ->rid, sizeof(cc
11760 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61  c_curr->value_ca
11770 72 64 75 72 6c 2d 3e 72 69 64 29 29 3b 0a 09 09  rdurl->rid));...
11780 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
11790 49 4e 54 46 28 22 41 70 70 49 44 20 3d 20 25 73  INTF("AppID = %s
117a0 2f 25 30 34 6c 78 22 2c 20 43 41 43 4b 45 59 5f  /%04lx", CACKEY_
117b0 44 45 42 55 47 5f 46 55 4e 43 5f 4f 42 4a 49 44  DEBUG_FUNC_OBJID
117c0 5f 54 4f 5f 53 54 52 28 63 63 63 5f 63 75 72 72  _TO_STR(ccc_curr
117d0 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d  ->value_cardurl-
117e0 3e 61 70 70 69 64 29 2c 20 28 75 6e 73 69 67 6e  >appid), (unsign
117f0 65 64 20 6c 6f 6e 67 29 20 63 63 63 5f 63 75 72  ed long) ccc_cur
11800 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c  r->value_cardurl
11810 2d 3e 61 70 70 69 64 29 3b 0a 09 09 09 43 41 43  ->appid);....CAC
11820 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
11830 28 22 4f 62 6a 65 63 74 49 44 20 3d 20 25 73 2f  ("ObjectID = %s/
11840 25 30 34 6c 78 22 2c 20 43 41 43 4b 45 59 5f 44  %04lx", CACKEY_D
11850 45 42 55 47 5f 46 55 4e 43 5f 4f 42 4a 49 44 5f  EBUG_FUNC_OBJID_
11860 54 4f 5f 53 54 52 28 63 63 63 5f 63 75 72 72 2d  TO_STR(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 2c 20 28 75 6e 73 69  objectid), (unsi
11890 67 6e 65 64 20 6c 6f 6e 67 29 20 63 63 63 5f 63  gned long) ccc_c
118a0 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75  urr->value_cardu
118b0 72 6c 2d 3e 6f 62 6a 65 63 74 69 64 29 3b 0a 0a  rl->objectid);..
118c0 09 09 09 6d 65 6d 63 70 79 28 63 75 72 72 5f 61  ...memcpy(curr_a
118d0 69 64 2c 20 63 63 63 5f 63 75 72 72 2d 3e 76 61  id, ccc_curr->va
118e0 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 72 69 64  lue_cardurl->rid
118f0 2c 20 73 69 7a 65 6f 66 28 63 63 63 5f 63 75 72  , sizeof(ccc_cur
11900 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c  r->value_cardurl
11910 2d 3e 72 69 64 29 29 3b 0a 09 09 09 63 75 72 72  ->rid));....curr
11920 5f 61 69 64 5b 73 69 7a 65 6f 66 28 63 75 72 72  _aid[sizeof(curr
11930 5f 61 69 64 29 20 2d 20 32 5d 20 3d 20 28 63 63  _aid) - 2] = (cc
11940 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61  c_curr->value_ca
11950 72 64 75 72 6c 2d 3e 61 70 70 69 64 20 3e 3e 20  rdurl->appid >> 
11960 38 29 20 26 20 30 78 66 66 3b 0a 09 09 09 63 75  8) & 0xff;....cu
11970 72 72 5f 61 69 64 5b 73 69 7a 65 6f 66 28 63 75  rr_aid[sizeof(cu
11980 72 72 5f 61 69 64 29 20 2d 20 31 5d 20 3d 20 63  rr_aid) - 1] = c
11990 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63  cc_curr->value_c
119a0 61 72 64 75 72 6c 2d 3e 61 70 70 69 64 20 26 20  ardurl->appid & 
119b0 30 78 66 66 3b 0a 0a 09 09 09 2f 2a 20 53 65 6c  0xff;...../* Sel
119c0 65 63 74 20 66 6f 75 6e 64 20 61 70 70 6c 65 74  ect found applet
119d0 20 2e 2e 2e 20 2a 2f 0a 09 09 09 73 65 6c 65 63   ... */....selec
119e0 74 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73  t_ret = cackey_s
119f0 65 6c 65 63 74 5f 61 70 70 6c 65 74 28 73 6c 6f  elect_applet(slo
11a00 74 2c 20 63 75 72 72 5f 61 69 64 2c 20 73 69 7a  t, curr_aid, siz
11a10 65 6f 66 28 63 75 72 72 5f 61 69 64 29 29 3b 0a  eof(curr_aid));.
11a20 09 09 09 69 66 20 28 73 65 6c 65 63 74 5f 72 65  ...if (select_re
11a30 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43  t != CACKEY_PCSC
11a40 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 09 43 41 43  _S_OK) {.....CAC
11a50 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
11a60 28 22 46 61 69 6c 65 64 20 74 6f 20 73 65 6c 65  ("Failed to sele
11a70 63 74 20 61 70 70 6c 65 74 2c 20 73 6b 69 70 70  ct applet, skipp
11a80 69 6e 67 20 70 72 6f 63 65 73 73 69 6e 67 20 6f  ing processing o
11a90 66 20 74 68 69 73 20 6f 62 6a 65 63 74 22 29 3b  f this object");
11aa0 0a 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a  ......continue;.
11ab0 09 09 09 7d 0a 0a 09 09 09 2f 2a 20 2e 2e 2e 20  ...}...../* ... 
11ac0 61 6e 64 20 6f 62 6a 65 63 74 20 28 66 69 6c 65  and object (file
11ad0 29 20 2a 2f 0a 09 09 09 73 65 6c 65 63 74 5f 72  ) */....select_r
11ae0 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6c 65  et = cackey_sele
11af0 63 74 5f 66 69 6c 65 28 73 6c 6f 74 2c 20 63 63  ct_file(slot, cc
11b00 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61  c_curr->value_ca
11b10 72 64 75 72 6c 2d 3e 6f 62 6a 65 63 74 69 64 29  rdurl->objectid)
11b20 3b 0a 09 09 09 69 66 20 28 73 65 6c 65 63 74 5f  ;....if (select_
11b30 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43  ret != CACKEY_PC
11b40 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 09 43  SC_S_OK) {.....C
11b50 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
11b60 54 46 28 22 46 61 69 6c 65 64 20 74 6f 20 73 65  TF("Failed to se
11b70 6c 65 63 74 20 66 69 6c 65 2c 20 73 6b 69 70 70  lect file, skipp
11b80 69 6e 67 20 70 72 6f 63 65 73 73 69 6e 67 20 6f  ing processing o
11b90 66 20 74 68 69 73 20 6f 62 6a 65 63 74 22 29 3b  f this object");
11ba0 0a 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a  ......continue;.
11bb0 09 09 09 7d 0a 0a 09 09 09 2f 2a 20 50 72 6f 63  ...}...../* Proc
11bc0 65 73 73 20 74 68 69 73 20 66 69 6c 65 27 73 20  ess this file's 
11bd0 54 4c 56 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20  TLV looking for 
11be0 63 65 72 74 69 66 69 63 61 74 65 73 20 2a 2f 0a  certificates */.
11bf0 09 09 09 61 70 70 5f 74 6c 76 20 3d 20 63 61 63  ...app_tlv = cac
11c00 6b 65 79 5f 72 65 61 64 5f 74 6c 76 28 73 6c 6f  key_read_tlv(slo
11c10 74 29 3b 0a 09 0a 09 09 09 66 6f 72 20 28 61 70  t);......for (ap
11c20 70 5f 63 75 72 72 20 3d 20 61 70 70 5f 74 6c 76  p_curr = app_tlv
11c30 3b 20 61 70 70 5f 63 75 72 72 3b 20 61 70 70 5f  ; app_curr; app_
11c40 63 75 72 72 20 3d 20 61 70 70 5f 63 75 72 72 2d  curr = app_curr-
11c50 3e 5f 6e 65 78 74 29 20 7b 0a 09 09 09 09 43 41  >_next) {.....CA
11c60 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
11c70 46 28 22 46 6f 75 6e 64 20 74 61 67 3a 20 25 73  F("Found tag: %s
11c80 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ", CACKEY_DEBUG_
11c90 46 55 4e 43 5f 54 41 47 5f 54 4f 5f 53 54 52 28  FUNC_TAG_TO_STR(
11ca0 61 70 70 5f 63 75 72 72 2d 3e 74 61 67 29 29 3b  app_curr->tag));
11cb0 0a 09 09 09 09 69 66 20 28 61 70 70 5f 63 75 72  .....if (app_cur
11cc0 72 2d 3e 74 61 67 20 21 3d 20 47 53 43 49 53 5f  r->tag != GSCIS_
11cd0 54 41 47 5f 43 45 52 54 49 46 49 43 41 54 45 29  TAG_CERTIFICATE)
11ce0 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44   {......CACKEY_D
11cf0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 20 2e  EBUG_PRINTF("  .
11d00 2e 2e 20 73 6b 69 70 70 69 6e 67 20 69 74 20 28  .. skipping it (
11d10 77 65 20 6f 6e 6c 79 20 63 61 72 65 20 61 62 6f  we only care abo
11d20 75 74 20 43 45 52 54 49 46 49 43 41 54 45 73 29  ut CERTIFICATEs)
11d30 22 29 3b 0a 0a 09 09 09 09 09 63 6f 6e 74 69 6e  ");.......contin
11d40 75 65 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 63  ue;.....}......c
11d50 75 72 72 5f 69 64 20 3d 20 26 63 65 72 74 73 5b  urr_id = &certs[
11d60 6f 75 74 69 64 78 5d 3b 0a 09 09 09 09 6f 75 74  outidx];.....out
11d70 69 64 78 2b 2b 3b 0a 0a 09 09 09 09 63 75 72 72  idx++;......curr
11d80 5f 69 64 2d 3e 69 64 5f 74 79 70 65 20 3d 20 43  _id->id_type = C
11d90 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43 41  ACKEY_ID_TYPE_CA
11da0 43 3b 0a 09 09 09 09 6d 65 6d 63 70 79 28 63 75  C;.....memcpy(cu
11db0 72 72 5f 69 64 2d 3e 63 61 72 64 2e 63 61 63 2e  rr_id->card.cac.
11dc0 61 70 70 6c 65 74 2c 20 63 75 72 72 5f 61 69 64  applet, curr_aid
11dd0 2c 20 73 69 7a 65 6f 66 28 63 75 72 72 5f 69 64  , sizeof(curr_id
11de0 2d 3e 63 61 72 64 2e 63 61 63 2e 61 70 70 6c 65  ->card.cac.apple
11df0 74 29 29 3b 0a 09 09 09 09 63 75 72 72 5f 69 64  t));.....curr_id
11e00 2d 3e 63 61 72 64 2e 63 61 63 2e 66 69 6c 65 20  ->card.cac.file 
11e10 3d 20 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75  = ccc_curr->valu
11e20 65 5f 63 61 72 64 75 72 6c 2d 3e 6f 62 6a 65 63  e_cardurl->objec
11e30 74 69 64 3b 0a 09 09 09 09 63 75 72 72 5f 69 64  tid;.....curr_id
11e40 2d 3e 6b 65 79 73 69 7a 65 20 3d 20 2d 31 3b 0a  ->keysize = -1;.
11e50 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
11e60 47 5f 50 52 49 4e 54 46 28 22 46 69 6c 6c 69 6e  G_PRINTF("Fillin
11e70 67 20 63 75 72 72 5f 69 64 2d 3e 63 61 72 64 2e  g curr_id->card.
11e80 63 61 63 2e 61 70 70 6c 65 74 20 28 25 70 29 20  cac.applet (%p) 
11e90 77 69 74 68 20 25 6c 75 20 62 79 74 65 73 3a 22  with %lu bytes:"
11ea0 2c 20 63 75 72 72 5f 69 64 2d 3e 63 61 72 64 2e  , curr_id->card.
11eb0 63 61 63 2e 61 70 70 6c 65 74 2c 20 28 75 6e 73  cac.applet, (uns
11ec0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69 7a 65  igned long) size
11ed0 6f 66 28 63 75 72 72 5f 69 64 2d 3e 63 61 72 64  of(curr_id->card
11ee0 2e 63 61 63 2e 61 70 70 6c 65 74 29 29 3b 0a 09  .cac.applet));..
11ef0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
11f00 50 52 49 4e 54 42 55 46 28 22 56 41 4c 3a 22 2c  PRINTBUF("VAL:",
11f10 20 63 75 72 72 5f 69 64 2d 3e 63 61 72 64 2e 63   curr_id->card.c
11f20 61 63 2e 61 70 70 6c 65 74 2c 20 73 69 7a 65 6f  ac.applet, sizeo
11f30 66 28 63 75 72 72 5f 69 64 2d 3e 63 61 72 64 2e  f(curr_id->card.
11f40 63 61 63 2e 61 70 70 6c 65 74 29 29 3b 0a 0a 09  cac.applet));...
11f50 09 09 09 63 75 72 72 5f 69 64 2d 3e 63 65 72 74  ...curr_id->cert
11f60 69 66 69 63 61 74 65 5f 6c 65 6e 20 3d 20 61 70  ificate_len = ap
11f70 70 5f 63 75 72 72 2d 3e 6c 65 6e 67 74 68 3b 0a  p_curr->length;.
11f80 0a 09 09 09 09 63 75 72 72 5f 69 64 2d 3e 63 65  .....curr_id->ce
11f90 72 74 69 66 69 63 61 74 65 20 3d 20 6d 61 6c 6c  rtificate = mall
11fa0 6f 63 28 63 75 72 72 5f 69 64 2d 3e 63 65 72 74  oc(curr_id->cert
11fb0 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a 09 09  ificate_len);...
11fc0 09 09 6d 65 6d 63 70 79 28 63 75 72 72 5f 69 64  ..memcpy(curr_id
11fd0 2d 3e 63 65 72 74 69 66 69 63 61 74 65 2c 20 61  ->certificate, a
11fe0 70 70 5f 63 75 72 72 2d 3e 76 61 6c 75 65 2c 20  pp_curr->value, 
11ff0 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69  curr_id->certifi
12000 63 61 74 65 5f 6c 65 6e 29 3b 0a 0a 09 09 09 09  cate_len);......
12010 69 66 20 28 6f 75 74 69 64 78 20 3e 3d 20 2a 63  if (outidx >= *c
12020 6f 75 6e 74 29 20 7b 0a 09 09 09 09 09 69 66 20  ount) {......if 
12030 28 63 65 72 74 73 5f 72 65 73 69 7a 61 62 6c 65  (certs_resizable
12040 29 20 7b 0a 09 09 09 09 09 09 2a 63 6f 75 6e 74  ) {.......*count
12050 20 2a 3d 20 32 3b 0a 09 09 09 09 09 09 69 66 20   *= 2;.......if 
12060 28 2a 63 6f 75 6e 74 20 21 3d 20 30 29 20 7b 0a  (*count != 0) {.
12070 09 09 09 09 09 09 09 63 65 72 74 73 20 3d 20 72  .......certs = r
12080 65 61 6c 6c 6f 63 28 63 65 72 74 73 2c 20 73 69  ealloc(certs, si
12090 7a 65 6f 66 28 2a 63 65 72 74 73 29 20 2a 20 28  zeof(*certs) * (
120a0 2a 63 6f 75 6e 74 29 29 3b 0a 09 09 09 09 09 09  *count));.......
120b0 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09 09  } else {........
120c0 63 65 72 74 73 20 3d 20 4e 55 4c 4c 3b 0a 09 09  certs = NULL;...
120d0 09 09 09 09 7d 0a 09 09 09 09 09 7d 20 65 6c 73  ....}......} els
120e0 65 20 7b 0a 09 09 09 09 09 09 62 72 65 61 6b 3b  e {.......break;
120f0 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 09 09  ......}.....}...
12100 09 7d 0a 0a 09 09 09 63 61 63 6b 65 79 5f 66 72  .}.....cackey_fr
12110 65 65 5f 74 6c 76 28 61 70 70 5f 74 6c 76 29 3b  ee_tlv(app_tlv);
12120 0a 0a 09 09 09 69 66 20 28 6f 75 74 69 64 78 20  .....if (outidx 
12130 3e 3d 20 2a 63 6f 75 6e 74 29 20 7b 0a 09 09 09  >= *count) {....
12140 09 62 72 65 61 6b 3b 0a 09 09 09 7d 0a 09 09 7d  .break;....}...}
12150 0a 0a 09 09 63 61 63 6b 65 79 5f 66 72 65 65 5f  ....cackey_free_
12160 74 6c 76 28 63 63 63 5f 74 6c 76 29 3b 0a 09 7d  tlv(ccc_tlv);..}
12170 0a 0a 09 2a 63 6f 75 6e 74 20 3d 20 6f 75 74 69  ...*count = outi
12180 64 78 3b 0a 0a 09 69 66 20 28 63 65 72 74 73 5f  dx;...if (certs_
12190 72 65 73 69 7a 61 62 6c 65 29 20 7b 0a 09 09 69  resizable) {...i
121a0 66 20 28 2a 63 6f 75 6e 74 20 21 3d 20 30 29 20  f (*count != 0) 
121b0 7b 0a 09 09 09 63 65 72 74 73 20 3d 20 72 65 61  {....certs = rea
121c0 6c 6c 6f 63 28 63 65 72 74 73 2c 20 73 69 7a 65  lloc(certs, size
121d0 6f 66 28 2a 63 65 72 74 73 29 20 2a 20 28 2a 63  of(*certs) * (*c
121e0 6f 75 6e 74 29 29 3b 0a 09 09 7d 20 65 6c 73 65  ount));...} else
121f0 20 7b 0a 09 09 09 66 72 65 65 28 63 65 72 74 73   {....free(certs
12200 29 3b 0a 0a 09 09 09 63 65 72 74 73 20 3d 20 4e  );.....certs = N
12210 55 4c 4c 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 73 6c  ULL;...}..}...sl
12220 6f 74 2d 3e 63 61 63 68 65 64 5f 63 65 72 74 73  ot->cached_certs
12230 20 3d 20 63 61 63 6b 65 79 5f 63 6f 70 79 5f 63   = cackey_copy_c
12240 65 72 74 73 28 4e 55 4c 4c 2c 20 63 65 72 74 73  erts(NULL, certs
12250 2c 20 2a 63 6f 75 6e 74 29 3b 0a 09 73 6c 6f 74  , *count);..slot
12260 2d 3e 63 61 63 68 65 64 5f 63 65 72 74 73 5f 63  ->cached_certs_c
12270 6f 75 6e 74 20 3d 20 2a 63 6f 75 6e 74 3b 0a 0a  ount = *count;..
12280 09 2f 2a 20 54 65 72 6d 69 6e 61 74 65 20 53 6d  ./* Terminate Sm
12290 61 72 74 43 61 72 64 20 54 72 61 6e 73 61 63 74  artCard Transact
122a0 69 6f 6e 20 2a 2f 0a 09 63 61 63 6b 65 79 5f 65  ion */..cackey_e
122b0 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73  nd_transaction(s
122c0 6c 6f 74 29 3b 0a 0a 09 72 65 74 75 72 6e 28 63  lot);...return(c
122d0 65 72 74 73 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20  erts);.}../*. * 
122e0 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20  SYNPOSIS. *     
122f0 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45  .... *. * ARGUME
12300 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20  NTS. *     .... 
12310 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55  *. * RETURN VALU
12320 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a  E. *     .... *.
12330 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20   * NOTES. *     
12340 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69  .... *. */.stati
12350 63 20 73 73 69 7a 65 5f 74 20 63 61 63 6b 65 79  c ssize_t cackey
12360 5f 73 69 67 6e 64 65 63 72 79 70 74 28 73 74 72  _signdecrypt(str
12370 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20  uct cackey_slot 
12380 2a 73 6c 6f 74 2c 20 73 74 72 75 63 74 20 63 61  *slot, struct ca
12390 63 6b 65 79 5f 69 64 65 6e 74 69 74 79 20 2a 69  ckey_identity *i
123a0 64 65 6e 74 69 74 79 2c 20 75 6e 73 69 67 6e 65  dentity, unsigne
123b0 64 20 63 68 61 72 20 2a 62 75 66 2c 20 73 69 7a  d char *buf, siz
123c0 65 5f 74 20 62 75 66 6c 65 6e 2c 20 75 6e 73 69  e_t buflen, unsi
123d0 67 6e 65 64 20 63 68 61 72 20 2a 6f 75 74 62 75  gned char *outbu
123e0 66 2c 20 73 69 7a 65 5f 74 20 6f 75 74 62 75 66  f, size_t outbuf
123f0 6c 65 6e 2c 20 69 6e 74 20 70 61 64 49 6e 70 75  len, int padInpu
12400 74 2c 20 69 6e 74 20 75 6e 70 61 64 4f 75 74 70  t, int unpadOutp
12410 75 74 29 20 7b 0a 09 63 61 63 6b 65 79 5f 70 63  ut) {..cackey_pc
12420 73 63 5f 69 64 5f 74 79 70 65 20 69 64 5f 74 79  sc_id_type id_ty
12430 70 65 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68  pe;..unsigned ch
12440 61 72 20 64 79 6e 5f 61 75 74 68 5f 74 65 6d 70  ar dyn_auth_temp
12450 6c 61 74 65 5b 31 30 5d 2c 20 2a 64 79 6e 5f 61  late[10], *dyn_a
12460 75 74 68 5f 74 6d 70 62 75 66 3b 0a 09 75 6e 73  uth_tmpbuf;..uns
12470 69 67 6e 65 64 20 63 68 61 72 20 2a 74 6d 70 62  igned char *tmpb
12480 75 66 2c 20 2a 74 6d 70 62 75 66 5f 73 2c 20 2a  uf, *tmpbuf_s, *
12490 6f 75 74 62 75 66 5f 73 2c 20 2a 6f 75 74 62 75  outbuf_s, *outbu
124a0 66 5f 70 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63  f_p;..unsigned c
124b0 68 61 72 20 62 79 74 65 73 5f 74 6f 5f 73 65 6e  har bytes_to_sen
124c0 64 2c 20 70 31 2c 20 63 6c 61 73 73 3b 0a 09 75  d, p1, class;..u
124d0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 62 6c 6f  nsigned char blo
124e0 63 6b 74 79 70 65 3b 0a 09 63 61 63 6b 65 79 5f  cktype;..cackey_
124f0 72 65 74 20 73 65 6e 64 5f 72 65 74 3b 0a 09 75  ret send_ret;..u
12500 69 6e 74 31 36 5f 74 20 72 65 73 70 63 6f 64 65  int16_t respcode
12510 3b 0a 09 73 73 69 7a 65 5f 74 20 72 65 74 76 61  ;..ssize_t retva
12520 6c 20 3d 20 30 2c 20 75 6e 70 61 64 6f 66 66 73  l = 0, unpadoffs
12530 65 74 3b 0a 09 73 69 7a 65 5f 74 20 74 6d 70 62  et;..size_t tmpb
12540 75 66 6c 65 6e 2c 20 70 61 64 6c 65 6e 2c 20 74  uflen, padlen, t
12550 6d 70 6f 75 74 62 75 66 6c 65 6e 2c 20 6f 75 74  mpoutbuflen, out
12560 62 75 66 5f 6c 65 6e 3b 0a 09 69 6e 74 20 66 72  buf_len;..int fr
12570 65 65 5f 74 6d 70 62 75 66 20 3d 20 30 3b 0a 09  ee_tmpbuf = 0;..
12580 69 6e 74 20 6c 65 3b 0a 0a 09 43 41 43 4b 45 59  int le;...CACKEY
12590 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
125a0 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
125b0 73 6c 6f 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  slot == NULL) {.
125c0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
125d0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 73  RINTF("Error.  s
125e0 6c 6f 74 20 69 73 20 4e 55 4c 4c 22 29 3b 0a 0a  lot is NULL");..
125f0 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d  ..return(-1);..}
12600 0a 0a 09 69 66 20 28 62 75 66 20 3d 3d 20 4e 55  ...if (buf == NU
12610 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
12620 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
12630 6f 72 2e 20 20 62 75 66 20 69 73 20 4e 55 4c 4c  or.  buf is NULL
12640 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31  ");....return(-1
12650 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 6f 75 74 62  );..}...if (outb
12660 75 66 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  uf == NULL) {...
12670 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
12680 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 6f 75 74  NTF("Error.  out
12690 62 75 66 20 69 73 20 4e 55 4c 4c 22 29 3b 0a 0a  buf is NULL");..
126a0 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d  ..return(-1);..}
126b0 0a 0a 09 69 66 20 28 69 64 65 6e 74 69 74 79 20  ...if (identity 
126c0 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43  == NULL) {...CAC
126d0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
126e0 28 22 45 72 72 6f 72 2e 20 20 69 64 65 6e 74 69  ("Error.  identi
126f0 74 79 20 69 73 20 4e 55 4c 4c 22 29 3b 0a 0a 09  ty is NULL");...
12700 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a  .return(-1);..}.
12710 0a 09 69 66 20 28 69 64 65 6e 74 69 74 79 2d 3e  ..if (identity->
12720 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 3d 3d  pcsc_identity ==
12730 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
12740 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
12750 45 72 72 6f 72 2e 20 20 69 64 65 6e 74 69 74 79  Error.  identity
12760 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20  ->pcsc_identity 
12770 69 73 20 4e 55 4c 4c 22 29 3b 0a 0a 09 09 72 65  is NULL");....re
12780 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 69  turn(-1);..}...i
12790 64 5f 74 79 70 65 20 3d 20 69 64 65 6e 74 69 74  d_type = identit
127a0 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79  y->pcsc_identity
127b0 2d 3e 69 64 5f 74 79 70 65 3b 0a 09 69 66 20 28  ->id_type;..if (
127c0 69 64 5f 74 79 70 65 20 3d 3d 20 43 41 43 4b 45  id_type == CACKE
127d0 59 5f 49 44 5f 54 59 50 45 5f 43 45 52 54 5f 4f  Y_ID_TYPE_CERT_O
127e0 4e 4c 59 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  NLY) {...CACKEY_
127f0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
12800 72 6f 72 2e 20 20 69 64 65 6e 74 69 74 79 2d 3e  ror.  identity->
12810 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 69 73  pcsc_identity is
12820 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f   CACKEY_ID_TYPE_
12830 43 45 52 54 5f 4f 4e 4c 59 2c 20 77 68 69 63 68  CERT_ONLY, which
12840 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 20   cannot be used 
12850 66 6f 72 20 73 69 67 6e 2f 64 65 63 72 79 70 74  for sign/decrypt
12860 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31  ");....return(-1
12870 29 3b 0a 09 7d 0a 0a 09 73 77 69 74 63 68 20 28  );..}...switch (
12880 69 64 5f 74 79 70 65 29 20 7b 0a 09 09 63 61 73  id_type) {...cas
12890 65 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45  e CACKEY_ID_TYPE
128a0 5f 50 49 56 3a 0a 09 09 63 61 73 65 20 43 41 43  _PIV:...case CAC
128b0 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43 41 43 3a  KEY_ID_TYPE_CAC:
128c0 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 64 65 66  ....break;...def
128d0 61 75 6c 74 3a 0a 09 09 09 43 41 43 4b 45 59 5f  ault:....CACKEY_
128e0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
128f0 72 6f 72 2e 20 20 69 64 65 6e 74 69 74 79 2d 3e  ror.  identity->
12900 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 69 73  pcsc_identity is
12910 20 6e 6f 74 20 61 20 73 75 70 70 6f 72 74 65 64   not a supported
12920 20 76 61 6c 75 65 2e 20 54 79 70 65 20 69 73 3a   value. Type is:
12930 20 30 78 25 6c 78 20 28 50 49 56 20 3d 20 30 78   0x%lx (PIV = 0x
12940 25 6c 78 2c 20 43 41 43 20 3d 20 30 78 25 6c 78  %lx, CAC = 0x%lx
12950 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  )", (unsigned lo
12960 6e 67 29 20 69 64 5f 74 79 70 65 2c 20 28 75 6e  ng) id_type, (un
12970 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 43 41 43  signed long) CAC
12980 4b 45 59 5f 49 44 5f 54 59 50 45 5f 50 49 56 2c  KEY_ID_TYPE_PIV,
12990 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
129a0 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f   CACKEY_ID_TYPE_
129b0 43 41 43 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e  CAC);.....return
129c0 28 2d 31 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65  (-1);..}.../* De
129d0 74 65 72 6d 69 6e 65 20 69 64 65 6e 74 69 74 79  termine identity
129e0 20 4b 65 79 20 73 69 7a 65 20 2a 2f 0a 09 69 66   Key size */..if
129f0 20 28 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63   (identity->pcsc
12a00 5f 69 64 65 6e 74 69 74 79 2d 3e 6b 65 79 73 69  _identity->keysi
12a10 7a 65 20 3c 20 30 29 20 7b 0a 09 09 69 64 65 6e  ze < 0) {...iden
12a20 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74  tity->pcsc_ident
12a30 69 74 79 2d 3e 6b 65 79 73 69 7a 65 20 3d 20 78  ity->keysize = x
12a40 35 30 39 5f 74 6f 5f 6b 65 79 73 69 7a 65 28 69  509_to_keysize(i
12a50 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64  dentity->pcsc_id
12a60 65 6e 74 69 74 79 2d 3e 63 65 72 74 69 66 69 63  entity->certific
12a70 61 74 65 2c 20 69 64 65 6e 74 69 74 79 2d 3e 70  ate, identity->p
12a80 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 63 65  csc_identity->ce
12a90 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a  rtificate_len);.
12aa0 09 7d 0a 0a 09 2f 2a 20 50 61 64 20 6d 65 73 73  .}.../* Pad mess
12ab0 61 67 65 20 74 6f 20 6b 65 79 20 73 69 7a 65 20  age to key size 
12ac0 2a 2f 0a 09 69 66 20 28 70 61 64 49 6e 70 75 74  */..if (padInput
12ad0 29 20 7b 0a 09 09 69 66 20 28 69 64 65 6e 74 69  ) {...if (identi
12ae0 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74  ty->pcsc_identit
12af0 79 2d 3e 6b 65 79 73 69 7a 65 20 3e 20 30 29 20  y->keysize > 0) 
12b00 7b 0a 09 09 09 69 66 20 28 62 75 66 6c 65 6e 20  {....if (buflen 
12b10 21 3d 20 69 64 65 6e 74 69 74 79 2d 3e 70 63 73  != identity->pcs
12b20 63 5f 69 64 65 6e 74 69 74 79 2d 3e 6b 65 79 73  c_identity->keys
12b30 69 7a 65 29 20 7b 0a 09 09 09 09 69 66 20 28 62  ize) {.....if (b
12b40 75 66 6c 65 6e 20 3e 20 28 69 64 65 6e 74 69 74  uflen > (identit
12b50 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79  y->pcsc_identity
12b60 2d 3e 6b 65 79 73 69 7a 65 20 2d 20 33 29 29 20  ->keysize - 3)) 
12b70 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45  {......CACKEY_DE
12b80 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
12b90 72 2e 20 20 4d 65 73 73 61 67 65 20 69 73 20 74  r.  Message is t
12ba0 6f 6f 20 6c 61 72 67 65 20 74 6f 20 73 69 67 6e  oo large to sign
12bb0 2f 64 65 63 72 79 70 74 22 29 3b 0a 0a 09 09 09  /decrypt");.....
12bc0 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09  ..return(-1);...
12bd0 09 09 7d 0a 0a 09 09 09 09 74 6d 70 62 75 66 6c  ..}......tmpbufl
12be0 65 6e 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e 70  en = identity->p
12bf0 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 6b 65  csc_identity->ke
12c00 79 73 69 7a 65 3b 0a 09 09 09 09 74 6d 70 62 75  ysize;.....tmpbu
12c10 66 20 3d 20 6d 61 6c 6c 6f 63 28 74 6d 70 62 75  f = malloc(tmpbu
12c20 66 6c 65 6e 29 3b 0a 09 09 09 09 66 72 65 65 5f  flen);.....free_
12c30 74 6d 70 62 75 66 20 3d 20 31 3b 0a 0a 09 09 09  tmpbuf = 1;.....
12c40 09 70 61 64 6c 65 6e 20 3d 20 74 6d 70 62 75 66  .padlen = tmpbuf
12c50 6c 65 6e 20 2d 20 62 75 66 6c 65 6e 20 2d 20 33  len - buflen - 3
12c60 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  ;......CACKEY_DE
12c70 42 55 47 5f 50 52 49 4e 54 46 28 22 4e 65 65 64  BUG_PRINTF("Need
12c80 20 74 6f 20 70 61 64 20 74 68 65 20 62 75 66 66   to pad the buff
12c90 65 72 20 77 69 74 68 20 25 6c 6c 75 20 62 79 74  er with %llu byt
12ca0 65 73 20 28 74 6d 70 62 75 66 6c 65 6e 20 3d 20  es (tmpbuflen = 
12cb0 25 6c 6c 75 2c 20 62 75 66 6c 65 6e 20 3d 20 25  %llu, buflen = %
12cc0 6c 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64  llu)", (unsigned
12cd0 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20 70 61 64 6c   long long) padl
12ce0 65 6e 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  en, (unsigned lo
12cf0 6e 67 20 6c 6f 6e 67 29 20 74 6d 70 62 75 66 6c  ng long) tmpbufl
12d00 65 6e 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  en, (unsigned lo
12d10 6e 67 20 6c 6f 6e 67 29 20 62 75 66 6c 65 6e 29  ng long) buflen)
12d20 3b 0a 0a 09 09 09 09 2f 2a 20 52 53 41 20 50 4b  ;....../* RSA PK
12d30 43 53 23 31 20 45 4d 53 41 2d 50 4b 43 53 31 2d  CS#1 EMSA-PKCS1-
12d40 76 31 5f 35 20 50 61 64 64 69 6e 67 20 2a 2f 0a  v1_5 Padding */.
12d50 09 09 09 09 74 6d 70 62 75 66 5b 30 5d 20 3d 20  ....tmpbuf[0] = 
12d60 30 78 30 30 3b 0a 09 09 09 09 74 6d 70 62 75 66  0x00;.....tmpbuf
12d70 5b 31 5d 20 3d 20 30 78 30 31 3b 0a 09 09 09 09  [1] = 0x01;.....
12d80 6d 65 6d 73 65 74 28 26 74 6d 70 62 75 66 5b 32  memset(&tmpbuf[2
12d90 5d 2c 20 30 78 46 46 2c 20 70 61 64 6c 65 6e 29  ], 0xFF, padlen)
12da0 3b 0a 09 09 09 09 74 6d 70 62 75 66 5b 70 61 64  ;.....tmpbuf[pad
12db0 6c 65 6e 20 2b 20 32 5d 3d 20 30 78 30 30 3b 0a  len + 2]= 0x00;.
12dc0 09 09 09 09 6d 65 6d 63 70 79 28 26 74 6d 70 62  ....memcpy(&tmpb
12dd0 75 66 5b 70 61 64 6c 65 6e 20 2b 20 33 5d 2c 20  uf[padlen + 3], 
12de0 62 75 66 2c 20 62 75 66 6c 65 6e 29 3b 0a 0a 09  buf, buflen);...
12df0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
12e00 50 52 49 4e 54 42 55 46 28 22 55 6e 70 61 64 64  PRINTBUF("Unpadd
12e10 65 64 3a 22 2c 20 62 75 66 2c 20 62 75 66 6c 65  ed:", buf, bufle
12e20 6e 29 3b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  n);.....CACKEY_D
12e30 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22 50  EBUG_PRINTBUF("P
12e40 61 64 64 65 64 3a 22 2c 20 74 6d 70 62 75 66 2c  added:", tmpbuf,
12e50 20 74 6d 70 62 75 66 6c 65 6e 29 3b 0a 09 09 09   tmpbuflen);....
12e60 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 74 6d 70  } else {.....tmp
12e70 62 75 66 20 3d 20 62 75 66 3b 0a 09 09 09 09 74  buf = buf;.....t
12e80 6d 70 62 75 66 6c 65 6e 20 3d 20 62 75 66 6c 65  mpbuflen = bufle
12e90 6e 3b 0a 09 09 09 09 66 72 65 65 5f 74 6d 70 62  n;.....free_tmpb
12ea0 75 66 20 3d 20 30 3b 0a 09 09 09 09 70 61 64 6c  uf = 0;.....padl
12eb0 65 6e 20 3d 20 30 3b 0a 09 09 09 7d 0a 09 09 7d  en = 0;....}...}
12ec0 20 65 6c 73 65 20 7b 0a 09 09 09 43 41 43 4b 45   else {....CACKE
12ed0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
12ee0 55 6e 61 62 6c 65 20 74 6f 20 64 65 74 65 72 6d  Unable to determ
12ef0 69 6e 65 20 6b 65 79 20 73 69 7a 65 2c 20 68 6f  ine key size, ho
12f00 70 69 6e 67 20 74 68 65 20 6d 65 73 73 61 67 65  ping the message
12f10 20 69 73 20 70 72 6f 70 65 72 6c 79 20 70 61 64   is properly pad
12f20 64 65 64 21 22 29 3b 0a 0a 09 09 09 74 6d 70 62  ded!");.....tmpb
12f30 75 66 20 3d 20 62 75 66 3b 0a 09 09 09 74 6d 70  uf = buf;....tmp
12f40 62 75 66 6c 65 6e 20 3d 20 62 75 66 6c 65 6e 3b  buflen = buflen;
12f50 0a 09 09 09 66 72 65 65 5f 74 6d 70 62 75 66 20  ....free_tmpbuf 
12f60 3d 20 30 3b 0a 09 09 09 70 61 64 6c 65 6e 20 3d  = 0;....padlen =
12f70 20 30 3b 0a 09 09 7d 0a 09 7d 20 65 6c 73 65 20   0;...}..} else 
12f80 7b 0a 09 09 74 6d 70 62 75 66 20 3d 20 62 75 66  {...tmpbuf = buf
12f90 3b 0a 09 09 74 6d 70 62 75 66 6c 65 6e 20 3d 20  ;...tmpbuflen = 
12fa0 62 75 66 6c 65 6e 3b 0a 09 09 66 72 65 65 5f 74  buflen;...free_t
12fb0 6d 70 62 75 66 20 3d 20 30 3b 0a 09 09 70 61 64  mpbuf = 0;...pad
12fc0 6c 65 6e 20 3d 20 30 3b 0a 09 7d 0a 0a 09 2f 2a  len = 0;..}.../*
12fd0 20 42 65 67 69 6e 20 74 72 61 6e 73 61 63 74 69   Begin transacti
12fe0 6f 6e 20 2a 2f 0a 09 63 61 63 6b 65 79 5f 62 65  on */..cackey_be
12ff0 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  gin_transaction(
13000 73 6c 6f 74 29 3b 0a 0a 09 2f 2a 20 53 65 6c 65  slot);.../* Sele
13010 63 74 20 63 6f 72 72 65 63 74 20 61 70 70 6c 65  ct correct apple
13020 74 20 2a 2f 0a 09 73 77 69 74 63 68 20 28 69 64  t */..switch (id
13030 5f 74 79 70 65 29 20 7b 0a 09 09 63 61 73 65 20  _type) {...case 
13040 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43  CACKEY_ID_TYPE_C
13050 41 43 3a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  AC:....CACKEY_DE
13060 42 55 47 5f 50 52 49 4e 54 46 28 22 53 65 6c 65  BUG_PRINTF("Sele
13070 63 74 69 6e 67 20 61 70 70 6c 65 74 20 66 6f 75  cting applet fou
13080 6e 64 20 61 74 20 25 70 20 2e 2e 2e 22 2c 20 69  nd at %p ...", i
13090 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64  dentity->pcsc_id
130a0 65 6e 74 69 74 79 2d 3e 63 61 72 64 2e 63 61 63  entity->card.cac
130b0 2e 61 70 70 6c 65 74 29 3b 0a 09 09 09 63 61 63  .applet);....cac
130c0 6b 65 79 5f 73 65 6c 65 63 74 5f 61 70 70 6c 65  key_select_apple
130d0 74 28 73 6c 6f 74 2c 20 69 64 65 6e 74 69 74 79  t(slot, identity
130e0 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d  ->pcsc_identity-
130f0 3e 63 61 72 64 2e 63 61 63 2e 61 70 70 6c 65 74  >card.cac.applet
13100 2c 20 73 69 7a 65 6f 66 28 69 64 65 6e 74 69 74  , sizeof(identit
13110 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79  y->pcsc_identity
13120 2d 3e 63 61 72 64 2e 63 61 63 2e 61 70 70 6c 65  ->card.cac.apple
13130 74 29 29 3b 0a 0a 09 09 09 2f 2a 20 53 65 6c 65  t));...../* Sele
13140 63 74 20 63 6f 72 72 65 63 74 20 66 69 6c 65 20  ct correct file 
13150 2a 2f 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 6c  */....cackey_sel
13160 65 63 74 5f 66 69 6c 65 28 73 6c 6f 74 2c 20 69  ect_file(slot, i
13170 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64  dentity->pcsc_id
13180 65 6e 74 69 74 79 2d 3e 63 61 72 64 2e 63 61 63  entity->card.cac
13190 2e 66 69 6c 65 29 3b 0a 09 09 09 62 72 65 61 6b  .file);....break
131a0 3b 0a 09 09 63 61 73 65 20 43 41 43 4b 45 59 5f  ;...case CACKEY_
131b0 49 44 5f 54 59 50 45 5f 50 49 56 3a 0a 09 09 09  ID_TYPE_PIV:....
131c0 64 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74  dyn_auth_templat
131d0 65 5b 30 5d 20 3d 20 30 78 37 43 3b 0a 09 09 09  e[0] = 0x7C;....
131e0 64 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74  dyn_auth_templat
131f0 65 5b 31 5d 20 3d 20 30 78 38 32 3b 0a 09 09 09  e[1] = 0x82;....
13200 64 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74  dyn_auth_templat
13210 65 5b 32 5d 20 3d 20 28 28 74 6d 70 62 75 66 6c  e[2] = ((tmpbufl
13220 65 6e 20 2b 20 36 29 20 26 20 30 78 66 66 30 30  en + 6) & 0xff00
13230 29 20 3e 3e 20 38 3b 0a 09 09 09 64 79 6e 5f 61  ) >> 8;....dyn_a
13240 75 74 68 5f 74 65 6d 70 6c 61 74 65 5b 33 5d 20  uth_template[3] 
13250 3d 20 28 74 6d 70 62 75 66 6c 65 6e 20 2b 20 36  = (tmpbuflen + 6
13260 29 20 26 20 30 78 30 30 66 66 3b 0a 09 09 09 64  ) & 0x00ff;....d
13270 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74 65  yn_auth_template
13280 5b 34 5d 20 3d 20 30 78 38 32 3b 0a 09 09 09 64  [4] = 0x82;....d
13290 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74 65  yn_auth_template
132a0 5b 35 5d 20 3d 20 30 78 30 30 3b 0a 09 09 09 64  [5] = 0x00;....d
132b0 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74 65  yn_auth_template
132c0 5b 36 5d 20 3d 20 30 78 38 31 3b 0a 09 09 09 64  [6] = 0x81;....d
132d0 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74 65  yn_auth_template
132e0 5b 37 5d 20 3d 20 30 78 38 32 3b 0a 09 09 09 64  [7] = 0x82;....d
132f0 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74 65  yn_auth_template
13300 5b 38 5d 20 3d 20 28 74 6d 70 62 75 66 6c 65 6e  [8] = (tmpbuflen
13310 20 26 20 30 78 66 66 30 30 29 20 3e 3e 20 38 3b   & 0xff00) >> 8;
13320 0a 09 09 09 64 79 6e 5f 61 75 74 68 5f 74 65 6d  ....dyn_auth_tem
13330 70 6c 61 74 65 5b 39 5d 20 3d 20 74 6d 70 62 75  plate[9] = tmpbu
13340 66 6c 65 6e 20 26 20 30 78 30 30 66 66 3b 0a 0a  flen & 0x00ff;..
13350 09 09 09 64 79 6e 5f 61 75 74 68 5f 74 6d 70 62  ...dyn_auth_tmpb
13360 75 66 20 3d 20 6d 61 6c 6c 6f 63 28 74 6d 70 62  uf = malloc(tmpb
13370 75 66 6c 65 6e 20 2b 20 73 69 7a 65 6f 66 28 64  uflen + sizeof(d
13380 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74 65  yn_auth_template
13390 29 29 3b 0a 09 09 09 6d 65 6d 63 70 79 28 64 79  ));....memcpy(dy
133a0 6e 5f 61 75 74 68 5f 74 6d 70 62 75 66 2c 20 64  n_auth_tmpbuf, d
133b0 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74 65  yn_auth_template
133c0 2c 20 73 69 7a 65 6f 66 28 64 79 6e 5f 61 75 74  , sizeof(dyn_aut
133d0 68 5f 74 65 6d 70 6c 61 74 65 29 29 3b 0a 09 09  h_template));...
133e0 09 6d 65 6d 63 70 79 28 64 79 6e 5f 61 75 74 68  .memcpy(dyn_auth
133f0 5f 74 6d 70 62 75 66 20 2b 20 73 69 7a 65 6f 66  _tmpbuf + sizeof
13400 28 64 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61  (dyn_auth_templa
13410 74 65 29 2c 20 74 6d 70 62 75 66 2c 20 74 6d 70  te), tmpbuf, tmp
13420 62 75 66 6c 65 6e 29 3b 0a 0a 09 09 09 69 66 20  buflen);.....if 
13430 28 66 72 65 65 5f 74 6d 70 62 75 66 29 20 7b 0a  (free_tmpbuf) {.
13440 09 09 09 09 66 72 65 65 28 74 6d 70 62 75 66 29  ....free(tmpbuf)
13450 3b 0a 09 09 09 7d 0a 0a 09 09 09 74 6d 70 62 75  ;....}.....tmpbu
13460 66 6c 65 6e 20 2b 3d 20 73 69 7a 65 6f 66 28 64  flen += sizeof(d
13470 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74 65  yn_auth_template
13480 29 3b 0a 09 09 09 74 6d 70 62 75 66 20 3d 20 64  );....tmpbuf = d
13490 79 6e 5f 61 75 74 68 5f 74 6d 70 62 75 66 3b 0a  yn_auth_tmpbuf;.
134a0 09 09 09 66 72 65 65 5f 74 6d 70 62 75 66 20 3d  ...free_tmpbuf =
134b0 20 31 3b 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09   1;.....break;..
134c0 09 63 61 73 65 20 43 41 43 4b 45 59 5f 49 44 5f  .case CACKEY_ID_
134d0 54 59 50 45 5f 43 45 52 54 5f 4f 4e 4c 59 3a 0a  TYPE_CERT_ONLY:.
134e0 09 09 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 74  ...break;..}...t
134f0 6d 70 62 75 66 5f 73 20 3d 20 74 6d 70 62 75 66  mpbuf_s = tmpbuf
13500 3b 0a 09 6f 75 74 62 75 66 5f 73 20 3d 20 6f 75  ;..outbuf_s = ou
13510 74 62 75 66 3b 0a 09 77 68 69 6c 65 20 28 74 6d  tbuf;..while (tm
13520 70 62 75 66 6c 65 6e 29 20 7b 0a 09 09 74 6d 70  pbuflen) {...tmp
13530 6f 75 74 62 75 66 6c 65 6e 20 3d 20 6f 75 74 62  outbuflen = outb
13540 75 66 6c 65 6e 3b 0a 0a 09 09 69 66 20 28 74 6d  uflen;....if (tm
13550 70 62 75 66 6c 65 6e 20 3e 20 43 41 43 4b 45 59  pbuflen > CACKEY
13560 5f 41 50 44 55 5f 4d 54 55 29 20 7b 0a 09 09 09  _APDU_MTU) {....
13570 62 79 74 65 73 5f 74 6f 5f 73 65 6e 64 20 3d 20  bytes_to_send = 
13580 43 41 43 4b 45 59 5f 41 50 44 55 5f 4d 54 55 3b  CACKEY_APDU_MTU;
13590 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 62  ...} else {....b
135a0 79 74 65 73 5f 74 6f 5f 73 65 6e 64 20 3d 20 74  ytes_to_send = t
135b0 6d 70 62 75 66 6c 65 6e 3b 0a 09 09 7d 0a 0a 09  mpbuflen;...}...
135c0 09 73 65 6e 64 5f 72 65 74 20 3d 20 43 41 43 4b  .send_ret = CACK
135d0 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49  EY_PCSC_E_GENERI
135e0 43 3b 0a 09 09 73 77 69 74 63 68 20 28 69 64 5f  C;...switch (id_
135f0 74 79 70 65 29 20 7b 0a 09 09 09 63 61 73 65 20  type) {....case 
13600 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43  CACKEY_ID_TYPE_C
13610 41 43 3a 0a 09 09 09 09 69 66 20 28 74 6d 70 62  AC:.....if (tmpb
13620 75 66 6c 65 6e 20 3e 20 43 41 43 4b 45 59 5f 41  uflen > CACKEY_A
13630 50 44 55 5f 4d 54 55 29 20 7b 0a 09 09 09 09 09  PDU_MTU) {......
13640 70 31 20 3d 20 30 78 38 30 3b 0a 09 09 09 09 09  p1 = 0x80;......
13650 6c 65 20 3d 20 30 78 30 30 3b 0a 09 09 09 09 7d  le = 0x00;.....}
13660 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 70 31 20   else {......p1 
13670 3d 20 30 78 30 30 3b 0a 09 09 09 09 09 6c 65 20  = 0x00;......le 
13680 3d 20 30 78 30 30 3b 0a 09 09 09 09 7d 0a 0a 09  = 0x00;.....}...
13690 09 09 09 73 65 6e 64 5f 72 65 74 20 3d 20 63 61  ...send_ret = ca
136a0 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 73  ckey_send_apdu(s
136b0 6c 6f 74 2c 20 47 53 43 49 53 5f 43 4c 41 53 53  lot, GSCIS_CLASS
136c0 5f 47 4c 4f 42 41 4c 5f 50 4c 41 54 46 4f 52 4d  _GLOBAL_PLATFORM
136d0 2c 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 53 49  , GSCIS_INSTR_SI
136e0 47 4e 44 45 43 52 59 50 54 2c 20 70 31 2c 20 30  GNDECRYPT, p1, 0
136f0 78 30 30 2c 20 62 79 74 65 73 5f 74 6f 5f 73 65  x00, bytes_to_se
13700 6e 64 2c 20 74 6d 70 62 75 66 2c 20 6c 65 2c 20  nd, tmpbuf, le, 
13710 26 72 65 73 70 63 6f 64 65 2c 20 6f 75 74 62 75  &respcode, outbu
13720 66 2c 20 26 74 6d 70 6f 75 74 62 75 66 6c 65 6e  f, &tmpoutbuflen
13730 29 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  );.....break;...
13740 09 63 61 73 65 20 43 41 43 4b 45 59 5f 49 44 5f  .case CACKEY_ID_
13750 54 59 50 45 5f 50 49 56 3a 0a 09 09 09 09 69 66  TYPE_PIV:.....if
13760 20 28 74 6d 70 62 75 66 6c 65 6e 20 3e 20 43 41   (tmpbuflen > CA
13770 43 4b 45 59 5f 41 50 44 55 5f 4d 54 55 29 20 7b  CKEY_APDU_MTU) {
13780 0a 09 09 09 09 09 63 6c 61 73 73 20 3d 20 30 78  ......class = 0x
13790 31 30 3b 0a 09 09 09 09 09 6c 65 20 3d 20 30 78  10;......le = 0x
137a0 30 30 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b  00;.....} else {
137b0 0a 09 09 09 09 09 63 6c 61 73 73 20 3d 20 47 53  ......class = GS
137c0 43 49 53 5f 43 4c 41 53 53 5f 49 53 4f 37 38 31  CIS_CLASS_ISO781
137d0 36 3b 0a 09 09 09 09 09 6c 65 20 3d 20 32 35 36  6;......le = 256
137e0 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 73 65 6e  ;.....}......sen
137f0 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73  d_ret = cackey_s
13800 65 6e 64 5f 61 70 64 75 28 73 6c 6f 74 2c 20 63  end_apdu(slot, c
13810 6c 61 73 73 2c 20 4e 49 53 54 53 50 38 30 30 5f  lass, NISTSP800_
13820 37 33 5f 33 5f 49 4e 53 54 52 5f 47 45 4e 41 55  73_3_INSTR_GENAU
13830 54 48 2c 20 4e 49 53 54 53 50 38 30 30 5f 37 38  TH, NISTSP800_78
13840 5f 33 5f 41 4c 47 4f 5f 52 53 41 32 30 34 38 2c  _3_ALGO_RSA2048,
13850 20 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f   identity->pcsc_
13860 69 64 65 6e 74 69 74 79 2d 3e 63 61 72 64 2e 70  identity->card.p
13870 69 76 2e 6b 65 79 5f 69 64 2c 20 62 79 74 65 73  iv.key_id, bytes
13880 5f 74 6f 5f 73 65 6e 64 2c 20 74 6d 70 62 75 66  _to_send, tmpbuf
13890 2c 20 6c 65 2c 20 26 72 65 73 70 63 6f 64 65 2c  , le, &respcode,
138a0 20 6f 75 74 62 75 66 2c 20 26 74 6d 70 6f 75 74   outbuf, &tmpout
138b0 62 75 66 6c 65 6e 29 3b 0a 09 09 09 09 62 72 65  buflen);.....bre
138c0 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 41 43 4b  ak;....case CACK
138d0 45 59 5f 49 44 5f 54 59 50 45 5f 43 45 52 54 5f  EY_ID_TYPE_CERT_
138e0 4f 4e 4c 59 3a 0a 09 09 09 09 62 72 65 61 6b 3b  ONLY:.....break;
138f0 0a 09 09 7d 0a 0a 09 09 69 66 20 28 73 65 6e 64  ...}....if (send
13900 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50  _ret != CACKEY_P
13910 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 69  CSC_S_OK) {....i
13920 66 20 28 66 72 65 65 5f 74 6d 70 62 75 66 29 20  f (free_tmpbuf) 
13930 7b 0a 09 09 09 09 69 66 20 28 74 6d 70 62 75 66  {.....if (tmpbuf
13940 5f 73 29 20 7b 0a 09 09 09 09 09 66 72 65 65 28  _s) {......free(
13950 74 6d 70 62 75 66 5f 73 29 3b 0a 09 09 09 09 7d  tmpbuf_s);.....}
13960 0a 09 09 09 7d 0a 0a 09 09 09 2f 2a 20 45 6e 64  ....}...../* End
13970 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a   transaction */.
13980 09 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72  ...cackey_end_tr
13990 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b  ansaction(slot);
139a0 0a 0a 09 09 09 69 66 20 28 73 65 6e 64 5f 72 65  .....if (send_re
139b0 74 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43  t == CACKEY_PCSC
139c0 5f 45 5f 52 45 54 52 59 29 20 7b 0a 09 09 09 09  _E_RETRY) {.....
139d0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
139e0 4e 54 46 28 22 41 44 50 55 20 53 65 6e 64 69 6e  NTF("ADPU Sendin
139f0 67 20 46 61 69 6c 65 64 20 2d 2d 20 72 65 74 72  g Failed -- retr
13a00 79 69 6e 67 2e 22 29 3b 0a 0a 09 09 09 09 72 65  ying.");......re
13a10 74 75 72 6e 28 63 61 63 6b 65 79 5f 73 69 67 6e  turn(cackey_sign
13a20 64 65 63 72 79 70 74 28 73 6c 6f 74 2c 20 69 64  decrypt(slot, id
13a30 65 6e 74 69 74 79 2c 20 62 75 66 2c 20 62 75 66  entity, buf, buf
13a40 6c 65 6e 2c 20 6f 75 74 62 75 66 2c 20 6f 75 74  len, outbuf, out
13a50 62 75 66 6c 65 6e 2c 20 70 61 64 49 6e 70 75 74  buflen, padInput
13a60 2c 20 75 6e 70 61 64 4f 75 74 70 75 74 29 29 3b  , unpadOutput));
13a70 0a 09 09 09 7d 0a 0a 09 09 09 43 41 43 4b 45 59  ....}.....CACKEY
13a80 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 41  _DEBUG_PRINTF("A
13a90 44 50 55 20 53 65 6e 64 69 6e 67 20 46 61 69 6c  DPU Sending Fail
13aa0 65 64 20 2d 2d 20 72 65 74 75 72 6e 69 6e 67 20  ed -- returning 
13ab0 69 6e 20 65 72 72 6f 72 2e 22 29 3b 0a 0a 09 09  in error.");....
13ac0 09 69 66 20 28 72 65 73 70 63 6f 64 65 20 3d 3d  .if (respcode ==
13ad0 20 30 78 36 39 38 32 20 7c 7c 20 72 65 73 70 63   0x6982 || respc
13ae0 6f 64 65 20 3d 3d 20 30 78 36 65 30 30 29 20 7b  ode == 0x6e00) {
13af0 0a 09 09 09 09 69 66 20 28 72 65 73 70 63 6f 64  .....if (respcod
13b00 65 20 3d 3d 20 30 78 36 45 30 30 29 20 7b 0a 09  e == 0x6E00) {..
13b10 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
13b20 5f 50 52 49 4e 54 46 28 22 47 6f 74 20 5c 22 57  _PRINTF("Got \"W
13b30 52 4f 4e 47 20 43 4c 41 53 53 5c 22 2c 20 74 68  RONG CLASS\", th
13b40 69 73 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20  is means we are 
13b50 74 61 6c 6b 69 6e 67 20 74 6f 20 74 68 65 20 77  talking to the w
13b60 72 6f 6e 67 20 6f 62 6a 65 63 74 20 28 6c 69 6b  rong object (lik
13b70 65 6c 79 20 62 65 63 61 75 73 65 20 74 68 65 20  ely because the 
13b80 63 61 72 64 20 77 65 6e 74 20 61 77 61 79 29 20  card went away) 
13b90 2d 2d 20 72 65 73 65 74 74 69 6e 67 22 29 3b 0a  -- resetting");.
13ba0 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ....} else {....
13bb0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
13bc0 52 49 4e 54 46 28 22 53 65 63 75 72 69 74 79 20  RINTF("Security 
13bd0 73 74 61 74 75 73 20 6e 6f 74 20 73 61 74 69 73  status not satis
13be0 69 66 69 65 64 20 28 72 65 73 70 63 6f 64 65 20  ified (respcode 
13bf0 3d 20 30 78 25 30 34 78 29 2e 20 20 52 65 74 75  = 0x%04x).  Retu
13c00 72 6e 69 6e 67 20 4e 45 45 44 4c 4f 47 49 4e 22  rning NEEDLOGIN"
13c10 2c 20 28 69 6e 74 29 20 72 65 73 70 63 6f 64 65  , (int) respcode
13c20 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 63 61  );.....}......ca
13c30 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72  ckey_mark_slot_r
13c40 65 73 65 74 28 73 6c 6f 74 29 3b 0a 0a 09 09 09  eset(slot);.....
13c50 09 73 6c 6f 74 2d 3e 74 6f 6b 65 6e 5f 66 6c 61  .slot->token_fla
13c60 67 73 20 3d 20 43 4b 46 5f 4c 4f 47 49 4e 5f 52  gs = CKF_LOGIN_R
13c70 45 51 55 49 52 45 44 3b 0a 0a 09 09 09 09 72 65  EQUIRED;......re
13c80 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
13c90 5f 45 5f 4e 45 45 44 4c 4f 47 49 4e 29 3b 0a 09  _E_NEEDLOGIN);..
13ca0 09 09 7d 0a 0a 09 09 09 69 66 20 28 73 65 6e 64  ..}.....if (send
13cb0 5f 72 65 74 20 3d 3d 20 43 41 43 4b 45 59 5f 50  _ret == CACKEY_P
13cc0 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e  CSC_E_TOKENABSEN
13cd0 54 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f  T) {.....CACKEY_
13ce0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54 6f  DEBUG_PRINTF("To
13cf0 6b 65 6e 20 61 62 73 65 6e 74 2e 20 20 52 65 74  ken absent.  Ret
13d00 75 72 6e 69 6e 67 20 54 4f 4b 45 4e 41 42 53 45  urning TOKENABSE
13d10 4e 54 22 29 3b 0a 0a 09 09 09 09 63 61 63 6b 65  NT");......cacke
13d20 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65 73 65  y_mark_slot_rese
13d30 74 28 73 6c 6f 74 29 3b 0a 0a 09 09 09 09 72 65  t(slot);......re
13d40 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
13d50 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b  _E_TOKENABSENT);
13d60 0a 09 09 09 7d 0a 0a 09 09 09 43 41 43 4b 45 59  ....}.....CACKEY
13d70 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53  _DEBUG_PRINTF("S
13d80 6f 6d 65 74 68 69 6e 67 20 77 65 6e 74 20 77 72  omething went wr
13d90 6f 6e 67 20 64 75 72 69 6e 67 20 73 69 67 6e 69  ong during signi
13da0 6e 67 2c 20 72 65 73 65 74 74 69 6e 67 20 74 68  ng, resetting th
13db0 65 20 73 6c 6f 74 20 61 6e 64 20 68 6f 70 69 6e  e slot and hopin
13dc0 67 20 66 6f 72 20 74 68 65 20 62 65 73 74 2e 22  g for the best."
13dd0 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 6d 61  );.....cackey_ma
13de0 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74 28 73 6c  rk_slot_reset(sl
13df0 6f 74 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28  ot);.....return(
13e00 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45  CACKEY_PCSC_E_GE
13e10 4e 45 52 49 43 29 3b 0a 09 09 7d 0a 0a 09 09 74  NERIC);...}....t
13e20 6d 70 62 75 66 20 2b 3d 20 62 79 74 65 73 5f 74  mpbuf += bytes_t
13e30 6f 5f 73 65 6e 64 3b 0a 09 09 74 6d 70 62 75 66  o_send;...tmpbuf
13e40 6c 65 6e 20 2d 3d 20 62 79 74 65 73 5f 74 6f 5f  len -= bytes_to_
13e50 73 65 6e 64 3b 0a 0a 09 09 6f 75 74 62 75 66 20  send;....outbuf 
13e60 2b 3d 20 74 6d 70 6f 75 74 62 75 66 6c 65 6e 3b  += tmpoutbuflen;
13e70 0a 09 09 6f 75 74 62 75 66 6c 65 6e 20 2d 3d 20  ...outbuflen -= 
13e80 74 6d 70 6f 75 74 62 75 66 6c 65 6e 3b 0a 09 09  tmpoutbuflen;...
13e90 72 65 74 76 61 6c 20 2b 3d 20 74 6d 70 6f 75 74  retval += tmpout
13ea0 62 75 66 6c 65 6e 3b 0a 09 7d 0a 0a 09 69 66 20  buflen;..}...if 
13eb0 28 66 72 65 65 5f 74 6d 70 62 75 66 29 20 7b 0a  (free_tmpbuf) {.
13ec0 09 09 69 66 20 28 74 6d 70 62 75 66 5f 73 29 20  ..if (tmpbuf_s) 
13ed0 7b 0a 09 09 09 66 72 65 65 28 74 6d 70 62 75 66  {....free(tmpbuf
13ee0 5f 73 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 6f 75  _s);...}..}...ou
13ef0 74 62 75 66 20 3d 20 6f 75 74 62 75 66 5f 73 3b  tbuf = outbuf_s;
13f00 0a 0a 09 2f 2a 20 45 6e 64 20 74 72 61 6e 73 61  .../* End transa
13f10 63 74 69 6f 6e 20 2a 2f 0a 09 63 61 63 6b 65 79  ction */..cackey
13f20 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
13f30 28 73 6c 6f 74 29 3b 0a 0a 23 69 66 64 65 66 20  (slot);..#ifdef 
13f40 43 41 43 4b 45 59 5f 50 41 52 41 4e 4f 49 44 0a  CACKEY_PARANOID.
13f50 23 20 20 69 66 64 65 66 20 5f 50 4f 53 49 58 5f  #  ifdef _POSIX_
13f60 53 53 49 5a 45 5f 4d 41 58 0a 09 69 66 20 28 6f  SSIZE_MAX..if (o
13f70 75 74 62 75 66 6c 65 6e 20 3e 20 5f 50 4f 53 49  utbuflen > _POSI
13f80 58 5f 53 53 49 5a 45 5f 4d 41 58 29 20 7b 0a 09  X_SSIZE_MAX) {..
13f90 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
13fa0 49 4e 54 46 28 22 4f 75 74 62 75 66 6c 65 6e 20  INTF("Outbuflen 
13fb0 65 78 63 65 65 64 73 20 6d 61 78 69 6d 75 6d 20  exceeds maximum 
13fc0 76 61 6c 75 65 2c 20 72 65 74 75 72 6e 69 6e 67  value, returning
13fd0 20 69 6e 20 66 61 69 6c 75 72 65 2e 20 28 6d 61   in failure. (ma
13fe0 78 20 3d 20 25 6c 69 2c 20 6f 75 74 62 75 66 6c  x = %li, outbufl
13ff0 65 6e 20 3d 20 25 6c 75 29 22 2c 20 28 6c 6f 6e  en = %lu)", (lon
14000 67 29 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f  g) _POSIX_SSIZE_
14010 4d 41 58 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  MAX, (unsigned l
14020 6f 6e 67 29 20 6f 75 74 62 75 66 6c 65 6e 29 3b  ong) outbuflen);
14030 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a  ....return(-1);.
14040 09 7d 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64  .}.#  endif.#end
14050 69 66 0a 0a 09 2f 2a 20 57 65 20 6d 75 73 74 20  if.../* We must 
14060 72 65 6d 6f 76 65 20 74 68 65 20 22 37 43 22 20  remove the "7C" 
14070 74 61 67 20 74 6f 20 67 65 74 20 74 6f 20 74 68  tag to get to th
14080 65 20 73 69 67 6e 61 74 75 72 65 20 2a 2f 0a 09  e signature */..
14090 73 77 69 74 63 68 20 28 69 64 5f 74 79 70 65 29  switch (id_type)
140a0 20 7b 0a 09 09 63 61 73 65 20 43 41 43 4b 45 59   {...case CACKEY
140b0 5f 49 44 5f 54 59 50 45 5f 50 49 56 3a 0a 09 09  _ID_TYPE_PIV:...
140c0 09 6f 75 74 62 75 66 5f 6c 65 6e 20 3d 20 72 65  .outbuf_len = re
140d0 74 76 61 6c 3b 0a 09 09 09 6f 75 74 62 75 66 5f  tval;....outbuf_
140e0 70 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f  p = cackey_read_
140f0 62 65 72 74 6c 76 5f 74 61 67 28 6f 75 74 62 75  bertlv_tag(outbu
14100 66 2c 20 26 6f 75 74 62 75 66 5f 6c 65 6e 2c 20  f, &outbuf_len, 
14110 30 78 37 43 2c 20 4e 55 4c 4c 2c 20 20 26 6f 75  0x7C, NULL,  &ou
14120 74 62 75 66 5f 6c 65 6e 29 3b 0a 09 09 09 69 66  tbuf_len);....if
14130 20 28 6f 75 74 62 75 66 5f 70 20 3d 3d 20 4e 55   (outbuf_p == NU
14140 4c 4c 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59  LL) {.....CACKEY
14150 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
14160 65 73 70 6f 6e 73 65 20 66 72 6f 6d 20 50 49 56  esponse from PIV
14170 20 66 6f 72 20 47 45 4e 45 52 41 54 45 20 41 55   for GENERATE AU
14180 54 48 45 4e 54 49 43 41 54 49 4f 4e 20 77 61 73  THENTICATION was
14190 20 6e 6f 74 20 61 20 30 78 37 43 20 74 61 67 2c   not a 0x7C tag,
141a0 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61   returning in fa
141b0 69 6c 75 72 65 22 29 3b 0a 0a 09 09 09 09 72 65  ilure");......re
141c0 74 75 72 6e 28 2d 31 29 3b 0a 09 09 09 7d 0a 0a  turn(-1);....}..
141d0 09 09 09 72 65 74 76 61 6c 20 3d 20 6f 75 74 62  ...retval = outb
141e0 75 66 5f 6c 65 6e 3b 0a 0a 09 09 09 6f 75 74 62  uf_len;.....outb
141f0 75 66 5f 6c 65 6e 20 3d 20 72 65 74 76 61 6c 3b  uf_len = retval;
14200 0a 09 09 09 6f 75 74 62 75 66 5f 70 20 3d 20 63  ....outbuf_p = c
14210 61 63 6b 65 79 5f 72 65 61 64 5f 62 65 72 74 6c  ackey_read_bertl
14220 76 5f 74 61 67 28 6f 75 74 62 75 66 2c 20 26 6f  v_tag(outbuf, &o
14230 75 74 62 75 66 5f 6c 65 6e 2c 20 30 78 38 32 2c  utbuf_len, 0x82,
14240 20 4e 55 4c 4c 2c 20 20 26 6f 75 74 62 75 66 5f   NULL,  &outbuf_
14250 6c 65 6e 29 3b 0a 09 09 09 69 66 20 28 6f 75 74  len);....if (out
14260 62 75 66 5f 70 20 3d 3d 20 4e 55 4c 4c 29 20 7b  buf_p == NULL) {
14270 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
14280 47 5f 50 52 49 4e 54 46 28 22 52 65 73 70 6f 6e  G_PRINTF("Respon
14290 73 65 20 66 72 6f 6d 20 50 49 56 20 66 6f 72 20  se from PIV for 
142a0 47 45 4e 45 52 41 54 45 20 41 55 54 48 45 4e 54  GENERATE AUTHENT
142b0 49 43 41 54 49 4f 4e 20 77 61 73 20 6e 6f 74 20  ICATION was not 
142c0 61 20 30 78 38 32 20 77 69 74 68 69 6e 20 61 20  a 0x82 within a 
142d0 30 78 37 43 20 74 61 67 2c 20 72 65 74 75 72 6e  0x7C tag, return
142e0 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29  ing in failure")
142f0 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 2d 31  ;......return(-1
14300 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 72 65 74 76  );....}.....retv
14310 61 6c 20 3d 20 6f 75 74 62 75 66 5f 6c 65 6e 3b  al = outbuf_len;
14320 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 63 61  .....break;...ca
14330 73 65 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50  se CACKEY_ID_TYP
14340 45 5f 43 41 43 3a 0a 09 09 63 61 73 65 20 43 41  E_CAC:...case CA
14350 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43 45 52  CKEY_ID_TYPE_CER
14360 54 5f 4f 4e 4c 59 3a 0a 09 09 09 62 72 65 61 6b  T_ONLY:....break
14370 3b 0a 09 7d 0a 0a 09 2f 2a 20 55 6e 70 61 64 20  ;..}.../* Unpad 
14380 72 65 70 6c 79 20 2a 2f 0a 09 69 66 20 28 75 6e  reply */..if (un
14390 70 61 64 4f 75 74 70 75 74 29 20 7b 0a 09 09 69  padOutput) {...i
143a0 66 20 28 72 65 74 76 61 6c 20 3c 20 33 29 20 7b  f (retval < 3) {
143b0 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
143c0 5f 50 52 49 4e 54 46 28 22 52 65 70 6c 79 20 69  _PRINTF("Reply i
143d0 73 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20 77 65 20  s too small, we 
143e0 61 72 65 20 6e 6f 74 20 61 62 6c 65 20 74 6f 20  are not able to 
143f0 75 6e 70 61 64 20 2d 2d 20 70 61 73 73 69 6e 67  unpad -- passing
14400 20 62 61 63 6b 20 61 6e 64 20 68 6f 70 69 6e 67   back and hoping
14410 20 66 6f 72 20 74 68 65 20 62 65 73 74 21 22 29   for the best!")
14420 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ;.....CACKEY_DEB
14430 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
14440 6e 69 6e 67 20 69 6e 20 73 75 63 63 65 73 73 2c  ning in success,
14450 20 72 65 74 76 61 6c 20 3d 20 25 6c 69 20 28 62   retval = %li (b
14460 79 74 65 73 29 22 2c 20 28 6c 6f 6e 67 29 20 72  ytes)", (long) r
14470 65 74 76 61 6c 29 3b 0a 09 09 09 72 65 74 75 72  etval);....retur
14480 6e 28 72 65 74 76 61 6c 29 3b 0a 09 09 7d 0a 0a  n(retval);...}..
14490 09 09 69 66 20 28 6f 75 74 62 75 66 5b 30 5d 20  ..if (outbuf[0] 
144a0 21 3d 20 30 78 30 30 29 20 7b 0a 09 09 09 43 41  != 0x00) {....CA
144b0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
144c0 46 28 22 55 6e 72 65 63 6f 67 6e 69 7a 65 64 20  F("Unrecognized 
144d0 70 61 64 64 69 6e 67 20 73 63 68 65 6d 65 20 2d  padding scheme -
144e0 2d 20 70 61 73 73 69 6e 67 20 62 61 63 6b 20 61  - passing back a
144f0 6e 64 20 68 6f 70 69 6e 67 20 66 6f 72 20 74 68  nd hoping for th
14500 65 20 62 65 73 74 21 22 29 3b 0a 0a 09 09 09 43  e best!");.....C
14510 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
14520 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e  TF("Returning in
14530 20 73 75 63 63 65 73 73 2c 20 72 65 74 76 61 6c   success, retval
14540 20 3d 20 25 6c 69 20 28 62 79 74 65 73 29 22 2c   = %li (bytes)",
14550 20 28 6c 6f 6e 67 29 20 72 65 74 76 61 6c 29 3b   (long) retval);
14560 0a 09 09 09 72 65 74 75 72 6e 28 72 65 74 76 61  ....return(retva
14570 6c 29 3b 0a 09 09 7d 0a 0a 09 09 62 6c 6f 63 6b  l);...}....block
14580 74 79 70 65 20 3d 20 6f 75 74 62 75 66 5b 31 5d  type = outbuf[1]
14590 3b 0a 09 09 75 6e 70 61 64 6f 66 66 73 65 74 20  ;...unpadoffset 
145a0 3d 20 30 3b 0a 0a 09 09 73 77 69 74 63 68 20 28  = 0;....switch (
145b0 62 6c 6f 63 6b 74 79 70 65 29 20 7b 0a 09 09 09  blocktype) {....
145c0 63 61 73 65 20 30 78 30 30 3a 0a 09 09 09 09 2f  case 0x00:...../
145d0 2a 20 50 61 64 64 69 6e 67 20 53 63 68 65 6d 65  * Padding Scheme
145e0 20 31 2c 20 74 68 65 20 66 69 72 73 74 20 6e 6f   1, the first no
145f0 6e 2d 7a 65 72 6f 20 62 79 74 65 20 69 73 20 74  n-zero byte is t
14600 68 65 20 73 74 61 72 74 20 6f 66 20 64 61 74 61  he start of data
14610 20 2a 2f 0a 09 09 09 09 66 6f 72 20 28 75 6e 70   */.....for (unp
14620 61 64 6f 66 66 73 65 74 20 3d 20 32 3b 20 75 6e  adoffset = 2; un
14630 70 61 64 6f 66 66 73 65 74 20 3c 20 72 65 74 76  padoffset < retv
14640 61 6c 3b 20 75 6e 70 61 64 6f 66 66 73 65 74 2b  al; unpadoffset+
14650 2b 29 20 7b 0a 09 09 09 09 09 69 66 20 28 6f 75  +) {......if (ou
14660 74 62 75 66 5b 75 6e 70 61 64 6f 66 66 73 65 74  tbuf[unpadoffset
14670 5d 20 21 3d 20 30 78 30 30 29 20 7b 0a 09 09 09  ] != 0x00) {....
14680 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 7d  ...break;......}
14690 0a 09 09 09 09 7d 0a 09 09 09 09 62 72 65 61 6b  .....}.....break
146a0 3b 0a 09 09 09 63 61 73 65 20 30 78 30 31 3a 0a  ;....case 0x01:.
146b0 09 09 09 09 2f 2a 20 50 61 64 64 69 6e 67 20 53  ..../* Padding S
146c0 63 68 65 6d 65 20 32 2c 20 70 61 64 20 62 79 74  cheme 2, pad byt
146d0 65 73 20 61 72 65 20 30 78 46 46 20 66 6f 6c 6c  es are 0xFF foll
146e0 6f 77 65 64 20 62 79 20 30 78 30 30 20 2a 2f 0a  owed by 0x00 */.
146f0 09 09 09 09 66 6f 72 20 28 75 6e 70 61 64 6f 66  ....for (unpadof
14700 66 73 65 74 20 3d 20 32 3b 20 75 6e 70 61 64 6f  fset = 2; unpado
14710 66 66 73 65 74 20 3c 20 72 65 74 76 61 6c 3b 20  ffset < retval; 
14720 75 6e 70 61 64 6f 66 66 73 65 74 2b 2b 29 20 7b  unpadoffset++) {
14730 0a 09 09 09 09 09 69 66 20 28 6f 75 74 62 75 66  ......if (outbuf
14740 5b 75 6e 70 61 64 6f 66 66 73 65 74 5d 20 21 3d  [unpadoffset] !=
14750 20 30 78 46 46 29 20 7b 0a 09 09 09 09 09 09 69   0xFF) {.......i
14760 66 20 28 6f 75 74 62 75 66 5b 75 6e 70 61 64 6f  f (outbuf[unpado
14770 66 66 73 65 74 5d 20 3d 3d 20 30 78 30 30 29 20  ffset] == 0x00) 
14780 7b 0a 09 09 09 09 09 09 09 75 6e 70 61 64 6f 66  {........unpadof
14790 66 73 65 74 2b 2b 3b 0a 0a 09 09 09 09 09 09 09  fset++;.........
147a0 62 72 65 61 6b 3b 0a 09 09 09 09 09 09 7d 20 65  break;.......} e
147b0 6c 73 65 20 7b 0a 09 09 09 09 09 09 09 43 41 43  lse {........CAC
147c0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
147d0 28 22 49 6e 76 61 6c 69 64 20 70 61 64 64 69 6e  ("Invalid paddin
147e0 67 20 64 61 74 61 20 66 6f 75 6e 64 2c 20 72 65  g data found, re
147f0 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
14800 72 65 2c 20 73 68 6f 75 6c 64 20 68 61 76 65 20  re, should have 
14810 62 65 65 6e 20 30 78 30 30 20 66 6f 75 6e 64 20  been 0x00 found 
14820 30 78 25 30 32 78 22 2c 20 28 75 6e 73 69 67 6e  0x%02x", (unsign
14830 65 64 20 69 6e 74 29 20 6f 75 74 62 75 66 5b 75  ed int) outbuf[u
14840 6e 70 61 64 6f 66 66 73 65 74 5d 29 3b 0a 0a 09  npadoffset]);...
14850 09 09 09 09 09 09 72 65 74 75 72 6e 28 2d 31 29  ......return(-1)
14860 3b 0a 09 09 09 09 09 09 7d 0a 09 09 09 09 09 7d  ;.......}......}
14870 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09 43 41   else {.......CA
14880 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
14890 46 28 22 49 6e 76 61 6c 69 64 20 70 61 64 64 69  F("Invalid paddi
148a0 6e 67 20 64 61 74 61 20 66 6f 75 6e 64 2c 20 72  ng data found, r
148b0 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
148c0 75 72 65 2c 20 73 68 6f 75 6c 64 20 68 61 76 65  ure, should have
148d0 20 62 65 65 6e 20 30 78 46 46 20 66 6f 75 6e 64   been 0xFF found
148e0 20 30 78 25 30 32 78 22 2c 20 28 75 6e 73 69 67   0x%02x", (unsig
148f0 6e 65 64 20 69 6e 74 29 20 6f 75 74 62 75 66 5b  ned int) outbuf[
14900 75 6e 70 61 64 6f 66 66 73 65 74 5d 29 3b 0a 0a  unpadoffset]);..
14910 09 09 09 09 09 09 72 65 74 75 72 6e 28 2d 31 29  ......return(-1)
14920 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 09  ;......}.....}..
14930 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
14940 65 20 30 78 30 32 3a 0a 09 09 09 09 2f 2a 20 50  e 0x02:...../* P
14950 61 64 64 69 6e 67 20 53 63 68 65 6d 65 20 33 2c  adding Scheme 3,
14960 20 70 61 64 20 62 79 74 65 73 20 61 72 65 20 6e   pad bytes are n
14970 6f 6e 2d 7a 65 72 6f 20 66 69 72 73 74 20 7a 65  on-zero first ze
14980 72 6f 20 62 79 74 65 20 66 6f 75 6e 64 20 69 73  ro byte found is
14990 20 74 68 65 20 73 65 70 65 72 61 74 6f 72 20 62   the seperator b
149a0 79 74 65 20 2a 2f 0a 09 09 09 09 66 6f 72 20 28  yte */.....for (
149b0 75 6e 70 61 64 6f 66 66 73 65 74 20 3d 20 32 3b  unpadoffset = 2;
149c0 20 75 6e 70 61 64 6f 66 66 73 65 74 20 3c 20 72   unpadoffset < r
149d0 65 74 76 61 6c 3b 20 75 6e 70 61 64 6f 66 66 73  etval; unpadoffs
149e0 65 74 2b 2b 29 20 7b 0a 09 09 09 09 09 69 66 20  et++) {......if 
149f0 28 6f 75 74 62 75 66 5b 75 6e 70 61 64 6f 66 66  (outbuf[unpadoff
14a00 73 65 74 5d 20 3d 3d 20 30 78 30 30 29 20 7b 0a  set] == 0x00) {.
14a10 09 09 09 09 09 09 75 6e 70 61 64 6f 66 66 73 65  ......unpadoffse
14a20 74 2b 2b 3b 0a 0a 09 09 09 09 09 09 62 72 65 61  t++;........brea
14a30 6b 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a  k;......}.....}.
14a40 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a  ....break;...}..
14a50 09 09 69 66 20 28 75 6e 70 61 64 6f 66 66 73 65  ..if (unpadoffse
14a60 74 20 3e 20 72 65 74 76 61 6c 29 20 7b 0a 09 09  t > retval) {...
14a70 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
14a80 49 4e 54 46 28 22 4f 66 66 73 65 74 20 67 72 65  INTF("Offset gre
14a90 61 74 65 72 20 74 68 61 6e 20 72 65 70 6c 79 20  ater than reply 
14aa0 73 69 7a 65 2c 20 61 62 6f 72 74 69 6e 67 2e 20  size, aborting. 
14ab0 20 28 75 6e 70 61 64 6f 66 66 73 65 74 20 3d 20   (unpadoffset = 
14ac0 25 6c 75 2c 20 72 65 74 76 61 6c 20 3d 20 25 6c  %lu, retval = %l
14ad0 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  u)", (unsigned l
14ae0 6f 6e 67 29 20 75 6e 70 61 64 6f 66 66 73 65 74  ong) unpadoffset
14af0 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
14b00 29 20 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09 72  ) retval);.....r
14b10 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 0a  eturn(-1);...}..
14b20 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
14b30 52 49 4e 54 42 55 46 28 22 50 61 64 64 65 64 3a  RINTBUF("Padded:
14b40 22 2c 20 6f 75 74 62 75 66 2c 20 72 65 74 76 61  ", outbuf, retva
14b50 6c 29 3b 0a 0a 09 09 72 65 74 76 61 6c 20 2d 3d  l);....retval -=
14b60 20 75 6e 70 61 64 6f 66 66 73 65 74 3b 0a 09 09   unpadoffset;...
14b70 6d 65 6d 6d 6f 76 65 28 6f 75 74 62 75 66 2c 20  memmove(outbuf, 
14b80 6f 75 74 62 75 66 20 2b 20 75 6e 70 61 64 6f 66  outbuf + unpadof
14b90 66 73 65 74 2c 20 72 65 74 76 61 6c 29 3b 0a 0a  fset, retval);..
14ba0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
14bb0 52 49 4e 54 42 55 46 28 22 55 6e 70 61 64 64 65  RINTBUF("Unpadde
14bc0 64 3a 22 2c 20 6f 75 74 62 75 66 2c 20 72 65 74  d:", outbuf, ret
14bd0 76 61 6c 29 3b 0a 09 7d 0a 0a 0a 09 43 41 43 4b  val);..}....CACK
14be0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
14bf0 22 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 73 75  "Returning in su
14c00 63 63 65 73 73 2c 20 72 65 74 76 61 6c 20 3d 20  ccess, retval = 
14c10 25 6c 69 20 28 62 79 74 65 73 29 22 2c 20 28 6c  %li (bytes)", (l
14c20 6f 6e 67 29 20 72 65 74 76 61 6c 29 3b 0a 0a 09  ong) retval);...
14c30 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a  return(retval);.
14c40 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49  }../*. * SYNPOSI
14c50 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a  S. *     .... *.
14c60 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20   * ARGUMENTS. * 
14c70 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45      .... *. * RE
14c80 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20  TURN VALUE. *   
14c90 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45    .... *. * NOTE
14ca0 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a  S. *     .... *.
14cb0 20 2a 2f 0a 73 74 61 74 69 63 20 63 61 63 6b 65   */.static cacke
14cc0 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 74 6f 6b  y_ret cackey_tok
14cd0 65 6e 5f 70 72 65 73 65 6e 74 28 73 74 72 75 63  en_present(struc
14ce0 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73  t cackey_slot *s
14cf0 6c 6f 74 29 20 7b 0a 09 63 61 63 6b 65 79 5f 72  lot) {..cackey_r
14d00 65 74 20 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f  et pcsc_connect_
14d10 72 65 74 3b 0a 09 44 57 4f 52 44 20 72 65 61 64  ret;..DWORD read
14d20 65 72 5f 6c 65 6e 20 3d 20 30 2c 20 73 74 61 74  er_len = 0, stat
14d30 65 20 3d 20 30 2c 20 70 72 6f 74 6f 63 6f 6c 20  e = 0, protocol 
14d40 3d 20 30 2c 20 61 74 72 5f 6c 65 6e 3b 0a 09 42  = 0, atr_len;..B
14d50 59 54 45 20 61 74 72 5b 4d 41 58 5f 41 54 52 5f  YTE atr[MAX_ATR_
14d60 53 49 5a 45 5d 3b 0a 09 4c 4f 4e 47 20 73 74 61  SIZE];..LONG sta
14d70 74 75 73 5f 72 65 74 2c 20 73 63 61 72 64 5f 72  tus_ret, scard_r
14d80 65 63 6f 6e 6e 5f 72 65 74 3b 0a 0a 09 43 41 43  econn_ret;...CAC
14d90 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
14da0 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
14db0 66 20 28 73 6c 6f 74 2d 3e 69 6e 74 65 72 6e 61  f (slot->interna
14dc0 6c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  l) {...CACKEY_DE
14dd0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
14de0 72 6e 69 6e 67 20 74 6f 6b 65 6e 20 70 72 65 73  rning token pres
14df0 65 6e 74 20 28 69 6e 74 65 72 6e 61 6c 20 74 6f  ent (internal to
14e00 6b 65 6e 29 22 29 3b 0a 0a 09 09 72 65 74 75 72  ken)");....retur
14e10 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  n(CACKEY_PCSC_S_
14e20 54 4f 4b 45 4e 50 52 45 53 45 4e 54 29 3b 0a 09  TOKENPRESENT);..
14e30 7d 0a 0a 09 70 63 73 63 5f 63 6f 6e 6e 65 63 74  }...pcsc_connect
14e40 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 63 6f  _ret = cackey_co
14e50 6e 6e 65 63 74 5f 63 61 72 64 28 73 6c 6f 74 29  nnect_card(slot)
14e60 3b 0a 09 69 66 20 28 70 63 73 63 5f 63 6f 6e 6e  ;..if (pcsc_conn
14e70 65 63 74 5f 72 65 74 20 21 3d 20 43 41 43 4b 45  ect_ret != CACKE
14e80 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09  Y_PCSC_S_OK) {..
14e90 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
14ea0 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20  INTF("Unable to 
14eb0 63 6f 6e 6e 65 63 74 20 74 6f 20 63 61 72 64 2c  connect to card,
14ec0 20 72 65 74 75 72 6e 69 6e 67 20 74 6f 6b 65 6e   returning token
14ed0 20 61 62 73 65 6e 74 22 29 3b 0a 0a 09 09 72 65   absent");....re
14ee0 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
14ef0 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b  _E_TOKENABSENT);
14f00 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
14f10 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 69  UG_PRINTF("Calli
14f20 6e 67 20 53 43 61 72 64 53 74 61 74 75 73 28 29  ng SCardStatus()
14f30 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 63 61   to determine ca
14f40 72 64 20 73 74 61 74 75 73 22 29 3b 0a 0a 09 61  rd status");...a
14f50 74 72 5f 6c 65 6e 20 3d 20 73 69 7a 65 6f 66 28  tr_len = sizeof(
14f60 61 74 72 29 3b 0a 09 73 74 61 74 75 73 5f 72 65  atr);..status_re
14f70 74 20 3d 20 53 43 61 72 64 53 74 61 74 75 73 28  t = SCardStatus(
14f80 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c  slot->pcsc_card,
14f90 20 4e 55 4c 4c 2c 20 26 72 65 61 64 65 72 5f 6c   NULL, &reader_l
14fa0 65 6e 2c 20 26 73 74 61 74 65 2c 20 26 70 72 6f  en, &state, &pro
14fb0 74 6f 63 6f 6c 2c 20 61 74 72 2c 20 26 61 74 72  tocol, atr, &atr
14fc0 5f 6c 65 6e 29 3b 0a 0a 09 69 66 20 28 73 74 61  _len);...if (sta
14fd0 74 75 73 5f 72 65 74 20 3d 3d 20 53 43 41 52 44  tus_ret == SCARD
14fe0 5f 45 5f 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c  _E_INVALID_HANDL
14ff0 45 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  E) {...CACKEY_DE
15000 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43 61 72  BUG_PRINTF("SCar
15010 64 53 74 61 74 75 73 28 29 20 72 65 74 75 72 6e  dStatus() return
15020 65 64 20 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c  ed SCARD_E_INVAL
15030 49 44 5f 48 41 4e 44 4c 45 2c 20 6d 61 72 6b 69  ID_HANDLE, marki
15040 6e 67 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  ng is not alread
15050 79 20 63 6f 6e 6e 65 63 74 65 64 20 61 6e 64 20  y connected and 
15060 74 72 79 69 6e 67 20 61 67 61 69 6e 22 29 3b 0a  trying again");.
15070 09 09 63 61 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c  ..cackey_mark_sl
15080 6f 74 5f 72 65 73 65 74 28 73 6c 6f 74 29 3b 0a  ot_reset(slot);.
15090 0a 09 09 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f  ...pcsc_connect_
150a0 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 63 6f 6e  ret = cackey_con
150b0 6e 65 63 74 5f 63 61 72 64 28 73 6c 6f 74 29 3b  nect_card(slot);
150c0 0a 09 09 69 66 20 28 70 63 73 63 5f 63 6f 6e 6e  ...if (pcsc_conn
150d0 65 63 74 5f 72 65 74 20 21 3d 20 43 41 43 4b 45  ect_ret != CACKE
150e0 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09  Y_PCSC_S_OK) {..
150f0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
15100 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f  RINTF("Unable to
15110 20 63 6f 6e 6e 65 63 74 20 74 6f 20 63 61 72 64   connect to card
15120 2c 20 72 65 74 75 72 6e 69 6e 67 20 74 6f 6b 65  , returning toke
15130 6e 20 61 62 73 65 6e 74 22 29 3b 0a 0a 09 09 09  n absent");.....
15140 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
15150 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54  SC_E_TOKENABSENT
15160 29 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59  );...}....CACKEY
15170 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
15180 61 6c 6c 69 6e 67 20 53 43 61 72 64 53 74 61 74  alling SCardStat
15190 75 73 28 29 20 61 67 61 69 6e 22 29 3b 0a 0a 09  us() again");...
151a0 09 61 74 72 5f 6c 65 6e 20 3d 20 73 69 7a 65 6f  .atr_len = sizeo
151b0 66 28 61 74 72 29 3b 0a 09 09 73 74 61 74 75 73  f(atr);...status
151c0 5f 72 65 74 20 3d 20 53 43 61 72 64 53 74 61 74  _ret = SCardStat
151d0 75 73 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61  us(slot->pcsc_ca
151e0 72 64 2c 20 4e 55 4c 4c 2c 20 26 72 65 61 64 65  rd, NULL, &reade
151f0 72 5f 6c 65 6e 2c 20 26 73 74 61 74 65 2c 20 26  r_len, &state, &
15200 70 72 6f 74 6f 63 6f 6c 2c 20 61 74 72 2c 20 26  protocol, atr, &
15210 61 74 72 5f 6c 65 6e 29 3b 0a 09 7d 0a 0a 09 69  atr_len);..}...i
15220 66 20 28 73 74 61 74 75 73 5f 72 65 74 20 21 3d  f (status_ret !=
15230 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53   SCARD_S_SUCCESS
15240 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 61 72  ) {...cackey_mar
15250 6b 5f 73 6c 6f 74 5f 72 65 73 65 74 28 73 6c 6f  k_slot_reset(slo
15260 74 29 3b 0a 0a 09 09 69 66 20 28 73 74 61 74 75  t);....if (statu
15270 73 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 57  s_ret == SCARD_W
15280 5f 52 45 53 45 54 5f 43 41 52 44 29 20 7b 0a 09  _RESET_CARD) {..
15290 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
152a0 52 49 4e 54 46 28 22 52 65 73 65 74 20 72 65 71  RINTF("Reset req
152b0 75 69 72 65 64 2c 20 70 6c 65 61 73 65 20 68 6f  uired, please ho
152c0 6c 64 2e 2e 2e 22 29 3b 0a 0a 09 09 09 73 63 61  ld...");.....sca
152d0 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 74 20 3d 20  rd_reconn_ret = 
152e0 63 61 63 6b 65 79 5f 72 65 63 6f 6e 6e 65 63 74  cackey_reconnect
152f0 5f 63 61 72 64 28 73 6c 6f 74 2c 20 53 43 41 52  _card(slot, SCAR
15300 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 20 7c 20  D_PROTOCOL_T0 | 
15310 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54  SCARD_PROTOCOL_T
15320 31 29 3b 0a 09 09 09 69 66 20 28 73 63 61 72 64  1);....if (scard
15330 5f 72 65 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53  _reconn_ret == S
15340 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20  CARD_S_SUCCESS) 
15350 7b 0a 09 09 09 09 2f 2a 20 52 65 2d 65 73 74 61  {...../* Re-esta
15360 62 6c 69 73 68 20 74 72 61 6e 73 61 63 74 69 6f  blish transactio
15370 6e 2c 20 69 66 20 69 74 20 77 61 73 20 70 72 65  n, if it was pre
15380 73 65 6e 74 20 2a 2f 0a 09 09 09 09 69 66 20 28  sent */.....if (
15390 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f  slot->transactio
153a0 6e 5f 64 65 70 74 68 20 3e 20 30 29 20 7b 0a 09  n_depth > 0) {..
153b0 09 09 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61  ....slot->transa
153c0 63 74 69 6f 6e 5f 64 65 70 74 68 2d 2d 3b 0a 09  ction_depth--;..
153d0 09 09 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61  ....slot->transa
153e0 63 74 69 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f  ction_need_hw_lo
153f0 63 6b 20 3d 20 31 3b 0a 09 09 09 09 09 63 61 63  ck = 1;......cac
15400 6b 65 79 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61  key_begin_transa
15410 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 09 09 09  ction(slot);....
15420 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  .}......CACKEY_D
15430 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 73  EBUG_PRINTF("Res
15440 65 74 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72  et successful, r
15450 65 71 75 65 72 79 69 6e 67 22 29 3b 0a 09 09 09  equerying");....
15460 09 73 74 61 74 75 73 5f 72 65 74 20 3d 20 53 43  .status_ret = SC
15470 61 72 64 53 74 61 74 75 73 28 73 6c 6f 74 2d 3e  ardStatus(slot->
15480 70 63 73 63 5f 63 61 72 64 2c 20 4e 55 4c 4c 2c  pcsc_card, NULL,
15490 20 26 72 65 61 64 65 72 5f 6c 65 6e 2c 20 26 73   &reader_len, &s
154a0 74 61 74 65 2c 20 26 70 72 6f 74 6f 63 6f 6c 2c  tate, &protocol,
154b0 20 61 74 72 2c 20 26 61 74 72 5f 6c 65 6e 29 3b   atr, &atr_len);
154c0 0a 09 09 09 09 69 66 20 28 73 74 61 74 75 73 5f  .....if (status_
154d0 72 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f 53  ret != SCARD_S_S
154e0 55 43 43 45 53 53 29 20 7b 0a 09 09 09 09 09 43  UCCESS) {......C
154f0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
15500 54 46 28 22 53 74 69 6c 6c 20 75 6e 61 62 6c 65  TF("Still unable
15510 20 74 6f 20 71 75 65 72 79 20 63 61 72 64 20 73   to query card s
15520 74 61 74 75 73 2c 20 72 65 74 75 72 6e 69 6e 67  tatus, returning
15530 20 74 6f 6b 65 6e 20 61 62 73 65 6e 74 2e 20 20   token absent.  
15540 53 43 61 72 64 53 74 61 74 75 73 28 29 20 3d 20  SCardStatus() = 
15550 25 73 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55  %s", CACKEY_DEBU
15560 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f  G_FUNC_SCARDERR_
15570 54 4f 5f 53 54 52 28 73 74 61 74 75 73 5f 72 65  TO_STR(status_re
15580 74 29 29 3b 0a 0a 09 09 09 09 09 72 65 74 75 72  t));.......retur
15590 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  n(CACKEY_PCSC_E_
155a0 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b 0a 09 09  TOKENABSENT);...
155b0 09 09 7d 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a  ..}....} else {.
155c0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
155d0 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20  _PRINTF("Unable 
155e0 74 6f 20 72 65 63 6f 6e 6e 65 63 74 20 74 6f 20  to reconnect to 
155f0 63 61 72 64 2c 20 72 65 74 75 72 6e 69 6e 67 20  card, returning 
15600 74 6f 6b 65 6e 20 61 62 73 65 6e 74 2e 20 20 53  token absent.  S
15610 43 61 72 64 52 65 63 6f 6e 6e 65 63 74 28 29 20  CardReconnect() 
15620 3d 20 25 73 22 2c 20 43 41 43 4b 45 59 5f 44 45  = %s", CACKEY_DE
15630 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52  BUG_FUNC_SCARDER
15640 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 5f 72  R_TO_STR(scard_r
15650 65 63 6f 6e 6e 5f 72 65 74 29 29 3b 0a 0a 09 09  econn_ret));....
15660 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
15670 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45  PCSC_E_TOKENABSE
15680 4e 54 29 3b 0a 09 09 09 7d 0a 09 09 7d 20 65 6c  NT);....}...} el
15690 73 65 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  se {....CACKEY_D
156a0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61  EBUG_PRINTF("Una
156b0 62 6c 65 20 74 6f 20 71 75 65 72 79 20 63 61 72  ble to query car
156c0 64 20 73 74 61 74 75 73 2c 20 72 65 74 75 72 6e  d status, return
156d0 69 6e 67 20 74 6f 6b 65 6e 20 61 62 73 65 6e 74  ing token absent
156e0 2e 20 20 53 43 61 72 64 53 74 61 74 75 73 28 29  .  SCardStatus()
156f0 20 3d 20 25 73 22 2c 20 43 41 43 4b 45 59 5f 44   = %s", CACKEY_D
15700 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45  EBUG_FUNC_SCARDE
15710 52 52 5f 54 4f 5f 53 54 52 28 73 74 61 74 75 73  RR_TO_STR(status
15720 5f 72 65 74 29 29 3b 0a 0a 09 09 09 72 65 74 75  _ret));.....retu
15730 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  rn(CACKEY_PCSC_E
15740 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b 0a 09  _TOKENABSENT);..
15750 09 7d 0a 09 7d 0a 0a 09 69 66 20 28 28 73 74 61  .}..}...if ((sta
15760 74 65 20 26 20 53 43 41 52 44 5f 41 42 53 45 4e  te & SCARD_ABSEN
15770 54 29 20 3d 3d 20 53 43 41 52 44 5f 41 42 53 45  T) == SCARD_ABSE
15780 4e 54 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  NT) {...CACKEY_D
15790 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 72  EBUG_PRINTF("Car
157a0 64 20 69 73 20 61 62 73 65 6e 74 2c 20 72 65 74  d is absent, ret
157b0 75 72 6e 69 6e 67 20 74 6f 6b 65 6e 20 61 62 73  urning token abs
157c0 65 6e 74 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ent");....return
157d0 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54  (CACKEY_PCSC_E_T
157e0 4f 4b 45 4e 41 42 53 45 4e 54 29 3b 0a 09 7d 0a  OKENABSENT);..}.
157f0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
15800 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
15810 20 74 6f 6b 65 6e 20 70 72 65 73 65 6e 74 2e 22   token present."
15820 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41 43 4b  );...return(CACK
15830 45 59 5f 50 43 53 43 5f 53 5f 54 4f 4b 45 4e 50  EY_PCSC_S_TOKENP
15840 52 45 53 45 4e 54 29 3b 0a 7d 0a 0a 2f 2a 0a 20  RESENT);.}../*. 
15850 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20  * SYNPOSIS. *   
15860 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55    .... *. * ARGU
15870 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e  MENTS. *     ...
15880 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41  . *. * RETURN VA
15890 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20  LUE. *     .... 
158a0 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20  *. * NOTES. *   
158b0 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61    .... *. */.sta
158c0 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74 20 63  tic cackey_ret c
158d0 61 63 6b 65 79 5f 73 65 74 5f 70 69 6e 28 73 74  ackey_set_pin(st
158e0 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74  ruct cackey_slot
158f0 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64   *slot, unsigned
15900 20 63 68 61 72 20 2a 6f 6c 64 5f 70 69 6e 2c 20   char *old_pin, 
15910 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6f 6c  unsigned long ol
15920 64 5f 70 69 6e 5f 6c 65 6e 2c 20 75 6e 73 69 67  d_pin_len, unsig
15930 6e 65 64 20 63 68 61 72 20 2a 70 69 6e 2c 20 75  ned char *pin, u
15940 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 70 69 6e  nsigned long pin
15950 5f 6c 65 6e 29 20 7b 0a 09 73 74 72 75 63 74 20  _len) {..struct 
15960 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e  cackey_pcsc_iden
15970 74 69 74 79 20 2a 70 63 73 63 5f 69 64 65 6e 74  tity *pcsc_ident
15980 69 74 69 65 73 3b 0a 09 75 6e 73 69 67 6e 65 64  ities;..unsigned
15990 20 63 68 61 72 20 63 61 63 5f 70 69 6e 5b 38 5d   char cac_pin[8]
159a0 20 3d 20 7b 30 78 46 46 2c 20 30 78 46 46 2c 20   = {0xFF, 0xFF, 
159b0 30 78 46 46 2c 20 30 78 46 46 2c 20 30 78 46 46  0xFF, 0xFF, 0xFF
159c0 2c 20 30 78 46 46 2c 20 30 78 46 46 2c 20 30 78  , 0xFF, 0xFF, 0x
159d0 46 46 7d 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63  FF};..unsigned c
159e0 68 61 72 20 6f 6c 64 5f 63 61 63 5f 70 69 6e 5b  har old_cac_pin[
159f0 38 5d 20 3d 20 7b 30 78 46 46 2c 20 30 78 46 46  8] = {0xFF, 0xFF
15a00 2c 20 30 78 46 46 2c 20 30 78 46 46 2c 20 30 78  , 0xFF, 0xFF, 0x
15a10 46 46 2c 20 30 78 46 46 2c 20 30 78 46 46 2c 20  FF, 0xFF, 0xFF, 
15a20 30 78 46 46 7d 3b 0a 09 75 6e 73 69 67 6e 65 64  0xFF};..unsigned
15a30 20 63 68 61 72 20 70 69 6e 5f 75 70 64 61 74 65   char pin_update
15a40 5b 73 69 7a 65 6f 66 28 63 61 63 5f 70 69 6e 29  [sizeof(cac_pin)
15a50 20 2b 20 73 69 7a 65 6f 66 28 6f 6c 64 5f 63 61   + sizeof(old_ca
15a60 63 5f 70 69 6e 29 5d 3b 0a 09 75 6e 73 69 67 6e  c_pin)];..unsign
15a70 65 64 20 6c 6f 6e 67 20 6e 75 6d 5f 63 65 72 74  ed long num_cert
15a80 73 3b 0a 09 75 69 6e 74 31 36 5f 74 20 72 65 73  s;..uint16_t res
15a90 70 6f 6e 73 65 5f 63 6f 64 65 3b 0a 09 69 6e 74  ponse_code;..int
15aa0 20 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67   tries_remaining
15ab0 3b 0a 09 69 6e 74 20 73 65 6e 64 5f 72 65 74 3b  ;..int send_ret;
15ac0 0a 09 69 6e 74 20 6b 65 79 5f 72 65 66 65 72 65  ..int key_refere
15ad0 6e 63 65 20 3d 20 30 78 30 30 3b 0a 0a 09 2f 2a  nce = 0x00;.../*
15ae0 20 41 70 70 61 72 65 6e 74 6c 79 2c 20 43 41 43   Apparently, CAC
15af0 20 50 49 4e 73 20 61 72 65 20 2a 45 58 41 43 54   PINs are *EXACT
15b00 4c 59 2a 20 38 20 62 79 74 65 73 20 6c 6f 6e 67  LY* 8 bytes long
15b10 20 2d 2d 20 70 61 64 20 77 69 74 68 20 30 78 46   -- pad with 0xF
15b20 46 20 69 66 20 74 6f 6f 20 73 68 6f 72 74 20 2a  F if too short *
15b30 2f 0a 09 69 66 20 28 70 69 6e 5f 6c 65 6e 20 3e  /..if (pin_len >
15b40 3d 20 38 29 20 7b 0a 09 09 6d 65 6d 63 70 79 28  = 8) {...memcpy(
15b50 63 61 63 5f 70 69 6e 2c 20 70 69 6e 2c 20 38 29  cac_pin, pin, 8)
15b60 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 6d 65  ;..} else {...me
15b70 6d 63 70 79 28 63 61 63 5f 70 69 6e 2c 20 70 69  mcpy(cac_pin, pi
15b80 6e 2c 20 70 69 6e 5f 6c 65 6e 29 3b 0a 09 7d 0a  n, pin_len);..}.
15b90 0a 09 69 66 20 28 6f 6c 64 5f 70 69 6e 5f 6c 65  ..if (old_pin_le
15ba0 6e 20 3e 3d 20 38 29 20 7b 0a 09 09 6d 65 6d 63  n >= 8) {...memc
15bb0 70 79 28 6f 6c 64 5f 63 61 63 5f 70 69 6e 2c 20  py(old_cac_pin, 
15bc0 6f 6c 64 5f 70 69 6e 2c 20 38 29 3b 0a 09 7d 20  old_pin, 8);..} 
15bd0 65 6c 73 65 20 7b 0a 09 09 6d 65 6d 63 70 79 28  else {...memcpy(
15be0 6f 6c 64 5f 63 61 63 5f 70 69 6e 2c 20 6f 6c 64  old_cac_pin, old
15bf0 5f 70 69 6e 2c 20 6f 6c 64 5f 70 69 6e 5f 6c 65  _pin, old_pin_le
15c00 6e 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 43 6f 6e 63  n);..}.../* Conc
15c10 61 74 65 6e 61 74 65 20 62 6f 74 68 20 50 49 4e  atenate both PIN
15c20 73 20 74 6f 67 65 74 68 65 72 20 74 6f 20 73 65  s together to se
15c30 6e 64 20 61 73 20 61 20 73 69 6e 67 6c 65 20 69  nd as a single i
15c40 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 09 6d  nstruction */..m
15c50 65 6d 63 70 79 28 70 69 6e 5f 75 70 64 61 74 65  emcpy(pin_update
15c60 2c 20 6f 6c 64 5f 63 61 63 5f 70 69 6e 2c 20 73  , old_cac_pin, s
15c70 69 7a 65 6f 66 28 6f 6c 64 5f 63 61 63 5f 70 69  izeof(old_cac_pi
15c80 6e 29 29 3b 0a 09 6d 65 6d 63 70 79 28 70 69 6e  n));..memcpy(pin
15c90 5f 75 70 64 61 74 65 20 2b 20 73 69 7a 65 6f 66  _update + sizeof
15ca0 28 6f 6c 64 5f 63 61 63 5f 70 69 6e 29 2c 20 63  (old_cac_pin), c
15cb0 61 63 5f 70 69 6e 2c 20 73 69 7a 65 6f 66 28 63  ac_pin, sizeof(c
15cc0 61 63 5f 70 69 6e 29 29 3b 0a 0a 09 2f 2a 20 52  ac_pin));.../* R
15cd0 65 6a 65 63 74 20 50 49 4e 73 20 77 68 69 63 68  eject PINs which
15ce0 20 61 72 65 20 74 6f 6f 20 73 68 6f 72 74 20 2a   are too short *
15cf0 2f 0a 09 69 66 20 28 70 69 6e 5f 6c 65 6e 20 3c  /..if (pin_len <
15d00 20 35 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   5) {...CACKEY_D
15d10 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 6a  EBUG_PRINTF("Rej
15d20 65 63 74 69 6e 67 20 4e 65 77 20 50 49 4e 20 77  ecting New PIN w
15d30 68 69 63 68 20 69 73 20 74 6f 6f 20 73 68 6f 72  hich is too shor
15d40 74 20 28 6c 65 6e 67 74 68 20 3d 20 25 6c 75 2c  t (length = %lu,
15d50 20 6d 75 73 74 20 62 65 20 61 74 6c 65 61 73 74   must be atleast
15d60 20 35 29 22 2c 20 70 69 6e 5f 6c 65 6e 29 3b 0a   5)", pin_len);.
15d70 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
15d80 5f 50 43 53 43 5f 45 5f 42 41 44 50 49 4e 29 3b  _PCSC_E_BADPIN);
15d90 0a 09 7d 0a 0a 09 69 66 20 28 6f 6c 64 5f 70 69  ..}...if (old_pi
15da0 6e 5f 6c 65 6e 20 3c 20 35 29 20 7b 0a 09 09 43  n_len < 5) {...C
15db0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
15dc0 54 46 28 22 52 65 6a 65 63 74 69 6e 67 20 4f 6c  TF("Rejecting Ol
15dd0 64 20 50 49 4e 20 77 68 69 63 68 20 69 73 20 74  d PIN which is t
15de0 6f 6f 20 73 68 6f 72 74 20 28 6c 65 6e 67 74 68  oo short (length
15df0 20 3d 20 25 6c 75 2c 20 6d 75 73 74 20 62 65 20   = %lu, must be 
15e00 61 74 6c 65 61 73 74 20 35 29 22 2c 20 6f 6c 64  atleast 5)", old
15e10 5f 70 69 6e 5f 6c 65 6e 29 3b 0a 0a 09 09 72 65  _pin_len);....re
15e20 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
15e30 5f 45 5f 42 41 44 50 49 4e 29 3b 0a 09 7d 0a 0a  _E_BADPIN);..}..
15e40 09 2f 2a 20 50 49 56 20 61 75 74 68 65 6e 74 69  ./* PIV authenti
15e50 63 61 74 69 6f 6e 20 75 73 65 73 20 61 20 22 6b  cation uses a "k
15e60 65 79 5f 72 65 66 65 72 65 6e 63 65 22 20 6f 66  ey_reference" of
15e70 20 30 78 38 30 20 2a 2f 0a 09 70 63 73 63 5f 69   0x80 */..pcsc_i
15e80 64 65 6e 74 69 74 69 65 73 20 3d 20 63 61 63 6b  dentities = cack
15e90 65 79 5f 72 65 61 64 5f 63 65 72 74 73 28 73 6c  ey_read_certs(sl
15ea0 6f 74 2c 20 4e 55 4c 4c 2c 20 26 6e 75 6d 5f 63  ot, NULL, &num_c
15eb0 65 72 74 73 29 3b 0a 09 69 66 20 28 6e 75 6d 5f  erts);..if (num_
15ec0 63 65 72 74 73 20 3e 20 30 20 26 26 20 70 63 73  certs > 0 && pcs
15ed0 63 5f 69 64 65 6e 74 69 74 69 65 73 20 21 3d 20  c_identities != 
15ee0 4e 55 4c 4c 29 20 7b 0a 09 09 73 77 69 74 63 68  NULL) {...switch
15ef0 20 28 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65   (pcsc_identitie
15f00 73 5b 30 5d 2e 69 64 5f 74 79 70 65 29 20 7b 0a  s[0].id_type) {.
15f10 09 09 09 63 61 73 65 20 43 41 43 4b 45 59 5f 49  ...case CACKEY_I
15f20 44 5f 54 59 50 45 5f 50 49 56 3a 0a 09 09 09 09  D_TYPE_PIV:.....
15f30 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
15f40 4e 54 46 28 22 57 65 20 68 61 76 65 20 50 49 56  NTF("We have PIV
15f50 20 63 61 72 64 2c 20 73 6f 20 77 65 20 77 69 6c   card, so we wil
15f60 6c 20 61 74 74 65 6d 70 74 20 74 6f 20 61 75 74  l attempt to aut
15f70 68 65 6e 74 69 63 61 74 65 20 75 73 69 6e 67 20  henticate using 
15f80 74 68 65 20 50 49 56 20 41 70 70 6c 69 63 61 74  the PIV Applicat
15f90 69 6f 6e 20 6b 65 79 20 72 65 66 65 72 65 6e 63  ion key referenc
15fa0 65 22 29 3b 0a 0a 09 09 09 09 6b 65 79 5f 72 65  e");......key_re
15fb0 66 65 72 65 6e 63 65 20 3d 20 30 78 38 30 3b 0a  ference = 0x80;.
15fc0 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 64 65  ....break;....de
15fd0 66 61 75 6c 74 3a 0a 09 09 09 09 62 72 65 61 6b  fault:.....break
15fe0 3b 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f  ;...}....cackey_
15ff0 66 72 65 65 5f 63 65 72 74 73 28 70 63 73 63 5f  free_certs(pcsc_
16000 69 64 65 6e 74 69 74 69 65 73 2c 20 6e 75 6d 5f  identities, num_
16010 63 65 72 74 73 2c 20 31 29 3b 0a 09 7d 0a 0a 09  certs, 1);..}...
16020 2f 2a 20 49 73 73 75 65 20 61 20 53 65 74 20 50  /* Issue a Set P
16030 49 4e 20 28 43 48 41 4e 47 45 20 52 45 46 45 52  IN (CHANGE REFER
16040 45 4e 43 45 29 20 2a 2f 0a 09 73 65 6e 64 5f 72  ENCE) */..send_r
16050 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64  et = cackey_send
16060 5f 61 70 64 75 28 73 6c 6f 74 2c 20 47 53 43 49  _apdu(slot, GSCI
16070 53 5f 43 4c 41 53 53 5f 49 53 4f 37 38 31 36 2c  S_CLASS_ISO7816,
16080 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 43 48 41   GSCIS_INSTR_CHA
16090 4e 47 45 5f 52 45 46 45 52 45 4e 43 45 2c 20 30  NGE_REFERENCE, 0
160a0 78 30 30 2c 20 6b 65 79 5f 72 65 66 65 72 65 6e  x00, key_referen
160b0 63 65 2c 20 73 69 7a 65 6f 66 28 70 69 6e 5f 75  ce, sizeof(pin_u
160c0 70 64 61 74 65 29 2c 20 70 69 6e 5f 75 70 64 61  pdate), pin_upda
160d0 74 65 2c 20 30 78 30 30 2c 20 26 72 65 73 70 6f  te, 0x00, &respo
160e0 6e 73 65 5f 63 6f 64 65 2c 20 4e 55 4c 4c 2c 20  nse_code, NULL, 
160f0 4e 55 4c 4c 29 3b 0a 0a 09 69 66 20 28 73 65 6e  NULL);...if (sen
16100 64 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f  d_ret != CACKEY_
16110 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 69  PCSC_S_OK) {...i
16120 66 20 28 28 72 65 73 70 6f 6e 73 65 5f 63 6f 64  f ((response_cod
16130 65 20 26 20 30 78 36 33 43 30 29 20 3d 3d 20 30  e & 0x63C0) == 0
16140 78 36 33 43 30 29 20 7b 0a 09 09 09 74 72 69 65  x63C0) {....trie
16150 73 5f 72 65 6d 61 69 6e 69 6e 67 20 3d 20 28 72  s_remaining = (r
16160 65 73 70 6f 6e 73 65 5f 63 6f 64 65 20 26 20 30  esponse_code & 0
16170 78 46 29 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f  xF);.....CACKEY_
16180 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 50 49  DEBUG_PRINTF("PI
16190 4e 20 56 65 72 69 66 69 63 61 74 69 6f 6e 20 66  N Verification f
161a0 61 69 6c 65 64 2c 20 25 69 20 74 72 69 65 73 20  ailed, %i tries 
161b0 72 65 6d 61 69 6e 69 6e 67 22 2c 20 74 72 69 65  remaining", trie
161c0 73 5f 72 65 6d 61 69 6e 69 6e 67 29 3b 0a 0a 09  s_remaining);...
161d0 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
161e0 50 43 53 43 5f 45 5f 42 41 44 50 49 4e 29 3b 0a  PCSC_E_BADPIN);.
161f0 09 09 7d 0a 0a 09 09 69 66 20 28 72 65 73 70 6f  ..}....if (respo
16200 6e 73 65 5f 63 6f 64 65 20 3d 3d 20 30 78 36 39  nse_code == 0x69
16210 38 33 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  83) {....CACKEY_
16220 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e  DEBUG_PRINTF("Un
16230 61 62 6c 65 20 74 6f 20 73 65 74 20 50 49 4e 2c  able to set PIN,
16240 20 64 65 76 69 63 65 20 69 73 20 6c 6f 63 6b 65   device is locke
16250 64 20 6f 72 20 63 68 61 6e 67 69 6e 67 20 74 68  d or changing th
16260 65 20 50 49 4e 20 69 73 20 64 69 73 61 62 6c 65  e PIN is disable
16270 64 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28  d");.....return(
16280 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4c 4f  CACKEY_PCSC_E_LO
16290 43 4b 45 44 29 3b 0a 09 09 7d 0a 0a 09 09 72 65  CKED);...}....re
162a0 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
162b0 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a  _E_GENERIC);..}.
162c0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
162d0 52 49 4e 54 46 28 22 50 49 4e 20 43 68 61 6e 67  RINTF("PIN Chang
162e0 65 20 73 75 63 63 65 65 64 65 64 22 29 3b 0a 0a  e succeeded");..
162f0 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
16300 43 53 43 5f 53 5f 4f 4b 29 3b 0a 0a 09 2f 2a 20  CSC_S_OK);.../* 
16310 44 69 73 61 62 6c 65 20 61 20 77 61 72 6e 69 6e  Disable a warnin
16320 67 2c 20 73 69 6e 63 65 20 74 68 69 73 20 69 73  g, since this is
16330 20 6f 6e 6c 79 20 75 73 65 64 20 69 6e 20 64 65   only used in de
16340 62 75 67 20 6d 6f 64 65 20 2a 2f 0a 09 74 72 69  bug mode */..tri
16350 65 73 5f 72 65 6d 61 69 6e 69 6e 67 20 3d 20 74  es_remaining = t
16360 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 3b 0a  ries_remaining;.
16370 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49  }../*. * SYNPOSI
16380 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a  S. *     .... *.
16390 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20   * ARGUMENTS. * 
163a0 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45      .... *. * RE
163b0 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20  TURN VALUE. *   
163c0 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45    .... *. * NOTE
163d0 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a  S. *     .... *.
163e0 20 2a 2f 0a 73 74 61 74 69 63 20 63 61 63 6b 65   */.static cacke
163f0 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 6c 6f 67  y_ret cackey_log
16400 69 6e 28 73 74 72 75 63 74 20 63 61 63 6b 65 79  in(struct cackey
16410 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73  _slot *slot, uns
16420 69 67 6e 65 64 20 63 68 61 72 20 2a 70 69 6e 2c  igned char *pin,
16430 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 70   unsigned long p
16440 69 6e 5f 6c 65 6e 2c 20 69 6e 74 20 2a 74 72 69  in_len, int *tri
16450 65 73 5f 72 65 6d 61 69 6e 69 6e 67 5f 70 2c 20  es_remaining_p, 
16460 69 6e 74 20 72 65 74 72 69 65 73 29 20 7b 0a 09  int retries) {..
16470 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63  struct cackey_pc
16480 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 70 63 73  sc_identity *pcs
16490 63 5f 69 64 65 6e 74 69 74 69 65 73 3b 0a 09 75  c_identities;..u
164a0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63 61 63  nsigned char cac
164b0 5f 70 69 6e 5b 38 5d 20 3d 20 7b 30 78 46 46 2c  _pin[8] = {0xFF,
164c0 20 30 78 46 46 2c 20 30 78 46 46 2c 20 30 78 46   0xFF, 0xFF, 0xF
164d0 46 2c 20 30 78 46 46 2c 20 30 78 46 46 2c 20 30  F, 0xFF, 0xFF, 0
164e0 78 46 46 2c 20 30 78 46 46 7d 3b 0a 09 75 6e 73  xFF, 0xFF};..uns
164f0 69 67 6e 65 64 20 6c 6f 6e 67 20 6e 75 6d 5f 63  igned long num_c
16500 65 72 74 73 3b 0a 09 75 69 6e 74 31 36 5f 74 20  erts;..uint16_t 
16510 72 65 73 70 6f 6e 73 65 5f 63 6f 64 65 3b 0a 09  response_code;..
16520 69 6e 74 20 74 72 69 65 73 5f 72 65 6d 61 69 6e  int tries_remain
16530 69 6e 67 3b 0a 09 69 6e 74 20 73 65 6e 64 5f 72  ing;..int send_r
16540 65 74 3b 0a 09 69 6e 74 20 6b 65 79 5f 72 65 66  et;..int key_ref
16550 65 72 65 6e 63 65 20 3d 20 30 78 30 30 2c 20 68  erence = 0x00, h
16560 61 76 65 5f 70 69 76 20 3d 20 30 3b 0a 09 63 61  ave_piv = 0;..ca
16570 63 6b 65 79 5f 72 65 74 20 63 6f 6e 6e 65 63 74  ckey_ret connect
16580 5f 72 65 74 2c 20 74 6f 6b 65 6e 5f 72 65 74 3b  _ret, token_ret;
16590 0a 0a 09 2f 2a 20 49 6e 64 69 63 61 74 65 20 74  .../* Indicate t
165a0 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 6b 6e  hat we do not kn
165b0 6f 77 20 61 62 6f 75 74 20 68 6f 77 20 6d 61 6e  ow about how man
165c0 79 20 74 72 69 65 73 20 61 72 65 20 72 65 6d 61  y tries are rema
165d0 69 6e 69 6e 67 20 2a 2f 0a 09 69 66 20 28 74 72  ining */..if (tr
165e0 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 5f 70 29  ies_remaining_p)
165f0 20 7b 0a 09 09 2a 74 72 69 65 73 5f 72 65 6d 61   {...*tries_rema
16600 69 6e 69 6e 67 5f 70 20 3d 20 2d 31 3b 0a 09 7d  ining_p = -1;..}
16610 0a 0a 09 2f 2a 20 41 70 70 61 72 65 6e 74 6c 79  .../* Apparently
16620 2c 20 43 41 43 20 50 49 4e 73 20 61 72 65 20 2a  , CAC PINs are *
16630 45 58 41 43 54 4c 59 2a 20 38 20 62 79 74 65 73  EXACTLY* 8 bytes
16640 20 6c 6f 6e 67 20 2d 2d 20 70 61 64 20 77 69 74   long -- pad wit
16650 68 20 30 78 46 46 20 69 66 20 74 6f 6f 20 73 68  h 0xFF if too sh
16660 6f 72 74 20 2a 2f 0a 09 69 66 20 28 70 69 6e 5f  ort */..if (pin_
16670 6c 65 6e 20 3e 3d 20 38 29 20 7b 0a 09 09 6d 65  len >= 8) {...me
16680 6d 63 70 79 28 63 61 63 5f 70 69 6e 2c 20 70 69  mcpy(cac_pin, pi
16690 6e 2c 20 38 29 3b 0a 09 7d 20 65 6c 73 65 20 7b  n, 8);..} else {
166a0 0a 09 09 6d 65 6d 63 70 79 28 63 61 63 5f 70 69  ...memcpy(cac_pi
166b0 6e 2c 20 70 69 6e 2c 20 70 69 6e 5f 6c 65 6e 29  n, pin, pin_len)
166c0 3b 0a 09 7d 0a 0a 09 2f 2a 20 52 65 6a 65 63 74  ;..}.../* Reject
166d0 20 50 49 4e 73 20 77 68 69 63 68 20 61 72 65 20   PINs which are 
166e0 74 6f 6f 20 73 68 6f 72 74 20 2a 2f 0a 09 69 66  too short */..if
166f0 20 28 70 69 6e 5f 6c 65 6e 20 3c 20 35 29 20 7b   (pin_len < 5) {
16700 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
16710 50 52 49 4e 54 46 28 22 52 65 6a 65 63 74 69 6e  PRINTF("Rejectin
16720 67 20 50 49 4e 20 77 68 69 63 68 20 69 73 20 74  g PIN which is t
16730 6f 6f 20 73 68 6f 72 74 20 28 6c 65 6e 67 74 68  oo short (length
16740 20 3d 20 25 6c 75 2c 20 6d 75 73 74 20 62 65 20   = %lu, must be 
16750 61 74 6c 65 61 73 74 20 35 29 22 2c 20 70 69 6e  atleast 5)", pin
16760 5f 6c 65 6e 29 3b 0a 0a 09 09 72 65 74 75 72 6e  _len);....return
16770 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 42  (CACKEY_PCSC_E_B
16780 41 44 50 49 4e 29 3b 0a 09 7d 0a 0a 09 2f 2a 20  ADPIN);..}.../* 
16790 50 49 56 20 61 75 74 68 65 6e 74 69 63 61 74 69  PIV authenticati
167a0 6f 6e 20 75 73 65 73 20 61 20 22 6b 65 79 5f 72  on uses a "key_r
167b0 65 66 65 72 65 6e 63 65 22 20 6f 66 20 30 78 38  eference" of 0x8
167c0 30 20 2a 2f 0a 09 70 63 73 63 5f 69 64 65 6e 74  0 */..pcsc_ident
167d0 69 74 69 65 73 20 3d 20 63 61 63 6b 65 79 5f 72  ities = cackey_r
167e0 65 61 64 5f 63 65 72 74 73 28 73 6c 6f 74 2c 20  ead_certs(slot, 
167f0 4e 55 4c 4c 2c 20 26 6e 75 6d 5f 63 65 72 74 73  NULL, &num_certs
16800 29 3b 0a 09 69 66 20 28 6e 75 6d 5f 63 65 72 74  );..if (num_cert
16810 73 20 3e 20 30 20 26 26 20 70 63 73 63 5f 69 64  s > 0 && pcsc_id
16820 65 6e 74 69 74 69 65 73 20 21 3d 20 4e 55 4c 4c  entities != NULL
16830 29 20 7b 0a 09 09 73 77 69 74 63 68 20 28 70 63  ) {...switch (pc
16840 73 63 5f 69 64 65 6e 74 69 74 69 65 73 5b 30 5d  sc_identities[0]
16850 2e 69 64 5f 74 79 70 65 29 20 7b 0a 09 09 09 63  .id_type) {....c
16860 61 73 65 20 43 41 43 4b 45 59 5f 49 44 5f 54 59  ase CACKEY_ID_TY
16870 50 45 5f 50 49 56 3a 0a 09 09 09 09 43 41 43 4b  PE_PIV:.....CACK
16880 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
16890 22 57 65 20 68 61 76 65 20 50 49 56 20 63 61 72  "We have PIV car
168a0 64 2c 20 73 6f 20 77 65 20 77 69 6c 6c 20 61 74  d, so we will at
168b0 74 65 6d 70 74 20 74 6f 20 61 75 74 68 65 6e 74  tempt to authent
168c0 69 63 61 74 65 20 75 73 69 6e 67 20 74 68 65 20  icate using the 
168d0 50 49 56 20 41 70 70 6c 69 63 61 74 69 6f 6e 20  PIV Application 
168e0 6b 65 79 20 72 65 66 65 72 65 6e 63 65 22 29 3b  key reference");
168f0 0a 0a 09 09 09 09 68 61 76 65 5f 70 69 76 20 3d  ......have_piv =
16900 20 31 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09   1;.....break;..
16910 09 09 64 65 66 61 75 6c 74 3a 0a 09 09 09 09 62  ..default:.....b
16920 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09 63 61 63  reak;...}....cac
16930 6b 65 79 5f 66 72 65 65 5f 63 65 72 74 73 28 70  key_free_certs(p
16940 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 2c 20  csc_identities, 
16950 6e 75 6d 5f 63 65 72 74 73 2c 20 31 29 3b 0a 09  num_certs, 1);..
16960 7d 0a 0a 09 69 66 20 28 68 61 76 65 5f 70 69 76  }...if (have_piv
16970 20 3d 3d 20 31 29 20 7b 0a 09 09 6b 65 79 5f 72   == 1) {...key_r
16980 65 66 65 72 65 6e 63 65 20 3d 20 30 78 38 30 3b  eference = 0x80;
16990 0a 09 7d 0a 0a 09 2f 2a 20 49 73 73 75 65 20 50  ..}.../* Issue P
169a0 49 4e 20 56 65 72 69 66 79 20 2a 2f 0a 09 73 65  IN Verify */..se
169b0 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f  nd_ret = cackey_
169c0 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f 74 2c 20  send_apdu(slot, 
169d0 47 53 43 49 53 5f 43 4c 41 53 53 5f 49 53 4f 37  GSCIS_CLASS_ISO7
169e0 38 31 36 2c 20 47 53 43 49 53 5f 49 4e 53 54 52  816, GSCIS_INSTR
169f0 5f 56 45 52 49 46 59 2c 20 30 78 30 30 2c 20 6b  _VERIFY, 0x00, k
16a00 65 79 5f 72 65 66 65 72 65 6e 63 65 2c 20 73 69  ey_reference, si
16a10 7a 65 6f 66 28 63 61 63 5f 70 69 6e 29 2c 20 63  zeof(cac_pin), c
16a20 61 63 5f 70 69 6e 2c 20 30 78 30 30 2c 20 26 72  ac_pin, 0x00, &r
16a30 65 73 70 6f 6e 73 65 5f 63 6f 64 65 2c 20 4e 55  esponse_code, NU
16a40 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 69 66 20  LL, NULL);...if 
16a50 28 73 65 6e 64 5f 72 65 74 20 21 3d 20 43 41 43  (send_ret != CAC
16a60 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b  KEY_PCSC_S_OK) {
16a70 0a 09 09 69 66 20 28 28 72 65 73 70 6f 6e 73 65  ...if ((response
16a80 5f 63 6f 64 65 20 26 20 30 78 36 33 43 30 29 20  _code & 0x63C0) 
16a90 3d 3d 20 30 78 36 33 43 30 29 20 7b 0a 09 09 09  == 0x63C0) {....
16aa0 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 20  tries_remaining 
16ab0 3d 20 28 72 65 73 70 6f 6e 73 65 5f 63 6f 64 65  = (response_code
16ac0 20 26 20 30 78 46 29 3b 0a 0a 09 09 09 43 41 43   & 0xF);.....CAC
16ad0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
16ae0 28 22 50 49 4e 20 56 65 72 69 66 69 63 61 74 69  ("PIN Verificati
16af0 6f 6e 20 66 61 69 6c 65 64 2c 20 25 69 20 74 72  on failed, %i tr
16b00 69 65 73 20 72 65 6d 61 69 6e 69 6e 67 22 2c 20  ies remaining", 
16b10 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 29  tries_remaining)
16b20 3b 0a 0a 09 09 09 69 66 20 28 74 72 69 65 73 5f  ;.....if (tries_
16b30 72 65 6d 61 69 6e 69 6e 67 5f 70 29 20 7b 0a 09  remaining_p) {..
16b40 09 09 09 2a 74 72 69 65 73 5f 72 65 6d 61 69 6e  ...*tries_remain
16b50 69 6e 67 5f 70 20 3d 20 74 72 69 65 73 5f 72 65  ing_p = tries_re
16b60 6d 61 69 6e 69 6e 67 3b 0a 09 09 09 7d 0a 0a 09  maining;....}...
16b70 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
16b80 50 43 53 43 5f 45 5f 42 41 44 50 49 4e 29 3b 0a  PCSC_E_BADPIN);.
16b90 09 09 7d 0a 0a 09 09 69 66 20 28 72 65 73 70 6f  ..}....if (respo
16ba0 6e 73 65 5f 63 6f 64 65 20 3d 3d 20 30 78 36 39  nse_code == 0x69
16bb0 38 33 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  83) {....CACKEY_
16bc0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 50 49  DEBUG_PRINTF("PI
16bd0 4e 20 56 65 72 69 66 69 63 61 74 69 6f 6e 20 66  N Verification f
16be0 61 69 6c 65 64 2c 20 64 65 76 69 63 65 20 69 73  ailed, device is
16bf0 20 6c 6f 63 6b 65 64 22 29 3b 0a 0a 09 09 09 72   locked");.....r
16c00 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
16c10 43 5f 45 5f 4c 4f 43 4b 45 44 29 3b 0a 09 09 7d  C_E_LOCKED);...}
16c20 0a 0a 09 09 69 66 20 28 72 65 73 70 6f 6e 73 65  ....if (response
16c30 5f 63 6f 64 65 20 3d 3d 20 30 78 36 64 30 30 29  _code == 0x6d00)
16c40 20 7b 0a 09 09 09 69 66 20 28 72 65 74 72 69 65   {....if (retrie
16c50 73 20 3e 20 30 29 20 7b 0a 09 09 09 09 43 41 43  s > 0) {.....CAC
16c60 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
16c70 28 22 47 6f 74 20 49 53 4f 20 37 38 31 36 20 52  ("Got ISO 7816 R
16c80 65 73 70 6f 6e 73 65 20 5c 22 36 44 20 30 30 5c  esponse \"6D 00\
16c90 22 20 69 6e 20 72 65 73 70 6f 6e 73 65 20 74 6f  " in response to
16ca0 20 61 20 56 45 52 49 46 59 20 72 65 71 75 65 73   a VERIFY reques
16cb0 74 2e 22 29 3b 0a 09 09 09 09 43 41 43 4b 45 59  t.");.....CACKEY
16cc0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 57  _DEBUG_PRINTF("W
16cd0 65 20 64 69 64 20 6e 6f 74 20 65 78 70 65 63 74  e did not expect
16ce0 20 74 68 69 73 20 62 65 63 61 75 73 65 20 69 74   this because it
16cf0 20 69 73 20 6e 6f 74 20 6d 65 6e 74 69 6f 6e 65   is not mentione
16d00 64 20 69 6e 20 4e 49 53 54 20 53 50 20 38 30 30  d in NIST SP 800
16d10 2d 37 33 2d 33 20 50 61 72 74 20 32 20 53 65 63  -73-3 Part 2 Sec
16d20 74 69 6f 6e 20 33 2e 32 2e 31 20 6f 72 20 47 53  tion 3.2.1 or GS
16d30 43 2d 49 53 20 76 32 2e 31 22 29 3b 0a 09 09 09  C-IS v2.1");....
16d40 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
16d50 49 4e 54 46 28 22 57 65 20 61 72 65 20 67 6f 69  INTF("We are goi
16d60 6e 67 20 74 6f 20 74 72 79 20 74 6f 20 72 65 73  ng to try to res
16d70 65 74 20 74 68 65 20 63 61 72 64 20 61 6e 64 20  et the card and 
16d80 73 65 6c 65 63 74 20 74 68 65 20 61 70 70 6c 65  select the apple
16d90 74 20 61 67 61 69 6e 2e 22 29 3b 0a 0a 09 09 09  t again.");.....
16da0 09 63 61 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f  .cackey_mark_slo
16db0 74 5f 72 65 73 65 74 28 73 6c 6f 74 29 3b 0a 0a  t_reset(slot);..
16dc0 09 09 09 09 63 6f 6e 6e 65 63 74 5f 72 65 74 20  ....connect_ret 
16dd0 3d 20 63 61 63 6b 65 79 5f 63 6f 6e 6e 65 63 74  = cackey_connect
16de0 5f 63 61 72 64 28 73 6c 6f 74 29 3b 0a 09 09 09  _card(slot);....
16df0 09 69 66 20 28 63 6f 6e 6e 65 63 74 5f 72 65 74  .if (connect_ret
16e00 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f   != CACKEY_PCSC_
16e10 53 5f 4f 4b 29 20 7b 0a 09 09 09 09 09 43 41 43  S_OK) {......CAC
16e20 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
16e30 28 22 55 6e 61 62 6c 65 20 74 6f 20 72 65 63 6f  ("Unable to reco
16e40 6e 6e 65 63 74 20 61 66 74 65 72 20 72 65 73 65  nnect after rese
16e50 74 74 69 6e 67 20 74 68 65 20 63 61 72 64 2c 20  tting the card, 
16e60 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 65 72 72  returning in err
16e70 6f 72 2e 22 29 3b 0a 0a 09 09 09 09 09 72 65 74  or.");.......ret
16e80 75 72 6e 28 63 6f 6e 6e 65 63 74 5f 72 65 74 29  urn(connect_ret)
16e90 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43  ;.....}......CAC
16ea0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
16eb0 28 22 56 65 72 69 66 79 69 6e 67 20 77 65 20 73  ("Verifying we s
16ec0 74 69 6c 6c 20 68 61 76 65 20 61 20 74 6f 6b 65  till have a toke
16ed0 6e 2e 22 29 3b 0a 09 09 09 09 74 6f 6b 65 6e 5f  n.");.....token_
16ee0 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 74 6f 6b  ret = cackey_tok
16ef0 65 6e 5f 70 72 65 73 65 6e 74 28 73 6c 6f 74 29  en_present(slot)
16f00 3b 0a 09 09 09 09 69 66 20 28 74 6f 6b 65 6e 5f  ;.....if (token_
16f10 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43  ret != CACKEY_PC
16f20 53 43 5f 53 5f 54 4f 4b 45 4e 50 52 45 53 45 4e  SC_S_TOKENPRESEN
16f30 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59  T) {......CACKEY
16f40 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54  _DEBUG_PRINTF("T
16f50 6f 6b 65 6e 20 6e 6f 74 20 70 72 65 73 65 6e 74  oken not present
16f60 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 65  , returning in e
16f70 72 72 6f 72 2e 22 29 3b 0a 0a 09 09 09 09 09 72  rror.");.......r
16f80 65 74 75 72 6e 28 74 6f 6b 65 6e 5f 72 65 74 29  eturn(token_ret)
16f90 3b 0a 09 09 09 09 7d 0a 0a 0a 09 09 09 09 43 41  ;.....}.......CA
16fa0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
16fb0 46 28 22 54 72 79 69 6e 67 20 74 6f 20 6c 6f 67  F("Trying to log
16fc0 69 6e 20 61 67 61 69 6e 22 29 3b 0a 09 09 09 09  in again");.....
16fd0 72 65 74 75 72 6e 28 63 61 63 6b 65 79 5f 6c 6f  return(cackey_lo
16fe0 67 69 6e 28 73 6c 6f 74 2c 20 70 69 6e 2c 20 70  gin(slot, pin, p
16ff0 69 6e 5f 6c 65 6e 2c 20 74 72 69 65 73 5f 72 65  in_len, tries_re
17000 6d 61 69 6e 69 6e 67 5f 70 2c 20 72 65 74 72 69  maining_p, retri
17010 65 73 20 2d 20 31 29 29 3b 0a 09 09 09 7d 0a 09  es - 1));....}..
17020 09 7d 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43  .}....return(CAC
17030 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52  KEY_PCSC_E_GENER
17040 49 43 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  IC);..}...CACKEY
17050 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 50  _DEBUG_PRINTF("P
17060 49 4e 20 56 65 72 69 66 69 63 61 74 69 6f 6e 20  IN Verification 
17070 73 75 63 63 65 65 64 65 64 22 29 3b 0a 0a 09 72  succeeded");...r
17080 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
17090 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20  C_S_OK);.}../*. 
170a0 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20  * SYNPOSIS. *   
170b0 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55    .... *. * ARGU
170c0 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e  MENTS. *     ...
170d0 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41  . *. * RETURN VA
170e0 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20  LUE. *     .... 
170f0 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20  *. * NOTES. *   
17100 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61    .... *. */.sta
17110 74 69 63 20 73 73 69 7a 65 5f 74 20 63 61 63 6b  tic ssize_t cack
17120 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79  ey_pcsc_identity
17130 5f 74 6f 5f 6c 61 62 65 6c 28 73 74 72 75 63 74  _to_label(struct
17140 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65   cackey_pcsc_ide
17150 6e 74 69 74 79 20 2a 69 64 65 6e 74 69 74 79 2c  ntity *identity,
17160 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
17170 6c 61 62 65 6c 5f 62 75 66 2c 20 75 6e 73 69 67  label_buf, unsig
17180 6e 65 64 20 6c 6f 6e 67 20 6c 61 62 65 6c 5f 62  ned long label_b
17190 75 66 5f 6c 65 6e 29 20 7b 0a 09 75 6e 73 69 67  uf_len) {..unsig
171a0 6e 65 64 20 6c 6f 6e 67 20 63 65 72 74 69 66 69  ned long certifi
171b0 63 61 74 65 5f 6c 65 6e 3b 0a 09 76 6f 69 64 20  cate_len;..void 
171c0 2a 6c 61 62 65 6c 5f 61 73 6e 31 3b 0a 09 76 6f  *label_asn1;..vo
171d0 69 64 20 2a 63 65 72 74 69 66 69 63 61 74 65 3b  id *certificate;
171e0 0a 09 69 6e 74 20 78 35 30 39 5f 72 65 61 64 5f  ..int x509_read_
171f0 72 65 74 3b 0a 0a 09 63 65 72 74 69 66 69 63 61  ret;...certifica
17200 74 65 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e 63  te = identity->c
17210 65 72 74 69 66 69 63 61 74 65 3b 0a 09 63 65 72  ertificate;..cer
17220 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3d 20 69  tificate_len = i
17230 64 65 6e 74 69 74 79 2d 3e 63 65 72 74 69 66 69  dentity->certifi
17240 63 61 74 65 5f 6c 65 6e 3b 0a 0a 09 69 66 20 28  cate_len;...if (
17250 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20  certificate_len 
17260 3c 20 30 29 20 7b 0a 09 09 72 65 74 75 72 6e 28  < 0) {...return(
17270 2d 31 29 3b 0a 09 7d 0a 0a 09 78 35 30 39 5f 72  -1);..}...x509_r
17280 65 61 64 5f 72 65 74 20 3d 20 78 35 30 39 5f 74  ead_ret = x509_t
17290 6f 5f 73 75 62 6a 65 63 74 28 63 65 72 74 69 66  o_subject(certif
172a0 69 63 61 74 65 2c 20 63 65 72 74 69 66 69 63 61  icate, certifica
172b0 74 65 5f 6c 65 6e 2c 20 28 76 6f 69 64 20 2a 2a  te_len, (void **
172c0 29 20 26 6c 61 62 65 6c 5f 61 73 6e 31 29 3b 0a  ) &label_asn1);.
172d0 09 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72  .if (x509_read_r
172e0 65 74 20 3c 20 30 29 20 7b 0a 09 09 72 65 74 75  et < 0) {...retu
172f0 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 78 35 30  rn(-1);..}...x50
17300 39 5f 72 65 61 64 5f 72 65 74 20 3d 20 78 35 30  9_read_ret = x50
17310 39 5f 64 6e 5f 74 6f 5f 73 74 72 69 6e 67 28 6c  9_dn_to_string(l
17320 61 62 65 6c 5f 61 73 6e 31 2c 20 78 35 30 39 5f  abel_asn1, x509_
17330 72 65 61 64 5f 72 65 74 2c 20 28 63 68 61 72 20  read_ret, (char 
17340 2a 29 20 6c 61 62 65 6c 5f 62 75 66 2c 20 6c 61  *) label_buf, la
17350 62 65 6c 5f 62 75 66 5f 6c 65 6e 2c 20 22 43 4e  bel_buf_len, "CN
17360 22 29 3b 0a 09 69 66 20 28 78 35 30 39 5f 72 65  ");..if (x509_re
17370 61 64 5f 72 65 74 20 3c 3d 20 30 29 20 7b 0a 09  ad_ret <= 0) {..
17380 09 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3d  .x509_read_ret =
17390 20 78 35 30 39 5f 64 6e 5f 74 6f 5f 73 74 72 69   x509_dn_to_stri
173a0 6e 67 28 6c 61 62 65 6c 5f 61 73 6e 31 2c 20 78  ng(label_asn1, x
173b0 35 30 39 5f 72 65 61 64 5f 72 65 74 2c 20 28 63  509_read_ret, (c
173c0 68 61 72 20 2a 29 20 6c 61 62 65 6c 5f 62 75 66  har *) label_buf
173d0 2c 20 6c 61 62 65 6c 5f 62 75 66 5f 6c 65 6e 2c  , label_buf_len,
173e0 20 4e 55 4c 4c 29 3b 0a 0a 09 09 69 66 20 28 78   NULL);....if (x
173f0 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3c 3d 20  509_read_ret <= 
17400 30 29 20 7b 0a 09 09 09 72 65 74 75 72 6e 28 2d  0) {....return(-
17410 31 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 23 69 66 64  1);...}..}..#ifd
17420 65 66 20 43 41 43 4b 45 59 5f 50 41 52 41 4e 4f  ef CACKEY_PARANO
17430 49 44 0a 23 20 20 69 66 64 65 66 20 5f 50 4f 53  ID.#  ifdef _POS
17440 49 58 5f 53 53 49 5a 45 5f 4d 41 58 0a 09 69 66  IX_SSIZE_MAX..if
17450 20 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20   (x509_read_ret 
17460 3e 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d  > _POSIX_SSIZE_M
17470 41 58 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  AX) {...CACKEY_D
17480 45 42 55 47 5f 50 52 49 4e 54 46 28 22 78 35 30  EBUG_PRINTF("x50
17490 39 5f 72 65 61 64 5f 72 65 74 20 65 78 63 65 65  9_read_ret excee
174a0 64 73 20 6d 61 78 69 6d 75 6d 20 76 61 6c 75 65  ds maximum value
174b0 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66  , returning in f
174c0 61 69 6c 75 72 65 2e 20 28 6d 61 78 20 3d 20 25  ailure. (max = %
174d0 6c 69 2c 20 78 35 30 39 5f 72 65 61 64 5f 72 65  li, x509_read_re
174e0 74 20 3d 20 25 6c 75 29 22 2c 20 28 6c 6f 6e 67  t = %lu)", (long
174f0 29 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d  ) _POSIX_SSIZE_M
17500 41 58 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  AX, (unsigned lo
17510 6e 67 29 20 78 35 30 39 5f 72 65 61 64 5f 72 65  ng) x509_read_re
17520 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31  t);....return(-1
17530 29 3b 0a 09 7d 0a 23 20 20 65 6e 64 69 66 0a 23  );..}.#  endif.#
17540 65 6e 64 69 66 0a 0a 09 72 65 74 75 72 6e 28 78  endif...return(x
17550 35 30 39 5f 72 65 61 64 5f 72 65 74 29 3b 0a 7d  509_read_ret);.}
17560 0a 0a 2f 2a 20 52 65 74 75 72 6e 73 20 30 20 6f  ../* Returns 0 o
17570 6e 20 73 75 63 63 65 73 73 20 2a 2f 0a 73 74 61  n success */.sta
17580 74 69 63 20 69 6e 74 20 63 61 63 6b 65 79 5f 6d  tic int cackey_m
17590 75 74 65 78 5f 63 72 65 61 74 65 28 76 6f 69 64  utex_create(void
175a0 20 2a 2a 6d 75 74 65 78 29 20 7b 0a 09 70 74 68   **mutex) {..pth
175b0 72 65 61 64 5f 6d 75 74 65 78 5f 74 20 2a 70 74  read_mutex_t *pt
175c0 68 72 65 61 64 5f 6d 75 74 65 78 3b 0a 09 69 6e  hread_mutex;..in
175d0 74 20 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c  t pthread_retval
175e0 3b 0a 09 43 4b 5f 52 56 20 63 75 73 74 6f 6d 5f  ;..CK_RV custom_
175f0 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59  retval;...CACKEY
17600 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
17610 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
17620 28 63 61 63 6b 65 79 5f 61 72 67 73 2e 66 6c 61  (cackey_args.fla
17630 67 73 20 26 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b  gs & CKF_OS_LOCK
17640 49 4e 47 5f 4f 4b 29 20 3d 3d 20 43 4b 46 5f 4f  ING_OK) == CKF_O
17650 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20 7b 0a  S_LOCKING_OK) {.
17660 09 09 70 74 68 72 65 61 64 5f 6d 75 74 65 78 20  ..pthread_mutex 
17670 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28  = malloc(sizeof(
17680 2a 70 74 68 72 65 61 64 5f 6d 75 74 65 78 29 29  *pthread_mutex))
17690 3b 0a 09 09 69 66 20 28 21 70 74 68 72 65 61 64  ;...if (!pthread
176a0 5f 6d 75 74 65 78 29 20 7b 0a 09 09 09 43 41 43  _mutex) {....CAC
176b0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
176c0 28 22 46 61 69 6c 65 64 20 74 6f 20 61 6c 6c 6f  ("Failed to allo
176d0 63 61 74 65 20 6d 65 6d 6f 72 79 2e 22 29 3b 0a  cate memory.");.
176e0 0a 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a  ....return(-1);.
176f0 09 09 7d 0a 0a 09 09 70 74 68 72 65 61 64 5f 72  ..}....pthread_r
17700 65 74 76 61 6c 20 3d 20 70 74 68 72 65 61 64 5f  etval = pthread_
17710 6d 75 74 65 78 5f 69 6e 69 74 28 70 74 68 72 65  mutex_init(pthre
17720 61 64 5f 6d 75 74 65 78 2c 20 4e 55 4c 4c 29 3b  ad_mutex, NULL);
17730 0a 09 09 69 66 20 28 70 74 68 72 65 61 64 5f 72  ...if (pthread_r
17740 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
17750 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
17760 49 4e 54 46 28 22 70 74 68 72 65 61 64 5f 6d 75  INTF("pthread_mu
17770 74 65 78 5f 69 6e 69 74 28 29 20 72 65 74 75 72  tex_init() retur
17780 6e 65 64 20 65 72 72 6f 72 20 28 25 69 29 2e 22  ned error (%i)."
17790 2c 20 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c  , pthread_retval
177a0 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 2d 31  );.....return(-1
177b0 29 3b 0a 09 09 7d 0a 0a 09 09 2a 6d 75 74 65 78  );...}....*mutex
177c0 20 3d 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78   = pthread_mutex
177d0 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69 66  ;..} else {...if
177e0 20 28 63 61 63 6b 65 79 5f 61 72 67 73 2e 43 72   (cackey_args.Cr
177f0 65 61 74 65 4d 75 74 65 78 29 20 7b 0a 09 09 09  eateMutex) {....
17800 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 20 3d 20  custom_retval = 
17810 63 61 63 6b 65 79 5f 61 72 67 73 2e 43 72 65 61  cackey_args.Crea
17820 74 65 4d 75 74 65 78 28 6d 75 74 65 78 29 3b 0a  teMutex(mutex);.
17830 0a 09 09 09 69 66 20 28 63 75 73 74 6f 6d 5f 72  ....if (custom_r
17840 65 74 76 61 6c 20 21 3d 20 43 4b 52 5f 4f 4b 29  etval != CKR_OK)
17850 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45   {.....CACKEY_DE
17860 42 55 47 5f 50 52 49 4e 54 46 28 22 63 61 63 6b  BUG_PRINTF("cack
17870 65 79 5f 61 72 67 73 2e 43 72 65 61 74 65 4d 75  ey_args.CreateMu
17880 74 65 78 28 29 20 72 65 74 75 72 6e 65 64 20 65  tex() returned e
17890 72 72 6f 72 20 28 25 6c 69 29 2e 22 2c 20 28 6c  rror (%li).", (l
178a0 6f 6e 67 29 20 63 75 73 74 6f 6d 5f 72 65 74 76  ong) custom_retv
178b0 61 6c 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e  al);......return
178c0 28 2d 31 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a 09  (-1);....}...}..
178d0 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
178e0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
178f0 6e 67 20 73 75 63 65 73 73 66 75 6c 6c 79 20 28  ng sucessfully (
17900 30 29 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 30  0)");...return(0
17910 29 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 73  );.}../* Returns
17920 20 30 20 6f 6e 20 73 75 63 63 65 73 73 20 2a 2f   0 on success */
17930 0a 73 74 61 74 69 63 20 69 6e 74 20 63 61 63 6b  .static int cack
17940 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 76 6f  ey_mutex_lock(vo
17950 69 64 20 2a 6d 75 74 65 78 29 20 7b 0a 09 70 74  id *mutex) {..pt
17960 68 72 65 61 64 5f 6d 75 74 65 78 5f 74 20 2a 70  hread_mutex_t *p
17970 74 68 72 65 61 64 5f 6d 75 74 65 78 3b 0a 09 69  thread_mutex;..i
17980 6e 74 20 70 74 68 72 65 61 64 5f 72 65 74 76 61  nt pthread_retva
17990 6c 3b 0a 09 43 4b 5f 52 56 20 63 75 73 74 6f 6d  l;..CK_RV custom
179a0 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45  _retval;...CACKE
179b0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
179c0 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
179d0 28 28 63 61 63 6b 65 79 5f 61 72 67 73 2e 66 6c  ((cackey_args.fl
179e0 61 67 73 20 26 20 43 4b 46 5f 4f 53 5f 4c 4f 43  ags & CKF_OS_LOC
179f0 4b 49 4e 47 5f 4f 4b 29 20 3d 3d 20 43 4b 46 5f  KING_OK) == CKF_
17a00 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20 7b  OS_LOCKING_OK) {
17a10 0a 09 09 70 74 68 72 65 61 64 5f 6d 75 74 65 78  ...pthread_mutex
17a20 20 3d 20 6d 75 74 65 78 3b 0a 0a 09 09 70 74 68   = mutex;....pth
17a30 72 65 61 64 5f 72 65 74 76 61 6c 20 3d 20 70 74  read_retval = pt
17a40 68 72 65 61 64 5f 6d 75 74 65 78 5f 6c 6f 63 6b  hread_mutex_lock
17a50 28 70 74 68 72 65 61 64 5f 6d 75 74 65 78 29 3b  (pthread_mutex);
17a60 0a 09 09 69 66 20 28 70 74 68 72 65 61 64 5f 72  ...if (pthread_r
17a70 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
17a80 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
17a90 49 4e 54 46 28 22 70 74 68 72 65 61 64 5f 6d 75  INTF("pthread_mu
17aa0 74 65 78 5f 6c 6f 63 6b 28 29 20 72 65 74 75 72  tex_lock() retur
17ab0 6e 65 64 20 65 72 72 6f 72 20 28 25 69 29 2e 22  ned error (%i)."
17ac0 2c 20 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c  , pthread_retval
17ad0 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 2d 31  );.....return(-1
17ae0 29 3b 0a 09 09 7d 0a 09 7d 20 65 6c 73 65 20 7b  );...}..} else {
17af0 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 61 72  ...if (cackey_ar
17b00 67 73 2e 4c 6f 63 6b 4d 75 74 65 78 29 20 7b 0a  gs.LockMutex) {.
17b10 09 09 09 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c  ...custom_retval
17b20 20 3d 20 63 61 63 6b 65 79 5f 61 72 67 73 2e 4c   = cackey_args.L
17b30 6f 63 6b 4d 75 74 65 78 28 6d 75 74 65 78 29 3b  ockMutex(mutex);
17b40 0a 0a 09 09 09 69 66 20 28 63 75 73 74 6f 6d 5f  .....if (custom_
17b50 72 65 74 76 61 6c 20 21 3d 20 43 4b 52 5f 4f 4b  retval != CKR_OK
17b60 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  ) {.....CACKEY_D
17b70 45 42 55 47 5f 50 52 49 4e 54 46 28 22 63 61 63  EBUG_PRINTF("cac
17b80 6b 65 79 5f 61 72 67 73 2e 4c 6f 63 6b 4d 75 74  key_args.LockMut
17b90 65 78 28 29 20 72 65 74 75 72 6e 65 64 20 65 72  ex() returned er
17ba0 72 6f 72 20 28 25 6c 69 29 2e 22 2c 20 28 6c 6f  ror (%li).", (lo
17bb0 6e 67 29 20 63 75 73 74 6f 6d 5f 72 65 74 76 61  ng) custom_retva
17bc0 6c 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28  l);......return(
17bd0 2d 31 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a 09 7d  -1);....}...}..}
17be0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
17bf0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
17c00 67 20 73 75 63 65 73 73 66 75 6c 6c 79 20 28 30  g sucessfully (0
17c10 29 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 30 29  )");...return(0)
17c20 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 73 20  ;.}../* Returns 
17c30 30 20 6f 6e 20 73 75 63 63 65 73 73 20 2a 2f 0a  0 on success */.
17c40 73 74 61 74 69 63 20 69 6e 74 20 63 61 63 6b 65  static int cacke
17c50 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 76  y_mutex_unlock(v
17c60 6f 69 64 20 2a 6d 75 74 65 78 29 20 7b 0a 09 70  oid *mutex) {..p
17c70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 74 20 2a  thread_mutex_t *
17c80 70 74 68 72 65 61 64 5f 6d 75 74 65 78 3b 0a 09  pthread_mutex;..
17c90 69 6e 74 20 70 74 68 72 65 61 64 5f 72 65 74 76  int pthread_retv
17ca0 61 6c 3b 0a 09 43 4b 5f 52 56 20 63 75 73 74 6f  al;..CK_RV custo
17cb0 6d 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b  m_retval;...CACK
17cc0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
17cd0 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
17ce0 20 28 28 63 61 63 6b 65 79 5f 61 72 67 73 2e 66   ((cackey_args.f
17cf0 6c 61 67 73 20 26 20 43 4b 46 5f 4f 53 5f 4c 4f  lags & CKF_OS_LO
17d00 43 4b 49 4e 47 5f 4f 4b 29 20 3d 3d 20 43 4b 46  CKING_OK) == CKF
17d10 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20  _OS_LOCKING_OK) 
17d20 7b 0a 09 09 70 74 68 72 65 61 64 5f 6d 75 74 65  {...pthread_mute
17d30 78 20 3d 20 6d 75 74 65 78 3b 0a 0a 09 09 70 74  x = mutex;....pt
17d40 68 72 65 61 64 5f 72 65 74 76 61 6c 20 3d 20 70  hread_retval = p
17d50 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 75 6e 6c  thread_mutex_unl
17d60 6f 63 6b 28 70 74 68 72 65 61 64 5f 6d 75 74 65  ock(pthread_mute
17d70 78 29 3b 0a 09 09 69 66 20 28 70 74 68 72 65 61  x);...if (pthrea
17d80 64 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  d_retval != 0) {
17d90 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
17da0 5f 50 52 49 4e 54 46 28 22 70 74 68 72 65 61 64  _PRINTF("pthread
17db0 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 29 20  _mutex_unlock() 
17dc0 72 65 74 75 72 6e 65 64 20 65 72 72 6f 72 20 28  returned error (
17dd0 25 69 29 2e 22 2c 20 70 74 68 72 65 61 64 5f 72  %i).", pthread_r
17de0 65 74 76 61 6c 29 3b 0a 0a 09 09 09 72 65 74 75  etval);.....retu
17df0 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 09 7d 20 65  rn(-1);...}..} e
17e00 6c 73 65 20 7b 0a 09 09 69 66 20 28 63 61 63 6b  lse {...if (cack
17e10 65 79 5f 61 72 67 73 2e 55 6e 6c 6f 63 6b 4d 75  ey_args.UnlockMu
17e20 74 65 78 29 20 7b 0a 09 09 09 63 75 73 74 6f 6d  tex) {....custom
17e30 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
17e40 5f 61 72 67 73 2e 55 6e 6c 6f 63 6b 4d 75 74 65  _args.UnlockMute
17e50 78 28 6d 75 74 65 78 29 3b 0a 0a 09 09 09 69 66  x(mutex);.....if
17e60 20 28 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 20   (custom_retval 
17e70 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 09  != CKR_OK) {....
17e80 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
17e90 49 4e 54 46 28 22 63 61 63 6b 65 79 5f 61 72 67  INTF("cackey_arg
17ea0 73 2e 55 6e 6c 6f 63 6b 4d 75 74 65 78 28 29 20  s.UnlockMutex() 
17eb0 72 65 74 75 72 6e 65 64 20 65 72 72 6f 72 20 28  returned error (
17ec0 25 6c 69 29 2e 22 2c 20 28 6c 6f 6e 67 29 20 63  %li).", (long) c
17ed0 75 73 74 6f 6d 5f 72 65 74 76 61 6c 29 3b 0a 0a  ustom_retval);..
17ee0 09 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a  ....return(-1);.
17ef0 09 09 09 7d 0a 09 09 7d 0a 09 7d 0a 0a 09 43 41  ...}...}..}...CA
17f00 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
17f10 46 28 22 52 65 74 75 72 6e 69 6e 67 20 73 75 63  F("Returning suc
17f20 65 73 73 66 75 6c 6c 79 20 28 30 29 22 29 3b 0a  essfully (0)");.
17f30 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a  ..return(0);.}..
17f40 73 74 61 74 69 63 20 43 4b 5f 41 54 54 52 49 42  static CK_ATTRIB
17f50 55 54 45 5f 50 54 52 20 63 61 63 6b 65 79 5f 67  UTE_PTR cackey_g
17f60 65 74 5f 61 74 74 72 69 62 75 74 65 73 28 43 4b  et_attributes(CK
17f70 5f 4f 42 4a 45 43 54 5f 43 4c 41 53 53 20 6f 62  _OBJECT_CLASS ob
17f80 6a 65 63 74 63 6c 61 73 73 2c 20 73 74 72 75 63  jectclass, struc
17f90 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64  t cackey_pcsc_id
17fa0 65 6e 74 69 74 79 20 2a 69 64 65 6e 74 69 74 79  entity *identity
17fb0 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  , unsigned long 
17fc0 69 64 65 6e 74 69 74 79 5f 6e 75 6d 2c 20 43 4b  identity_num, CK
17fd0 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 43 6f  _ULONG_PTR pulCo
17fe0 75 6e 74 29 20 7b 0a 09 73 74 61 74 69 63 20 43  unt) {..static C
17ff0 4b 5f 42 42 4f 4f 4c 20 63 6b 5f 74 72 75 65 20  K_BBOOL ck_true 
18000 3d 20 31 3b 0a 09 73 74 61 74 69 63 20 43 4b 5f  = 1;..static CK_
18010 42 42 4f 4f 4c 20 63 6b 5f 66 61 6c 73 65 20 3d  BBOOL ck_false =
18020 20 30 3b 0a 09 73 74 61 74 69 63 20 43 4b 5f 54   0;..static CK_T
18030 52 55 53 54 20 63 6b 5f 74 72 75 73 74 65 64 20  RUST ck_trusted 
18040 3d 20 43 4b 5f 54 52 55 53 54 45 44 5f 44 45 4c  = CK_TRUSTED_DEL
18050 45 47 41 54 4f 52 3b 0a 09 43 4b 5f 55 4c 4f 4e  EGATOR;..CK_ULON
18060 47 20 6e 75 6d 61 74 74 72 73 20 3d 20 30 2c 20  G numattrs = 0, 
18070 72 65 74 76 61 6c 5f 63 6f 75 6e 74 3b 0a 09 43  retval_count;..C
18080 4b 5f 41 54 54 52 49 42 55 54 45 5f 54 59 50 45  K_ATTRIBUTE_TYPE
18090 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 3b   curr_attr_type;
180a0 0a 09 43 4b 5f 41 54 54 52 49 42 55 54 45 20 63  ..CK_ATTRIBUTE c
180b0 75 72 72 5f 61 74 74 72 2c 20 2a 72 65 74 76 61  urr_attr, *retva
180c0 6c 3b 0a 09 43 4b 5f 56 4f 49 44 5f 50 54 52 20  l;..CK_VOID_PTR 
180d0 70 56 61 6c 75 65 3b 0a 09 43 4b 5f 55 4c 4f 4e  pValue;..CK_ULON
180e0 47 20 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 09 43  G ulValueLen;..C
180f0 4b 5f 4f 42 4a 45 43 54 5f 43 4c 41 53 53 20 63  K_OBJECT_CLASS c
18100 6b 5f 6f 62 6a 65 63 74 5f 63 6c 61 73 73 3b 0a  k_object_class;.
18110 09 43 4b 5f 43 45 52 54 49 46 49 43 41 54 45 5f  .CK_CERTIFICATE_
18120 54 59 50 45 20 63 6b 5f 63 65 72 74 69 66 69 63  TYPE ck_certific
18130 61 74 65 5f 74 79 70 65 3b 0a 09 43 4b 5f 4b 45  ate_type;..CK_KE
18140 59 5f 54 59 50 45 20 63 6b 5f 6b 65 79 5f 74 79  Y_TYPE ck_key_ty
18150 70 65 3b 0a 09 43 4b 5f 55 54 46 38 43 48 41 52  pe;..CK_UTF8CHAR
18160 20 75 63 54 6d 70 42 75 66 5b 31 30 32 34 5d 3b   ucTmpBuf[1024];
18170 0a 09 53 48 41 31 43 6f 6e 74 65 78 74 20 73 68  ..SHA1Context sh
18180 61 31 5f 63 74 78 3b 0a 09 4d 44 35 5f 43 54 58  a1_ctx;..MD5_CTX
18190 20 6d 64 35 5f 63 74 78 3b 0a 09 75 69 6e 74 38   md5_ctx;..uint8
181a0 5f 74 20 73 68 61 31 5f 68 61 73 68 5b 53 48 41  _t sha1_hash[SHA
181b0 31 48 61 73 68 53 69 7a 65 5d 3b 0a 09 75 69 6e  1HashSize];..uin
181c0 74 38 5f 74 20 6d 64 35 5f 68 61 73 68 5b 4d 44  t8_t md5_hash[MD
181d0 35 48 61 73 68 53 69 7a 65 5d 3b 0a 09 75 6e 73  5HashSize];..uns
181e0 69 67 6e 65 64 20 63 68 61 72 20 2a 63 65 72 74  igned char *cert
181f0 69 66 69 63 61 74 65 3b 0a 09 73 73 69 7a 65 5f  ificate;..ssize_
18200 74 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65  t certificate_le
18210 6e 20 3d 20 2d 31 2c 20 78 35 30 39 5f 72 65 61  n = -1, x509_rea
18220 64 5f 72 65 74 3b 0a 09 69 6e 74 20 70 56 61 6c  d_ret;..int pVal
18230 75 65 5f 66 72 65 65 3b 0a 0a 09 43 41 43 4b 45  ue_free;...CACKE
18240 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
18250 43 61 6c 6c 65 64 20 28 6f 62 6a 65 63 74 43 6c  Called (objectCl
18260 61 73 73 20 3d 20 25 6c 75 2c 20 69 64 65 6e 74  ass = %lu, ident
18270 69 74 79 5f 6e 75 6d 20 3d 20 25 6c 75 29 2e 22  ity_num = %lu)."
18280 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
18290 29 20 6f 62 6a 65 63 74 63 6c 61 73 73 2c 20 69  ) objectclass, i
182a0 64 65 6e 74 69 74 79 5f 6e 75 6d 29 3b 0a 0a 09  dentity_num);...
182b0 2a 70 75 6c 43 6f 75 6e 74 20 3d 20 30 3b 0a 0a  *pulCount = 0;..
182c0 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73  .if (objectclass
182d0 20 21 3d 20 43 4b 4f 5f 43 45 52 54 49 46 49 43   != CKO_CERTIFIC
182e0 41 54 45 20 26 26 20 6f 62 6a 65 63 74 63 6c 61  ATE && objectcla
182f0 73 73 20 21 3d 20 43 4b 4f 5f 50 55 42 4c 49 43  ss != CKO_PUBLIC
18300 5f 4b 45 59 20 26 26 20 6f 62 6a 65 63 74 63 6c  _KEY && objectcl
18310 61 73 73 20 21 3d 20 43 4b 4f 5f 50 52 49 56 41  ass != CKO_PRIVA
18320 54 45 5f 4b 45 59 20 26 26 20 6f 62 6a 65 63 74  TE_KEY && object
18330 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 4e 45 54  class != CKO_NET
18340 53 43 41 50 45 5f 54 52 55 53 54 29 20 7b 0a 09  SCAPE_TRUST) {..
18350 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
18360 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
18370 30 20 6f 62 6a 65 63 74 73 20 28 4e 55 4c 4c 29  0 objects (NULL)
18380 2c 20 69 6e 76 61 6c 69 64 20 6f 62 6a 65 63 74  , invalid object
18390 20 63 6c 61 73 73 22 29 3b 0a 0a 09 09 72 65 74   class");....ret
183a0 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09  urn(NULL);..}...
183b0 2f 2a 20 47 65 74 20 43 65 72 74 20 2a 2f 0a 09  /* Get Cert */..
183c0 69 66 20 28 69 64 65 6e 74 69 74 79 20 3d 3d 20  if (identity == 
183d0 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
183e0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
183f0 65 74 75 72 6e 69 6e 67 20 30 20 6f 62 6a 65 63  eturning 0 objec
18400 74 73 20 28 4e 55 4c 4c 29 2c 20 69 6e 76 61 6c  ts (NULL), inval
18410 69 64 20 69 64 65 6e 74 69 79 20 70 72 6f 76 69  id identiy provi
18420 64 65 64 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ded");....return
18430 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 63 65 72  (NULL);..}...cer
18440 74 69 66 69 63 61 74 65 20 3d 20 69 64 65 6e 74  tificate = ident
18450 69 74 79 2d 3e 63 65 72 74 69 66 69 63 61 74 65  ity->certificate
18460 3b 0a 09 63 65 72 74 69 66 69 63 61 74 65 5f 6c  ;..certificate_l
18470 65 6e 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e 63  en = identity->c
18480 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 3b 0a  ertificate_len;.
18490 0a 09 69 66 20 28 63 65 72 74 69 66 69 63 61 74  ..if (certificat
184a0 65 5f 6c 65 6e 20 3d 3d 20 2d 31 20 7c 7c 20 63  e_len == -1 || c
184b0 65 72 74 69 66 69 63 61 74 65 20 3d 3d 20 4e 55  ertificate == NU
184c0 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
184d0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
184e0 75 72 6e 69 6e 67 20 30 20 6f 62 6a 65 63 74 73  urning 0 objects
184f0 20 28 4e 55 4c 4c 29 2c 20 74 68 69 73 20 69 64   (NULL), this id
18500 65 6e 74 69 74 79 20 64 6f 65 73 20 6e 6f 74 20  entity does not 
18510 68 61 76 65 20 61 6e 20 58 2e 35 30 39 20 63 65  have an X.509 ce
18520 72 74 69 66 69 63 61 74 65 20 61 73 73 6f 63 69  rtificate associ
18530 61 74 65 64 20 77 69 74 68 20 69 74 20 61 6e 64  ated with it and
18540 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 22 29   will not work")
18550 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c  ;....return(NULL
18560 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 56 65 72 69 66  );..}.../* Verif
18570 79 20 74 68 61 74 20 63 65 72 74 69 66 69 63 61  y that certifica
18580 74 65 20 69 73 20 41 53 4e 2e 31 20 65 6e 63 6f  te is ASN.1 enco
18590 64 65 64 20 58 2e 35 30 39 20 63 65 72 74 69 66  ded X.509 certif
185a0 69 63 61 74 65 20 2a 2f 0a 09 69 66 20 28 78 35  icate */..if (x5
185b0 30 39 5f 74 6f 5f 73 65 72 69 61 6c 28 63 65 72  09_to_serial(cer
185c0 74 69 66 69 63 61 74 65 2c 20 63 65 72 74 69 66  tificate, certif
185d0 69 63 61 74 65 5f 6c 65 6e 2c 20 4e 55 4c 4c 29  icate_len, NULL)
185e0 20 3c 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59   < 0) {...CACKEY
185f0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
18600 65 74 75 72 6e 69 6e 67 20 30 20 6f 62 6a 65 63  eturning 0 objec
18610 74 73 20 28 4e 55 4c 4c 29 2c 20 74 68 65 20 58  ts (NULL), the X
18620 2e 35 30 39 20 63 65 72 74 69 66 69 63 61 74 65  .509 certificate
18630 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
18640 20 74 68 69 73 20 69 64 65 6e 74 69 74 79 20 69   this identity i
18650 73 20 6e 6f 74 20 76 61 6c 69 64 22 29 3b 0a 0a  s not valid");..
18660 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a  ..return(NULL);.
18670 09 7d 0a 0a 09 72 65 74 76 61 6c 5f 63 6f 75 6e  .}...retval_coun
18680 74 20 3d 20 36 34 3b 0a 09 72 65 74 76 61 6c 20  t = 64;..retval 
18690 3d 20 6d 61 6c 6c 6f 63 28 72 65 74 76 61 6c 5f  = malloc(retval_
186a0 63 6f 75 6e 74 20 2a 20 73 69 7a 65 6f 66 28 2a  count * sizeof(*
186b0 72 65 74 76 61 6c 29 29 3b 0a 0a 09 66 6f 72 20  retval));...for 
186c0 28 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 20  (curr_attr_type 
186d0 3d 20 30 3b 20 63 75 72 72 5f 61 74 74 72 5f 74  = 0; curr_attr_t
186e0 79 70 65 20 3c 20 30 78 63 65 35 33 36 33 62 66  ype < 0xce5363bf
186f0 3b 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65  ; curr_attr_type
18700 2b 2b 29 20 7b 0a 09 09 69 66 20 28 63 75 72 72  ++) {...if (curr
18710 5f 61 74 74 72 5f 74 79 70 65 20 3d 3d 20 30 78  _attr_type == 0x
18720 38 30 30 29 20 7b 0a 09 09 09 63 75 72 72 5f 61  800) {....curr_a
18730 74 74 72 5f 74 79 70 65 20 3d 20 30 78 63 65 35  ttr_type = 0xce5
18740 33 36 33 30 30 3b 0a 09 09 7d 0a 0a 09 09 70 56  36300;...}....pV
18750 61 6c 75 65 5f 66 72 65 65 20 3d 20 30 3b 0a 09  alue_free = 0;..
18760 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a  .pValue = NULL;.
18770 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 28  ..ulValueLen = (
18780 43 4b 5f 4c 4f 4e 47 29 20 2d 31 3b 0a 0a 09 09  CK_LONG) -1;....
18790 73 77 69 74 63 68 20 28 63 75 72 72 5f 61 74 74  switch (curr_att
187a0 72 5f 74 79 70 65 29 20 7b 0a 09 09 09 63 61 73  r_type) {....cas
187b0 65 20 43 4b 41 5f 43 4c 41 53 53 3a 0a 09 09 09  e CKA_CLASS:....
187c0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
187d0 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67  INTF("Requesting
187e0 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 43   attribute CKA_C
187f0 4c 41 53 53 20 28 30 78 25 30 38 6c 78 29 20 2e  LASS (0x%08lx) .
18800 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ..", (unsigned l
18810 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74  ong) curr_attr_t
18820 79 70 65 29 3b 0a 0a 09 09 09 09 63 6b 5f 6f 62  ype);......ck_ob
18830 6a 65 63 74 5f 63 6c 61 73 73 20 3d 20 6f 62 6a  ject_class = obj
18840 65 63 74 63 6c 61 73 73 3b 0a 0a 09 09 09 09 70  ectclass;......p
18850 56 61 6c 75 65 20 3d 20 26 63 6b 5f 6f 62 6a 65  Value = &ck_obje
18860 63 74 5f 63 6c 61 73 73 3b 0a 09 09 09 09 75 6c  ct_class;.....ul
18870 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f  ValueLen = sizeo
18880 66 28 63 6b 5f 6f 62 6a 65 63 74 5f 63 6c 61 73  f(ck_object_clas
18890 73 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f  s);......CACKEY_
188a0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
188b0 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75  .. returning %lu
188c0 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73   (%p/%lu)", (uns
188d0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43  igned long) *((C
188e0 4b 5f 4f 42 4a 45 43 54 5f 43 4c 41 53 53 20 2a  K_OBJECT_CLASS *
188f0 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75  ) pValue), pValu
18900 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  e, (unsigned lon
18910 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a  g) ulValueLen);.
18920 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
18930 61 73 65 20 43 4b 41 5f 54 4f 4b 45 4e 3a 0a 09  ase CKA_TOKEN:..
18940 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
18950 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69  PRINTF("Requesti
18960 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41  ng attribute CKA
18970 5f 54 4f 4b 45 4e 20 28 30 78 25 30 38 6c 78 29  _TOKEN (0x%08lx)
18980 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64   ...", (unsigned
18990 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72   long) curr_attr
189a0 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 70 56 61  _type);......pVa
189b0 6c 75 65 20 3d 20 26 63 6b 5f 74 72 75 65 3b 0a  lue = &ck_true;.
189c0 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ....ulValueLen =
189d0 20 73 69 7a 65 6f 66 28 63 6b 5f 74 72 75 65 29   sizeof(ck_true)
189e0 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  ;......CACKEY_DE
189f0 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
18a00 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28   returning %lu (
18a10 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67  %p/%lu)", (unsig
18a20 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f  ned long) *((CK_
18a30 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29  BBOOL *) pValue)
18a40 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67  , pValue, (unsig
18a50 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75  ned long) ulValu
18a60 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61  eLen);......brea
18a70 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 50  k;....case CKA_P
18a80 52 49 56 41 54 45 3a 0a 09 09 09 09 43 41 43 4b  RIVATE:.....CACK
18a90 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
18aa0 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72  "Requesting attr
18ab0 69 62 75 74 65 20 43 4b 41 5f 50 52 49 56 41 54  ibute CKA_PRIVAT
18ac0 45 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22  E (0x%08lx) ..."
18ad0 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
18ae0 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65  ) curr_attr_type
18af0 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65  );......if (obje
18b00 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 4e  ctclass != CKO_N
18b10 45 54 53 43 41 50 45 5f 54 52 55 53 54 29 20 7b  ETSCAPE_TRUST) {
18b20 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
18b30 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
18b40 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20  but not getting 
18b50 69 74 20 62 65 63 61 75 73 65 20 77 65 20 61 72  it because we ar
18b60 65 20 6e 6f 74 20 61 20 4e 65 74 73 63 61 70 65  e not a Netscape
18b70 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29 3b   trust object");
18b80 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .......break;...
18b90 09 09 7d 0a 0a 09 09 09 09 70 56 61 6c 75 65 20  ..}......pValue 
18ba0 3d 20 26 63 6b 5f 66 61 6c 73 65 3b 0a 09 09 09  = &ck_false;....
18bb0 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69  .ulValueLen = si
18bc0 7a 65 6f 66 28 63 6b 5f 66 61 6c 73 65 29 3b 0a  zeof(ck_false);.
18bd0 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
18be0 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72  G_PRINTF(" ... r
18bf0 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70  eturning %lu (%p
18c00 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65  /%lu)", (unsigne
18c10 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42  d long) *((CK_BB
18c20 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c 20  OOL *) pValue), 
18c30 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65  pValue, (unsigne
18c40 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c  d long) ulValueL
18c50 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b  en);......break;
18c60 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 54 52 55  ....case CKA_TRU
18c70 53 54 45 44 3a 0a 09 09 09 09 43 41 43 4b 45 59  STED:.....CACKEY
18c80 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
18c90 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62  equesting attrib
18ca0 75 74 65 20 43 4b 41 5f 54 52 55 53 54 45 44 20  ute CKA_TRUSTED 
18cb0 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20  (0x%08lx) ...", 
18cc0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
18cd0 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b  curr_attr_type);
18ce0 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74  ......if (object
18cf0 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54  class == CKO_NET
18d00 53 43 41 50 45 5f 54 52 55 53 54 29 20 7b 0a 09  SCAPE_TRUST) {..
18d10 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
18d20 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75  _PRINTF(" ... bu
18d30 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74  t not getting it
18d40 20 62 65 63 61 75 73 65 20 77 65 20 61 72 65 20   because we are 
18d50 61 20 4e 65 74 73 63 61 70 65 20 74 72 75 73 74  a Netscape trust
18d60 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09   object");......
18d70 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09  .break;.....}...
18d80 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f  ...pValue = &ck_
18d90 74 72 75 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75  true;.....ulValu
18da0 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b  eLen = sizeof(ck
18db0 5f 74 72 75 65 29 3b 0a 0a 09 09 09 09 43 41 43  _true);......CAC
18dc0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
18dd0 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67  (" ... returning
18de0 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20   %lu (%p/%lu)", 
18df0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
18e00 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70  *((CK_BBOOL *) p
18e10 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20  Value), pValue, 
18e20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
18e30 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09  ulValueLen);....
18e40 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
18e50 20 43 4b 41 5f 4d 4f 44 49 46 49 41 42 4c 45 3a   CKA_MODIFIABLE:
18e60 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
18e70 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73  G_PRINTF("Reques
18e80 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43  ting attribute C
18e90 4b 41 5f 4d 4f 44 49 46 49 41 42 4c 45 20 28 30  KA_MODIFIABLE (0
18ea0 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75  x%08lx) ...", (u
18eb0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75  nsigned long) cu
18ec0 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a  rr_attr_type);..
18ed0 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b  ....pValue = &ck
18ee0 5f 66 61 6c 73 65 3b 0a 09 09 09 09 75 6c 56 61  _false;.....ulVa
18ef0 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28  lueLen = sizeof(
18f00 63 6b 5f 66 61 6c 73 65 29 3b 0a 0a 09 09 09 09  ck_false);......
18f10 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
18f20 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e  NTF(" ... return
18f30 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29  ing %lu (%p/%lu)
18f40 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
18f50 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a  g) *((CK_BBOOL *
18f60 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75  ) pValue), pValu
18f70 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  e, (unsigned lon
18f80 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a  g) ulValueLen);.
18f90 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
18fa0 61 73 65 20 43 4b 41 5f 4c 41 42 45 4c 3a 0a 09  ase CKA_LABEL:..
18fb0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
18fc0 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69  PRINTF("Requesti
18fd0 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41  ng attribute CKA
18fe0 5f 4c 41 42 45 4c 20 28 30 78 25 30 38 6c 78 29  _LABEL (0x%08lx)
18ff0 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64   ...", (unsigned
19000 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72   long) curr_attr
19010 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20  _type);......if 
19020 28 69 64 65 6e 74 69 74 79 2d 3e 69 64 5f 74 79  (identity->id_ty
19030 70 65 20 3d 3d 20 43 41 43 4b 45 59 5f 49 44 5f  pe == CACKEY_ID_
19040 54 59 50 45 5f 50 49 56 29 20 7b 0a 09 09 09 09  TYPE_PIV) {.....
19050 09 70 56 61 6c 75 65 20 3d 20 69 64 65 6e 74 69  .pValue = identi
19060 74 79 2d 3e 63 61 72 64 2e 70 69 76 2e 6c 61 62  ty->card.piv.lab
19070 65 6c 3b 0a 09 09 09 09 09 75 6c 56 61 6c 75 65  el;......ulValue
19080 4c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 70 56 61  Len = strlen(pVa
19090 6c 75 65 29 3b 0a 09 09 09 09 7d 20 65 6c 73 65  lue);.....} else
190a0 20 7b 0a 09 09 09 09 09 75 6c 56 61 6c 75 65 4c   {......ulValueL
190b0 65 6e 20 3d 20 73 6e 70 72 69 6e 74 66 28 28 63  en = snprintf((c
190c0 68 61 72 20 2a 29 20 75 63 54 6d 70 42 75 66 2c  har *) ucTmpBuf,
190d0 20 73 69 7a 65 6f 66 28 75 63 54 6d 70 42 75 66   sizeof(ucTmpBuf
190e0 29 2c 20 22 49 64 65 6e 74 69 74 79 20 23 25 6c  ), "Identity #%l
190f0 75 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  u", (unsigned lo
19100 6e 67 29 20 69 64 65 6e 74 69 74 79 5f 6e 75 6d  ng) identity_num
19110 29 3b 0a 09 09 09 09 09 70 56 61 6c 75 65 20 3d  );......pValue =
19120 20 75 63 54 6d 70 42 75 66 3b 0a 0a 09 09 09 09   ucTmpBuf;......
19130 09 69 66 20 28 75 6c 56 61 6c 75 65 4c 65 6e 20  .if (ulValueLen 
19140 3e 3d 20 73 69 7a 65 6f 66 28 75 63 54 6d 70 42  >= sizeof(ucTmpB
19150 75 66 29 29 20 7b 0a 09 09 09 09 09 09 75 6c 56  uf)) {.......ulV
19160 61 6c 75 65 4c 65 6e 20 3d 20 30 3b 0a 09 09 09  alueLen = 0;....
19170 09 09 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c  ...pValue = NULL
19180 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 0a  ;......}.....}..
19190 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
191a0 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65  _PRINTF(" ... re
191b0 74 75 72 6e 69 6e 67 20 28 25 70 2f 25 6c 75 29  turning (%p/%lu)
191c0 22 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69  ", pValue, (unsi
191d0 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c  gned long) ulVal
191e0 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65  ueLen);......bre
191f0 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f  ak;....case CKA_
19200 56 41 4c 55 45 3a 0a 09 09 09 09 43 41 43 4b 45  VALUE:.....CACKE
19210 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
19220 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69  Requesting attri
19230 62 75 74 65 20 43 4b 41 5f 56 41 4c 55 45 20 28  bute CKA_VALUE (
19240 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28  0x%08lx) ...", (
19250 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63  unsigned long) c
19260 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a  urr_attr_type);.
19270 0a 09 09 09 09 73 77 69 74 63 68 20 28 6f 62 6a  .....switch (obj
19280 65 63 74 63 6c 61 73 73 29 20 7b 0a 09 09 09 09  ectclass) {.....
19290 09 63 61 73 65 20 43 4b 4f 5f 50 52 49 56 41 54  .case CKO_PRIVAT
192a0 45 5f 4b 45 59 3a 0a 09 09 09 09 09 09 43 41 43  E_KEY:.......CAC
192b0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
192c0 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67  (" ... but not g
192d0 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73  etting it becaus
192e0 65 20 77 65 20 61 72 65 20 61 20 70 72 69 76 61  e we are a priva
192f0 74 65 20 6b 65 79 2e 22 29 3b 0a 0a 09 09 09 09  te key.");......
19300 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 63 61  ..break;......ca
19310 73 65 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f  se CKO_NETSCAPE_
19320 54 52 55 53 54 3a 0a 09 09 09 09 09 09 43 41 43  TRUST:.......CAC
19330 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
19340 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67  (" ... but not g
19350 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73  etting it becaus
19360 65 20 77 65 20 61 72 65 20 61 20 4e 65 74 73 63  e we are a Netsc
19370 61 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74  ape trust object
19380 22 29 3b 0a 0a 09 09 09 09 09 09 62 72 65 61 6b  ");........break
19390 3b 0a 09 09 09 09 09 63 61 73 65 20 43 4b 4f 5f  ;......case CKO_
193a0 50 55 42 4c 49 43 5f 4b 45 59 3a 0a 09 09 09 09  PUBLIC_KEY:.....
193b0 09 09 69 66 20 28 63 65 72 74 69 66 69 63 61 74  ..if (certificat
193c0 65 5f 6c 65 6e 20 3e 3d 20 30 29 20 7b 0a 09 09  e_len >= 0) {...
193d0 09 09 09 09 09 78 35 30 39 5f 72 65 61 64 5f 72  .....x509_read_r
193e0 65 74 20 3d 20 78 35 30 39 5f 74 6f 5f 70 75 62  et = x509_to_pub
193f0 6b 65 79 28 63 65 72 74 69 66 69 63 61 74 65 2c  key(certificate,
19400 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e   certificate_len
19410 2c 20 26 70 56 61 6c 75 65 29 3b 0a 09 09 09 09  , &pValue);.....
19420 09 09 09 69 66 20 28 78 35 30 39 5f 72 65 61 64  ...if (x509_read
19430 5f 72 65 74 20 3c 20 30 29 20 7b 20 0a 09 09 09  _ret < 0) { ....
19440 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 4e 55  .....pValue = NU
19450 4c 4c 3b 0a 09 09 09 09 09 09 09 7d 20 65 6c 73  LL;........} els
19460 65 20 7b 0a 09 09 09 09 09 09 09 09 75 6c 56 61  e {.........ulVa
19470 6c 75 65 4c 65 6e 20 3d 20 78 35 30 39 5f 72 65  lueLen = x509_re
19480 61 64 5f 72 65 74 3b 0a 09 09 09 09 09 09 09 7d  ad_ret;........}
19490 0a 09 09 09 09 09 09 7d 0a 0a 09 09 09 09 09 09  .......}........
194a0 62 72 65 61 6b 3b 0a 09 09 09 09 09 63 61 73 65  break;......case
194b0 20 43 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 45   CKO_CERTIFICATE
194c0 3a 0a 09 09 09 09 09 09 70 56 61 6c 75 65 20 3d  :.......pValue =
194d0 20 63 65 72 74 69 66 69 63 61 74 65 3b 0a 09 09   certificate;...
194e0 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ....ulValueLen =
194f0 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e   certificate_len
19500 3b 0a 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a  ;........break;.
19510 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45  ....}......CACKE
19520 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
19530 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25   ... returning %
19540 70 2f 25 6c 75 22 2c 20 70 56 61 6c 75 65 2c 20  p/%lu", pValue, 
19550 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
19560 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09  ulValueLen);....
19570 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
19580 20 43 4b 41 5f 49 53 53 55 45 52 3a 0a 09 09 09   CKA_ISSUER:....
19590 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
195a0 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67  INTF("Requesting
195b0 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 49   attribute CKA_I
195c0 53 53 55 45 52 20 28 30 78 25 30 38 6c 78 29 20  SSUER (0x%08lx) 
195d0 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  ...", (unsigned 
195e0 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f  long) curr_attr_
195f0 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28  type);......if (
19600 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43  objectclass != C
19610 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 45 20 26  KO_CERTIFICATE &
19620 26 20 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d  & objectclass !=
19630 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52   CKO_NETSCAPE_TR
19640 55 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b  UST) {......CACK
19650 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
19660 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65  " ... but not ge
19670 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65  tting it because
19680 20 77 65 20 61 72 65 20 6e 6f 74 20 61 20 63 65   we are not a ce
19690 72 74 69 66 69 63 61 74 65 20 6f 72 20 4e 65 74  rtificate or Net
196a0 73 63 61 70 65 20 74 72 75 73 74 20 6f 62 6a 65  scape trust obje
196b0 63 74 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61  ct");.......brea
196c0 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69 66  k;.....}......if
196d0 20 28 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65   (certificate_le
196e0 6e 20 3e 3d 20 30 29 20 7b 0a 09 09 09 09 09 78  n >= 0) {......x
196f0 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3d 20 78  509_read_ret = x
19700 35 30 39 5f 74 6f 5f 69 73 73 75 65 72 28 63 65  509_to_issuer(ce
19710 72 74 69 66 69 63 61 74 65 2c 20 63 65 72 74 69  rtificate, certi
19720 66 69 63 61 74 65 5f 6c 65 6e 2c 20 26 70 56 61  ficate_len, &pVa
19730 6c 75 65 29 3b 0a 09 09 09 09 09 69 66 20 28 78  lue);......if (x
19740 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3c 20 30  509_read_ret < 0
19750 29 20 7b 0a 09 09 09 09 09 09 70 56 61 6c 75 65  ) {.......pValue
19760 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 7d 20   = NULL;......} 
19770 65 6c 73 65 20 7b 0a 09 09 09 09 09 09 75 6c 56  else {.......ulV
19780 61 6c 75 65 4c 65 6e 20 3d 20 78 35 30 39 5f 72  alueLen = x509_r
19790 65 61 64 5f 72 65 74 3b 0a 09 09 09 09 09 7d 0a  ead_ret;......}.
197a0 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45  ....}......CACKE
197b0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
197c0 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25   ... returning %
197d0 70 2f 25 6c 75 22 2c 20 70 56 61 6c 75 65 2c 20  p/%lu", pValue, 
197e0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
197f0 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09  ulValueLen);....
19800 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
19810 20 43 4b 41 5f 53 45 52 49 41 4c 5f 4e 55 4d 42   CKA_SERIAL_NUMB
19820 45 52 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  ER:.....CACKEY_D
19830 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71  EBUG_PRINTF("Req
19840 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74  uesting attribut
19850 65 20 43 4b 41 5f 53 45 52 49 41 4c 5f 4e 55 4d  e CKA_SERIAL_NUM
19860 42 45 52 20 28 30 78 25 30 38 6c 78 29 20 2e 2e  BER (0x%08lx) ..
19870 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  .", (unsigned lo
19880 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79  ng) curr_attr_ty
19890 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62  pe);......if (ob
198a0 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f  jectclass != CKO
198b0 5f 43 45 52 54 49 46 49 43 41 54 45 20 26 26 20  _CERTIFICATE && 
198c0 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43  objectclass != C
198d0 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53  KO_NETSCAPE_TRUS
198e0 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59  T) {......CACKEY
198f0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
19900 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74  ... but not gett
19910 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77  ing it because w
19920 65 20 61 72 65 20 6e 6f 74 20 61 20 63 65 72 74  e are not a cert
19930 69 66 69 63 61 74 65 20 6f 72 20 4e 65 74 73 63  ificate or Netsc
19940 61 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74  ape trust object
19950 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b  ");.......break;
19960 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69 66 20 28  .....}......if (
19970 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20  certificate_len 
19980 3e 3d 20 30 29 20 7b 0a 09 09 09 09 09 78 35 30  >= 0) {......x50
19990 39 5f 72 65 61 64 5f 72 65 74 20 3d 20 78 35 30  9_read_ret = x50
199a0 39 5f 74 6f 5f 73 65 72 69 61 6c 28 63 65 72 74  9_to_serial(cert
199b0 69 66 69 63 61 74 65 2c 20 63 65 72 74 69 66 69  ificate, certifi
199c0 63 61 74 65 5f 6c 65 6e 2c 20 26 70 56 61 6c 75  cate_len, &pValu
199d0 65 29 3b 0a 09 09 09 09 09 69 66 20 28 78 35 30  e);......if (x50
199e0 39 5f 72 65 61 64 5f 72 65 74 20 3c 20 30 29 20  9_read_ret < 0) 
199f0 7b 0a 09 09 09 09 09 09 70 56 61 6c 75 65 20 3d  {.......pValue =
19a00 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 7d 20 65 6c   NULL;......} el
19a10 73 65 20 7b 0a 09 09 09 09 09 09 75 6c 56 61 6c  se {.......ulVal
19a20 75 65 4c 65 6e 20 3d 20 78 35 30 39 5f 72 65 61  ueLen = x509_rea
19a30 64 5f 72 65 74 3b 0a 09 09 09 09 09 7d 0a 09 09  d_ret;......}...
19a40 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f  ..}......CACKEY_
19a50 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
19a60 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 28 25 70  .. returning (%p
19a70 2f 25 6c 75 29 22 2c 20 70 56 61 6c 75 65 2c 20  /%lu)", pValue, 
19a80 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
19a90 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09  ulValueLen);....
19aa0 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
19ab0 20 43 4b 41 5f 53 55 42 4a 45 43 54 3a 0a 09 09   CKA_SUBJECT:...
19ac0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
19ad0 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e  RINTF("Requestin
19ae0 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f  g attribute CKA_
19af0 53 55 42 4a 45 43 54 20 28 30 78 25 30 38 6c 78  SUBJECT (0x%08lx
19b00 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65  ) ...", (unsigne
19b10 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74  d long) curr_att
19b20 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66  r_type);......if
19b30 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d   (objectclass !=
19b40 20 43 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 45   CKO_CERTIFICATE
19b50 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f  ) {......CACKEY_
19b60 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
19b70 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69  .. but not getti
19b80 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77 65  ng it because we
19b90 20 61 72 65 20 6e 6f 74 20 61 20 63 65 72 74 69   are not a certi
19ba0 66 69 63 61 74 65 22 29 3b 0a 0a 09 09 09 09 09  ficate");.......
19bb0 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09  break;.....}....
19bc0 09 09 69 66 20 28 63 65 72 74 69 66 69 63 61 74  ..if (certificat
19bd0 65 5f 6c 65 6e 20 3e 3d 20 30 29 20 7b 0a 09 09  e_len >= 0) {...
19be0 09 09 09 78 35 30 39 5f 72 65 61 64 5f 72 65 74  ...x509_read_ret
19bf0 20 3d 20 78 35 30 39 5f 74 6f 5f 73 75 62 6a 65   = x509_to_subje
19c00 63 74 28 63 65 72 74 69 66 69 63 61 74 65 2c 20  ct(certificate, 
19c10 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c  certificate_len,
19c20 20 26 70 56 61 6c 75 65 29 3b 0a 09 09 09 09 09   &pValue);......
19c30 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72 65  if (x509_read_re
19c40 74 20 3c 20 30 29 20 7b 0a 09 09 09 09 09 09 70  t < 0) {.......p
19c50 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09  Value = NULL;...
19c60 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09  ...} else {.....
19c70 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 78  ..ulValueLen = x
19c80 35 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09 09  509_read_ret;...
19c90 09 09 09 7d 0a 09 09 09 09 7d 0a 0a 09 09 09 09  ...}.....}......
19ca0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
19cb0 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e  NTF(" ... return
19cc0 69 6e 67 20 25 70 2f 25 6c 75 22 2c 20 70 56 61  ing %p/%lu", pVa
19cd0 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  lue, (unsigned l
19ce0 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29  ong) ulValueLen)
19cf0 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  ;......break;...
19d00 09 63 61 73 65 20 43 4b 41 5f 49 44 3a 0a 09 09  .case CKA_ID:...
19d10 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
19d20 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e  RINTF("Requestin
19d30 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f  g attribute CKA_
19d40 49 44 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e  ID (0x%08lx) ...
19d50 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
19d60 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70  g) curr_attr_typ
19d70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a  e);......if (obj
19d80 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f  ectclass == CKO_
19d90 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54 29 20  NETSCAPE_TRUST) 
19da0 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45  {......CACKEY_DE
19db0 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
19dc0 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67   but not getting
19dd0 20 69 74 20 62 65 63 61 75 73 65 20 77 65 20 61   it because we a
19de0 72 65 20 61 20 4e 65 74 73 63 61 70 65 20 74 72  re a Netscape tr
19df0 75 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09  ust object");...
19e00 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d  ....break;.....}
19e10 0a 0a 09 09 09 09 75 63 54 6d 70 42 75 66 5b 30  ......ucTmpBuf[0
19e20 5d 20 3d 20 28 28 69 64 65 6e 74 69 74 79 5f 6e  ] = ((identity_n
19e30 75 6d 20 2b 20 31 29 20 3e 3e 20 38 29 20 26 20  um + 1) >> 8) & 
19e40 30 78 66 66 3b 0a 09 09 09 09 75 63 54 6d 70 42  0xff;.....ucTmpB
19e50 75 66 5b 31 5d 20 3d 20 20 28 69 64 65 6e 74 69  uf[1] =  (identi
19e60 74 79 5f 6e 75 6d 20 2b 20 31 29 20 26 20 30 78  ty_num + 1) & 0x
19e70 66 66 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65 20  ff;......pValue 
19e80 3d 20 26 75 63 54 6d 70 42 75 66 3b 0a 09 09 09  = &ucTmpBuf;....
19e90 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 32 3b  .ulValueLen = 2;
19ea0 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
19eb0 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
19ec0 72 65 74 75 72 6e 69 6e 67 20 25 70 2f 25 6c 75  returning %p/%lu
19ed0 22 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69  ", pValue, (unsi
19ee0 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c  gned long) ulVal
19ef0 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65  ueLen);......bre
19f00 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f  ak;....case CKA_
19f10 43 45 52 54 49 46 49 43 41 54 45 5f 54 59 50 45  CERTIFICATE_TYPE
19f20 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  :.....CACKEY_DEB
19f30 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65  UG_PRINTF("Reque
19f40 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20  sting attribute 
19f50 43 4b 41 5f 43 45 52 54 49 46 49 43 41 54 45 5f  CKA_CERTIFICATE_
19f60 54 59 50 45 20 28 30 78 25 30 38 6c 78 29 20 2e  TYPE (0x%08lx) .
19f70 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ..", (unsigned l
19f80 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74  ong) curr_attr_t
19f90 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f  ype);......if (o
19fa0 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b  bjectclass != CK
19fb0 4f 5f 43 45 52 54 49 46 49 43 41 54 45 29 20 7b  O_CERTIFICATE) {
19fc0 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
19fd0 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
19fe0 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20  but not getting 
19ff0 69 74 20 62 65 63 61 75 73 65 20 77 65 20 61 72  it because we ar
1a000 65 20 6e 6f 74 20 61 20 63 65 72 74 69 66 69 63  e not a certific
1a010 61 74 65 2e 22 29 3b 0a 0a 09 09 09 09 09 62 72  ate.");.......br
1a020 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09  eak;.....}......
1a030 2f 2a 20 57 65 20 6f 6e 6c 79 20 73 75 70 70 6f  /* We only suppo
1a040 72 74 20 6f 6e 65 20 63 65 72 74 69 66 69 63 61  rt one certifica
1a050 74 65 20 74 79 70 65 20 2a 2f 0a 09 09 09 09 63  te type */.....c
1a060 6b 5f 63 65 72 74 69 66 69 63 61 74 65 5f 74 79  k_certificate_ty
1a070 70 65 20 3d 20 43 4b 43 5f 58 5f 35 30 39 3b 0a  pe = CKC_X_509;.
1a080 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63  .....pValue = &c
1a090 6b 5f 63 65 72 74 69 66 69 63 61 74 65 5f 74 79  k_certificate_ty
1a0a0 70 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c  pe;.....ulValueL
1a0b0 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 63  en = sizeof(ck_c
1a0c0 65 72 74 69 66 69 63 61 74 65 5f 74 79 70 65 29  ertificate_type)
1a0d0 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  ;......CACKEY_DE
1a0e0 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
1a0f0 20 72 65 74 75 72 6e 69 6e 67 20 43 4b 43 5f 58   returning CKC_X
1a100 5f 35 30 39 20 28 25 6c 75 29 20 28 25 70 2f 25  _509 (%lu) (%p/%
1a110 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  lu)", (unsigned 
1a120 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 43 45 52 54  long) *((CK_CERT
1a130 49 46 49 43 41 54 45 5f 54 59 50 45 20 2a 29 20  IFICATE_TYPE *) 
1a140 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c  pValue), pValue,
1a150 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
1a160 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09   ulValueLen);...
1a170 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
1a180 65 20 43 4b 41 5f 4b 45 59 5f 54 59 50 45 3a 0a  e CKA_KEY_TYPE:.
1a190 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
1a1a0 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74  _PRINTF("Request
1a1b0 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b  ing attribute CK
1a1c0 41 5f 4b 45 59 5f 54 59 50 45 20 28 30 78 25 30  A_KEY_TYPE (0x%0
1a1d0 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69  8lx) ...", (unsi
1a1e0 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f  gned long) curr_
1a1f0 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09  attr_type);.....
1a200 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73  .if (objectclass
1a210 20 21 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f   != CKO_PRIVATE_
1a220 4b 45 59 20 26 26 20 6f 62 6a 65 63 74 63 6c 61  KEY && objectcla
1a230 73 73 20 21 3d 20 43 4b 4f 5f 50 55 42 4c 49 43  ss != CKO_PUBLIC
1a240 5f 4b 45 59 29 20 7b 0a 09 09 09 09 09 43 41 43  _KEY) {......CAC
1a250 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1a260 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67  (" ... but not g
1a270 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73  etting it becaus
1a280 65 20 77 65 20 61 72 65 20 6e 6f 74 20 61 20 6b  e we are not a k
1a290 65 79 2e 22 29 3b 0a 0a 09 09 09 09 09 62 72 65  ey.");.......bre
1a2a0 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 2f  ak;.....}....../
1a2b0 2a 20 57 65 20 6f 6e 6c 79 20 73 75 70 70 6f 72  * We only suppor
1a2c0 74 20 6f 6e 65 20 6b 65 79 20 74 79 70 65 20 2a  t one key type *
1a2d0 2f 0a 09 09 09 09 63 6b 5f 6b 65 79 5f 74 79 70  /.....ck_key_typ
1a2e0 65 20 3d 20 43 4b 4b 5f 52 53 41 3b 0a 0a 09 09  e = CKK_RSA;....
1a2f0 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 6b  ..pValue = &ck_k
1a300 65 79 5f 74 79 70 65 3b 0a 09 09 09 09 75 6c 56  ey_type;.....ulV
1a310 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66  alueLen = sizeof
1a320 28 63 6b 5f 6b 65 79 5f 74 79 70 65 29 3b 0a 0a  (ck_key_type);..
1a330 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
1a340 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65  _PRINTF(" ... re
1a350 74 75 72 6e 69 6e 67 20 43 4b 4b 5f 52 53 41 20  turning CKK_RSA 
1a360 28 25 6c 75 29 20 28 25 70 2f 25 6c 75 29 22 2c  (%lu) (%p/%lu)",
1a370 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
1a380 20 2a 28 28 43 4b 5f 43 45 52 54 49 46 49 43 41   *((CK_CERTIFICA
1a390 54 45 5f 54 59 50 45 20 2a 29 20 70 56 61 6c 75  TE_TYPE *) pValu
1a3a0 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73  e), pValue, (uns
1a3b0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61  igned long) ulVa
1a3c0 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72  lueLen);......br
1a3d0 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41  eak;....case CKA
1a3e0 5f 53 49 47 4e 3a 0a 09 09 09 09 43 41 43 4b 45  _SIGN:.....CACKE
1a3f0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1a400 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69  Requesting attri
1a410 62 75 74 65 20 43 4b 41 5f 53 49 47 4e 20 28 30  bute CKA_SIGN (0
1a420 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75  x%08lx) ...", (u
1a430 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75  nsigned long) cu
1a440 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a  rr_attr_type);..
1a450 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c  ....if (objectcl
1a460 61 73 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43  ass == CKO_NETSC
1a470 41 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09  APE_TRUST) {....
1a480 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1a490 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20  RINTF(" ... but 
1a4a0 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 62  not getting it b
1a4b0 65 63 61 75 73 65 20 77 65 20 61 72 65 20 61 20  ecause we are a 
1a4c0 4e 65 74 73 63 61 70 65 20 74 72 75 73 74 20 6f  Netscape trust o
1a4d0 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62  bject");.......b
1a4e0 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09  reak;.....}.....
1a4f0 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73  .if (objectclass
1a500 20 3d 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f   == CKO_PRIVATE_
1a510 4b 45 59 29 20 7b 0a 09 09 09 09 09 70 56 61 6c  KEY) {......pVal
1a520 75 65 20 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09  ue = &ck_true;..
1a530 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ....ulValueLen =
1a540 20 73 69 7a 65 6f 66 28 63 6b 5f 74 72 75 65 29   sizeof(ck_true)
1a550 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09  ;.....} else {..
1a560 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b  ....pValue = &ck
1a570 5f 66 61 6c 73 65 3b 0a 09 09 09 09 09 75 6c 56  _false;......ulV
1a580 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66  alueLen = sizeof
1a590 28 63 6b 5f 66 61 6c 73 65 29 3b 0a 09 09 09 09  (ck_false);.....
1a5a0 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  }......CACKEY_DE
1a5b0 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
1a5c0 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28   returning %lu (
1a5d0 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67  %p/%lu)", (unsig
1a5e0 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f  ned long) *((CK_
1a5f0 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29  BBOOL *) pValue)
1a600 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67  , pValue, (unsig
1a610 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75  ned long) ulValu
1a620 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61  eLen);......brea
1a630 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 53  k;....case CKA_S
1a640 49 47 4e 5f 52 45 43 4f 56 45 52 3a 0a 09 09 09  IGN_RECOVER:....
1a650 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1a660 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67  INTF("Requesting
1a670 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 53   attribute CKA_S
1a680 49 47 4e 5f 52 45 43 4f 56 45 52 20 28 30 78 25  IGN_RECOVER (0x%
1a690 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73  08lx) ...", (uns
1a6a0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72  igned long) curr
1a6b0 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09  _attr_type);....
1a6c0 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73  ..if (objectclas
1a6d0 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50  s == CKO_NETSCAP
1a6e0 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 09 09  E_TRUST) {......
1a6f0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1a700 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f  NTF(" ... but no
1a710 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63  t getting it bec
1a720 61 75 73 65 20 77 65 20 61 72 65 20 61 20 4e 65  ause we are a Ne
1a730 74 73 63 61 70 65 20 74 72 75 73 74 20 6f 62 6a  tscape trust obj
1a740 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62 72 65  ect");.......bre
1a750 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 2f  ak;.....}....../
1a760 2a 20 57 65 20 63 75 72 72 65 6e 74 6c 79 20 6f  * We currently o
1a770 6e 6c 79 20 73 75 70 70 6f 72 74 20 22 53 69 67  nly support "Sig
1a780 6e 20 77 69 74 68 20 41 70 70 65 6e 64 69 78 22  n with Appendix"
1a790 20 2a 2f 0a 09 09 09 09 70 56 61 6c 75 65 20 3d   */.....pValue =
1a7a0 20 26 63 6b 5f 66 61 6c 73 65 3b 0a 09 09 09 09   &ck_false;.....
1a7b0 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a  ulValueLen = siz
1a7c0 65 6f 66 28 63 6b 5f 66 61 6c 73 65 29 3b 0a 0a  eof(ck_false);..
1a7d0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
1a7e0 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65  _PRINTF(" ... re
1a7f0 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f  turning %lu (%p/
1a800 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64  %lu)", (unsigned
1a810 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f   long) *((CK_BBO
1a820 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70  OL *) pValue), p
1a830 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64  Value, (unsigned
1a840 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65   long) ulValueLe
1a850 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a  n);......break;.
1a860 09 09 09 63 61 73 65 20 43 4b 41 5f 44 45 43 52  ...case CKA_DECR
1a870 59 50 54 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f  YPT:.....CACKEY_
1a880 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
1a890 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75  questing attribu
1a8a0 74 65 20 43 4b 41 5f 44 45 43 52 59 50 54 20 28  te CKA_DECRYPT (
1a8b0 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28  0x%08lx) ...", (
1a8c0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63  unsigned long) c
1a8d0 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a  urr_attr_type);.
1a8e0 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63  .....if (objectc
1a8f0 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53  lass == CKO_NETS
1a900 43 41 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 09  CAPE_TRUST) {...
1a910 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1a920 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74  PRINTF(" ... but
1a930 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20   not getting it 
1a940 62 65 63 61 75 73 65 20 77 65 20 61 72 65 20 61  because we are a
1a950 20 4e 65 74 73 63 61 70 65 20 74 72 75 73 74 20   Netscape trust 
1a960 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09  object");.......
1a970 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09  break;.....}....
1a980 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73  ..if (objectclas
1a990 73 20 3d 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45  s == CKO_PRIVATE
1a9a0 5f 4b 45 59 20 7c 7c 20 6f 62 6a 65 63 74 63 6c  _KEY || objectcl
1a9b0 61 73 73 20 3d 3d 20 43 4b 4f 5f 50 55 42 4c 49  ass == CKO_PUBLI
1a9c0 43 5f 4b 45 59 29 20 7b 0a 09 09 09 09 09 70 56  C_KEY) {......pV
1a9d0 61 6c 75 65 20 3d 20 26 63 6b 5f 74 72 75 65 3b  alue = &ck_true;
1a9e0 0a 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e  ......ulValueLen
1a9f0 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 74 72 75   = sizeof(ck_tru
1aa00 65 29 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b  e);.....} else {
1aa10 0a 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26  ......pValue = &
1aa20 63 6b 5f 66 61 6c 73 65 3b 0a 09 09 09 09 09 75  ck_false;......u
1aa30 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65  lValueLen = size
1aa40 6f 66 28 63 6b 5f 66 61 6c 73 65 29 3b 0a 09 09  of(ck_false);...
1aa50 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f  ..}......CACKEY_
1aa60 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
1aa70 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75  .. returning %lu
1aa80 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73   (%p/%lu)", (uns
1aa90 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43  igned long) *((C
1aaa0 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75  K_BBOOL *) pValu
1aab0 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73  e), pValue, (uns
1aac0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61  igned long) ulVa
1aad0 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72  lueLen);......br
1aae0 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41  eak;....case CKA
1aaf0 5f 53 45 4e 53 49 54 49 56 45 3a 0a 09 09 09 09  _SENSITIVE:.....
1ab00 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1ab10 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20  NTF("Requesting 
1ab20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 53 45  attribute CKA_SE
1ab30 4e 53 49 54 49 56 45 20 28 30 78 25 30 38 6c 78  NSITIVE (0x%08lx
1ab40 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65  ) ...", (unsigne
1ab50 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74  d long) curr_att
1ab60 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66  r_type);......if
1ab70 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d   (objectclass ==
1ab80 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52   CKO_NETSCAPE_TR
1ab90 55 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b  UST) {......CACK
1aba0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1abb0 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65  " ... but not ge
1abc0 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65  tting it because
1abd0 20 77 65 20 61 72 65 20 61 20 4e 65 74 73 63 61   we are a Netsca
1abe0 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22  pe trust object"
1abf0 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a  );.......break;.
1ac00 09 09 09 09 7d 0a 0a 09 09 09 09 69 66 20 28 6f  ....}......if (o
1ac10 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b  bjectclass == CK
1ac20 4f 5f 50 52 49 56 41 54 45 5f 4b 45 59 29 20 7b  O_PRIVATE_KEY) {
1ac30 0a 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26  ......pValue = &
1ac40 63 6b 5f 74 72 75 65 3b 0a 09 09 09 09 09 75 6c  ck_true;......ul
1ac50 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f  ValueLen = sizeo
1ac60 66 28 63 6b 5f 74 72 75 65 29 3b 0a 09 09 09 09  f(ck_true);.....
1ac70 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 70 56  } else {......pV
1ac80 61 6c 75 65 20 3d 20 26 63 6b 5f 66 61 6c 73 65  alue = &ck_false
1ac90 3b 0a 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65  ;......ulValueLe
1aca0 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 66 61  n = sizeof(ck_fa
1acb0 6c 73 65 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09  lse);.....}.....
1acc0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1acd0 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72  INTF(" ... retur
1ace0 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75  ning %lu (%p/%lu
1acf0 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  )", (unsigned lo
1ad00 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20  ng) *((CK_BBOOL 
1ad10 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c  *) pValue), pVal
1ad20 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  ue, (unsigned lo
1ad30 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b  ng) ulValueLen);
1ad40 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
1ad50 63 61 73 65 20 43 4b 41 5f 45 58 54 52 41 43 54  case CKA_EXTRACT
1ad60 41 42 4c 45 3a 0a 09 09 09 09 43 41 43 4b 45 59  ABLE:.....CACKEY
1ad70 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
1ad80 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62  equesting attrib
1ad90 75 74 65 20 43 4b 41 5f 45 58 54 52 41 43 54 41  ute CKA_EXTRACTA
1ada0 42 4c 45 20 28 30 78 25 30 38 6c 78 29 20 2e 2e  BLE (0x%08lx) ..
1adb0 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  .", (unsigned lo
1adc0 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79  ng) curr_attr_ty
1add0 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62  pe);......if (ob
1ade0 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f  jectclass == CKO
1adf0 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54 29  _NETSCAPE_TRUST)
1ae00 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44   {......CACKEY_D
1ae10 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
1ae20 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e  . but not gettin
1ae30 67 20 69 74 20 62 65 63 61 75 73 65 20 77 65 20  g it because we 
1ae40 61 72 65 20 61 20 4e 65 74 73 63 61 70 65 20 74  are a Netscape t
1ae50 72 75 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a  rust object");..
1ae60 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09  .....break;.....
1ae70 7d 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63  }......if (objec
1ae80 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 50 52  tclass == CKO_PR
1ae90 49 56 41 54 45 5f 4b 45 59 29 20 7b 0a 09 09 09  IVATE_KEY) {....
1aea0 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 66  ..pValue = &ck_f
1aeb0 61 6c 73 65 3b 0a 09 09 09 09 09 75 6c 56 61 6c  alse;......ulVal
1aec0 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63  ueLen = sizeof(c
1aed0 6b 5f 74 72 75 65 29 3b 0a 09 09 09 09 7d 20 65  k_true);.....} e
1aee0 6c 73 65 20 7b 0a 09 09 09 09 09 70 56 61 6c 75  lse {......pValu
1aef0 65 20 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09 09  e = &ck_true;...
1af00 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  ...ulValueLen = 
1af10 73 69 7a 65 6f 66 28 63 6b 5f 66 61 6c 73 65 29  sizeof(ck_false)
1af20 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43  ;.....}......CAC
1af30 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1af40 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67  (" ... returning
1af50 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20   %lu (%p/%lu)", 
1af60 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
1af70 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70  *((CK_BBOOL *) p
1af80 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20  Value), pValue, 
1af90 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
1afa0 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09  ulValueLen);....
1afb0 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
1afc0 20 43 4b 41 5f 4d 4f 44 55 4c 55 53 3a 0a 09 09   CKA_MODULUS:...
1afd0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1afe0 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e  RINTF("Requestin
1aff0 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f  g attribute CKA_
1b000 4d 4f 44 55 4c 55 53 20 28 30 78 25 30 38 6c 78  MODULUS (0x%08lx
1b010 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65  ) ...", (unsigne
1b020 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74  d long) curr_att
1b030 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66  r_type);......if
1b040 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d   (objectclass ==
1b050 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52   CKO_NETSCAPE_TR
1b060 55 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b  UST) {......CACK
1b070 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1b080 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65  " ... but not ge
1b090 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65  tting it because
1b0a0 20 77 65 20 61 72 65 20 61 20 4e 65 74 73 63 61   we are a Netsca
1b0b0 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22  pe trust object"
1b0c0 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a  );.......break;.
1b0d0 09 09 09 09 7d 0a 0a 09 09 09 09 69 66 20 28 63  ....}......if (c
1b0e0 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3e  ertificate_len >
1b0f0 3d 20 30 29 20 7b 0a 09 09 09 09 09 78 35 30 39  = 0) {......x509
1b100 5f 72 65 61 64 5f 72 65 74 20 3d 20 78 35 30 39  _read_ret = x509
1b110 5f 74 6f 5f 6d 6f 64 75 6c 75 73 28 63 65 72 74  _to_modulus(cert
1b120 69 66 69 63 61 74 65 2c 20 63 65 72 74 69 66 69  ificate, certifi
1b130 63 61 74 65 5f 6c 65 6e 2c 20 26 70 56 61 6c 75  cate_len, &pValu
1b140 65 29 3b 0a 09 09 09 09 09 69 66 20 28 78 35 30  e);......if (x50
1b150 39 5f 72 65 61 64 5f 72 65 74 20 3c 20 30 29 20  9_read_ret < 0) 
1b160 7b 0a 09 09 09 09 09 09 70 56 61 6c 75 65 20 3d  {.......pValue =
1b170 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 7d 20 65 6c   NULL;......} el
1b180 73 65 20 7b 0a 09 09 09 09 09 09 75 6c 56 61 6c  se {.......ulVal
1b190 75 65 4c 65 6e 20 3d 20 78 35 30 39 5f 72 65 61  ueLen = x509_rea
1b1a0 64 5f 72 65 74 3b 0a 09 09 09 09 09 7d 0a 09 09  d_ret;......}...
1b1b0 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f  ..}......CACKEY_
1b1c0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
1b1d0 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 28 25 70  .. returning (%p
1b1e0 2f 25 6c 75 29 22 2c 20 70 56 61 6c 75 65 2c 20  /%lu)", pValue, 
1b1f0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
1b200 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09  ulValueLen);....
1b210 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
1b220 20 43 4b 41 5f 50 55 42 4c 49 43 5f 45 58 50 4f   CKA_PUBLIC_EXPO
1b230 4e 45 4e 54 3a 0a 09 09 09 09 43 41 43 4b 45 59  NENT:.....CACKEY
1b240 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
1b250 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62  equesting attrib
1b260 75 74 65 20 43 4b 41 5f 50 55 42 4c 49 43 5f 45  ute CKA_PUBLIC_E
1b270 58 50 4f 4e 45 4e 54 20 28 30 78 25 30 38 6c 78  XPONENT (0x%08lx
1b280 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65  ) ...", (unsigne
1b290 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74  d long) curr_att
1b2a0 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66  r_type);......if
1b2b0 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d   (objectclass ==
1b2c0 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52   CKO_NETSCAPE_TR
1b2d0 55 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b  UST) {......CACK
1b2e0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1b2f0 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65  " ... but not ge
1b300 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65  tting it because
1b310 20 77 65 20 61 72 65 20 61 20 4e 65 74 73 63 61   we are a Netsca
1b320 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22  pe trust object"
1b330 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a  );.......break;.
1b340 09 09 09 09 7d 0a 0a 09 09 09 09 69 66 20 28 63  ....}......if (c
1b350 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3e  ertificate_len >
1b360 3d 20 30 29 20 7b 0a 09 09 09 09 09 78 35 30 39  = 0) {......x509
1b370 5f 72 65 61 64 5f 72 65 74 20 3d 20 78 35 30 39  _read_ret = x509
1b380 5f 74 6f 5f 65 78 70 6f 6e 65 6e 74 28 63 65 72  _to_exponent(cer
1b390 74 69 66 69 63 61 74 65 2c 20 63 65 72 74 69 66  tificate, certif
1b3a0 69 63 61 74 65 5f 6c 65 6e 2c 20 26 70 56 61 6c  icate_len, &pVal
1b3b0 75 65 29 3b 0a 09 09 09 09 09 69 66 20 28 78 35  ue);......if (x5
1b3c0 30 39 5f 72 65 61 64 5f 72 65 74 20 3c 20 30 29  09_read_ret < 0)
1b3d0 20 7b 0a 09 09 09 09 09 09 70 56 61 6c 75 65 20   {.......pValue 
1b3e0 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 7d 20 65  = NULL;......} e
1b3f0 6c 73 65 20 7b 0a 09 09 09 09 09 09 75 6c 56 61  lse {.......ulVa
1b400 6c 75 65 4c 65 6e 20 3d 20 78 35 30 39 5f 72 65  lueLen = x509_re
1b410 61 64 5f 72 65 74 3b 0a 09 09 09 09 09 7d 0a 09  ad_ret;......}..
1b420 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59  ...}......CACKEY
1b430 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
1b440 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 28 25  ... returning (%
1b450 70 2f 25 6c 75 29 22 2c 20 70 56 61 6c 75 65 2c  p/%lu)", pValue,
1b460 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
1b470 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09   ulValueLen);...
1b480 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
1b490 65 20 43 4b 41 5f 54 52 55 53 54 5f 44 49 47 49  e CKA_TRUST_DIGI
1b4a0 54 41 4c 5f 53 49 47 4e 41 54 55 52 45 3a 0a 09  TAL_SIGNATURE:..
1b4b0 09 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54  ..case CKA_TRUST
1b4c0 5f 4e 4f 4e 5f 52 45 50 55 44 49 41 54 49 4f 4e  _NON_REPUDIATION
1b4d0 3a 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 54 52  :....case CKA_TR
1b4e0 55 53 54 5f 4b 45 59 5f 45 4e 43 49 50 48 45 52  UST_KEY_ENCIPHER
1b4f0 4d 45 4e 54 3a 0a 09 09 09 63 61 73 65 20 43 4b  MENT:....case CK
1b500 41 5f 54 52 55 53 54 5f 44 41 54 41 5f 45 4e 43  A_TRUST_DATA_ENC
1b510 49 50 48 45 52 4d 45 4e 54 3a 0a 09 09 09 63 61  IPHERMENT:....ca
1b520 73 65 20 43 4b 41 5f 54 52 55 53 54 5f 4b 45 59  se CKA_TRUST_KEY
1b530 5f 41 47 52 45 45 4d 45 4e 54 3a 0a 09 09 09 63  _AGREEMENT:....c
1b540 61 73 65 20 43 4b 41 5f 54 52 55 53 54 5f 4b 45  ase CKA_TRUST_KE
1b550 59 5f 43 45 52 54 5f 53 49 47 4e 3a 0a 09 09 09  Y_CERT_SIGN:....
1b560 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54 5f 43  case CKA_TRUST_C
1b570 52 4c 5f 53 49 47 4e 3a 0a 09 09 09 63 61 73 65  RL_SIGN:....case
1b580 20 43 4b 41 5f 54 52 55 53 54 5f 53 45 52 56 45   CKA_TRUST_SERVE
1b590 52 5f 41 55 54 48 3a 0a 09 09 09 63 61 73 65 20  R_AUTH:....case 
1b5a0 43 4b 41 5f 54 52 55 53 54 5f 43 4c 49 45 4e 54  CKA_TRUST_CLIENT
1b5b0 5f 41 55 54 48 3a 0a 09 09 09 63 61 73 65 20 43  _AUTH:....case C
1b5c0 4b 41 5f 54 52 55 53 54 5f 43 4f 44 45 5f 53 49  KA_TRUST_CODE_SI
1b5d0 47 4e 49 4e 47 3a 0a 09 09 09 63 61 73 65 20 43  GNING:....case C
1b5e0 4b 41 5f 54 52 55 53 54 5f 45 4d 41 49 4c 5f 50  KA_TRUST_EMAIL_P
1b5f0 52 4f 54 45 43 54 49 4f 4e 3a 0a 09 09 09 09 43  ROTECTION:.....C
1b600 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1b610 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61  TF("Requesting a
1b620 74 74 72 69 62 75 74 65 20 43 4b 41 5f 54 52 55  ttribute CKA_TRU
1b630 53 54 5f 2e 2e 2e 20 28 30 78 25 30 38 6c 78 29  ST_... (0x%08lx)
1b640 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64   ...", (unsigned
1b650 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72   long) curr_attr
1b660 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 70 56 61  _type);......pVa
1b670 6c 75 65 20 3d 20 26 63 6b 5f 74 72 75 73 74 65  lue = &ck_truste
1b680 64 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65  d;.....ulValueLe
1b690 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 74 72  n = sizeof(ck_tr
1b6a0 75 73 74 65 64 29 3b 0a 0a 09 09 09 09 43 41 43  usted);......CAC
1b6b0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1b6c0 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67  (" ... returning
1b6d0 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20   %lu (%p/%lu)", 
1b6e0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
1b6f0 2a 28 28 43 4b 5f 54 52 55 53 54 20 2a 29 20 70  *((CK_TRUST *) p
1b700 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20  Value), pValue, 
1b710 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
1b720 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09  ulValueLen);....
1b730 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
1b740 20 43 4b 41 5f 43 45 52 54 5f 53 48 41 31 5f 48   CKA_CERT_SHA1_H
1b750 41 53 48 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f  ASH:.....CACKEY_
1b760 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
1b770 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75  questing attribu
1b780 74 65 20 43 4b 41 5f 43 45 52 54 5f 53 48 41 31  te CKA_CERT_SHA1
1b790 5f 48 41 53 48 20 28 30 78 25 30 38 6c 78 29 20  _HASH (0x%08lx) 
1b7a0 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  ...", (unsigned 
1b7b0 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f  long) curr_attr_
1b7c0 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28  type);......if (
1b7d0 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43  objectclass != C
1b7e0 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53  KO_NETSCAPE_TRUS
1b7f0 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59  T) {......CACKEY
1b800 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
1b810 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74  ... but not gett
1b820 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77  ing it because w
1b830 65 20 61 72 65 20 6e 6f 74 20 61 20 4e 65 74 73  e are not a Nets
1b840 63 61 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63  cape trust objec
1b850 74 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b  t");.......break
1b860 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 53 48 41  ;.....}......SHA
1b870 31 52 65 73 65 74 28 26 73 68 61 31 5f 63 74 78  1Reset(&sha1_ctx
1b880 29 3b 0a 09 09 09 09 53 48 41 31 49 6e 70 75 74  );.....SHA1Input
1b890 28 26 73 68 61 31 5f 63 74 78 2c 20 63 65 72 74  (&sha1_ctx, cert
1b8a0 69 66 69 63 61 74 65 2c 20 63 65 72 74 69 66 69  ificate, certifi
1b8b0 63 61 74 65 5f 6c 65 6e 29 3b 0a 09 09 09 09 53  cate_len);.....S
1b8c0 48 41 31 52 65 73 75 6c 74 28 26 73 68 61 31 5f  HA1Result(&sha1_
1b8d0 63 74 78 2c 20 73 68 61 31 5f 68 61 73 68 29 3b  ctx, sha1_hash);
1b8e0 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 73  ......pValue = s
1b8f0 68 61 31 5f 68 61 73 68 3b 0a 09 09 09 09 75 6c  ha1_hash;.....ul
1b900 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f  ValueLen = sizeo
1b910 66 28 73 68 61 31 5f 68 61 73 68 29 3b 0a 0a 09  f(sha1_hash);...
1b920 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1b930 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74  PRINTF(" ... ret
1b940 75 72 6e 69 6e 67 20 25 70 2f 25 6c 75 22 2c 20  urning %p/%lu", 
1b950 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65  pValue, (unsigne
1b960 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c  d long) ulValueL
1b970 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b  en);......break;
1b980 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 43 45 52  ....case CKA_CER
1b990 54 5f 4d 44 35 5f 48 41 53 48 3a 0a 09 09 09 09  T_MD5_HASH:.....
1b9a0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1b9b0 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20  NTF("Requesting 
1b9c0 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 43 45  attribute CKA_CE
1b9d0 52 54 5f 4d 44 35 5f 48 41 53 48 20 28 30 78 25  RT_MD5_HASH (0x%
1b9e0 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73  08lx) ...", (uns
1b9f0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72  igned long) curr
1ba00 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09  _attr_type);....
1ba10 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73  ..if (objectclas
1ba20 73 20 21 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50  s != CKO_NETSCAP
1ba30 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 09 09  E_TRUST) {......
1ba40 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1ba50 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f  NTF(" ... but no
1ba60 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63  t getting it bec
1ba70 61 75 73 65 20 77 65 20 61 72 65 20 6e 6f 74 20  ause we are not 
1ba80 61 20 4e 65 74 73 63 61 70 65 20 74 72 75 73 74  a Netscape trust
1ba90 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09   object");......
1baa0 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09  .break;.....}...
1bab0 09 09 09 4d 44 35 49 6e 69 74 28 26 6d 64 35 5f  ...MD5Init(&md5_
1bac0 63 74 78 29 3b 0a 09 09 09 09 4d 44 35 55 70 64  ctx);.....MD5Upd
1bad0 61 74 65 28 26 6d 64 35 5f 63 74 78 2c 20 63 65  ate(&md5_ctx, ce
1bae0 72 74 69 66 69 63 61 74 65 2c 20 63 65 72 74 69  rtificate, certi
1baf0 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a 09 09 09  ficate_len);....
1bb00 09 4d 44 35 46 69 6e 61 6c 28 6d 64 35 5f 68 61  .MD5Final(md5_ha
1bb10 73 68 2c 20 26 6d 64 35 5f 63 74 78 29 3b 0a 0a  sh, &md5_ctx);..
1bb20 09 09 09 09 70 56 61 6c 75 65 20 3d 20 6d 64 35  ....pValue = md5
1bb30 5f 68 61 73 68 3b 0a 09 09 09 09 75 6c 56 61 6c  _hash;.....ulVal
1bb40 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 6d  ueLen = sizeof(m
1bb50 64 35 5f 68 61 73 68 29 3b 0a 0a 09 09 09 09 43  d5_hash);......C
1bb60 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1bb70 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69  TF(" ... returni
1bb80 6e 67 20 25 70 2f 25 6c 75 22 2c 20 70 56 61 6c  ng %p/%lu", pVal
1bb90 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  ue, (unsigned lo
1bba0 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b  ng) ulValueLen);
1bbb0 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
1bbc0 64 65 66 61 75 6c 74 3a 0a 09 09 09 09 70 56 61  default:.....pVa
1bbd0 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09  lue = NULL;.....
1bbe0 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 28 43 4b  ulValueLen = (CK
1bbf0 5f 4c 4f 4e 47 29 20 2d 31 3b 0a 09 09 09 09 62  _LONG) -1;.....b
1bc00 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09 69 66 20  reak;...}....if 
1bc10 28 28 28 43 4b 5f 4c 4f 4e 47 29 20 75 6c 56 61  (((CK_LONG) ulVa
1bc20 6c 75 65 4c 65 6e 29 20 21 3d 20 28 28 43 4b 5f  lueLen) != ((CK_
1bc30 4c 4f 4e 47 29 20 2d 31 29 29 20 7b 0a 09 09 09  LONG) -1)) {....
1bc40 2f 2a 20 50 75 73 68 20 63 75 72 72 5f 61 74 74  /* Push curr_att
1bc50 72 20 6f 6e 74 6f 20 74 68 65 20 73 74 61 63 6b  r onto the stack
1bc60 20 2a 2f 0a 09 09 09 63 75 72 72 5f 61 74 74 72   */....curr_attr
1bc70 2e 74 79 70 65 20 3d 20 63 75 72 72 5f 61 74 74  .type = curr_att
1bc80 72 5f 74 79 70 65 3b 0a 09 09 09 63 75 72 72 5f  r_type;....curr_
1bc90 61 74 74 72 2e 75 6c 56 61 6c 75 65 4c 65 6e 20  attr.ulValueLen 
1bca0 3d 20 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 0a 09  = ulValueLen;...
1bcb0 09 09 63 75 72 72 5f 61 74 74 72 2e 70 56 61 6c  ..curr_attr.pVal
1bcc0 75 65 20 3d 20 6d 61 6c 6c 6f 63 28 63 75 72 72  ue = malloc(curr
1bcd0 5f 61 74 74 72 2e 75 6c 56 61 6c 75 65 4c 65 6e  _attr.ulValueLen
1bce0 29 3b 0a 09 09 09 6d 65 6d 63 70 79 28 63 75 72  );....memcpy(cur
1bcf0 72 5f 61 74 74 72 2e 70 56 61 6c 75 65 2c 20 70  r_attr.pValue, p
1bd00 56 61 6c 75 65 2c 20 63 75 72 72 5f 61 74 74 72  Value, curr_attr
1bd10 2e 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09  .ulValueLen);...
1bd20 09 09 69 66 20 28 70 56 61 6c 75 65 5f 66 72 65  ..if (pValue_fre
1bd30 65 20 26 26 20 70 56 61 6c 75 65 29 20 7b 0a 09  e && pValue) {..
1bd40 09 09 09 66 72 65 65 28 70 56 61 6c 75 65 29 3b  ...free(pValue);
1bd50 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 6e 75  ....}.....if (nu
1bd60 6d 61 74 74 72 73 20 3e 3d 20 72 65 74 76 61 6c  mattrs >= retval
1bd70 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 09 09 72 65  _count) {.....re
1bd80 74 76 61 6c 20 3d 20 72 65 61 6c 6c 6f 63 28 72  tval = realloc(r
1bd90 65 74 76 61 6c 2c 20 72 65 74 76 61 6c 5f 63 6f  etval, retval_co
1bda0 75 6e 74 20 2a 20 73 69 7a 65 6f 66 28 2a 72 65  unt * sizeof(*re
1bdb0 74 76 61 6c 29 29 3b 0a 09 09 09 7d 0a 0a 09 09  tval));....}....
1bdc0 09 6d 65 6d 63 70 79 28 26 72 65 74 76 61 6c 5b  .memcpy(&retval[
1bdd0 6e 75 6d 61 74 74 72 73 5d 2c 20 26 63 75 72 72  numattrs], &curr
1bde0 5f 61 74 74 72 2c 20 73 69 7a 65 6f 66 28 63 75  _attr, sizeof(cu
1bdf0 72 72 5f 61 74 74 72 29 29 3b 0a 09 09 09 6e 75  rr_attr));....nu
1be00 6d 61 74 74 72 73 2b 2b 3b 0a 09 09 7d 0a 09 7d  mattrs++;...}..}
1be10 0a 0a 09 69 66 20 28 6e 75 6d 61 74 74 72 73 20  ...if (numattrs 
1be20 21 3d 20 30 29 20 7b 0a 09 09 72 65 74 76 61 6c  != 0) {...retval
1be30 5f 63 6f 75 6e 74 20 3d 20 6e 75 6d 61 74 74 72  _count = numattr
1be40 73 3b 0a 09 09 72 65 74 76 61 6c 20 3d 20 72 65  s;...retval = re
1be50 61 6c 6c 6f 63 28 72 65 74 76 61 6c 2c 20 72 65  alloc(retval, re
1be60 74 76 61 6c 5f 63 6f 75 6e 74 20 2a 20 73 69 7a  tval_count * siz
1be70 65 6f 66 28 2a 72 65 74 76 61 6c 29 29 3b 0a 09  eof(*retval));..
1be80 7d 20 65 6c 73 65 20 7b 0a 09 09 66 72 65 65 28  } else {...free(
1be90 72 65 74 76 61 6c 29 3b 0a 0a 09 09 72 65 74 76  retval);....retv
1bea0 61 6c 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 0a 09  al = NULL;..}...
1beb0 2a 70 75 6c 43 6f 75 6e 74 20 3d 20 6e 75 6d 61  *pulCount = numa
1bec0 74 74 72 73 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  ttrs;...CACKEY_D
1bed0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
1bee0 75 72 6e 69 6e 67 20 25 6c 75 20 6f 62 6a 65 63  urning %lu objec
1bef0 74 73 20 28 25 70 29 2e 22 2c 20 6e 75 6d 61 74  ts (%p).", numat
1bf00 74 72 73 2c 20 28 76 6f 69 64 20 2a 29 20 72 65  trs, (void *) re
1bf10 74 76 61 6c 29 3b 0a 0a 09 72 65 74 75 72 6e 28  tval);...return(
1bf20 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 73 74 61 74  retval);.}..stat
1bf30 69 63 20 76 6f 69 64 20 63 61 63 6b 65 79 5f 66  ic void cackey_f
1bf40 72 65 65 5f 69 64 65 6e 74 69 74 69 65 73 28 73  ree_identities(s
1bf50 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65  truct cackey_ide
1bf60 6e 74 69 74 79 20 2a 69 64 65 6e 74 69 74 69 65  ntity *identitie
1bf70 73 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  s, unsigned long
1bf80 20 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e   identities_coun
1bf90 74 29 20 7b 0a 09 43 4b 5f 41 54 54 52 49 42 55  t) {..CK_ATTRIBU
1bfa0 54 45 20 2a 63 75 72 72 5f 61 74 74 72 3b 0a 09  TE *curr_attr;..
1bfb0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 69 64  unsigned long id
1bfc0 5f 69 64 78 2c 20 61 74 74 72 5f 69 64 78 3b 0a  _idx, attr_idx;.
1bfd0 0a 09 69 66 20 28 69 64 65 6e 74 69 74 69 65 73  ..if (identities
1bfe0 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 69 64 65 6e   == NULL || iden
1bff0 74 69 74 69 65 73 5f 63 6f 75 6e 74 20 3d 3d 20  tities_count == 
1c000 30 29 20 7b 0a 09 09 72 65 74 75 72 6e 3b 0a 09  0) {...return;..
1c010 7d 0a 0a 09 66 6f 72 20 28 69 64 5f 69 64 78 20  }...for (id_idx 
1c020 3d 20 30 3b 20 69 64 5f 69 64 78 20 3c 20 69 64  = 0; id_idx < id
1c030 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 3b 20  entities_count; 
1c040 69 64 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66  id_idx++) {...if
1c050 20 28 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f   (identities[id_
1c060 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73 29  idx].attributes)
1c070 20 7b 0a 09 09 09 66 6f 72 20 28 61 74 74 72 5f   {....for (attr_
1c080 69 64 78 20 3d 20 30 3b 20 61 74 74 72 5f 69 64  idx = 0; attr_id
1c090 78 20 3c 20 69 64 65 6e 74 69 74 69 65 73 5b 69  x < identities[i
1c0a0 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65  d_idx].attribute
1c0b0 73 5f 63 6f 75 6e 74 3b 20 61 74 74 72 5f 69 64  s_count; attr_id
1c0c0 78 2b 2b 29 20 7b 0a 09 09 09 09 63 75 72 72 5f  x++) {.....curr_
1c0d0 61 74 74 72 20 3d 20 26 69 64 65 6e 74 69 74 69  attr = &identiti
1c0e0 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69  es[id_idx].attri
1c0f0 62 75 74 65 73 5b 61 74 74 72 5f 69 64 78 5d 3b  butes[attr_idx];
1c100 0a 0a 09 09 09 09 69 66 20 28 63 75 72 72 5f 61  ......if (curr_a
1c110 74 74 72 2d 3e 70 56 61 6c 75 65 29 20 7b 0a 09  ttr->pValue) {..
1c120 09 09 09 09 66 72 65 65 28 63 75 72 72 5f 61 74  ....free(curr_at
1c130 74 72 2d 3e 70 56 61 6c 75 65 29 3b 0a 09 09 09  tr->pValue);....
1c140 09 7d 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28  .}....}.....if (
1c150 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64  identities[id_id
1c160 78 5d 2e 61 74 74 72 69 62 75 74 65 73 29 20 7b  x].attributes) {
1c170 0a 09 09 09 09 66 72 65 65 28 69 64 65 6e 74 69  .....free(identi
1c180 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74  ties[id_idx].att
1c190 72 69 62 75 74 65 73 29 3b 0a 09 09 09 7d 0a 0a  ributes);....}..
1c1a0 09 09 09 63 61 63 6b 65 79 5f 66 72 65 65 5f 63  ...cackey_free_c
1c1b0 65 72 74 73 28 69 64 65 6e 74 69 74 69 65 73 5b  erts(identities[
1c1c0 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64 65  id_idx].pcsc_ide
1c1d0 6e 74 69 74 79 2c 20 31 2c 20 31 29 3b 0a 09 09  ntity, 1, 1);...
1c1e0 7d 0a 09 7d 0a 0a 09 66 72 65 65 28 69 64 65 6e  }..}...free(iden
1c1f0 74 69 74 69 65 73 29 3b 0a 7d 0a 0a 73 74 61 74  tities);.}..stat
1c200 69 63 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  ic unsigned long
1c210 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 64 6f 64   cackey_read_dod
1c220 5f 69 64 65 6e 74 69 74 69 65 73 28 73 74 72 75  _identities(stru
1c230 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69  ct cackey_identi
1c240 74 79 20 2a 69 64 65 6e 74 69 74 69 65 73 2c 20  ty *identities, 
1c250 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6e 75  unsigned long nu
1c260 6d 5f 64 6f 64 5f 63 65 72 74 73 29 20 7b 0a 09  m_dod_certs) {..
1c270 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 63 65  unsigned long ce
1c280 72 74 5f 69 64 78 2c 20 69 64 5f 69 64 78 20 3d  rt_idx, id_idx =
1c290 20 30 3b 0a 0a 09 69 66 20 28 69 64 65 6e 74 69   0;...if (identi
1c2a0 74 69 65 73 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  ties == NULL) {.
1c2b0 09 09 72 65 74 75 72 6e 28 6e 75 6d 5f 64 6f 64  ..return(num_dod
1c2c0 5f 63 65 72 74 73 20 2a 20 33 29 3b 0a 09 7d 0a  _certs * 3);..}.
1c2d0 0a 09 66 6f 72 20 28 63 65 72 74 5f 69 64 78 20  ..for (cert_idx 
1c2e0 3d 20 30 3b 20 63 65 72 74 5f 69 64 78 20 3c 20  = 0; cert_idx < 
1c2f0 6e 75 6d 5f 64 6f 64 5f 63 65 72 74 73 3b 20 63  num_dod_certs; c
1c300 65 72 74 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 69  ert_idx++) {...i
1c310 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78  dentities[id_idx
1c320 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20  ].pcsc_identity 
1c330 3d 20 4e 55 4c 4c 3b 0a 09 09 69 64 65 6e 74 69  = NULL;...identi
1c340 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74  ties[id_idx].att
1c350 72 69 62 75 74 65 73 20 3d 20 63 61 63 6b 65 79  ributes = cackey
1c360 5f 67 65 74 5f 61 74 74 72 69 62 75 74 65 73 28  _get_attributes(
1c370 43 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 45 2c  CKO_CERTIFICATE,
1c380 20 26 65 78 74 72 61 5f 63 65 72 74 73 5b 63 65   &extra_certs[ce
1c390 72 74 5f 69 64 78 5d 2c 20 30 78 66 30 30 30 20  rt_idx], 0xf000 
1c3a0 7c 20 63 65 72 74 5f 69 64 78 2c 20 26 69 64 65  | cert_idx, &ide
1c3b0 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e  ntities[id_idx].
1c3c0 61 74 74 72 69 62 75 74 65 73 5f 63 6f 75 6e 74  attributes_count
1c3d0 29 3b 0a 09 09 69 64 5f 69 64 78 2b 2b 3b 0a 0a  );...id_idx++;..
1c3e0 09 09 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f  ..identities[id_
1c3f0 69 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69  idx].pcsc_identi
1c400 74 79 20 3d 20 4e 55 4c 4c 3b 0a 09 09 69 64 65  ty = NULL;...ide
1c410 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e  ntities[id_idx].
1c420 61 74 74 72 69 62 75 74 65 73 20 3d 20 63 61 63  attributes = cac
1c430 6b 65 79 5f 67 65 74 5f 61 74 74 72 69 62 75 74  key_get_attribut
1c440 65 73 28 43 4b 4f 5f 50 55 42 4c 49 43 5f 4b 45  es(CKO_PUBLIC_KE
1c450 59 2c 20 26 65 78 74 72 61 5f 63 65 72 74 73 5b  Y, &extra_certs[
1c460 63 65 72 74 5f 69 64 78 5d 2c 20 30 78 66 30 30  cert_idx], 0xf00
1c470 30 20 7c 20 63 65 72 74 5f 69 64 78 2c 20 26 69  0 | cert_idx, &i
1c480 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78  dentities[id_idx
1c490 5d 2e 61 74 74 72 69 62 75 74 65 73 5f 63 6f 75  ].attributes_cou
1c4a0 6e 74 29 3b 0a 09 09 69 64 5f 69 64 78 2b 2b 3b  nt);...id_idx++;
1c4b0 0a 0a 09 09 69 64 65 6e 74 69 74 69 65 73 5b 69  ....identities[i
1c4c0 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e  d_idx].pcsc_iden
1c4d0 74 69 74 79 20 3d 20 4e 55 4c 4c 3b 0a 09 09 69  tity = NULL;...i
1c4e0 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78  dentities[id_idx
1c4f0 5d 2e 61 74 74 72 69 62 75 74 65 73 20 3d 20 63  ].attributes = c
1c500 61 63 6b 65 79 5f 67 65 74 5f 61 74 74 72 69 62  ackey_get_attrib
1c510 75 74 65 73 28 43 4b 4f 5f 4e 45 54 53 43 41 50  utes(CKO_NETSCAP
1c520 45 5f 54 52 55 53 54 2c 20 26 65 78 74 72 61 5f  E_TRUST, &extra_
1c530 63 65 72 74 73 5b 63 65 72 74 5f 69 64 78 5d 2c  certs[cert_idx],
1c540 20 30 78 66 30 30 30 20 7c 20 63 65 72 74 5f 69   0xf000 | cert_i
1c550 64 78 2c 20 26 69 64 65 6e 74 69 74 69 65 73 5b  dx, &identities[
1c560 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74  id_idx].attribut
1c570 65 73 5f 63 6f 75 6e 74 29 3b 0a 09 09 69 64 5f  es_count);...id_
1c580 69 64 78 2b 2b 3b 0a 09 7d 0a 0a 09 72 65 74 75  idx++;..}...retu
1c590 72 6e 28 69 64 5f 69 64 78 29 3b 0a 7d 0a 0a 73  rn(id_idx);.}..s
1c5a0 74 61 74 69 63 20 73 74 72 75 63 74 20 63 61 63  tatic struct cac
1c5b0 6b 65 79 5f 69 64 65 6e 74 69 74 79 20 2a 63 61  key_identity *ca
1c5c0 63 6b 65 79 5f 72 65 61 64 5f 69 64 65 6e 74 69  ckey_read_identi
1c5d0 74 69 65 73 28 73 74 72 75 63 74 20 63 61 63 6b  ties(struct cack
1c5e0 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75  ey_slot *slot, u
1c5f0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 2a 69 64  nsigned long *id
1c600 73 5f 66 6f 75 6e 64 29 20 7b 0a 09 73 74 72 75  s_found) {..stru
1c610 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69  ct cackey_pcsc_i
1c620 64 65 6e 74 69 74 79 20 2a 70 63 73 63 5f 69 64  dentity *pcsc_id
1c630 65 6e 74 69 74 69 65 73 3b 0a 09 73 74 72 75 63  entities;..struc
1c640 74 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 74  t cackey_identit
1c650 79 20 2a 69 64 65 6e 74 69 74 69 65 73 3b 0a 09  y *identities;..
1c660 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6e 75  unsigned long nu
1c670 6d 5f 69 64 73 2c 20 69 64 5f 69 64 78 2c 20 63  m_ids, id_idx, c
1c680 75 72 72 5f 69 64 5f 74 79 70 65 3b 0a 09 75 6e  urr_id_type;..un
1c690 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6e 75 6d 5f  signed long num_
1c6a0 63 65 72 74 73 2c 20 6e 75 6d 5f 64 6f 64 5f 63  certs, num_dod_c
1c6b0 65 72 74 73 2c 20 63 65 72 74 5f 69 64 78 3b 0a  erts, cert_idx;.
1c6c0 09 69 6e 74 20 69 6e 63 6c 75 64 65 5f 65 78 74  .int include_ext
1c6d0 72 61 5f 63 65 72 74 73 20 3d 20 30 2c 20 69 6e  ra_certs = 0, in
1c6e0 63 6c 75 64 65 5f 64 6f 64 5f 63 65 72 74 73 3b  clude_dod_certs;
1c6f0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1c700 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
1c710 29 3b 0a 0a 09 69 66 20 28 69 64 73 5f 66 6f 75  );...if (ids_fou
1c720 6e 64 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  nd == NULL) {...
1c730 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1c740 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 69 64 73  NTF("Error.  ids
1c750 5f 66 6f 75 6e 64 20 69 73 20 4e 55 4c 4c 22 29  _found is NULL")
1c760 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c  ;....return(NULL
1c770 29 3b 0a 09 7d 0a 0a 23 69 66 64 65 66 20 43 41  );..}..#ifdef CA
1c780 43 4b 45 59 5f 43 41 52 44 5f 53 4c 4f 54 5f 49  CKEY_CARD_SLOT_I
1c790 4e 43 4c 55 44 45 5f 45 58 54 52 41 5f 43 45 52  NCLUDE_EXTRA_CER
1c7a0 54 53 0a 09 69 6e 63 6c 75 64 65 5f 65 78 74 72  TS..include_extr
1c7b0 61 5f 63 65 72 74 73 20 3d 20 31 3b 0a 23 65 6e  a_certs = 1;.#en
1c7c0 64 69 66 0a 0a 09 69 66 20 28 67 65 74 65 6e 76  dif...if (getenv
1c7d0 28 22 43 41 43 4b 45 59 5f 44 4f 44 5f 43 45 52  ("CACKEY_DOD_CER
1c7e0 54 53 5f 4f 4e 5f 48 57 5f 53 4c 4f 54 53 22 29  TS_ON_HW_SLOTS")
1c7f0 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 69 6e   != NULL) {...in
1c800 63 6c 75 64 65 5f 65 78 74 72 61 5f 63 65 72 74  clude_extra_cert
1c810 73 20 3d 20 31 3b 0a 09 7d 0a 0a 09 69 66 20 28  s = 1;..}...if (
1c820 67 65 74 65 6e 76 28 22 43 41 43 4b 45 59 5f 4e  getenv("CACKEY_N
1c830 4f 5f 44 4f 44 5f 43 45 52 54 53 5f 4f 4e 5f 48  O_DOD_CERTS_ON_H
1c840 57 5f 53 4c 4f 54 53 22 29 20 21 3d 20 4e 55 4c  W_SLOTS") != NUL
1c850 4c 29 20 7b 0a 09 09 69 6e 63 6c 75 64 65 5f 65  L) {...include_e
1c860 78 74 72 61 5f 63 65 72 74 73 20 3d 20 30 3b 0a  xtra_certs = 0;.
1c870 09 7d 0a 0a 23 69 66 64 65 66 20 43 41 43 4b 45  .}..#ifdef CACKE
1c880 59 5f 4e 4f 5f 45 58 54 52 41 5f 43 45 52 54 53  Y_NO_EXTRA_CERTS
1c890 0a 09 69 66 20 28 67 65 74 65 6e 76 28 22 43 41  ..if (getenv("CA
1c8a0 43 4b 45 59 5f 45 58 54 52 41 5f 43 45 52 54 53  CKEY_EXTRA_CERTS
1c8b0 22 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  ") != NULL) {...
1c8c0 69 6e 63 6c 75 64 65 5f 64 6f 64 5f 63 65 72 74  include_dod_cert
1c8d0 73 20 3d 20 31 3b 0a 09 7d 20 65 6c 73 65 20 7b  s = 1;..} else {
1c8e0 0a 09 09 69 6e 63 6c 75 64 65 5f 64 6f 64 5f 63  ...include_dod_c
1c8f0 65 72 74 73 20 3d 20 30 3b 0a 09 7d 0a 23 65 6c  erts = 0;..}.#el
1c900 73 65 0a 09 69 66 20 28 67 65 74 65 6e 76 28 22  se..if (getenv("
1c910 43 41 43 4b 45 59 5f 4e 4f 5f 45 58 54 52 41 5f  CACKEY_NO_EXTRA_
1c920 43 45 52 54 53 22 29 20 21 3d 20 4e 55 4c 4c 29  CERTS") != NULL)
1c930 20 7b 0a 09 09 69 6e 63 6c 75 64 65 5f 64 6f 64   {...include_dod
1c940 5f 63 65 72 74 73 20 3d 20 30 3b 0a 09 7d 20 65  _certs = 0;..} e
1c950 6c 73 65 20 7b 0a 09 09 69 6e 63 6c 75 64 65 5f  lse {...include_
1c960 64 6f 64 5f 63 65 72 74 73 20 3d 20 31 3b 0a 09  dod_certs = 1;..
1c970 7d 0a 23 65 6e 64 69 66 0a 0a 09 69 66 20 28 69  }.#endif...if (i
1c980 6e 63 6c 75 64 65 5f 64 6f 64 5f 63 65 72 74 73  nclude_dod_certs
1c990 29 20 7b 0a 09 09 6e 75 6d 5f 64 6f 64 5f 63 65  ) {...num_dod_ce
1c9a0 72 74 73 20 3d 20 73 69 7a 65 6f 66 28 65 78 74  rts = sizeof(ext
1c9b0 72 61 5f 63 65 72 74 73 29 20 2f 20 73 69 7a 65  ra_certs) / size
1c9c0 6f 66 28 65 78 74 72 61 5f 63 65 72 74 73 5b 30  of(extra_certs[0
1c9d0 5d 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09  ]);..} else {...
1c9e0 6e 75 6d 5f 64 6f 64 5f 63 65 72 74 73 20 3d 20  num_dod_certs = 
1c9f0 30 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74  0;..}...if (slot
1ca00 2d 3e 69 6e 74 65 72 6e 61 6c 29 20 7b 0a 09 09  ->internal) {...
1ca10 6e 75 6d 5f 69 64 73 20 3d 20 63 61 63 6b 65 79  num_ids = cackey
1ca20 5f 72 65 61 64 5f 64 6f 64 5f 69 64 65 6e 74 69  _read_dod_identi
1ca30 74 69 65 73 28 4e 55 4c 4c 2c 20 6e 75 6d 5f 64  ties(NULL, num_d
1ca40 6f 64 5f 63 65 72 74 73 29 3b 0a 0a 09 09 69 66  od_certs);....if
1ca50 20 28 6e 75 6d 5f 69 64 73 20 21 3d 20 30 29 20   (num_ids != 0) 
1ca60 7b 0a 09 09 09 69 64 65 6e 74 69 74 69 65 73 20  {....identities 
1ca70 3d 20 6d 61 6c 6c 6f 63 28 6e 75 6d 5f 69 64 73  = malloc(num_ids
1ca80 20 2a 20 73 69 7a 65 6f 66 28 2a 69 64 65 6e 74   * sizeof(*ident
1ca90 69 74 69 65 73 29 29 3b 0a 0a 09 09 09 63 61 63  ities));.....cac
1caa0 6b 65 79 5f 72 65 61 64 5f 64 6f 64 5f 69 64 65  key_read_dod_ide
1cab0 6e 74 69 74 69 65 73 28 69 64 65 6e 74 69 74 69  ntities(identiti
1cac0 65 73 2c 20 6e 75 6d 5f 64 6f 64 5f 63 65 72 74  es, num_dod_cert
1cad0 73 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09  s);...} else {..
1cae0 09 09 69 64 65 6e 74 69 74 69 65 73 20 3d 20 4e  ..identities = N
1caf0 55 4c 4c 3b 0a 09 09 7d 0a 0a 09 09 2a 69 64 73  ULL;...}....*ids
1cb00 5f 66 6f 75 6e 64 20 3d 20 6e 75 6d 5f 69 64 73  _found = num_ids
1cb10 3b 0a 0a 09 09 72 65 74 75 72 6e 28 69 64 65 6e  ;....return(iden
1cb20 74 69 74 69 65 73 29 3b 0a 09 7d 0a 0a 09 70 63  tities);..}...pc
1cb30 73 63 5f 69 64 65 6e 74 69 74 69 65 73 20 3d 20  sc_identities = 
1cb40 63 61 63 6b 65 79 5f 72 65 61 64 5f 63 65 72 74  cackey_read_cert
1cb50 73 28 73 6c 6f 74 2c 20 4e 55 4c 4c 2c 20 26 6e  s(slot, NULL, &n
1cb60 75 6d 5f 63 65 72 74 73 29 3b 0a 09 69 66 20 28  um_certs);..if (
1cb70 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 20  pcsc_identities 
1cb80 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 2f 2a 20  != NULL) {.../* 
1cb90 43 6f 6e 76 65 72 74 20 6e 75 6d 62 65 72 20 6f  Convert number o
1cba0 66 20 43 65 72 74 73 20 74 6f 20 6e 75 6d 62 65  f Certs to numbe
1cbb0 72 20 6f 66 20 6f 62 6a 65 63 74 73 20 2a 2f 0a  r of objects */.
1cbc0 09 09 6e 75 6d 5f 69 64 73 20 3d 20 28 43 4b 4f  ..num_ids = (CKO
1cbd0 5f 50 52 49 56 41 54 45 5f 4b 45 59 20 2d 20 43  _PRIVATE_KEY - C
1cbe0 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 45 20 2b  KO_CERTIFICATE +
1cbf0 20 31 29 20 2a 20 6e 75 6d 5f 63 65 72 74 73 3b   1) * num_certs;
1cc00 0a 0a 09 09 69 66 20 28 69 6e 63 6c 75 64 65 5f  ....if (include_
1cc10 65 78 74 72 61 5f 63 65 72 74 73 29 20 7b 0a 09  extra_certs) {..
1cc20 09 09 6e 75 6d 5f 69 64 73 20 2b 3d 20 63 61 63  ..num_ids += cac
1cc30 6b 65 79 5f 72 65 61 64 5f 64 6f 64 5f 69 64 65  key_read_dod_ide
1cc40 6e 74 69 74 69 65 73 28 4e 55 4c 4c 2c 20 6e 75  ntities(NULL, nu
1cc50 6d 5f 64 6f 64 5f 63 65 72 74 73 29 3b 0a 09 09  m_dod_certs);...
1cc60 7d 0a 0a 09 09 69 64 65 6e 74 69 74 69 65 73 20  }....identities 
1cc70 3d 20 6d 61 6c 6c 6f 63 28 6e 75 6d 5f 69 64 73  = malloc(num_ids
1cc80 20 2a 20 73 69 7a 65 6f 66 28 2a 69 64 65 6e 74   * sizeof(*ident
1cc90 69 74 69 65 73 29 29 3b 0a 0a 09 09 2f 2a 20 41  ities));..../* A
1cca0 64 64 20 63 65 72 74 69 66 69 63 61 74 65 73 2c  dd certificates,
1ccb0 20 70 75 62 6c 69 63 20 6b 65 79 73 2c 20 61 6e   public keys, an
1ccc0 64 20 70 72 69 76 61 74 65 20 6b 65 79 73 20 66  d private keys f
1ccd0 72 6f 6d 20 74 68 65 20 73 6d 61 72 74 63 61 72  rom the smartcar
1cce0 64 20 2a 2f 0a 09 09 69 64 5f 69 64 78 20 3d 20  d */...id_idx = 
1ccf0 30 3b 0a 09 09 66 6f 72 20 28 63 65 72 74 5f 69  0;...for (cert_i
1cd00 64 78 20 3d 20 30 3b 20 63 65 72 74 5f 69 64 78  dx = 0; cert_idx
1cd10 20 3c 20 6e 75 6d 5f 63 65 72 74 73 3b 20 63 65   < num_certs; ce
1cd20 72 74 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 09 66  rt_idx++) {....f
1cd30 6f 72 20 28 63 75 72 72 5f 69 64 5f 74 79 70 65  or (curr_id_type
1cd40 20 3d 20 43 4b 4f 5f 43 45 52 54 49 46 49 43 41   = CKO_CERTIFICA
1cd50 54 45 3b 20 63 75 72 72 5f 69 64 5f 74 79 70 65  TE; curr_id_type
1cd60 20 3c 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f   <= CKO_PRIVATE_
1cd70 4b 45 59 3b 20 63 75 72 72 5f 69 64 5f 74 79 70  KEY; curr_id_typ
1cd80 65 2b 2b 29 20 7b 0a 09 09 09 09 69 64 65 6e 74  e++) {.....ident
1cd90 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74  ities[id_idx].at
1cda0 74 72 69 62 75 74 65 73 20 3d 20 63 61 63 6b 65  tributes = cacke
1cdb0 79 5f 67 65 74 5f 61 74 74 72 69 62 75 74 65 73  y_get_attributes
1cdc0 28 63 75 72 72 5f 69 64 5f 74 79 70 65 2c 20 26  (curr_id_type, &
1cdd0 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 5b  pcsc_identities[
1cde0 63 65 72 74 5f 69 64 78 5d 2c 20 63 65 72 74 5f  cert_idx], cert_
1cdf0 69 64 78 2c 20 26 69 64 65 6e 74 69 74 69 65 73  idx, &identities
1ce00 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75  [id_idx].attribu
1ce10 74 65 73 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09 09  tes_count);.....
1ce20 09 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69  .identities[id_i
1ce30 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69 74  dx].pcsc_identit
1ce40 79 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f  y = malloc(sizeo
1ce50 66 28 2a 69 64 65 6e 74 69 74 69 65 73 5b 69 64  f(*identities[id
1ce60 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e 74  _idx].pcsc_ident
1ce70 69 74 79 29 29 3b 0a 09 09 09 09 6d 65 6d 63 70  ity));.....memcp
1ce80 79 28 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f  y(identities[id_
1ce90 69 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69  idx].pcsc_identi
1cea0 74 79 2c 20 26 70 63 73 63 5f 69 64 65 6e 74 69  ty, &pcsc_identi
1ceb0 74 69 65 73 5b 63 65 72 74 5f 69 64 78 5d 2c 20  ties[cert_idx], 
1cec0 73 69 7a 65 6f 66 28 2a 69 64 65 6e 74 69 74 69  sizeof(*identiti
1ced0 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f  es[id_idx].pcsc_
1cee0 69 64 65 6e 74 69 74 79 29 29 3b 0a 0a 09 09 09  identity));.....
1cef0 09 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69  .identities[id_i
1cf00 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69 74  dx].pcsc_identit
1cf10 79 2d 3e 63 65 72 74 69 66 69 63 61 74 65 20 3d  y->certificate =
1cf20 20 6d 61 6c 6c 6f 63 28 70 63 73 63 5f 69 64 65   malloc(pcsc_ide
1cf30 6e 74 69 74 69 65 73 5b 63 65 72 74 5f 69 64 78  ntities[cert_idx
1cf40 5d 2e 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65  ].certificate_le
1cf50 6e 29 3b 0a 09 09 09 09 6d 65 6d 63 70 79 28 69  n);.....memcpy(i
1cf60 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78  dentities[id_idx
1cf70 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d  ].pcsc_identity-
1cf80 3e 63 65 72 74 69 66 69 63 61 74 65 2c 20 70 63  >certificate, pc
1cf90 73 63 5f 69 64 65 6e 74 69 74 69 65 73 5b 63 65  sc_identities[ce
1cfa0 72 74 5f 69 64 78 5d 2e 63 65 72 74 69 66 69 63  rt_idx].certific
1cfb0 61 74 65 2c 20 70 63 73 63 5f 69 64 65 6e 74 69  ate, pcsc_identi
1cfc0 74 69 65 73 5b 63 65 72 74 5f 69 64 78 5d 2e 63  ties[cert_idx].c
1cfd0 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b  ertificate_len);
1cfe0 0a 0a 09 09 09 09 69 64 5f 69 64 78 2b 2b 3b 0a  ......id_idx++;.
1cff0 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 69 66 20 28  ...}...}....if (
1d000 69 6e 63 6c 75 64 65 5f 65 78 74 72 61 5f 63 65  include_extra_ce
1d010 72 74 73 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  rts) {....CACKEY
1d020 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 49  _DEBUG_PRINTF("I
1d030 6e 63 6c 75 64 69 6e 67 20 55 53 20 47 6f 76 65  ncluding US Gove
1d040 72 6e 6d 65 6e 74 20 43 65 72 74 69 66 69 63 61  rnment Certifica
1d050 74 65 73 20 6f 6e 20 68 61 72 64 77 61 72 65 20  tes on hardware 
1d060 73 6c 6f 74 22 29 3b 0a 0a 09 09 09 63 61 63 6b  slot");.....cack
1d070 65 79 5f 72 65 61 64 5f 64 6f 64 5f 69 64 65 6e  ey_read_dod_iden
1d080 74 69 74 69 65 73 28 69 64 65 6e 74 69 74 69 65  tities(identitie
1d090 73 20 2b 20 69 64 5f 69 64 78 2c 20 6e 75 6d 5f  s + id_idx, num_
1d0a0 64 6f 64 5f 63 65 72 74 73 29 3b 0a 09 09 7d 0a  dod_certs);...}.
1d0b0 0a 09 09 63 61 63 6b 65 79 5f 66 72 65 65 5f 63  ...cackey_free_c
1d0c0 65 72 74 73 28 70 63 73 63 5f 69 64 65 6e 74 69  erts(pcsc_identi
1d0d0 74 69 65 73 2c 20 6e 75 6d 5f 63 65 72 74 73 2c  ties, num_certs,
1d0e0 20 31 29 3b 0a 0a 09 09 2a 69 64 73 5f 66 6f 75   1);....*ids_fou
1d0f0 6e 64 20 3d 20 6e 75 6d 5f 69 64 73 3b 0a 0a 09  nd = num_ids;...
1d100 09 72 65 74 75 72 6e 28 69 64 65 6e 74 69 74 69  .return(identiti
1d110 65 73 29 3b 0a 09 7d 0a 0a 0a 09 2a 69 64 73 5f  es);..}....*ids_
1d120 66 6f 75 6e 64 20 3d 20 30 3b 0a 09 72 65 74 75  found = 0;..retu
1d130 72 6e 28 4e 55 4c 4c 29 3b 0a 7d 0a 0a 73 74 61  rn(NULL);.}..sta
1d140 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74 20 63  tic cackey_ret c
1d150 61 63 6b 65 79 5f 67 65 74 5f 70 69 6e 28 63 68  ackey_get_pin(ch
1d160 61 72 20 2a 70 69 6e 62 75 66 29 20 7b 0a 09 46  ar *pinbuf) {..F
1d170 49 4c 45 20 2a 70 69 6e 66 64 3b 0a 09 63 68 61  ILE *pinfd;..cha
1d180 72 20 2a 66 67 65 74 73 5f 72 65 74 3b 0a 09 69  r *fgets_ret;..i
1d190 6e 74 20 70 63 6c 6f 73 65 5f 72 65 74 3b 0a 0a  nt pclose_ret;..
1d1a0 09 69 66 20 28 63 61 63 6b 65 79 5f 70 69 6e 5f  .if (cackey_pin_
1d1b0 63 6f 6d 6d 61 6e 64 20 3d 3d 20 4e 55 4c 4c 29  command == NULL)
1d1c0 20 7b 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b   {...return(CACK
1d1d0 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49  EY_PCSC_E_GENERI
1d1e0 43 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 69 6e  C);..}...if (pin
1d1f0 62 75 66 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  buf == NULL) {..
1d200 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
1d210 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a  CSC_E_GENERIC);.
1d220 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
1d230 47 5f 50 52 49 4e 54 46 28 22 43 41 43 4b 45 59  G_PRINTF("CACKEY
1d240 5f 50 49 4e 5f 43 4f 4d 4d 41 4e 44 20 3d 20 25  _PIN_COMMAND = %
1d250 73 22 2c 20 63 61 63 6b 65 79 5f 70 69 6e 5f 63  s", cackey_pin_c
1d260 6f 6d 6d 61 6e 64 29 3b 0a 0a 09 70 69 6e 66 64  ommand);...pinfd
1d270 20 3d 20 70 6f 70 65 6e 28 63 61 63 6b 65 79 5f   = popen(cackey_
1d280 70 69 6e 5f 63 6f 6d 6d 61 6e 64 2c 20 22 72 22  pin_command, "r"
1d290 29 3b 0a 09 69 66 20 28 70 69 6e 66 64 20 3d 3d  );..if (pinfd ==
1d2a0 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
1d2b0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1d2c0 45 72 72 6f 72 2e 20 20 25 73 3a 20 55 6e 61 62  Error.  %s: Unab
1d2d0 6c 65 20 74 6f 20 72 75 6e 22 2c 20 63 61 63 6b  le to run", cack
1d2e0 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 29 3b  ey_pin_command);
1d2f0 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ....return(CACKE
1d300 59 5f 50 43 53 43 5f 45 5f 42 41 44 50 49 4e 29  Y_PCSC_E_BADPIN)
1d310 3b 0a 09 7d 0a 0a 09 66 67 65 74 73 5f 72 65 74  ;..}...fgets_ret
1d320 20 3d 20 66 67 65 74 73 28 70 69 6e 62 75 66 2c   = fgets(pinbuf,
1d330 20 33 32 2c 20 70 69 6e 66 64 29 3b 0a 09 69 66   32, pinfd);..if
1d340 20 28 66 67 65 74 73 5f 72 65 74 20 3d 3d 20 4e   (fgets_ret == N
1d350 55 4c 4c 29 20 7b 0a 09 09 70 69 6e 62 75 66 5b  ULL) {...pinbuf[
1d360 30 5d 20 3d 20 27 5c 30 27 3b 0a 09 7d 0a 0a 09  0] = '\0';..}...
1d370 70 63 6c 6f 73 65 5f 72 65 74 20 3d 20 70 63 6c  pclose_ret = pcl
1d380 6f 73 65 28 70 69 6e 66 64 29 3b 0a 09 69 66 20  ose(pinfd);..if 
1d390 28 70 63 6c 6f 73 65 5f 72 65 74 20 3d 3d 20 2d  (pclose_ret == -
1d3a0 31 20 26 26 20 65 72 72 6e 6f 20 3d 3d 20 45 43  1 && errno == EC
1d3b0 48 49 4c 44 29 20 7b 0a 09 09 43 41 43 4b 45 59  HILD) {...CACKEY
1d3c0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4e  _DEBUG_PRINTF("N
1d3d0 6f 74 69 63 65 2e 20 20 70 63 6c 6f 73 65 28 29  otice.  pclose()
1d3e0 20 69 6e 64 69 63 61 74 65 64 20 69 74 20 63 6f   indicated it co
1d3f0 75 6c 64 20 6e 6f 74 20 67 65 74 20 74 68 65 20  uld not get the 
1d400 73 74 61 74 75 73 20 6f 66 20 74 68 65 20 63 68  status of the ch
1d410 69 6c 64 2c 20 61 73 73 75 6d 69 6e 67 20 69 74  ild, assuming it
1d420 20 73 75 63 63 65 65 65 64 65 64 20 21 22 29 3b   succeeeded !");
1d430 0a 0a 09 09 70 63 6c 6f 73 65 5f 72 65 74 20 3d  ....pclose_ret =
1d440 20 30 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 63 6c   0;..}...if (pcl
1d450 6f 73 65 5f 72 65 74 20 21 3d 20 30 29 20 7b 0a  ose_ret != 0) {.
1d460 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1d470 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 25  RINTF("Error.  %
1d480 73 3a 20 65 78 69 74 65 64 20 77 69 74 68 20 6e  s: exited with n
1d490 6f 6e 2d 7a 65 72 6f 20 73 74 61 74 75 73 20 6f  on-zero status o
1d4a0 66 20 25 69 22 2c 20 63 61 63 6b 65 79 5f 70 69  f %i", cackey_pi
1d4b0 6e 5f 63 6f 6d 6d 61 6e 64 2c 20 70 63 6c 6f 73  n_command, pclos
1d4c0 65 5f 72 65 74 29 3b 0a 0a 09 09 72 65 74 75 72  e_ret);....retur
1d4d0 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  n(CACKEY_PCSC_E_
1d4e0 42 41 44 50 49 4e 29 3b 0a 09 7d 0a 0a 09 69 66  BADPIN);..}...if
1d4f0 20 28 73 74 72 6c 65 6e 28 70 69 6e 62 75 66 29   (strlen(pinbuf)
1d500 20 3c 20 31 29 20 7b 0a 09 09 43 41 43 4b 45 59   < 1) {...CACKEY
1d510 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1d520 72 72 6f 72 2e 20 20 25 73 3a 20 72 65 74 75 72  rror.  %s: retur
1d530 6e 65 64 20 6e 6f 20 64 61 74 61 22 2c 20 63 61  ned no data", ca
1d540 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64  ckey_pin_command
1d550 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43  );....return(CAC
1d560 4b 45 59 5f 50 43 53 43 5f 45 5f 42 41 44 50 49  KEY_PCSC_E_BADPI
1d570 4e 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 69 6e  N);..}...if (pin
1d580 62 75 66 5b 73 74 72 6c 65 6e 28 70 69 6e 62 75  buf[strlen(pinbu
1d590 66 29 20 2d 20 31 5d 20 3d 3d 20 27 5c 6e 27 29  f) - 1] == '\n')
1d5a0 20 7b 0a 09 09 70 69 6e 62 75 66 5b 73 74 72 6c   {...pinbuf[strl
1d5b0 65 6e 28 70 69 6e 62 75 66 29 20 2d 20 31 5d 20  en(pinbuf) - 1] 
1d5c0 3d 20 27 5c 30 27 3b 0a 09 7d 0a 0a 09 72 65 74  = '\0';..}...ret
1d5d0 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
1d5e0 53 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  S_OK);.}..CK_DEF
1d5f0 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
1d600 52 56 2c 20 43 5f 49 6e 69 74 69 61 6c 69 7a 65  RV, C_Initialize
1d610 29 28 43 4b 5f 56 4f 49 44 5f 50 54 52 20 70 49  )(CK_VOID_PTR pI
1d620 6e 69 74 41 72 67 73 29 20 7b 0a 09 43 4b 5f 43  nitArgs) {..CK_C
1d630 5f 49 4e 49 54 49 41 4c 49 5a 45 5f 41 52 47 53  _INITIALIZE_ARGS
1d640 20 43 4b 5f 50 54 52 20 61 72 67 73 3b 0a 09 75   CK_PTR args;..u
1d650 69 6e 74 33 32 5f 74 20 69 64 78 2c 20 68 69 67  int32_t idx, hig
1d660 68 65 73 74 5f 73 6c 6f 74 3b 0a 09 69 6e 74 20  hest_slot;..int 
1d670 6d 75 74 65 78 5f 69 6e 69 74 5f 72 65 74 3b 0a  mutex_init_ret;.
1d680 09 69 6e 74 20 69 6e 63 6c 75 64 65 5f 64 6f 64  .int include_dod
1d690 5f 63 65 72 74 73 3b 0a 0a 09 43 41 43 4b 45 59  _certs;...CACKEY
1d6a0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
1d6b0 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
1d6c0 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
1d6d0 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
1d6e0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1d6f0 6f 72 2e 20 20 41 6c 72 65 61 64 79 20 69 6e 69  or.  Already ini
1d700 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
1d710 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
1d720 4f 4b 49 5f 41 4c 52 45 41 44 59 5f 49 4e 49 54  OKI_ALREADY_INIT
1d730 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69  IALIZED);..}...i
1d740 66 20 28 70 49 6e 69 74 41 72 67 73 20 21 3d 20  f (pInitArgs != 
1d750 4e 55 4c 4c 29 20 7b 0a 09 09 61 72 67 73 20 3d  NULL) {...args =
1d760 20 70 49 6e 69 74 41 72 67 73 3b 0a 09 09 6d 65   pInitArgs;...me
1d770 6d 63 70 79 28 26 63 61 63 6b 65 79 5f 61 72 67  mcpy(&cackey_arg
1d780 73 2c 20 61 72 67 73 2c 20 73 69 7a 65 6f 66 28  s, args, sizeof(
1d790 63 61 63 6b 65 79 5f 61 72 67 73 29 29 3b 0a 0a  cackey_args));..
1d7a0 09 09 69 66 20 28 61 72 67 73 2d 3e 43 72 65 61  ..if (args->Crea
1d7b0 74 65 4d 75 74 65 78 20 3d 3d 20 4e 55 4c 4c 20  teMutex == NULL 
1d7c0 7c 7c 20 61 72 67 73 2d 3e 44 65 73 74 72 6f 79  || args->Destroy
1d7d0 4d 75 74 65 78 20 3d 3d 20 4e 55 4c 4c 20 7c 7c  Mutex == NULL ||
1d7e0 20 61 72 67 73 2d 3e 4c 6f 63 6b 4d 75 74 65 78   args->LockMutex
1d7f0 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 73   == NULL || args
1d800 2d 3e 55 6e 6c 6f 63 6b 4d 75 74 65 78 20 3d 3d  ->UnlockMutex ==
1d810 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 69 66 20 28   NULL) {....if (
1d820 61 72 67 73 2d 3e 43 72 65 61 74 65 4d 75 74 65  args->CreateMute
1d830 78 20 21 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67  x != NULL || arg
1d840 73 2d 3e 44 65 73 74 72 6f 79 4d 75 74 65 78 20  s->DestroyMutex 
1d850 21 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 73 2d  != NULL || args-
1d860 3e 4c 6f 63 6b 4d 75 74 65 78 20 21 3d 20 4e 55  >LockMutex != NU
1d870 4c 4c 20 7c 7c 20 61 72 67 73 2d 3e 55 6e 6c 6f  LL || args->Unlo
1d880 63 6b 4d 75 74 65 78 20 21 3d 20 4e 55 4c 4c 29  ckMutex != NULL)
1d890 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45   {.....CACKEY_DE
1d8a0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1d8b0 72 2e 20 53 6f 6d 65 2c 20 62 75 74 20 6e 6f 74  r. Some, but not
1d8c0 20 41 6c 6c 20 74 68 72 65 61 64 69 6e 67 20 70   All threading p
1d8d0 72 69 6d 69 74 69 76 65 73 20 70 72 6f 76 69 64  rimitives provid
1d8e0 65 64 2e 22 29 3b 0a 0a 09 09 09 09 72 65 74 75  ed.");......retu
1d8f0 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53  rn(CKR_ARGUMENTS
1d900 5f 42 41 44 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a  _BAD);....}...}.
1d910 09 7d 20 65 6c 73 65 20 7b 0a 09 09 63 61 63 6b  .} else {...cack
1d920 65 79 5f 61 72 67 73 2e 43 72 65 61 74 65 4d 75  ey_args.CreateMu
1d930 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 09 09 63 61  tex = NULL;...ca
1d940 63 6b 65 79 5f 61 72 67 73 2e 44 65 73 74 72 6f  ckey_args.Destro
1d950 79 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 09  yMutex = NULL;..
1d960 09 63 61 63 6b 65 79 5f 61 72 67 73 2e 4c 6f 63  .cackey_args.Loc
1d970 6b 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 09  kMutex = NULL;..
1d980 09 63 61 63 6b 65 79 5f 61 72 67 73 2e 55 6e 6c  .cackey_args.Unl
1d990 6f 63 6b 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b  ockMutex = NULL;
1d9a0 0a 09 09 63 61 63 6b 65 79 5f 61 72 67 73 2e 66  ...cackey_args.f
1d9b0 6c 61 67 73 20 3d 20 30 3b 0a 09 7d 0a 0a 09 66  lags = 0;..}...f
1d9c0 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78  or (idx = 0; idx
1d9d0 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65   < (sizeof(cacke
1d9e0 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69  y_sessions) / si
1d9f0 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
1da00 69 6f 6e 73 5b 30 5d 29 29 3b 20 69 64 78 2b 2b  ions[0])); idx++
1da10 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 73 65 73  ) {...cackey_ses
1da20 73 69 6f 6e 73 5b 69 64 78 5d 2e 61 63 74 69 76  sions[idx].activ
1da30 65 20 3d 20 30 3b 0a 09 7d 0a 0a 09 66 6f 72 20  e = 0;..}...for 
1da40 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20  (idx = 0; idx < 
1da50 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
1da60 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  lots) / sizeof(c
1da70 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29  ackey_slots[0]))
1da80 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 63 61 63  ; idx++) {...cac
1da90 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 61  key_slots[idx].a
1daa0 63 74 69 76 65 20 3d 20 30 3b 0a 09 09 63 61 63  ctive = 0;...cac
1dab0 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 70  key_slots[idx].p
1dac0 63 73 63 5f 72 65 61 64 65 72 20 3d 20 4e 55 4c  csc_reader = NUL
1dad0 4c 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  L;...cackey_slot
1dae0 73 5b 69 64 78 5d 2e 74 72 61 6e 73 61 63 74 69  s[idx].transacti
1daf0 6f 6e 5f 64 65 70 74 68 20 3d 20 30 3b 0a 09 09  on_depth = 0;...
1db00 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78  cackey_slots[idx
1db10 5d 2e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 6e 65  ].transaction_ne
1db20 65 64 5f 68 77 5f 6c 6f 63 6b 20 3d 20 30 3b 0a  ed_hw_lock = 0;.
1db30 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69  ..cackey_slots[i
1db40 64 78 5d 2e 73 6c 6f 74 5f 72 65 73 65 74 20 3d  dx].slot_reset =
1db50 20 30 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f   0;...cackey_slo
1db60 74 73 5b 69 64 78 5d 2e 74 6f 6b 65 6e 5f 66 6c  ts[idx].token_fl
1db70 61 67 73 20 3d 20 30 3b 0a 09 09 63 61 63 6b 65  ags = 0;...cacke
1db80 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 6c 61 62  y_slots[idx].lab
1db90 65 6c 20 3d 20 4e 55 4c 4c 3b 0a 09 09 63 61 63  el = NULL;...cac
1dba0 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 69  key_slots[idx].i
1dbb0 6e 74 65 72 6e 61 6c 20 3d 20 30 3b 0a 09 7d 0a  nternal = 0;..}.
1dbc0 0a 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f 4e  .#ifdef CACKEY_N
1dbd0 4f 5f 45 58 54 52 41 5f 43 45 52 54 53 0a 09 69  O_EXTRA_CERTS..i
1dbe0 66 20 28 67 65 74 65 6e 76 28 22 43 41 43 4b 45  f (getenv("CACKE
1dbf0 59 5f 45 58 54 52 41 5f 43 45 52 54 53 22 29 20  Y_EXTRA_CERTS") 
1dc00 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 69 6e 63  != NULL) {...inc
1dc10 6c 75 64 65 5f 64 6f 64 5f 63 65 72 74 73 20 3d  lude_dod_certs =
1dc20 20 31 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09   1;..} else {...
1dc30 69 6e 63 6c 75 64 65 5f 64 6f 64 5f 63 65 72 74  include_dod_cert
1dc40 73 20 3d 20 30 3b 0a 09 7d 0a 23 65 6c 73 65 0a  s = 0;..}.#else.
1dc50 09 69 66 20 28 67 65 74 65 6e 76 28 22 43 41 43  .if (getenv("CAC
1dc60 4b 45 59 5f 4e 4f 5f 45 58 54 52 41 5f 43 45 52  KEY_NO_EXTRA_CER
1dc70 54 53 22 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  TS") != NULL) {.
1dc80 09 09 69 6e 63 6c 75 64 65 5f 64 6f 64 5f 63 65  ..include_dod_ce
1dc90 72 74 73 20 3d 20 30 3b 0a 09 7d 20 65 6c 73 65  rts = 0;..} else
1dca0 20 7b 0a 09 09 69 6e 63 6c 75 64 65 5f 64 6f 64   {...include_dod
1dcb0 5f 63 65 72 74 73 20 3d 20 31 3b 0a 09 7d 0a 23  _certs = 1;..}.#
1dcc0 65 6e 64 69 66 0a 0a 09 69 66 20 28 69 6e 63 6c  endif...if (incl
1dcd0 75 64 65 5f 64 6f 64 5f 63 65 72 74 73 20 3d 3d  ude_dod_certs ==
1dce0 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
1dcf0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 41 73 6b  EBUG_PRINTF("Ask
1dd00 65 64 20 6e 6f 74 20 74 6f 20 69 6e 63 6c 75 64  ed not to includ
1dd10 65 20 44 6f 44 20 63 65 72 74 69 66 69 63 61 74  e DoD certificat
1dd20 65 73 22 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a  es");..} else {.
1dd30 09 09 68 69 67 68 65 73 74 5f 73 6c 6f 74 20 3d  ..highest_slot =
1dd40 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
1dd50 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28  slots) / sizeof(
1dd60 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29  cackey_slots[0])
1dd70 29 20 2d 20 31 3b 0a 0a 09 09 43 41 43 4b 45 59  ) - 1;....CACKEY
1dd80 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 49  _DEBUG_PRINTF("I
1dd90 6e 63 6c 75 64 69 6e 67 20 44 6f 44 20 63 65 72  ncluding DoD cer
1dda0 74 73 20 69 6e 20 73 6c 6f 74 20 25 6c 75 22 2c  ts in slot %lu",
1ddb0 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
1ddc0 20 68 69 67 68 65 73 74 5f 73 6c 6f 74 29 3b 0a   highest_slot);.
1ddd0 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ...cackey_slots[
1dde0 68 69 67 68 65 73 74 5f 73 6c 6f 74 5d 2e 61 63  highest_slot].ac
1ddf0 74 69 76 65 20 3d 20 31 3b 0a 09 09 63 61 63 6b  tive = 1;...cack
1de00 65 79 5f 73 6c 6f 74 73 5b 68 69 67 68 65 73 74  ey_slots[highest
1de10 5f 73 6c 6f 74 5d 2e 69 6e 74 65 72 6e 61 6c 20  _slot].internal 
1de20 3d 20 31 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c  = 1;...cackey_sl
1de30 6f 74 73 5b 68 69 67 68 65 73 74 5f 73 6c 6f 74  ots[highest_slot
1de40 5d 2e 6c 61 62 65 6c 20 3d 20 28 75 6e 73 69 67  ].label = (unsig
1de50 6e 65 64 20 63 68 61 72 20 2a 29 20 22 55 53 20  ned char *) "US 
1de60 47 6f 76 65 72 6e 6d 65 6e 74 20 43 65 72 74 69  Government Certi
1de70 66 69 63 61 74 65 73 22 3b 0a 09 09 63 61 63 6b  ficates";...cack
1de80 65 79 5f 73 6c 6f 74 73 5b 68 69 67 68 65 73 74  ey_slots[highest
1de90 5f 73 6c 6f 74 5d 2e 70 63 73 63 5f 72 65 61 64  _slot].pcsc_read
1dea0 65 72 20 3d 20 22 43 41 43 4b 65 79 22 3b 0a 09  er = "CACKey";..
1deb0 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 68 69  .cackey_slots[hi
1dec0 67 68 65 73 74 5f 73 6c 6f 74 5d 2e 74 6f 6b 65  ghest_slot].toke
1ded0 6e 5f 66 6c 61 67 73 20 3d 20 30 3b 0a 09 7d 0a  n_flags = 0;..}.
1dee0 0a 09 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  ..cackey_initial
1def0 69 7a 65 64 20 3d 20 31 3b 0a 0a 09 69 66 20 28  ized = 1;...if (
1df00 21 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 5f  !cackey_biglock_
1df10 69 6e 69 74 29 20 7b 0a 09 09 6d 75 74 65 78 5f  init) {...mutex_
1df20 69 6e 69 74 5f 72 65 74 20 3d 20 63 61 63 6b 65  init_ret = cacke
1df30 79 5f 6d 75 74 65 78 5f 63 72 65 61 74 65 28 26  y_mutex_create(&
1df40 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
1df50 0a 0a 09 09 69 66 20 28 6d 75 74 65 78 5f 69 6e  ....if (mutex_in
1df60 69 74 5f 72 65 74 20 21 3d 20 30 29 20 7b 0a 09  it_ret != 0) {..
1df70 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1df80 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4d  RINTF("Error.  M
1df90 75 74 65 78 20 69 6e 69 74 69 61 6c 69 7a 61 74  utex initializat
1dfa0 69 6f 6e 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ion failed.");..
1dfb0 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 41  ...return(CKR_CA
1dfc0 4e 54 5f 4c 4f 43 4b 29 3b 0a 09 09 7d 0a 0a 09  NT_LOCK);...}...
1dfd0 09 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 5f  .cackey_biglock_
1dfe0 69 6e 69 74 20 3d 20 31 3b 0a 09 7d 0a 0a 09 2f  init = 1;..}.../
1dff0 2a 20 44 65 66 69 6e 65 20 61 20 63 6f 6d 6d 61  * Define a comma
1e000 6e 64 20 74 6f 20 70 72 6f 6d 70 74 20 75 73 65  nd to prompt use
1e010 72 20 66 6f 72 20 61 20 50 49 4e 20 2a 2f 0a 23  r for a PIN */.#
1e020 69 66 64 65 66 20 43 41 43 4b 45 59 5f 50 49 4e  ifdef CACKEY_PIN
1e030 5f 43 4f 4d 4d 41 4e 44 5f 44 45 46 41 55 4c 54  _COMMAND_DEFAULT
1e040 0a 09 63 61 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d  ..cackey_pin_com
1e050 6d 61 6e 64 20 3d 20 73 74 72 64 75 70 28 43 41  mand = strdup(CA
1e060 43 4b 45 59 5f 4d 41 43 52 4f 5f 44 45 46 41 55  CKEY_MACRO_DEFAU
1e070 4c 54 5f 58 53 54 52 28 43 41 43 4b 45 59 5f 50  LT_XSTR(CACKEY_P
1e080 49 4e 5f 43 4f 4d 4d 41 4e 44 5f 44 45 46 41 55  IN_COMMAND_DEFAU
1e090 4c 54 29 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69  LT));.#endif..#i
1e0a0 66 64 65 66 20 43 41 43 4b 45 59 5f 50 49 4e 5f  fdef CACKEY_PIN_
1e0b0 43 4f 4d 4d 41 4e 44 5f 58 4f 4e 4c 59 5f 44 45  COMMAND_XONLY_DE
1e0c0 46 41 55 4c 54 0a 09 69 66 20 28 67 65 74 65 6e  FAULT..if (geten
1e0d0 76 28 22 44 49 53 50 4c 41 59 22 29 20 21 3d 20  v("DISPLAY") != 
1e0e0 4e 55 4c 4c 29 20 7b 0a 09 09 63 61 63 6b 65 79  NULL) {...cackey
1e0f0 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20 3d 20 73  _pin_command = s
1e100 74 72 64 75 70 28 43 41 43 4b 45 59 5f 4d 41 43  trdup(CACKEY_MAC
1e110 52 4f 5f 44 45 46 41 55 4c 54 5f 58 53 54 52 28  RO_DEFAULT_XSTR(
1e120 43 41 43 4b 45 59 5f 50 49 4e 5f 43 4f 4d 4d 41  CACKEY_PIN_COMMA
1e130 4e 44 5f 58 4f 4e 4c 59 5f 44 45 46 41 55 4c 54  ND_XONLY_DEFAULT
1e140 29 29 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a 0a 09  ));..}.#endif...
1e150 69 66 20 28 67 65 74 65 6e 76 28 22 43 41 43 4b  if (getenv("CACK
1e160 45 59 5f 50 49 4e 5f 43 4f 4d 4d 41 4e 44 22 29  EY_PIN_COMMAND")
1e170 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 63 61   != NULL) {...ca
1e180 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64  ckey_pin_command
1e190 20 3d 20 73 74 72 64 75 70 28 67 65 74 65 6e 76   = strdup(getenv
1e1a0 28 22 43 41 43 4b 45 59 5f 50 49 4e 5f 43 4f 4d  ("CACKEY_PIN_COM
1e1b0 4d 41 4e 44 22 29 29 3b 0a 09 7d 0a 0a 09 69 66  MAND"));..}...if
1e1c0 20 28 67 65 74 65 6e 76 28 22 43 41 43 4b 45 59   (getenv("CACKEY
1e1d0 5f 50 49 4e 5f 43 4f 4d 4d 41 4e 44 5f 58 4f 4e  _PIN_COMMAND_XON
1e1e0 4c 59 22 29 20 21 3d 20 4e 55 4c 4c 20 26 26 20  LY") != NULL && 
1e1f0 67 65 74 65 6e 76 28 22 44 49 53 50 4c 41 59 22  getenv("DISPLAY"
1e200 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 63  ) != NULL) {...c
1e210 61 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e  ackey_pin_comman
1e220 64 20 3d 20 73 74 72 64 75 70 28 67 65 74 65 6e  d = strdup(geten
1e230 76 28 22 43 41 43 4b 45 59 5f 50 49 4e 5f 43 4f  v("CACKEY_PIN_CO
1e240 4d 4d 41 4e 44 5f 58 4f 4e 4c 59 22 29 29 3b 0a  MMAND_XONLY"));.
1e250 09 7d 0a 0a 23 69 66 64 65 66 20 43 41 43 4b 45  .}..#ifdef CACKE
1e260 59 5f 52 45 41 44 45 52 53 5f 49 4e 43 4c 55 44  Y_READERS_INCLUD
1e270 45 5f 4f 4e 4c 59 5f 44 45 46 41 55 4c 54 0a 09  E_ONLY_DEFAULT..
1e280 63 61 63 6b 65 79 5f 72 65 61 64 65 72 73 5f 69  cackey_readers_i
1e290 6e 63 6c 75 64 65 5f 6f 6e 6c 79 20 3d 20 73 74  nclude_only = st
1e2a0 72 64 75 70 28 43 41 43 4b 45 59 5f 4d 41 43 52  rdup(CACKEY_MACR
1e2b0 4f 5f 44 45 46 41 55 4c 54 5f 58 53 54 52 28 43  O_DEFAULT_XSTR(C
1e2c0 41 43 4b 45 59 5f 52 45 41 44 45 52 53 5f 49 4e  ACKEY_READERS_IN
1e2d0 43 4c 55 44 45 5f 4f 4e 4c 59 5f 44 45 46 41 55  CLUDE_ONLY_DEFAU
1e2e0 4c 54 29 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69  LT));.#endif..#i
1e2f0 66 64 65 66 20 43 41 43 4b 45 59 5f 52 45 41 44  fdef CACKEY_READ
1e300 45 52 53 5f 45 58 43 4c 55 44 45 5f 44 45 46 41  ERS_EXCLUDE_DEFA
1e310 55 4c 54 0a 09 63 61 63 6b 65 79 5f 72 65 61 64  ULT..cackey_read
1e320 65 72 73 5f 65 78 63 6c 75 64 65 20 3d 20 73 74  ers_exclude = st
1e330 72 64 75 70 28 43 41 43 4b 45 59 5f 4d 41 43 52  rdup(CACKEY_MACR
1e340 4f 5f 44 45 46 41 55 4c 54 5f 58 53 54 52 28 43  O_DEFAULT_XSTR(C
1e350 41 43 4b 45 59 5f 52 45 41 44 45 52 53 5f 45 58  ACKEY_READERS_EX
1e360 43 4c 55 44 45 5f 44 45 46 41 55 4c 54 29 29 3b  CLUDE_DEFAULT));
1e370 0a 23 65 6e 64 69 66 0a 0a 09 69 66 20 28 67 65  .#endif...if (ge
1e380 74 65 6e 76 28 22 43 41 43 4b 45 59 5f 52 45 41  tenv("CACKEY_REA
1e390 44 45 52 53 5f 49 4e 43 4c 55 44 45 5f 4f 4e 4c  DERS_INCLUDE_ONL
1e3a0 59 22 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  Y") != NULL) {..
1e3b0 09 63 61 63 6b 65 79 5f 72 65 61 64 65 72 73 5f  .cackey_readers_
1e3c0 69 6e 63 6c 75 64 65 5f 6f 6e 6c 79 20 3d 20 73  include_only = s
1e3d0 74 72 64 75 70 28 67 65 74 65 6e 76 28 22 43 41  trdup(getenv("CA
1e3e0 43 4b 45 59 5f 52 45 41 44 45 52 53 5f 49 4e 43  CKEY_READERS_INC
1e3f0 4c 55 44 45 5f 4f 4e 4c 59 22 29 29 3b 0a 0a 09  LUDE_ONLY"));...
1e400 09 69 66 20 28 63 61 63 6b 65 79 5f 72 65 61 64  .if (cackey_read
1e410 65 72 73 5f 69 6e 63 6c 75 64 65 5f 6f 6e 6c 79  ers_include_only
1e420 5b 30 5d 20 3d 3d 20 27 5c 30 27 29 20 7b 0a 09  [0] == '\0') {..
1e430 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f 72 65  ..free(cackey_re
1e440 61 64 65 72 73 5f 69 6e 63 6c 75 64 65 5f 6f 6e  aders_include_on
1e450 6c 79 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f  ly);.....cackey_
1e460 72 65 61 64 65 72 73 5f 69 6e 63 6c 75 64 65 5f  readers_include_
1e470 6f 6e 6c 79 20 3d 20 4e 55 4c 4c 3b 0a 09 09 7d  only = NULL;...}
1e480 0a 09 7d 0a 0a 09 69 66 20 28 67 65 74 65 6e 76  ..}...if (getenv
1e490 28 22 43 41 43 4b 45 59 5f 52 45 41 44 45 52 53  ("CACKEY_READERS
1e4a0 5f 45 58 43 4c 55 44 45 22 29 20 21 3d 20 4e 55  _EXCLUDE") != NU
1e4b0 4c 4c 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 72  LL) {...cackey_r
1e4c0 65 61 64 65 72 73 5f 65 78 63 6c 75 64 65 20 3d  eaders_exclude =
1e4d0 20 73 74 72 64 75 70 28 67 65 74 65 6e 76 28 22   strdup(getenv("
1e4e0 43 41 43 4b 45 59 5f 52 45 41 44 45 52 53 5f 45  CACKEY_READERS_E
1e4f0 58 43 4c 55 44 45 22 29 29 3b 0a 0a 09 09 69 66  XCLUDE"));....if
1e500 20 28 63 61 63 6b 65 79 5f 72 65 61 64 65 72 73   (cackey_readers
1e510 5f 65 78 63 6c 75 64 65 5b 30 5d 20 3d 3d 20 27  _exclude[0] == '
1e520 5c 30 27 29 20 7b 0a 09 09 09 66 72 65 65 28 63  \0') {....free(c
1e530 61 63 6b 65 79 5f 72 65 61 64 65 72 73 5f 65 78  ackey_readers_ex
1e540 63 6c 75 64 65 29 3b 0a 0a 09 09 09 63 61 63 6b  clude);.....cack
1e550 65 79 5f 72 65 61 64 65 72 73 5f 65 78 63 6c 75  ey_readers_exclu
1e560 64 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 7d 0a 09  de = NULL;...}..
1e570 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
1e580 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
1e590 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c  ng CKR_OK (%i)",
1e5a0 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75   CKR_OK);...retu
1e5b0 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43  rn(CKR_OK);.}..C
1e5c0 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
1e5d0 4e 28 43 4b 5f 52 56 2c 20 43 5f 46 69 6e 61 6c  N(CK_RV, C_Final
1e5e0 69 7a 65 29 28 43 4b 5f 56 4f 49 44 5f 50 54 52  ize)(CK_VOID_PTR
1e5f0 20 70 52 65 73 65 72 76 65 64 29 20 7b 0a 09 75   pReserved) {..u
1e600 69 6e 74 33 32 5f 74 20 69 64 78 3b 0a 0a 09 43  int32_t idx;...C
1e610 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1e620 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
1e630 09 69 66 20 28 70 52 65 73 65 72 76 65 64 20 21  .if (pReserved !
1e640 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
1e650 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1e660 22 45 72 72 6f 72 2e 20 70 52 65 73 65 72 76 65  "Error. pReserve
1e670 64 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 22 29  d is not NULL.")
1e680 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
1e690 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a  ARGUMENTS_BAD);.
1e6a0 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  .}...if (!cackey
1e6b0 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
1e6c0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1e6d0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
1e6e0 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
1e6f0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1e700 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
1e710 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
1e720 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69  .for (idx = 0; i
1e730 64 78 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63  dx < (sizeof(cac
1e740 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20  key_sessions) / 
1e750 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
1e760 73 73 69 6f 6e 73 5b 30 5d 29 29 3b 20 69 64 78  ssions[0])); idx
1e770 2b 2b 29 20 7b 0a 09 09 69 66 20 28 63 61 63 6b  ++) {...if (cack
1e780 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d  ey_sessions[idx]
1e790 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 09 43 5f  .active) {....C_
1e7a0 43 6c 6f 73 65 53 65 73 73 69 6f 6e 28 69 64 78  CloseSession(idx
1e7b0 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 63 61 63 6b  );...}..}...cack
1e7c0 65 79 5f 73 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e  ey_slots_disconn
1e7d0 65 63 74 5f 61 6c 6c 28 29 3b 0a 0a 09 66 6f 72  ect_all();...for
1e7e0 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c   (idx = 0; idx <
1e7f0 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
1e800 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28  slots) / sizeof(
1e810 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29  cackey_slots[0])
1e820 29 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66  ); idx++) {...if
1e830 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69   (cackey_slots[i
1e840 64 78 5d 2e 69 6e 74 65 72 6e 61 6c 29 20 7b 0a  dx].internal) {.
1e850 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 7d  ...continue;...}
1e860 0a 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73  ....if (cackey_s
1e870 6c 6f 74 73 5b 69 64 78 5d 2e 70 63 73 63 5f 72  lots[idx].pcsc_r
1e880 65 61 64 65 72 29 20 7b 0a 09 09 09 66 72 65 65  eader) {....free
1e890 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64  (cackey_slots[id
1e8a0 78 5d 2e 70 63 73 63 5f 72 65 61 64 65 72 29 3b  x].pcsc_reader);
1e8b0 0a 09 09 7d 0a 0a 09 09 69 66 20 28 63 61 63 6b  ...}....if (cack
1e8c0 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 63 61  ey_slots[idx].ca
1e8d0 63 68 65 64 5f 63 65 72 74 73 29 20 7b 0a 09 09  ched_certs) {...
1e8e0 09 63 61 63 6b 65 79 5f 66 72 65 65 5f 63 65 72  .cackey_free_cer
1e8f0 74 73 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ts(cackey_slots[
1e900 69 64 78 5d 2e 63 61 63 68 65 64 5f 63 65 72 74  idx].cached_cert
1e910 73 2c 20 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  s, cackey_slots[
1e920 69 64 78 5d 2e 63 61 63 68 65 64 5f 63 65 72 74  idx].cached_cert
1e930 73 5f 63 6f 75 6e 74 2c 20 31 29 3b 0a 0a 09 09  s_count, 1);....
1e940 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64  .cackey_slots[id
1e950 78 5d 2e 63 61 63 68 65 64 5f 63 65 72 74 73 20  x].cached_certs 
1e960 3d 20 4e 55 4c 4c 3b 0a 09 09 7d 0a 09 7d 0a 0a  = NULL;...}..}..
1e970 09 63 61 63 6b 65 79 5f 70 63 73 63 5f 64 69 73  .cackey_pcsc_dis
1e980 63 6f 6e 6e 65 63 74 28 29 3b 0a 0a 09 69 66 20  connect();...if 
1e990 28 63 61 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d  (cackey_pin_comm
1e9a0 61 6e 64 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  and != NULL) {..
1e9b0 09 66 72 65 65 28 63 61 63 6b 65 79 5f 70 69 6e  .free(cackey_pin
1e9c0 5f 63 6f 6d 6d 61 6e 64 29 3b 0a 0a 09 09 63 61  _command);....ca
1e9d0 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64  ckey_pin_command
1e9e0 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 0a 09 69 66   = NULL;..}...if
1e9f0 20 28 63 61 63 6b 65 79 5f 72 65 61 64 65 72 73   (cackey_readers
1ea00 5f 69 6e 63 6c 75 64 65 5f 6f 6e 6c 79 20 21 3d  _include_only !=
1ea10 20 4e 55 4c 4c 29 20 7b 0a 09 09 66 72 65 65 28   NULL) {...free(
1ea20 63 61 63 6b 65 79 5f 72 65 61 64 65 72 73 5f 69  cackey_readers_i
1ea30 6e 63 6c 75 64 65 5f 6f 6e 6c 79 29 3b 0a 0a 09  nclude_only);...
1ea40 09 63 61 63 6b 65 79 5f 72 65 61 64 65 72 73 5f  .cackey_readers_
1ea50 69 6e 63 6c 75 64 65 5f 6f 6e 6c 79 20 3d 20 4e  include_only = N
1ea60 55 4c 4c 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61  ULL;..}...if (ca
1ea70 63 6b 65 79 5f 72 65 61 64 65 72 73 5f 65 78 63  ckey_readers_exc
1ea80 6c 75 64 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  lude != NULL) {.
1ea90 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f 72 65  ..free(cackey_re
1eaa0 61 64 65 72 73 5f 65 78 63 6c 75 64 65 29 3b 0a  aders_exclude);.
1eab0 0a 09 09 63 61 63 6b 65 79 5f 72 65 61 64 65 72  ...cackey_reader
1eac0 73 5f 65 78 63 6c 75 64 65 20 3d 20 4e 55 4c 4c  s_exclude = NULL
1ead0 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 69 6e  ;..}...cackey_in
1eae0 69 74 69 61 6c 69 7a 65 64 20 3d 20 30 3b 0a 0a  itialized = 0;..
1eaf0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1eb00 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
1eb10 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b  CKR_OK (%i)", CK
1eb20 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28  R_OK);...return(
1eb30 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44  CKR_OK);.}..CK_D
1eb40 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
1eb50 4b 5f 52 56 2c 20 43 5f 47 65 74 49 6e 66 6f 29  K_RV, C_GetInfo)
1eb60 28 43 4b 5f 49 4e 46 4f 5f 50 54 52 20 70 49 6e  (CK_INFO_PTR pIn
1eb70 66 6f 29 20 7b 0a 09 73 74 61 74 69 63 20 43 4b  fo) {..static CK
1eb80 5f 55 54 46 38 43 48 41 52 20 6d 61 6e 75 66 61  _UTF8CHAR manufa
1eb90 63 74 75 72 65 72 49 44 5b 5d 20 3d 20 22 55 2e  cturerID[] = "U.
1eba0 53 2e 20 47 6f 76 65 72 6e 6d 65 6e 74 22 3b 0a  S. Government";.
1ebb0 09 73 74 61 74 69 63 20 43 4b 5f 55 54 46 38 43  .static CK_UTF8C
1ebc0 48 41 52 20 6c 69 62 72 61 72 79 44 65 73 63 72  HAR libraryDescr
1ebd0 69 70 74 69 6f 6e 5b 5d 20 3d 20 22 43 41 43 4b  iption[] = "CACK
1ebe0 65 79 22 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ey";...CACKEY_DE
1ebf0 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
1ec00 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70 49 6e  ed.");...if (pIn
1ec10 66 6f 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  fo == NULL) {...
1ec20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1ec30 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 49 6e 66  NTF("Error. pInf
1ec40 6f 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09  o is NULL.");...
1ec50 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55  .return(CKR_ARGU
1ec60 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a  MENTS_BAD);..}..
1ec70 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
1ec80 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
1ec90 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1eca0 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
1ecb0 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
1ecc0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
1ecd0 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
1ece0 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 70 49 6e  LIZED);..}...pIn
1ecf0 66 6f 2d 3e 63 72 79 70 74 6f 6b 69 56 65 72 73  fo->cryptokiVers
1ed00 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 28 28 43 41  ion.major = ((CA
1ed10 43 4b 45 59 5f 43 52 59 50 54 4f 4b 49 5f 56 45  CKEY_CRYPTOKI_VE
1ed20 52 53 49 4f 4e 5f 43 4f 44 45 29 20 3e 3e 20 31  RSION_CODE) >> 1
1ed30 36 29 20 26 20 30 78 66 66 3b 0a 09 70 49 6e 66  6) & 0xff;..pInf
1ed40 6f 2d 3e 63 72 79 70 74 6f 6b 69 56 65 72 73 69  o->cryptokiVersi
1ed50 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 28 28 43 41 43  on.minor = ((CAC
1ed60 4b 45 59 5f 43 52 59 50 54 4f 4b 49 5f 56 45 52  KEY_CRYPTOKI_VER
1ed70 53 49 4f 4e 5f 43 4f 44 45 29 20 3e 3e 20 38 29  SION_CODE) >> 8)
1ed80 20 26 20 30 78 66 66 3b 0a 0a 09 6d 65 6d 73 65   & 0xff;...memse
1ed90 74 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63  t(pInfo->manufac
1eda0 74 75 72 65 72 49 44 2c 20 27 20 27 2c 20 73 69  turerID, ' ', si
1edb0 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75  zeof(pInfo->manu
1edc0 66 61 63 74 75 72 65 72 49 44 29 29 3b 0a 09 6d  facturerID));..m
1edd0 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 6d 61 6e  emcpy(pInfo->man
1ede0 75 66 61 63 74 75 72 65 72 49 44 2c 20 6d 61 6e  ufacturerID, man
1edf0 75 66 61 63 74 75 72 65 72 49 44 2c 20 73 69 7a  ufacturerID, siz
1ee00 65 6f 66 28 6d 61 6e 75 66 61 63 74 75 72 65 72  eof(manufacturer
1ee10 49 44 29 20 2d 20 31 29 3b 0a 0a 09 70 49 6e 66  ID) - 1);...pInf
1ee20 6f 2d 3e 66 6c 61 67 73 20 3d 20 30 78 30 30 3b  o->flags = 0x00;
1ee30 0a 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d  ...memset(pInfo-
1ee40 3e 6c 69 62 72 61 72 79 44 65 73 63 72 69 70 74  >libraryDescript
1ee50 69 6f 6e 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66  ion, ' ', sizeof
1ee60 28 70 49 6e 66 6f 2d 3e 6c 69 62 72 61 72 79 44  (pInfo->libraryD
1ee70 65 73 63 72 69 70 74 69 6f 6e 29 29 3b 0a 09 6d  escription));..m
1ee80 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 6c 69 62  emcpy(pInfo->lib
1ee90 72 61 72 79 44 65 73 63 72 69 70 74 69 6f 6e 2c  raryDescription,
1eea0 20 6c 69 62 72 61 72 79 44 65 73 63 72 69 70 74   libraryDescript
1eeb0 69 6f 6e 2c 20 73 69 7a 65 6f 66 28 6c 69 62 72  ion, sizeof(libr
1eec0 61 72 79 44 65 73 63 72 69 70 74 69 6f 6e 29 20  aryDescription) 
1eed0 2d 20 31 29 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 6c  - 1);...pInfo->l
1eee0 69 62 72 61 72 79 56 65 72 73 69 6f 6e 2e 6d 61  ibraryVersion.ma
1eef0 6a 6f 72 20 3d 20 28 63 61 63 6b 65 79 5f 67 65  jor = (cackey_ge
1ef00 74 76 65 72 73 69 6f 6e 28 29 20 3e 3e 20 31 36  tversion() >> 16
1ef10 29 20 26 20 30 78 66 66 3b 0a 09 70 49 6e 66 6f  ) & 0xff;..pInfo
1ef20 2d 3e 6c 69 62 72 61 72 79 56 65 72 73 69 6f 6e  ->libraryVersion
1ef30 2e 6d 69 6e 6f 72 20 3d 20 28 63 61 63 6b 65 79  .minor = (cackey
1ef40 5f 67 65 74 76 65 72 73 69 6f 6e 28 29 20 3e 3e  _getversion() >>
1ef50 20 38 29 20 26 20 30 78 66 66 3b 0a 0a 09 43 41   8) & 0xff;...CA
1ef60 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1ef70 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
1ef80 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f  _OK (%i)", CKR_O
1ef90 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  K);...return(CKR
1efa0 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 50  _OK);.}../*. * P
1efb0 72 6f 63 65 73 73 20 6c 69 73 74 20 6f 66 20 72  rocess list of r
1efc0 65 61 64 65 72 73 2c 20 61 6e 64 20 63 72 65 61  eaders, and crea
1efd0 74 65 20 6d 61 70 70 69 6e 67 20 62 65 74 77 65  te mapping betwe
1efe0 65 6e 20 72 65 61 64 65 72 20 6e 61 6d 65 20 61  en reader name a
1eff0 6e 64 20 73 6c 6f 74 20 49 44 0a 20 2a 2f 0a 43  nd slot ID. */.C
1f000 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
1f010 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 53 6c  N(CK_RV, C_GetSl
1f020 6f 74 4c 69 73 74 29 28 43 4b 5f 42 42 4f 4f 4c  otList)(CK_BBOOL
1f030 20 74 6f 6b 65 6e 50 72 65 73 65 6e 74 2c 20 43   tokenPresent, C
1f040 4b 5f 53 4c 4f 54 5f 49 44 5f 50 54 52 20 70 53  K_SLOT_ID_PTR pS
1f050 6c 6f 74 4c 69 73 74 2c 20 43 4b 5f 55 4c 4f 4e  lotList, CK_ULON
1f060 47 5f 50 54 52 20 70 75 6c 43 6f 75 6e 74 29 20  G_PTR pulCount) 
1f070 7b 0a 09 73 74 61 74 69 63 20 69 6e 74 20 66 69  {..static int fi
1f080 72 73 74 5f 63 61 6c 6c 20 3d 20 31 3b 0a 09 69  rst_call = 1;..i
1f090 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b  nt mutex_retval;
1f0a0 0a 09 69 6e 74 20 70 63 73 63 5f 63 6f 6e 6e 65  ..int pcsc_conne
1f0b0 63 74 5f 72 65 74 3b 0a 09 43 4b 5f 55 4c 4f 4e  ct_ret;..CK_ULON
1f0c0 47 20 63 6f 75 6e 74 2c 20 73 6c 6f 74 5f 63 6f  G count, slot_co
1f0d0 75 6e 74 20 3d 20 30 2c 20 63 75 72 72 73 6c 6f  unt = 0, currslo
1f0e0 74 2c 20 73 6c 6f 74 5f 69 64 78 3b 0a 09 63 68  t, slot_idx;..ch
1f0f0 61 72 20 2a 70 63 73 63 5f 72 65 61 64 65 72 73  ar *pcsc_readers
1f100 2c 20 2a 70 63 73 63 5f 72 65 61 64 65 72 73 5f  , *pcsc_readers_
1f110 73 2c 20 2a 70 63 73 63 5f 72 65 61 64 65 72 73  s, *pcsc_readers
1f120 5f 65 3b 0a 09 63 68 61 72 20 2a 72 65 61 64 65  _e;..char *reade
1f130 72 5f 63 68 65 63 6b 5f 70 61 74 74 65 72 6e 3b  r_check_pattern;
1f140 0a 09 44 57 4f 52 44 20 70 63 73 63 5f 72 65 61  ..DWORD pcsc_rea
1f150 64 65 72 73 5f 6c 65 6e 3b 0a 09 4c 4f 4e 47 20  ders_len;..LONG 
1f160 73 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72  scard_listreader
1f170 73 5f 72 65 74 3b 0a 09 73 69 7a 65 5f 74 20 63  s_ret;..size_t c
1f180 75 72 72 5f 72 65 61 64 65 72 5f 6c 65 6e 3b 0a  urr_reader_len;.
1f190 09 69 6e 74 20 73 6c 6f 74 5f 72 65 73 65 74 3b  .int slot_reset;
1f1a0 0a 09 69 6e 74 20 69 6e 63 6c 75 64 65 5f 72 65  ..int include_re
1f1b0 61 64 65 72 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  ader;...CACKEY_D
1f1c0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
1f1d0 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70 75  led.");...if (pu
1f1e0 6c 43 6f 75 6e 74 20 3d 3d 20 4e 55 4c 4c 29 20  lCount == NULL) 
1f1f0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1f200 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1f210 70 75 6c 43 6f 75 6e 74 20 69 73 20 4e 55 4c 4c  pulCount is NULL
1f220 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
1f230 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44  KR_ARGUMENTS_BAD
1f240 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63  );..}...if (!cac
1f250 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
1f260 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1f270 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1f280 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
1f290 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
1f2a0 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
1f2b0 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
1f2c0 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  }...mutex_retval
1f2d0 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
1f2e0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
1f2f0 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
1f300 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
1f310 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1f320 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c  RINTF("Error.  L
1f330 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
1f340 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
1f350 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
1f360 09 7d 0a 0a 09 2f 2a 20 43 6c 65 61 72 20 6c 69  .}.../* Clear li
1f370 73 74 20 6f 66 20 73 6c 6f 74 73 20 2a 2f 0a 09  st of slots */..
1f380 73 6c 6f 74 5f 72 65 73 65 74 20 3d 20 30 3b 0a  slot_reset = 0;.
1f390 09 69 66 20 28 70 53 6c 6f 74 4c 69 73 74 29 20  .if (pSlotList) 
1f3a0 7b 0a 09 09 69 66 20 28 66 69 72 73 74 5f 63 61  {...if (first_ca
1f3b0 6c 6c 29 20 7b 0a 09 09 09 66 69 72 73 74 5f 63  ll) {....first_c
1f3c0 61 6c 6c 20 3d 20 30 3b 0a 0a 09 09 09 73 6c 6f  all = 0;.....slo
1f3d0 74 5f 72 65 73 65 74 20 3d 20 31 3b 0a 09 09 7d  t_reset = 1;...}
1f3e0 0a 0a 09 09 2f 2a 20 49 66 20 61 6e 79 20 6f 66  ..../* If any of
1f3f0 20 74 68 65 20 73 6c 6f 74 73 20 68 61 76 65 20   the slots have 
1f400 62 65 65 6e 20 72 65 73 65 74 20 74 68 65 6e 20  been reset then 
1f410 70 75 72 67 65 20 61 6c 6c 20 69 6e 66 6f 72 6d  purge all inform
1f420 61 74 69 6f 6e 20 61 6e 64 20 63 68 65 63 6b 20  ation and check 
1f430 61 67 61 69 6e 20 2a 2f 0a 09 09 66 6f 72 20 28  again */...for (
1f440 63 75 72 72 73 6c 6f 74 20 3d 20 30 3b 20 63 75  currslot = 0; cu
1f450 72 72 73 6c 6f 74 20 3c 20 28 73 69 7a 65 6f 66  rrslot < (sizeof
1f460 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f  (cackey_slots) /
1f470 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73   sizeof(cackey_s
1f480 6c 6f 74 73 5b 30 5d 29 29 3b 20 63 75 72 72 73  lots[0])); currs
1f490 6c 6f 74 2b 2b 29 20 7b 0a 09 09 09 69 66 20 28  lot++) {....if (
1f4a0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72  cackey_slots[cur
1f4b0 72 73 6c 6f 74 5d 2e 69 6e 74 65 72 6e 61 6c 29  rslot].internal)
1f4c0 20 7b 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b   {.....continue;
1f4d0 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 21 63  ....}.....if (!c
1f4e0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72  ackey_slots[curr
1f4f0 73 6c 6f 74 5d 2e 61 63 74 69 76 65 29 20 7b 0a  slot].active) {.
1f500 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09  ....continue;...
1f510 09 7d 0a 0a 09 09 09 69 66 20 28 63 61 63 6b 65  .}.....if (cacke
1f520 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74  y_slots[currslot
1f530 5d 2e 73 6c 6f 74 5f 72 65 73 65 74 29 20 7b 0a  ].slot_reset) {.
1f540 09 09 09 09 73 6c 6f 74 5f 72 65 73 65 74 20 3d  ....slot_reset =
1f550 20 31 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a   1;......break;.
1f560 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 69 66 20 28  ...}...}....if (
1f570 73 6c 6f 74 5f 72 65 73 65 74 29 20 7b 0a 09 09  slot_reset) {...
1f580 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1f590 49 4e 54 46 28 22 50 75 72 67 69 6e 67 20 61 6c  INTF("Purging al
1f5a0 6c 20 73 6c 6f 74 20 69 6e 66 6f 72 6d 61 74 69  l slot informati
1f5b0 6f 6e 2e 22 29 3b 0a 0a 09 09 09 2f 2a 20 4f 6e  on.");...../* On
1f5c0 6c 79 20 75 70 64 61 74 65 20 74 68 65 20 6c 69  ly update the li
1f5d0 73 74 20 6f 66 20 73 6c 6f 74 73 20 69 66 20 77  st of slots if w
1f5e0 65 20 61 72 65 20 61 63 74 75 61 6c 6c 79 20 62  e are actually b
1f5f0 65 69 6e 67 20 73 75 70 70 6c 79 20 74 68 65 20  eing supply the 
1f600 73 6c 6f 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  slot information
1f610 20 2a 2f 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c   */....cackey_sl
1f620 6f 74 73 5f 64 69 73 63 6f 6e 6e 65 63 74 5f 61  ots_disconnect_a
1f630 6c 6c 28 29 3b 0a 0a 09 09 09 66 6f 72 20 28 63  ll();.....for (c
1f640 75 72 72 73 6c 6f 74 20 3d 20 30 3b 20 63 75 72  urrslot = 0; cur
1f650 72 73 6c 6f 74 20 3c 20 28 73 69 7a 65 6f 66 28  rslot < (sizeof(
1f660 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20  cackey_slots) / 
1f670 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
1f680 6f 74 73 5b 30 5d 29 29 3b 20 63 75 72 72 73 6c  ots[0])); currsl
1f690 6f 74 2b 2b 29 20 7b 0a 09 09 09 09 69 66 20 28  ot++) {.....if (
1f6a0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72  cackey_slots[cur
1f6b0 72 73 6c 6f 74 5d 2e 69 6e 74 65 72 6e 61 6c 29  rslot].internal)
1f6c0 20 7b 0a 09 09 09 09 09 63 6f 6e 74 69 6e 75 65   {......continue
1f6d0 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69 66 20  ;.....}......if 
1f6e0 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75  (cackey_slots[cu
1f6f0 72 72 73 6c 6f 74 5d 2e 70 63 73 63 5f 72 65 61  rrslot].pcsc_rea
1f700 64 65 72 29 20 7b 0a 09 09 09 09 09 66 72 65 65  der) {......free
1f710 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75  (cackey_slots[cu
1f720 72 72 73 6c 6f 74 5d 2e 70 63 73 63 5f 72 65 61  rrslot].pcsc_rea
1f730 64 65 72 29 3b 0a 0a 09 09 09 09 09 63 61 63 6b  der);.......cack
1f740 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f  ey_slots[currslo
1f750 74 5d 2e 70 63 73 63 5f 72 65 61 64 65 72 20 3d  t].pcsc_reader =
1f760 20 4e 55 4c 4c 3b 0a 09 09 09 09 7d 0a 0a 09 09   NULL;.....}....
1f770 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f  ..if (cackey_slo
1f780 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 6c 61 62  ts[currslot].lab
1f790 65 6c 29 20 7b 0a 09 09 09 09 09 66 72 65 65 28  el) {......free(
1f7a0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72  cackey_slots[cur
1f7b0 72 73 6c 6f 74 5d 2e 6c 61 62 65 6c 29 3b 0a 0a  rslot].label);..
1f7c0 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  .....cackey_slot
1f7d0 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 6c 61 62 65  s[currslot].labe
1f7e0 6c 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 7d 0a  l = NULL;.....}.
1f7f0 0a 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  .....cackey_slot
1f800 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 61 63 74 69  s[currslot].acti
1f810 76 65 20 3d 20 30 3b 0a 09 09 09 7d 0a 09 09 7d  ve = 0;....}...}
1f820 20 65 6c 73 65 20 7b 0a 09 09 09 0a 09 09 7d 0a   else {.......}.
1f830 09 7d 0a 0a 09 2f 2a 20 44 65 74 65 72 6d 69 6e  .}.../* Determin
1f840 65 20 6c 69 73 74 20 6f 66 20 72 65 61 64 65 72  e list of reader
1f850 73 20 2a 2f 0a 09 70 63 73 63 5f 63 6f 6e 6e 65  s */..pcsc_conne
1f860 63 74 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f  ct_ret = cackey_
1f870 70 63 73 63 5f 63 6f 6e 6e 65 63 74 28 29 3b 0a  pcsc_connect();.
1f880 2f 2a 20 58 58 58 3a 20 43 41 4e 20 48 41 4e 47  /* XXX: CAN HANG
1f890 20 48 45 52 45 20 21 20 2a 2f 0a 09 69 66 20 28   HERE ! */..if (
1f8a0 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74  pcsc_connect_ret
1f8b0 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f   != CACKEY_PCSC_
1f8c0 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59  S_OK) {...CACKEY
1f8d0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
1f8e0 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 50 43 2f  onnection to PC/
1f8f0 53 43 20 66 61 69 6c 65 64 2c 20 61 73 73 75 6d  SC failed, assum
1f900 69 6e 67 20 6e 6f 20 73 6c 6f 74 73 22 29 3b 0a  ing no slots");.
1f910 0a 09 09 73 6c 6f 74 5f 63 6f 75 6e 74 20 3d 20  ...slot_count = 
1f920 30 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 70  0;..} else {...p
1f930 63 73 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e 20  csc_readers_len 
1f940 3d 20 30 3b 0a 0a 09 09 73 63 61 72 64 5f 6c 69  = 0;....scard_li
1f950 73 74 72 65 61 64 65 72 73 5f 72 65 74 20 3d 20  streaders_ret = 
1f960 53 43 61 72 64 4c 69 73 74 52 65 61 64 65 72 73  SCardListReaders
1f970 28 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61  (*cackey_pcsc_ha
1f980 6e 64 6c 65 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c  ndle, NULL, NULL
1f990 2c 20 26 70 63 73 63 5f 72 65 61 64 65 72 73 5f  , &pcsc_readers_
1f9a0 6c 65 6e 29 3b 0a 0a 09 09 69 66 20 28 73 63 61  len);....if (sca
1f9b0 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72  rd_listreaders_r
1f9c0 65 74 20 3d 3d 20 53 43 41 52 44 5f 46 5f 43 4f  et == SCARD_F_CO
1f9d0 4d 4d 5f 45 52 52 4f 52 29 20 7b 0a 09 09 09 43  MM_ERROR) {....C
1f9e0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1f9f0 54 46 28 22 45 72 72 6f 72 2e 20 53 43 61 72 64  TF("Error. SCard
1fa00 4c 69 73 74 52 65 61 64 65 72 73 28 29 20 72 65  ListReaders() re
1fa10 74 75 72 6e 65 64 20 53 43 41 52 44 5f 46 5f 43  turned SCARD_F_C
1fa20 4f 4d 4d 5f 45 52 52 4f 52 2c 20 61 73 73 75 6d  OMM_ERROR, assum
1fa30 69 6e 67 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 74  ing Connection t
1fa40 6f 20 50 43 2f 53 43 20 77 65 6e 74 20 61 77 61  o PC/SC went awa
1fa50 79 2e 20 52 65 63 6f 6e 6e 65 63 74 69 6e 67 2e  y. Reconnecting.
1fa60 22 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 70  ");.....cackey_p
1fa70 63 73 63 5f 64 69 73 63 6f 6e 6e 65 63 74 28 29  csc_disconnect()
1fa80 3b 0a 09 09 09 63 61 63 6b 65 79 5f 70 63 73 63  ;....cackey_pcsc
1fa90 5f 63 6f 6e 6e 65 63 74 28 29 3b 0a 0a 09 09 09  _connect();.....
1faa0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1fab0 4e 54 46 28 22 54 72 79 69 6e 67 20 53 43 61 72  NTF("Trying SCar
1fac0 64 4c 69 73 74 52 65 61 64 65 72 73 28 29 20 61  dListReaders() a
1fad0 67 61 69 6e 22 29 3b 0a 09 09 09 73 63 61 72 64  gain");....scard
1fae0 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65 74  _listreaders_ret
1faf0 20 3d 20 53 43 61 72 64 4c 69 73 74 52 65 61 64   = SCardListRead
1fb00 65 72 73 28 2a 63 61 63 6b 65 79 5f 70 63 73 63  ers(*cackey_pcsc
1fb10 5f 68 61 6e 64 6c 65 2c 20 4e 55 4c 4c 2c 20 4e  _handle, NULL, N
1fb20 55 4c 4c 2c 20 26 70 63 73 63 5f 72 65 61 64 65  ULL, &pcsc_reade
1fb30 72 73 5f 6c 65 6e 29 3b 0a 09 09 7d 0a 0a 09 09  rs_len);...}....
1fb40 69 66 20 28 73 63 61 72 64 5f 6c 69 73 74 72 65  if (scard_listre
1fb50 61 64 65 72 73 5f 72 65 74 20 3d 3d 20 53 43 41  aders_ret == SCA
1fb60 52 44 5f 53 5f 53 55 43 43 45 53 53 20 26 26 20  RD_S_SUCCESS && 
1fb70 70 63 73 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e  pcsc_readers_len
1fb80 20 21 3d 20 30 29 20 7b 0a 09 09 09 70 63 73 63   != 0) {....pcsc
1fb90 5f 72 65 61 64 65 72 73 20 3d 20 6d 61 6c 6c 6f  _readers = mallo
1fba0 63 28 70 63 73 63 5f 72 65 61 64 65 72 73 5f 6c  c(pcsc_readers_l
1fbb0 65 6e 29 3b 0a 09 09 09 70 63 73 63 5f 72 65 61  en);....pcsc_rea
1fbc0 64 65 72 73 5f 73 20 3d 20 70 63 73 63 5f 72 65  ders_s = pcsc_re
1fbd0 61 64 65 72 73 3b 0a 0a 09 09 09 73 63 61 72 64  aders;.....scard
1fbe0 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65 74  _listreaders_ret
1fbf0 20 3d 20 53 43 61 72 64 4c 69 73 74 52 65 61 64   = SCardListRead
1fc00 65 72 73 28 2a 63 61 63 6b 65 79 5f 70 63 73 63  ers(*cackey_pcsc
1fc10 5f 68 61 6e 64 6c 65 2c 20 4e 55 4c 4c 2c 20 70  _handle, NULL, p
1fc20 63 73 63 5f 72 65 61 64 65 72 73 2c 20 26 70 63  csc_readers, &pc
1fc30 73 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e 29 3b  sc_readers_len);
1fc40 0a 09 09 09 69 66 20 28 73 63 61 72 64 5f 6c 69  ....if (scard_li
1fc50 73 74 72 65 61 64 65 72 73 5f 72 65 74 20 3d 3d  streaders_ret ==
1fc60 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53   SCARD_S_SUCCESS
1fc70 29 20 7b 0a 09 09 09 09 70 63 73 63 5f 72 65 61  ) {.....pcsc_rea
1fc80 64 65 72 73 5f 65 20 3d 20 70 63 73 63 5f 72 65  ders_e = pcsc_re
1fc90 61 64 65 72 73 20 2b 20 70 63 73 63 5f 72 65 61  aders + pcsc_rea
1fca0 64 65 72 73 5f 6c 65 6e 3b 0a 0a 09 09 09 09 2f  ders_len;....../
1fcb0 2a 20 53 74 61 72 74 20 77 69 74 68 20 53 6c 6f  * Start with Slo
1fcc0 74 20 49 44 20 31 2c 20 74 6f 20 61 76 6f 69 64  t ID 1, to avoid
1fcd0 20 61 20 62 75 67 20 69 6e 20 47 44 4d 20 6f 6e   a bug in GDM on
1fce0 20 52 48 45 4c 20 2a 2f 0a 09 09 09 09 2f 2a 20   RHEL */...../* 
1fcf0 42 75 67 20 35 39 34 39 31 31 3a 20 68 74 74 70  Bug 594911: http
1fd00 73 3a 2f 2f 62 75 67 7a 69 6c 6c 61 2e 72 65 64  s://bugzilla.red
1fd10 68 61 74 2e 63 6f 6d 2f 73 68 6f 77 5f 62 75 67  hat.com/show_bug
1fd20 2e 63 67 69 3f 69 64 3d 35 39 34 39 31 31 20 2a  .cgi?id=594911 *
1fd30 2f 0a 09 09 09 09 63 75 72 72 73 6c 6f 74 20 3d  /.....currslot =
1fd40 20 31 3b 0a 09 09 09 09 73 6c 6f 74 5f 63 6f 75   1;.....slot_cou
1fd50 6e 74 20 3d 20 30 3b 0a 09 09 09 09 77 68 69 6c  nt = 0;.....whil
1fd60 65 20 28 70 63 73 63 5f 72 65 61 64 65 72 73 20  e (pcsc_readers 
1fd70 3c 20 70 63 73 63 5f 72 65 61 64 65 72 73 5f 65  < pcsc_readers_e
1fd80 29 20 7b 0a 09 09 09 09 09 2f 2a 20 46 69 6e 64  ) {....../* Find
1fd90 20 6e 65 78 74 20 61 76 61 69 6c 61 62 6c 65 20   next available 
1fda0 73 6c 6f 74 20 2a 2f 0a 09 09 09 09 09 66 6f 72  slot */......for
1fdb0 20 28 3b 20 63 75 72 72 73 6c 6f 74 20 3c 20 28   (; currslot < (
1fdc0 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
1fdd0 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ots) / sizeof(ca
1fde0 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b  ckey_slots[0]));
1fdf0 20 63 75 72 72 73 6c 6f 74 2b 2b 29 20 7b 0a 09   currslot++) {..
1fe00 09 09 09 09 09 69 66 20 28 21 63 61 63 6b 65 79  .....if (!cackey
1fe10 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d  _slots[currslot]
1fe20 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 09 09 09  .active) {......
1fe30 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 09 7d  ..break;.......}
1fe40 0a 09 09 09 09 09 7d 0a 0a 09 09 09 09 09 63 75  ......}.......cu
1fe50 72 72 5f 72 65 61 64 65 72 5f 6c 65 6e 20 3d 20  rr_reader_len = 
1fe60 73 74 72 6c 65 6e 28 70 63 73 63 5f 72 65 61 64  strlen(pcsc_read
1fe70 65 72 73 29 3b 0a 0a 09 09 09 09 09 69 66 20 28  ers);.......if (
1fe80 28 70 63 73 63 5f 72 65 61 64 65 72 73 20 2b 20  (pcsc_readers + 
1fe90 63 75 72 72 5f 72 65 61 64 65 72 5f 6c 65 6e 29  curr_reader_len)
1fea0 20 3e 20 70 63 73 63 5f 72 65 61 64 65 72 73 5f   > pcsc_readers_
1feb0 65 29 20 7b 0a 09 09 09 09 09 09 62 72 65 61 6b  e) {.......break
1fec0 3b 0a 09 09 09 09 09 7d 0a 0a 09 09 09 09 09 69  ;......}.......i
1fed0 66 20 28 63 75 72 72 5f 72 65 61 64 65 72 5f 6c  f (curr_reader_l
1fee0 65 6e 20 3d 3d 20 30 29 20 7b 0a 09 09 09 09 09  en == 0) {......
1fef0 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 7d 0a 0a  .break;......}..
1ff00 09 09 09 09 09 69 66 20 28 63 75 72 72 73 6c 6f  .....if (currslo
1ff10 74 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63  t >= (sizeof(cac
1ff20 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a  key_slots) / siz
1ff30 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
1ff40 5b 30 5d 29 29 29 20 7b 0a 09 09 09 09 09 09 43  [0]))) {.......C
1ff50 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1ff60 54 46 28 22 46 6f 75 6e 64 20 6d 6f 72 65 20 72  TF("Found more r
1ff70 65 61 64 65 72 73 20 74 68 61 6e 20 73 6c 6f 74  eaders than slot
1ff80 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 21  s are available!
1ff90 22 29 3b 0a 0a 09 09 09 09 09 09 62 72 65 61 6b  ");........break
1ffa0 3b 0a 09 09 09 09 09 7d 0a 0a 09 09 09 09 09 43  ;......}.......C
1ffb0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1ffc0 54 46 28 22 46 6f 75 6e 64 20 72 65 61 64 65 72  TF("Found reader
1ffd0 3a 20 25 73 20 28 63 75 72 72 73 6c 6f 74 20 3d  : %s (currslot =
1ffe0 20 25 6c 75 29 22 2c 20 70 63 73 63 5f 72 65 61   %lu)", pcsc_rea
1fff0 64 65 72 73 2c 20 28 75 6e 73 69 67 6e 65 64 20  ders, (unsigned 
20000 6c 6f 6e 67 29 20 63 75 72 72 73 6c 6f 74 29 3b  long) currslot);
20010 0a 0a 09 09 09 09 09 69 66 20 28 63 61 63 6b 65  .......if (cacke
20020 79 5f 72 65 61 64 65 72 73 5f 69 6e 63 6c 75 64  y_readers_includ
20030 65 5f 6f 6e 6c 79 20 21 3d 20 4e 55 4c 4c 29 20  e_only != NULL) 
20040 7b 0a 09 09 09 09 09 09 43 41 43 4b 45 59 5f 44  {.......CACKEY_D
20050 45 42 55 47 5f 50 52 49 4e 54 46 28 22 41 73 6b  EBUG_PRINTF("Ask
20060 65 64 20 74 6f 20 69 6e 63 6c 75 64 65 20 6f 6e  ed to include on
20070 6c 79 20 72 65 61 64 65 72 73 20 6d 61 74 63 68  ly readers match
20080 69 6e 67 3a 20 25 73 22 2c 20 63 61 63 6b 65 79  ing: %s", cackey
20090 5f 72 65 61 64 65 72 73 5f 69 6e 63 6c 75 64 65  _readers_include
200a0 5f 6f 6e 6c 79 29 3b 0a 0a 09 09 09 09 09 09 69  _only);........i
200b0 6e 63 6c 75 64 65 5f 72 65 61 64 65 72 20 3d 20  nclude_reader = 
200c0 30 3b 0a 09 09 09 09 09 09 72 65 61 64 65 72 5f  0;.......reader_
200d0 63 68 65 63 6b 5f 70 61 74 74 65 72 6e 20 3d 20  check_pattern = 
200e0 63 61 63 6b 65 79 5f 72 65 61 64 65 72 73 5f 69  cackey_readers_i
200f0 6e 63 6c 75 64 65 5f 6f 6e 6c 79 3b 0a 09 09 09  nclude_only;....
20100 09 09 7d 20 65 6c 73 65 20 69 66 20 28 63 61 63  ..} else if (cac
20110 6b 65 79 5f 72 65 61 64 65 72 73 5f 65 78 63 6c  key_readers_excl
20120 75 64 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ude != NULL) {..
20130 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
20140 47 5f 50 52 49 4e 54 46 28 22 41 73 6b 65 64 20  G_PRINTF("Asked 
20150 74 6f 20 65 78 63 6c 75 64 65 20 72 65 61 64 65  to exclude reade
20160 72 73 20 6d 61 74 63 68 69 6e 67 3a 20 25 73 22  rs matching: %s"
20170 2c 20 63 61 63 6b 65 79 5f 72 65 61 64 65 72 73  , cackey_readers
20180 5f 65 78 63 6c 75 64 65 29 3b 0a 0a 09 09 09 09  _exclude);......
20190 09 09 69 6e 63 6c 75 64 65 5f 72 65 61 64 65 72  ..include_reader
201a0 20 3d 20 31 3b 0a 09 09 09 09 09 09 72 65 61 64   = 1;.......read
201b0 65 72 5f 63 68 65 63 6b 5f 70 61 74 74 65 72 6e  er_check_pattern
201c0 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 65 72   = cackey_reader
201d0 73 5f 65 78 63 6c 75 64 65 3b 0a 09 09 09 09 09  s_exclude;......
201e0 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09 69  } else {.......i
201f0 6e 63 6c 75 64 65 5f 72 65 61 64 65 72 20 3d 20  nclude_reader = 
20200 31 3b 0a 09 09 09 09 09 09 72 65 61 64 65 72 5f  1;.......reader_
20210 63 68 65 63 6b 5f 70 61 74 74 65 72 6e 20 3d 20  check_pattern = 
20220 4e 55 4c 4c 3b 0a 09 09 09 09 09 7d 0a 0a 09 09  NULL;......}....
20230 09 09 09 69 66 20 28 72 65 61 64 65 72 5f 63 68  ...if (reader_ch
20240 65 63 6b 5f 70 61 74 74 65 72 6e 20 21 3d 20 4e  eck_pattern != N
20250 55 4c 4c 29 20 7b 0a 09 09 09 09 09 09 69 66 20  ULL) {.......if 
20260 28 73 74 72 73 74 72 28 70 63 73 63 5f 72 65 61  (strstr(pcsc_rea
20270 64 65 72 73 2c 20 72 65 61 64 65 72 5f 63 68 65  ders, reader_che
20280 63 6b 5f 70 61 74 74 65 72 6e 29 20 21 3d 20 4e  ck_pattern) != N
20290 55 4c 4c 29 20 7b 0a 09 09 09 09 09 09 09 43 41  ULL) {........CA
202a0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
202b0 46 28 22 54 68 69 73 20 72 65 61 64 65 72 20 6d  F("This reader m
202c0 61 74 63 68 65 64 20 74 68 65 20 70 61 74 74 65  atched the patte
202d0 72 6e 2e 22 29 3b 0a 09 09 09 09 09 09 0a 09 09  rn.");..........
202e0 09 09 09 09 09 69 6e 63 6c 75 64 65 5f 72 65 61  .....include_rea
202f0 64 65 72 20 3d 20 21 69 6e 63 6c 75 64 65 5f 72  der = !include_r
20300 65 61 64 65 72 3b 0a 09 09 09 09 09 09 7d 0a 09  eader;.......}..
20310 09 09 09 09 7d 0a 0a 09 09 09 09 09 69 66 20 28  ....}.......if (
20320 69 6e 63 6c 75 64 65 5f 72 65 61 64 65 72 20 21  include_reader !
20330 3d 20 31 29 20 7b 0a 09 09 09 09 09 09 43 41 43  = 1) {.......CAC
20340 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
20350 28 22 53 6b 69 70 70 69 6e 67 20 74 68 69 73 20  ("Skipping this 
20360 72 65 61 64 65 72 2e 22 29 3b 0a 0a 09 09 09 09  reader.");......
20370 09 09 70 63 73 63 5f 72 65 61 64 65 72 73 20 2b  ..pcsc_readers +
20380 3d 20 63 75 72 72 5f 72 65 61 64 65 72 5f 6c 65  = curr_reader_le
20390 6e 20 2b 20 31 3b 0a 0a 09 09 09 09 09 09 63 6f  n + 1;........co
203a0 6e 74 69 6e 75 65 3b 0a 09 09 09 09 09 7d 0a 0a  ntinue;......}..
203b0 09 09 09 09 09 2f 2a 20 4f 6e 6c 79 20 75 70 64  ...../* Only upd
203c0 61 74 65 20 74 68 65 20 6c 69 73 74 20 6f 66 20  ate the list of 
203d0 73 6c 6f 74 73 20 69 66 20 77 65 20 61 72 65 20  slots if we are 
203e0 61 63 74 75 61 6c 6c 79 20 62 65 69 6e 67 20 61  actually being a
203f0 73 6b 65 64 20 73 75 70 70 6c 79 20 74 68 65 20  sked supply the 
20400 73 6c 6f 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  slot information
20410 20 2a 2f 0a 09 09 09 09 09 69 66 20 28 70 53 6c   */......if (pSl
20420 6f 74 4c 69 73 74 29 20 7b 0a 09 09 09 09 09 09  otList) {.......
20430 69 66 20 28 73 6c 6f 74 5f 72 65 73 65 74 29 20  if (slot_reset) 
20440 7b 0a 09 09 09 09 09 09 09 63 61 63 6b 65 79 5f  {........cackey_
20450 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e  slots[currslot].
20460 61 63 74 69 76 65 20 3d 20 31 3b 0a 09 09 09 09  active = 1;.....
20470 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ...cackey_slots[
20480 63 75 72 72 73 6c 6f 74 5d 2e 69 6e 74 65 72 6e  currslot].intern
20490 61 6c 20 3d 20 30 3b 0a 09 09 09 09 09 09 09 63  al = 0;........c
204a0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72  ackey_slots[curr
204b0 73 6c 6f 74 5d 2e 70 63 73 63 5f 72 65 61 64 65  slot].pcsc_reade
204c0 72 20 3d 20 73 74 72 64 75 70 28 70 63 73 63 5f  r = strdup(pcsc_
204d0 72 65 61 64 65 72 73 29 3b 0a 09 09 09 09 09 09  readers);.......
204e0 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75  .cackey_slots[cu
204f0 72 72 73 6c 6f 74 5d 2e 70 63 73 63 5f 63 61 72  rrslot].pcsc_car
20500 64 5f 63 6f 6e 6e 65 63 74 65 64 20 3d 20 30 3b  d_connected = 0;
20510 0a 09 09 09 09 09 09 09 63 61 63 6b 65 79 5f 73  ........cackey_s
20520 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 74  lots[currslot].t
20530 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68  ransaction_depth
20540 20 3d 20 30 3b 0a 09 09 09 09 09 09 09 63 61 63   = 0;........cac
20550 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c  key_slots[currsl
20560 6f 74 5d 2e 74 72 61 6e 73 61 63 74 69 6f 6e 5f  ot].transaction_
20570 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b 20 3d 20 30  need_hw_lock = 0
20580 3b 0a 09 09 09 09 09 09 09 69 66 20 28 63 61 63  ;........if (cac
20590 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20  key_pin_command 
205a0 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 09  == NULL) {......
205b0 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ...cackey_slots[
205c0 63 75 72 72 73 6c 6f 74 5d 2e 74 6f 6b 65 6e 5f  currslot].token_
205d0 66 6c 61 67 73 20 3d 20 43 4b 46 5f 4c 4f 47 49  flags = CKF_LOGI
205e0 4e 5f 52 45 51 55 49 52 45 44 3b 0a 09 09 09 09  N_REQUIRED;.....
205f0 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09  ...} else {.....
20600 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ....cackey_slots
20610 5b 63 75 72 72 73 6c 6f 74 5d 2e 74 6f 6b 65 6e  [currslot].token
20620 5f 66 6c 61 67 73 20 3d 20 30 3b 0a 09 09 09 09  _flags = 0;.....
20630 09 09 09 7d 0a 09 09 09 09 09 09 09 63 61 63 6b  ...}........cack
20640 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f  ey_slots[currslo
20650 74 5d 2e 6c 61 62 65 6c 20 3d 20 4e 55 4c 4c 3b  t].label = NULL;
20660 0a 0a 09 09 09 09 09 09 09 63 61 63 6b 65 79 5f  .........cackey_
20670 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74 28  mark_slot_reset(
20680 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75  &cackey_slots[cu
20690 72 72 73 6c 6f 74 5d 29 3b 0a 09 09 09 09 09 09  rrslot]);.......
206a0 7d 0a 09 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a  }......} else {.
206b0 09 09 09 09 09 09 69 66 20 28 21 63 61 63 6b 65  ......if (!cacke
206c0 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74  y_slots[currslot
206d0 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 09 09  ].active) {.....
206e0 09 09 09 2f 2a 20 41 72 74 69 66 69 63 69 61 6c  .../* Artificial
206f0 6c 79 20 69 6e 63 72 65 61 73 65 20 74 68 65 20  ly increase the 
20700 6e 75 6d 62 65 72 20 6f 66 20 61 63 74 69 76 65  number of active
20710 20 73 6c 6f 74 73 20 62 79 20 77 68 61 74 20 77   slots by what w
20720 69 6c 6c 20 62 65 63 6f 6d 65 20 61 63 74 69 76  ill become activ
20730 65 20 2a 2f 0a 09 09 09 09 09 09 09 43 41 43 4b  e */........CACK
20740 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
20750 22 46 6f 75 6e 64 20 69 6e 2d 61 63 74 69 76 65  "Found in-active
20760 20 73 6c 6f 74 20 25 6c 75 2c 20 62 75 74 20 69   slot %lu, but i
20770 74 20 77 69 6c 6c 20 62 65 20 61 63 74 69 76 65  t will be active
20780 20 61 66 74 65 72 20 61 20 72 65 73 65 74 20 2d   after a reset -
20790 2d 20 6d 61 72 6b 69 6e 67 20 61 73 20 61 63 74  - marking as act
207a0 69 76 65 20 66 6f 72 20 61 63 63 6f 75 6e 74 69  ive for accounti
207b0 6e 67 20 70 75 72 70 6f 73 65 73 22 2c 20 28 75  ng purposes", (u
207c0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75  nsigned long) cu
207d0 72 72 73 6c 6f 74 29 3b 0a 0a 09 09 09 09 09 09  rrslot);........
207e0 09 73 6c 6f 74 5f 63 6f 75 6e 74 2b 2b 3b 0a 09  .slot_count++;..
207f0 09 09 09 09 09 7d 0a 09 09 09 09 09 7d 0a 09 09  .....}......}...
20800 09 09 09 63 75 72 72 73 6c 6f 74 2b 2b 3b 0a 0a  ...currslot++;..
20810 09 09 09 09 09 70 63 73 63 5f 72 65 61 64 65 72  .....pcsc_reader
20820 73 20 2b 3d 20 63 75 72 72 5f 72 65 61 64 65 72  s += curr_reader
20830 5f 6c 65 6e 20 2b 20 31 3b 0a 09 09 09 09 7d 0a  _len + 1;.....}.
20840 0a 09 09 09 09 66 6f 72 20 28 63 75 72 72 73 6c  .....for (currsl
20850 6f 74 20 3d 20 30 3b 20 63 75 72 72 73 6c 6f 74  ot = 0; currslot
20860 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65   < (sizeof(cacke
20870 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f  y_slots) / sizeo
20880 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30  f(cackey_slots[0
20890 5d 29 29 3b 20 63 75 72 72 73 6c 6f 74 2b 2b 29  ])); currslot++)
208a0 20 7b 0a 09 09 09 09 09 69 66 20 28 63 61 63 6b   {......if (cack
208b0 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f  ey_slots[currslo
208c0 74 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 09  t].active) {....
208d0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
208e0 50 52 49 4e 54 46 28 22 46 6f 75 6e 64 20 61 63  PRINTF("Found ac
208f0 74 69 76 65 20 73 6c 6f 74 20 25 6c 75 2c 20 72  tive slot %lu, r
20900 65 61 64 65 72 20 3d 20 25 73 22 2c 20 28 75 6e  eader = %s", (un
20910 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72  signed long) cur
20920 72 73 6c 6f 74 2c 20 63 61 63 6b 65 79 5f 73 6c  rslot, cackey_sl
20930 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 70 63  ots[currslot].pc
20940 73 63 5f 72 65 61 64 65 72 29 3b 0a 0a 09 09 09  sc_reader);.....
20950 09 09 09 73 6c 6f 74 5f 63 6f 75 6e 74 2b 2b 3b  ...slot_count++;
20960 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 09 09  ......}.....}...
20970 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 43 41  .} else {.....CA
20980 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
20990 46 28 22 53 65 63 6f 6e 64 20 63 61 6c 6c 20 74  F("Second call t
209a0 6f 20 53 43 61 72 64 4c 69 73 74 52 65 61 64 65  o SCardListReade
209b0 72 73 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72  rs failed, retur
209c0 6e 20 25 73 2f 25 6c 69 22 2c 20 43 41 43 4b 45  n %s/%li", CACKE
209d0 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41  Y_DEBUG_FUNC_SCA
209e0 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61  RDERR_TO_STR(sca
209f0 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72  rd_listreaders_r
20a00 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72  et), (long) scar
20a10 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65  d_listreaders_re
20a20 74 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 66 72 65  t);....}.....fre
20a30 65 28 70 63 73 63 5f 72 65 61 64 65 72 73 5f 73  e(pcsc_readers_s
20a40 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  );...} else {...
20a50 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
20a60 49 4e 54 46 28 22 46 69 72 73 74 20 63 61 6c 6c  INTF("First call
20a70 20 74 6f 20 53 43 61 72 64 4c 69 73 74 52 65 61   to SCardListRea
20a80 64 65 72 73 20 66 61 69 6c 65 64 2c 20 72 65 74  ders failed, ret
20a90 75 72 6e 20 25 73 2f 25 6c 69 22 2c 20 43 41 43  urn %s/%li", CAC
20aa0 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53  KEY_DEBUG_FUNC_S
20ab0 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73  CARDERR_TO_STR(s
20ac0 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73  card_listreaders
20ad0 5f 72 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63  _ret), (long) sc
20ae0 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f  ard_listreaders_
20af0 72 65 74 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 6d  ret);...}..}...m
20b00 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
20b10 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
20b20 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
20b30 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
20b40 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
20b50 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
20b60 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f  TF("Error.  Unlo
20b70 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
20b80 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
20b90 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
20ba0 7d 0a 0a 09 69 66 20 28 70 53 6c 6f 74 4c 69 73  }...if (pSlotLis
20bb0 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 2a  t == NULL) {...*
20bc0 70 75 6c 43 6f 75 6e 74 20 3d 20 73 6c 6f 74 5f  pulCount = slot_
20bd0 63 6f 75 6e 74 3b 0a 0a 09 09 43 41 43 4b 45 59  count;....CACKEY
20be0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
20bf0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20  eturning CKR_OK 
20c00 28 25 69 29 2e 20 20 46 6f 75 6e 64 20 25 6c 75  (%i).  Found %lu
20c10 20 72 65 61 64 65 72 73 2c 20 62 75 74 20 6e 6f   readers, but no
20c20 74 20 73 74 6f 72 69 6e 67 20 49 44 73 20 28 70  t storing IDs (p
20c30 53 6c 6f 74 4c 69 73 74 20 3d 3d 20 4e 55 4c 4c  SlotList == NULL
20c40 29 22 2c 20 43 4b 52 5f 4f 4b 2c 20 28 75 6e 73  )", CKR_OK, (uns
20c50 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 6c 6f 74  igned long) slot
20c60 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09 72 65 74 75  _count);....retu
20c70 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a  rn(CKR_OK);..}..
20c80 09 63 6f 75 6e 74 20 3d 20 2a 70 75 6c 43 6f 75  .count = *pulCou
20c90 6e 74 3b 0a 09 69 66 20 28 63 6f 75 6e 74 20 3c  nt;..if (count <
20ca0 20 73 6c 6f 74 5f 63 6f 75 6e 74 29 20 7b 0a 09   slot_count) {..
20cb0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
20cc0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 55 73 65  INTF("Error. Use
20cd0 72 20 61 6c 6c 6f 63 61 74 65 64 20 25 6c 75 20  r allocated %lu 
20ce0 65 6e 74 72 69 65 73 2c 20 62 75 74 20 77 65 20  entries, but we 
20cf0 68 61 76 65 20 25 6c 75 20 65 6e 74 72 69 65 73  have %lu entries
20d00 2e 22 2c 20 63 6f 75 6e 74 2c 20 73 6c 6f 74 5f  .", count, slot_
20d10 63 6f 75 6e 74 29 3b 0a 0a 09 09 43 41 43 4b 45  count);....CACKE
20d20 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
20d30 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 42 55  Returning CKR_BU
20d40 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 22 29  FFER_TOO_SMALL")
20d50 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
20d60 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c  BUFFER_TOO_SMALL
20d70 29 3b 09 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  );...}...mutex_r
20d80 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
20d90 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79  utex_lock(cackey
20da0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
20db0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
20dc0 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
20dd0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
20de0 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c  r.  Locking fail
20df0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
20e00 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
20e10 4f 52 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 5f 69  OR);..}...slot_i
20e20 64 78 20 3d 20 30 3b 0a 09 66 6f 72 20 28 63 75  dx = 0;..for (cu
20e30 72 72 73 6c 6f 74 20 3d 20 30 3b 20 28 63 75 72  rrslot = 0; (cur
20e40 72 73 6c 6f 74 20 3c 20 28 73 69 7a 65 6f 66 28  rslot < (sizeof(
20e50 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20  cackey_slots) / 
20e60 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
20e70 6f 74 73 5b 30 5d 29 29 29 3b 20 63 75 72 72 73  ots[0]))); currs
20e80 6c 6f 74 2b 2b 29 20 7b 0a 09 09 69 66 20 28 21  lot++) {...if (!
20e90 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72  cackey_slots[cur
20ea0 72 73 6c 6f 74 5d 2e 61 63 74 69 76 65 29 20 7b  rslot].active) {
20eb0 0a 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09  ....continue;...
20ec0 7d 0a 0a 09 09 69 66 20 28 73 6c 6f 74 5f 69 64  }....if (slot_id
20ed0 78 20 3e 3d 20 63 6f 75 6e 74 29 20 7b 0a 09 09  x >= count) {...
20ee0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
20ef0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 55 73 65  INTF("Error. Use
20f00 72 20 61 6c 6c 6f 63 61 74 65 64 20 25 6c 75 20  r allocated %lu 
20f10 65 6e 74 72 69 65 73 2c 20 62 75 74 20 77 65 20  entries, but we 
20f20 6a 75 73 74 20 74 72 69 65 64 20 74 6f 20 77 72  just tried to wr
20f30 69 74 65 20 74 6f 20 74 68 65 20 25 6c 75 20 69  ite to the %lu i
20f40 6e 64 65 78 20 2d 2d 20 69 67 6e 6f 72 69 6e 67  ndex -- ignoring
20f50 22 2c 20 63 6f 75 6e 74 2c 20 73 6c 6f 74 5f 69  ", count, slot_i
20f60 64 78 29 3b 0a 0a 09 09 09 63 6f 6e 74 69 6e 75  dx);.....continu
20f70 65 3b 0a 09 09 7d 0a 0a 09 09 70 53 6c 6f 74 4c  e;...}....pSlotL
20f80 69 73 74 5b 73 6c 6f 74 5f 69 64 78 5d 20 3d 20  ist[slot_idx] = 
20f90 63 75 72 72 73 6c 6f 74 3b 0a 09 09 73 6c 6f 74  currslot;...slot
20fa0 5f 69 64 78 2b 2b 3b 0a 09 7d 0a 0a 09 6d 75 74  _idx++;..}...mut
20fb0 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
20fc0 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
20fd0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
20fe0 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
20ff0 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
21000 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
21010 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b  ("Error.  Unlock
21020 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
21030 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
21040 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
21050 0a 09 2a 70 75 6c 43 6f 75 6e 74 20 3d 20 73 6c  ..*pulCount = sl
21060 6f 74 5f 63 6f 75 6e 74 3b 0a 0a 09 43 41 43 4b  ot_count;...CACK
21070 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
21080 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
21090 4b 20 28 25 69 29 2e 20 20 46 6f 75 6e 64 20 25  K (%i).  Found %
210a0 6c 75 20 72 65 61 64 65 72 73 2e 22 2c 20 43 4b  lu readers.", CK
210b0 52 5f 4f 4b 2c 20 28 75 6e 73 69 67 6e 65 64 20  R_OK, (unsigned 
210c0 6c 6f 6e 67 29 20 73 6c 6f 74 5f 63 6f 75 6e 74  long) slot_count
210d0 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
210e0 4f 4b 29 3b 0a 0a 09 74 6f 6b 65 6e 50 72 65 73  OK);...tokenPres
210f0 65 6e 74 20 3d 20 74 6f 6b 65 6e 50 72 65 73 65  ent = tokenPrese
21100 6e 74 3b 20 2f 2a 20 53 75 70 72 65 73 73 20 75  nt; /* Supress u
21110 6e 75 73 65 64 20 76 61 72 69 61 62 6c 65 20 77  nused variable w
21120 61 72 6e 69 6e 67 20 2a 2f 0a 7d 0a 0a 43 4b 5f  arning */.}..CK_
21130 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
21140 43 4b 5f 52 56 2c 20 43 5f 47 65 74 53 6c 6f 74  CK_RV, C_GetSlot
21150 49 6e 66 6f 29 28 43 4b 5f 53 4c 4f 54 5f 49 44  Info)(CK_SLOT_ID
21160 20 73 6c 6f 74 49 44 2c 20 43 4b 5f 53 4c 4f 54   slotID, CK_SLOT
21170 5f 49 4e 46 4f 5f 50 54 52 20 70 49 6e 66 6f 29  _INFO_PTR pInfo)
21180 20 7b 0a 09 73 74 61 74 69 63 20 43 4b 5f 55 54   {..static CK_UT
21190 46 38 43 48 41 52 20 73 6c 6f 74 44 65 73 63 72  F8CHAR slotDescr
211a0 69 70 74 69 6f 6e 5b 5d 20 3d 20 22 43 41 43 4b  iption[] = "CACK
211b0 65 79 20 53 6c 6f 74 22 3b 0a 09 69 6e 74 20 6d  ey Slot";..int m
211c0 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09 69 6e  utex_retval;..in
211d0 74 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 3b  t bytes_to_copy;
211e0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
211f0 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
21200 29 3b 0a 0a 09 69 66 20 28 70 49 6e 66 6f 20 3d  );...if (pInfo =
21210 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
21220 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
21230 22 45 72 72 6f 72 2e 20 70 49 6e 66 6f 20 69 73  "Error. pInfo is
21240 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74   NULL.");....ret
21250 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54  urn(CKR_ARGUMENT
21260 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  S_BAD);..}...if 
21270 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
21280 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
21290 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
212a0 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
212b0 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
212c0 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
212d0 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
212e0 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f  D);..}...if (slo
212f0 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49  tID < 0 || slotI
21300 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63  D >= (sizeof(cac
21310 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a  key_slots) / siz
21320 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
21330 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45  [0]))) {...CACKE
21340 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
21350 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73  Error. Invalid s
21360 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25  lot requested (%
21370 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20  lu), outside of 
21380 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c  valid range", sl
21390 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e  otID);....return
213a0 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56  (CKR_SLOT_ID_INV
213b0 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65  ALID);..}...mute
213c0 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
213d0 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63  y_mutex_lock(cac
213e0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
213f0 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
21400 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
21410 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
21420 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66  rror.  Locking f
21430 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
21440 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
21450 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20  ERROR);..}...if 
21460 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c  (cackey_slots[sl
21470 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20  otID].active == 
21480 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
21490 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
214a0 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20  r. Invalid slot 
214b0 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c  requested (%lu),
214c0 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e   slot not curren
214d0 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f  tly active", slo
214e0 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f  tID);....cackey_
214f0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
21500 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
21510 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54  .return(CKR_SLOT
21520 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  _ID_INVALID);..}
21530 0a 0a 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20  ...pInfo->flags 
21540 3d 20 43 4b 46 5f 48 57 5f 53 4c 4f 54 3b 0a 0a  = CKF_HW_SLOT;..
21550 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 6c 6f  .if (!cackey_slo
21560 74 73 5b 73 6c 6f 74 49 44 5d 2e 69 6e 74 65 72  ts[slotID].inter
21570 6e 61 6c 29 20 7b 0a 09 09 70 49 6e 66 6f 2d 3e  nal) {...pInfo->
21580 66 6c 61 67 73 20 7c 3d 20 43 4b 46 5f 52 45 4d  flags |= CKF_REM
21590 4f 56 41 42 4c 45 5f 44 45 56 49 43 45 3b 0a 09  OVABLE_DEVICE;..
215a0 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 74  }...if (cackey_t
215b0 6f 6b 65 6e 5f 70 72 65 73 65 6e 74 28 26 63 61  oken_present(&ca
215c0 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
215d0 44 5d 29 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43  D]) == CACKEY_PC
215e0 53 43 5f 53 5f 54 4f 4b 45 4e 50 52 45 53 45 4e  SC_S_TOKENPRESEN
215f0 54 29 20 7b 0a 09 09 70 49 6e 66 6f 2d 3e 66 6c  T) {...pInfo->fl
21600 61 67 73 20 7c 3d 20 43 4b 46 5f 54 4f 4b 45 4e  ags |= CKF_TOKEN
21610 5f 50 52 45 53 45 4e 54 3b 0a 09 7d 0a 0a 09 62  _PRESENT;..}...b
21620 79 74 65 73 5f 74 6f 5f 63 6f 70 79 20 3d 20 73  ytes_to_copy = s
21630 74 72 6c 65 6e 28 63 61 63 6b 65 79 5f 73 6c 6f  trlen(cackey_slo
21640 74 73 5b 73 6c 6f 74 49 44 5d 2e 70 63 73 63 5f  ts[slotID].pcsc_
21650 72 65 61 64 65 72 29 3b 0a 09 69 66 20 28 73 69  reader);..if (si
21660 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75  zeof(pInfo->manu
21670 66 61 63 74 75 72 65 72 49 44 29 20 3c 20 62 79  facturerID) < by
21680 74 65 73 5f 74 6f 5f 63 6f 70 79 29 20 7b 0a 09  tes_to_copy) {..
21690 09 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 20 3d  .bytes_to_copy =
216a0 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d   sizeof(pInfo->m
216b0 61 6e 75 66 61 63 74 75 72 65 72 49 44 29 3b 0a  anufacturerID);.
216c0 09 7d 0a 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f  .}..memcpy(pInfo
216d0 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44  ->manufacturerID
216e0 2c 20 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73  , cackey_slots[s
216f0 6c 6f 74 49 44 5d 2e 70 63 73 63 5f 72 65 61 64  lotID].pcsc_read
21700 65 72 2c 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70  er, bytes_to_cop
21710 79 29 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  y);...mutex_retv
21720 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
21730 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
21740 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
21750 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
21760 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
21770 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
21780 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69  .  Unlocking fai
21790 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
217a0 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
217b0 52 4f 52 29 3b 0a 09 7d 0a 0a 09 6d 65 6d 73 65  ROR);..}...memse
217c0 74 28 70 49 6e 66 6f 2d 3e 73 6c 6f 74 44 65 73  t(pInfo->slotDes
217d0 63 72 69 70 74 69 6f 6e 2c 20 27 20 27 2c 20 73  cription, ' ', s
217e0 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 73 6c 6f  izeof(pInfo->slo
217f0 74 44 65 73 63 72 69 70 74 69 6f 6e 29 29 3b 0a  tDescription));.
21800 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 73  .memcpy(pInfo->s
21810 6c 6f 74 44 65 73 63 72 69 70 74 69 6f 6e 2c 20  lotDescription, 
21820 73 6c 6f 74 44 65 73 63 72 69 70 74 69 6f 6e 2c  slotDescription,
21830 20 73 69 7a 65 6f 66 28 73 6c 6f 74 44 65 73 63   sizeof(slotDesc
21840 72 69 70 74 69 6f 6e 29 20 2d 20 31 29 3b 0a 0a  ription) - 1);..
21850 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 6d  .memset(pInfo->m
21860 61 6e 75 66 61 63 74 75 72 65 72 49 44 2c 20 27  anufacturerID, '
21870 20 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f   ', sizeof(pInfo
21880 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44  ->manufacturerID
21890 29 29 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 68 61 72  ));...pInfo->har
218a0 64 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d 61 6a  dwareVersion.maj
218b0 6f 72 20 3d 20 28 63 61 63 6b 65 79 5f 67 65 74  or = (cackey_get
218c0 76 65 72 73 69 6f 6e 28 29 20 3e 3e 20 31 36 29  version() >> 16)
218d0 20 26 20 30 78 66 66 3b 0a 09 70 49 6e 66 6f 2d   & 0xff;..pInfo-
218e0 3e 68 61 72 64 77 61 72 65 56 65 72 73 69 6f 6e  >hardwareVersion
218f0 2e 6d 69 6e 6f 72 20 3d 20 28 63 61 63 6b 65 79  .minor = (cackey
21900 5f 67 65 74 76 65 72 73 69 6f 6e 28 29 20 3e 3e  _getversion() >>
21910 20 38 29 20 26 20 30 78 66 66 3b 0a 0a 09 70 49   8) & 0xff;...pI
21920 6e 66 6f 2d 3e 66 69 72 6d 77 61 72 65 56 65 72  nfo->firmwareVer
21930 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 30 78 30  sion.major = 0x0
21940 30 3b 0a 09 70 49 6e 66 6f 2d 3e 66 69 72 6d 77  0;..pInfo->firmw
21950 61 72 65 56 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72  areVersion.minor
21960 20 3d 20 30 78 30 30 3b 0a 0a 09 43 41 43 4b 45   = 0x00;...CACKE
21970 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
21980 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b  Returning CKR_OK
21990 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b   (%i)", CKR_OK);
219a0 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b  ...return(CKR_OK
219b0 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
219c0 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
219d0 43 5f 47 65 74 54 6f 6b 65 6e 49 6e 66 6f 29 28  C_GetTokenInfo)(
219e0 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49  CK_SLOT_ID slotI
219f0 44 2c 20 43 4b 5f 54 4f 4b 45 4e 5f 49 4e 46 4f  D, CK_TOKEN_INFO
21a00 5f 50 54 52 20 70 49 6e 66 6f 29 20 7b 0a 09 73  _PTR pInfo) {..s
21a10 74 61 74 69 63 20 43 4b 5f 55 54 46 38 43 48 41  tatic CK_UTF8CHA
21a20 52 20 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44  R manufacturerID
21a30 5b 5d 20 3d 20 22 55 2e 53 2e 20 47 6f 76 65 72  [] = "U.S. Gover
21a40 6e 6d 65 6e 74 22 3b 0a 09 73 74 61 74 69 63 20  nment";..static 
21a50 43 4b 5f 55 54 46 38 43 48 41 52 20 64 65 66 61  CK_UTF8CHAR defa
21a60 75 6c 74 4c 61 62 65 6c 5b 5d 20 3d 20 22 55 6e  ultLabel[] = "Un
21a70 6b 6e 6f 77 6e 20 54 6f 6b 65 6e 22 3b 0a 09 73  known Token";..s
21a80 74 61 74 69 63 20 43 4b 5f 55 54 46 38 43 48 41  tatic CK_UTF8CHA
21a90 52 20 6d 6f 64 65 6c 5b 5d 20 3d 20 22 43 41 43  R model[] = "CAC
21aa0 20 54 6f 6b 65 6e 22 3b 0a 09 73 74 72 75 63 74   Token";..struct
21ab0 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65   cackey_pcsc_ide
21ac0 6e 74 69 74 79 20 2a 70 63 73 63 5f 69 64 65 6e  ntity *pcsc_iden
21ad0 74 69 74 69 65 73 3b 0a 09 75 6e 73 69 67 6e 65  tities;..unsigne
21ae0 64 20 6c 6f 6e 67 20 6e 75 6d 5f 63 65 72 74 73  d long num_certs
21af0 3b 0a 09 73 73 69 7a 65 5f 74 20 6c 61 62 65 6c  ;..ssize_t label
21b00 5f 72 65 74 3b 0a 09 69 6e 74 20 6d 75 74 65 78  _ret;..int mutex
21b10 5f 72 65 74 76 61 6c 3b 0a 09 69 6e 74 20 75 73  _retval;..int us
21b20 65 5f 64 65 66 61 75 6c 74 5f 6c 61 62 65 6c 3b  e_default_label;
21b30 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
21b40 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
21b50 29 3b 0a 0a 09 69 66 20 28 70 49 6e 66 6f 20 3d  );...if (pInfo =
21b60 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
21b70 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
21b80 22 45 72 72 6f 72 2e 20 70 49 6e 66 6f 20 69 73  "Error. pInfo is
21b90 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74   NULL.");....ret
21ba0 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54  urn(CKR_ARGUMENT
21bb0 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  S_BAD);..}...if 
21bc0 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
21bd0 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
21be0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
21bf0 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
21c00 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
21c10 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
21c20 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
21c30 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f  D);..}...if (slo
21c40 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49  tID < 0 || slotI
21c50 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63  D >= (sizeof(cac
21c60 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a  key_slots) / siz
21c70 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
21c80 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45  [0]))) {...CACKE
21c90 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
21ca0 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73  Error. Invalid s
21cb0 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25  lot requested (%
21cc0 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20  lu), outside of 
21cd0 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c  valid range", sl
21ce0 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e  otID);....return
21cf0 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56  (CKR_SLOT_ID_INV
21d00 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65  ALID);..}...mute
21d10 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
21d20 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63  y_mutex_lock(cac
21d30 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
21d40 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
21d50 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
21d60 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
21d70 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66  rror.  Locking f
21d80 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
21d90 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
21da0 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20  ERROR);..}...if 
21db0 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c  (cackey_slots[sl
21dc0 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20  otID].active == 
21dd0 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
21de0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
21df0 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20  r. Invalid slot 
21e00 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c  requested (%lu),
21e10 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e   slot not curren
21e20 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f  tly active", slo
21e30 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f  tID);....cackey_
21e40 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
21e50 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
21e60 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54  .return(CKR_SLOT
21e70 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  _ID_INVALID);..}
21e80 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 74 6f  ...if (cackey_to
21e90 6b 65 6e 5f 70 72 65 73 65 6e 74 28 26 63 61 63  ken_present(&cac
21ea0 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44  key_slots[slotID
21eb0 5d 29 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53  ]) != CACKEY_PCS
21ec0 43 5f 53 5f 54 4f 4b 45 4e 50 52 45 53 45 4e 54  C_S_TOKENPRESENT
21ed0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
21ee0 55 47 5f 50 52 49 4e 54 46 28 22 4e 6f 20 74 6f  UG_PRINTF("No to
21ef0 6b 65 6e 20 69 73 20 70 72 65 73 65 6e 74 20 69  ken is present i
21f00 6e 20 73 6c 6f 74 49 44 20 3d 20 25 6c 75 22 2c  n slotID = %lu",
21f10 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63   slotID);....cac
21f20 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
21f30 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
21f40 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
21f50 54 4f 4b 45 4e 5f 4e 4f 54 5f 50 52 45 53 45 4e  TOKEN_NOT_PRESEN
21f60 54 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  T);..}...mutex_r
21f70 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
21f80 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
21f90 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
21fa0 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
21fb0 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
21fc0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
21fd0 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20  ror.  Unlocking 
21fe0 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
21ff0 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
22000 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 2f 2a  _ERROR);..}.../*
22010 20 44 65 74 65 72 6d 69 6e 65 20 74 6f 6b 65 6e   Determine token
22020 20 6c 61 62 65 6c 20 66 72 6f 6d 20 63 65 72 74   label from cert
22030 69 66 69 63 61 74 65 73 20 2a 2f 0a 09 6d 65 6d  ificates */..mem
22040 73 65 74 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c  set(pInfo->label
22050 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 28 70 49  , ' ', sizeof(pI
22060 6e 66 6f 2d 3e 6c 61 62 65 6c 29 29 3b 0a 09 75  nfo->label));..u
22070 73 65 5f 64 65 66 61 75 6c 74 5f 6c 61 62 65 6c  se_default_label
22080 20 3d 20 31 3b 0a 0a 09 69 66 20 28 63 61 63 6b   = 1;...if (cack
22090 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
220a0 2e 6c 61 62 65 6c 20 3d 3d 20 4e 55 4c 4c 29 20  .label == NULL) 
220b0 7b 0a 09 09 70 63 73 63 5f 69 64 65 6e 74 69 74  {...pcsc_identit
220c0 69 65 73 20 3d 20 63 61 63 6b 65 79 5f 72 65 61  ies = cackey_rea
220d0 64 5f 63 65 72 74 73 28 26 63 61 63 6b 65 79 5f  d_certs(&cackey_
220e0 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c 20 4e  slots[slotID], N
220f0 55 4c 4c 2c 20 26 6e 75 6d 5f 63 65 72 74 73 29  ULL, &num_certs)
22100 3b 0a 09 09 69 66 20 28 70 63 73 63 5f 69 64 65  ;...if (pcsc_ide
22110 6e 74 69 74 69 65 73 20 21 3d 20 4e 55 4c 4c 29  ntities != NULL)
22120 20 7b 0a 09 09 09 69 66 20 28 6e 75 6d 5f 63 65   {....if (num_ce
22130 72 74 73 20 3e 20 30 29 20 7b 0a 09 09 09 09 6c  rts > 0) {.....l
22140 61 62 65 6c 5f 72 65 74 20 3d 20 63 61 63 6b 65  abel_ret = cacke
22150 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79 5f  y_pcsc_identity_
22160 74 6f 5f 6c 61 62 65 6c 28 70 63 73 63 5f 69 64  to_label(pcsc_id
22170 65 6e 74 69 74 69 65 73 2c 20 70 49 6e 66 6f 2d  entities, pInfo-
22180 3e 6c 61 62 65 6c 2c 20 73 69 7a 65 6f 66 28 70  >label, sizeof(p
22190 49 6e 66 6f 2d 3e 6c 61 62 65 6c 29 29 3b 0a 09  Info->label));..
221a0 09 09 09 69 66 20 28 6c 61 62 65 6c 5f 72 65 74  ...if (label_ret
221b0 20 3e 20 30 29 20 7b 0a 09 09 09 09 09 75 73 65   > 0) {......use
221c0 5f 64 65 66 61 75 6c 74 5f 6c 61 62 65 6c 20 3d  _default_label =
221d0 20 30 3b 0a 0a 09 09 09 09 09 63 61 63 6b 65 79   0;.......cackey
221e0 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c  _slots[slotID].l
221f0 61 62 65 6c 20 3d 20 6d 61 6c 6c 6f 63 28 73 69  abel = malloc(si
22200 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6c 61 62 65  zeof(pInfo->labe
22210 6c 29 29 3b 0a 0a 09 09 09 09 09 6d 65 6d 63 70  l));.......memcp
22220 79 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73  y(cackey_slots[s
22230 6c 6f 74 49 44 5d 2e 6c 61 62 65 6c 2c 20 70 49  lotID].label, pI
22240 6e 66 6f 2d 3e 6c 61 62 65 6c 2c 20 73 69 7a 65  nfo->label, size
22250 6f 66 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 29  of(pInfo->label)
22260 29 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09  );.....}....}...
22270 09 09 63 61 63 6b 65 79 5f 66 72 65 65 5f 63 65  ..cackey_free_ce
22280 72 74 73 28 70 63 73 63 5f 69 64 65 6e 74 69 74  rts(pcsc_identit
22290 69 65 73 2c 20 6e 75 6d 5f 63 65 72 74 73 2c 20  ies, num_certs, 
222a0 31 29 3b 0a 09 09 7d 0a 09 7d 20 65 6c 73 65 20  1);...}..} else 
222b0 7b 0a 09 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f  {...memcpy(pInfo
222c0 2d 3e 6c 61 62 65 6c 2c 20 63 61 63 6b 65 79 5f  ->label, cackey_
222d0 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61  slots[slotID].la
222e0 62 65 6c 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66  bel, sizeof(pInf
222f0 6f 2d 3e 6c 61 62 65 6c 29 29 3b 0a 0a 09 09 75  o->label));....u
22300 73 65 5f 64 65 66 61 75 6c 74 5f 6c 61 62 65 6c  se_default_label
22310 20 3d 20 30 3b 0a 09 7d 0a 0a 09 69 66 20 28 75   = 0;..}...if (u
22320 73 65 5f 64 65 66 61 75 6c 74 5f 6c 61 62 65 6c  se_default_label
22330 29 20 7b 0a 09 09 6d 65 6d 63 70 79 28 70 49 6e  ) {...memcpy(pIn
22340 66 6f 2d 3e 6c 61 62 65 6c 2c 20 64 65 66 61 75  fo->label, defau
22350 6c 74 4c 61 62 65 6c 2c 20 73 69 7a 65 6f 66 28  ltLabel, sizeof(
22360 64 65 66 61 75 6c 74 4c 61 62 65 6c 29 20 2d 20  defaultLabel) - 
22370 31 29 3b 0a 09 7d 0a 0a 09 6d 65 6d 73 65 74 28  1);..}...memset(
22380 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75  pInfo->manufactu
22390 72 65 72 49 44 2c 20 27 20 27 2c 20 73 69 7a 65  rerID, ' ', size
223a0 6f 66 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61  of(pInfo->manufa
223b0 63 74 75 72 65 72 49 44 29 29 3b 0a 09 6d 65 6d  cturerID));..mem
223c0 63 70 79 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66  cpy(pInfo->manuf
223d0 61 63 74 75 72 65 72 49 44 2c 20 6d 61 6e 75 66  acturerID, manuf
223e0 61 63 74 75 72 65 72 49 44 2c 20 73 69 7a 65 6f  acturerID, sizeo
223f0 66 28 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44  f(manufacturerID
22400 29 20 2d 20 31 29 3b 0a 0a 09 6d 65 6d 73 65 74  ) - 1);...memset
22410 28 70 49 6e 66 6f 2d 3e 6d 6f 64 65 6c 2c 20 27  (pInfo->model, '
22420 20 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f   ', sizeof(pInfo
22430 2d 3e 6d 6f 64 65 6c 29 29 3b 0a 09 6d 65 6d 63  ->model));..memc
22440 70 79 28 70 49 6e 66 6f 2d 3e 6d 6f 64 65 6c 2c  py(pInfo->model,
22450 20 6d 6f 64 65 6c 2c 20 73 69 7a 65 6f 66 28 6d   model, sizeof(m
22460 6f 64 65 6c 29 20 2d 20 31 29 3b 0a 0a 09 6d 65  odel) - 1);...me
22470 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 73 65 72 69  mset(pInfo->seri
22480 61 6c 4e 75 6d 62 65 72 2c 20 27 20 27 2c 20 73  alNumber, ' ', s
22490 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 73 65 72  izeof(pInfo->ser
224a0 69 61 6c 4e 75 6d 62 65 72 29 29 3b 0a 0a 09 6d  ialNumber));...m
224b0 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 75 74 63  emset(pInfo->utc
224c0 54 69 6d 65 2c 20 27 20 27 2c 20 73 69 7a 65 6f  Time, ' ', sizeo
224d0 66 28 70 49 6e 66 6f 2d 3e 75 74 63 54 69 6d 65  f(pInfo->utcTime
224e0 29 29 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 68 61 72  ));...pInfo->har
224f0 64 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d 61 6a  dwareVersion.maj
22500 6f 72 20 3d 20 28 63 61 63 6b 65 79 5f 67 65 74  or = (cackey_get
22510 76 65 72 73 69 6f 6e 28 29 20 3e 3e 20 31 36 29  version() >> 16)
22520 20 26 20 30 78 66 66 3b 0a 09 70 49 6e 66 6f 2d   & 0xff;..pInfo-
22530 3e 68 61 72 64 77 61 72 65 56 65 72 73 69 6f 6e  >hardwareVersion
22540 2e 6d 69 6e 6f 72 20 3d 20 28 63 61 63 6b 65 79  .minor = (cackey
22550 5f 67 65 74 76 65 72 73 69 6f 6e 28 29 20 3e 3e  _getversion() >>
22560 20 38 29 20 26 20 30 78 66 66 3b 0a 0a 09 70 49   8) & 0xff;...pI
22570 6e 66 6f 2d 3e 66 69 72 6d 77 61 72 65 56 65 72  nfo->firmwareVer
22580 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 30 78 30  sion.major = 0x0
22590 30 3b 0a 09 70 49 6e 66 6f 2d 3e 66 69 72 6d 77  0;..pInfo->firmw
225a0 61 72 65 56 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72  areVersion.minor
225b0 20 3d 20 30 78 30 30 3b 0a 0a 09 70 49 6e 66 6f   = 0x00;...pInfo
225c0 2d 3e 66 6c 61 67 73 20 3d 20 43 4b 46 5f 57 52  ->flags = CKF_WR
225d0 49 54 45 5f 50 52 4f 54 45 43 54 45 44 20 7c 20  ITE_PROTECTED | 
225e0 43 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 49 4e 49  CKF_USER_PIN_INI
225f0 54 49 41 4c 49 5a 45 44 20 7c 20 43 4b 46 5f 54  TIALIZED | CKF_T
22600 4f 4b 45 4e 5f 49 4e 49 54 49 41 4c 49 5a 45 44  OKEN_INITIALIZED
22610 20 7c 20 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b   | cackey_slots[
22620 73 6c 6f 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c  slotID].token_fl
22630 61 67 73 3b 0a 0a 09 69 66 20 28 63 61 63 6b 65  ags;...if (cacke
22640 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20 21 3d  y_pin_command !=
22650 20 4e 55 4c 4c 29 20 7b 0a 09 09 70 49 6e 66 6f   NULL) {...pInfo
22660 2d 3e 66 6c 61 67 73 20 7c 3d 20 43 4b 46 5f 50  ->flags |= CKF_P
22670 52 4f 54 45 43 54 45 44 5f 41 55 54 48 45 4e 54  ROTECTED_AUTHENT
22680 49 43 41 54 49 4f 4e 5f 50 41 54 48 3b 0a 09 7d  ICATION_PATH;..}
22690 0a 0a 09 70 49 6e 66 6f 2d 3e 75 6c 4d 61 78 53  ...pInfo->ulMaxS
226a0 65 73 73 69 6f 6e 43 6f 75 6e 74 20 3d 20 28 73  essionCount = (s
226b0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
226c0 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28  sions) / sizeof(
226d0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
226e0 30 5d 29 29 20 2d 20 31 3b 0a 09 70 49 6e 66 6f  0])) - 1;..pInfo
226f0 2d 3e 75 6c 53 65 73 73 69 6f 6e 43 6f 75 6e 74  ->ulSessionCount
22700 20 3d 20 43 4b 5f 55 4e 41 56 41 49 4c 41 42 4c   = CK_UNAVAILABL
22710 45 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a 09  E_INFORMATION;..
22720 70 49 6e 66 6f 2d 3e 75 6c 4d 61 78 52 77 53 65  pInfo->ulMaxRwSe
22730 73 73 69 6f 6e 43 6f 75 6e 74 20 3d 20 30 3b 0a  ssionCount = 0;.
22740 09 70 49 6e 66 6f 2d 3e 75 6c 52 77 53 65 73 73  .pInfo->ulRwSess
22750 69 6f 6e 43 6f 75 6e 74 20 3d 20 43 4b 5f 55 4e  ionCount = CK_UN
22760 41 56 41 49 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d  AVAILABLE_INFORM
22770 41 54 49 4f 4e 3b 0a 09 70 49 6e 66 6f 2d 3e 75  ATION;..pInfo->u
22780 6c 4d 61 78 50 69 6e 4c 65 6e 20 3d 20 31 32 38  lMaxPinLen = 128
22790 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 4d 69 6e 50  ;..pInfo->ulMinP
227a0 69 6e 4c 65 6e 20 3d 20 30 3b 0a 09 70 49 6e 66  inLen = 0;..pInf
227b0 6f 2d 3e 75 6c 54 6f 74 61 6c 50 75 62 6c 69 63  o->ulTotalPublic
227c0 4d 65 6d 6f 72 79 20 3d 20 43 4b 5f 55 4e 41 56  Memory = CK_UNAV
227d0 41 49 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d 41 54  AILABLE_INFORMAT
227e0 49 4f 4e 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 46  ION;..pInfo->ulF
227f0 72 65 65 50 75 62 6c 69 63 4d 65 6d 6f 72 79 20  reePublicMemory 
22800 3d 20 43 4b 5f 55 4e 41 56 41 49 4c 41 42 4c 45  = CK_UNAVAILABLE
22810 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a 09 70  _INFORMATION;..p
22820 49 6e 66 6f 2d 3e 75 6c 54 6f 74 61 6c 50 72 69  Info->ulTotalPri
22830 76 61 74 65 4d 65 6d 6f 72 79 20 3d 20 43 4b 5f  vateMemory = CK_
22840 55 4e 41 56 41 49 4c 41 42 4c 45 5f 49 4e 46 4f  UNAVAILABLE_INFO
22850 52 4d 41 54 49 4f 4e 3b 0a 09 70 49 6e 66 6f 2d  RMATION;..pInfo-
22860 3e 75 6c 46 72 65 65 50 72 69 76 61 74 65 4d 65  >ulFreePrivateMe
22870 6d 6f 72 79 20 3d 20 43 4b 5f 55 4e 41 56 41 49  mory = CK_UNAVAI
22880 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d 41 54 49 4f  LABLE_INFORMATIO
22890 4e 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  N;...CACKEY_DEBU
228a0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
228b0 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22  ing CKR_OK (%i)"
228c0 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74  , CKR_OK);...ret
228d0 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a  urn(CKR_OK);.}..
228e0 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
228f0 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 57 61 69 74  ON(CK_RV, C_Wait
22900 46 6f 72 53 6c 6f 74 45 76 65 6e 74 29 28 43 4b  ForSlotEvent)(CK
22910 5f 46 4c 41 47 53 20 66 6c 61 67 73 2c 20 43 4b  _FLAGS flags, CK
22920 5f 53 4c 4f 54 5f 49 44 5f 50 54 52 20 70 53 6c  _SLOT_ID_PTR pSl
22930 6f 74 49 44 2c 20 43 4b 5f 56 4f 49 44 5f 50 54  otID, CK_VOID_PT
22940 52 20 70 52 65 73 65 72 76 65 64 29 20 7b 0a 09  R pReserved) {..
22950 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
22960 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
22970 0a 09 69 66 20 28 70 52 65 73 65 72 76 65 64 20  ..if (pReserved 
22980 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43  != NULL) {...CAC
22990 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
229a0 28 22 45 72 72 6f 72 2e 20 70 52 65 73 65 72 76  ("Error. pReserv
229b0 65 64 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 22  ed is not NULL."
229c0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
229d0 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b  _ARGUMENTS_BAD);
229e0 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ..}...if (!cacke
229f0 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
22a00 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
22a10 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
22a20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
22a30 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
22a40 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
22a50 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
22a60 0a 09 2f 2a 20 58 58 58 3a 20 54 4f 44 4f 3a 20  ../* XXX: TODO: 
22a70 49 6d 70 6c 65 6d 65 6e 74 20 74 68 69 73 2e 2e  Implement this..
22a80 2e 20 2a 2f 0a 09 43 41 43 4b 45 59 5f 44 45 42  . */..CACKEY_DEB
22a90 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
22aa0 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
22ab0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
22ac0 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
22ad0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
22ae0 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
22af0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
22b00 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
22b10 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
22b20 43 4b 5f 52 56 2c 20 43 5f 47 65 74 4d 65 63 68  CK_RV, C_GetMech
22b30 61 6e 69 73 6d 4c 69 73 74 29 28 43 4b 5f 53 4c  anismList)(CK_SL
22b40 4f 54 5f 49 44 20 73 6c 6f 74 49 44 2c 20 43 4b  OT_ID slotID, CK
22b50 5f 4d 45 43 48 41 4e 49 53 4d 5f 54 59 50 45 5f  _MECHANISM_TYPE_
22b60 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 4c 69  PTR pMechanismLi
22b70 73 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52  st, CK_ULONG_PTR
22b80 20 70 75 6c 43 6f 75 6e 74 29 20 7b 0a 09 43 41   pulCount) {..CA
22b90 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
22ba0 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
22bb0 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
22bc0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
22bd0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
22be0 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
22bf0 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
22c00 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
22c10 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
22c20 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  IZED);..}...if (
22c30 70 75 6c 43 6f 75 6e 74 20 3d 3d 20 4e 55 4c 4c  pulCount == NULL
22c40 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
22c50 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
22c60 2e 20 20 70 75 6c 43 6f 75 6e 74 20 69 73 20 4e  .  pulCount is N
22c70 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  ULL.");....retur
22c80 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f  n(CKR_ARGUMENTS_
22c90 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70  BAD);..}...if (p
22ca0 4d 65 63 68 61 6e 69 73 6d 4c 69 73 74 20 3d 3d  MechanismList ==
22cb0 20 4e 55 4c 4c 29 20 7b 0a 09 09 2a 70 75 6c 43   NULL) {...*pulC
22cc0 6f 75 6e 74 20 3d 20 31 3b 0a 0a 09 09 43 41 43  ount = 1;....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 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
22d10 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 2a  _OK);..}...if (*
22d20 70 75 6c 43 6f 75 6e 74 20 3c 20 31 29 20 7b 0a  pulCount < 1) {.
22d30 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
22d40 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 42  RINTF("Error.  B
22d50 75 66 66 65 72 20 74 6f 6f 20 73 6d 61 6c 6c 2e  uffer too small.
22d60 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
22d70 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41  R_BUFFER_TOO_SMA
22d80 4c 4c 29 3b 0a 09 7d 0a 0a 09 70 4d 65 63 68 61  LL);..}...pMecha
22d90 6e 69 73 6d 4c 69 73 74 5b 30 5d 20 3d 20 43 4b  nismList[0] = CK
22da0 4d 5f 52 53 41 5f 50 4b 43 53 3b 0a 09 2a 70 75  M_RSA_PKCS;..*pu
22db0 6c 43 6f 75 6e 74 20 3d 20 31 3b 0a 0a 09 43 41  lCount = 1;...CA
22dc0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
22dd0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
22de0 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f  _OK (%i)", CKR_O
22df0 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  K);...return(CKR
22e00 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  _OK);.}..CK_DEFI
22e10 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
22e20 56 2c 20 43 5f 47 65 74 4d 65 63 68 61 6e 69 73  V, C_GetMechanis
22e30 6d 49 6e 66 6f 29 28 43 4b 5f 53 4c 4f 54 5f 49  mInfo)(CK_SLOT_I
22e40 44 20 73 6c 6f 74 49 44 2c 20 43 4b 5f 4d 45 43  D slotID, CK_MEC
22e50 48 41 4e 49 53 4d 5f 54 59 50 45 20 74 79 70 65  HANISM_TYPE type
22e60 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 49  , CK_MECHANISM_I
22e70 4e 46 4f 5f 50 54 52 20 70 49 6e 66 6f 29 20 7b  NFO_PTR pInfo) {
22e80 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76  ..int mutex_retv
22e90 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  al;...CACKEY_DEB
22ea0 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
22eb0 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70 49 6e 66  d.");...if (pInf
22ec0 6f 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  o == NULL) {...C
22ed0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
22ee0 54 46 28 22 45 72 72 6f 72 2e 20 70 49 6e 66 6f  TF("Error. pInfo
22ef0 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09   is NULL.");....
22f00 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d  return(CKR_ARGUM
22f10 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09  ENTS_BAD);..}...
22f20 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
22f30 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
22f40 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
22f50 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
22f60 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
22f70 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
22f80 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
22f90 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  IZED);..}...if (
22fa0 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c  slotID < 0 || sl
22fb0 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28  otID >= (sizeof(
22fc0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20  cackey_slots) / 
22fd0 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
22fe0 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41  ots[0]))) {...CA
22ff0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
23000 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69  F("Error. Invali
23010 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64  d slot requested
23020 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20   (%lu), outside 
23030 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c  of valid range",
23040 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74   slotID);....ret
23050 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f  urn(CKR_SLOT_ID_
23060 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d  INVALID);..}...m
23070 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
23080 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28  ckey_mutex_lock(
23090 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
230a0 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
230b0 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
230c0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
230d0 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e  ("Error.  Lockin
230e0 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
230f0 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
23100 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
23110 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  if (cackey_slots
23120 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65 20  [slotID].active 
23130 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  == 0) {...CACKEY
23140 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
23150 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c  rror. Invalid sl
23160 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c  ot requested (%l
23170 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72  u), slot not cur
23180 72 65 6e 74 6c 79 20 61 63 74 69 76 65 22 2c 20  rently active", 
23190 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b  slotID);....cack
231a0 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
231b0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
231c0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
231d0 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b  LOT_ID_INVALID);
231e0 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  ..}...mutex_retv
231f0 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
23200 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
23210 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
23220 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
23230 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
23240 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
23250 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69  .  Unlocking fai
23260 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
23270 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
23280 52 4f 52 29 3b 0a 09 7d 0a 0a 09 73 77 69 74 63  ROR);..}...switc
23290 68 20 28 74 79 70 65 29 20 7b 0a 09 09 63 61 73  h (type) {...cas
232a0 65 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 3a 0a  e CKM_RSA_PKCS:.
232b0 09 09 09 70 49 6e 66 6f 2d 3e 75 6c 4d 69 6e 4b  ...pInfo->ulMinK
232c0 65 79 53 69 7a 65 20 3d 20 35 31 32 3b 0a 09 09  eySize = 512;...
232d0 09 70 49 6e 66 6f 2d 3e 75 6c 4d 61 78 4b 65 79  .pInfo->ulMaxKey
232e0 53 69 7a 65 20 3d 20 38 31 39 32 3b 0a 09 09 09  Size = 8192;....
232f0 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20 3d 20 43  pInfo->flags = C
23300 4b 46 5f 48 57 20 7c 20 43 4b 46 5f 45 4e 43 52  KF_HW | CKF_ENCR
23310 59 50 54 20 7c 20 43 4b 46 5f 44 45 43 52 59 50  YPT | CKF_DECRYP
23320 54 20 7c 20 43 4b 46 5f 53 49 47 4e 20 7c 20 43  T | CKF_SIGN | C
23330 4b 46 5f 56 45 52 49 46 59 3b 0a 09 09 09 62 72  KF_VERIFY;....br
23340 65 61 6b 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  eak;..}...CACKEY
23350 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
23360 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20  eturning CKR_OK 
23370 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a  (%i)", CKR_OK);.
23380 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29  ..return(CKR_OK)
23390 3b 0a 7d 0a 0a 2f 2a 20 57 65 20 64 6f 6e 27 74  ;.}../* We don't
233a0 20 73 75 70 70 6f 72 74 20 74 68 69 73 20 6d 65   support this me
233b0 74 68 6f 64 2e 20 2a 2f 0a 43 4b 5f 44 45 46 49  thod. */.CK_DEFI
233c0 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
233d0 56 2c 20 43 5f 49 6e 69 74 54 6f 6b 65 6e 29 28  V, C_InitToken)(
233e0 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49  CK_SLOT_ID slotI
233f0 44 2c 20 43 4b 5f 55 54 46 38 43 48 41 52 5f 50  D, CK_UTF8CHAR_P
23400 54 52 20 70 50 69 6e 2c 20 43 4b 5f 55 4c 4f 4e  TR pPin, CK_ULON
23410 47 20 75 6c 50 69 6e 4c 65 6e 2c 20 43 4b 5f 55  G ulPinLen, CK_U
23420 54 46 38 43 48 41 52 5f 50 54 52 20 70 4c 61 62  TF8CHAR_PTR pLab
23430 65 6c 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  el) {..CACKEY_DE
23440 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
23450 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
23460 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
23470 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
23480 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
23490 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
234a0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
234b0 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
234c0 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
234d0 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
234e0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
234f0 69 6e 67 20 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52  ing CKR_TOKEN_WR
23500 49 54 45 5f 50 52 4f 54 45 43 54 45 44 20 28 25  ITE_PROTECTED (%
23510 69 29 22 2c 20 43 4b 52 5f 54 4f 4b 45 4e 5f 57  i)", CKR_TOKEN_W
23520 52 49 54 45 5f 50 52 4f 54 45 43 54 45 44 29 3b  RITE_PROTECTED);
23530 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 54 4f  ...return(CKR_TO
23540 4b 45 4e 5f 57 52 49 54 45 5f 50 52 4f 54 45 43  KEN_WRITE_PROTEC
23550 54 45 44 29 3b 0a 7d 0a 0a 2f 2a 20 57 65 20 64  TED);.}../* We d
23560 6f 6e 27 74 20 73 75 70 70 6f 72 74 20 74 68 69  on't support thi
23570 73 20 6d 65 74 68 6f 64 2e 20 2a 2f 0a 43 4b 5f  s method. */.CK_
23580 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
23590 43 4b 5f 52 56 2c 20 43 5f 49 6e 69 74 50 49 4e  CK_RV, C_InitPIN
235a0 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
235b0 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
235c0 5f 55 54 46 38 43 48 41 52 5f 50 54 52 20 70 50  _UTF8CHAR_PTR pP
235d0 69 6e 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50  in, CK_ULONG ulP
235e0 69 6e 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59  inLen) {..CACKEY
235f0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
23600 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
23610 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
23620 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
23630 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
23640 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
23650 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
23660 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
23670 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
23680 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
23690 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
236a0 75 72 6e 69 6e 67 20 43 4b 52 5f 54 4f 4b 45 4e  urning CKR_TOKEN
236b0 5f 57 52 49 54 45 5f 50 52 4f 54 45 43 54 45 44  _WRITE_PROTECTED
236c0 20 28 25 69 29 22 2c 20 43 4b 52 5f 54 4f 4b 45   (%i)", CKR_TOKE
236d0 4e 5f 57 52 49 54 45 5f 50 52 4f 54 45 43 54 45  N_WRITE_PROTECTE
236e0 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
236f0 5f 54 4f 4b 45 4e 5f 57 52 49 54 45 5f 50 52 4f  _TOKEN_WRITE_PRO
23700 54 45 43 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  TECTED);.}..CK_D
23710 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
23720 4b 5f 52 56 2c 20 43 5f 53 65 74 50 49 4e 29 28  K_RV, C_SetPIN)(
23730 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
23740 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 55  E hSession, CK_U
23750 54 46 38 43 48 41 52 5f 50 54 52 20 70 4f 6c 64  TF8CHAR_PTR pOld
23760 50 69 6e 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  Pin, CK_ULONG ul
23770 4f 6c 64 50 69 6e 4c 65 6e 2c 20 43 4b 5f 55 54  OldPinLen, CK_UT
23780 46 38 43 48 41 52 5f 50 54 52 20 70 4e 65 77 50  F8CHAR_PTR pNewP
23790 69 6e 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 4e  in, CK_ULONG ulN
237a0 65 77 50 69 6e 4c 65 6e 29 20 7b 0a 09 63 68 61  ewPinLen) {..cha
237b0 72 20 6f 6c 64 70 69 6e 62 75 66 5b 36 34 5d 2c  r oldpinbuf[64],
237c0 20 6e 65 77 70 69 6e 62 75 66 5b 36 34 5d 3b 0a   newpinbuf[64];.
237d0 09 63 61 63 6b 65 79 5f 72 65 74 20 73 65 74 5f  .cackey_ret set_
237e0 70 69 6e 5f 72 65 74 2c 20 67 65 74 5f 70 69 6e  pin_ret, get_pin
237f0 5f 72 65 74 3b 0a 09 43 4b 5f 53 4c 4f 54 5f 49  _ret;..CK_SLOT_I
23800 44 20 73 6c 6f 74 49 44 3b 0a 09 69 6e 74 20 6d  D slotID;..int m
23810 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43  utex_retval;...C
23820 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
23830 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
23840 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
23850 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
23860 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
23870 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
23880 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
23890 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
238a0 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
238b0 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74  LIZED);..}...mut
238c0 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
238d0 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61  ey_mutex_lock(ca
238e0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
238f0 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
23900 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
23910 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
23920 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20  Error.  Locking 
23930 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
23940 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
23950 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66  _ERROR);..}...if
23960 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   (!cackey_sessio
23970 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74  ns[hSession].act
23980 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  ive) {...cackey_
23990 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
239a0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
239b0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
239c0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65  INTF("Error.  Se
239d0 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65  ssion not active
239e0 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
239f0 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  (CKR_SESSION_HAN
23a00 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  DLE_INVALID);..}
23a10 0a 0a 09 73 6c 6f 74 49 44 20 3d 20 63 61 63 6b  ...slotID = cack
23a20 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
23a30 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44 3b 0a 0a 09  sion].slotID;...
23a40 69 66 20 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c  if (slotID < 0 |
23a50 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a  | slotID >= (siz
23a60 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
23a70 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
23a80 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a  y_slots[0]))) {.
23a90 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
23aa0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e  RINTF("Error. In
23ab0 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65  valid slot reque
23ac0 73 74 65 64 20 28 25 6c 75 29 2c 20 6f 75 74 73  sted (%lu), outs
23ad0 69 64 65 20 6f 66 20 76 61 6c 69 64 20 72 61 6e  ide of valid ran
23ae0 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09  ge", slotID);...
23af0 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
23b00 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
23b10 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  ock);....return(
23b20 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
23b30 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63  R);..}...if (cac
23b40 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44  key_slots[slotID
23b50 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 29 20 7b  ].active == 0) {
23b60 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
23b70 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49  PRINTF("Error. I
23b80 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75  nvalid slot requ
23b90 65 73 74 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f  ested (%lu), slo
23ba0 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20  t not currently 
23bb0 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 29  active", slotID)
23bc0 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65  ;....cackey_mute
23bd0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
23be0 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74  biglock);....ret
23bf0 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
23c00 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20  ERROR);..}...if 
23c10 28 63 61 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d  (cackey_pin_comm
23c20 61 6e 64 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  and != NULL) {..
23c30 09 2f 2a 20 47 65 74 20 6f 6c 64 20 50 49 4e 20  ./* Get old PIN 
23c40 2a 2f 0a 09 09 67 65 74 5f 70 69 6e 5f 72 65 74  */...get_pin_ret
23c50 20 3d 20 63 61 63 6b 65 79 5f 67 65 74 5f 70 69   = cackey_get_pi
23c60 6e 28 6f 6c 64 70 69 6e 62 75 66 29 3b 0a 0a 09  n(oldpinbuf);...
23c70 09 69 66 20 28 67 65 74 5f 70 69 6e 5f 72 65 74  .if (get_pin_ret
23c80 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f   != CACKEY_PCSC_
23c90 53 5f 4f 4b 29 20 7b 0a 09 09 09 43 41 43 4b 45  S_OK) {....CACKE
23ca0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
23cb0 45 72 72 6f 72 20 77 68 69 6c 65 20 67 65 74 74  Error while gett
23cc0 69 6e 67 20 4f 6c 64 20 50 49 4e 2c 20 72 65 74  ing Old PIN, ret
23cd0 75 72 6e 69 6e 67 20 43 4b 52 5f 50 49 4e 5f 49  urning CKR_PIN_I
23ce0 4e 43 4f 52 52 45 43 54 2e 22 29 3b 0a 0a 09 09  NCORRECT.");....
23cf0 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
23d00 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
23d10 6f 63 6b 29 3b 0a 09 09 09 0a 09 09 09 72 65 74  ock);........ret
23d20 75 72 6e 28 43 4b 52 5f 50 49 4e 5f 49 4e 43 4f  urn(CKR_PIN_INCO
23d30 52 52 45 43 54 29 3b 0a 09 09 7d 0a 0a 09 09 70  RRECT);...}....p
23d40 4f 6c 64 50 69 6e 20 3d 20 28 43 4b 5f 55 54 46  OldPin = (CK_UTF
23d50 38 43 48 41 52 5f 50 54 52 29 20 6f 6c 64 70 69  8CHAR_PTR) oldpi
23d60 6e 62 75 66 3b 0a 09 09 75 6c 4f 6c 64 50 69 6e  nbuf;...ulOldPin
23d70 4c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 6f 6c 64  Len = strlen(old
23d80 70 69 6e 62 75 66 29 3b 0a 0a 09 09 2f 2a 20 47  pinbuf);..../* G
23d90 65 74 20 6e 65 77 20 50 49 4e 20 2a 2f 0a 09 09  et new PIN */...
23da0 67 65 74 5f 70 69 6e 5f 72 65 74 20 3d 20 63 61  get_pin_ret = ca
23db0 63 6b 65 79 5f 67 65 74 5f 70 69 6e 28 6e 65 77  ckey_get_pin(new
23dc0 70 69 6e 62 75 66 29 3b 0a 0a 09 09 69 66 20 28  pinbuf);....if (
23dd0 67 65 74 5f 70 69 6e 5f 72 65 74 20 21 3d 20 43  get_pin_ret != C
23de0 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29  ACKEY_PCSC_S_OK)
23df0 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
23e00 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
23e10 20 77 68 69 6c 65 20 67 65 74 74 69 6e 67 20 4e   while getting N
23e20 65 77 20 50 49 4e 2c 20 72 65 74 75 72 6e 69 6e  ew PIN, returnin
23e30 67 20 43 4b 52 5f 50 49 4e 5f 49 4e 56 41 4c 49  g CKR_PIN_INVALI
23e40 44 2e 22 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79  D.");.....cackey
23e50 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
23e60 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
23e70 09 09 0a 09 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
23e80 5f 50 49 4e 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  _PIN_INVALID);..
23e90 09 7d 0a 0a 09 09 70 4e 65 77 50 69 6e 20 3d 20  .}....pNewPin = 
23ea0 28 43 4b 5f 55 54 46 38 43 48 41 52 5f 50 54 52  (CK_UTF8CHAR_PTR
23eb0 29 20 6e 65 77 70 69 6e 62 75 66 3b 0a 09 09 75  ) newpinbuf;...u
23ec0 6c 4e 65 77 50 69 6e 4c 65 6e 20 3d 20 73 74 72  lNewPinLen = str
23ed0 6c 65 6e 28 6e 65 77 70 69 6e 62 75 66 29 3b 0a  len(newpinbuf);.
23ee0 09 7d 0a 0a 09 69 66 20 28 70 4f 6c 64 50 69 6e  .}...if (pOldPin
23ef0 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
23f00 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
23f10 46 28 22 4f 6c 64 20 50 49 4e 20 76 61 6c 75 65  F("Old PIN value
23f20 20 69 73 20 77 72 6f 6e 67 20 28 6e 75 6c 6c 29   is wrong (null)
23f30 2e 22 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d  .");....cackey_m
23f40 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
23f50 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
23f60 72 65 74 75 72 6e 28 43 4b 52 5f 50 49 4e 5f 49  return(CKR_PIN_I
23f70 4e 43 4f 52 52 45 43 54 29 3b 0a 09 7d 0a 0a 09  NCORRECT);..}...
23f80 69 66 20 28 75 6c 4f 6c 64 50 69 6e 4c 65 6e 20  if (ulOldPinLen 
23f90 3d 3d 20 30 20 7c 7c 20 75 6c 4f 6c 64 50 69 6e  == 0 || ulOldPin
23fa0 4c 65 6e 20 3e 20 38 29 20 7b 0a 09 09 43 41 43  Len > 8) {...CAC
23fb0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
23fc0 28 22 4f 6c 64 20 50 49 4e 20 6c 65 6e 67 74 68  ("Old PIN length
23fd0 20 69 73 20 77 72 6f 6e 67 3a 20 25 6c 75 2e 22   is wrong: %lu."
23fe0 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
23ff0 29 20 75 6c 4f 6c 64 50 69 6e 4c 65 6e 29 3b 0a  ) ulOldPinLen);.
24000 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
24010 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
24020 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72  glock);....retur
24030 6e 28 43 4b 52 5f 50 49 4e 5f 49 4e 43 4f 52 52  n(CKR_PIN_INCORR
24040 45 43 54 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70  ECT);..}...if (p
24050 4e 65 77 50 69 6e 20 3d 3d 20 4e 55 4c 4c 29 20  NewPin == NULL) 
24060 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
24070 5f 50 52 49 4e 54 46 28 22 4e 65 77 20 50 49 4e  _PRINTF("New PIN
24080 20 76 61 6c 75 65 20 69 73 20 77 72 6f 6e 67 20   value is wrong 
24090 28 65 69 74 68 65 72 20 4e 55 4c 4c 2c 20 6f 72  (either NULL, or
240a0 20 74 6f 6f 20 6c 6f 6e 67 2f 73 68 6f 72 74 29   too long/short)
240b0 2e 22 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d  .");....cackey_m
240c0 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
240d0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
240e0 72 65 74 75 72 6e 28 43 4b 52 5f 50 49 4e 5f 49  return(CKR_PIN_I
240f0 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66  NVALID);..}...if
24100 20 28 75 6c 4e 65 77 50 69 6e 4c 65 6e 20 3c 20   (ulNewPinLen < 
24110 35 20 7c 7c 20 75 6c 4e 65 77 50 69 6e 4c 65 6e  5 || ulNewPinLen
24120 20 3e 20 38 29 20 7b 0a 09 09 43 41 43 4b 45 59   > 8) {...CACKEY
24130 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4e  _DEBUG_PRINTF("N
24140 65 77 20 50 49 4e 20 6c 65 6e 67 74 68 20 69 73  ew PIN length is
24150 20 77 72 6f 6e 67 3a 20 25 6c 75 2c 20 6d 75 73   wrong: %lu, mus
24160 74 20 62 65 20 61 74 6c 65 61 73 74 20 35 20 61  t be atleast 5 a
24170 6e 64 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20  nd no more than 
24180 38 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  8.", (unsigned l
24190 6f 6e 67 29 20 75 6c 4e 65 77 50 69 6e 4c 65 6e  ong) ulNewPinLen
241a0 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  );....cackey_mut
241b0 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
241c0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65  _biglock);....re
241d0 74 75 72 6e 28 43 4b 52 5f 50 49 4e 5f 4c 45 4e  turn(CKR_PIN_LEN
241e0 5f 52 41 4e 47 45 29 3b 0a 09 7d 0a 0a 09 73 65  _RANGE);..}...se
241f0 74 5f 70 69 6e 5f 72 65 74 20 3d 20 63 61 63 6b  t_pin_ret = cack
24200 65 79 5f 73 65 74 5f 70 69 6e 28 26 63 61 63 6b  ey_set_pin(&cack
24210 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
24220 2c 20 70 4f 6c 64 50 69 6e 2c 20 75 6c 4f 6c 64  , pOldPin, ulOld
24230 50 69 6e 4c 65 6e 2c 20 70 4e 65 77 50 69 6e 2c  PinLen, pNewPin,
24240 20 75 6c 4e 65 77 50 69 6e 4c 65 6e 29 3b 0a 0a   ulNewPinLen);..
24250 09 69 66 20 28 73 65 74 5f 70 69 6e 5f 72 65 74  .if (set_pin_ret
24260 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f   != CACKEY_PCSC_
24270 53 5f 4f 4b 29 20 7b 0a 09 09 69 66 20 28 63 61  S_OK) {...if (ca
24280 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64  ckey_pin_command
24290 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 63   == NULL) {....c
242a0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
242b0 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20  ID].token_flags 
242c0 7c 3d 20 43 4b 46 5f 4c 4f 47 49 4e 5f 52 45 51  |= CKF_LOGIN_REQ
242d0 55 49 52 45 44 3b 0a 09 09 7d 0a 0a 09 09 69 66  UIRED;...}....if
242e0 20 28 73 65 74 5f 70 69 6e 5f 72 65 74 20 3d 3d   (set_pin_ret ==
242f0 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4c   CACKEY_PCSC_E_L
24300 4f 43 4b 45 44 29 20 7b 0a 09 09 09 63 61 63 6b  OCKED) {....cack
24310 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
24320 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 7c 3d 20  .token_flags |= 
24330 43 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 4c 4f 43  CKF_USER_PIN_LOC
24340 4b 45 44 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 6d 75  KED;...}..}...mu
24350 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
24360 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
24370 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
24380 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
24390 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
243a0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
243b0 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63  F("Error.  Unloc
243c0 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
243d0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
243e0 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
243f0 0a 0a 09 73 77 69 74 63 68 20 28 73 65 74 5f 70  ...switch (set_p
24400 69 6e 5f 72 65 74 29 20 7b 0a 09 09 63 61 73 65  in_ret) {...case
24410 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f   CACKEY_PCSC_S_O
24420 4b 3a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42  K:....CACKEY_DEB
24430 55 47 5f 50 52 49 4e 54 46 28 22 53 75 63 63 65  UG_PRINTF("Succe
24440 73 73 66 75 6c 6c 79 20 73 65 74 20 50 49 4e 2e  ssfully set PIN.
24450 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43  ");.....return(C
24460 4b 52 5f 4f 4b 29 3b 0a 09 09 63 61 73 65 20 43  KR_OK);...case C
24470 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 42 41 44  ACKEY_PCSC_E_BAD
24480 50 49 4e 3a 0a 09 09 09 43 41 43 4b 45 59 5f 44  PIN:....CACKEY_D
24490 45 42 55 47 5f 50 52 49 4e 54 46 28 22 50 49 4e  EBUG_PRINTF("PIN
244a0 20 77 61 73 20 69 6e 76 61 6c 69 64 2e 22 29 3b   was invalid.");
244b0 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
244c0 50 49 4e 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 09  PIN_INVALID);...
244d0 63 61 73 65 20 43 41 43 4b 45 59 5f 50 43 53 43  case CACKEY_PCSC
244e0 5f 45 5f 4c 4f 43 4b 45 44 3a 0a 09 09 09 43 41  _E_LOCKED:....CA
244f0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
24500 46 28 22 54 6f 6b 65 6e 20 69 73 20 6c 6f 63 6b  F("Token is lock
24510 65 64 20 6f 72 20 74 68 69 73 20 63 68 61 6e 67  ed or this chang
24520 65 20 69 73 20 6e 6f 74 20 70 65 72 6d 69 74 74  e is not permitt
24530 65 64 2e 22 29 3b 0a 0a 09 09 09 72 65 74 75 72  ed.");.....retur
24540 6e 28 43 4b 52 5f 50 49 4e 5f 4c 4f 43 4b 45 44  n(CKR_PIN_LOCKED
24550 29 3b 0a 09 09 64 65 66 61 75 6c 74 3a 0a 09 09  );...default:...
24560 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
24570 49 4e 54 46 28 22 53 6f 6d 65 74 68 69 6e 67 20  INTF("Something 
24580 65 6c 73 65 20 77 65 6e 74 20 77 72 6f 6e 67 20  else went wrong 
24590 63 68 61 6e 67 69 6e 67 20 74 68 65 20 50 49 4e  changing the PIN
245a0 3a 20 25 69 22 2c 20 73 65 74 5f 70 69 6e 5f 72  : %i", set_pin_r
245b0 65 74 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28  et);.....return(
245c0 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
245d0 52 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28  R);..}...return(
245e0 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
245f0 52 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  R);.}..CK_DEFINE
24600 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
24610 20 43 5f 4f 70 65 6e 53 65 73 73 69 6f 6e 29 28   C_OpenSession)(
24620 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49  CK_SLOT_ID slotI
24630 44 2c 20 43 4b 5f 46 4c 41 47 53 20 66 6c 61 67  D, CK_FLAGS flag
24640 73 2c 20 43 4b 5f 56 4f 49 44 5f 50 54 52 20 70  s, CK_VOID_PTR p
24650 41 70 70 6c 69 63 61 74 69 6f 6e 2c 20 43 4b 5f  Application, CK_
24660 4e 4f 54 49 46 59 20 6e 6f 74 69 66 79 2c 20 43  NOTIFY notify, C
24670 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
24680 5f 50 54 52 20 70 68 53 65 73 73 69 6f 6e 29 20  _PTR phSession) 
24690 7b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  {..unsigned long
246a0 20 69 64 78 3b 0a 09 69 6e 74 20 6d 75 74 65 78   idx;..int mutex
246b0 5f 72 65 74 76 61 6c 3b 0a 09 69 6e 74 20 66 6f  _retval;..int fo
246c0 75 6e 64 5f 73 65 73 73 69 6f 6e 20 3d 20 30 3b  und_session = 0;
246d0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
246e0 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
246f0 29 3b 0a 0a 09 69 66 20 28 28 66 6c 61 67 73 20  );...if ((flags 
24700 26 20 43 4b 46 5f 53 45 52 49 41 4c 5f 53 45 53  & CKF_SERIAL_SES
24710 53 49 4f 4e 29 20 21 3d 20 43 4b 46 5f 53 45 52  SION) != CKF_SER
24720 49 41 4c 5f 53 45 53 53 49 4f 4e 29 20 7b 0a 09  IAL_SESSION) {..
24730 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
24740 49 4f 4e 5f 50 41 52 41 4c 4c 45 4c 5f 4e 4f 54  ION_PARALLEL_NOT
24750 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 09 7d 0a  _SUPPORTED);..}.
24760 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
24770 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
24780 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
24790 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
247a0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
247b0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
247c0 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
247d0 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66  ALIZED);..}...if
247e0 20 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20   (slotID < 0 || 
247f0 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f  slotID >= (sizeo
24800 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20  f(cackey_slots) 
24810 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f  / sizeof(cackey_
24820 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09  slots[0]))) {...
24830 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
24840 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61  NTF("Error. Inva
24850 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74  lid slot request
24860 65 64 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 64  ed (%lu), outsid
24870 65 20 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 65  e of valid range
24880 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72  ", slotID);....r
24890 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49  eturn(CKR_SLOT_I
248a0 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  D_INVALID);..}..
248b0 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
248c0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63  cackey_mutex_loc
248d0 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
248e0 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
248f0 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
24900 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
24910 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b  TF("Error.  Lock
24920 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
24930 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
24940 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
24950 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f  ..if (cackey_slo
24960 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76  ts[slotID].activ
24970 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  e == 0) {...CACK
24980 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
24990 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20  "Error. Invalid 
249a0 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28  slot requested (
249b0 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63  %lu), slot not c
249c0 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 22  urrently active"
249d0 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61  , slotID);....ca
249e0 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
249f0 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
24a00 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
24a10 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44  _SLOT_ID_INVALID
24a20 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 56 65 72 69 66  );..}.../* Verif
24a30 79 20 74 68 61 74 20 74 68 65 20 63 61 72 64 20  y that the card 
24a40 69 73 20 61 63 74 75 61 6c 6c 79 20 69 6e 20 74  is actually in t
24a50 68 65 20 73 6c 6f 74 2e 20 2a 2f 0a 09 2f 2a 20  he slot. */../* 
24a60 58 58 58 3a 20 43 68 65 63 6b 20 74 6f 20 6d 61  XXX: Check to ma
24a70 6b 65 20 73 75 72 65 20 74 68 69 73 20 69 73 20  ke sure this is 
24a80 69 6e 20 74 68 65 20 50 4b 43 53 23 31 31 20 73  in the PKCS#11 s
24a90 70 65 63 69 66 69 63 61 74 69 6f 6e 20 2a 2f 0a  pecification */.
24aa0 09 69 66 20 28 63 61 63 6b 65 79 5f 74 6f 6b 65  .if (cackey_toke
24ab0 6e 5f 70 72 65 73 65 6e 74 28 26 63 61 63 6b 65  n_present(&cacke
24ac0 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 29  y_slots[slotID])
24ad0 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f   != CACKEY_PCSC_
24ae0 53 5f 54 4f 4b 45 4e 50 52 45 53 45 4e 54 29 20  S_TOKENPRESENT) 
24af0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
24b00 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
24b10 20 43 61 72 64 20 6e 6f 74 20 70 72 65 73 65 6e   Card not presen
24b20 74 2e 20 20 52 65 74 75 72 6e 69 6e 67 20 43 4b  t.  Returning CK
24b30 52 5f 44 45 56 49 43 45 5f 52 45 4d 4f 56 45 44  R_DEVICE_REMOVED
24b40 22 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75  ");....cackey_mu
24b50 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
24b60 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72  y_biglock);....r
24b70 65 74 75 72 6e 28 43 4b 52 5f 44 45 56 49 43 45  eturn(CKR_DEVICE
24b80 5f 52 45 4d 4f 56 45 44 29 3b 0a 09 7d 0a 0a 09  _REMOVED);..}...
24b90 66 6f 72 20 28 69 64 78 20 3d 20 31 3b 20 69 64  for (idx = 1; id
24ba0 78 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b  x < (sizeof(cack
24bb0 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73  ey_sessions) / s
24bc0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
24bd0 73 69 6f 6e 73 5b 30 5d 29 29 3b 20 69 64 78 2b  sions[0])); idx+
24be0 2b 29 20 7b 0a 09 09 69 66 20 28 21 63 61 63 6b  +) {...if (!cack
24bf0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d  ey_sessions[idx]
24c00 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 09 66 6f  .active) {....fo
24c10 75 6e 64 5f 73 65 73 73 69 6f 6e 20 3d 20 31 3b  und_session = 1;
24c20 0a 0a 09 09 09 2a 70 68 53 65 73 73 69 6f 6e 20  .....*phSession 
24c30 3d 20 69 64 78 3b 0a 0a 09 09 09 63 61 63 6b 65  = idx;.....cacke
24c40 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e  y_sessions[idx].
24c50 61 63 74 69 76 65 20 3d 20 31 3b 0a 09 09 09 63  active = 1;....c
24c60 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69  ackey_sessions[i
24c70 64 78 5d 2e 73 6c 6f 74 49 44 20 3d 20 73 6c 6f  dx].slotID = slo
24c80 74 49 44 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73  tID;....cackey_s
24c90 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 73 74 61  essions[idx].sta
24ca0 74 65 20 3d 20 43 4b 53 5f 52 4f 5f 50 55 42 4c  te = CKS_RO_PUBL
24cb0 49 43 5f 53 45 53 53 49 4f 4e 3b 0a 09 09 09 63  IC_SESSION;....c
24cc0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69  ackey_sessions[i
24cd0 64 78 5d 2e 66 6c 61 67 73 20 3d 20 66 6c 61 67  dx].flags = flag
24ce0 73 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73  s;....cackey_ses
24cf0 73 69 6f 6e 73 5b 69 64 78 5d 2e 75 6c 44 65 76  sions[idx].ulDev
24d00 69 63 65 45 72 72 6f 72 20 3d 20 30 3b 0a 09 09  iceError = 0;...
24d10 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
24d20 5b 69 64 78 5d 2e 70 41 70 70 6c 69 63 61 74 69  [idx].pApplicati
24d30 6f 6e 20 3d 20 70 41 70 70 6c 69 63 61 74 69 6f  on = pApplicatio
24d40 6e 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73  n;....cackey_ses
24d50 73 69 6f 6e 73 5b 69 64 78 5d 2e 4e 6f 74 69 66  sions[idx].Notif
24d60 79 20 3d 20 6e 6f 74 69 66 79 3b 0a 0a 09 09 09  y = notify;.....
24d70 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
24d80 69 64 78 5d 2e 69 64 65 6e 74 69 74 69 65 73 20  idx].identities 
24d90 3d 20 4e 55 4c 4c 3b 0a 09 09 09 63 61 63 6b 65  = NULL;....cacke
24da0 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e  y_sessions[idx].
24db0 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74  identities_count
24dc0 20 3d 20 30 3b 0a 0a 09 09 09 63 61 63 6b 65 79   = 0;.....cackey
24dd0 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 73  _sessions[idx].s
24de0 65 61 72 63 68 5f 61 63 74 69 76 65 20 3d 20 30  earch_active = 0
24df0 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73  ;.....cackey_ses
24e00 73 69 6f 6e 73 5b 69 64 78 5d 2e 73 69 67 6e 5f  sions[idx].sign_
24e10 61 63 74 69 76 65 20 3d 20 30 3b 0a 0a 09 09 09  active = 0;.....
24e20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
24e30 69 64 78 5d 2e 64 65 63 72 79 70 74 5f 61 63 74  idx].decrypt_act
24e40 69 76 65 20 3d 20 30 3b 0a 0a 09 09 09 63 61 63  ive = 0;.....cac
24e50 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78  key_sessions[idx
24e60 5d 2e 69 64 65 6e 74 69 74 69 65 73 20 3d 20 63  ].identities = c
24e70 61 63 6b 65 79 5f 72 65 61 64 5f 69 64 65 6e 74  ackey_read_ident
24e80 69 74 69 65 73 28 26 63 61 63 6b 65 79 5f 73 6c  ities(&cackey_sl
24e90 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c 20 26 63 61  ots[slotID], &ca
24ea0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64  ckey_sessions[id
24eb0 78 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 6f  x].identities_co
24ec0 75 6e 74 29 3b 0a 0a 0a 09 09 09 62 72 65 61 6b  unt);......break
24ed0 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 6d 75 74 65 78  ;...}..}...mutex
24ee0 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
24ef0 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
24f00 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
24f10 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
24f20 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
24f30 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
24f40 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e  Error.  Unlockin
24f50 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
24f60 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
24f70 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
24f80 69 66 20 28 21 66 6f 75 6e 64 5f 73 65 73 73 69  if (!found_sessi
24f90 6f 6e 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  on) {...CACKEY_D
24fa0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
24fb0 75 72 6e 69 6e 67 20 43 4b 52 5f 53 45 53 53 49  urning CKR_SESSI
24fc0 4f 4e 5f 43 4f 55 4e 54 20 28 25 69 29 22 2c 20  ON_COUNT (%i)", 
24fd0 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 43 4f 55 4e  CKR_SESSION_COUN
24fe0 54 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  T);....return(CK
24ff0 52 5f 53 45 53 53 49 4f 4e 5f 43 4f 55 4e 54 29  R_SESSION_COUNT)
25000 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
25010 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
25020 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69  rning CKR_OK (%i
25030 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72  )", CKR_OK);...r
25040 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d  eturn(CKR_OK);.}
25050 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
25060 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 43 6c  TION(CK_RV, C_Cl
25070 6f 73 65 53 65 73 73 69 6f 6e 29 28 43 4b 5f 53  oseSession)(CK_S
25080 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
25090 65 73 73 69 6f 6e 29 20 7b 0a 09 69 6e 74 20 6d  ession) {..int m
250a0 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43  utex_retval;...C
250b0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
250c0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
250d0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
250e0 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
250f0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
25100 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
25110 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
25120 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
25130 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
25140 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  LIZED);..}...if 
25150 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c  (hSession == 0 |
25160 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73  | hSession >= (s
25170 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
25180 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28  sions) / sizeof(
25190 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
251a0 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59  0]))) {...CACKEY
251b0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
251c0 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f  rror.  Session o
251d0 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a  ut of range.");.
251e0 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
251f0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49  SESSION_HANDLE_I
25200 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75  NVALID);..}...mu
25210 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
25220 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63  key_mutex_lock(c
25230 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
25240 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
25250 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
25260 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
25270 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67  "Error.  Locking
25280 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
25290 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
252a0 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69  L_ERROR);..}...i
252b0 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69  f (!cackey_sessi
252c0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63  ons[hSession].ac
252d0 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79  tive) {...cackey
252e0 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
252f0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
25300 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
25310 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
25320 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76  ession not activ
25330 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
25340 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41  n(CKR_SESSION_HA
25350 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
25360 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69  }...cackey_sessi
25370 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63  ons[hSession].ac
25380 74 69 76 65 20 3d 20 30 3b 0a 09 63 61 63 6b 65  tive = 0;..cacke
25390 79 5f 66 72 65 65 5f 69 64 65 6e 74 69 74 69 65  y_free_identitie
253a0 73 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  s(cackey_session
253b0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e  s[hSession].iden
253c0 74 69 74 69 65 73 2c 20 63 61 63 6b 65 79 5f 73  tities, cackey_s
253d0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
253e0 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75  ].identities_cou
253f0 6e 74 29 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74  nt);...mutex_ret
25400 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
25410 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
25420 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
25430 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
25440 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
25450 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
25460 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61  r.  Unlocking fa
25470 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
25480 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
25490 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  RROR);..}...CACK
254a0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
254b0 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
254c0 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29  K (%i)", CKR_OK)
254d0 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ;...return(CKR_O
254e0 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  K);.}..CK_DEFINE
254f0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
25500 20 43 5f 43 6c 6f 73 65 41 6c 6c 53 65 73 73 69   C_CloseAllSessi
25510 6f 6e 73 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20  ons)(CK_SLOT_ID 
25520 73 6c 6f 74 49 44 29 20 7b 0a 09 75 69 6e 74 33  slotID) {..uint3
25530 32 5f 74 20 69 64 78 3b 0a 09 69 6e 74 20 6d 75  2_t idx;..int mu
25540 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41  tex_retval;...CA
25550 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
25560 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
25570 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
25580 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
25590 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
255a0 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
255b0 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
255c0 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
255d0 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
255e0 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  IZED);..}...if (
255f0 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c  slotID < 0 || sl
25600 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28  otID >= (sizeof(
25610 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20  cackey_slots) / 
25620 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
25630 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41  ots[0]))) {...CA
25640 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
25650 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69  F("Error. Invali
25660 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64  d slot requested
25670 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20   (%lu), outside 
25680 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c  of valid range",
25690 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74   slotID);....ret
256a0 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f  urn(CKR_SLOT_ID_
256b0 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d  INVALID);..}...m
256c0 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
256d0 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28  ckey_mutex_lock(
256e0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
256f0 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
25700 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
25710 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
25720 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e  ("Error.  Lockin
25730 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
25740 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
25750 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
25760 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  if (cackey_slots
25770 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65 20  [slotID].active 
25780 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  == 0) {...CACKEY
25790 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
257a0 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c  rror. Invalid sl
257b0 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c  ot requested (%l
257c0 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72  u), slot not cur
257d0 72 65 6e 74 6c 79 20 61 63 74 69 76 65 22 2c 20  rently active", 
257e0 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b  slotID);....cack
257f0 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
25800 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
25810 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
25820 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b  LOT_ID_INVALID);
25830 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d  ..}...for (idx =
25840 20 30 3b 20 69 64 78 20 3c 20 28 73 69 7a 65 6f   0; idx < (sizeo
25850 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
25860 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
25870 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29  ey_sessions[0]))
25880 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20  ; idx++) {...if 
25890 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
258a0 5b 69 64 78 5d 2e 61 63 74 69 76 65 29 20 7b 0a  [idx].active) {.
258b0 09 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65  ...if (cackey_se
258c0 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 73 6c 6f 74  ssions[idx].slot
258d0 49 44 20 21 3d 20 73 6c 6f 74 49 44 29 20 7b 0a  ID != slotID) {.
258e0 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09  ....continue;...
258f0 09 7d 0a 0a 09 09 09 63 61 63 6b 65 79 5f 6d 75  .}.....cackey_mu
25900 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
25910 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 09 43  y_biglock);....C
25920 5f 43 6c 6f 73 65 53 65 73 73 69 6f 6e 28 69 64  _CloseSession(id
25930 78 29 3b 0a 09 09 09 63 61 63 6b 65 79 5f 6d 75  x);....cackey_mu
25940 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  tex_lock(cackey_
25950 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 7d 0a 09 7d  biglock);...}..}
25960 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
25970 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  = cackey_mutex_u
25980 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
25990 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
259a0 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
259b0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
259c0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
259d0 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64  Unlocking failed
259e0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
259f0 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
25a00 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
25a10 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
25a20 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25  urning CKR_OK (%
25a30 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09  i)", CKR_OK);...
25a40 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a  return(CKR_OK);.
25a50 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
25a60 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47  CTION(CK_RV, C_G
25a70 65 74 53 65 73 73 69 6f 6e 49 6e 66 6f 29 28 43  etSessionInfo)(C
25a80 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
25a90 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 53 45   hSession, CK_SE
25aa0 53 53 49 4f 4e 5f 49 4e 46 4f 5f 50 54 52 20 70  SSION_INFO_PTR p
25ab0 49 6e 66 6f 29 20 7b 0a 09 69 6e 74 20 6d 75 74  Info) {..int mut
25ac0 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43  ex_retval;...CAC
25ad0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
25ae0 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
25af0 66 20 28 70 49 6e 66 6f 20 3d 3d 20 4e 55 4c 4c  f (pInfo == NULL
25b00 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
25b10 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
25b20 2e 20 70 49 6e 66 6f 20 69 73 20 4e 55 4c 4c 2e  . pInfo is NULL.
25b30 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
25b40 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29  R_ARGUMENTS_BAD)
25b50 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b  ;..}...if (!cack
25b60 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
25b70 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
25b80 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
25b90 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
25ba0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
25bb0 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
25bc0 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
25bd0 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20  ...if (hSession 
25be0 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e  == 0 || hSession
25bf0 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b   >= (sizeof(cack
25c00 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73  ey_sessions) / s
25c10 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
25c20 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09  sions[0]))) {...
25c30 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
25c40 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73  NTF("Error.  Ses
25c50 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67  sion out of rang
25c60 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
25c70 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41  n(CKR_SESSION_HA
25c80 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
25c90 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  }...mutex_retval
25ca0 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
25cb0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
25cc0 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
25cd0 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
25ce0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
25cf0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c  RINTF("Error.  L
25d00 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
25d10 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
25d20 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
25d30 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  .}...if (!cackey
25d40 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
25d50 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09  on].active) {...
25d60 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
25d70 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
25d80 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ck);....CACKEY_D
25d90 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
25da0 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74  or.  Session not
25db0 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09   active.");.....
25dc0 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
25dd0 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
25de0 49 44 29 3b 0a 09 7d 0a 0a 09 70 49 6e 66 6f 2d  ID);..}...pInfo-
25df0 3e 73 6c 6f 74 49 44 20 3d 20 63 61 63 6b 65 79  >slotID = cackey
25e00 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
25e10 6f 6e 5d 2e 73 6c 6f 74 49 44 3b 0a 09 70 49 6e  on].slotID;..pIn
25e20 66 6f 2d 3e 73 74 61 74 65 20 3d 20 63 61 63 6b  fo->state = cack
25e30 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
25e40 73 69 6f 6e 5d 2e 73 74 61 74 65 3b 0a 09 70 49  sion].state;..pI
25e50 6e 66 6f 2d 3e 66 6c 61 67 73 20 3d 20 63 61 63  nfo->flags = cac
25e60 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
25e70 73 73 69 6f 6e 5d 2e 66 6c 61 67 73 3b 0a 09 70  ssion].flags;..p
25e80 49 6e 66 6f 2d 3e 75 6c 44 65 76 69 63 65 45 72  Info->ulDeviceEr
25e90 72 6f 72 20 3d 20 63 61 63 6b 65 79 5f 73 65 73  ror = cackey_ses
25ea0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
25eb0 75 6c 44 65 76 69 63 65 45 72 72 6f 72 3b 0a 0a  ulDeviceError;..
25ec0 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
25ed0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
25ee0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
25ef0 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
25f00 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
25f10 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
25f20 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e  INTF("Error.  Un
25f30 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  locking failed."
25f40 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
25f50 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
25f60 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
25f70 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
25f80 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29  ning CKR_OK (%i)
25f90 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65  ", CKR_OK);...re
25fa0 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a  turn(CKR_OK);.}.
25fb0 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
25fc0 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74  ION(CK_RV, C_Get
25fd0 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 65 29 28  OperationState)(
25fe0 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
25ff0 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42  E hSession, CK_B
26000 59 54 45 5f 50 54 52 20 70 4f 70 65 72 61 74 69  YTE_PTR pOperati
26010 6f 6e 53 74 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e  onState, CK_ULON
26020 47 5f 50 54 52 20 70 75 6c 4f 70 65 72 61 74 69  G_PTR pulOperati
26030 6f 6e 53 74 61 74 65 4c 65 6e 29 20 7b 0a 09 43  onStateLen) {..C
26040 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
26050 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
26060 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
26070 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
26080 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
26090 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
260a0 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
260b0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
260c0 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
260d0 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
260e0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
260f0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
26100 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
26110 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
26120 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
26130 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
26140 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
26150 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
26160 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
26170 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
26180 53 65 74 4f 70 65 72 61 74 69 6f 6e 53 74 61 74  SetOperationStat
26190 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  e)(CK_SESSION_HA
261a0 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
261b0 4b 5f 42 59 54 45 5f 50 54 52 20 70 4f 70 65 72  K_BYTE_PTR pOper
261c0 61 74 69 6f 6e 53 74 61 74 65 2c 20 43 4b 5f 55  ationState, CK_U
261d0 4c 4f 4e 47 20 75 6c 4f 70 65 72 61 74 69 6f 6e  LONG ulOperation
261e0 53 74 61 74 65 4c 65 6e 2c 20 43 4b 5f 4f 42 4a  StateLen, CK_OBJ
261f0 45 43 54 5f 48 41 4e 44 4c 45 20 68 45 6e 63 72  ECT_HANDLE hEncr
26200 79 70 74 69 6f 6e 4b 65 79 2c 20 43 4b 5f 4f 42  yptionKey, CK_OB
26210 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 41 75 74  JECT_HANDLE hAut
26220 68 65 6e 74 69 63 61 74 69 6f 6e 4b 65 79 29 20  henticationKey) 
26230 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
26240 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
26250 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
26260 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
26270 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
26280 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
26290 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
262a0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
262b0 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
262c0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
262d0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
262e0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
262f0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
26300 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
26310 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
26320 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
26330 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
26340 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
26350 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
26360 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
26370 2c 20 5f 43 5f 4c 6f 67 69 6e 4d 75 74 65 78 41  , _C_LoginMutexA
26380 72 67 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  rg)(CK_SESSION_H
26390 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
263a0 43 4b 5f 55 53 45 52 5f 54 59 50 45 20 75 73 65  CK_USER_TYPE use
263b0 72 54 79 70 65 2c 20 43 4b 5f 55 54 46 38 43 48  rType, CK_UTF8CH
263c0 41 52 5f 50 54 52 20 70 50 69 6e 2c 20 43 4b 5f  AR_PTR pPin, CK_
263d0 55 4c 4f 4e 47 20 75 6c 50 69 6e 4c 65 6e 2c 20  ULONG ulPinLen, 
263e0 69 6e 74 20 6c 6f 63 6b 5f 6d 75 74 65 78 29 20  int lock_mutex) 
263f0 7b 0a 09 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c  {..CK_SLOT_ID sl
26400 6f 74 49 44 3b 0a 09 63 61 63 6b 65 79 5f 72 65  otID;..cackey_re
26410 74 20 67 65 74 5f 70 69 6e 5f 72 65 74 3b 0a 09  t get_pin_ret;..
26420 63 68 61 72 20 70 69 6e 62 75 66 5b 36 34 5d 3b  char pinbuf[64];
26430 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76  ..int mutex_retv
26440 61 6c 3b 0a 09 69 6e 74 20 74 72 69 65 73 5f 72  al;..int tries_r
26450 65 6d 61 69 6e 69 6e 67 3b 0a 09 69 6e 74 20 6c  emaining;..int l
26460 6f 67 69 6e 5f 72 65 74 3b 0a 0a 09 43 41 43 4b  ogin_ret;...CACK
26470 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
26480 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
26490 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
264a0 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
264b0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
264c0 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
264d0 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
264e0 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
264f0 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
26500 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53  ED);..}...if (hS
26510 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68  ession == 0 || h
26520 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65  Session >= (size
26530 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
26540 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63  ns) / sizeof(cac
26550 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29  key_sessions[0])
26560 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  )) {...CACKEY_DE
26570 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
26580 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20  r.  Session out 
26590 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a  of range.");....
265a0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53  ..return(CKR_SES
265b0 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41  SION_HANDLE_INVA
265c0 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75  LID);..}...if (u
265d0 73 65 72 54 79 70 65 20 21 3d 20 43 4b 55 5f 55  serType != CKU_U
265e0 53 45 52 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  SER) {...CACKEY_
265f0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
26600 72 6f 72 2e 20 20 57 65 20 6f 6e 6c 79 20 73 75  ror.  We only su
26610 70 70 6f 72 74 20 55 53 45 52 20 6d 6f 64 65 2c  pport USER mode,
26620 20 61 73 6b 65 64 20 66 6f 72 20 25 6c 75 20 6d   asked for %lu m
26630 6f 64 65 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64  ode.", (unsigned
26640 20 6c 6f 6e 67 29 20 75 73 65 72 54 79 70 65 29   long) userType)
26650 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 55  ....return(CKR_U
26660 53 45 52 5f 54 59 50 45 5f 49 4e 56 41 4c 49 44  SER_TYPE_INVALID
26670 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 6c 6f 63 6b  );..}...if (lock
26680 5f 6d 75 74 65 78 29 20 7b 0a 09 09 6d 75 74 65  _mutex) {...mute
26690 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
266a0 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63  y_mutex_lock(cac
266b0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 09  key_biglock);...
266c0 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
266d0 20 21 3d 20 30 29 20 7b 0a 09 09 09 43 41 43 4b   != 0) {....CACK
266e0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
266f0 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67  "Error.  Locking
26700 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 09   failed.");.....
26710 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
26720 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 09 7d 0a 09  AL_ERROR);...}..
26730 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  }...if (!cackey_
26740 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
26750 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 69  n].active) {...i
26760 66 20 28 6c 6f 63 6b 5f 6d 75 74 65 78 29 20 7b  f (lock_mutex) {
26770 0a 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  ....cackey_mutex
26780 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
26790 69 67 6c 6f 63 6b 29 3b 0a 09 09 7d 0a 0a 09 09  iglock);...}....
267a0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
267b0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73  NTF("Error.  Ses
267c0 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e  sion not active.
267d0 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
267e0 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  CKR_SESSION_HAND
267f0 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  LE_INVALID);..}.
26800 0a 09 73 6c 6f 74 49 44 20 3d 20 63 61 63 6b 65  ..slotID = cacke
26810 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
26820 69 6f 6e 5d 2e 73 6c 6f 74 49 44 3b 0a 0a 09 69  ion].slotID;...i
26830 66 20 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c  f (slotID < 0 ||
26840 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65   slotID >= (size
26850 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29  of(cackey_slots)
26860 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
26870 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09  _slots[0]))) {..
26880 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
26890 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76  INTF("Error. Inv
268a0 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73  alid slot reques
268b0 74 65 64 20 28 25 6c 75 29 2c 20 6f 75 74 73 69  ted (%lu), outsi
268c0 64 65 20 6f 66 20 76 61 6c 69 64 20 72 61 6e 67  de of valid rang
268d0 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09  e", slotID);....
268e0 69 66 20 28 6c 6f 63 6b 5f 6d 75 74 65 78 29 20  if (lock_mutex) 
268f0 7b 0a 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65  {....cackey_mute
26900 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
26910 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 7d 0a 0a 09  biglock);...}...
26920 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
26930 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
26940 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74  .if (cackey_slot
26950 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65  s[slotID].active
26960 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   == 0) {...CACKE
26970 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
26980 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73  Error. Invalid s
26990 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25  lot requested (%
269a0 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75  lu), slot not cu
269b0 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 22 2c  rrently active",
269c0 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 69 66 20   slotID);....if 
269d0 28 6c 6f 63 6b 5f 6d 75 74 65 78 29 20 7b 0a 09  (lock_mutex) {..
269e0 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
269f0 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
26a00 6c 6f 63 6b 29 3b 0a 09 09 7d 0a 0a 09 09 72 65  lock);...}....re
26a10 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
26a20 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66  _ERROR);..}...if
26a30 20 28 63 61 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d   (cackey_pin_com
26a40 6d 61 6e 64 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  mand != NULL) {.
26a50 09 09 69 66 20 28 70 50 69 6e 20 21 3d 20 4e 55  ..if (pPin != NU
26a60 4c 4c 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  LL) {....CACKEY_
26a70 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 50 72  DEBUG_PRINTF("Pr
26a80 6f 74 65 63 74 65 64 20 61 75 74 68 65 6e 74 69  otected authenti
26a90 63 61 74 69 6f 6e 20 70 61 74 68 20 69 6e 20 65  cation path in e
26aa0 66 66 65 63 74 20 61 6e 64 20 50 49 4e 20 70 72  ffect and PIN pr
26ab0 6f 76 69 64 65 64 20 21 3f 22 29 3b 0a 09 09 7d  ovided !?");...}
26ac0 0a 0a 09 09 67 65 74 5f 70 69 6e 5f 72 65 74 20  ....get_pin_ret 
26ad0 3d 20 63 61 63 6b 65 79 5f 67 65 74 5f 70 69 6e  = cackey_get_pin
26ae0 28 70 69 6e 62 75 66 29 3b 0a 0a 09 09 69 66 20  (pinbuf);....if 
26af0 28 67 65 74 5f 70 69 6e 5f 72 65 74 20 21 3d 20  (get_pin_ret != 
26b00 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
26b10 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
26b20 42 55 47 5f 50 52 49 4e 54 46 28 22 63 61 63 6b  BUG_PRINTF("cack
26b30 65 79 5f 67 65 74 5f 70 69 6e 28 29 20 72 65 74  ey_get_pin() ret
26b40 75 72 6e 65 64 20 69 6e 20 66 61 69 6c 75 72 65  urned in failure
26b50 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 65 20 50  , assuming the P
26b60 49 4e 20 77 61 73 20 69 6e 63 6f 72 72 65 63 74  IN was incorrect
26b70 2e 22 29 3b 0a 0a 09 09 09 69 66 20 28 6c 6f 63  .");.....if (loc
26b80 6b 5f 6d 75 74 65 78 29 20 7b 0a 09 09 09 09 63  k_mutex) {.....c
26b90 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
26ba0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
26bb0 6b 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 72 65 74  k);....}.....ret
26bc0 75 72 6e 28 43 4b 52 5f 50 49 4e 5f 49 4e 43 4f  urn(CKR_PIN_INCO
26bd0 52 52 45 43 54 29 3b 0a 09 09 7d 0a 0a 09 09 70  RRECT);...}....p
26be0 50 69 6e 20 3d 20 28 43 4b 5f 55 54 46 38 43 48  Pin = (CK_UTF8CH
26bf0 41 52 5f 50 54 52 29 20 70 69 6e 62 75 66 3b 0a  AR_PTR) pinbuf;.
26c00 09 09 75 6c 50 69 6e 4c 65 6e 20 3d 20 73 74 72  ..ulPinLen = str
26c10 6c 65 6e 28 70 69 6e 62 75 66 29 3b 0a 09 7d 0a  len(pinbuf);..}.
26c20 0a 09 6c 6f 67 69 6e 5f 72 65 74 20 3d 20 63 61  ..login_ret = ca
26c30 63 6b 65 79 5f 6c 6f 67 69 6e 28 26 63 61 63 6b  ckey_login(&cack
26c40 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
26c50 2c 20 70 50 69 6e 2c 20 75 6c 50 69 6e 4c 65 6e  , pPin, ulPinLen
26c60 2c 20 26 74 72 69 65 73 5f 72 65 6d 61 69 6e 69  , &tries_remaini
26c70 6e 67 2c 20 33 29 3b 0a 09 69 66 20 28 6c 6f 67  ng, 3);..if (log
26c80 69 6e 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59  in_ret != CACKEY
26c90 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09  _PCSC_S_OK) {...
26ca0 69 66 20 28 6c 6f 63 6b 5f 6d 75 74 65 78 29 20  if (lock_mutex) 
26cb0 7b 0a 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65  {....cackey_mute
26cc0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
26cd0 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 7d 0a 0a 09  biglock);...}...
26ce0 09 69 66 20 28 6c 6f 67 69 6e 5f 72 65 74 20 3d  .if (login_ret =
26cf0 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  = CACKEY_PCSC_E_
26d00 4c 4f 43 4b 45 44 29 20 7b 0a 09 09 09 43 41 43  LOCKED) {....CAC
26d10 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
26d20 28 22 45 72 72 6f 72 2e 20 20 54 6f 6b 65 6e 20  ("Error.  Token 
26d30 69 73 20 6c 6f 63 6b 65 64 2e 22 29 3b 0a 0a 09  is locked.");...
26d40 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73  ..cackey_slots[s
26d50 6c 6f 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61  lotID].token_fla
26d60 67 73 20 7c 3d 20 43 4b 46 5f 55 53 45 52 5f 50  gs |= CKF_USER_P
26d70 49 4e 5f 4c 4f 43 4b 45 44 3b 0a 0a 09 09 09 43  IN_LOCKED;.....C
26d80 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
26d90 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
26da0 52 5f 50 49 4e 5f 4c 4f 43 4b 45 44 20 28 25 69  R_PIN_LOCKED (%i
26db0 29 22 2c 20 28 69 6e 74 29 20 43 4b 52 5f 50 49  )", (int) CKR_PI
26dc0 4e 5f 4c 4f 43 4b 45 44 29 3b 0a 0a 09 09 09 72  N_LOCKED);.....r
26dd0 65 74 75 72 6e 28 43 4b 52 5f 50 49 4e 5f 4c 4f  eturn(CKR_PIN_LO
26de0 43 4b 45 44 29 3b 0a 09 09 7d 20 65 6c 73 65 20  CKED);...} else 
26df0 69 66 20 28 6c 6f 67 69 6e 5f 72 65 74 20 3d 3d  if (login_ret ==
26e00 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 42   CACKEY_PCSC_E_B
26e10 41 44 50 49 4e 29 20 7b 0a 09 09 09 43 41 43 4b  ADPIN) {....CACK
26e20 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
26e30 22 45 72 72 6f 72 2e 20 20 49 6e 76 61 6c 69 64  "Error.  Invalid
26e40 20 50 49 4e 2e 22 29 3b 0a 0a 09 09 09 63 61 63   PIN.");.....cac
26e50 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44  key_slots[slotID
26e60 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 7c 3d  ].token_flags |=
26e70 20 43 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 43 4f   CKF_USER_PIN_CO
26e80 55 4e 54 5f 4c 4f 57 3b 0a 0a 09 09 09 69 66 20  UNT_LOW;.....if 
26e90 28 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67  (tries_remaining
26ea0 20 3d 3d 20 31 29 20 7b 0a 09 09 09 09 63 61 63   == 1) {.....cac
26eb0 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44  key_slots[slotID
26ec0 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 7c 3d  ].token_flags |=
26ed0 20 43 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 46 49   CKF_USER_PIN_FI
26ee0 4e 41 4c 5f 54 52 59 3b 0a 09 09 09 7d 0a 0a 09  NAL_TRY;....}...
26ef0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
26f00 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
26f10 20 43 4b 52 5f 50 49 4e 5f 49 4e 43 4f 52 52 45   CKR_PIN_INCORRE
26f20 43 54 20 28 25 69 29 22 2c 20 28 69 6e 74 29 20  CT (%i)", (int) 
26f30 43 4b 52 5f 50 49 4e 5f 49 4e 43 4f 52 52 45 43  CKR_PIN_INCORREC
26f40 54 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43  T);.....return(C
26f50 4b 52 5f 50 49 4e 5f 49 4e 43 4f 52 52 45 43 54  KR_PIN_INCORRECT
26f60 29 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59  );...}....CACKEY
26f70 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
26f80 72 72 6f 72 2e 20 20 55 6e 6b 6e 6f 77 6e 20 65  rror.  Unknown e
26f90 72 72 6f 72 20 72 65 74 75 72 6e 65 64 20 66 72  rror returned fr
26fa0 6f 6d 20 63 61 63 6b 65 79 5f 6c 6f 67 69 6e 28  om cackey_login(
26fb0 29 20 28 25 69 29 22 2c 20 6c 6f 67 69 6e 5f 72  ) (%i)", login_r
26fc0 65 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  et);....return(C
26fd0 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
26fe0 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73  );..}...cackey_s
26ff0 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 74 6f 6b  lots[slotID].tok
27000 65 6e 5f 66 6c 61 67 73 20 26 3d 20 7e 28 43 4b  en_flags &= ~(CK
27010 46 5f 55 53 45 52 5f 50 49 4e 5f 4c 4f 43 4b 45  F_USER_PIN_LOCKE
27020 44 20 7c 20 43 4b 46 5f 55 53 45 52 5f 50 49 4e  D | CKF_USER_PIN
27030 5f 43 4f 55 4e 54 5f 4c 4f 57 20 7c 20 43 4b 46  _COUNT_LOW | CKF
27040 5f 4c 4f 47 49 4e 5f 52 45 51 55 49 52 45 44 20  _LOGIN_REQUIRED 
27050 7c 20 43 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 46  | CKF_USER_PIN_F
27060 49 4e 41 4c 5f 54 52 59 29 3b 0a 0a 09 63 61 63  INAL_TRY);...cac
27070 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
27080 73 73 69 6f 6e 5d 2e 73 74 61 74 65 20 3d 20 43  ssion].state = C
27090 4b 53 5f 52 4f 5f 55 53 45 52 5f 46 55 4e 43 54  KS_RO_USER_FUNCT
270a0 49 4f 4e 53 3b 0a 0a 09 69 66 20 28 6c 6f 63 6b  IONS;...if (lock
270b0 5f 6d 75 74 65 78 29 20 7b 0a 09 09 6d 75 74 65  _mutex) {...mute
270c0 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
270d0 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
270e0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
270f0 09 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
27100 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 09 43 41  al != 0) {....CA
27110 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
27120 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63  F("Error.  Unloc
27130 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
27140 0a 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
27150 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
27160 09 7d 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  .}..}...CACKEY_D
27170 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
27180 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25  urning CKR_OK (%
27190 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09  i)", CKR_OK);...
271a0 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a  return(CKR_OK);.
271b0 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
271c0 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 4c  CTION(CK_RV, C_L
271d0 6f 67 69 6e 29 28 43 4b 5f 53 45 53 53 49 4f 4e  ogin)(CK_SESSION
271e0 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
271f0 2c 20 43 4b 5f 55 53 45 52 5f 54 59 50 45 20 75  , CK_USER_TYPE u
27200 73 65 72 54 79 70 65 2c 20 43 4b 5f 55 54 46 38  serType, CK_UTF8
27210 43 48 41 52 5f 50 54 52 20 70 50 69 6e 2c 20 43  CHAR_PTR pPin, C
27220 4b 5f 55 4c 4f 4e 47 20 75 6c 50 69 6e 4c 65 6e  K_ULONG ulPinLen
27230 29 20 7b 0a 09 72 65 74 75 72 6e 28 5f 43 5f 4c  ) {..return(_C_L
27240 6f 67 69 6e 4d 75 74 65 78 41 72 67 28 68 53 65  oginMutexArg(hSe
27250 73 73 69 6f 6e 2c 20 75 73 65 72 54 79 70 65 2c  ssion, userType,
27260 20 70 50 69 6e 2c 20 75 6c 50 69 6e 4c 65 6e 2c   pPin, ulPinLen,
27270 20 31 29 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49   1));.}..CK_DEFI
27280 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
27290 56 2c 20 43 5f 4c 6f 67 6f 75 74 29 28 43 4b 5f  V, C_Logout)(CK_
272a0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
272b0 53 65 73 73 69 6f 6e 29 20 7b 0a 09 43 4b 5f 53  Session) {..CK_S
272c0 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 3b 0a 09  LOT_ID slotID;..
272d0 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c  int mutex_retval
272e0 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
272f0 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
27300 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
27310 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
27320 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
27330 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
27340 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
27350 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
27360 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
27370 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
27380 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d  ..if (hSession =
27390 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20  = 0 || hSession 
273a0 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65  >= (sizeof(cacke
273b0 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69  y_sessions) / si
273c0 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
273d0 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43  ions[0]))) {...C
273e0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
273f0 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73  TF("Error.  Sess
27400 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65  ion out of range
27410 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
27420 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  (CKR_SESSION_HAN
27430 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  DLE_INVALID);..}
27440 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
27450 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c  = cackey_mutex_l
27460 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
27470 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
27480 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
27490 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
274a0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f  INTF("Error.  Lo
274b0 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
274c0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
274d0 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
274e0 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  }...if (!cackey_
274f0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
27500 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63  n].active) {...c
27510 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
27520 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
27530 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  k);....CACKEY_DE
27540 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
27550 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20  r.  Session not 
27560 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09  active.");......
27570 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
27580 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  ON_HANDLE_INVALI
27590 44 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 49 44 20  D);..}...slotID 
275a0 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  = cackey_session
275b0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74  s[hSession].slot
275c0 49 44 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44  ID;...if (slotID
275d0 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e   < 0 || slotID >
275e0 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  = (sizeof(cackey
275f0 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66  _slots) / sizeof
27600 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d  (cackey_slots[0]
27610 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ))) {...CACKEY_D
27620 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
27630 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74  or. Invalid slot
27640 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29   requested (%lu)
27650 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 76 61 6c  , outside of val
27660 69 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49  id range", slotI
27670 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  D);....return(CK
27680 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
27690 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65  ;..}...if (cacke
276a0 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e  y_slots[slotID].
276b0 61 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09  active == 0) {..
276c0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
276d0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76  INTF("Error. Inv
276e0 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73  alid slot reques
276f0 74 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20  ted (%lu), slot 
27700 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61 63  not currently ac
27710 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a  tive", slotID);.
27720 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
27730 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
27740 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72  glock);....retur
27750 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
27760 52 4f 52 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65  ROR);..}...cacke
27770 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
27780 69 6f 6e 5d 2e 73 74 61 74 65 20 3d 20 43 4b 53  ion].state = CKS
27790 5f 52 4f 5f 50 55 42 4c 49 43 5f 53 45 53 53 49  _RO_PUBLIC_SESSI
277a0 4f 4e 3b 0a 0a 09 69 66 20 28 63 61 63 6b 65 79  ON;...if (cackey
277b0 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20 3d 3d 20  _pin_command == 
277c0 4e 55 4c 4c 29 20 7b 0a 09 09 63 61 63 6b 65 79  NULL) {...cackey
277d0 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 74  _slots[slotID].t
277e0 6f 6b 65 6e 5f 66 6c 61 67 73 20 3d 20 43 4b 46  oken_flags = CKF
277f0 5f 4c 4f 47 49 4e 5f 52 45 51 55 49 52 45 44 3b  _LOGIN_REQUIRED;
27800 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 63 61 63  ..} else {...cac
27810 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44  key_slots[slotID
27820 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 3d 20  ].token_flags = 
27830 30 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65  0;..}...mutex_re
27840 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
27850 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
27860 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
27870 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
27880 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
27890 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
278a0 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66  or.  Unlocking f
278b0 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
278c0 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
278d0 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43  ERROR);..}...CAC
278e0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
278f0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
27900 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b  OK (%i)", CKR_OK
27910 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
27920 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  OK);.}..CK_DEFIN
27930 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
27940 2c 20 43 5f 43 72 65 61 74 65 4f 62 6a 65 63 74  , C_CreateObject
27950 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
27960 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
27970 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52 20 70  _ATTRIBUTE_PTR p
27980 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f  Template, CK_ULO
27990 4e 47 20 75 6c 43 6f 75 6e 74 2c 20 43 4b 5f 4f  NG ulCount, CK_O
279a0 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52  BJECT_HANDLE_PTR
279b0 20 70 68 4f 62 6a 65 63 74 29 20 7b 0a 09 43 41   phObject) {..CA
279c0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
279d0 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
279e0 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
279f0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
27a00 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
27a10 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
27a20 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
27a30 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
27a40 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
27a50 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
27a60 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
27a70 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
27a80 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
27a90 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
27aa0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
27ab0 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
27ac0 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
27ad0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
27ae0 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
27af0 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 43  CTION(CK_RV, C_C
27b00 6f 70 79 4f 62 6a 65 63 74 29 28 43 4b 5f 53 45  opyObject)(CK_SE
27b10 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
27b20 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54  ssion, CK_OBJECT
27b30 5f 48 41 4e 44 4c 45 20 68 4f 62 6a 65 63 74 2c  _HANDLE hObject,
27b40 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54   CK_ATTRIBUTE_PT
27b50 52 20 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f  R pTemplate, CK_
27b60 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e 74 2c 20 43  ULONG ulCount, C
27b70 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f  K_OBJECT_HANDLE_
27b80 50 54 52 20 70 68 4e 65 77 4f 62 6a 65 63 74 29  PTR phNewObject)
27b90 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
27ba0 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
27bb0 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
27bc0 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
27bd0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
27be0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
27bf0 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
27c00 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
27c10 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
27c20 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
27c30 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
27c40 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
27c50 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
27c60 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
27c70 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
27c80 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
27c90 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
27ca0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
27cb0 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  TED);.}..CK_DEFI
27cc0 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
27cd0 56 2c 20 43 5f 44 65 73 74 72 6f 79 4f 62 6a 65  V, C_DestroyObje
27ce0 63 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  ct)(CK_SESSION_H
27cf0 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
27d00 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45  CK_OBJECT_HANDLE
27d10 20 68 4f 62 6a 65 63 74 29 20 7b 0a 09 43 41 43   hObject) {..CAC
27d20 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
27d30 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
27d40 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
27d50 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
27d60 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
27d70 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
27d80 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
27d90 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
27da0 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
27db0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
27dc0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
27dd0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
27de0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
27df0 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
27e00 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
27e10 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
27e20 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
27e30 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
27e40 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
27e50 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65  TION(CK_RV, C_Ge
27e60 74 4f 62 6a 65 63 74 53 69 7a 65 29 28 43 4b 5f  tObjectSize)(CK_
27e70 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
27e80 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45  Session, CK_OBJE
27e90 43 54 5f 48 41 4e 44 4c 45 20 68 4f 62 6a 65 63  CT_HANDLE hObjec
27ea0 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20  t, CK_ULONG_PTR 
27eb0 70 75 6c 53 69 7a 65 29 20 7b 0a 09 43 41 43 4b  pulSize) {..CACK
27ec0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
27ed0 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
27ee0 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
27ef0 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
27f00 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
27f10 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
27f20 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
27f30 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
27f40 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
27f50 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
27f60 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
27f70 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
27f80 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
27f90 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
27fa0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
27fb0 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
27fc0 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
27fd0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
27fe0 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
27ff0 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74  ION(CK_RV, C_Get
28000 41 74 74 72 69 62 75 74 65 56 61 6c 75 65 29 28  AttributeValue)(
28010 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
28020 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f  E hSession, CK_O
28030 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4f 62  BJECT_HANDLE hOb
28040 6a 65 63 74 2c 20 43 4b 5f 41 54 54 52 49 42 55  ject, CK_ATTRIBU
28050 54 45 5f 50 54 52 20 70 54 65 6d 70 6c 61 74 65  TE_PTR pTemplate
28060 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f 75  , CK_ULONG ulCou
28070 6e 74 29 20 7b 0a 09 43 4b 5f 41 54 54 52 49 42  nt) {..CK_ATTRIB
28080 55 54 45 20 2a 63 75 72 72 5f 61 74 74 72 3b 0a  UTE *curr_attr;.
28090 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69  .struct cackey_i
280a0 64 65 6e 74 69 74 79 20 2a 69 64 65 6e 74 69 74  dentity *identit
280b0 79 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  y;..unsigned lon
280c0 67 20 69 64 65 6e 74 69 74 79 5f 69 64 78 2c 20  g identity_idx, 
280d0 61 74 74 72 5f 69 64 78 2c 20 73 65 73 73 5f 61  attr_idx, sess_a
280e0 74 74 72 5f 69 64 78 2c 20 6e 75 6d 5f 69 64 73  ttr_idx, num_ids
280f0 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74  ;..int mutex_ret
28100 76 61 6c 3b 0a 09 43 4b 5f 52 56 20 72 65 74 76  val;..CK_RV retv
28110 61 6c 20 3d 20 43 4b 52 5f 4f 4b 3b 0a 09 43 4b  al = CKR_OK;..CK
28120 5f 56 4f 49 44 5f 50 54 52 20 70 56 61 6c 75 65  _VOID_PTR pValue
28130 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 75 6c 56 61  ;..CK_ULONG ulVa
28140 6c 75 65 4c 65 6e 3b 0a 0a 09 43 41 43 4b 45 59  lueLen;...CACKEY
28150 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
28160 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
28170 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
28180 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
28190 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
281a0 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
281b0 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
281c0 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
281d0 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
281e0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73  );..}...if (hSes
281f0 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65  sion == 0 || hSe
28200 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66  ssion >= (sizeof
28210 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
28220 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
28230 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29  y_sessions[0])))
28240 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
28250 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
28260 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66    Session out of
28270 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09   range.");......
28280 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
28290 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  ON_HANDLE_INVALI
282a0 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 4f 62  D);..}...if (hOb
282b0 6a 65 63 74 20 3d 3d 20 30 29 20 7b 0a 09 09 43  ject == 0) {...C
282c0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
282d0 54 46 28 22 45 72 72 6f 72 2e 20 20 4f 62 6a 65  TF("Error.  Obje
282e0 63 74 20 68 61 6e 64 6c 65 20 6f 75 74 20 6f 66  ct handle out of
282f0 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09   range.");......
28300 72 65 74 75 72 6e 28 43 4b 52 5f 4f 42 4a 45 43  return(CKR_OBJEC
28310 54 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44  T_HANDLE_INVALID
28320 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 6c 43 6f  );..}...if (ulCo
28330 75 6e 74 20 3d 3d 20 30 29 20 7b 0a 09 09 2f 2a  unt == 0) {.../*
28340 20 53 68 6f 72 74 20 63 69 72 63 75 69 74 2c 20   Short circuit, 
28350 69 66 20 7a 65 72 6f 20 6f 62 6a 65 63 74 73 20  if zero objects 
28360 77 65 72 65 20 73 70 65 63 69 66 69 65 64 20 72  were specified r
28370 65 74 75 72 6e 20 7a 65 72 6f 20 69 74 65 6d 73  eturn zero items
28380 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 2a 2f 0a   immediately */.
28390 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
283a0 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
283b0 20 43 4b 52 5f 4f 4b 20 28 25 69 29 20 28 73 68   CKR_OK (%i) (sh
283c0 6f 72 74 20 63 69 72 63 75 69 74 29 22 2c 20 43  ort circuit)", C
283d0 4b 52 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74 75 72  KR_OK);....retur
283e0 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09  n(CKR_OK);..}...
283f0 69 66 20 28 70 54 65 6d 70 6c 61 74 65 20 3d 3d  if (pTemplate ==
28400 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
28410 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
28420 45 72 72 6f 72 2e 20 20 70 54 65 6d 70 6c 61 74  Error.  pTemplat
28430 65 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09  e is NULL.");...
28440 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55  .return(CKR_ARGU
28450 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a  MENTS_BAD);..}..
28460 09 69 64 65 6e 74 69 74 79 5f 69 64 78 20 3d 20  .identity_idx = 
28470 68 4f 62 6a 65 63 74 20 2d 20 31 3b 0a 0a 09 6d  hObject - 1;...m
28480 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
28490 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28  ckey_mutex_lock(
284a0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
284b0 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
284c0 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
284d0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
284e0 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e  ("Error.  Lockin
284f0 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
28500 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
28510 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
28520 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73  if (!cackey_sess
28530 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61  ions[hSession].a
28540 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65  ctive) {...cacke
28550 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
28560 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
28570 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
28580 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
28590 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69  Session not acti
285a0 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ve.");......retu
285b0 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48  rn(CKR_SESSION_H
285c0 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a  ANDLE_INVALID);.
285d0 09 7d 0a 0a 09 6e 75 6d 5f 69 64 73 20 3d 20 63  .}...num_ids = c
285e0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
285f0 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74  Session].identit
28600 69 65 73 5f 63 6f 75 6e 74 3b 0a 0a 09 69 66 20  ies_count;...if 
28610 28 69 64 65 6e 74 69 74 79 5f 69 64 78 20 3e 3d  (identity_idx >=
28620 20 6e 75 6d 5f 69 64 73 29 20 7b 0a 09 09 63 61   num_ids) {...ca
28630 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
28640 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
28650 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  );....CACKEY_DEB
28660 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
28670 2e 20 20 4f 62 6a 65 63 74 20 68 61 6e 64 6c 65  .  Object handle
28680 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 20 20   out of range.  
28690 69 64 65 6e 74 69 74 79 5f 69 64 78 20 3d 20 25  identity_idx = %
286a0 6c 75 2c 20 6e 75 6d 5f 69 64 73 20 3d 20 25 6c  lu, num_ids = %l
286b0 75 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  u.", (unsigned l
286c0 6f 6e 67 29 20 69 64 65 6e 74 69 74 79 5f 69 64  ong) identity_id
286d0 78 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  x, (unsigned lon
286e0 67 29 20 6e 75 6d 5f 69 64 73 29 3b 0a 0a 09 09  g) num_ids);....
286f0 72 65 74 75 72 6e 28 43 4b 52 5f 4f 42 4a 45 43  return(CKR_OBJEC
28700 54 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44  T_HANDLE_INVALID
28710 29 3b 0a 09 7d 0a 0a 09 69 64 65 6e 74 69 74 79  );..}...identity
28720 20 3d 20 26 63 61 63 6b 65 79 5f 73 65 73 73 69   = &cackey_sessi
28730 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64  ons[hSession].id
28740 65 6e 74 69 74 69 65 73 5b 69 64 65 6e 74 69 74  entities[identit
28750 79 5f 69 64 78 5d 3b 0a 0a 09 66 6f 72 20 28 61  y_idx];...for (a
28760 74 74 72 5f 69 64 78 20 3d 20 30 3b 20 61 74 74  ttr_idx = 0; att
28770 72 5f 69 64 78 20 3c 20 75 6c 43 6f 75 6e 74 3b  r_idx < ulCount;
28780 20 61 74 74 72 5f 69 64 78 2b 2b 29 20 7b 0a 09   attr_idx++) {..
28790 09 63 75 72 72 5f 61 74 74 72 20 3d 20 26 70 54  .curr_attr = &pT
287a0 65 6d 70 6c 61 74 65 5b 61 74 74 72 5f 69 64 78  emplate[attr_idx
287b0 5d 3b 0a 0a 09 09 70 56 61 6c 75 65 20 3d 20 4e  ];....pValue = N
287c0 55 4c 4c 3b 0a 09 09 75 6c 56 61 6c 75 65 4c 65  ULL;...ulValueLe
287d0 6e 20 3d 20 28 43 4b 5f 4c 4f 4e 47 29 20 2d 31  n = (CK_LONG) -1
287e0 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  ;....CACKEY_DEBU
287f0 47 5f 50 52 49 4e 54 46 28 22 4c 6f 6f 6b 69 6e  G_PRINTF("Lookin
28800 67 20 66 6f 72 20 61 74 74 72 69 62 75 74 65 20  g for attribute 
28810 30 78 25 30 38 6c 78 20 28 69 64 65 6e 74 69 74  0x%08lx (identit
28820 79 3a 25 6c 75 29 20 2e 2e 2e 22 2c 20 28 75 6e  y:%lu) ...", (un
28830 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72  signed long) cur
28840 72 5f 61 74 74 72 2d 3e 74 79 70 65 2c 20 28 75  r_attr->type, (u
28850 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 69 64  nsigned long) id
28860 65 6e 74 69 74 79 5f 69 64 78 29 3b 0a 0a 09 09  entity_idx);....
28870 66 6f 72 20 28 73 65 73 73 5f 61 74 74 72 5f 69  for (sess_attr_i
28880 64 78 20 3d 20 30 3b 20 73 65 73 73 5f 61 74 74  dx = 0; sess_att
28890 72 5f 69 64 78 20 3c 20 69 64 65 6e 74 69 74 79  r_idx < identity
288a0 2d 3e 61 74 74 72 69 62 75 74 65 73 5f 63 6f 75  ->attributes_cou
288b0 6e 74 3b 20 73 65 73 73 5f 61 74 74 72 5f 69 64  nt; sess_attr_id
288c0 78 2b 2b 29 20 7b 0a 09 09 09 69 66 20 28 69 64  x++) {....if (id
288d0 65 6e 74 69 74 79 2d 3e 61 74 74 72 69 62 75 74  entity->attribut
288e0 65 73 5b 73 65 73 73 5f 61 74 74 72 5f 69 64 78  es[sess_attr_idx
288f0 5d 2e 74 79 70 65 20 3d 3d 20 63 75 72 72 5f 61  ].type == curr_a
28900 74 74 72 2d 3e 74 79 70 65 29 20 7b 0a 09 09 09  ttr->type) {....
28910 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
28920 49 4e 54 46 28 22 20 2e 2e 2e 20 66 6f 75 6e 64  INTF(" ... found
28930 20 69 74 2c 20 70 56 61 6c 75 65 20 3d 20 25 70   it, pValue = %p
28940 2c 20 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 25  , ulValueLen = %
28950 6c 75 22 2c 20 69 64 65 6e 74 69 74 79 2d 3e 61  lu", identity->a
28960 74 74 72 69 62 75 74 65 73 5b 73 65 73 73 5f 61  ttributes[sess_a
28970 74 74 72 5f 69 64 78 5d 2e 70 56 61 6c 75 65 2c  ttr_idx].pValue,
28980 20 69 64 65 6e 74 69 74 79 2d 3e 61 74 74 72 69   identity->attri
28990 62 75 74 65 73 5b 73 65 73 73 5f 61 74 74 72 5f  butes[sess_attr_
289a0 69 64 78 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e 29  idx].ulValueLen)
289b0 3b 0a 09 09 09 09 0a 09 09 09 09 70 56 61 6c 75  ;..........pValu
289c0 65 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e 61 74  e = identity->at
289d0 74 72 69 62 75 74 65 73 5b 73 65 73 73 5f 61 74  tributes[sess_at
289e0 74 72 5f 69 64 78 5d 2e 70 56 61 6c 75 65 3b 0a  tr_idx].pValue;.
289f0 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ....ulValueLen =
28a00 20 69 64 65 6e 74 69 74 79 2d 3e 61 74 74 72 69   identity->attri
28a10 62 75 74 65 73 5b 73 65 73 73 5f 61 74 74 72 5f  butes[sess_attr_
28a20 69 64 78 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e 3b  idx].ulValueLen;
28a30 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 69 66 20  ....}...}....if 
28a40 28 63 75 72 72 5f 61 74 74 72 2d 3e 70 56 61 6c  (curr_attr->pVal
28a50 75 65 20 26 26 20 70 56 61 6c 75 65 29 20 7b 0a  ue && pValue) {.
28a60 09 09 09 69 66 20 28 63 75 72 72 5f 61 74 74 72  ...if (curr_attr
28a70 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 20 3e 3d 20  ->ulValueLen >= 
28a80 75 6c 56 61 6c 75 65 4c 65 6e 29 20 7b 0a 09 09  ulValueLen) {...
28a90 09 09 6d 65 6d 63 70 79 28 63 75 72 72 5f 61 74  ..memcpy(curr_at
28aa0 74 72 2d 3e 70 56 61 6c 75 65 2c 20 70 56 61 6c  tr->pValue, pVal
28ab0 75 65 2c 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b  ue, ulValueLen);
28ac0 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ....} else {....
28ad0 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 28 43  .ulValueLen = (C
28ae0 4b 5f 4c 4f 4e 47 29 20 2d 31 3b 0a 0a 09 09 09  K_LONG) -1;.....
28af0 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 42 55  .retval = CKR_BU
28b00 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 3b 0a  FFER_TOO_SMALL;.
28b10 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 63 75 72 72  ...}...}....curr
28b20 5f 61 74 74 72 2d 3e 75 6c 56 61 6c 75 65 4c 65  _attr->ulValueLe
28b30 6e 20 3d 20 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a  n = ulValueLen;.
28b40 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  .}...mutex_retva
28b50 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
28b60 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
28b70 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
28b80 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
28b90 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
28ba0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
28bb0 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c    Unlocking fail
28bc0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
28bd0 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
28be0 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 72 65  OR);..}...if (re
28bf0 74 76 61 6c 20 3d 3d 20 43 4b 52 5f 41 54 54 52  tval == CKR_ATTR
28c00 49 42 55 54 45 5f 54 59 50 45 5f 49 4e 56 41 4c  IBUTE_TYPE_INVAL
28c10 49 44 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ID) {...CACKEY_D
28c20 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
28c30 75 72 6e 69 6e 67 20 43 4b 52 5f 41 54 54 52 49  urning CKR_ATTRI
28c40 42 55 54 45 5f 54 59 50 45 5f 49 4e 56 41 4c 49  BUTE_TYPE_INVALI
28c50 44 20 28 25 69 29 22 2c 20 28 69 6e 74 29 20 72  D (%i)", (int) r
28c60 65 74 76 61 6c 29 3b 0a 09 7d 20 65 6c 73 65 20  etval);..} else 
28c70 69 66 20 28 72 65 74 76 61 6c 20 3d 3d 20 43 4b  if (retval == CK
28c80 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41  R_BUFFER_TOO_SMA
28c90 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
28ca0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
28cb0 75 72 6e 69 6e 67 20 43 4b 52 5f 42 55 46 46 45  urning CKR_BUFFE
28cc0 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 20 28 25 69 29  R_TOO_SMALL (%i)
28cd0 22 2c 20 28 69 6e 74 29 20 72 65 74 76 61 6c 29  ", (int) retval)
28ce0 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 72 65  ;..} else if (re
28cf0 74 76 61 6c 20 3d 3d 20 43 4b 52 5f 4f 4b 29 20  tval == CKR_OK) 
28d00 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
28d10 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
28d20 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c  ng CKR_OK (%i)",
28d30 20 28 69 6e 74 29 20 72 65 74 76 61 6c 29 3b 0a   (int) retval);.
28d40 09 7d 20 65 6c 73 65 20 7b 0a 09 09 43 41 43 4b  .} else {...CACK
28d50 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
28d60 22 52 65 74 75 72 6e 69 6e 67 20 25 69 22 2c 20  "Returning %i", 
28d70 28 69 6e 74 29 20 72 65 74 76 61 6c 29 3b 0a 09  (int) retval);..
28d80 7d 0a 0a 09 72 65 74 75 72 6e 28 72 65 74 76 61  }...return(retva
28d90 6c 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  l);.}..CK_DEFINE
28da0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
28db0 20 43 5f 53 65 74 41 74 74 72 69 62 75 74 65 56   C_SetAttributeV
28dc0 61 6c 75 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e  alue)(CK_SESSION
28dd0 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
28de0 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44  , CK_OBJECT_HAND
28df0 4c 45 20 68 4f 62 6a 65 63 74 2c 20 43 4b 5f 41  LE hObject, CK_A
28e00 54 54 52 49 42 55 54 45 5f 50 54 52 20 70 54 65  TTRIBUTE_PTR pTe
28e10 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47  mplate, CK_ULONG
28e20 20 75 6c 43 6f 75 6e 74 29 20 7b 0a 09 43 41 43   ulCount) {..CAC
28e30 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
28e40 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
28e50 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
28e60 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
28e70 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
28e80 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
28e90 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
28ea0 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
28eb0 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
28ec0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
28ed0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
28ee0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
28ef0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
28f00 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
28f10 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
28f20 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
28f30 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
28f40 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
28f50 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
28f60 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 46 69  TION(CK_RV, C_Fi
28f70 6e 64 4f 62 6a 65 63 74 73 49 6e 69 74 29 28 43  ndObjectsInit)(C
28f80 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
28f90 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 41 54   hSession, CK_AT
28fa0 54 52 49 42 55 54 45 5f 50 54 52 20 70 54 65 6d  TRIBUTE_PTR pTem
28fb0 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20  plate, CK_ULONG 
28fc0 75 6c 43 6f 75 6e 74 29 20 7b 0a 09 43 4b 5f 53  ulCount) {..CK_S
28fd0 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 3b 0a 09  LOT_ID slotID;..
28fe0 43 4b 5f 55 4c 4f 4e 47 20 69 64 78 3b 0a 09 69  CK_ULONG idx;..i
28ff0 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b  nt mutex_retval;
29000 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
29010 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
29020 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
29030 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
29040 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
29050 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
29060 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
29070 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
29080 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
29090 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
290a0 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d  .if (hSession ==
290b0 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e   0 || hSession >
290c0 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  = (sizeof(cackey
290d0 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a  _sessions) / siz
290e0 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
290f0 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41  ons[0]))) {...CA
29100 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
29110 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69  F("Error.  Sessi
29120 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e  on out of range.
29130 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
29140 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  CKR_SESSION_HAND
29150 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  LE_INVALID);..}.
29160 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
29170 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f   cackey_mutex_lo
29180 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
29190 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
291a0 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
291b0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
291c0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63  NTF("Error.  Loc
291d0 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
291e0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
291f0 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
29200 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73  ...if (!cackey_s
29210 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
29220 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61  ].active) {...ca
29230 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
29240 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
29250 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  );....CACKEY_DEB
29260 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
29270 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61  .  Session not a
29280 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72  ctive.");......r
29290 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f  eturn(CKR_SESSIO
292a0 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44  N_HANDLE_INVALID
292b0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b  );..}...if (cack
292c0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
292d0 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 61 63 74  sion].search_act
292e0 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  ive) {...cackey_
292f0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
29300 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
29310 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
29320 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65  INTF("Error.  Se
29330 61 72 63 68 20 61 6c 72 65 61 64 79 20 61 63 74  arch already act
29340 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  ive.");......ret
29350 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f  urn(CKR_OPERATIO
29360 4e 5f 41 43 54 49 56 45 29 3b 0a 09 7d 0a 0a 09  N_ACTIVE);..}...
29370 73 6c 6f 74 49 44 20 3d 20 63 61 63 6b 65 79 5f  slotID = cackey_
29380 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
29390 6e 5d 2e 73 6c 6f 74 49 44 3b 0a 0a 09 69 66 20  n].slotID;...if 
293a0 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73  (slotID < 0 || s
293b0 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66  lotID >= (sizeof
293c0 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f  (cackey_slots) /
293d0 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73   sizeof(cackey_s
293e0 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43  lots[0]))) {...C
293f0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
29400 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c  TF("Error. Inval
29410 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65  id slot requeste
29420 64 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 65  d (%lu), outside
29430 20 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 65 22   of valid range"
29440 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65  , slotID);....re
29450 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
29460 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66  _ERROR);..}...if
29470 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73   (cackey_slots[s
29480 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d  lotID].active ==
29490 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
294a0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
294b0 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74  or. Invalid slot
294c0 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29   requested (%lu)
294d0 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65  , slot not curre
294e0 6e 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c  ntly active", sl
294f0 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79  otID);....cackey
29500 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
29510 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
29520 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
29530 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
29540 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f  ..if (cackey_slo
29550 74 73 5b 73 6c 6f 74 49 44 5d 2e 73 6c 6f 74 5f  ts[slotID].slot_
29560 72 65 73 65 74 29 20 7b 0a 09 09 43 41 43 4b 45  reset) {...CACKE
29570 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
29580 54 68 65 20 73 6c 6f 74 20 68 61 73 20 62 65 65  The slot has bee
29590 6e 20 72 65 73 65 74 20 73 69 6e 63 65 20 77 65  n reset since we
295a0 20 6c 61 73 74 20 6c 6f 6f 6b 65 64 20 66 6f 72   last looked for
295b0 20 69 64 65 6e 74 69 74 69 65 73 20 2d 2d 20 72   identities -- r
295c0 65 73 63 61 6e 6e 69 6e 67 22 29 3b 0a 0a 09 09  escanning");....
295d0 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69  if (cackey_sessi
295e0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64  ons[hSession].id
295f0 65 6e 74 69 74 69 65 73 20 21 3d 20 4e 55 4c 4c  entities != NULL
29600 29 20 7b 0a 09 09 09 63 61 63 6b 65 79 5f 66 72  ) {....cackey_fr
29610 65 65 5f 69 64 65 6e 74 69 74 69 65 73 28 63 61  ee_identities(ca
29620 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
29630 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69  ession].identiti
29640 65 73 2c 20 63 61 63 6b 65 79 5f 73 65 73 73 69  es, cackey_sessi
29650 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64  ons[hSession].id
29660 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 29 3b  entities_count);
29670 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73  .....cackey_sess
29680 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69  ions[hSession].i
29690 64 65 6e 74 69 74 69 65 73 20 3d 20 4e 55 4c 4c  dentities = NULL
296a0 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73  ;....cackey_sess
296b0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69  ions[hSession].i
296c0 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 20  dentities_count 
296d0 3d 20 30 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28  = 0;...}....if (
296e0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f  cackey_slots[slo
296f0 74 49 44 5d 2e 6c 61 62 65 6c 20 21 3d 20 4e 55  tID].label != NU
29700 4c 4c 29 20 7b 0a 09 09 09 66 72 65 65 28 63 61  LL) {....free(ca
29710 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
29720 44 5d 2e 6c 61 62 65 6c 29 3b 0a 09 09 09 63 61  D].label);....ca
29730 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
29740 44 5d 2e 6c 61 62 65 6c 20 3d 20 4e 55 4c 4c 3b  D].label = NULL;
29750 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 6d  ...}....cackey_m
29760 61 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74 28 26  ark_slot_reset(&
29770 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f  cackey_slots[slo
29780 74 49 44 5d 29 3b 0a 09 09 63 61 63 6b 65 79 5f  tID]);...cackey_
29790 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 73 6c  slots[slotID].sl
297a0 6f 74 5f 72 65 73 65 74 20 3d 20 30 3b 0a 09 7d  ot_reset = 0;..}
297b0 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65  ...if (cackey_se
297c0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
297d0 2e 69 64 65 6e 74 69 74 69 65 73 20 3d 3d 20 4e  .identities == N
297e0 55 4c 4c 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  ULL) {...cackey_
297f0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
29800 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 20 3d 20  n].identities = 
29810 63 61 63 6b 65 79 5f 72 65 61 64 5f 69 64 65 6e  cackey_read_iden
29820 74 69 74 69 65 73 28 26 63 61 63 6b 65 79 5f 73  tities(&cackey_s
29830 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c 20 26 63  lots[slotID], &c
29840 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
29850 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74  Session].identit
29860 69 65 73 5f 63 6f 75 6e 74 29 3b 0a 09 7d 0a 0a  ies_count);..}..
29870 09 69 66 20 28 70 54 65 6d 70 6c 61 74 65 20 21  .if (pTemplate !
29880 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 69 66 20 28  = NULL) {...if (
29890 75 6c 43 6f 75 6e 74 20 21 3d 20 30 29 20 7b 0a  ulCount != 0) {.
298a0 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
298b0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61  ns[hSession].sea
298c0 72 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74 20  rch_query_count 
298d0 3d 20 75 6c 43 6f 75 6e 74 3b 0a 09 09 09 63 61  = ulCount;....ca
298e0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
298f0 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71  ession].search_q
29900 75 65 72 79 20 3d 20 6d 61 6c 6c 6f 63 28 75 6c  uery = malloc(ul
29910 43 6f 75 6e 74 20 2a 20 73 69 7a 65 6f 66 28 2a  Count * sizeof(*
29920 70 54 65 6d 70 6c 61 74 65 29 29 3b 0a 0a 09 09  pTemplate));....
29930 09 6d 65 6d 63 70 79 28 63 61 63 6b 65 79 5f 73  .memcpy(cackey_s
29940 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
29950 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 2c 20  ].search_query, 
29960 70 54 65 6d 70 6c 61 74 65 2c 20 75 6c 43 6f 75  pTemplate, ulCou
29970 6e 74 20 2a 20 73 69 7a 65 6f 66 28 2a 70 54 65  nt * sizeof(*pTe
29980 6d 70 6c 61 74 65 29 29 3b 0a 09 09 09 66 6f 72  mplate));....for
29990 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c   (idx = 0; idx <
299a0 20 75 6c 43 6f 75 6e 74 3b 20 69 64 78 2b 2b 29   ulCount; idx++)
299b0 20 7b 0a 09 09 09 09 69 66 20 28 70 54 65 6d 70   {.....if (pTemp
299c0 6c 61 74 65 5b 69 64 78 5d 2e 75 6c 56 61 6c 75  late[idx].ulValu
299d0 65 4c 65 6e 20 3d 3d 20 30 29 20 7b 0a 09 09 09  eLen == 0) {....
299e0 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
299f0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72  s[hSession].sear
29a00 63 68 5f 71 75 65 72 79 5b 69 64 78 5d 2e 70 56  ch_query[idx].pV
29a10 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09  alue = NULL;....
29a20 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09  ...continue;....
29a30 09 7d 0a 0a 09 09 09 09 63 61 63 6b 65 79 5f 73  .}......cackey_s
29a40 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
29a50 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5b 69  ].search_query[i
29a60 64 78 5d 2e 70 56 61 6c 75 65 20 3d 20 6d 61 6c  dx].pValue = mal
29a70 6c 6f 63 28 70 54 65 6d 70 6c 61 74 65 5b 69 64  loc(pTemplate[id
29a80 78 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a  x].ulValueLen);.
29a90 0a 09 09 09 09 69 66 20 28 63 61 63 6b 65 79 5f  .....if (cackey_
29aa0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
29ab0 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5b  n].search_query[
29ac0 69 64 78 5d 2e 70 56 61 6c 75 65 29 20 7b 0a 09  idx].pValue) {..
29ad0 09 09 09 09 6d 65 6d 63 70 79 28 63 61 63 6b 65  ....memcpy(cacke
29ae0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
29af0 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72  ion].search_quer
29b00 79 5b 69 64 78 5d 2e 70 56 61 6c 75 65 2c 20 70  y[idx].pValue, p
29b10 54 65 6d 70 6c 61 74 65 5b 69 64 78 5d 2e 70 56  Template[idx].pV
29b20 61 6c 75 65 2c 20 70 54 65 6d 70 6c 61 74 65 5b  alue, pTemplate[
29b30 69 64 78 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e 29  idx].ulValueLen)
29b40 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 09 09 7d  ;.....}....}...}
29b50 20 65 6c 73 65 20 7b 0a 09 09 09 63 61 63 6b 65   else {....cacke
29b60 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
29b70 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72  ion].search_quer
29b80 79 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 09 09 09  y_count = 0;....
29b90 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
29ba0 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68  hSession].search
29bb0 5f 71 75 65 72 79 20 3d 20 4e 55 4c 4c 3b 0a 09  _query = NULL;..
29bc0 09 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69  .}..} else {...i
29bd0 66 20 28 75 6c 43 6f 75 6e 74 20 21 3d 20 30 29  f (ulCount != 0)
29be0 20 7b 0a 09 09 09 63 61 63 6b 65 79 5f 6d 75 74   {....cackey_mut
29bf0 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
29c00 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 09 43  _biglock);.....C
29c10 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
29c20 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 61 72  TF("Error.  Sear
29c30 63 68 20 71 75 65 72 79 20 73 70 65 63 69 66 69  ch query specifi
29c40 65 64 20 61 73 20 4e 55 4c 4c 2c 20 62 75 74 20  ed as NULL, but 
29c50 6e 75 6d 62 65 72 20 6f 66 20 71 75 65 72 79 20  number of query 
29c60 74 65 72 6d 73 20 6e 6f 74 20 73 70 65 63 69 66  terms not specif
29c70 69 65 64 20 61 73 20 30 2e 22 29 3b 0a 0a 09 09  ied as 0.");....
29c80 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55  .return(CKR_ARGU
29c90 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 09 7d 0a  MENTS_BAD);...}.
29ca0 0a 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
29cb0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61  ns[hSession].sea
29cc0 72 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74 20  rch_query_count 
29cd0 3d 20 30 3b 0a 09 09 63 61 63 6b 65 79 5f 73 65  = 0;...cackey_se
29ce0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
29cf0 2e 73 65 61 72 63 68 5f 71 75 65 72 79 20 3d 20  .search_query = 
29d00 4e 55 4c 4c 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65  NULL;..}...cacke
29d10 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
29d20 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 61 63 74 69  ion].search_acti
29d30 76 65 20 3d 20 31 3b 0a 09 63 61 63 6b 65 79 5f  ve = 1;..cackey_
29d40 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
29d50 6e 5d 2e 73 65 61 72 63 68 5f 63 75 72 72 5f 69  n].search_curr_i
29d60 64 20 3d 20 30 3b 0a 0a 09 6d 75 74 65 78 5f 72  d = 0;...mutex_r
29d70 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
29d80 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
29d90 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
29da0 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
29db0 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
29dc0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
29dd0 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20  ror.  Unlocking 
29de0 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
29df0 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
29e00 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41  _ERROR);..}...CA
29e10 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
29e20 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
29e30 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f  _OK (%i)", CKR_O
29e40 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  K);...return(CKR
29e50 5f 4f 4b 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  _OK);.}..static 
29e60 69 6e 74 20 63 61 63 6b 65 79 5f 70 6b 63 73 31  int cackey_pkcs1
29e70 31 5f 63 6f 6d 70 61 72 65 5f 61 74 74 72 69 62  1_compare_attrib
29e80 75 74 65 73 28 43 4b 5f 41 54 54 52 49 42 55 54  utes(CK_ATTRIBUT
29e90 45 20 2a 61 2c 20 43 4b 5f 41 54 54 52 49 42 55  E *a, CK_ATTRIBU
29ea0 54 45 20 2a 62 29 20 7b 0a 09 75 6e 73 69 67 6e  TE *b) {..unsign
29eb0 65 64 20 63 68 61 72 20 2a 73 6d 61 6c 6c 62 75  ed char *smallbu
29ec0 66 2c 20 2a 6c 61 72 67 65 62 75 66 3b 0a 09 73  f, *largebuf;..s
29ed0 69 7a 65 5f 74 20 73 6d 61 6c 6c 62 75 66 5f 6c  ize_t smallbuf_l
29ee0 65 6e 2c 20 6c 61 72 67 65 62 75 66 5f 6c 65 6e  en, largebuf_len
29ef0 3b 0a 0a 09 69 66 20 28 61 2d 3e 74 79 70 65 20  ;...if (a->type 
29f00 21 3d 20 62 2d 3e 74 79 70 65 29 20 7b 0a 09 09  != b->type) {...
29f10 72 65 74 75 72 6e 28 30 29 3b 0a 09 7d 0a 0a 09  return(0);..}...
29f20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
29f30 4e 54 46 28 22 20 20 20 20 2e 2e 2e 20 66 6f 75  NTF("    ... fou
29f40 6e 64 20 6d 61 74 63 68 69 6e 67 20 74 79 70 65  nd matching type
29f50 20 2e 2e 2e 22 29 3b 0a 0a 09 43 41 43 4b 45 59   ...");...CACKEY
29f60 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28  _DEBUG_PRINTBUF(
29f70 22 20 20 20 20 2e 2e 2e 20 6f 75 72 20 76 61 6c  "    ... our val
29f80 75 65 3a 22 2c 20 61 2d 3e 70 56 61 6c 75 65 2c  ue:", a->pValue,
29f90 20 61 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 29 3b   a->ulValueLen);
29fa0 0a 0a 09 69 66 20 28 62 2d 3e 70 56 61 6c 75 65  ...if (b->pValue
29fb0 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
29fc0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
29fd0 46 28 22 20 20 20 20 20 20 20 2e 2e 2e 20 66 6f  F("       ... fo
29fe0 75 6e 64 20 77 69 6c 64 63 61 72 64 20 6d 61 74  und wildcard mat
29ff0 63 68 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  ch");....return(
2a000 31 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 61 2d 3e  1);..}...if (a->
2a010 70 56 61 6c 75 65 20 3d 3d 20 4e 55 4c 4c 29 20  pValue == NULL) 
2a020 7b 0a 09 09 72 65 74 75 72 6e 28 30 29 3b 0a 09  {...return(0);..
2a030 7d 0a 0a 20 09 69 66 20 28 62 2d 3e 75 6c 56 61  }.. .if (b->ulVa
2a040 6c 75 65 4c 65 6e 20 3d 3d 20 61 2d 3e 75 6c 56  lueLen == a->ulV
2a050 61 6c 75 65 4c 65 6e 20 26 26 20 6d 65 6d 63 6d  alueLen && memcm
2a060 70 28 61 2d 3e 70 56 61 6c 75 65 2c 20 62 2d 3e  p(a->pValue, b->
2a070 70 56 61 6c 75 65 2c 20 62 2d 3e 75 6c 56 61 6c  pValue, b->ulVal
2a080 75 65 4c 65 6e 29 20 3d 3d 20 30 29 20 7b 0a 09  ueLen) == 0) {..
2a090 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2a0a0 49 4e 54 46 28 22 20 20 20 20 20 20 20 2e 2e 2e  INTF("       ...
2a0b0 20 66 6f 75 6e 64 20 65 78 61 63 74 20 6d 61 74   found exact mat
2a0c0 63 68 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  ch");....return(
2a0d0 31 29 3b 0a 09 7d 0a 0a 09 73 77 69 74 63 68 20  1);..}...switch 
2a0e0 28 61 2d 3e 74 79 70 65 29 20 7b 0a 09 09 63 61  (a->type) {...ca
2a0f0 73 65 20 43 4b 41 5f 4d 4f 44 55 4c 55 53 3a 0a  se CKA_MODULUS:.
2a100 09 09 09 69 66 20 28 61 2d 3e 75 6c 56 61 6c 75  ...if (a->ulValu
2a110 65 4c 65 6e 20 3d 3d 20 62 2d 3e 75 6c 56 61 6c  eLen == b->ulVal
2a120 75 65 4c 65 6e 29 20 7b 0a 09 09 09 09 62 72 65  ueLen) {.....bre
2a130 61 6b 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20  ak;....}.....if 
2a140 28 61 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 20 3e  (a->ulValueLen >
2a150 20 62 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 29 20   b->ulValueLen) 
2a160 7b 0a 09 09 09 09 73 6d 61 6c 6c 62 75 66 20 3d  {.....smallbuf =
2a170 20 62 2d 3e 70 56 61 6c 75 65 3b 0a 09 09 09 09   b->pValue;.....
2a180 73 6d 61 6c 6c 62 75 66 5f 6c 65 6e 20 3d 20 62  smallbuf_len = b
2a190 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 0a 09  ->ulValueLen;...
2a1a0 09 09 09 6c 61 72 67 65 62 75 66 20 3d 20 61 2d  ...largebuf = a-
2a1b0 3e 70 56 61 6c 75 65 3b 0a 09 09 09 09 6c 61 72  >pValue;.....lar
2a1c0 67 65 62 75 66 5f 6c 65 6e 20 3d 20 61 2d 3e 75  gebuf_len = a->u
2a1d0 6c 56 61 6c 75 65 4c 65 6e 3b 0a 09 09 09 7d 20  lValueLen;....} 
2a1e0 65 6c 73 65 20 7b 0a 09 09 09 09 73 6d 61 6c 6c  else {.....small
2a1f0 62 75 66 20 3d 20 61 2d 3e 70 56 61 6c 75 65 3b  buf = a->pValue;
2a200 0a 09 09 09 09 73 6d 61 6c 6c 62 75 66 5f 6c 65  .....smallbuf_le
2a210 6e 20 3d 20 61 2d 3e 75 6c 56 61 6c 75 65 4c 65  n = a->ulValueLe
2a220 6e 3b 0a 0a 09 09 09 09 6c 61 72 67 65 62 75 66  n;......largebuf
2a230 20 3d 20 62 2d 3e 70 56 61 6c 75 65 3b 0a 09 09   = b->pValue;...
2a240 09 09 6c 61 72 67 65 62 75 66 5f 6c 65 6e 20 3d  ..largebuf_len =
2a250 20 62 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a   b->ulValueLen;.
2a260 09 09 09 7d 0a 0a 09 09 09 66 6f 72 20 28 3b 20  ...}.....for (; 
2a270 6c 61 72 67 65 62 75 66 5f 6c 65 6e 20 21 3d 20  largebuf_len != 
2a280 73 6d 61 6c 6c 62 75 66 5f 6c 65 6e 3b 20 6c 61  smallbuf_len; la
2a290 72 67 65 62 75 66 2b 2b 2c 6c 61 72 67 65 62 75  rgebuf++,largebu
2a2a0 66 5f 6c 65 6e 2d 2d 29 20 7b 0a 09 09 09 09 69  f_len--) {.....i
2a2b0 66 20 28 6c 61 72 67 65 62 75 66 5b 30 5d 20 21  f (largebuf[0] !
2a2c0 3d 20 30 29 20 7b 0a 09 09 09 09 09 62 72 65 61  = 0) {......brea
2a2d0 6b 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09  k;.....}....}...
2a2e0 09 09 69 66 20 28 6c 61 72 67 65 62 75 66 5f 6c  ..if (largebuf_l
2a2f0 65 6e 20 21 3d 20 73 6d 61 6c 6c 62 75 66 5f 6c  en != smallbuf_l
2a300 65 6e 29 20 7b 0a 09 09 09 09 62 72 65 61 6b 3b  en) {.....break;
2a310 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 6d 65  ....}.....if (me
2a320 6d 63 6d 70 28 6c 61 72 67 65 62 75 66 2c 20 73  mcmp(largebuf, s
2a330 6d 61 6c 6c 62 75 66 2c 20 73 6d 61 6c 6c 62 75  mallbuf, smallbu
2a340 66 5f 6c 65 6e 29 20 3d 3d 20 30 29 20 7b 0a 09  f_len) == 0) {..
2a350 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2a360 50 52 49 4e 54 46 28 22 20 20 20 20 20 20 20 2e  PRINTF("       .
2a370 2e 2e 20 66 6f 75 6e 64 20 61 70 70 72 6f 78 69  .. found approxi
2a380 6d 61 74 65 20 6d 61 74 63 68 22 29 3b 0a 0a 09  mate match");...
2a390 09 09 09 72 65 74 75 72 6e 28 31 29 3b 0a 09 09  ...return(1);...
2a3a0 09 7d 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 7d  .}.....break;..}
2a3b0 0a 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a 7d 0a  ...return(0);.}.
2a3c0 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
2a3d0 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 46 69 6e  ION(CK_RV, C_Fin
2a3e0 64 4f 62 6a 65 63 74 73 29 28 43 4b 5f 53 45 53  dObjects)(CK_SES
2a3f0 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
2a400 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f  sion, CK_OBJECT_
2a410 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 4f 62 6a  HANDLE_PTR phObj
2a420 65 63 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  ect, CK_ULONG ul
2a430 4d 61 78 4f 62 6a 65 63 74 43 6f 75 6e 74 2c 20  MaxObjectCount, 
2a440 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c  CK_ULONG_PTR pul
2a450 4f 62 6a 65 63 74 43 6f 75 6e 74 29 20 7b 0a 09  ObjectCount) {..
2a460 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69 64  struct cackey_id
2a470 65 6e 74 69 74 79 20 2a 63 75 72 72 5f 69 64 3b  entity *curr_id;
2a480 0a 09 43 4b 5f 41 54 54 52 49 42 55 54 45 20 2a  ..CK_ATTRIBUTE *
2a490 63 75 72 72 5f 61 74 74 72 3b 0a 09 43 4b 5f 55  curr_attr;..CK_U
2a4a0 4c 4f 4e 47 20 63 75 72 72 5f 69 64 5f 69 64 78  LONG curr_id_idx
2a4b0 2c 20 63 75 72 72 5f 6f 75 74 5f 69 64 5f 69 64  , curr_out_id_id
2a4c0 78 2c 20 63 75 72 72 5f 61 74 74 72 5f 69 64 78  x, curr_attr_idx
2a4d0 2c 20 73 65 73 73 5f 61 74 74 72 5f 69 64 78 3b  , sess_attr_idx;
2a4e0 0a 09 43 4b 5f 55 4c 4f 4e 47 20 6d 61 74 63 68  ..CK_ULONG match
2a4f0 65 64 5f 63 6f 75 6e 74 2c 20 70 72 65 76 5f 6d  ed_count, prev_m
2a500 61 74 63 68 65 64 5f 63 6f 75 6e 74 3b 0a 09 69  atched_count;..i
2a510 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b  nt mutex_retval;
2a520 0a 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f 44  .#ifdef CACKEY_D
2a530 45 42 55 47 5f 53 45 41 52 43 48 5f 53 50 45 45  EBUG_SEARCH_SPEE
2a540 44 54 45 53 54 0a 09 73 74 72 75 63 74 20 74 69  DTEST..struct ti
2a550 6d 65 76 61 6c 20 73 74 61 72 74 2c 20 65 6e 64  meval start, end
2a560 3b 0a 09 75 69 6e 74 36 34 5f 74 20 73 74 61 72  ;..uint64_t star
2a570 74 5f 69 6e 74 2c 20 65 6e 64 5f 69 6e 74 3b 0a  t_int, end_int;.
2a580 23 65 6e 64 69 66 0a 0a 09 43 41 43 4b 45 59 5f  #endif...CACKEY_
2a590 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
2a5a0 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
2a5b0 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
2a5c0 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
2a5d0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2a5e0 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
2a5f0 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
2a600 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
2a610 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
2a620 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 75 6c 4f 62  ;..}...if (pulOb
2a630 6a 65 63 74 43 6f 75 6e 74 20 3d 3d 20 4e 55 4c  jectCount == NUL
2a640 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
2a650 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2a660 72 2e 20 20 70 75 6c 4f 62 6a 65 63 74 43 6f 75  r.  pulObjectCou
2a670 6e 74 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a  nt is NULL.");..
2a680 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47  ..return(CKR_ARG
2a690 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a  UMENTS_BAD);..}.
2a6a0 0a 09 69 66 20 28 70 68 4f 62 6a 65 63 74 20 3d  ..if (phObject =
2a6b0 3d 20 4e 55 4c 4c 20 26 26 20 75 6c 4d 61 78 4f  = NULL && ulMaxO
2a6c0 62 6a 65 63 74 43 6f 75 6e 74 20 3d 3d 20 30 29  bjectCount == 0)
2a6d0 20 7b 0a 09 09 2f 2a 20 53 68 6f 72 74 20 63 69   {.../* Short ci
2a6e0 72 63 75 69 74 2c 20 69 66 20 7a 65 72 6f 20 6f  rcuit, if zero o
2a6f0 62 6a 65 63 74 73 20 77 65 72 65 20 73 70 65 63  bjects were spec
2a700 69 66 69 65 64 20 72 65 74 75 72 6e 20 7a 65 72  ified return zer
2a710 6f 20 69 74 65 6d 73 20 69 6d 6d 65 64 69 61 74  o items immediat
2a720 65 6c 79 20 2a 2f 0a 09 09 2a 70 75 6c 4f 62 6a  ely */...*pulObj
2a730 65 63 74 43 6f 75 6e 74 20 3d 20 30 3b 0a 0a 09  ectCount = 0;...
2a740 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2a750 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
2a760 43 4b 52 5f 4f 4b 20 28 25 69 29 20 28 73 68 6f  CKR_OK (%i) (sho
2a770 72 74 20 63 69 72 63 75 69 74 29 22 2c 20 43 4b  rt circuit)", CK
2a780 52 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74 75 72 6e  R_OK);....return
2a790 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69  (CKR_OK);..}...i
2a7a0 66 20 28 70 68 4f 62 6a 65 63 74 20 3d 3d 20 4e  f (phObject == N
2a7b0 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
2a7c0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2a7d0 72 6f 72 2e 20 20 70 68 4f 62 6a 65 63 74 20 69  ror.  phObject i
2a7e0 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65  s NULL.");....re
2a7f0 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e  turn(CKR_ARGUMEN
2a800 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66  TS_BAD);..}...if
2a810 20 28 75 6c 4d 61 78 4f 62 6a 65 63 74 43 6f 75   (ulMaxObjectCou
2a820 6e 74 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43  nt == 0) {...CAC
2a830 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2a840 28 22 45 72 72 6f 72 2e 20 20 4d 61 78 69 6d 75  ("Error.  Maximu
2a850 6d 20 6e 75 6d 62 65 72 20 6f 66 20 6f 62 6a 65  m number of obje
2a860 63 74 73 20 73 70 65 63 69 66 69 65 64 20 61 73  cts specified as
2a870 20 7a 65 72 6f 2e 22 29 3b 0a 0a 09 09 72 65 74   zero.");....ret
2a880 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54  urn(CKR_ARGUMENT
2a890 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  S_BAD);..}...if 
2a8a0 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c  (hSession == 0 |
2a8b0 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73  | hSession >= (s
2a8c0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
2a8d0 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28  sions) / sizeof(
2a8e0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2a8f0 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59  0]))) {...CACKEY
2a900 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2a910 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f  rror.  Session o
2a920 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a  ut of range.");.
2a930 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
2a940 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49  SESSION_HANDLE_I
2a950 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75  NVALID);..}...mu
2a960 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
2a970 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63  key_mutex_lock(c
2a980 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
2a990 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
2a9a0 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
2a9b0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2a9c0 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67  "Error.  Locking
2a9d0 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
2a9e0 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
2a9f0 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69  L_ERROR);..}...i
2aa00 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69  f (!cackey_sessi
2aa10 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63  ons[hSession].ac
2aa20 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79  tive) {...cackey
2aa30 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
2aa40 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
2aa50 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2aa60 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
2aa70 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76  ession not activ
2aa80 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
2aa90 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41  n(CKR_SESSION_HA
2aaa0 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
2aab0 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  }...if (!cackey_
2aac0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
2aad0 6e 5d 2e 73 65 61 72 63 68 5f 61 63 74 69 76 65  n].search_active
2aae0 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  ) {...cackey_mut
2aaf0 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
2ab00 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41  _biglock);....CA
2ab10 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2ab20 46 28 22 45 72 72 6f 72 2e 20 20 53 65 61 72 63  F("Error.  Searc
2ab30 68 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b  h not active.");
2ab40 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
2ab50 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49  _OPERATION_NOT_I
2ab60 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
2ab70 0a 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f 44  .#ifdef CACKEY_D
2ab80 45 42 55 47 5f 53 45 41 52 43 48 5f 53 50 45 45  EBUG_SEARCH_SPEE
2ab90 44 54 45 53 54 0a 09 67 65 74 74 69 6d 65 6f 66  DTEST..gettimeof
2aba0 64 61 79 28 26 73 74 61 72 74 2c 20 4e 55 4c 4c  day(&start, NULL
2abb0 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 63 75 72 72  );.#endif...curr
2abc0 5f 6f 75 74 5f 69 64 5f 69 64 78 20 3d 20 30 3b  _out_id_idx = 0;
2abd0 0a 09 66 6f 72 20 28 63 75 72 72 5f 69 64 5f 69  ..for (curr_id_i
2abe0 64 78 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73  dx = cackey_sess
2abf0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
2ac00 65 61 72 63 68 5f 63 75 72 72 5f 69 64 3b 20 63  earch_curr_id; c
2ac10 75 72 72 5f 69 64 5f 69 64 78 20 3c 20 63 61 63  urr_id_idx < cac
2ac20 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
2ac30 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65  ssion].identitie
2ac40 73 5f 63 6f 75 6e 74 20 26 26 20 75 6c 4d 61 78  s_count && ulMax
2ac50 4f 62 6a 65 63 74 43 6f 75 6e 74 3b 20 63 75 72  ObjectCount; cur
2ac60 72 5f 69 64 5f 69 64 78 2b 2b 29 20 7b 0a 09 09  r_id_idx++) {...
2ac70 63 75 72 72 5f 69 64 20 3d 20 26 63 61 63 6b 65  curr_id = &cacke
2ac80 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
2ac90 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5b  ion].identities[
2aca0 63 75 72 72 5f 69 64 5f 69 64 78 5d 3b 0a 0a 09  curr_id_idx];...
2acb0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2acc0 49 4e 54 46 28 22 50 72 6f 63 65 73 73 69 6e 67  INTF("Processing
2acd0 20 69 64 65 6e 74 69 74 79 3a 25 6c 75 22 2c 20   identity:%lu", 
2ace0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
2acf0 63 75 72 72 5f 69 64 5f 69 64 78 29 3b 0a 0a 09  curr_id_idx);...
2ad00 09 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 20 3d  .matched_count =
2ad10 20 30 3b 0a 0a 09 09 66 6f 72 20 28 63 75 72 72   0;....for (curr
2ad20 5f 61 74 74 72 5f 69 64 78 20 3d 20 30 3b 20 63  _attr_idx = 0; c
2ad30 75 72 72 5f 61 74 74 72 5f 69 64 78 20 3c 20 63  urr_attr_idx < c
2ad40 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
2ad50 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f  Session].search_
2ad60 71 75 65 72 79 5f 63 6f 75 6e 74 3b 20 63 75 72  query_count; cur
2ad70 72 5f 61 74 74 72 5f 69 64 78 2b 2b 29 20 7b 0a  r_attr_idx++) {.
2ad80 09 09 09 70 72 65 76 5f 6d 61 74 63 68 65 64 5f  ...prev_matched_
2ad90 63 6f 75 6e 74 20 3d 20 6d 61 74 63 68 65 64 5f  count = matched_
2ada0 63 6f 75 6e 74 3b 0a 0a 09 09 09 63 75 72 72 5f  count;.....curr_
2adb0 61 74 74 72 20 3d 20 26 63 61 63 6b 65 79 5f 73  attr = &cackey_s
2adc0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
2add0 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5b 63  ].search_query[c
2ade0 75 72 72 5f 61 74 74 72 5f 69 64 78 5d 3b 0a 0a  urr_attr_idx];..
2adf0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2ae00 50 52 49 4e 54 46 28 22 20 20 43 68 65 63 6b 69  PRINTF("  Checki
2ae10 6e 67 20 66 6f 72 20 61 74 74 72 69 62 75 74 65  ng for attribute
2ae20 20 25 73 20 28 30 78 25 30 38 6c 78 29 20 69 6e   %s (0x%08lx) in
2ae30 20 69 64 65 6e 74 69 74 79 3a 25 69 2e 2e 2e 22   identity:%i..."
2ae40 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46  , CACKEY_DEBUG_F
2ae50 55 4e 43 5f 41 54 54 52 49 42 55 54 45 5f 54 4f  UNC_ATTRIBUTE_TO
2ae60 5f 53 54 52 28 63 75 72 72 5f 61 74 74 72 2d 3e  _STR(curr_attr->
2ae70 74 79 70 65 29 2c 20 28 75 6e 73 69 67 6e 65 64  type), (unsigned
2ae80 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72   long) curr_attr
2ae90 2d 3e 74 79 70 65 2c 20 28 69 6e 74 29 20 63 75  ->type, (int) cu
2aea0 72 72 5f 69 64 5f 69 64 78 29 3b 0a 09 09 09 43  rr_id_idx);....C
2aeb0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2aec0 54 42 55 46 28 22 20 20 20 20 56 61 6c 75 65 20  TBUF("    Value 
2aed0 6c 6f 6f 6b 69 6e 67 20 66 6f 72 3a 22 2c 20 63  looking for:", c
2aee0 75 72 72 5f 61 74 74 72 2d 3e 70 56 61 6c 75 65  urr_attr->pValue
2aef0 2c 20 63 75 72 72 5f 61 74 74 72 2d 3e 75 6c 56  , curr_attr->ulV
2af00 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 66 6f  alueLen);.....fo
2af10 72 20 28 73 65 73 73 5f 61 74 74 72 5f 69 64 78  r (sess_attr_idx
2af20 20 3d 20 30 3b 20 73 65 73 73 5f 61 74 74 72 5f   = 0; sess_attr_
2af30 69 64 78 20 3c 20 63 75 72 72 5f 69 64 2d 3e 61  idx < curr_id->a
2af40 74 74 72 69 62 75 74 65 73 5f 63 6f 75 6e 74 3b  ttributes_count;
2af50 20 73 65 73 73 5f 61 74 74 72 5f 69 64 78 2b 2b   sess_attr_idx++
2af60 29 20 7b 0a 09 09 09 09 69 66 20 28 63 61 63 6b  ) {.....if (cack
2af70 65 79 5f 70 6b 63 73 31 31 5f 63 6f 6d 70 61 72  ey_pkcs11_compar
2af80 65 5f 61 74 74 72 69 62 75 74 65 73 28 26 63 75  e_attributes(&cu
2af90 72 72 5f 69 64 2d 3e 61 74 74 72 69 62 75 74 65  rr_id->attribute
2afa0 73 5b 73 65 73 73 5f 61 74 74 72 5f 69 64 78 5d  s[sess_attr_idx]
2afb0 2c 20 63 75 72 72 5f 61 74 74 72 29 29 20 7b 0a  , curr_attr)) {.
2afc0 09 09 09 09 09 6d 61 74 63 68 65 64 5f 63 6f 75  .....matched_cou
2afd0 6e 74 2b 2b 3b 0a 0a 09 09 09 09 09 62 72 65 61  nt++;.......brea
2afe0 6b 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09  k;.....}....}...
2aff0 09 09 2f 2a 20 49 66 20 74 68 65 20 61 74 74 72  ../* If the attr
2b000 69 62 75 74 65 20 63 6f 75 6c 64 20 6e 6f 74 20  ibute could not 
2b010 62 65 20 6d 61 74 63 68 65 64 2c 20 64 6f 20 6e  be matched, do n
2b020 6f 74 20 74 72 79 20 74 6f 20 6d 61 74 63 68 20  ot try to match 
2b030 61 64 64 69 74 69 6f 6e 61 6c 20 61 74 74 72 69  additional attri
2b040 62 75 74 65 73 20 2a 2f 0a 09 09 09 69 66 20 28  butes */....if (
2b050 70 72 65 76 5f 6d 61 74 63 68 65 64 5f 63 6f 75  prev_matched_cou
2b060 6e 74 20 3d 3d 20 6d 61 74 63 68 65 64 5f 63 6f  nt == matched_co
2b070 75 6e 74 29 20 7b 0a 09 09 09 09 62 72 65 61 6b  unt) {.....break
2b080 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 69 66  ;....}...}....if
2b090 20 28 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 20   (matched_count 
2b0a0 3d 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  == cackey_sessio
2b0b0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61  ns[hSession].sea
2b0c0 72 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74 29  rch_query_count)
2b0d0 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
2b0e0 55 47 5f 50 52 49 4e 54 46 28 22 20 20 2e 2e 2e  UG_PRINTF("  ...
2b0f0 20 41 6c 6c 20 25 69 20 61 74 74 72 69 62 75 74   All %i attribut
2b100 65 73 20 63 68 65 63 6b 65 64 20 66 6f 72 20 66  es checked for f
2b110 6f 75 6e 64 2c 20 61 64 64 69 6e 67 20 69 64 65  ound, adding ide
2b120 6e 74 69 74 79 3a 25 69 20 74 6f 20 72 65 74 75  ntity:%i to retu
2b130 72 6e 65 64 20 6c 69 73 74 22 2c 20 28 69 6e 74  rned list", (int
2b140 29 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ) cackey_session
2b150 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72  s[hSession].sear
2b160 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74 2c 20  ch_query_count, 
2b170 28 69 6e 74 29 20 63 75 72 72 5f 69 64 5f 69 64  (int) curr_id_id
2b180 78 29 3b 0a 0a 09 09 09 70 68 4f 62 6a 65 63 74  x);.....phObject
2b190 5b 63 75 72 72 5f 6f 75 74 5f 69 64 5f 69 64 78  [curr_out_id_idx
2b1a0 5d 20 3d 20 63 75 72 72 5f 69 64 5f 69 64 78 20  ] = curr_id_idx 
2b1b0 2b 20 31 3b 0a 0a 09 09 09 75 6c 4d 61 78 4f 62  + 1;.....ulMaxOb
2b1c0 6a 65 63 74 43 6f 75 6e 74 2d 2d 3b 0a 0a 09 09  jectCount--;....
2b1d0 09 63 75 72 72 5f 6f 75 74 5f 69 64 5f 69 64 78  .curr_out_id_idx
2b1e0 2b 2b 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09  ++;...} else {..
2b1f0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2b200 52 49 4e 54 46 28 22 20 20 2e 2e 2e 20 4e 6f 74  RINTF("  ... Not
2b210 20 61 6c 6c 20 25 69 20 28 6f 6e 6c 79 20 66 6f   all %i (only fo
2b220 75 6e 64 20 25 69 29 20 61 74 74 72 69 62 75 74  und %i) attribut
2b230 65 73 20 63 68 65 63 6b 65 64 20 66 6f 72 20 66  es checked for f
2b240 6f 75 6e 64 2c 20 6e 6f 74 20 61 64 64 69 6e 67  ound, not adding
2b250 20 69 64 65 6e 74 69 74 79 3a 25 69 22 2c 20 28   identity:%i", (
2b260 69 6e 74 29 20 63 61 63 6b 65 79 5f 73 65 73 73  int) cackey_sess
2b270 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
2b280 65 61 72 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e  earch_query_coun
2b290 74 2c 20 28 69 6e 74 29 20 6d 61 74 63 68 65 64  t, (int) matched
2b2a0 5f 63 6f 75 6e 74 2c 20 28 69 6e 74 29 20 63 75  _count, (int) cu
2b2b0 72 72 5f 69 64 5f 69 64 78 29 3b 0a 09 09 7d 0a  rr_id_idx);...}.
2b2c0 09 7d 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69  .}..cackey_sessi
2b2d0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65  ons[hSession].se
2b2e0 61 72 63 68 5f 63 75 72 72 5f 69 64 20 3d 20 63  arch_curr_id = c
2b2f0 75 72 72 5f 69 64 5f 69 64 78 3b 0a 09 2a 70 75  urr_id_idx;..*pu
2b300 6c 4f 62 6a 65 63 74 43 6f 75 6e 74 20 3d 20 63  lObjectCount = c
2b310 75 72 72 5f 6f 75 74 5f 69 64 5f 69 64 78 3b 0a  urr_out_id_idx;.
2b320 0a 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f 44  .#ifdef CACKEY_D
2b330 45 42 55 47 5f 53 45 41 52 43 48 5f 53 50 45 45  EBUG_SEARCH_SPEE
2b340 44 54 45 53 54 0a 09 67 65 74 74 69 6d 65 6f 66  DTEST..gettimeof
2b350 64 61 79 28 26 65 6e 64 2c 20 4e 55 4c 4c 29 3b  day(&end, NULL);
2b360 0a 09 73 74 61 72 74 5f 69 6e 74 20 3d 20 28 73  ..start_int = (s
2b370 74 61 72 74 2e 74 76 5f 73 65 63 20 2a 20 31 30  tart.tv_sec * 10
2b380 30 30 30 30 30 29 20 2b 20 73 74 61 72 74 2e 74  00000) + start.t
2b390 76 5f 75 73 65 63 3b 0a 09 65 6e 64 5f 69 6e 74  v_usec;..end_int
2b3a0 20 3d 20 28 65 6e 64 2e 74 76 5f 73 65 63 20 2a   = (end.tv_sec *
2b3b0 20 31 30 30 30 30 30 30 29 20 2b 20 65 6e 64 2e   1000000) + end.
2b3c0 74 76 5f 75 73 65 63 3b 0a 09 66 70 72 69 6e 74  tv_usec;..fprint
2b3d0 66 28 73 74 64 65 72 72 2c 20 22 53 65 61 72 63  f(stderr, "Searc
2b3e0 68 20 74 6f 6f 6b 20 25 6c 75 20 6d 69 63 72 6f  h took %lu micro
2b3f0 73 65 63 6f 6e 64 73 5c 6e 22 2c 20 28 75 6e 73  seconds\n", (uns
2b400 69 67 6e 65 64 20 6c 6f 6e 67 29 20 28 65 6e 64  igned long) (end
2b410 5f 69 6e 74 20 2d 20 73 74 61 72 74 5f 69 6e 74  _int - start_int
2b420 29 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 6d 75 74  ));.#endif...mut
2b430 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
2b440 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
2b450 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
2b460 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
2b470 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
2b480 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2b490 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b  ("Error.  Unlock
2b4a0 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
2b4b0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
2b4c0 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
2b4d0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2b4e0 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
2b4f0 20 43 4b 52 5f 4f 4b 20 28 25 69 29 2c 20 6e 75   CKR_OK (%i), nu
2b500 6d 20 6f 62 6a 65 63 74 73 20 3d 20 25 6c 75 22  m objects = %lu"
2b510 2c 20 43 4b 52 5f 4f 4b 2c 20 2a 70 75 6c 4f 62  , CKR_OK, *pulOb
2b520 6a 65 63 74 43 6f 75 6e 74 29 3b 0a 0a 09 72 65  jectCount);...re
2b530 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a  turn(CKR_OK);.}.
2b540 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
2b550 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 46 69 6e  ION(CK_RV, C_Fin
2b560 64 4f 62 6a 65 63 74 73 46 69 6e 61 6c 29 28 43  dObjectsFinal)(C
2b570 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
2b580 20 68 53 65 73 73 69 6f 6e 29 20 7b 0a 09 43 4b   hSession) {..CK
2b590 5f 55 4c 4f 4e 47 20 69 64 78 3b 0a 09 69 6e 74  _ULONG idx;..int
2b5a0 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a   mutex_retval;..
2b5b0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2b5c0 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
2b5d0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
2b5e0 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
2b5f0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2b600 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
2b610 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
2b620 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
2b630 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
2b640 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69  IALIZED);..}...i
2b650 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30  f (hSession == 0
2b660 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20   || hSession >= 
2b670 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
2b680 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f  essions) / sizeo
2b690 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
2b6a0 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b  s[0]))) {...CACK
2b6b0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2b6c0 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e  "Error.  Session
2b6d0 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29   out of range.")
2b6e0 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
2b6f0 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  R_SESSION_HANDLE
2b700 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
2b710 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
2b720 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b  ackey_mutex_lock
2b730 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
2b740 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
2b750 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
2b760 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2b770 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69  F("Error.  Locki
2b780 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
2b790 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
2b7a0 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
2b7b0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73  .if (!cackey_ses
2b7c0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
2b7d0 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b  active) {...cack
2b7e0 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
2b7f0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
2b800 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
2b810 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2b820 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74   Session not act
2b830 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  ive.");......ret
2b840 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  urn(CKR_SESSION_
2b850 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
2b860 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ..}...if (!cacke
2b870 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
2b880 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 61 63 74 69  ion].search_acti
2b890 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d  ve) {...cackey_m
2b8a0 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
2b8b0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
2b8c0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2b8d0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 61  NTF("Error.  Sea
2b8e0 72 63 68 20 6e 6f 74 20 61 63 74 69 76 65 2e 22  rch not active."
2b8f0 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
2b900 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54  KR_OPERATION_NOT
2b910 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
2b920 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69  }...cackey_sessi
2b930 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65  ons[hSession].se
2b940 61 72 63 68 5f 61 63 74 69 76 65 20 3d 20 30 3b  arch_active = 0;
2b950 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b  ...for (idx = 0;
2b960 20 69 64 78 20 3c 20 63 61 63 6b 65 79 5f 73 65   idx < cackey_se
2b970 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
2b980 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5f 63 6f  .search_query_co
2b990 75 6e 74 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09  unt; idx++) {...
2b9a0 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69  if (cackey_sessi
2b9b0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65  ons[hSession].se
2b9c0 61 72 63 68 5f 71 75 65 72 79 5b 69 64 78 5d 2e  arch_query[idx].
2b9d0 70 56 61 6c 75 65 29 20 7b 0a 09 09 09 66 72 65  pValue) {....fre
2b9e0 65 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  e(cackey_session
2b9f0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72  s[hSession].sear
2ba00 63 68 5f 71 75 65 72 79 5b 69 64 78 5d 2e 70 56  ch_query[idx].pV
2ba10 61 6c 75 65 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09  alue);...}..}...
2ba20 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69  if (cackey_sessi
2ba30 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65  ons[hSession].se
2ba40 61 72 63 68 5f 71 75 65 72 79 29 20 7b 0a 09 09  arch_query) {...
2ba50 66 72 65 65 28 63 61 63 6b 65 79 5f 73 65 73 73  free(cackey_sess
2ba60 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
2ba70 65 61 72 63 68 5f 71 75 65 72 79 29 3b 0a 09 7d  earch_query);..}
2ba80 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
2ba90 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  = cackey_mutex_u
2baa0 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
2bab0 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
2bac0 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
2bad0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2bae0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
2baf0 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64  Unlocking failed
2bb00 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
2bb10 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
2bb20 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
2bb30 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
2bb40 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25  urning CKR_OK (%
2bb50 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09  i)", CKR_OK);...
2bb60 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a  return(CKR_OK);.
2bb70 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
2bb80 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 45  CTION(CK_RV, C_E
2bb90 6e 63 72 79 70 74 49 6e 69 74 29 28 43 4b 5f 53  ncryptInit)(CK_S
2bba0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
2bbb0 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41  ession, CK_MECHA
2bbc0 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e  NISM_PTR pMechan
2bbd0 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48  ism, CK_OBJECT_H
2bbe0 41 4e 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09 43  ANDLE hKey) {..C
2bbf0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2bc00 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
2bc10 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
2bc20 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
2bc30 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2bc40 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
2bc50 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
2bc60 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
2bc70 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
2bc80 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
2bc90 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2bca0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
2bcb0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
2bcc0 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
2bcd0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2bce0 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
2bcf0 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
2bd00 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
2bd10 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
2bd20 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
2bd30 45 6e 63 72 79 70 74 29 28 43 4b 5f 53 45 53 53  Encrypt)(CK_SESS
2bd40 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
2bd50 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  ion, CK_BYTE_PTR
2bd60 20 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47   pData, CK_ULONG
2bd70 20 75 6c 44 61 74 61 4c 65 6e 2c 20 43 4b 5f 42   ulDataLen, CK_B
2bd80 59 54 45 5f 50 54 52 20 70 45 6e 63 72 79 70 74  YTE_PTR pEncrypt
2bd90 65 64 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47  edData, CK_ULONG
2bda0 5f 50 54 52 20 70 75 6c 45 6e 63 72 79 70 74 65  _PTR pulEncrypte
2bdb0 64 44 61 74 61 4c 65 6e 29 20 7b 0a 09 43 41 43  dDataLen) {..CAC
2bdc0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2bdd0 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
2bde0 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
2bdf0 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
2be00 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2be10 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
2be20 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
2be30 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
2be40 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
2be50 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
2be60 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2be70 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
2be80 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
2be90 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
2bea0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
2beb0 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
2bec0 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
2bed0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
2bee0 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
2bef0 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 45 6e  TION(CK_RV, C_En
2bf00 63 72 79 70 74 55 70 64 61 74 65 29 28 43 4b 5f  cryptUpdate)(CK_
2bf10 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
2bf20 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45  Session, CK_BYTE
2bf30 5f 50 54 52 20 70 50 61 72 74 2c 20 43 4b 5f 55  _PTR pPart, CK_U
2bf40 4c 4f 4e 47 20 75 6c 50 61 72 74 4c 65 6e 2c 20  LONG ulPartLen, 
2bf50 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 45 6e 63  CK_BYTE_PTR pEnc
2bf60 72 79 70 74 65 64 50 61 72 74 2c 20 43 4b 5f 55  ryptedPart, CK_U
2bf70 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 45 6e 63 72  LONG_PTR pulEncr
2bf80 79 70 74 65 64 50 61 72 74 4c 65 6e 29 20 7b 0a  yptedPartLen) {.
2bf90 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2bfa0 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
2bfb0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
2bfc0 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
2bfd0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2bfe0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
2bff0 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
2c000 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
2c010 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
2c020 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
2c030 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2c040 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
2c050 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2c060 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20  UPPORTED (%i)", 
2c070 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
2c080 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72  _SUPPORTED);...r
2c090 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
2c0a0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
2c0b0 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
2c0c0 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
2c0d0 43 5f 45 6e 63 72 79 70 74 46 69 6e 61 6c 29 28  C_EncryptFinal)(
2c0e0 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
2c0f0 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42  E hSession, CK_B
2c100 59 54 45 5f 50 54 52 20 70 4c 61 73 74 45 6e 63  YTE_PTR pLastEnc
2c110 72 79 70 74 65 64 50 61 72 74 2c 20 43 4b 5f 55  ryptedPart, CK_U
2c120 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 4c 61 73 74  LONG_PTR pulLast
2c130 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e  EncryptedPartLen
2c140 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
2c150 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
2c160 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
2c170 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
2c180 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
2c190 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2c1a0 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
2c1b0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
2c1c0 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
2c1d0 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
2c1e0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2c1f0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
2c200 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
2c210 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
2c220 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
2c230 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
2c240 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
2c250 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
2c260 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
2c270 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
2c280 52 56 2c 20 43 5f 44 65 63 72 79 70 74 49 6e 69  RV, C_DecryptIni
2c290 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  t)(CK_SESSION_HA
2c2a0 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
2c2b0 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20  K_MECHANISM_PTR 
2c2c0 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f  pMechanism, CK_O
2c2d0 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65  BJECT_HANDLE hKe
2c2e0 79 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f  y) {..int mutex_
2c2f0 72 65 74 76 61 6c 3b 0a 0a 09 68 4b 65 79 2d 2d  retval;...hKey--
2c300 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
2c310 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
2c320 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
2c330 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
2c340 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2c350 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
2c360 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
2c370 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
2c380 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
2c390 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
2c3a0 0a 09 69 66 20 28 70 4d 65 63 68 61 6e 69 73 6d  ..if (pMechanism
2c3b0 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
2c3c0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2c3d0 46 28 22 45 72 72 6f 72 2e 20 70 4d 65 63 68 61  F("Error. pMecha
2c3e0 6e 69 73 6d 20 69 73 20 4e 55 4c 4c 2e 22 29 3b  nism is NULL.");
2c3f0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41  ....return(CKR_A
2c400 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09  RGUMENTS_BAD);..
2c410 7d 0a 0a 09 69 66 20 28 70 4d 65 63 68 61 6e 69  }...if (pMechani
2c420 73 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d 20 21 3d  sm->mechanism !=
2c430 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 29 20 7b   CKM_RSA_PKCS) {
2c440 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2c450 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70  PRINTF("Error. p
2c460 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d 65 63 68 61  Mechanism->mecha
2c470 6e 69 73 6d 20 6e 6f 74 20 73 70 65 63 69 66 69  nism not specifi
2c480 65 64 20 61 73 20 43 4b 4d 5f 52 53 41 5f 50 4b  ed as CKM_RSA_PK
2c490 43 53 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  CS");....return(
2c4a0 43 4b 52 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 41  CKR_MECHANISM_PA
2c4b0 52 41 4d 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  RAM_INVALID);..}
2c4c0 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20  ...if (hSession 
2c4d0 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e  == 0 || hSession
2c4e0 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b   >= (sizeof(cack
2c4f0 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73  ey_sessions) / s
2c500 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
2c510 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09  sions[0]))) {...
2c520 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2c530 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73  NTF("Error.  Ses
2c540 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67  sion out of rang
2c550 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
2c560 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41  n(CKR_SESSION_HA
2c570 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
2c580 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  }...mutex_retval
2c590 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
2c5a0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
2c5b0 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
2c5c0 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
2c5d0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2c5e0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c  RINTF("Error.  L
2c5f0 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
2c600 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
2c610 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
2c620 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  .}...if (!cackey
2c630 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
2c640 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09  on].active) {...
2c650 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
2c660 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
2c670 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ck);....CACKEY_D
2c680 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2c690 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74  or.  Session not
2c6a0 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09   active.");.....
2c6b0 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
2c6c0 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
2c6d0 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61  ID);..}...if (ca
2c6e0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
2c6f0 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f  ession].decrypt_
2c700 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b  active) {...cack
2c710 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
2c720 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
2c730 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
2c740 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2c750 20 44 65 63 72 79 70 74 20 61 6c 72 65 61 64 79   Decrypt already
2c760 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 22 29 3b   in progress.");
2c770 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
2c780 5f 4f 50 45 52 41 54 49 4f 4e 5f 41 43 54 49 56  _OPERATION_ACTIV
2c790 45 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 4b 65  E);..}...if (hKe
2c7a0 79 20 3e 3d 20 63 61 63 6b 65 79 5f 73 65 73 73  y >= cackey_sess
2c7b0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69  ions[hSession].i
2c7c0 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 29  dentities_count)
2c7d0 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65   {...cackey_mute
2c7e0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
2c7f0 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43  biglock);....CAC
2c800 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2c810 28 22 45 72 72 6f 72 2e 20 20 4b 65 79 20 68 61  ("Error.  Key ha
2c820 6e 64 6c 65 20 6f 75 74 20 6f 66 20 72 61 6e 67  ndle out of rang
2c830 65 20 28 72 65 71 75 65 73 74 65 64 20 6b 65 79  e (requested key
2c840 20 25 6c 75 2c 20 6f 6e 6c 79 20 25 6c 75 20 69   %lu, only %lu i
2c850 64 65 6e 74 69 74 69 65 73 20 61 76 61 69 6c 61  dentities availa
2c860 62 6c 65 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65  ble).", (unsigne
2c870 64 20 6c 6f 6e 67 29 20 68 4b 65 79 2c 20 28 75  d long) hKey, (u
2c880 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 61  nsigned long) ca
2c890 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
2c8a0 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69  ession].identiti
2c8b0 65 73 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09 72 65  es_count);....re
2c8c0 74 75 72 6e 28 43 4b 52 5f 4b 45 59 5f 48 41 4e  turn(CKR_KEY_HAN
2c8d0 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  DLE_INVALID);..}
2c8e0 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
2c8f0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63  ns[hSession].dec
2c900 72 79 70 74 5f 61 63 74 69 76 65 20 3d 20 31 3b  rypt_active = 1;
2c910 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
2c920 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63  ns[hSession].dec
2c930 72 79 70 74 5f 6d 65 63 68 61 6e 69 73 6d 20 3d  rypt_mechanism =
2c940 20 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d 65 63   pMechanism->mec
2c950 68 61 6e 69 73 6d 3b 0a 09 63 61 63 6b 65 79 5f  hanism;..cackey_
2c960 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
2c970 6e 5d 2e 64 65 63 72 79 70 74 5f 6d 65 63 68 5f  n].decrypt_mech_
2c980 70 61 72 6d 20 3d 20 70 4d 65 63 68 61 6e 69 73  parm = pMechanis
2c990 6d 2d 3e 70 50 61 72 61 6d 65 74 65 72 3b 0a 09  m->pParameter;..
2c9a0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2c9b0 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70  hSession].decryp
2c9c0 74 5f 6d 65 63 68 5f 70 61 72 6d 6c 65 6e 20 3d  t_mech_parmlen =
2c9d0 20 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 75 6c 50   pMechanism->ulP
2c9e0 61 72 61 6d 65 74 65 72 4c 65 6e 3b 0a 09 63 61  arameterLen;..ca
2c9f0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
2ca00 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f  ession].decrypt_
2ca10 69 64 65 6e 74 69 74 79 20 3d 20 26 63 61 63 6b  identity = &cack
2ca20 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
2ca30 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73  sion].identities
2ca40 5b 68 4b 65 79 5d 3b 0a 0a 09 6d 75 74 65 78 5f  [hKey];...mutex_
2ca50 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
2ca60 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
2ca70 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
2ca80 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
2ca90 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
2caa0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2cab0 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67  rror.  Unlocking
2cac0 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
2cad0 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
2cae0 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43  L_ERROR);..}...C
2caf0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2cb00 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
2cb10 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f  R_OK (%i)", CKR_
2cb20 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  OK);...return(CK
2cb30 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  R_OK);.}..CK_DEF
2cb40 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
2cb50 52 56 2c 20 43 5f 44 65 63 72 79 70 74 29 28 43  RV, C_Decrypt)(C
2cb60 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
2cb70 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59   hSession, CK_BY
2cb80 54 45 5f 50 54 52 20 70 45 6e 63 72 79 70 74 65  TE_PTR pEncrypte
2cb90 64 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20  dData, CK_ULONG 
2cba0 75 6c 45 6e 63 72 79 70 74 65 64 44 61 74 61 4c  ulEncryptedDataL
2cbb0 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  en, CK_BYTE_PTR 
2cbc0 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 5f  pData, CK_ULONG_
2cbd0 50 54 52 20 70 75 6c 44 61 74 61 4c 65 6e 29 20  PTR pulDataLen) 
2cbe0 7b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 64 61 74 61  {..CK_ULONG data
2cbf0 6c 65 6e 5f 75 70 64 61 74 65 2c 20 64 61 74 61  len_update, data
2cc00 6c 65 6e 5f 66 69 6e 61 6c 3b 0a 09 43 4b 5f 52  len_final;..CK_R
2cc10 56 20 64 65 63 72 79 70 74 5f 72 65 74 3b 0a 09  V decrypt_ret;..
2cc20 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c  int mutex_retval
2cc30 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
2cc40 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
2cc50 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
2cc60 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
2cc70 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2cc80 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
2cc90 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
2cca0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
2ccb0 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
2ccc0 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
2ccd0 0a 09 69 66 20 28 70 75 6c 44 61 74 61 4c 65 6e  ..if (pulDataLen
2cce0 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
2ccf0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2cd00 46 28 22 45 72 72 6f 72 2e 20 70 75 6c 44 61 74  F("Error. pulDat
2cd10 61 4c 65 6e 20 69 73 20 4e 55 4c 4c 2e 22 29 3b  aLen is NULL.");
2cd20 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41  ....return(CKR_A
2cd30 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09  RGUMENTS_BAD);..
2cd40 7d 0a 0a 09 64 61 74 61 6c 65 6e 5f 75 70 64 61  }...datalen_upda
2cd50 74 65 20 3d 20 2a 70 75 6c 44 61 74 61 4c 65 6e  te = *pulDataLen
2cd60 3b 0a 0a 09 64 65 63 72 79 70 74 5f 72 65 74 20  ;...decrypt_ret 
2cd70 3d 20 43 5f 44 65 63 72 79 70 74 55 70 64 61 74  = C_DecryptUpdat
2cd80 65 28 68 53 65 73 73 69 6f 6e 2c 20 70 45 6e 63  e(hSession, pEnc
2cd90 72 79 70 74 65 64 44 61 74 61 2c 20 75 6c 45 6e  ryptedData, ulEn
2cda0 63 72 79 70 74 65 64 44 61 74 61 4c 65 6e 2c 20  cryptedDataLen, 
2cdb0 70 44 61 74 61 2c 20 26 64 61 74 61 6c 65 6e 5f  pData, &datalen_
2cdc0 75 70 64 61 74 65 29 3b 0a 09 69 66 20 28 64 65  update);..if (de
2cdd0 63 72 79 70 74 5f 72 65 74 20 21 3d 20 43 4b 52  crypt_ret != CKR
2cde0 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  _OK) {...CACKEY_
2cdf0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2ce00 72 6f 72 2e 20 20 44 65 63 72 79 70 74 55 70 64  ror.  DecryptUpd
2ce10 61 74 65 28 29 20 72 65 74 75 72 6e 65 64 20 66  ate() returned f
2ce20 61 69 6c 75 72 65 20 28 72 76 20 3d 20 25 6c 75  ailure (rv = %lu
2ce30 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ).", (unsigned l
2ce40 6f 6e 67 29 20 64 65 63 72 79 70 74 5f 72 65 74  ong) decrypt_ret
2ce50 29 3b 0a 0a 09 09 69 66 20 28 64 65 63 72 79 70  );....if (decryp
2ce60 74 5f 72 65 74 20 21 3d 20 43 4b 52 5f 42 55 46  t_ret != CKR_BUF
2ce70 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 20 7b  FER_TOO_SMALL) {
2ce80 0a 09 09 09 2f 2a 20 54 65 72 6d 69 6e 61 74 65  ..../* Terminate
2ce90 20 64 65 63 72 79 70 74 69 6f 6e 20 6f 70 65 72   decryption oper
2cea0 61 74 69 6f 6e 20 2a 2f 0a 0a 09 09 09 6d 75 74  ation */.....mut
2ceb0 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
2cec0 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61  ey_mutex_lock(ca
2ced0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
2cee0 09 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
2cef0 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 09 09 43  al != 0) {.....C
2cf00 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2cf10 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b  TF("Error.  Lock
2cf20 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
2cf30 09 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
2cf40 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
2cf50 09 09 7d 0a 0a 09 09 09 69 66 20 28 21 63 61 63  ..}.....if (!cac
2cf60 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
2cf70 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b  ssion].active) {
2cf80 0a 09 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65  .....cackey_mute
2cf90 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
2cfa0 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 09 09 43  biglock);......C
2cfb0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2cfc0 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73  TF("Error.  Sess
2cfd0 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22  ion not active."
2cfe0 29 3b 0a 09 09 0a 09 09 09 09 72 65 74 75 72 6e  );........return
2cff0 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  (CKR_SESSION_HAN
2d000 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 09  DLE_INVALID);...
2d010 09 7d 0a 0a 09 09 09 69 66 20 28 21 63 61 63 6b  .}.....if (!cack
2d020 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
2d030 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 61 63  sion].decrypt_ac
2d040 74 69 76 65 29 20 7b 0a 09 09 09 09 63 61 63 6b  tive) {.....cack
2d050 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
2d060 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
2d070 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
2d080 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2d090 2e 20 20 44 65 63 72 79 70 74 20 6e 6f 74 20 61  .  Decrypt not a
2d0a0 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 09  ctive.");.......
2d0b0 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52  .return(CKR_OPER
2d0c0 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41  ATION_NOT_INITIA
2d0d0 4c 49 5a 45 44 29 3b 0a 09 09 09 7d 0a 0a 09 09  LIZED);....}....
2d0e0 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
2d0f0 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79  [hSession].decry
2d100 70 74 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a 0a  pt_active = 0;..
2d110 09 09 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
2d120 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  = cackey_mutex_u
2d130 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
2d140 6c 6f 63 6b 29 3b 0a 09 09 09 69 66 20 28 6d 75  lock);....if (mu
2d150 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
2d160 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45   {.....CACKEY_DE
2d170 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2d180 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61  r.  Unlocking fa
2d190 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 09 09 72 65  iled.");......re
2d1a0 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
2d1b0 5f 45 52 52 4f 52 29 3b 0a 09 09 09 7d 0a 09 09  _ERROR);....}...
2d1c0 7d 0a 0a 09 09 72 65 74 75 72 6e 28 64 65 63 72  }....return(decr
2d1d0 79 70 74 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09 69  ypt_ret);..}...i
2d1e0 66 20 28 70 44 61 74 61 29 20 7b 0a 09 09 70 44  f (pData) {...pD
2d1f0 61 74 61 20 2b 3d 20 64 61 74 61 6c 65 6e 5f 75  ata += datalen_u
2d200 70 64 61 74 65 3b 0a 09 7d 0a 09 64 61 74 61 6c  pdate;..}..datal
2d210 65 6e 5f 66 69 6e 61 6c 20 3d 20 2a 70 75 6c 44  en_final = *pulD
2d220 61 74 61 4c 65 6e 20 2d 20 64 61 74 61 6c 65 6e  ataLen - datalen
2d230 5f 75 70 64 61 74 65 3b 0a 0a 09 64 65 63 72 79  _update;...decry
2d240 70 74 5f 72 65 74 20 3d 20 43 5f 44 65 63 72 79  pt_ret = C_Decry
2d250 70 74 46 69 6e 61 6c 28 68 53 65 73 73 69 6f 6e  ptFinal(hSession
2d260 2c 20 70 44 61 74 61 2c 20 26 64 61 74 61 6c 65  , pData, &datale
2d270 6e 5f 66 69 6e 61 6c 29 3b 0a 09 69 66 20 28 64  n_final);..if (d
2d280 65 63 72 79 70 74 5f 72 65 74 20 21 3d 20 43 4b  ecrypt_ret != CK
2d290 52 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59  R_OK) {...CACKEY
2d2a0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2d2b0 72 72 6f 72 2e 20 20 44 65 63 72 79 70 74 46 69  rror.  DecryptFi
2d2c0 6e 61 6c 28 29 20 72 65 74 75 72 6e 65 64 20 66  nal() returned f
2d2d0 61 69 6c 75 72 65 20 28 72 76 20 3d 20 25 6c 75  ailure (rv = %lu
2d2e0 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ).", (unsigned l
2d2f0 6f 6e 67 29 20 64 65 63 72 79 70 74 5f 72 65 74  ong) decrypt_ret
2d300 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 64 65 63  );....return(dec
2d310 72 79 70 74 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09  rypt_ret);..}...
2d320 2a 70 75 6c 44 61 74 61 4c 65 6e 20 3d 20 64 61  *pulDataLen = da
2d330 74 61 6c 65 6e 5f 75 70 64 61 74 65 20 2b 20 64  talen_update + d
2d340 61 74 61 6c 65 6e 5f 66 69 6e 61 6c 3b 0a 0a 09  atalen_final;...
2d350 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2d360 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
2d370 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52  KR_OK (%i)", CKR
2d380 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  _OK);...return(C
2d390 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  KR_OK);.}..CK_DE
2d3a0 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
2d3b0 5f 52 56 2c 20 43 5f 44 65 63 72 79 70 74 55 70  _RV, C_DecryptUp
2d3c0 64 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e  date)(CK_SESSION
2d3d0 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
2d3e0 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 45  , CK_BYTE_PTR pE
2d3f0 6e 63 72 79 70 74 65 64 50 61 72 74 2c 20 43 4b  ncryptedPart, CK
2d400 5f 55 4c 4f 4e 47 20 75 6c 45 6e 63 72 79 70 74  _ULONG ulEncrypt
2d410 65 64 50 61 72 74 4c 65 6e 2c 20 43 4b 5f 42 59  edPartLen, CK_BY
2d420 54 45 5f 50 54 52 20 70 50 61 72 74 2c 20 43 4b  TE_PTR pPart, CK
2d430 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 50 61  _ULONG_PTR pulPa
2d440 72 74 4c 65 6e 29 20 7b 0a 09 73 74 61 74 69 63  rtLen) {..static
2d450 20 43 4b 5f 42 59 54 45 20 62 75 66 5b 31 36 33   CK_BYTE buf[163
2d460 38 34 5d 3b 0a 09 73 73 69 7a 65 5f 74 20 62 75  84];..ssize_t bu
2d470 66 6c 65 6e 3b 0a 09 43 4b 5f 53 4c 4f 54 5f 49  flen;..CK_SLOT_I
2d480 44 20 73 6c 6f 74 49 44 3b 0a 09 43 4b 5f 52 56  D slotID;..CK_RV
2d490 20 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 47 45   retval = CKR_GE
2d4a0 4e 45 52 41 4c 5f 45 52 52 4f 52 3b 0a 09 69 6e  NERAL_ERROR;..in
2d4b0 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a  t mutex_retval;.
2d4c0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2d4d0 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
2d4e0 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
2d4f0 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
2d500 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2d510 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
2d520 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
2d530 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
2d540 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
2d550 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
2d560 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20  if (hSession == 
2d570 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d  0 || hSession >=
2d580 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
2d590 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65  sessions) / size
2d5a0 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
2d5b0 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43  ns[0]))) {...CAC
2d5c0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2d5d0 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f  ("Error.  Sessio
2d5e0 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22  n out of range."
2d5f0 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
2d600 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  KR_SESSION_HANDL
2d610 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
2d620 09 69 66 20 28 70 45 6e 63 72 79 70 74 65 64 50  .if (pEncryptedP
2d630 61 72 74 20 3d 3d 20 4e 55 4c 4c 20 26 26 20 75  art == NULL && u
2d640 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65  lEncryptedPartLe
2d650 6e 20 3d 3d 20 30 29 20 7b 0a 09 09 2f 2a 20 53  n == 0) {.../* S
2d660 68 6f 72 74 20 63 69 72 63 75 69 74 20 69 66 20  hort circuit if 
2d670 77 65 20 61 72 65 20 61 73 6b 65 64 20 74 6f 20  we are asked to 
2d680 64 65 63 72 79 70 74 20 6e 6f 74 68 69 6e 67 2e  decrypt nothing.
2d690 2e 2e 20 2a 2f 0a 09 09 43 41 43 4b 45 59 5f 44  .. */...CACKEY_D
2d6a0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
2d6b0 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25  urning CKR_OK (%
2d6c0 69 29 20 28 73 68 6f 72 74 20 63 69 72 63 75 69  i) (short circui
2d6d0 74 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09  t)", CKR_OK);...
2d6e0 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b  .return(CKR_OK);
2d6f0 0a 09 7d 0a 0a 09 69 66 20 28 70 45 6e 63 72 79  ..}...if (pEncry
2d700 70 74 65 64 50 61 72 74 20 3d 3d 20 4e 55 4c 4c  ptedPart == NULL
2d710 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
2d720 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2d730 2e 20 70 45 6e 63 72 79 70 74 65 64 50 61 72 74  . pEncryptedPart
2d740 20 69 73 20 4e 55 4c 4c 2c 20 62 75 74 20 75 6c   is NULL, but ul
2d750 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e  EncryptedPartLen
2d760 20 69 73 20 6e 6f 74 20 30 2e 22 29 3b 0a 0a 09   is not 0.");...
2d770 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55  .return(CKR_ARGU
2d780 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a  MENTS_BAD);..}..
2d790 09 69 66 20 28 75 6c 45 6e 63 72 79 70 74 65 64  .if (ulEncrypted
2d7a0 50 61 72 74 4c 65 6e 20 3d 3d 20 30 29 20 7b 0a  PartLen == 0) {.
2d7b0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2d7c0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 75 6c  RINTF("Error. ul
2d7d0 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e  EncryptedPartLen
2d7e0 20 69 73 20 30 2c 20 62 75 74 20 70 50 61 72 74   is 0, but pPart
2d7f0 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 22 29 3b   is not NULL.");
2d800 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41  ....return(CKR_A
2d810 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09  RGUMENTS_BAD);..
2d820 7d 0a 0a 09 69 66 20 28 70 75 6c 50 61 72 74 4c  }...if (pulPartL
2d830 65 6e 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  en == NULL) {...
2d840 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2d850 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 75 6c 50  NTF("Error. pulP
2d860 61 72 74 4c 65 6e 20 69 73 20 4e 55 4c 4c 2e 22  artLen is NULL."
2d870 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
2d880 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b  _ARGUMENTS_BAD);
2d890 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  ..}...mutex_retv
2d8a0 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
2d8b0 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  x_lock(cackey_bi
2d8c0 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
2d8d0 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
2d8e0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
2d8f0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2d900 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e   Locking failed.
2d910 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
2d920 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
2d930 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b  ;..}...if (!cack
2d940 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
2d950 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a  sion].active) {.
2d960 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
2d970 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
2d980 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59  lock);....CACKEY
2d990 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2d9a0 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e  rror.  Session n
2d9b0 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09  ot active.");...
2d9c0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
2d9d0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56  SSION_HANDLE_INV
2d9e0 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  ALID);..}...if (
2d9f0 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  !cackey_sessions
2da00 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79  [hSession].decry
2da10 70 74 5f 61 63 74 69 76 65 29 20 7b 0a 09 09 63  pt_active) {...c
2da20 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
2da30 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
2da40 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  k);....CACKEY_DE
2da50 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2da60 72 2e 20 20 44 65 63 72 79 70 74 20 6e 6f 74 20  r.  Decrypt not 
2da70 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09  active.");......
2da80 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41  return(CKR_OPERA
2da90 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TION_NOT_INITIAL
2daa0 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74  IZED);..}...slot
2dab0 49 44 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73  ID = cackey_sess
2dac0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
2dad0 6c 6f 74 49 44 3b 0a 0a 09 69 66 20 28 73 6c 6f  lotID;...if (slo
2dae0 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49  tID < 0 || slotI
2daf0 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63  D >= (sizeof(cac
2db00 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a  key_slots) / siz
2db10 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
2db20 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45  [0]))) {...CACKE
2db30 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2db40 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73  Error. Invalid s
2db50 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25  lot requested (%
2db60 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20  lu), outside of 
2db70 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c  valid range", sl
2db80 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e  otID);....return
2db90 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
2dba0 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61  OR);..}...if (ca
2dbb0 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
2dbc0 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 29 20  D].active == 0) 
2dbd0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
2dbe0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2dbf0 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71  Invalid slot req
2dc00 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 73 6c  uested (%lu), sl
2dc10 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79  ot not currently
2dc20 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 49 44   active", slotID
2dc30 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  );....cackey_mut
2dc40 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
2dc50 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65  _biglock);....re
2dc60 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
2dc70 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 73 77  _ERROR);..}...sw
2dc80 69 74 63 68 20 28 63 61 63 6b 65 79 5f 73 65 73  itch (cackey_ses
2dc90 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
2dca0 64 65 63 72 79 70 74 5f 6d 65 63 68 61 6e 69 73  decrypt_mechanis
2dcb0 6d 29 20 7b 0a 09 09 63 61 73 65 20 43 4b 4d 5f  m) {...case CKM_
2dcc0 52 53 41 5f 50 4b 43 53 3a 0a 09 09 09 2f 2a 20  RSA_PKCS:..../* 
2dcd0 41 73 6b 20 63 61 72 64 20 74 6f 20 64 65 63 72  Ask card to decr
2dce0 79 70 74 20 2a 2f 0a 09 09 09 62 75 66 6c 65 6e  ypt */....buflen
2dcf0 20 3d 20 63 61 63 6b 65 79 5f 73 69 67 6e 64 65   = cackey_signde
2dd00 63 72 79 70 74 28 26 63 61 63 6b 65 79 5f 73 6c  crypt(&cackey_sl
2dd10 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c 20 63 61 63  ots[slotID], cac
2dd20 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
2dd30 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 69  ssion].decrypt_i
2dd40 64 65 6e 74 69 74 79 2c 20 70 45 6e 63 72 79 70  dentity, pEncryp
2dd50 74 65 64 50 61 72 74 2c 20 75 6c 45 6e 63 72 79  tedPart, ulEncry
2dd60 70 74 65 64 50 61 72 74 4c 65 6e 2c 20 62 75 66  ptedPartLen, buf
2dd70 2c 20 73 69 7a 65 6f 66 28 62 75 66 29 2c 20 30  , sizeof(buf), 0
2dd80 2c 20 31 29 3b 0a 0a 09 09 09 69 66 20 28 62 75  , 1);.....if (bu
2dd90 66 6c 65 6e 20 3d 3d 20 43 41 43 4b 45 59 5f 50  flen == CACKEY_P
2dda0 43 53 43 5f 45 5f 4e 45 45 44 4c 4f 47 49 4e 20  CSC_E_NEEDLOGIN 
2ddb0 26 26 20 63 61 63 6b 65 79 5f 70 69 6e 5f 63 6f  && cackey_pin_co
2ddc0 6d 6d 61 6e 64 20 21 3d 20 4e 55 4c 4c 29 20 7b  mmand != NULL) {
2ddd0 0a 09 09 09 09 69 66 20 28 5f 43 5f 4c 6f 67 69  .....if (_C_Logi
2dde0 6e 4d 75 74 65 78 41 72 67 28 68 53 65 73 73 69  nMutexArg(hSessi
2ddf0 6f 6e 2c 20 43 4b 55 5f 55 53 45 52 2c 20 4e 55  on, CKU_USER, NU
2de00 4c 4c 2c 20 30 2c 20 30 29 20 3d 3d 20 43 4b 52  LL, 0, 0) == CKR
2de10 5f 4f 4b 29 20 7b 0a 09 09 09 09 09 62 75 66 6c  _OK) {......bufl
2de20 65 6e 20 3d 20 63 61 63 6b 65 79 5f 73 69 67 6e  en = cackey_sign
2de30 64 65 63 72 79 70 74 28 26 63 61 63 6b 65 79 5f  decrypt(&cackey_
2de40 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c 20 63  slots[slotID], c
2de50 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
2de60 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74  Session].decrypt
2de70 5f 69 64 65 6e 74 69 74 79 2c 20 70 45 6e 63 72  _identity, pEncr
2de80 79 70 74 65 64 50 61 72 74 2c 20 75 6c 45 6e 63  yptedPart, ulEnc
2de90 72 79 70 74 65 64 50 61 72 74 4c 65 6e 2c 20 62  ryptedPartLen, b
2dea0 75 66 2c 20 73 69 7a 65 6f 66 28 62 75 66 29 2c  uf, sizeof(buf),
2deb0 20 30 2c 20 31 29 3b 0a 09 09 09 09 7d 0a 09 09   0, 1);.....}...
2dec0 09 7d 0a 0a 09 09 09 69 66 20 28 62 75 66 6c 65  .}.....if (bufle
2ded0 6e 20 3c 20 30 29 20 7b 0a 09 09 09 09 2f 2a 20  n < 0) {...../* 
2dee0 44 65 63 72 79 70 74 69 6f 6e 20 66 61 69 6c 65  Decryption faile
2def0 64 2e 20 2a 2f 0a 09 09 09 09 69 66 20 28 62 75  d. */.....if (bu
2df00 66 6c 65 6e 20 3d 3d 20 43 41 43 4b 45 59 5f 50  flen == CACKEY_P
2df10 43 53 43 5f 45 5f 4e 45 45 44 4c 4f 47 49 4e 29  CSC_E_NEEDLOGIN)
2df20 20 7b 0a 09 09 09 09 09 72 65 74 76 61 6c 20 3d   {......retval =
2df30 20 43 4b 52 5f 55 53 45 52 5f 4e 4f 54 5f 4c 4f   CKR_USER_NOT_LO
2df40 47 47 45 44 5f 49 4e 3b 0a 09 09 09 09 7d 20 65  GGED_IN;.....} e
2df50 6c 73 65 20 69 66 20 28 62 75 66 6c 65 6e 20 3d  lse if (buflen =
2df60 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  = CACKEY_PCSC_E_
2df70 54 4f 4b 45 4e 41 42 53 45 4e 54 29 20 7b 0a 09  TOKENABSENT) {..
2df80 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52  ....retval = CKR
2df90 5f 44 45 56 49 43 45 5f 52 45 4d 4f 56 45 44 3b  _DEVICE_REMOVED;
2dfa0 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  .....} else {...
2dfb0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2dfc0 50 52 49 4e 54 46 28 22 46 61 69 6c 65 64 20 74  PRINTF("Failed t
2dfd0 6f 20 73 65 6e 64 20 41 50 44 55 2c 20 65 72 72  o send APDU, err
2dfe0 6f 72 20 3d 20 25 6c 69 22 2c 20 28 6c 6f 6e 67  or = %li", (long
2dff0 20 69 6e 74 29 20 62 75 66 6c 65 6e 29 3b 0a 0a   int) buflen);..
2e000 09 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b  .....retval = CK
2e010 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 3b  R_GENERAL_ERROR;
2e020 0a 09 09 09 09 7d 0a 09 09 09 7d 20 65 6c 73 65  .....}....} else
2e030 20 69 66 20 28 28 28 75 6e 73 69 67 6e 65 64 20   if (((unsigned 
2e040 6c 6f 6e 67 29 20 62 75 66 6c 65 6e 29 20 3e 20  long) buflen) > 
2e050 2a 70 75 6c 50 61 72 74 4c 65 6e 20 26 26 20 70  *pulPartLen && p
2e060 50 61 72 74 29 20 7b 0a 09 09 09 09 2f 2a 20 44  Part) {...../* D
2e070 65 63 72 79 70 74 65 64 20 64 61 74 61 20 74 6f  ecrypted data to
2e080 6f 20 6c 61 72 67 65 20 2a 2f 0a 09 09 09 09 72  o large */.....r
2e090 65 74 76 61 6c 20 3d 20 43 4b 52 5f 42 55 46 46  etval = CKR_BUFF
2e0a0 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 3b 0a 09 09  ER_TOO_SMALL;...
2e0b0 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 69 66  .} else {.....if
2e0c0 20 28 70 50 61 72 74 29 20 7b 0a 09 09 09 09 09   (pPart) {......
2e0d0 6d 65 6d 63 70 79 28 70 50 61 72 74 2c 20 62 75  memcpy(pPart, bu
2e0e0 66 2c 20 62 75 66 6c 65 6e 29 3b 0a 09 09 09 09  f, buflen);.....
2e0f0 7d 0a 0a 09 09 09 09 2a 70 75 6c 50 61 72 74 4c  }......*pulPartL
2e100 65 6e 20 3d 20 62 75 66 6c 65 6e 3b 0a 0a 09 09  en = buflen;....
2e110 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 4f  ..retval = CKR_O
2e120 4b 3b 0a 09 09 09 7d 0a 0a 09 09 09 62 72 65 61  K;....}.....brea
2e130 6b 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65  k;..}...mutex_re
2e140 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
2e150 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
2e160 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
2e170 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
2e180 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
2e190 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2e1a0 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66  or.  Unlocking f
2e1b0 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
2e1c0 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
2e1d0 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43  ERROR);..}...CAC
2e1e0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2e1f0 28 22 52 65 74 75 72 6e 69 6e 67 20 25 69 22 2c  ("Returning %i",
2e200 20 28 69 6e 74 29 20 72 65 74 76 61 6c 29 3b 0a   (int) retval);.
2e210 0a 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29  ..return(retval)
2e220 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
2e230 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
2e240 5f 44 65 63 72 79 70 74 46 69 6e 61 6c 29 28 43  _DecryptFinal)(C
2e250 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
2e260 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59   hSession, CK_BY
2e270 54 45 5f 50 54 52 20 70 4c 61 73 74 50 61 72 74  TE_PTR pLastPart
2e280 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70  , CK_ULONG_PTR p
2e290 75 6c 4c 61 73 74 50 61 72 74 4c 65 6e 29 20 7b  ulLastPartLen) {
2e2a0 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76  ..int mutex_retv
2e2b0 61 6c 3b 0a 09 69 6e 74 20 74 65 72 6d 69 6e 61  al;..int termina
2e2c0 74 65 5f 64 65 63 72 79 70 74 20 3d 20 31 3b 0a  te_decrypt = 1;.
2e2d0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2e2e0 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
2e2f0 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
2e300 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
2e310 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2e320 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
2e330 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
2e340 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
2e350 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
2e360 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
2e370 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20  if (hSession == 
2e380 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d  0 || hSession >=
2e390 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
2e3a0 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65  sessions) / size
2e3b0 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
2e3c0 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43  ns[0]))) {...CAC
2e3d0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2e3e0 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f  ("Error.  Sessio
2e3f0 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22  n out of range."
2e400 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
2e410 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  KR_SESSION_HANDL
2e420 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
2e430 09 69 66 20 28 70 75 6c 4c 61 73 74 50 61 72 74  .if (pulLastPart
2e440 4c 65 6e 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  Len == NULL) {..
2e450 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2e460 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 75 6c  INTF("Error. pul
2e470 4c 61 73 74 50 61 72 74 4c 65 6e 20 69 73 20 4e  LastPartLen is N
2e480 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  ULL.");....retur
2e490 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f  n(CKR_ARGUMENTS_
2e4a0 42 41 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78  BAD);..}...mutex
2e4b0 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
2e4c0 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b  _mutex_lock(cack
2e4d0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
2e4e0 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
2e4f0 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
2e500 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2e510 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61  ror.  Locking fa
2e520 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
2e530 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
2e540 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  RROR);..}...if (
2e550 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  !cackey_sessions
2e560 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76  [hSession].activ
2e570 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75  e) {...cackey_mu
2e580 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
2e590 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43  y_biglock);....C
2e5a0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2e5b0 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73  TF("Error.  Sess
2e5c0 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22  ion not active."
2e5d0 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
2e5e0 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  KR_SESSION_HANDL
2e5f0 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
2e600 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73  .if (!cackey_ses
2e610 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
2e620 64 65 63 72 79 70 74 5f 61 63 74 69 76 65 29 20  decrypt_active) 
2e630 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  {...cackey_mutex
2e640 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
2e650 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b  iglock);....CACK
2e660 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2e670 22 45 72 72 6f 72 2e 20 20 44 65 63 72 79 70 74  "Error.  Decrypt
2e680 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a   not active.");.
2e690 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
2e6a0 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e  OPERATION_NOT_IN
2e6b0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
2e6c0 09 2a 70 75 6c 4c 61 73 74 50 61 72 74 4c 65 6e  .*pulLastPartLen
2e6d0 20 3d 20 30 3b 0a 0a 09 69 66 20 28 70 4c 61 73   = 0;...if (pLas
2e6e0 74 50 61 72 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b  tPart == NULL) {
2e6f0 0a 09 09 74 65 72 6d 69 6e 61 74 65 5f 64 65 63  ...terminate_dec
2e700 72 79 70 74 20 3d 20 30 3b 0a 09 7d 0a 0a 09 69  rypt = 0;..}...i
2e710 66 20 28 74 65 72 6d 69 6e 61 74 65 5f 64 65 63  f (terminate_dec
2e720 72 79 70 74 29 20 7b 0a 09 09 63 61 63 6b 65 79  rypt) {...cackey
2e730 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
2e740 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 61 63 74 69  on].decrypt_acti
2e750 76 65 20 3d 20 30 3b 0a 09 7d 0a 0a 09 6d 75 74  ve = 0;..}...mut
2e760 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
2e770 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
2e780 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
2e790 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
2e7a0 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
2e7b0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2e7c0 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b  ("Error.  Unlock
2e7d0 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
2e7e0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
2e7f0 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
2e800 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2e810 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
2e820 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43   CKR_OK (%i)", C
2e830 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e  KR_OK);...return
2e840 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f  (CKR_OK);.}..CK_
2e850 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
2e860 43 4b 5f 52 56 2c 20 43 5f 44 69 67 65 73 74 49  CK_RV, C_DigestI
2e870 6e 69 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  nit)(CK_SESSION_
2e880 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
2e890 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54   CK_MECHANISM_PT
2e8a0 52 20 70 4d 65 63 68 61 6e 69 73 6d 29 20 7b 0a  R pMechanism) {.
2e8b0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2e8c0 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
2e8d0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
2e8e0 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
2e8f0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2e900 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
2e910 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
2e920 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
2e930 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
2e940 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
2e950 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2e960 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
2e970 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2e980 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20  UPPORTED (%i)", 
2e990 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
2e9a0 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72  _SUPPORTED);...r
2e9b0 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
2e9c0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
2e9d0 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
2e9e0 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
2e9f0 43 5f 44 69 67 65 73 74 29 28 43 4b 5f 53 45 53  C_Digest)(CK_SES
2ea00 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
2ea10 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  sion, CK_BYTE_PT
2ea20 52 20 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e  R pData, CK_ULON
2ea30 47 20 75 6c 44 61 74 61 4c 65 6e 2c 20 43 4b 5f  G ulDataLen, CK_
2ea40 42 59 54 45 5f 50 54 52 20 70 44 69 67 65 73 74  BYTE_PTR pDigest
2ea50 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70  , CK_ULONG_PTR p
2ea60 75 6c 44 69 67 65 73 74 4c 65 6e 29 20 7b 0a 09  ulDigestLen) {..
2ea70 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2ea80 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
2ea90 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
2eaa0 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
2eab0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2eac0 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
2ead0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
2eae0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
2eaf0 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
2eb00 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
2eb10 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2eb20 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
2eb30 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
2eb40 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
2eb50 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
2eb60 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
2eb70 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
2eb80 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
2eb90 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
2eba0 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
2ebb0 5f 44 69 67 65 73 74 55 70 64 61 74 65 29 28 43  _DigestUpdate)(C
2ebc0 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
2ebd0 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59   hSession, CK_BY
2ebe0 54 45 5f 50 54 52 20 70 50 61 72 74 2c 20 43 4b  TE_PTR pPart, CK
2ebf0 5f 55 4c 4f 4e 47 20 75 6c 50 61 72 74 4c 65 6e  _ULONG ulPartLen
2ec00 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
2ec10 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
2ec20 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
2ec30 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
2ec40 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
2ec50 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2ec60 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
2ec70 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
2ec80 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
2ec90 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
2eca0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2ecb0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
2ecc0 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
2ecd0 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
2ece0 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
2ecf0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
2ed00 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
2ed10 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
2ed20 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
2ed30 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
2ed40 52 56 2c 20 43 5f 44 69 67 65 73 74 4b 65 79 29  RV, C_DigestKey)
2ed50 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
2ed60 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
2ed70 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b  OBJECT_HANDLE hK
2ed80 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  ey) {..CACKEY_DE
2ed90 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
2eda0 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
2edb0 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
2edc0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
2edd0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2ede0 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
2edf0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
2ee00 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
2ee10 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
2ee20 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
2ee30 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
2ee40 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
2ee50 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
2ee60 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
2ee70 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
2ee80 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
2ee90 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
2eea0 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
2eeb0 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
2eec0 4b 5f 52 56 2c 20 43 5f 44 69 67 65 73 74 46 69  K_RV, C_DigestFi
2eed0 6e 61 6c 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  nal)(CK_SESSION_
2eee0 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
2eef0 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 44 69   CK_BYTE_PTR pDi
2ef00 67 65 73 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50  gest, CK_ULONG_P
2ef10 54 52 20 70 75 6c 44 69 67 65 73 74 4c 65 6e 29  TR pulDigestLen)
2ef20 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
2ef30 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
2ef40 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
2ef50 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
2ef60 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2ef70 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
2ef80 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
2ef90 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
2efa0 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
2efb0 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
2efc0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2efd0 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
2efe0 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
2eff0 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
2f000 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
2f010 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
2f020 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
2f030 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
2f040 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  TED);.}..CK_DEFI
2f050 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
2f060 56 2c 20 43 5f 53 69 67 6e 49 6e 69 74 29 28 43  V, C_SignInit)(C
2f070 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
2f080 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45   hSession, CK_ME
2f090 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63  CHANISM_PTR pMec
2f0a0 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43  hanism, CK_OBJEC
2f0b0 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79 29 20 7b  T_HANDLE hKey) {
2f0c0 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76  ..int mutex_retv
2f0d0 61 6c 3b 0a 0a 09 68 4b 65 79 2d 2d 3b 0a 0a 09  al;...hKey--;...
2f0e0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2f0f0 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
2f100 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
2f110 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
2f120 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2f130 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
2f140 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
2f150 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
2f160 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
2f170 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66  ALIZED);..}...if
2f180 20 28 70 4d 65 63 68 61 6e 69 73 6d 20 3d 3d 20   (pMechanism == 
2f190 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
2f1a0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2f1b0 72 72 6f 72 2e 20 70 4d 65 63 68 61 6e 69 73 6d  rror. pMechanism
2f1c0 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09   is NULL.");....
2f1d0 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d  return(CKR_ARGUM
2f1e0 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09  ENTS_BAD);..}...
2f1f0 69 66 20 28 70 4d 65 63 68 61 6e 69 73 6d 2d 3e  if (pMechanism->
2f200 6d 65 63 68 61 6e 69 73 6d 20 21 3d 20 43 4b 4d  mechanism != CKM
2f210 5f 52 53 41 5f 50 4b 43 53 29 20 7b 0a 09 09 43  _RSA_PKCS) {...C
2f220 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2f230 54 46 28 22 45 72 72 6f 72 2e 20 70 4d 65 63 68  TF("Error. pMech
2f240 61 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d  anism->mechanism
2f250 20 6e 6f 74 20 73 70 65 63 69 66 69 65 64 20 61   not specified a
2f260 73 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 22 29  s CKM_RSA_PKCS")
2f270 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
2f280 4d 45 43 48 41 4e 49 53 4d 5f 50 41 52 41 4d 5f  MECHANISM_PARAM_
2f290 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69  INVALID);..}...i
2f2a0 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30  f (hSession == 0
2f2b0 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20   || hSession >= 
2f2c0 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
2f2d0 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f  essions) / sizeo
2f2e0 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
2f2f0 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b  s[0]))) {...CACK
2f300 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2f310 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e  "Error.  Session
2f320 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29   out of range.")
2f330 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
2f340 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  R_SESSION_HANDLE
2f350 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
2f360 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
2f370 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b  ackey_mutex_lock
2f380 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
2f390 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
2f3a0 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
2f3b0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2f3c0 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69  F("Error.  Locki
2f3d0 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
2f3e0 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
2f3f0 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
2f400 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73  .if (!cackey_ses
2f410 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
2f420 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b  active) {...cack
2f430 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
2f440 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
2f450 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
2f460 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2f470 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74   Session not act
2f480 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  ive.");......ret
2f490 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  urn(CKR_SESSION_
2f4a0 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
2f4b0 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79  ..}...if (cackey
2f4c0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
2f4d0 6f 6e 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65 29  on].sign_active)
2f4e0 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65   {...cackey_mute
2f4f0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
2f500 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43  biglock);....CAC
2f510 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2f520 28 22 45 72 72 6f 72 2e 20 20 53 69 67 6e 20 61  ("Error.  Sign a
2f530 6c 72 65 61 64 79 20 69 6e 20 70 72 6f 67 72 65  lready in progre
2f540 73 73 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ss.");......retu
2f550 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e  rn(CKR_OPERATION
2f560 5f 41 43 54 49 56 45 29 3b 0a 09 7d 0a 0a 09 69  _ACTIVE);..}...i
2f570 66 20 28 68 4b 65 79 20 3e 3d 20 63 61 63 6b 65  f (hKey >= cacke
2f580 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
2f590 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f  ion].identities_
2f5a0 63 6f 75 6e 74 29 20 7b 0a 09 09 63 61 63 6b 65  count) {...cacke
2f5b0 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
2f5c0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
2f5d0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2f5e0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
2f5f0 4b 65 79 20 68 61 6e 64 6c 65 20 6f 75 74 20 6f  Key handle out o
2f600 66 20 72 61 6e 67 65 20 28 72 65 71 75 65 73 74  f range (request
2f610 65 64 20 6b 65 79 20 25 6c 75 2c 20 6f 6e 6c 79  ed key %lu, only
2f620 20 25 6c 75 20 69 64 65 6e 74 69 74 69 65 73 20   %lu identities 
2f630 61 76 61 69 6c 61 62 6c 65 29 2e 22 2c 20 28 75  available).", (u
2f640 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 68 4b  nsigned long) hK
2f650 65 79 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  ey, (unsigned lo
2f660 6e 67 29 20 63 61 63 6b 65 79 5f 73 65 73 73 69  ng) cackey_sessi
2f670 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64  ons[hSession].id
2f680 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 29 3b  entities_count);
2f690 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4b  ....return(CKR_K
2f6a0 45 59 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  EY_HANDLE_INVALI
2f6b0 44 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f  D);..}...cackey_
2f6c0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
2f6d0 6e 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65 20 3d  n].sign_active =
2f6e0 20 31 3b 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73   1;...cackey_ses
2f6f0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
2f700 73 69 67 6e 5f 6d 65 63 68 61 6e 69 73 6d 20 3d  sign_mechanism =
2f710 20 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d 65 63   pMechanism->mec
2f720 68 61 6e 69 73 6d 3b 0a 0a 09 63 61 63 6b 65 79  hanism;...cackey
2f730 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
2f740 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 6c 65 6e 20  on].sign_buflen 
2f750 3d 20 31 32 38 3b 0a 09 63 61 63 6b 65 79 5f 73  = 128;..cackey_s
2f760 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
2f770 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 20 3d  ].sign_bufused =
2f780 20 30 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73 73   0;..cackey_sess
2f790 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
2f7a0 69 67 6e 5f 62 75 66 20 3d 20 6d 61 6c 6c 6f 63  ign_buf = malloc
2f7b0 28 73 69 7a 65 6f 66 28 2a 63 61 63 6b 65 79 5f  (sizeof(*cackey_
2f7c0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
2f7d0 6e 5d 2e 73 69 67 6e 5f 62 75 66 29 20 2a 20 63  n].sign_buf) * c
2f7e0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
2f7f0 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75  Session].sign_bu
2f800 66 6c 65 6e 29 3b 0a 0a 09 43 41 43 4b 45 59 5f  flen);...CACKEY_
2f810 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 65  DEBUG_PRINTF("Se
2f820 73 73 69 6f 6e 20 25 6c 75 20 73 69 67 6e 5f 69  ssion %lu sign_i
2f830 64 65 6e 74 69 74 79 20 69 73 20 25 70 20 28 69  dentity is %p (i
2f840 64 65 6e 74 69 74 79 20 23 25 6c 75 29 22 2c 20  dentity #%lu)", 
2f850 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
2f860 68 53 65 73 73 69 6f 6e 2c 20 28 76 6f 69 64 20  hSession, (void 
2f870 2a 29 20 26 63 61 63 6b 65 79 5f 73 65 73 73 69  *) &cackey_sessi
2f880 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64  ons[hSession].id
2f890 65 6e 74 69 74 69 65 73 5b 68 4b 65 79 5d 2c 20  entities[hKey], 
2f8a0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
2f8b0 68 4b 65 79 29 3b 0a 09 63 61 63 6b 65 79 5f 73  hKey);..cackey_s
2f8c0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
2f8d0 5d 2e 73 69 67 6e 5f 69 64 65 6e 74 69 74 79 20  ].sign_identity 
2f8e0 3d 20 26 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  = &cackey_sessio
2f8f0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65  ns[hSession].ide
2f900 6e 74 69 74 69 65 73 5b 68 4b 65 79 5d 3b 0a 0a  ntities[hKey];..
2f910 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
2f920 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
2f930 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
2f940 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
2f950 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
2f960 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2f970 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e  INTF("Error.  Un
2f980 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  locking failed."
2f990 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
2f9a0 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
2f9b0 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
2f9c0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
2f9d0 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29  ning CKR_OK (%i)
2f9e0 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65  ", CKR_OK);...re
2f9f0 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a  turn(CKR_OK);.}.
2fa00 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
2fa10 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 69 67  ION(CK_RV, C_Sig
2fa20 6e 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  n)(CK_SESSION_HA
2fa30 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
2fa40 4b 5f 42 59 54 45 5f 50 54 52 20 70 44 61 74 61  K_BYTE_PTR pData
2fa50 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 44 61 74  , CK_ULONG ulDat
2fa60 61 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  aLen, CK_BYTE_PT
2fa70 52 20 70 53 69 67 6e 61 74 75 72 65 2c 20 43 4b  R pSignature, CK
2fa80 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 53 69  _ULONG_PTR pulSi
2fa90 67 6e 61 74 75 72 65 4c 65 6e 29 20 7b 0a 09 75  gnatureLen) {..u
2faa0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 73 74 61  nsigned long sta
2fab0 72 74 5f 73 69 67 6e 5f 62 75 66 75 73 65 64 3b  rt_sign_bufused;
2fac0 0a 09 43 4b 5f 52 56 20 73 69 67 6e 5f 72 65 74  ..CK_RV sign_ret
2fad0 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74  ;..int mutex_ret
2fae0 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  val;...CACKEY_DE
2faf0 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
2fb00 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
2fb10 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
2fb20 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
2fb30 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2fb40 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
2fb50 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
2fb60 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
2fb70 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
2fb80 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f  .}...if (hSessio
2fb90 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69  n == 0 || hSessi
2fba0 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61  on >= (sizeof(ca
2fbb0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f  ckey_sessions) /
2fbc0 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73   sizeof(cackey_s
2fbd0 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a  essions[0]))) {.
2fbe0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2fbf0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
2fc00 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61  ession out of ra
2fc10 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  nge.");......ret
2fc20 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  urn(CKR_SESSION_
2fc30 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
2fc40 0a 09 7d 0a 0a 09 73 74 61 72 74 5f 73 69 67 6e  ..}...start_sign
2fc50 5f 62 75 66 75 73 65 64 20 3d 20 63 61 63 6b 65  _bufused = cacke
2fc60 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
2fc70 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65  ion].sign_bufuse
2fc80 64 3b 0a 0a 09 73 69 67 6e 5f 72 65 74 20 3d 20  d;...sign_ret = 
2fc90 43 5f 53 69 67 6e 55 70 64 61 74 65 28 68 53 65  C_SignUpdate(hSe
2fca0 73 73 69 6f 6e 2c 20 70 44 61 74 61 2c 20 75 6c  ssion, pData, ul
2fcb0 44 61 74 61 4c 65 6e 29 3b 0a 09 69 66 20 28 73  DataLen);..if (s
2fcc0 69 67 6e 5f 72 65 74 20 21 3d 20 43 4b 52 5f 4f  ign_ret != CKR_O
2fcd0 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  K) {...CACKEY_DE
2fce0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2fcf0 72 2e 20 20 53 69 67 6e 55 70 64 61 74 65 28 29  r.  SignUpdate()
2fd00 20 72 65 74 75 72 6e 65 64 20 66 61 69 6c 75 72   returned failur
2fd10 65 20 28 72 76 20 3d 20 25 6c 75 29 2e 22 2c 20  e (rv = %lu).", 
2fd20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
2fd30 73 69 67 6e 5f 72 65 74 29 3b 0a 0a 09 09 69 66  sign_ret);....if
2fd40 20 28 73 69 67 6e 5f 72 65 74 20 21 3d 20 43 4b   (sign_ret != CK
2fd50 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41  R_BUFFER_TOO_SMA
2fd60 4c 4c 29 20 7b 0a 09 09 09 6d 75 74 65 78 5f 72  LL) {....mutex_r
2fd70 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
2fd80 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79  utex_lock(cackey
2fd90 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 09 69 66  _biglock);....if
2fda0 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
2fdb0 3d 20 30 29 20 7b 0a 09 09 09 09 43 41 43 4b 45  = 0) {.....CACKE
2fdc0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2fdd0 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20  Error.  Locking 
2fde0 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 09 09  failed.");......
2fdf0 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
2fe00 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 09 09 7d 0a  AL_ERROR);....}.
2fe10 0a 09 09 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ....if (!cackey_
2fe20 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
2fe30 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 09  n].active) {....
2fe40 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
2fe50 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
2fe60 6f 63 6b 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45  ock);......CACKE
2fe70 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2fe80 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20  Error.  Session 
2fe90 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09  not active.");..
2fea0 09 0a 09 09 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
2feb0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
2fec0 49 4e 56 41 4c 49 44 29 3b 0a 09 09 09 7d 0a 0a  INVALID);....}..
2fed0 09 09 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73  ...if (!cackey_s
2fee0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
2fef0 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65 29 20 7b  ].sign_active) {
2ff00 0a 09 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65  .....cackey_mute
2ff10 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
2ff20 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 09 09 43  biglock);......C
2ff30 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2ff40 54 46 28 22 45 72 72 6f 72 2e 20 20 53 69 67 6e  TF("Error.  Sign
2ff50 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a   not active.");.
2ff60 09 09 0a 09 09 09 09 72 65 74 75 72 6e 28 43 4b  .......return(CK
2ff70 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f  R_OPERATION_NOT_
2ff80 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 09  INITIALIZED);...
2ff90 09 7d 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65  .}.....cackey_se
2ffa0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
2ffb0 2e 73 69 67 6e 5f 61 63 74 69 76 65 20 3d 20 30  .sign_active = 0
2ffc0 3b 0a 0a 09 09 09 6d 75 74 65 78 5f 72 65 74 76  ;.....mutex_retv
2ffd0 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
2ffe0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
2fff0 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 09 69 66 20  biglock);....if 
30000 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
30010 20 30 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59   0) {.....CACKEY
30020 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
30030 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67  rror.  Unlocking
30040 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 09   failed.");.....
30050 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
30060 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 09 09 7d  RAL_ERROR);....}
30070 0a 09 09 7d 0a 0a 09 09 72 65 74 75 72 6e 28 73  ...}....return(s
30080 69 67 6e 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09 73  ign_ret);..}...s
30090 69 67 6e 5f 72 65 74 20 3d 20 43 5f 53 69 67 6e  ign_ret = C_Sign
300a0 46 69 6e 61 6c 28 68 53 65 73 73 69 6f 6e 2c 20  Final(hSession, 
300b0 70 53 69 67 6e 61 74 75 72 65 2c 20 70 75 6c 53  pSignature, pulS
300c0 69 67 6e 61 74 75 72 65 4c 65 6e 29 3b 0a 09 69  ignatureLen);..i
300d0 66 20 28 73 69 67 6e 5f 72 65 74 20 21 3d 20 43  f (sign_ret != C
300e0 4b 52 5f 4f 4b 29 20 7b 0a 09 09 69 66 20 28 73  KR_OK) {...if (s
300f0 69 67 6e 5f 72 65 74 20 3d 3d 20 43 4b 52 5f 42  ign_ret == CKR_B
30100 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 29  UFFER_TOO_SMALL)
30110 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
30120 55 47 5f 50 52 49 4e 54 46 28 22 53 69 67 6e 46  UG_PRINTF("SignF
30130 69 6e 61 6c 28 29 20 72 65 74 75 72 6e 65 64 20  inal() returned 
30140 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53  CKR_BUFFER_TOO_S
30150 4d 41 4c 4c 20 28 72 76 20 3d 20 25 6c 75 29 2c  MALL (rv = %lu),
30160 20 75 6e 64 6f 69 6e 67 20 43 5f 53 69 67 6e 55   undoing C_SignU
30170 70 64 61 74 65 28 29 22 2c 20 28 75 6e 73 69 67  pdate()", (unsig
30180 6e 65 64 20 6c 6f 6e 67 29 20 73 69 67 6e 5f 72  ned long) sign_r
30190 65 74 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f  et);.....cackey_
301a0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
301b0 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 20  n].sign_bufused 
301c0 3d 20 73 74 61 72 74 5f 73 69 67 6e 5f 62 75 66  = start_sign_buf
301d0 75 73 65 64 3b 0a 0a 09 09 09 72 65 74 75 72 6e  used;.....return
301e0 28 73 69 67 6e 5f 72 65 74 29 3b 0a 09 09 7d 0a  (sign_ret);...}.
301f0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
30200 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
30210 53 69 67 6e 46 69 6e 61 6c 28 29 20 72 65 74 75  SignFinal() retu
30220 72 6e 65 64 20 66 61 69 6c 75 72 65 20 28 72 76  rned failure (rv
30230 20 3d 20 25 6c 75 29 2e 22 2c 20 28 75 6e 73 69   = %lu).", (unsi
30240 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69 67 6e 5f  gned long) sign_
30250 72 65 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  ret);....return(
30260 73 69 67 6e 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09  sign_ret);..}...
30270 69 66 20 28 70 53 69 67 6e 61 74 75 72 65 20 3d  if (pSignature =
30280 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
30290 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
302a0 22 70 53 69 67 6e 61 74 75 72 65 20 73 70 65 63  "pSignature spec
302b0 69 66 69 65 64 20 61 73 20 4e 55 4c 4c 2c 20 75  ified as NULL, u
302c0 6e 64 6f 69 6e 67 20 43 5f 53 69 67 6e 55 70 64  ndoing C_SignUpd
302d0 61 74 65 28 29 22 29 3b 0a 0a 09 09 63 61 63 6b  ate()");....cack
302e0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
302f0 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73  sion].sign_bufus
30300 65 64 20 3d 20 73 74 61 72 74 5f 73 69 67 6e 5f  ed = start_sign_
30310 62 75 66 75 73 65 64 3b 0a 0a 09 09 72 65 74 75  bufused;....retu
30320 72 6e 28 73 69 67 6e 5f 72 65 74 29 3b 0a 09 7d  rn(sign_ret);..}
30330 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
30340 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
30350 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20  g CKR_OK (%i)", 
30360 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72  CKR_OK);...retur
30370 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b  n(CKR_OK);.}..CK
30380 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
30390 28 43 4b 5f 52 56 2c 20 43 5f 53 69 67 6e 55 70  (CK_RV, C_SignUp
303a0 64 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e  date)(CK_SESSION
303b0 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
303c0 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50  , CK_BYTE_PTR pP
303d0 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  art, CK_ULONG ul
303e0 50 61 72 74 4c 65 6e 29 20 7b 0a 09 69 6e 74 20  PartLen) {..int 
303f0 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09 69  mutex_retval;..i
30400 6e 74 20 72 65 73 69 7a 65 52 65 74 72 79 3b 0a  nt resizeRetry;.
30410 09 69 6e 74 20 6e 65 65 64 52 65 73 69 7a 65 3b  .int needResize;
30420 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
30430 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
30440 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
30450 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
30460 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
30470 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
30480 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
30490 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
304a0 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
304b0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
304c0 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d  .if (hSession ==
304d0 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e   0 || hSession >
304e0 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  = (sizeof(cackey
304f0 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a  _sessions) / siz
30500 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
30510 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41  ons[0]))) {...CA
30520 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
30530 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69  F("Error.  Sessi
30540 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e  on out of range.
30550 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
30560 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  CKR_SESSION_HAND
30570 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  LE_INVALID);..}.
30580 0a 09 69 66 20 28 70 50 61 72 74 20 3d 3d 20 4e  ..if (pPart == N
30590 55 4c 4c 20 26 26 20 75 6c 50 61 72 74 4c 65 6e  ULL && ulPartLen
305a0 20 3d 3d 20 30 29 20 7b 0a 09 09 2f 2a 20 53 68   == 0) {.../* Sh
305b0 6f 72 74 20 63 69 72 63 75 69 74 20 69 66 20 77  ort circuit if w
305c0 65 20 61 72 65 20 61 73 6b 65 64 20 74 6f 20 73  e are asked to s
305d0 69 67 6e 20 6e 6f 74 68 69 6e 67 2e 2e 2e 20 2a  ign nothing... *
305e0 2f 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  /...CACKEY_DEBUG
305f0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
30600 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 20 28  ng CKR_OK (%i) (
30610 73 68 6f 72 74 20 63 69 72 63 75 69 74 29 22 2c  short circuit)",
30620 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74   CKR_OK);....ret
30630 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a  urn(CKR_OK);..}.
30640 0a 09 69 66 20 28 70 50 61 72 74 20 3d 3d 20 4e  ..if (pPart == N
30650 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
30660 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
30670 72 6f 72 2e 20 70 50 61 72 74 20 69 73 20 4e 55  ror. pPart is NU
30680 4c 4c 2c 20 62 75 74 20 75 6c 50 61 72 74 4c 65  LL, but ulPartLe
30690 6e 20 69 73 20 6e 6f 74 20 30 2e 22 29 3b 0a 0a  n is not 0.");..
306a0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47  ..return(CKR_ARG
306b0 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a  UMENTS_BAD);..}.
306c0 0a 09 69 66 20 28 75 6c 50 61 72 74 4c 65 6e 20  ..if (ulPartLen 
306d0 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  == 0) {...CACKEY
306e0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
306f0 72 72 6f 72 2e 20 75 6c 50 61 72 74 4c 65 6e 20  rror. ulPartLen 
30700 69 73 20 30 2c 20 62 75 74 20 70 50 61 72 74 20  is 0, but pPart 
30710 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 22 29 3b 0a  is not NULL.");.
30720 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52  ...return(CKR_AR
30730 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d  GUMENTS_BAD);..}
30740 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
30750 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c  = cackey_mutex_l
30760 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
30770 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
30780 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
30790 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
307a0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f  INTF("Error.  Lo
307b0 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
307c0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
307d0 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
307e0 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  }...if (!cackey_
307f0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
30800 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63  n].active) {...c
30810 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
30820 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
30830 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  k);....CACKEY_DE
30840 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
30850 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20  r.  Session not 
30860 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09  active.");......
30870 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
30880 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  ON_HANDLE_INVALI
30890 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61  D);..}...if (!ca
308a0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
308b0 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 61 63 74  ession].sign_act
308c0 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  ive) {...cackey_
308d0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
308e0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
308f0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
30900 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 69  INTF("Error.  Si
30910 67 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29  gn not active.")
30920 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
30930 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f  R_OPERATION_NOT_
30940 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
30950 0a 0a 09 73 77 69 74 63 68 20 28 63 61 63 6b 65  ...switch (cacke
30960 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
30970 69 6f 6e 5d 2e 73 69 67 6e 5f 6d 65 63 68 61 6e  ion].sign_mechan
30980 69 73 6d 29 20 7b 0a 09 09 63 61 73 65 20 43 4b  ism) {...case CK
30990 4d 5f 52 53 41 5f 50 4b 43 53 3a 0a 09 09 09 2f  M_RSA_PKCS:..../
309a0 2a 20 41 63 63 75 6d 75 6c 61 74 65 20 64 69 72  * Accumulate dir
309b0 65 63 74 6c 79 20 2a 2f 0a 09 09 09 66 6f 72 20  ectly */....for 
309c0 28 72 65 73 69 7a 65 52 65 74 72 79 20 3d 20 30  (resizeRetry = 0
309d0 3b 20 72 65 73 69 7a 65 52 65 74 72 79 20 3c 20  ; resizeRetry < 
309e0 31 31 3b 20 72 65 73 69 7a 65 52 65 74 72 79 2b  11; resizeRetry+
309f0 2b 29 20 7b 0a 09 09 09 09 6e 65 65 64 52 65 73  +) {.....needRes
30a00 69 7a 65 20 3d 20 30 3b 0a 09 09 09 09 69 66 20  ize = 0;.....if 
30a10 28 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ((cackey_session
30a20 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
30a30 5f 62 75 66 75 73 65 64 20 2b 20 75 6c 50 61 72  _bufused + ulPar
30a40 74 4c 65 6e 29 20 3e 20 63 61 63 6b 65 79 5f 73  tLen) > cackey_s
30a50 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
30a60 5d 2e 73 69 67 6e 5f 62 75 66 6c 65 6e 29 20 7b  ].sign_buflen) {
30a70 0a 09 09 09 09 09 6e 65 65 64 52 65 73 69 7a 65  ......needResize
30a80 20 3d 20 31 3b 0a 09 09 09 09 7d 0a 0a 09 09 09   = 1;.....}.....
30a90 09 69 66 20 28 21 6e 65 65 64 52 65 73 69 7a 65  .if (!needResize
30aa0 29 20 7b 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a  ) {......break;.
30ab0 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45  ....}......CACKE
30ac0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
30ad0 52 65 73 69 7a 69 6e 67 20 73 69 67 6e 69 6e 67  Resizing signing
30ae0 20 62 75 66 66 65 72 20 28 74 72 79 20 23 25 69   buffer (try #%i
30af0 20 6f 66 20 31 30 20 2d 2d 20 31 31 74 68 20 69   of 10 -- 11th i
30b00 73 20 66 61 74 61 6c 29 22 2c 20 72 65 73 69 7a  s fatal)", resiz
30b10 65 52 65 74 72 79 29 3b 0a 0a 09 09 09 09 69 66  eRetry);......if
30b20 20 28 72 65 73 69 7a 65 52 65 74 72 79 20 3d 3d   (resizeRetry ==
30b30 20 31 30 29 20 7b 0a 09 09 09 09 09 66 72 65 65   10) {......free
30b40 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
30b50 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
30b60 62 75 66 29 3b 0a 0a 09 09 09 09 09 63 61 63 6b  buf);.......cack
30b70 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
30b80 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 6c 65  sion].sign_bufle
30b90 6e 20 3d 20 30 3b 0a 09 09 09 09 09 63 61 63 6b  n = 0;......cack
30ba0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
30bb0 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 20 3d  sion].sign_buf =
30bc0 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09 09 62 72 65   NULL;.......bre
30bd0 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 63  ak;.....}......c
30be0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
30bf0 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75  Session].sign_bu
30c00 66 6c 65 6e 20 2a 3d 20 32 3b 0a 0a 09 09 09 09  flen *= 2;......
30c10 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
30c20 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62  hSession].sign_b
30c30 75 66 20 3d 20 72 65 61 6c 6c 6f 63 28 63 61 63  uf = realloc(cac
30c40 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
30c50 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 2c  ssion].sign_buf,
30c60 20 73 69 7a 65 6f 66 28 2a 63 61 63 6b 65 79 5f   sizeof(*cackey_
30c70 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
30c80 6e 5d 2e 73 69 67 6e 5f 62 75 66 29 20 2a 20 63  n].sign_buf) * c
30c90 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
30ca0 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75  Session].sign_bu
30cb0 66 6c 65 6e 29 3b 0a 09 09 09 7d 0a 0a 09 09 09  flen);....}.....
30cc0 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69  if (cackey_sessi
30cd0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
30ce0 67 6e 5f 62 75 66 20 3d 3d 20 4e 55 4c 4c 29 20  gn_buf == NULL) 
30cf0 7b 0a 09 09 09 09 63 61 63 6b 65 79 5f 6d 75 74  {.....cackey_mut
30d00 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
30d10 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 09 09  _biglock);......
30d20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
30d30 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 69 67  NTF("Error.  Sig
30d40 6e 69 6e 67 20 62 75 66 66 65 72 20 69 73 20 4e  ning buffer is N
30d50 55 4c 4c 2e 22 29 3b 0a 0a 09 09 09 09 72 65 74  ULL.");......ret
30d60 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
30d70 45 52 52 4f 52 29 3b 0a 09 09 09 7d 0a 0a 09 09  ERROR);....}....
30d80 09 6d 65 6d 63 70 79 28 63 61 63 6b 65 79 5f 73  .memcpy(cackey_s
30d90 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
30da0 5d 2e 73 69 67 6e 5f 62 75 66 20 2b 20 63 61 63  ].sign_buf + cac
30db0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
30dc0 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75  ssion].sign_bufu
30dd0 73 65 64 2c 20 70 50 61 72 74 2c 20 75 6c 50 61  sed, pPart, ulPa
30de0 72 74 4c 65 6e 29 3b 0a 0a 09 09 09 63 61 63 6b  rtLen);.....cack
30df0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
30e00 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73  sion].sign_bufus
30e10 65 64 20 2b 3d 20 75 6c 50 61 72 74 4c 65 6e 3b  ed += ulPartLen;
30e20 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a  .....break;..}..
30e30 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
30e40 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
30e50 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
30e60 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
30e70 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
30e80 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
30e90 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e  INTF("Error.  Un
30ea0 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  locking failed."
30eb0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
30ec0 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
30ed0 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
30ee0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
30ef0 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29  ning CKR_OK (%i)
30f00 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65  ", CKR_OK);...re
30f10 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a  turn(CKR_OK);.}.
30f20 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
30f30 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 69 67  ION(CK_RV, C_Sig
30f40 6e 46 69 6e 61 6c 29 28 43 4b 5f 53 45 53 53 49  nFinal)(CK_SESSI
30f50 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
30f60 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  on, CK_BYTE_PTR 
30f70 70 53 69 67 6e 61 74 75 72 65 2c 20 43 4b 5f 55  pSignature, CK_U
30f80 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 53 69 67 6e  LONG_PTR pulSign
30f90 61 74 75 72 65 4c 65 6e 29 20 7b 0a 09 73 74 61  atureLen) {..sta
30fa0 74 69 63 20 43 4b 5f 42 59 54 45 20 73 69 67 62  tic CK_BYTE sigb
30fb0 75 66 5b 31 30 32 34 5d 3b 0a 09 73 73 69 7a 65  uf[1024];..ssize
30fc0 5f 74 20 73 69 67 62 75 66 6c 65 6e 3b 0a 09 43  _t sigbuflen;..C
30fd0 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44  K_SLOT_ID slotID
30fe0 3b 0a 09 43 4b 5f 52 56 20 72 65 74 76 61 6c 20  ;..CK_RV retval 
30ff0 3d 20 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  = CKR_GENERAL_ER
31000 52 4f 52 3b 0a 09 69 6e 74 20 74 65 72 6d 69 6e  ROR;..int termin
31010 61 74 65 5f 73 69 67 6e 20 3d 20 31 3b 0a 09 69  ate_sign = 1;..i
31020 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b  nt mutex_retval;
31030 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
31040 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
31050 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
31060 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
31070 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
31080 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
31090 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
310a0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
310b0 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
310c0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
310d0 09 69 66 20 28 70 75 6c 53 69 67 6e 61 74 75 72  .if (pulSignatur
310e0 65 4c 65 6e 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  eLen == NULL) {.
310f0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
31100 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 75  RINTF("Error. pu
31110 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 20 69 73  lSignatureLen is
31120 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74   NULL.");....ret
31130 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54  urn(CKR_ARGUMENT
31140 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  S_BAD);..}...if 
31150 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c  (hSession == 0 |
31160 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73  | hSession >= (s
31170 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
31180 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28  sions) / sizeof(
31190 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
311a0 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59  0]))) {...CACKEY
311b0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
311c0 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f  rror.  Session o
311d0 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a  ut of range.");.
311e0 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
311f0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49  SESSION_HANDLE_I
31200 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75  NVALID);..}...mu
31210 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
31220 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63  key_mutex_lock(c
31230 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
31240 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
31250 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
31260 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
31270 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67  "Error.  Locking
31280 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
31290 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
312a0 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69  L_ERROR);..}...i
312b0 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69  f (!cackey_sessi
312c0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63  ons[hSession].ac
312d0 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79  tive) {...cackey
312e0 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
312f0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
31300 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
31310 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
31320 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76  ession not activ
31330 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
31340 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41  n(CKR_SESSION_HA
31350 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
31360 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  }...if (!cackey_
31370 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
31380 6e 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65 29 20  n].sign_active) 
31390 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  {...cackey_mutex
313a0 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
313b0 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b  iglock);....CACK
313c0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
313d0 22 45 72 72 6f 72 2e 20 20 53 69 67 6e 20 6e 6f  "Error.  Sign no
313e0 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a  t active.");....
313f0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45  ..return(CKR_OPE
31400 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49  RATION_NOT_INITI
31410 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 73 6c  ALIZED);..}...sl
31420 6f 74 49 44 20 3d 20 63 61 63 6b 65 79 5f 73 65  otID = cackey_se
31430 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
31440 2e 73 6c 6f 74 49 44 3b 0a 0a 09 69 66 20 28 73  .slotID;...if (s
31450 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f  lotID < 0 || slo
31460 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63  tID >= (sizeof(c
31470 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73  ackey_slots) / s
31480 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f  izeof(cackey_slo
31490 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43  ts[0]))) {...CAC
314a0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
314b0 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64  ("Error. Invalid
314c0 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20   slot requested 
314d0 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f  (%lu), outside o
314e0 66 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20  f valid range", 
314f0 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 75  slotID);....retu
31500 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
31510 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  RROR);..}...if (
31520 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f  cackey_slots[slo
31530 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30  tID].active == 0
31540 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
31550 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
31560 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72  . Invalid slot r
31570 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20  equested (%lu), 
31580 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74  slot not current
31590 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74  ly active", slot
315a0 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d  ID);....cackey_m
315b0 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
315c0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
315d0 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
315e0 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
315f0 73 77 69 74 63 68 20 28 63 61 63 6b 65 79 5f 73  switch (cackey_s
31600 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
31610 5d 2e 73 69 67 6e 5f 6d 65 63 68 61 6e 69 73 6d  ].sign_mechanism
31620 29 20 7b 0a 09 09 63 61 73 65 20 43 4b 4d 5f 52  ) {...case CKM_R
31630 53 41 5f 50 4b 43 53 3a 0a 09 09 09 2f 2a 20 41  SA_PKCS:..../* A
31640 73 6b 20 63 61 72 64 20 74 6f 20 73 69 67 6e 20  sk card to sign 
31650 2a 2f 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42  */....CACKEY_DEB
31660 55 47 5f 50 52 49 4e 54 46 28 22 41 73 6b 69 6e  UG_PRINTF("Askin
31670 67 20 74 6f 20 73 69 67 6e 20 66 72 6f 6d 20 69  g to sign from i
31680 64 65 6e 74 69 74 79 20 25 70 20 69 6e 20 73 65  dentity %p in se
31690 73 73 69 6f 6e 20 25 6c 75 22 2c 20 28 76 6f 69  ssion %lu", (voi
316a0 64 20 2a 29 20 63 61 63 6b 65 79 5f 73 65 73 73  d *) cackey_sess
316b0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
316c0 69 67 6e 5f 69 64 65 6e 74 69 74 79 2c 20 28 75  ign_identity, (u
316d0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 68 53  nsigned long) hS
316e0 65 73 73 69 6f 6e 29 3b 0a 09 09 09 73 69 67 62  ession);....sigb
316f0 75 66 6c 65 6e 20 3d 20 63 61 63 6b 65 79 5f 73  uflen = cackey_s
31700 69 67 6e 64 65 63 72 79 70 74 28 26 63 61 63 6b  igndecrypt(&cack
31710 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
31720 2c 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  , cackey_session
31730 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
31740 5f 69 64 65 6e 74 69 74 79 2c 20 63 61 63 6b 65  _identity, cacke
31750 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
31760 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 2c 20 63  ion].sign_buf, c
31770 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
31780 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75  Session].sign_bu
31790 66 75 73 65 64 2c 20 73 69 67 62 75 66 2c 20 73  fused, sigbuf, s
317a0 69 7a 65 6f 66 28 73 69 67 62 75 66 29 2c 20 31  izeof(sigbuf), 1
317b0 2c 20 30 29 3b 0a 0a 09 09 09 69 66 20 28 73 69  , 0);.....if (si
317c0 67 62 75 66 6c 65 6e 20 3d 3d 20 43 41 43 4b 45  gbuflen == CACKE
317d0 59 5f 50 43 53 43 5f 45 5f 4e 45 45 44 4c 4f 47  Y_PCSC_E_NEEDLOG
317e0 49 4e 20 26 26 20 63 61 63 6b 65 79 5f 70 69 6e  IN && cackey_pin
317f0 5f 63 6f 6d 6d 61 6e 64 20 21 3d 20 4e 55 4c 4c  _command != NULL
31800 29 20 7b 0a 09 09 09 09 69 66 20 28 5f 43 5f 4c  ) {.....if (_C_L
31810 6f 67 69 6e 4d 75 74 65 78 41 72 67 28 68 53 65  oginMutexArg(hSe
31820 73 73 69 6f 6e 2c 20 43 4b 55 5f 55 53 45 52 2c  ssion, CKU_USER,
31830 20 4e 55 4c 4c 2c 20 30 2c 20 30 29 20 3d 3d 20   NULL, 0, 0) == 
31840 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 09 09 09 73  CKR_OK) {......s
31850 69 67 62 75 66 6c 65 6e 20 3d 20 63 61 63 6b 65  igbuflen = cacke
31860 79 5f 73 69 67 6e 64 65 63 72 79 70 74 28 26 63  y_signdecrypt(&c
31870 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
31880 49 44 5d 2c 20 63 61 63 6b 65 79 5f 73 65 73 73  ID], cackey_sess
31890 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
318a0 69 67 6e 5f 69 64 65 6e 74 69 74 79 2c 20 63 61  ign_identity, ca
318b0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
318c0 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66  ession].sign_buf
318d0 2c 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  , cackey_session
318e0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
318f0 5f 62 75 66 75 73 65 64 2c 20 73 69 67 62 75 66  _bufused, sigbuf
31900 2c 20 73 69 7a 65 6f 66 28 73 69 67 62 75 66 29  , sizeof(sigbuf)
31910 2c 20 31 2c 20 30 29 3b 0a 09 09 09 09 7d 0a 09  , 1, 0);.....}..
31920 09 09 7d 0a 0a 09 09 09 69 66 20 28 73 69 67 62  ..}.....if (sigb
31930 75 66 6c 65 6e 20 3c 20 30 29 20 7b 0a 09 09 09  uflen < 0) {....
31940 09 2f 2a 20 53 69 67 6e 69 6e 67 20 66 61 69 6c  ./* Signing fail
31950 65 64 2e 20 2a 2f 0a 09 09 09 09 69 66 20 28 73  ed. */.....if (s
31960 69 67 62 75 66 6c 65 6e 20 3d 3d 20 43 41 43 4b  igbuflen == CACK
31970 45 59 5f 50 43 53 43 5f 45 5f 4e 45 45 44 4c 4f  EY_PCSC_E_NEEDLO
31980 47 49 4e 29 20 7b 0a 09 09 09 09 09 72 65 74 76  GIN) {......retv
31990 61 6c 20 3d 20 43 4b 52 5f 55 53 45 52 5f 4e 4f  al = CKR_USER_NO
319a0 54 5f 4c 4f 47 47 45 44 5f 49 4e 3b 0a 09 09 09  T_LOGGED_IN;....
319b0 09 7d 20 65 6c 73 65 20 69 66 20 28 73 69 67 62  .} else if (sigb
319c0 75 66 6c 65 6e 20 3d 3d 20 43 41 43 4b 45 59 5f  uflen == CACKEY_
319d0 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45  PCSC_E_TOKENABSE
319e0 4e 54 29 20 7b 0a 09 09 09 09 09 72 65 74 76 61  NT) {......retva
319f0 6c 20 3d 20 43 4b 52 5f 44 45 56 49 43 45 5f 52  l = CKR_DEVICE_R
31a00 45 4d 4f 56 45 44 3b 0a 09 09 09 09 7d 20 65 6c  EMOVED;.....} el
31a10 73 65 20 7b 0a 09 09 09 09 09 72 65 74 76 61 6c  se {......retval
31a20 20 3d 20 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45   = CKR_GENERAL_E
31a30 52 52 4f 52 3b 0a 09 09 09 09 7d 0a 09 09 09 7d  RROR;.....}....}
31a40 20 65 6c 73 65 20 69 66 20 28 28 28 75 6e 73 69   else if (((unsi
31a50 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69 67 62 75  gned long) sigbu
31a60 66 6c 65 6e 29 20 3e 20 2a 70 75 6c 53 69 67 6e  flen) > *pulSign
31a70 61 74 75 72 65 4c 65 6e 20 26 26 20 70 53 69 67  atureLen && pSig
31a80 6e 61 74 75 72 65 29 20 7b 0a 09 09 09 09 2f 2a  nature) {...../*
31a90 20 53 69 67 6e 65 64 20 64 61 74 61 20 74 6f 6f   Signed data too
31aa0 20 6c 61 72 67 65 20 2a 2f 0a 09 09 09 09 43 41   large */.....CA
31ab0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
31ac0 46 28 22 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f  F("retval = CKR_
31ad0 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c  BUFFER_TOO_SMALL
31ae0 3b 20 20 73 69 67 62 75 66 6c 65 6e 20 3d 20 25  ;  sigbuflen = %
31af0 6c 75 2c 20 70 75 6c 53 69 67 6e 61 74 75 72 65  lu, pulSignature
31b00 4c 65 6e 20 3d 20 25 6c 75 22 2c 20 28 75 6e 73  Len = %lu", (uns
31b10 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69 67 62  igned long) sigb
31b20 75 66 6c 65 6e 2c 20 28 75 6e 73 69 67 6e 65 64  uflen, (unsigned
31b30 20 6c 6f 6e 67 29 20 2a 70 75 6c 53 69 67 6e 61   long) *pulSigna
31b40 74 75 72 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 72  tureLen);......r
31b50 65 74 76 61 6c 20 3d 20 43 4b 52 5f 42 55 46 46  etval = CKR_BUFF
31b60 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 3b 0a 0a 09  ER_TOO_SMALL;...
31b70 09 09 09 74 65 72 6d 69 6e 61 74 65 5f 73 69 67  ...terminate_sig
31b80 6e 20 3d 20 30 3b 0a 09 09 09 7d 20 65 6c 73 65  n = 0;....} else
31b90 20 7b 0a 09 09 09 09 74 65 72 6d 69 6e 61 74 65   {.....terminate
31ba0 5f 73 69 67 6e 20 3d 20 30 3b 0a 0a 09 09 09 09  _sign = 0;......
31bb0 69 66 20 28 70 53 69 67 6e 61 74 75 72 65 29 20  if (pSignature) 
31bc0 7b 0a 09 09 09 09 09 6d 65 6d 63 70 79 28 70 53  {......memcpy(pS
31bd0 69 67 6e 61 74 75 72 65 2c 20 73 69 67 62 75 66  ignature, sigbuf
31be0 2c 20 73 69 67 62 75 66 6c 65 6e 29 3b 0a 0a 09  , sigbuflen);...
31bf0 09 09 09 09 74 65 72 6d 69 6e 61 74 65 5f 73 69  ....terminate_si
31c00 67 6e 20 3d 20 31 3b 0a 09 09 09 09 7d 0a 0a 09  gn = 1;.....}...
31c10 09 09 09 2a 70 75 6c 53 69 67 6e 61 74 75 72 65  ...*pulSignature
31c20 4c 65 6e 20 3d 20 73 69 67 62 75 66 6c 65 6e 3b  Len = sigbuflen;
31c30 0a 0a 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43  ......retval = C
31c40 4b 52 5f 4f 4b 3b 0a 09 09 09 7d 0a 0a 09 09 09  KR_OK;....}.....
31c50 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 69 66 20 28  break;..}...if (
31c60 74 65 72 6d 69 6e 61 74 65 5f 73 69 67 6e 29 20  terminate_sign) 
31c70 7b 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73  {...if (cackey_s
31c80 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
31c90 5d 2e 73 69 67 6e 5f 62 75 66 29 20 7b 0a 09 09  ].sign_buf) {...
31ca0 09 66 72 65 65 28 63 61 63 6b 65 79 5f 73 65 73  .free(cackey_ses
31cb0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
31cc0 73 69 67 6e 5f 62 75 66 29 3b 0a 09 09 7d 0a 0a  sign_buf);...}..
31cd0 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
31ce0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
31cf0 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a 09 7d 0a  _active = 0;..}.
31d00 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
31d10 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e   cackey_mutex_un
31d20 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
31d30 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
31d40 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
31d50 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
31d60 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55  RINTF("Error.  U
31d70 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e  nlocking failed.
31d80 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
31d90 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
31da0 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
31db0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
31dc0 72 6e 69 6e 67 20 25 69 22 2c 20 28 69 6e 74 29  rning %i", (int)
31dd0 20 72 65 74 76 61 6c 29 3b 0a 0a 09 72 65 74 75   retval);...retu
31de0 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 43  rn(retval);.}..C
31df0 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
31e00 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 69 67 6e 52  N(CK_RV, C_SignR
31e10 65 63 6f 76 65 72 49 6e 69 74 29 28 43 4b 5f 53  ecoverInit)(CK_S
31e20 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
31e30 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41  ession, CK_MECHA
31e40 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e  NISM_PTR pMechan
31e50 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48  ism, CK_OBJECT_H
31e60 41 4e 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09 43  ANDLE hKey) {..C
31e70 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
31e80 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
31e90 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
31ea0 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
31eb0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
31ec0 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
31ed0 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
31ee0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
31ef0 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
31f00 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
31f10 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
31f20 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
31f30 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
31f40 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
31f50 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
31f60 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
31f70 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
31f80 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
31f90 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
31fa0 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
31fb0 53 69 67 6e 52 65 63 6f 76 65 72 29 28 43 4b 5f  SignRecover)(CK_
31fc0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
31fd0 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45  Session, CK_BYTE
31fe0 5f 50 54 52 20 70 44 61 74 61 2c 20 43 4b 5f 55  _PTR pData, CK_U
31ff0 4c 4f 4e 47 20 75 6c 44 61 74 61 4c 65 6e 2c 20  LONG ulDataLen, 
32000 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 53 69 67  CK_BYTE_PTR pSig
32010 6e 61 74 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47  nature, CK_ULONG
32020 5f 50 54 52 20 70 75 6c 53 69 67 6e 61 74 75 72  _PTR pulSignatur
32030 65 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f  eLen) {..CACKEY_
32040 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
32050 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
32060 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
32070 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
32080 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
32090 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
320a0 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
320b0 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
320c0 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
320d0 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
320e0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
320f0 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
32100 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
32110 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
32120 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
32130 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
32140 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
32150 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
32160 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
32170 28 43 4b 5f 52 56 2c 20 43 5f 56 65 72 69 66 79  (CK_RV, C_Verify
32180 49 6e 69 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e  Init)(CK_SESSION
32190 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
321a0 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50  , CK_MECHANISM_P
321b0 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43  TR pMechanism, C
321c0 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20  K_OBJECT_HANDLE 
321d0 68 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f  hKey) {..CACKEY_
321e0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
321f0 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
32200 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
32210 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
32220 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
32230 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
32240 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
32250 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
32260 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
32270 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
32280 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
32290 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
322a0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
322b0 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
322c0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
322d0 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
322e0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
322f0 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
32300 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
32310 28 43 4b 5f 52 56 2c 20 43 5f 56 65 72 69 66 79  (CK_RV, C_Verify
32320 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
32330 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
32340 5f 42 59 54 45 5f 50 54 52 20 70 44 61 74 61 2c  _BYTE_PTR pData,
32350 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 44 61 74 61   CK_ULONG ulData
32360 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  Len, CK_BYTE_PTR
32370 20 70 53 69 67 6e 61 74 75 72 65 2c 20 43 4b 5f   pSignature, CK_
32380 55 4c 4f 4e 47 20 75 6c 53 69 67 6e 61 74 75 72  ULONG ulSignatur
32390 65 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f  eLen) {..CACKEY_
323a0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
323b0 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
323c0 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
323d0 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
323e0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
323f0 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
32400 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
32410 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
32420 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
32430 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
32440 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
32450 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
32460 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
32470 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
32480 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
32490 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
324a0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
324b0 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
324c0 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
324d0 28 43 4b 5f 52 56 2c 20 43 5f 56 65 72 69 66 79  (CK_RV, C_Verify
324e0 55 70 64 61 74 65 29 28 43 4b 5f 53 45 53 53 49  Update)(CK_SESSI
324f0 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
32500 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  on, CK_BYTE_PTR 
32510 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20  pPart, CK_ULONG 
32520 75 6c 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41  ulPartLen) {..CA
32530 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
32540 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
32550 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
32560 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
32570 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
32580 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
32590 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
325a0 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
325b0 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
325c0 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
325d0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
325e0 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
325f0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
32600 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
32610 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
32620 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
32630 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
32640 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
32650 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
32660 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 56  CTION(CK_RV, C_V
32670 65 72 69 66 79 46 69 6e 61 6c 29 28 43 4b 5f 53  erifyFinal)(CK_S
32680 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
32690 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f  ession, CK_BYTE_
326a0 50 54 52 20 70 53 69 67 6e 61 74 75 72 65 2c 20  PTR pSignature, 
326b0 43 4b 5f 55 4c 4f 4e 47 20 75 6c 53 69 67 6e 61  CK_ULONG ulSigna
326c0 74 75 72 65 4c 65 6e 29 20 7b 0a 09 43 41 43 4b  tureLen) {..CACK
326d0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
326e0 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
326f0 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
32700 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
32710 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
32720 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
32730 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
32740 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
32750 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
32760 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
32770 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
32780 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
32790 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
327a0 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
327b0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
327c0 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
327d0 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
327e0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
327f0 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
32800 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 56 65 72  ION(CK_RV, C_Ver
32810 69 66 79 52 65 63 6f 76 65 72 49 6e 69 74 29 28  ifyRecoverInit)(
32820 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
32830 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d  E hSession, CK_M
32840 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65  ECHANISM_PTR pMe
32850 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45  chanism, CK_OBJE
32860 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79 29 20  CT_HANDLE hKey) 
32870 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
32880 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
32890 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
328a0 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
328b0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
328c0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
328d0 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
328e0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
328f0 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
32900 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
32910 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
32920 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
32930 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
32940 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
32950 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
32960 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
32970 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
32980 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
32990 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
329a0 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
329b0 2c 20 43 5f 56 65 72 69 66 79 52 65 63 6f 76 65  , C_VerifyRecove
329c0 72 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  r)(CK_SESSION_HA
329d0 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
329e0 4b 5f 42 59 54 45 5f 50 54 52 20 70 53 69 67 6e  K_BYTE_PTR pSign
329f0 61 74 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20  ature, CK_ULONG 
32a00 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 2c 20  ulSignatureLen, 
32a10 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 44 61 74  CK_BYTE_PTR pDat
32a20 61 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20  a, CK_ULONG_PTR 
32a30 70 75 6c 44 61 74 61 4c 65 6e 29 20 7b 0a 09 43  pulDataLen) {..C
32a40 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
32a50 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
32a60 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
32a70 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
32a80 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
32a90 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
32aa0 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
32ab0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
32ac0 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
32ad0 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
32ae0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
32af0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
32b00 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
32b10 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
32b20 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
32b30 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
32b40 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
32b50 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
32b60 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
32b70 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
32b80 44 69 67 65 73 74 45 6e 63 72 79 70 74 55 70 64  DigestEncryptUpd
32b90 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  ate)(CK_SESSION_
32ba0 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
32bb0 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 61   CK_BYTE_PTR pPa
32bc0 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50  rt, CK_ULONG ulP
32bd0 61 72 74 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f  artLen, CK_BYTE_
32be0 50 54 52 20 70 45 6e 63 72 79 70 74 65 64 50 61  PTR pEncryptedPa
32bf0 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52  rt, CK_ULONG_PTR
32c00 20 70 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72   pulEncryptedPar
32c10 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f  tLen) {..CACKEY_
32c20 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
32c30 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
32c40 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
32c50 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
32c60 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
32c70 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
32c80 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
32c90 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
32ca0 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
32cb0 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
32cc0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
32cd0 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
32ce0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
32cf0 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
32d00 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
32d10 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
32d20 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
32d30 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
32d40 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
32d50 28 43 4b 5f 52 56 2c 20 43 5f 44 65 63 72 79 70  (CK_RV, C_Decryp
32d60 74 44 69 67 65 73 74 55 70 64 61 74 65 29 28 43  tDigestUpdate)(C
32d70 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
32d80 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59   hSession, CK_BY
32d90 54 45 5f 50 54 52 20 70 45 6e 63 72 79 70 74 65  TE_PTR pEncrypte
32da0 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20  dPart, CK_ULONG 
32db0 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c  ulEncryptedPartL
32dc0 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  en, CK_BYTE_PTR 
32dd0 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f  pPart, CK_ULONG_
32de0 50 54 52 20 70 75 6c 50 61 72 74 4c 65 6e 29 20  PTR pulPartLen) 
32df0 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
32e00 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
32e10 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
32e20 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
32e30 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
32e40 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
32e50 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
32e60 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
32e70 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
32e80 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
32e90 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
32ea0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
32eb0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
32ec0 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
32ed0 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
32ee0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
32ef0 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
32f00 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
32f10 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
32f20 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
32f30 2c 20 43 5f 53 69 67 6e 45 6e 63 72 79 70 74 55  , C_SignEncryptU
32f40 70 64 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f  pdate)(CK_SESSIO
32f50 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
32f60 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
32f70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  Part, CK_ULONG u
32f80 6c 50 61 72 74 4c 65 6e 2c 20 43 4b 5f 42 59 54  lPartLen, CK_BYT
32f90 45 5f 50 54 52 20 70 45 6e 63 72 79 70 74 65 64  E_PTR pEncrypted
32fa0 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50  Part, CK_ULONG_P
32fb0 54 52 20 70 75 6c 45 6e 63 72 79 70 74 65 64 50  TR pulEncryptedP
32fc0 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45  artLen) {..CACKE
32fd0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
32fe0 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
32ff0 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
33000 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
33010 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
33020 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
33030 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
33040 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
33050 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
33060 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
33070 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
33080 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
33090 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
330a0 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
330b0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
330c0 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
330d0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
330e0 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
330f0 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
33100 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65 63 72  ON(CK_RV, C_Decr
33110 79 70 74 56 65 72 69 66 79 55 70 64 61 74 65 29  yptVerifyUpdate)
33120 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
33130 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
33140 42 59 54 45 5f 50 54 52 20 70 45 6e 63 72 79 70  BYTE_PTR pEncryp
33150 74 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e  tedPart, CK_ULON
33160 47 20 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72  G ulEncryptedPar
33170 74 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  tLen, CK_BYTE_PT
33180 52 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e  R pPart, CK_ULON
33190 47 5f 50 54 52 20 70 75 6c 50 61 72 74 4c 65 6e  G_PTR pulPartLen
331a0 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
331b0 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
331c0 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
331d0 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
331e0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
331f0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
33200 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
33210 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
33220 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
33230 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
33240 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
33250 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
33260 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
33270 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
33280 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
33290 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
332a0 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
332b0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
332c0 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
332d0 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
332e0 52 56 2c 20 43 5f 47 65 6e 65 72 61 74 65 4b 65  RV, C_GenerateKe
332f0 79 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  y)(CK_SESSION_HA
33300 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
33310 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20  K_MECHANISM_PTR 
33320 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 41  pMechanism, CK_A
33330 54 54 52 49 42 55 54 45 5f 50 54 52 20 70 54 65  TTRIBUTE_PTR pTe
33340 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47  mplate, CK_ULONG
33350 20 75 6c 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a   ulCount, CK_OBJ
33360 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70  ECT_HANDLE_PTR p
33370 68 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f  hKey) {..CACKEY_
33380 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
33390 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
333a0 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
333b0 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
333c0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
333d0 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
333e0 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
333f0 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
33400 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
33410 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
33420 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
33430 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
33440 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
33450 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
33460 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
33470 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
33480 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
33490 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
334a0 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
334b0 28 43 4b 5f 52 56 2c 20 43 5f 47 65 6e 65 72 61  (CK_RV, C_Genera
334c0 74 65 4b 65 79 50 61 69 72 29 28 43 4b 5f 53 45  teKeyPair)(CK_SE
334d0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
334e0 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e  ssion, CK_MECHAN
334f0 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69  ISM_PTR pMechani
33500 73 6d 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45  sm, CK_ATTRIBUTE
33510 5f 50 54 52 20 70 50 75 62 6c 69 63 4b 65 79 54  _PTR pPublicKeyT
33520 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e  emplate, CK_ULON
33530 47 20 75 6c 50 75 62 6c 69 63 4b 65 79 41 74 74  G ulPublicKeyAtt
33540 72 69 62 75 74 65 43 6f 75 6e 74 2c 20 43 4b 5f  ributeCount, CK_
33550 41 54 54 52 49 42 55 54 45 5f 50 54 52 20 70 50  ATTRIBUTE_PTR pP
33560 72 69 76 61 74 65 4b 65 79 54 65 6d 70 6c 61 74  rivateKeyTemplat
33570 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 72  e, CK_ULONG ulPr
33580 69 76 61 74 65 4b 65 79 41 74 74 72 69 62 75 74  ivateKeyAttribut
33590 65 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43  eCount, CK_OBJEC
335a0 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 50  T_HANDLE_PTR phP
335b0 75 62 6c 69 63 4b 65 79 2c 20 43 4b 5f 4f 42 4a  ublicKey, CK_OBJ
335c0 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70  ECT_HANDLE_PTR p
335d0 68 50 72 69 76 61 74 65 4b 65 79 29 20 7b 0a 09  hPrivateKey) {..
335e0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
335f0 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
33600 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
33610 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
33620 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
33630 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
33640 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
33650 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
33660 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
33670 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
33680 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
33690 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
336a0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
336b0 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
336c0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
336d0 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
336e0 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
336f0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
33700 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
33710 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
33720 5f 57 72 61 70 4b 65 79 29 28 43 4b 5f 53 45 53  _WrapKey)(CK_SES
33730 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
33740 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49  sion, CK_MECHANI
33750 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73  SM_PTR pMechanis
33760 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e  m, CK_OBJECT_HAN
33770 44 4c 45 20 68 57 72 61 70 70 69 6e 67 4b 65 79  DLE hWrappingKey
33780 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44  , CK_OBJECT_HAND
33790 4c 45 20 68 4b 65 79 2c 20 43 4b 5f 42 59 54 45  LE hKey, CK_BYTE
337a0 5f 50 54 52 20 70 57 72 61 70 70 65 64 4b 65 79  _PTR pWrappedKey
337b0 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70  , CK_ULONG_PTR p
337c0 75 6c 57 72 61 70 70 65 64 4b 65 79 4c 65 6e 29  ulWrappedKeyLen)
337d0 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
337e0 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
337f0 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
33800 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
33810 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
33820 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
33830 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
33840 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
33850 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
33860 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
33870 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
33880 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
33890 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
338a0 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
338b0 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
338c0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
338d0 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
338e0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
338f0 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  TED);.}..CK_DEFI
33900 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
33910 56 2c 20 43 5f 55 6e 77 72 61 70 4b 65 79 29 28  V, C_UnwrapKey)(
33920 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
33930 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d  E hSession, CK_M
33940 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65  ECHANISM_PTR pMe
33950 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45  chanism, CK_OBJE
33960 43 54 5f 48 41 4e 44 4c 45 20 68 55 6e 77 72 61  CT_HANDLE hUnwra
33970 70 70 69 6e 67 4b 65 79 2c 20 43 4b 5f 42 59 54  ppingKey, CK_BYT
33980 45 5f 50 54 52 20 70 57 72 61 70 70 65 64 4b 65  E_PTR pWrappedKe
33990 79 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 57 72  y, CK_ULONG ulWr
339a0 61 70 70 65 64 4b 65 79 4c 65 6e 2c 20 43 4b 5f  appedKeyLen, CK_
339b0 41 54 54 52 49 42 55 54 45 5f 50 54 52 20 70 54  ATTRIBUTE_PTR pT
339c0 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e  emplate, CK_ULON
339d0 47 20 75 6c 41 74 74 72 69 62 75 74 65 43 6f 75  G ulAttributeCou
339e0 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41  nt, CK_OBJECT_HA
339f0 4e 44 4c 45 5f 50 54 52 20 70 68 4b 65 79 29 20  NDLE_PTR phKey) 
33a00 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
33a10 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
33a20 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
33a30 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
33a40 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
33a50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
33a60 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
33a70 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
33a80 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
33a90 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
33aa0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
33ab0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
33ac0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
33ad0 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
33ae0 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
33af0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
33b00 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
33b10 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
33b20 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
33b30 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
33b40 2c 20 43 5f 44 65 72 69 76 65 4b 65 79 29 28 43  , C_DeriveKey)(C
33b50 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
33b60 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45   hSession, CK_ME
33b70 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63  CHANISM_PTR pMec
33b80 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43  hanism, CK_OBJEC
33b90 54 5f 48 41 4e 44 4c 45 20 68 42 61 73 65 4b 65  T_HANDLE hBaseKe
33ba0 79 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f  y, CK_ATTRIBUTE_
33bb0 50 54 52 20 70 54 65 6d 70 6c 61 74 65 2c 20 43  PTR pTemplate, C
33bc0 4b 5f 55 4c 4f 4e 47 20 75 6c 41 74 74 72 69 62  K_ULONG ulAttrib
33bd0 75 74 65 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a  uteCount, CK_OBJ
33be0 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70  ECT_HANDLE_PTR p
33bf0 68 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f  hKey) {..CACKEY_
33c00 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
33c10 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
33c20 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
33c30 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
33c40 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
33c50 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
33c60 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
33c70 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
33c80 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
33c90 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
33ca0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
33cb0 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
33cc0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
33cd0 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
33ce0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
33cf0 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
33d00 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
33d10 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
33d20 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
33d30 28 43 4b 5f 52 56 2c 20 43 5f 53 65 65 64 52 61  (CK_RV, C_SeedRa
33d40 6e 64 6f 6d 29 28 43 4b 5f 53 45 53 53 49 4f 4e  ndom)(CK_SESSION
33d50 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
33d60 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 53  , CK_BYTE_PTR pS
33d70 65 65 64 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  eed, CK_ULONG ul
33d80 53 65 65 64 4c 65 6e 29 20 7b 0a 09 43 41 43 4b  SeedLen) {..CACK
33d90 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
33da0 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
33db0 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
33dc0 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
33dd0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
33de0 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
33df0 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
33e00 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
33e10 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
33e20 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
33e30 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
33e40 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
33e50 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
33e60 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
33e70 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
33e80 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
33e90 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
33ea0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
33eb0 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
33ec0 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 6e  ION(CK_RV, C_Gen
33ed0 65 72 61 74 65 52 61 6e 64 6f 6d 29 28 43 4b 5f  erateRandom)(CK_
33ee0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
33ef0 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45  Session, CK_BYTE
33f00 5f 50 54 52 20 70 52 61 6e 64 6f 6d 44 61 74 61  _PTR pRandomData
33f10 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 52 61 6e  , CK_ULONG ulRan
33f20 64 6f 6d 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45  domLen) {..CACKE
33f30 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
33f40 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
33f50 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
33f60 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
33f70 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
33f80 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
33f90 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
33fa0 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
33fb0 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
33fc0 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
33fd0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
33fe0 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
33ff0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
34000 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
34010 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
34020 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
34030 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
34040 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
34050 2f 2a 20 44 65 70 72 65 63 61 74 65 64 20 46 75  /* Deprecated Fu
34060 6e 63 74 69 6f 6e 20 2a 2f 0a 43 4b 5f 44 45 46  nction */.CK_DEF
34070 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
34080 52 56 2c 20 43 5f 47 65 74 46 75 6e 63 74 69 6f  RV, C_GetFunctio
34090 6e 53 74 61 74 75 73 29 28 43 4b 5f 53 45 53 53  nStatus)(CK_SESS
340a0 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
340b0 69 6f 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  ion) {..CACKEY_D
340c0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
340d0 6c 65 64 2e 22 29 3b 0a 0a 09 43 41 43 4b 45 59  led.");...CACKEY
340e0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
340f0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
34100 43 54 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c  CTION_NOT_PARALL
34110 45 4c 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  EL (%i)", CKR_FU
34120 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c  NCTION_NOT_PARAL
34130 4c 45 4c 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  LEL);...return(C
34140 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
34150 50 41 52 41 4c 4c 45 4c 29 3b 0a 0a 09 68 53 65  PARALLEL);...hSe
34160 73 73 69 6f 6e 20 3d 20 68 53 65 73 73 69 6f 6e  ssion = hSession
34170 3b 20 2f 2a 20 53 75 70 72 65 73 73 20 75 6e 75  ; /* Supress unu
34180 73 65 64 20 76 61 72 69 61 62 6c 65 20 77 61 72  sed variable war
34190 6e 69 6e 67 20 2a 2f 0a 7d 0a 0a 2f 2a 20 44 65  ning */.}../* De
341a0 70 72 65 63 61 74 65 64 20 46 75 6e 63 74 69 6f  precated Functio
341b0 6e 20 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  n */.CK_DEFINE_F
341c0 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
341d0 5f 43 61 6e 63 65 6c 46 75 6e 63 74 69 6f 6e 29  _CancelFunction)
341e0 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
341f0 4c 45 20 68 53 65 73 73 69 6f 6e 29 20 7b 0a 09  LE hSession) {..
34200 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
34210 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
34220 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
34230 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
34240 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
34250 54 5f 50 41 52 41 4c 4c 45 4c 20 28 25 69 29 22  T_PARALLEL (%i)"
34260 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
34270 4f 54 5f 50 41 52 41 4c 4c 45 4c 29 3b 0a 0a 09  OT_PARALLEL);...
34280 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
34290 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c  ION_NOT_PARALLEL
342a0 29 3b 0a 0a 09 68 53 65 73 73 69 6f 6e 20 3d 20  );...hSession = 
342b0 68 53 65 73 73 69 6f 6e 3b 20 2f 2a 20 53 75 70  hSession; /* Sup
342c0 72 65 73 73 20 75 6e 75 73 65 64 20 76 61 72 69  ress unused vari
342d0 61 62 6c 65 20 77 61 72 6e 69 6e 67 20 2a 2f 0a  able warning */.
342e0 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
342f0 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47  CTION(CK_RV, C_G
34300 65 74 46 75 6e 63 74 69 6f 6e 4c 69 73 74 29 28  etFunctionList)(
34310 43 4b 5f 46 55 4e 43 54 49 4f 4e 5f 4c 49 53 54  CK_FUNCTION_LIST
34320 5f 50 54 52 5f 50 54 52 20 70 70 46 75 6e 63 74  _PTR_PTR ppFunct
34330 69 6f 6e 4c 69 73 74 29 20 7b 0a 09 73 74 61 74  ionList) {..stat
34340 69 63 20 43 4b 5f 46 55 4e 43 54 49 4f 4e 5f 4c  ic CK_FUNCTION_L
34350 49 53 54 5f 50 54 52 20 73 70 46 75 6e 63 74 69  IST_PTR spFuncti
34360 6f 6e 4c 69 73 74 20 3d 20 4e 55 4c 4c 3b 0a 09  onList = NULL;..
34370 43 4b 5f 46 55 4e 43 54 49 4f 4e 5f 4c 49 53 54  CK_FUNCTION_LIST
34380 5f 50 54 52 20 70 46 75 6e 63 74 69 6f 6e 4c 69  _PTR pFunctionLi
34390 73 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  st;...CACKEY_DEB
343a0 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
343b0 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70 70 46 75  d.");...if (ppFu
343c0 6e 63 74 69 6f 6e 4c 69 73 74 20 3d 3d 20 4e 55  nctionList == NU
343d0 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
343e0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
343f0 6f 72 2e 20 70 70 46 75 6e 63 74 69 6f 6e 4c 69  or. ppFunctionLi
34400 73 74 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a  st is NULL.");..
34410 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47  ..return(CKR_ARG
34420 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a  UMENTS_BAD);..}.
34430 0a 09 69 66 20 28 73 70 46 75 6e 63 74 69 6f 6e  ..if (spFunction
34440 4c 69 73 74 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  List != NULL) {.
34450 09 09 2a 70 70 46 75 6e 63 74 69 6f 6e 4c 69 73  ..*ppFunctionLis
34460 74 20 3d 20 73 70 46 75 6e 63 74 69 6f 6e 4c 69  t = spFunctionLi
34470 73 74 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  st;....CACKEY_DE
34480 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
34490 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69  rning CKR_OK (%i
344a0 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 09  )", CKR_OK);....
344b0 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a  return(CKR_OK);.
344c0 09 7d 0a 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  .}...pFunctionLi
344d0 73 74 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65  st = malloc(size
344e0 6f 66 28 2a 70 46 75 6e 63 74 69 6f 6e 4c 69 73  of(*pFunctionLis
344f0 74 29 29 3b 0a 0a 09 70 46 75 6e 63 74 69 6f 6e  t));...pFunction
34500 4c 69 73 74 2d 3e 76 65 72 73 69 6f 6e 2e 6d 61  List->version.ma
34510 6a 6f 72 20 3d 20 28 28 43 41 43 4b 45 59 5f 43  jor = ((CACKEY_C
34520 52 59 50 54 4f 4b 49 5f 56 45 52 53 49 4f 4e 5f  RYPTOKI_VERSION_
34530 43 4f 44 45 29 20 3e 3e 20 31 36 29 20 26 20 30  CODE) >> 16) & 0
34540 78 66 66 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  xff;..pFunctionL
34550 69 73 74 2d 3e 76 65 72 73 69 6f 6e 2e 6d 69 6e  ist->version.min
34560 6f 72 20 3d 20 28 28 43 41 43 4b 45 59 5f 43 52  or = ((CACKEY_CR
34570 59 50 54 4f 4b 49 5f 56 45 52 53 49 4f 4e 5f 43  YPTOKI_VERSION_C
34580 4f 44 45 29 20 3e 3e 20 38 29 20 26 20 30 78 66  ODE) >> 8) & 0xf
34590 66 3b 0a 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  f;...pFunctionLi
345a0 73 74 2d 3e 43 5f 49 6e 69 74 69 61 6c 69 7a 65  st->C_Initialize
345b0 20 3d 20 43 5f 49 6e 69 74 69 61 6c 69 7a 65 3b   = C_Initialize;
345c0 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
345d0 3e 43 5f 46 69 6e 61 6c 69 7a 65 20 3d 20 43 5f  >C_Finalize = C_
345e0 46 69 6e 61 6c 69 7a 65 3b 0a 09 70 46 75 6e 63  Finalize;..pFunc
345f0 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 49  tionList->C_GetI
34600 6e 66 6f 20 3d 20 43 5f 47 65 74 49 6e 66 6f 3b  nfo = C_GetInfo;
34610 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
34620 3e 43 5f 47 65 74 53 6c 6f 74 4c 69 73 74 20 3d  >C_GetSlotList =
34630 20 43 5f 47 65 74 53 6c 6f 74 4c 69 73 74 3b 0a   C_GetSlotList;.
34640 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
34650 43 5f 47 65 74 53 6c 6f 74 49 6e 66 6f 20 3d 20  C_GetSlotInfo = 
34660 43 5f 47 65 74 53 6c 6f 74 49 6e 66 6f 3b 0a 09  C_GetSlotInfo;..
34670 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
34680 5f 47 65 74 54 6f 6b 65 6e 49 6e 66 6f 20 3d 20  _GetTokenInfo = 
34690 43 5f 47 65 74 54 6f 6b 65 6e 49 6e 66 6f 3b 0a  C_GetTokenInfo;.
346a0 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
346b0 43 5f 57 61 69 74 46 6f 72 53 6c 6f 74 45 76 65  C_WaitForSlotEve
346c0 6e 74 20 3d 20 43 5f 57 61 69 74 46 6f 72 53 6c  nt = C_WaitForSl
346d0 6f 74 45 76 65 6e 74 3b 0a 09 70 46 75 6e 63 74  otEvent;..pFunct
346e0 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 4d 65  ionList->C_GetMe
346f0 63 68 61 6e 69 73 6d 4c 69 73 74 20 3d 20 43 5f  chanismList = C_
34700 47 65 74 4d 65 63 68 61 6e 69 73 6d 4c 69 73 74  GetMechanismList
34710 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
34720 2d 3e 43 5f 47 65 74 4d 65 63 68 61 6e 69 73 6d  ->C_GetMechanism
34730 49 6e 66 6f 20 3d 20 43 5f 47 65 74 4d 65 63 68  Info = C_GetMech
34740 61 6e 69 73 6d 49 6e 66 6f 3b 0a 09 70 46 75 6e  anismInfo;..pFun
34750 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 49 6e 69  ctionList->C_Ini
34760 74 54 6f 6b 65 6e 20 3d 20 43 5f 49 6e 69 74 54  tToken = C_InitT
34770 6f 6b 65 6e 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  oken;..pFunction
34780 4c 69 73 74 2d 3e 43 5f 49 6e 69 74 50 49 4e 20  List->C_InitPIN 
34790 3d 20 43 5f 49 6e 69 74 50 49 4e 3b 0a 09 70 46  = C_InitPIN;..pF
347a0 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53  unctionList->C_S
347b0 65 74 50 49 4e 20 3d 20 43 5f 53 65 74 50 49 4e  etPIN = C_SetPIN
347c0 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
347d0 2d 3e 43 5f 4f 70 65 6e 53 65 73 73 69 6f 6e 20  ->C_OpenSession 
347e0 3d 20 43 5f 4f 70 65 6e 53 65 73 73 69 6f 6e 3b  = C_OpenSession;
347f0 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
34800 3e 43 5f 43 6c 6f 73 65 53 65 73 73 69 6f 6e 20  >C_CloseSession 
34810 3d 20 43 5f 43 6c 6f 73 65 53 65 73 73 69 6f 6e  = C_CloseSession
34820 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
34830 2d 3e 43 5f 43 6c 6f 73 65 41 6c 6c 53 65 73 73  ->C_CloseAllSess
34840 69 6f 6e 73 20 3d 20 43 5f 43 6c 6f 73 65 41 6c  ions = C_CloseAl
34850 6c 53 65 73 73 69 6f 6e 73 3b 0a 09 70 46 75 6e  lSessions;..pFun
34860 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74  ctionList->C_Get
34870 53 65 73 73 69 6f 6e 49 6e 66 6f 20 3d 20 43 5f  SessionInfo = C_
34880 47 65 74 53 65 73 73 69 6f 6e 49 6e 66 6f 3b 0a  GetSessionInfo;.
34890 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
348a0 43 5f 47 65 74 4f 70 65 72 61 74 69 6f 6e 53 74  C_GetOperationSt
348b0 61 74 65 20 3d 20 43 5f 47 65 74 4f 70 65 72 61  ate = C_GetOpera
348c0 74 69 6f 6e 53 74 61 74 65 3b 0a 09 70 46 75 6e  tionState;..pFun
348d0 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 65 74  ctionList->C_Set
348e0 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 65 20 3d  OperationState =
348f0 20 43 5f 53 65 74 4f 70 65 72 61 74 69 6f 6e 53   C_SetOperationS
34900 74 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  tate;..pFunction
34910 4c 69 73 74 2d 3e 43 5f 4c 6f 67 69 6e 20 3d 20  List->C_Login = 
34920 43 5f 4c 6f 67 69 6e 3b 0a 09 70 46 75 6e 63 74  C_Login;..pFunct
34930 69 6f 6e 4c 69 73 74 2d 3e 43 5f 4c 6f 67 6f 75  ionList->C_Logou
34940 74 20 3d 20 43 5f 4c 6f 67 6f 75 74 3b 0a 09 70  t = C_Logout;..p
34950 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
34960 43 72 65 61 74 65 4f 62 6a 65 63 74 20 3d 20 43  CreateObject = C
34970 5f 43 72 65 61 74 65 4f 62 6a 65 63 74 3b 0a 09  _CreateObject;..
34980 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
34990 5f 43 6f 70 79 4f 62 6a 65 63 74 20 3d 20 43 5f  _CopyObject = C_
349a0 43 6f 70 79 4f 62 6a 65 63 74 3b 0a 09 70 46 75  CopyObject;..pFu
349b0 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65  nctionList->C_De
349c0 73 74 72 6f 79 4f 62 6a 65 63 74 20 3d 20 43 5f  stroyObject = C_
349d0 44 65 73 74 72 6f 79 4f 62 6a 65 63 74 3b 0a 09  DestroyObject;..
349e0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
349f0 5f 47 65 74 4f 62 6a 65 63 74 53 69 7a 65 20 3d  _GetObjectSize =
34a00 20 43 5f 47 65 74 4f 62 6a 65 63 74 53 69 7a 65   C_GetObjectSize
34a10 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
34a20 2d 3e 43 5f 47 65 74 41 74 74 72 69 62 75 74 65  ->C_GetAttribute
34a30 56 61 6c 75 65 20 3d 20 43 5f 47 65 74 41 74 74  Value = C_GetAtt
34a40 72 69 62 75 74 65 56 61 6c 75 65 3b 0a 09 70 46  ributeValue;..pF
34a50 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53  unctionList->C_S
34a60 65 74 41 74 74 72 69 62 75 74 65 56 61 6c 75 65  etAttributeValue
34a70 20 3d 20 43 5f 53 65 74 41 74 74 72 69 62 75 74   = C_SetAttribut
34a80 65 56 61 6c 75 65 3b 0a 09 70 46 75 6e 63 74 69  eValue;..pFuncti
34a90 6f 6e 4c 69 73 74 2d 3e 43 5f 46 69 6e 64 4f 62  onList->C_FindOb
34aa0 6a 65 63 74 73 49 6e 69 74 20 3d 20 43 5f 46 69  jectsInit = C_Fi
34ab0 6e 64 4f 62 6a 65 63 74 73 49 6e 69 74 3b 0a 09  ndObjectsInit;..
34ac0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
34ad0 5f 46 69 6e 64 4f 62 6a 65 63 74 73 20 3d 20 43  _FindObjects = C
34ae0 5f 46 69 6e 64 4f 62 6a 65 63 74 73 3b 0a 09 70  _FindObjects;..p
34af0 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
34b00 46 69 6e 64 4f 62 6a 65 63 74 73 46 69 6e 61 6c  FindObjectsFinal
34b10 20 3d 20 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73   = C_FindObjects
34b20 46 69 6e 61 6c 3b 0a 09 70 46 75 6e 63 74 69 6f  Final;..pFunctio
34b30 6e 4c 69 73 74 2d 3e 43 5f 45 6e 63 72 79 70 74  nList->C_Encrypt
34b40 49 6e 69 74 20 3d 20 43 5f 45 6e 63 72 79 70 74  Init = C_Encrypt
34b50 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  Init;..pFunction
34b60 4c 69 73 74 2d 3e 43 5f 45 6e 63 72 79 70 74 20  List->C_Encrypt 
34b70 3d 20 43 5f 45 6e 63 72 79 70 74 3b 0a 09 70 46  = C_Encrypt;..pF
34b80 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 45  unctionList->C_E
34b90 6e 63 72 79 70 74 55 70 64 61 74 65 20 3d 20 43  ncryptUpdate = C
34ba0 5f 45 6e 63 72 79 70 74 55 70 64 61 74 65 3b 0a  _EncryptUpdate;.
34bb0 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
34bc0 43 5f 45 6e 63 72 79 70 74 46 69 6e 61 6c 20 3d  C_EncryptFinal =
34bd0 20 43 5f 45 6e 63 72 79 70 74 46 69 6e 61 6c 3b   C_EncryptFinal;
34be0 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
34bf0 3e 43 5f 44 65 63 72 79 70 74 49 6e 69 74 20 3d  >C_DecryptInit =
34c00 20 43 5f 44 65 63 72 79 70 74 49 6e 69 74 3b 0a   C_DecryptInit;.
34c10 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
34c20 43 5f 44 65 63 72 79 70 74 20 3d 20 43 5f 44 65  C_Decrypt = C_De
34c30 63 72 79 70 74 3b 0a 09 70 46 75 6e 63 74 69 6f  crypt;..pFunctio
34c40 6e 4c 69 73 74 2d 3e 43 5f 44 65 63 72 79 70 74  nList->C_Decrypt
34c50 55 70 64 61 74 65 20 3d 20 43 5f 44 65 63 72 79  Update = C_Decry
34c60 70 74 55 70 64 61 74 65 3b 0a 09 70 46 75 6e 63  ptUpdate;..pFunc
34c70 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65 63 72  tionList->C_Decr
34c80 79 70 74 46 69 6e 61 6c 20 3d 20 43 5f 44 65 63  yptFinal = C_Dec
34c90 72 79 70 74 46 69 6e 61 6c 3b 0a 09 70 46 75 6e  ryptFinal;..pFun
34ca0 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 69 67  ctionList->C_Dig
34cb0 65 73 74 49 6e 69 74 20 3d 20 43 5f 44 69 67 65  estInit = C_Dige
34cc0 73 74 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69  stInit;..pFuncti
34cd0 6f 6e 4c 69 73 74 2d 3e 43 5f 44 69 67 65 73 74  onList->C_Digest
34ce0 20 3d 20 43 5f 44 69 67 65 73 74 3b 0a 09 70 46   = C_Digest;..pF
34cf0 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44  unctionList->C_D
34d00 69 67 65 73 74 55 70 64 61 74 65 20 3d 20 43 5f  igestUpdate = C_
34d10 44 69 67 65 73 74 55 70 64 61 74 65 3b 0a 09 70  DigestUpdate;..p
34d20 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
34d30 44 69 67 65 73 74 4b 65 79 20 3d 20 43 5f 44 69  DigestKey = C_Di
34d40 67 65 73 74 4b 65 79 3b 0a 09 70 46 75 6e 63 74  gestKey;..pFunct
34d50 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 69 67 65 73  ionList->C_Diges
34d60 74 46 69 6e 61 6c 20 3d 20 43 5f 44 69 67 65 73  tFinal = C_Diges
34d70 74 46 69 6e 61 6c 3b 0a 09 70 46 75 6e 63 74 69  tFinal;..pFuncti
34d80 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 49 6e  onList->C_SignIn
34d90 69 74 20 3d 20 43 5f 53 69 67 6e 49 6e 69 74 3b  it = C_SignInit;
34da0 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
34db0 3e 43 5f 53 69 67 6e 20 3d 20 43 5f 53 69 67 6e  >C_Sign = C_Sign
34dc0 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
34dd0 2d 3e 43 5f 53 69 67 6e 55 70 64 61 74 65 20 3d  ->C_SignUpdate =
34de0 20 43 5f 53 69 67 6e 55 70 64 61 74 65 3b 0a 09   C_SignUpdate;..
34df0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
34e00 5f 53 69 67 6e 46 69 6e 61 6c 20 3d 20 43 5f 53  _SignFinal = C_S
34e10 69 67 6e 46 69 6e 61 6c 3b 0a 09 70 46 75 6e 63  ignFinal;..pFunc
34e20 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 6e  tionList->C_Sign
34e30 52 65 63 6f 76 65 72 49 6e 69 74 20 3d 20 43 5f  RecoverInit = C_
34e40 53 69 67 6e 52 65 63 6f 76 65 72 49 6e 69 74 3b  SignRecoverInit;
34e50 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
34e60 3e 43 5f 53 69 67 6e 52 65 63 6f 76 65 72 20 3d  >C_SignRecover =
34e70 20 43 5f 53 69 67 6e 52 65 63 6f 76 65 72 3b 0a   C_SignRecover;.
34e80 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
34e90 43 5f 56 65 72 69 66 79 49 6e 69 74 20 3d 20 43  C_VerifyInit = C
34ea0 5f 56 65 72 69 66 79 49 6e 69 74 3b 0a 09 70 46  _VerifyInit;..pF
34eb0 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 56  unctionList->C_V
34ec0 65 72 69 66 79 20 3d 20 43 5f 56 65 72 69 66 79  erify = C_Verify
34ed0 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
34ee0 2d 3e 43 5f 56 65 72 69 66 79 55 70 64 61 74 65  ->C_VerifyUpdate
34ef0 20 3d 20 43 5f 56 65 72 69 66 79 55 70 64 61 74   = C_VerifyUpdat
34f00 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  e;..pFunctionLis
34f10 74 2d 3e 43 5f 56 65 72 69 66 79 46 69 6e 61 6c  t->C_VerifyFinal
34f20 20 3d 20 43 5f 56 65 72 69 66 79 46 69 6e 61 6c   = C_VerifyFinal
34f30 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
34f40 2d 3e 43 5f 56 65 72 69 66 79 52 65 63 6f 76 65  ->C_VerifyRecove
34f50 72 49 6e 69 74 20 3d 20 43 5f 56 65 72 69 66 79  rInit = C_Verify
34f60 52 65 63 6f 76 65 72 49 6e 69 74 3b 0a 09 70 46  RecoverInit;..pF
34f70 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 56  unctionList->C_V
34f80 65 72 69 66 79 52 65 63 6f 76 65 72 20 3d 20 43  erifyRecover = C
34f90 5f 56 65 72 69 66 79 52 65 63 6f 76 65 72 3b 0a  _VerifyRecover;.
34fa0 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
34fb0 43 5f 44 69 67 65 73 74 45 6e 63 72 79 70 74 55  C_DigestEncryptU
34fc0 70 64 61 74 65 20 3d 20 43 5f 44 69 67 65 73 74  pdate = C_Digest
34fd0 45 6e 63 72 79 70 74 55 70 64 61 74 65 3b 0a 09  EncryptUpdate;..
34fe0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
34ff0 5f 44 65 63 72 79 70 74 44 69 67 65 73 74 55 70  _DecryptDigestUp
35000 64 61 74 65 20 3d 20 43 5f 44 65 63 72 79 70 74  date = C_Decrypt
35010 44 69 67 65 73 74 55 70 64 61 74 65 3b 0a 09 70  DigestUpdate;..p
35020 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
35030 53 69 67 6e 45 6e 63 72 79 70 74 55 70 64 61 74  SignEncryptUpdat
35040 65 20 3d 20 43 5f 53 69 67 6e 45 6e 63 72 79 70  e = C_SignEncryp
35050 74 55 70 64 61 74 65 3b 0a 09 70 46 75 6e 63 74  tUpdate;..pFunct
35060 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65 63 72 79  ionList->C_Decry
35070 70 74 56 65 72 69 66 79 55 70 64 61 74 65 20 3d  ptVerifyUpdate =
35080 20 43 5f 44 65 63 72 79 70 74 56 65 72 69 66 79   C_DecryptVerify
35090 55 70 64 61 74 65 3b 0a 09 70 46 75 6e 63 74 69  Update;..pFuncti
350a0 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 6e 65 72 61  onList->C_Genera
350b0 74 65 4b 65 79 20 3d 20 43 5f 47 65 6e 65 72 61  teKey = C_Genera
350c0 74 65 4b 65 79 3b 0a 09 70 46 75 6e 63 74 69 6f  teKey;..pFunctio
350d0 6e 4c 69 73 74 2d 3e 43 5f 47 65 6e 65 72 61 74  nList->C_Generat
350e0 65 4b 65 79 50 61 69 72 20 3d 20 43 5f 47 65 6e  eKeyPair = C_Gen
350f0 65 72 61 74 65 4b 65 79 50 61 69 72 3b 0a 09 70  erateKeyPair;..p
35100 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
35110 57 72 61 70 4b 65 79 20 3d 20 43 5f 57 72 61 70  WrapKey = C_Wrap
35120 4b 65 79 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  Key;..pFunctionL
35130 69 73 74 2d 3e 43 5f 55 6e 77 72 61 70 4b 65 79  ist->C_UnwrapKey
35140 20 3d 20 43 5f 55 6e 77 72 61 70 4b 65 79 3b 0a   = C_UnwrapKey;.
35150 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
35160 43 5f 44 65 72 69 76 65 4b 65 79 20 3d 20 43 5f  C_DeriveKey = C_
35170 44 65 72 69 76 65 4b 65 79 3b 0a 09 70 46 75 6e  DeriveKey;..pFun
35180 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 65 65  ctionList->C_See
35190 64 52 61 6e 64 6f 6d 20 3d 20 43 5f 53 65 65 64  dRandom = C_Seed
351a0 52 61 6e 64 6f 6d 3b 0a 09 70 46 75 6e 63 74 69  Random;..pFuncti
351b0 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 6e 65 72 61  onList->C_Genera
351c0 74 65 52 61 6e 64 6f 6d 20 3d 20 43 5f 47 65 6e  teRandom = C_Gen
351d0 65 72 61 74 65 52 61 6e 64 6f 6d 3b 0a 09 70 46  erateRandom;..pF
351e0 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47  unctionList->C_G
351f0 65 74 46 75 6e 63 74 69 6f 6e 53 74 61 74 75 73  etFunctionStatus
35200 20 3d 20 43 5f 47 65 74 46 75 6e 63 74 69 6f 6e   = C_GetFunction
35210 53 74 61 74 75 73 3b 0a 09 70 46 75 6e 63 74 69  Status;..pFuncti
35220 6f 6e 4c 69 73 74 2d 3e 43 5f 43 61 6e 63 65 6c  onList->C_Cancel
35230 46 75 6e 63 74 69 6f 6e 20 3d 20 43 5f 43 61 6e  Function = C_Can
35240 63 65 6c 46 75 6e 63 74 69 6f 6e 3b 0a 09 70 46  celFunction;..pF
35250 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47  unctionList->C_G
35260 65 74 46 75 6e 63 74 69 6f 6e 4c 69 73 74 20 3d  etFunctionList =
35270 20 43 5f 47 65 74 46 75 6e 63 74 69 6f 6e 4c 69   C_GetFunctionLi
35280 73 74 3b 0a 0a 09 73 70 46 75 6e 63 74 69 6f 6e  st;...spFunction
35290 4c 69 73 74 20 20 3d 20 70 46 75 6e 63 74 69 6f  List  = pFunctio
352a0 6e 4c 69 73 74 3b 0a 09 2a 70 70 46 75 6e 63 74  nList;..*ppFunct
352b0 69 6f 6e 4c 69 73 74 20 3d 20 70 46 75 6e 63 74  ionList = pFunct
352c0 69 6f 6e 4c 69 73 74 3b 0a 0a 09 43 41 43 4b 45  ionList;...CACKE
352d0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
352e0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b  Returning CKR_OK
352f0 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b   (%i)", CKR_OK);
35300 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b  ...return(CKR_OK
35310 29 3b 0a 7d 0a                                   );.}.