Hex Artifact Content

Artifact 788bc7d9fe6b2da11a61eabc520f45696b38cb1f:


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 2f 2a 20 54 72 79 20 61 67  ......./* Try ag
11140 61 69 6e 20 61 73 20 61 20 67 7a 69 70 20 62 75  ain as a gzip bu
11150 66 66 65 72 20 2a 2f 0a 09 09 09 09 09 09 75 6e  ffer */.......un
11160 63 6f 6d 70 72 65 73 73 5f 72 65 74 20 3d 20 69  compress_ret = i
11170 6e 66 6c 61 74 65 45 6e 64 28 26 67 7a 69 70 5f  nflateEnd(&gzip_
11180 73 74 72 65 61 6d 29 3b 0a 09 09 09 09 09 09 69  stream);.......i
11190 66 20 28 75 6e 63 6f 6d 70 72 65 73 73 5f 72 65  f (uncompress_re
111a0 74 20 3d 3d 20 5a 5f 4f 4b 29 20 7b 0a 09 09 09  t == Z_OK) {....
111b0 09 09 09 09 67 7a 69 70 5f 73 74 72 65 61 6d 2e  ....gzip_stream.
111c0 7a 61 6c 6c 6f 63 20 3d 20 4e 55 4c 4c 3b 0a 09  zalloc = NULL;..
111d0 09 09 09 09 09 09 67 7a 69 70 5f 73 74 72 65 61  ......gzip_strea
111e0 6d 2e 7a 66 72 65 65 20 3d 20 4e 55 4c 4c 3b 0a  m.zfree = NULL;.
111f0 09 09 09 09 09 09 09 67 7a 69 70 5f 73 74 72 65  .......gzip_stre
11200 61 6d 2e 6f 70 61 71 75 65 20 3d 20 4e 55 4c 4c  am.opaque = NULL
11210 3b 0a 0a 09 09 09 09 09 09 09 67 7a 69 70 5f 73  ;.........gzip_s
11220 74 72 65 61 6d 2e 6e 65 78 74 5f 69 6e 20 20 3d  tream.next_in  =
11230 20 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66   curr_id->certif
11240 69 63 61 74 65 3b 0a 09 09 09 09 09 09 09 67 7a  icate;........gz
11250 69 70 5f 73 74 72 65 61 6d 2e 61 76 61 69 6c 5f  ip_stream.avail_
11260 69 6e 20 3d 20 63 75 72 72 5f 69 64 2d 3e 63 65  in = curr_id->ce
11270 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 3b 0a 09  rtificate_len;..
11280 09 09 09 09 09 09 67 7a 69 70 5f 73 74 72 65 61  ......gzip_strea
11290 6d 2e 6e 65 78 74 5f 6f 75 74 20 3d 20 74 6d 70  m.next_out = tmp
112a0 62 75 66 3b 0a 09 09 09 09 09 09 09 67 7a 69 70  buf;........gzip
112b0 5f 73 74 72 65 61 6d 2e 61 76 61 69 6c 5f 6f 75  _stream.avail_ou
112c0 74 20 3d 20 74 6d 70 62 75 66 6c 65 6e 3b 0a 09  t = tmpbuflen;..
112d0 09 09 09 09 09 09 75 6e 63 6f 6d 70 72 65 73 73  ......uncompress
112e0 5f 72 65 74 20 3d 20 69 6e 66 6c 61 74 65 49 6e  _ret = inflateIn
112f0 69 74 32 28 26 67 7a 69 70 5f 73 74 72 65 61 6d  it2(&gzip_stream
11300 2c 20 33 31 29 3b 0a 09 09 09 09 09 09 7d 0a 09  , 31);.......}..
11310 09 09 09 09 7d 0a 09 09 09 09 09 69 66 20 28 75  ....}......if (u
11320 6e 63 6f 6d 70 72 65 73 73 5f 72 65 74 20 3d 3d  ncompress_ret ==
11330 20 5a 5f 4f 4b 29 20 7b 0a 09 09 09 09 09 09 75   Z_OK) {.......u
11340 6e 63 6f 6d 70 72 65 73 73 5f 72 65 74 20 3d 20  ncompress_ret = 
11350 69 6e 66 6c 61 74 65 28 26 67 7a 69 70 5f 73 74  inflate(&gzip_st
11360 72 65 61 6d 2c 20 30 29 3b 0a 09 09 09 09 09 7d  ream, 0);......}
11370 0a 09 09 09 09 09 69 66 20 28 75 6e 63 6f 6d 70  ......if (uncomp
11380 72 65 73 73 5f 72 65 74 20 3d 3d 20 5a 5f 53 54  ress_ret == Z_ST
11390 52 45 41 4d 5f 45 4e 44 29 20 7b 0a 09 09 09 09  REAM_END) {.....
113a0 09 09 75 6e 63 6f 6d 70 72 65 73 73 5f 72 65 74  ..uncompress_ret
113b0 20 3d 20 69 6e 66 6c 61 74 65 45 6e 64 28 26 67   = inflateEnd(&g
113c0 7a 69 70 5f 73 74 72 65 61 6d 29 3b 0a 09 09 09  zip_stream);....
113d0 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09  ..} else {......
113e0 09 75 6e 63 6f 6d 70 72 65 73 73 5f 72 65 74 20  .uncompress_ret 
113f0 3d 20 5a 5f 44 41 54 41 5f 45 52 52 4f 52 3b 0a  = Z_DATA_ERROR;.
11400 09 09 09 09 09 7d 0a 09 09 09 09 09 69 66 20 28  .....}......if (
11410 75 6e 63 6f 6d 70 72 65 73 73 5f 72 65 74 20 3d  uncompress_ret =
11420 3d 20 5a 5f 4f 4b 29 20 7b 0a 09 09 09 09 09 09  = Z_OK) {.......
11430 74 6d 70 62 75 66 6c 65 6e 20 3d 20 67 7a 69 70  tmpbuflen = gzip
11440 5f 73 74 72 65 61 6d 2e 74 6f 74 61 6c 5f 6f 75  _stream.total_ou
11450 74 3b 0a 0a 09 09 09 09 09 09 43 41 43 4b 45 59  t;........CACKEY
11460 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28  _DEBUG_PRINTBUF(
11470 22 44 65 63 6f 6d 70 72 65 73 73 65 64 20 74 6f  "Decompressed to
11480 3a 22 2c 20 74 6d 70 62 75 66 2c 20 74 6d 70 62  :", tmpbuf, tmpb
11490 75 66 6c 65 6e 29 3b 0a 0a 09 09 09 09 09 09 66  uflen);........f
114a0 72 65 65 28 63 75 72 72 5f 69 64 2d 3e 63 65 72  ree(curr_id->cer
114b0 74 69 66 69 63 61 74 65 29 3b 0a 0a 09 09 09 09  tificate);......
114c0 09 09 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69  ..curr_id->certi
114d0 66 69 63 61 74 65 20 3d 20 74 6d 70 62 75 66 3b  ficate = tmpbuf;
114e0 0a 09 09 09 09 09 09 63 75 72 72 5f 69 64 2d 3e  .......curr_id->
114f0 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20  certificate_len 
11500 3d 20 74 6d 70 62 75 66 6c 65 6e 3b 0a 09 09 09  = tmpbuflen;....
11510 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09  ..} else {......
11520 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
11530 49 4e 54 46 28 22 44 65 63 6f 6d 70 72 65 73 73  INTF("Decompress
11540 69 6e 67 20 66 61 69 6c 65 64 21 20 75 6e 63 6f  ing failed! unco
11550 6d 70 72 65 73 73 28 29 20 72 65 74 75 72 6e 65  mpress() returne
11560 64 20 25 69 22 2c 20 75 6e 63 6f 6d 70 72 65 73  d %i", uncompres
11570 73 5f 72 65 74 29 3b 0a 0a 09 09 09 09 09 09 66  s_ret);........f
11580 72 65 65 28 74 6d 70 62 75 66 29 3b 0a 09 09 09  ree(tmpbuf);....
11590 09 09 7d 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 23  ..}.....}....}.#
115a0 65 6e 64 69 66 0a 09 09 7d 0a 09 7d 20 65 6c 73  endif...}..} els
115b0 65 20 7b 0a 09 09 2f 2a 20 52 65 61 64 20 61 6c  e {.../* Read al
115c0 6c 20 74 68 65 20 61 70 70 6c 65 74 73 20 66 72  l the applets fr
115d0 6f 6d 20 74 68 65 20 43 43 43 27 73 20 54 4c 56  om the CCC's TLV
115e0 20 2a 2f 0a 09 09 63 63 63 5f 74 6c 76 20 3d 20   */...ccc_tlv = 
115f0 63 61 63 6b 65 79 5f 72 65 61 64 5f 74 6c 76 28  cackey_read_tlv(
11600 73 6c 6f 74 29 3b 0a 0a 09 09 2f 2a 20 4c 6f 6f  slot);..../* Loo
11610 6b 20 66 6f 72 20 43 41 52 44 55 52 4c 73 20 74  k for CARDURLs t
11620 68 61 74 20 63 6f 6f 72 65 73 70 6f 6e 64 20 74  hat coorespond t
11630 6f 20 50 4b 49 20 61 70 70 6c 65 74 73 20 2a 2f  o PKI applets */
11640 0a 09 09 66 6f 72 20 28 63 63 63 5f 63 75 72 72  ...for (ccc_curr
11650 20 3d 20 63 63 63 5f 74 6c 76 3b 20 63 63 63 5f   = ccc_tlv; ccc_
11660 63 75 72 72 3b 20 63 63 63 5f 63 75 72 72 20 3d  curr; ccc_curr =
11670 20 63 63 63 5f 63 75 72 72 2d 3e 5f 6e 65 78 74   ccc_curr->_next
11680 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
11690 42 55 47 5f 50 52 49 4e 54 46 28 22 46 6f 75 6e  BUG_PRINTF("Foun
116a0 64 20 74 61 67 3a 20 25 73 20 2e 2e 2e 20 22 2c  d tag: %s ... ",
116b0 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55   CACKEY_DEBUG_FU
116c0 4e 43 5f 54 41 47 5f 54 4f 5f 53 54 52 28 63 63  NC_TAG_TO_STR(cc
116d0 63 5f 63 75 72 72 2d 3e 74 61 67 29 29 3b 0a 0a  c_curr->tag));..
116e0 09 09 09 69 66 20 28 63 63 63 5f 63 75 72 72 2d  ...if (ccc_curr-
116f0 3e 74 61 67 20 21 3d 20 47 53 43 49 53 5f 54 41  >tag != GSCIS_TA
11700 47 5f 43 41 52 44 55 52 4c 29 20 7b 0a 09 09 09  G_CARDURL) {....
11710 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
11720 49 4e 54 46 28 22 20 20 2e 2e 2e 20 73 6b 69 70  INTF("  ... skip
11730 70 69 6e 67 20 69 74 20 28 77 65 20 6f 6e 6c 79  ping it (we only
11740 20 63 61 72 65 20 61 62 6f 75 74 20 43 41 52 44   care about CARD
11750 55 52 4c 73 29 22 29 3b 0a 0a 09 09 09 09 63 6f  URLs)");......co
11760 6e 74 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a 09 09  ntinue;....}....
11770 09 69 66 20 28 28 63 63 63 5f 63 75 72 72 2d 3e  .if ((ccc_curr->
11780 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61  value_cardurl->a
11790 70 70 74 79 70 65 20 26 20 43 41 43 4b 45 59 5f  pptype & CACKEY_
117a0 54 4c 56 5f 41 50 50 5f 50 4b 49 29 20 21 3d 20  TLV_APP_PKI) != 
117b0 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 50  CACKEY_TLV_APP_P
117c0 4b 49 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59  KI) {.....CACKEY
117d0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
117e0 20 2e 2e 2e 20 73 6b 69 70 70 69 6e 67 20 69 74   ... skipping it
117f0 20 28 77 65 20 6f 6e 6c 79 20 63 61 72 65 20 61   (we only care a
11800 62 6f 75 74 20 50 4b 49 20 61 70 70 6c 65 74 73  bout PKI applets
11810 2c 20 74 68 69 73 20 61 70 70 6c 65 74 20 73 75  , this applet su
11820 70 70 6f 72 74 73 3a 20 25 73 2f 25 30 32 78 29  pports: %s/%02x)
11830 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ", CACKEY_DEBUG_
11840 46 55 4e 43 5f 41 50 50 54 59 50 45 5f 54 4f 5f  FUNC_APPTYPE_TO_
11850 53 54 52 28 63 63 63 5f 63 75 72 72 2d 3e 76 61  STR(ccc_curr->va
11860 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70  lue_cardurl->app
11870 74 79 70 65 29 2c 20 28 75 6e 73 69 67 6e 65 64  type), (unsigned
11880 20 69 6e 74 29 20 63 63 63 5f 63 75 72 72 2d 3e   int) ccc_curr->
11890 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61  value_cardurl->a
118a0 70 70 74 79 70 65 29 3b 0a 0a 09 09 09 09 63 6f  pptype);......co
118b0 6e 74 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a 09 09  ntinue;....}....
118c0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
118d0 49 4e 54 42 55 46 28 22 52 49 44 3a 22 2c 20 63  INTBUF("RID:", c
118e0 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63  cc_curr->value_c
118f0 61 72 64 75 72 6c 2d 3e 72 69 64 2c 20 73 69 7a  ardurl->rid, siz
11900 65 6f 66 28 63 63 63 5f 63 75 72 72 2d 3e 76 61  eof(ccc_curr->va
11910 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 72 69 64  lue_cardurl->rid
11920 29 29 3b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ));....CACKEY_DE
11930 42 55 47 5f 50 52 49 4e 54 46 28 22 41 70 70 49  BUG_PRINTF("AppI
11940 44 20 3d 20 25 73 2f 25 30 34 6c 78 22 2c 20 43  D = %s/%04lx", C
11950 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43  ACKEY_DEBUG_FUNC
11960 5f 4f 42 4a 49 44 5f 54 4f 5f 53 54 52 28 63 63  _OBJID_TO_STR(cc
11970 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61  c_curr->value_ca
11980 72 64 75 72 6c 2d 3e 61 70 70 69 64 29 2c 20 28  rdurl->appid), (
11990 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63  unsigned long) c
119a0 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63  cc_curr->value_c
119b0 61 72 64 75 72 6c 2d 3e 61 70 70 69 64 29 3b 0a  ardurl->appid);.
119c0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
119d0 50 52 49 4e 54 46 28 22 4f 62 6a 65 63 74 49 44  PRINTF("ObjectID
119e0 20 3d 20 25 73 2f 25 30 34 6c 78 22 2c 20 43 41   = %s/%04lx", CA
119f0 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
11a00 4f 42 4a 49 44 5f 54 4f 5f 53 54 52 28 63 63 63  OBJID_TO_STR(ccc
11a10 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72  _curr->value_car
11a20 64 75 72 6c 2d 3e 6f 62 6a 65 63 74 69 64 29 2c  durl->objectid),
11a30 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
11a40 20 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65   ccc_curr->value
11a50 5f 63 61 72 64 75 72 6c 2d 3e 6f 62 6a 65 63 74  _cardurl->object
11a60 69 64 29 3b 0a 0a 09 09 09 6d 65 6d 63 70 79 28  id);.....memcpy(
11a70 63 75 72 72 5f 61 69 64 2c 20 63 63 63 5f 63 75  curr_aid, ccc_cu
11a80 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72  rr->value_cardur
11a90 6c 2d 3e 72 69 64 2c 20 73 69 7a 65 6f 66 28 63  l->rid, sizeof(c
11aa0 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63  cc_curr->value_c
11ab0 61 72 64 75 72 6c 2d 3e 72 69 64 29 29 3b 0a 09  ardurl->rid));..
11ac0 09 09 63 75 72 72 5f 61 69 64 5b 73 69 7a 65 6f  ..curr_aid[sizeo
11ad0 66 28 63 75 72 72 5f 61 69 64 29 20 2d 20 32 5d  f(curr_aid) - 2]
11ae0 20 3d 20 28 63 63 63 5f 63 75 72 72 2d 3e 76 61   = (ccc_curr->va
11af0 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70  lue_cardurl->app
11b00 69 64 20 3e 3e 20 38 29 20 26 20 30 78 66 66 3b  id >> 8) & 0xff;
11b10 0a 09 09 09 63 75 72 72 5f 61 69 64 5b 73 69 7a  ....curr_aid[siz
11b20 65 6f 66 28 63 75 72 72 5f 61 69 64 29 20 2d 20  eof(curr_aid) - 
11b30 31 5d 20 3d 20 63 63 63 5f 63 75 72 72 2d 3e 76  1] = ccc_curr->v
11b40 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70  alue_cardurl->ap
11b50 70 69 64 20 26 20 30 78 66 66 3b 0a 0a 09 09 09  pid & 0xff;.....
11b60 2f 2a 20 53 65 6c 65 63 74 20 66 6f 75 6e 64 20  /* Select found 
11b70 61 70 70 6c 65 74 20 2e 2e 2e 20 2a 2f 0a 09 09  applet ... */...
11b80 09 73 65 6c 65 63 74 5f 72 65 74 20 3d 20 63 61  .select_ret = ca
11b90 63 6b 65 79 5f 73 65 6c 65 63 74 5f 61 70 70 6c  ckey_select_appl
11ba0 65 74 28 73 6c 6f 74 2c 20 63 75 72 72 5f 61 69  et(slot, curr_ai
11bb0 64 2c 20 73 69 7a 65 6f 66 28 63 75 72 72 5f 61  d, sizeof(curr_a
11bc0 69 64 29 29 3b 0a 09 09 09 69 66 20 28 73 65 6c  id));....if (sel
11bd0 65 63 74 5f 72 65 74 20 21 3d 20 43 41 43 4b 45  ect_ret != CACKE
11be0 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09  Y_PCSC_S_OK) {..
11bf0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
11c00 50 52 49 4e 54 46 28 22 46 61 69 6c 65 64 20 74  PRINTF("Failed t
11c10 6f 20 73 65 6c 65 63 74 20 61 70 70 6c 65 74 2c  o select applet,
11c20 20 73 6b 69 70 70 69 6e 67 20 70 72 6f 63 65 73   skipping proces
11c30 73 69 6e 67 20 6f 66 20 74 68 69 73 20 6f 62 6a  sing of this obj
11c40 65 63 74 22 29 3b 0a 0a 09 09 09 09 63 6f 6e 74  ect");......cont
11c50 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a 09 09 09 2f  inue;....}...../
11c60 2a 20 2e 2e 2e 20 61 6e 64 20 6f 62 6a 65 63 74  * ... and object
11c70 20 28 66 69 6c 65 29 20 2a 2f 0a 09 09 09 73 65   (file) */....se
11c80 6c 65 63 74 5f 72 65 74 20 3d 20 63 61 63 6b 65  lect_ret = cacke
11c90 79 5f 73 65 6c 65 63 74 5f 66 69 6c 65 28 73 6c  y_select_file(sl
11ca0 6f 74 2c 20 63 63 63 5f 63 75 72 72 2d 3e 76 61  ot, ccc_curr->va
11cb0 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 6f 62 6a  lue_cardurl->obj
11cc0 65 63 74 69 64 29 3b 0a 09 09 09 69 66 20 28 73  ectid);....if (s
11cd0 65 6c 65 63 74 5f 72 65 74 20 21 3d 20 43 41 43  elect_ret != CAC
11ce0 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b  KEY_PCSC_S_OK) {
11cf0 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
11d00 47 5f 50 52 49 4e 54 46 28 22 46 61 69 6c 65 64  G_PRINTF("Failed
11d10 20 74 6f 20 73 65 6c 65 63 74 20 66 69 6c 65 2c   to select file,
11d20 20 73 6b 69 70 70 69 6e 67 20 70 72 6f 63 65 73   skipping proces
11d30 73 69 6e 67 20 6f 66 20 74 68 69 73 20 6f 62 6a  sing of this obj
11d40 65 63 74 22 29 3b 0a 0a 09 09 09 09 63 6f 6e 74  ect");......cont
11d50 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a 09 09 09 2f  inue;....}...../
11d60 2a 20 50 72 6f 63 65 73 73 20 74 68 69 73 20 66  * Process this f
11d70 69 6c 65 27 73 20 54 4c 56 20 6c 6f 6f 6b 69 6e  ile's TLV lookin
11d80 67 20 66 6f 72 20 63 65 72 74 69 66 69 63 61 74  g for certificat
11d90 65 73 20 2a 2f 0a 09 09 09 61 70 70 5f 74 6c 76  es */....app_tlv
11da0 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 74   = cackey_read_t
11db0 6c 76 28 73 6c 6f 74 29 3b 0a 09 0a 09 09 09 66  lv(slot);......f
11dc0 6f 72 20 28 61 70 70 5f 63 75 72 72 20 3d 20 61  or (app_curr = a
11dd0 70 70 5f 74 6c 76 3b 20 61 70 70 5f 63 75 72 72  pp_tlv; app_curr
11de0 3b 20 61 70 70 5f 63 75 72 72 20 3d 20 61 70 70  ; app_curr = app
11df0 5f 63 75 72 72 2d 3e 5f 6e 65 78 74 29 20 7b 0a  _curr->_next) {.
11e00 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
11e10 5f 50 52 49 4e 54 46 28 22 46 6f 75 6e 64 20 74  _PRINTF("Found t
11e20 61 67 3a 20 25 73 22 2c 20 43 41 43 4b 45 59 5f  ag: %s", CACKEY_
11e30 44 45 42 55 47 5f 46 55 4e 43 5f 54 41 47 5f 54  DEBUG_FUNC_TAG_T
11e40 4f 5f 53 54 52 28 61 70 70 5f 63 75 72 72 2d 3e  O_STR(app_curr->
11e50 74 61 67 29 29 3b 0a 09 09 09 09 69 66 20 28 61  tag));.....if (a
11e60 70 70 5f 63 75 72 72 2d 3e 74 61 67 20 21 3d 20  pp_curr->tag != 
11e70 47 53 43 49 53 5f 54 41 47 5f 43 45 52 54 49 46  GSCIS_TAG_CERTIF
11e80 49 43 41 54 45 29 20 7b 0a 09 09 09 09 09 43 41  ICATE) {......CA
11e90 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
11ea0 46 28 22 20 20 2e 2e 2e 20 73 6b 69 70 70 69 6e  F("  ... skippin
11eb0 67 20 69 74 20 28 77 65 20 6f 6e 6c 79 20 63 61  g it (we only ca
11ec0 72 65 20 61 62 6f 75 74 20 43 45 52 54 49 46 49  re about CERTIFI
11ed0 43 41 54 45 73 29 22 29 3b 0a 0a 09 09 09 09 09  CATEs)");.......
11ee0 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 09 7d 0a  continue;.....}.
11ef0 0a 09 09 09 09 63 75 72 72 5f 69 64 20 3d 20 26  .....curr_id = &
11f00 63 65 72 74 73 5b 6f 75 74 69 64 78 5d 3b 0a 09  certs[outidx];..
11f10 09 09 09 6f 75 74 69 64 78 2b 2b 3b 0a 0a 09 09  ...outidx++;....
11f20 09 09 63 75 72 72 5f 69 64 2d 3e 69 64 5f 74 79  ..curr_id->id_ty
11f30 70 65 20 3d 20 43 41 43 4b 45 59 5f 49 44 5f 54  pe = CACKEY_ID_T
11f40 59 50 45 5f 43 41 43 3b 0a 09 09 09 09 6d 65 6d  YPE_CAC;.....mem
11f50 63 70 79 28 63 75 72 72 5f 69 64 2d 3e 63 61 72  cpy(curr_id->car
11f60 64 2e 63 61 63 2e 61 70 70 6c 65 74 2c 20 63 75  d.cac.applet, cu
11f70 72 72 5f 61 69 64 2c 20 73 69 7a 65 6f 66 28 63  rr_aid, sizeof(c
11f80 75 72 72 5f 69 64 2d 3e 63 61 72 64 2e 63 61 63  urr_id->card.cac
11f90 2e 61 70 70 6c 65 74 29 29 3b 0a 09 09 09 09 63  .applet));.....c
11fa0 75 72 72 5f 69 64 2d 3e 63 61 72 64 2e 63 61 63  urr_id->card.cac
11fb0 2e 66 69 6c 65 20 3d 20 63 63 63 5f 63 75 72 72  .file = ccc_curr
11fc0 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d  ->value_cardurl-
11fd0 3e 6f 62 6a 65 63 74 69 64 3b 0a 09 09 09 09 63  >objectid;.....c
11fe0 75 72 72 5f 69 64 2d 3e 6b 65 79 73 69 7a 65 20  urr_id->keysize 
11ff0 3d 20 2d 31 3b 0a 0a 09 09 09 09 43 41 43 4b 45  = -1;......CACKE
12000 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
12010 46 69 6c 6c 69 6e 67 20 63 75 72 72 5f 69 64 2d  Filling curr_id-
12020 3e 63 61 72 64 2e 63 61 63 2e 61 70 70 6c 65 74  >card.cac.applet
12030 20 28 25 70 29 20 77 69 74 68 20 25 6c 75 20 62   (%p) with %lu b
12040 79 74 65 73 3a 22 2c 20 63 75 72 72 5f 69 64 2d  ytes:", curr_id-
12050 3e 63 61 72 64 2e 63 61 63 2e 61 70 70 6c 65 74  >card.cac.applet
12060 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
12070 29 20 73 69 7a 65 6f 66 28 63 75 72 72 5f 69 64  ) sizeof(curr_id
12080 2d 3e 63 61 72 64 2e 63 61 63 2e 61 70 70 6c 65  ->card.cac.apple
12090 74 29 29 3b 0a 09 09 09 09 43 41 43 4b 45 59 5f  t));.....CACKEY_
120a0 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22  DEBUG_PRINTBUF("
120b0 56 41 4c 3a 22 2c 20 63 75 72 72 5f 69 64 2d 3e  VAL:", curr_id->
120c0 63 61 72 64 2e 63 61 63 2e 61 70 70 6c 65 74 2c  card.cac.applet,
120d0 20 73 69 7a 65 6f 66 28 63 75 72 72 5f 69 64 2d   sizeof(curr_id-
120e0 3e 63 61 72 64 2e 63 61 63 2e 61 70 70 6c 65 74  >card.cac.applet
120f0 29 29 3b 0a 0a 09 09 09 09 63 75 72 72 5f 69 64  ));......curr_id
12100 2d 3e 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65  ->certificate_le
12110 6e 20 3d 20 61 70 70 5f 63 75 72 72 2d 3e 6c 65  n = app_curr->le
12120 6e 67 74 68 3b 0a 0a 09 09 09 09 63 75 72 72 5f  ngth;......curr_
12130 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65 20  id->certificate 
12140 3d 20 6d 61 6c 6c 6f 63 28 63 75 72 72 5f 69 64  = malloc(curr_id
12150 2d 3e 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65  ->certificate_le
12160 6e 29 3b 0a 09 09 09 09 6d 65 6d 63 70 79 28 63  n);.....memcpy(c
12170 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63  urr_id->certific
12180 61 74 65 2c 20 61 70 70 5f 63 75 72 72 2d 3e 76  ate, app_curr->v
12190 61 6c 75 65 2c 20 63 75 72 72 5f 69 64 2d 3e 63  alue, curr_id->c
121a0 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b  ertificate_len);
121b0 0a 0a 09 09 09 09 69 66 20 28 6f 75 74 69 64 78  ......if (outidx
121c0 20 3e 3d 20 2a 63 6f 75 6e 74 29 20 7b 0a 09 09   >= *count) {...
121d0 09 09 09 69 66 20 28 63 65 72 74 73 5f 72 65 73  ...if (certs_res
121e0 69 7a 61 62 6c 65 29 20 7b 0a 09 09 09 09 09 09  izable) {.......
121f0 2a 63 6f 75 6e 74 20 2a 3d 20 32 3b 0a 09 09 09  *count *= 2;....
12200 09 09 09 69 66 20 28 2a 63 6f 75 6e 74 20 21 3d  ...if (*count !=
12210 20 30 29 20 7b 0a 09 09 09 09 09 09 09 63 65 72   0) {........cer
12220 74 73 20 3d 20 72 65 61 6c 6c 6f 63 28 63 65 72  ts = realloc(cer
12230 74 73 2c 20 73 69 7a 65 6f 66 28 2a 63 65 72 74  ts, sizeof(*cert
12240 73 29 20 2a 20 28 2a 63 6f 75 6e 74 29 29 3b 0a  s) * (*count));.
12250 09 09 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09  ......} else {..
12260 09 09 09 09 09 09 63 65 72 74 73 20 3d 20 4e 55  ......certs = NU
12270 4c 4c 3b 0a 09 09 09 09 09 09 7d 0a 09 09 09 09  LL;.......}.....
12280 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09  .} else {.......
12290 62 72 65 61 6b 3b 0a 09 09 09 09 09 7d 0a 09 09  break;......}...
122a0 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 09 63 61 63  ..}....}.....cac
122b0 6b 65 79 5f 66 72 65 65 5f 74 6c 76 28 61 70 70  key_free_tlv(app
122c0 5f 74 6c 76 29 3b 0a 0a 09 09 09 69 66 20 28 6f  _tlv);.....if (o
122d0 75 74 69 64 78 20 3e 3d 20 2a 63 6f 75 6e 74 29  utidx >= *count)
122e0 20 7b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09   {.....break;...
122f0 09 7d 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79  .}...}....cackey
12300 5f 66 72 65 65 5f 74 6c 76 28 63 63 63 5f 74 6c  _free_tlv(ccc_tl
12310 76 29 3b 0a 09 7d 0a 0a 09 2a 63 6f 75 6e 74 20  v);..}...*count 
12320 3d 20 6f 75 74 69 64 78 3b 0a 0a 09 69 66 20 28  = outidx;...if (
12330 63 65 72 74 73 5f 72 65 73 69 7a 61 62 6c 65 29  certs_resizable)
12340 20 7b 0a 09 09 69 66 20 28 2a 63 6f 75 6e 74 20   {...if (*count 
12350 21 3d 20 30 29 20 7b 0a 09 09 09 63 65 72 74 73  != 0) {....certs
12360 20 3d 20 72 65 61 6c 6c 6f 63 28 63 65 72 74 73   = realloc(certs
12370 2c 20 73 69 7a 65 6f 66 28 2a 63 65 72 74 73 29  , sizeof(*certs)
12380 20 2a 20 28 2a 63 6f 75 6e 74 29 29 3b 0a 09 09   * (*count));...
12390 7d 20 65 6c 73 65 20 7b 0a 09 09 09 66 72 65 65  } else {....free
123a0 28 63 65 72 74 73 29 3b 0a 0a 09 09 09 63 65 72  (certs);.....cer
123b0 74 73 20 3d 20 4e 55 4c 4c 3b 0a 09 09 7d 0a 09  ts = NULL;...}..
123c0 7d 0a 0a 09 73 6c 6f 74 2d 3e 63 61 63 68 65 64  }...slot->cached
123d0 5f 63 65 72 74 73 20 3d 20 63 61 63 6b 65 79 5f  _certs = cackey_
123e0 63 6f 70 79 5f 63 65 72 74 73 28 4e 55 4c 4c 2c  copy_certs(NULL,
123f0 20 63 65 72 74 73 2c 20 2a 63 6f 75 6e 74 29 3b   certs, *count);
12400 0a 09 73 6c 6f 74 2d 3e 63 61 63 68 65 64 5f 63  ..slot->cached_c
12410 65 72 74 73 5f 63 6f 75 6e 74 20 3d 20 2a 63 6f  erts_count = *co
12420 75 6e 74 3b 0a 0a 09 2f 2a 20 54 65 72 6d 69 6e  unt;.../* Termin
12430 61 74 65 20 53 6d 61 72 74 43 61 72 64 20 54 72  ate SmartCard Tr
12440 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 63 61  ansaction */..ca
12450 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ckey_end_transac
12460 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 72 65  tion(slot);...re
12470 74 75 72 6e 28 63 65 72 74 73 29 3b 0a 7d 0a 0a  turn(certs);.}..
12480 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20  /*. * SYNPOSIS. 
12490 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20  *     .... *. * 
124a0 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20  ARGUMENTS. *    
124b0 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52   .... *. * RETUR
124c0 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 2e  N VALUE. *     .
124d0 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20  ... *. * NOTES. 
124e0 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f  *     .... *. */
124f0 0a 73 74 61 74 69 63 20 73 73 69 7a 65 5f 74 20  .static ssize_t 
12500 63 61 63 6b 65 79 5f 73 69 67 6e 64 65 63 72 79  cackey_signdecry
12510 70 74 28 73 74 72 75 63 74 20 63 61 63 6b 65 79  pt(struct cackey
12520 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 73 74 72  _slot *slot, str
12530 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e 74  uct cackey_ident
12540 69 74 79 20 2a 69 64 65 6e 74 69 74 79 2c 20 75  ity *identity, u
12550 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75  nsigned char *bu
12560 66 2c 20 73 69 7a 65 5f 74 20 62 75 66 6c 65 6e  f, size_t buflen
12570 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
12580 2a 6f 75 74 62 75 66 2c 20 73 69 7a 65 5f 74 20  *outbuf, size_t 
12590 6f 75 74 62 75 66 6c 65 6e 2c 20 69 6e 74 20 70  outbuflen, int p
125a0 61 64 49 6e 70 75 74 2c 20 69 6e 74 20 75 6e 70  adInput, int unp
125b0 61 64 4f 75 74 70 75 74 29 20 7b 0a 09 63 61 63  adOutput) {..cac
125c0 6b 65 79 5f 70 63 73 63 5f 69 64 5f 74 79 70 65  key_pcsc_id_type
125d0 20 69 64 5f 74 79 70 65 3b 0a 09 75 6e 73 69 67   id_type;..unsig
125e0 6e 65 64 20 63 68 61 72 20 64 79 6e 5f 61 75 74  ned char dyn_aut
125f0 68 5f 74 65 6d 70 6c 61 74 65 5b 31 30 5d 2c 20  h_template[10], 
12600 2a 64 79 6e 5f 61 75 74 68 5f 74 6d 70 62 75 66  *dyn_auth_tmpbuf
12610 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72  ;..unsigned char
12620 20 2a 74 6d 70 62 75 66 2c 20 2a 74 6d 70 62 75   *tmpbuf, *tmpbu
12630 66 5f 73 2c 20 2a 6f 75 74 62 75 66 5f 73 2c 20  f_s, *outbuf_s, 
12640 2a 6f 75 74 62 75 66 5f 70 3b 0a 09 75 6e 73 69  *outbuf_p;..unsi
12650 67 6e 65 64 20 63 68 61 72 20 62 79 74 65 73 5f  gned char bytes_
12660 74 6f 5f 73 65 6e 64 2c 20 70 31 2c 20 63 6c 61  to_send, p1, cla
12670 73 73 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68  ss;..unsigned ch
12680 61 72 20 62 6c 6f 63 6b 74 79 70 65 3b 0a 09 63  ar blocktype;..c
12690 61 63 6b 65 79 5f 72 65 74 20 73 65 6e 64 5f 72  ackey_ret send_r
126a0 65 74 3b 0a 09 75 69 6e 74 31 36 5f 74 20 72 65  et;..uint16_t re
126b0 73 70 63 6f 64 65 3b 0a 09 73 73 69 7a 65 5f 74  spcode;..ssize_t
126c0 20 72 65 74 76 61 6c 20 3d 20 30 2c 20 75 6e 70   retval = 0, unp
126d0 61 64 6f 66 66 73 65 74 3b 0a 09 73 69 7a 65 5f  adoffset;..size_
126e0 74 20 74 6d 70 62 75 66 6c 65 6e 2c 20 70 61 64  t tmpbuflen, pad
126f0 6c 65 6e 2c 20 74 6d 70 6f 75 74 62 75 66 6c 65  len, tmpoutbufle
12700 6e 2c 20 6f 75 74 62 75 66 5f 6c 65 6e 3b 0a 09  n, outbuf_len;..
12710 69 6e 74 20 66 72 65 65 5f 74 6d 70 62 75 66 20  int free_tmpbuf 
12720 3d 20 30 3b 0a 09 69 6e 74 20 6c 65 3b 0a 0a 09  = 0;..int le;...
12730 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
12740 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
12750 0a 09 69 66 20 28 73 6c 6f 74 20 3d 3d 20 4e 55  ..if (slot == NU
12760 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
12770 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
12780 6f 72 2e 20 20 73 6c 6f 74 20 69 73 20 4e 55 4c  or.  slot is NUL
12790 4c 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d  L");....return(-
127a0 31 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 62 75 66  1);..}...if (buf
127b0 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
127c0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
127d0 46 28 22 45 72 72 6f 72 2e 20 20 62 75 66 20 69  F("Error.  buf i
127e0 73 20 4e 55 4c 4c 22 29 3b 0a 0a 09 09 72 65 74  s NULL");....ret
127f0 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 69 66  urn(-1);..}...if
12800 20 28 6f 75 74 62 75 66 20 3d 3d 20 4e 55 4c 4c   (outbuf == NULL
12810 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
12820 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
12830 2e 20 20 6f 75 74 62 75 66 20 69 73 20 4e 55 4c  .  outbuf is NUL
12840 4c 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d  L");....return(-
12850 31 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 69 64 65  1);..}...if (ide
12860 6e 74 69 74 79 20 3d 3d 20 4e 55 4c 4c 29 20 7b  ntity == NULL) {
12870 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
12880 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
12890 69 64 65 6e 74 69 74 79 20 69 73 20 4e 55 4c 4c  identity is NULL
128a0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31  ");....return(-1
128b0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 69 64 65 6e  );..}...if (iden
128c0 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74  tity->pcsc_ident
128d0 69 74 79 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ity == NULL) {..
128e0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
128f0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 69 64  INTF("Error.  id
12900 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65  entity->pcsc_ide
12910 6e 74 69 74 79 20 69 73 20 4e 55 4c 4c 22 29 3b  ntity is NULL");
12920 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a  ....return(-1);.
12930 09 7d 0a 0a 09 69 64 5f 74 79 70 65 20 3d 20 69  .}...id_type = i
12940 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64  dentity->pcsc_id
12950 65 6e 74 69 74 79 2d 3e 69 64 5f 74 79 70 65 3b  entity->id_type;
12960 0a 09 69 66 20 28 69 64 5f 74 79 70 65 20 3d 3d  ..if (id_type ==
12970 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f   CACKEY_ID_TYPE_
12980 43 45 52 54 5f 4f 4e 4c 59 29 20 7b 0a 09 09 43  CERT_ONLY) {...C
12990 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
129a0 54 46 28 22 45 72 72 6f 72 2e 20 20 69 64 65 6e  TF("Error.  iden
129b0 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74  tity->pcsc_ident
129c0 69 74 79 20 69 73 20 43 41 43 4b 45 59 5f 49 44  ity is CACKEY_ID
129d0 5f 54 59 50 45 5f 43 45 52 54 5f 4f 4e 4c 59 2c  _TYPE_CERT_ONLY,
129e0 20 77 68 69 63 68 20 63 61 6e 6e 6f 74 20 62 65   which cannot be
129f0 20 75 73 65 64 20 66 6f 72 20 73 69 67 6e 2f 64   used for sign/d
12a00 65 63 72 79 70 74 22 29 3b 0a 0a 09 09 72 65 74  ecrypt");....ret
12a10 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 73 77  urn(-1);..}...sw
12a20 69 74 63 68 20 28 69 64 5f 74 79 70 65 29 20 7b  itch (id_type) {
12a30 0a 09 09 63 61 73 65 20 43 41 43 4b 45 59 5f 49  ...case CACKEY_I
12a40 44 5f 54 59 50 45 5f 50 49 56 3a 0a 09 09 63 61  D_TYPE_PIV:...ca
12a50 73 65 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50  se CACKEY_ID_TYP
12a60 45 5f 43 41 43 3a 0a 09 09 09 62 72 65 61 6b 3b  E_CAC:....break;
12a70 0a 09 09 64 65 66 61 75 6c 74 3a 0a 09 09 09 43  ...default:....C
12a80 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
12a90 54 46 28 22 45 72 72 6f 72 2e 20 20 69 64 65 6e  TF("Error.  iden
12aa0 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74  tity->pcsc_ident
12ab0 69 74 79 20 69 73 20 6e 6f 74 20 61 20 73 75 70  ity is not a sup
12ac0 70 6f 72 74 65 64 20 76 61 6c 75 65 2e 20 54 79  ported value. Ty
12ad0 70 65 20 69 73 3a 20 30 78 25 6c 78 20 28 50 49  pe is: 0x%lx (PI
12ae0 56 20 3d 20 30 78 25 6c 78 2c 20 43 41 43 20 3d  V = 0x%lx, CAC =
12af0 20 30 78 25 6c 78 29 22 2c 20 28 75 6e 73 69 67   0x%lx)", (unsig
12b00 6e 65 64 20 6c 6f 6e 67 29 20 69 64 5f 74 79 70  ned long) id_typ
12b10 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  e, (unsigned lon
12b20 67 29 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50  g) CACKEY_ID_TYP
12b30 45 5f 50 49 56 2c 20 28 75 6e 73 69 67 6e 65 64  E_PIV, (unsigned
12b40 20 6c 6f 6e 67 29 20 43 41 43 4b 45 59 5f 49 44   long) CACKEY_ID
12b50 5f 54 59 50 45 5f 43 41 43 29 3b 0a 0a 09 09 09  _TYPE_CAC);.....
12b60 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a  return(-1);..}..
12b70 09 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 69 64  ./* Determine id
12b80 65 6e 74 69 74 79 20 4b 65 79 20 73 69 7a 65 20  entity Key size 
12b90 2a 2f 0a 09 69 66 20 28 69 64 65 6e 74 69 74 79  */..if (identity
12ba0 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d  ->pcsc_identity-
12bb0 3e 6b 65 79 73 69 7a 65 20 3c 20 30 29 20 7b 0a  >keysize < 0) {.
12bc0 09 09 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63  ..identity->pcsc
12bd0 5f 69 64 65 6e 74 69 74 79 2d 3e 6b 65 79 73 69  _identity->keysi
12be0 7a 65 20 3d 20 78 35 30 39 5f 74 6f 5f 6b 65 79  ze = x509_to_key
12bf0 73 69 7a 65 28 69 64 65 6e 74 69 74 79 2d 3e 70  size(identity->p
12c00 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 63 65  csc_identity->ce
12c10 72 74 69 66 69 63 61 74 65 2c 20 69 64 65 6e 74  rtificate, ident
12c20 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69  ity->pcsc_identi
12c30 74 79 2d 3e 63 65 72 74 69 66 69 63 61 74 65 5f  ty->certificate_
12c40 6c 65 6e 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 50 61  len);..}.../* Pa
12c50 64 20 6d 65 73 73 61 67 65 20 74 6f 20 6b 65 79  d message to key
12c60 20 73 69 7a 65 20 2a 2f 0a 09 69 66 20 28 70 61   size */..if (pa
12c70 64 49 6e 70 75 74 29 20 7b 0a 09 09 69 66 20 28  dInput) {...if (
12c80 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69  identity->pcsc_i
12c90 64 65 6e 74 69 74 79 2d 3e 6b 65 79 73 69 7a 65  dentity->keysize
12ca0 20 3e 20 30 29 20 7b 0a 09 09 09 69 66 20 28 62   > 0) {....if (b
12cb0 75 66 6c 65 6e 20 21 3d 20 69 64 65 6e 74 69 74  uflen != identit
12cc0 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79  y->pcsc_identity
12cd0 2d 3e 6b 65 79 73 69 7a 65 29 20 7b 0a 09 09 09  ->keysize) {....
12ce0 09 69 66 20 28 62 75 66 6c 65 6e 20 3e 20 28 69  .if (buflen > (i
12cf0 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64  dentity->pcsc_id
12d00 65 6e 74 69 74 79 2d 3e 6b 65 79 73 69 7a 65 20  entity->keysize 
12d10 2d 20 33 29 29 20 7b 0a 09 09 09 09 09 43 41 43  - 3)) {......CAC
12d20 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
12d30 28 22 45 72 72 6f 72 2e 20 20 4d 65 73 73 61 67  ("Error.  Messag
12d40 65 20 69 73 20 74 6f 6f 20 6c 61 72 67 65 20 74  e is too large t
12d50 6f 20 73 69 67 6e 2f 64 65 63 72 79 70 74 22 29  o sign/decrypt")
12d60 3b 0a 0a 09 09 09 09 09 72 65 74 75 72 6e 28 2d  ;.......return(-
12d70 31 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 74  1);.....}......t
12d80 6d 70 62 75 66 6c 65 6e 20 3d 20 69 64 65 6e 74  mpbuflen = ident
12d90 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69  ity->pcsc_identi
12da0 74 79 2d 3e 6b 65 79 73 69 7a 65 3b 0a 09 09 09  ty->keysize;....
12db0 09 74 6d 70 62 75 66 20 3d 20 6d 61 6c 6c 6f 63  .tmpbuf = malloc
12dc0 28 74 6d 70 62 75 66 6c 65 6e 29 3b 0a 09 09 09  (tmpbuflen);....
12dd0 09 66 72 65 65 5f 74 6d 70 62 75 66 20 3d 20 31  .free_tmpbuf = 1
12de0 3b 0a 0a 09 09 09 09 70 61 64 6c 65 6e 20 3d 20  ;......padlen = 
12df0 74 6d 70 62 75 66 6c 65 6e 20 2d 20 62 75 66 6c  tmpbuflen - bufl
12e00 65 6e 20 2d 20 33 3b 0a 0a 09 09 09 09 43 41 43  en - 3;......CAC
12e10 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
12e20 28 22 4e 65 65 64 20 74 6f 20 70 61 64 20 74 68  ("Need to pad th
12e30 65 20 62 75 66 66 65 72 20 77 69 74 68 20 25 6c  e buffer with %l
12e40 6c 75 20 62 79 74 65 73 20 28 74 6d 70 62 75 66  lu bytes (tmpbuf
12e50 6c 65 6e 20 3d 20 25 6c 6c 75 2c 20 62 75 66 6c  len = %llu, bufl
12e60 65 6e 20 3d 20 25 6c 6c 75 29 22 2c 20 28 75 6e  en = %llu)", (un
12e70 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67  signed long long
12e80 29 20 70 61 64 6c 65 6e 2c 20 28 75 6e 73 69 67  ) padlen, (unsig
12e90 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20 74  ned long long) t
12ea0 6d 70 62 75 66 6c 65 6e 2c 20 28 75 6e 73 69 67  mpbuflen, (unsig
12eb0 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20 62  ned long long) b
12ec0 75 66 6c 65 6e 29 3b 0a 0a 09 09 09 09 2f 2a 20  uflen);....../* 
12ed0 52 53 41 20 50 4b 43 53 23 31 20 45 4d 53 41 2d  RSA PKCS#1 EMSA-
12ee0 50 4b 43 53 31 2d 76 31 5f 35 20 50 61 64 64 69  PKCS1-v1_5 Paddi
12ef0 6e 67 20 2a 2f 0a 09 09 09 09 74 6d 70 62 75 66  ng */.....tmpbuf
12f00 5b 30 5d 20 3d 20 30 78 30 30 3b 0a 09 09 09 09  [0] = 0x00;.....
12f10 74 6d 70 62 75 66 5b 31 5d 20 3d 20 30 78 30 31  tmpbuf[1] = 0x01
12f20 3b 0a 09 09 09 09 6d 65 6d 73 65 74 28 26 74 6d  ;.....memset(&tm
12f30 70 62 75 66 5b 32 5d 2c 20 30 78 46 46 2c 20 70  pbuf[2], 0xFF, p
12f40 61 64 6c 65 6e 29 3b 0a 09 09 09 09 74 6d 70 62  adlen);.....tmpb
12f50 75 66 5b 70 61 64 6c 65 6e 20 2b 20 32 5d 3d 20  uf[padlen + 2]= 
12f60 30 78 30 30 3b 0a 09 09 09 09 6d 65 6d 63 70 79  0x00;.....memcpy
12f70 28 26 74 6d 70 62 75 66 5b 70 61 64 6c 65 6e 20  (&tmpbuf[padlen 
12f80 2b 20 33 5d 2c 20 62 75 66 2c 20 62 75 66 6c 65  + 3], buf, bufle
12f90 6e 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f  n);......CACKEY_
12fa0 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22  DEBUG_PRINTBUF("
12fb0 55 6e 70 61 64 64 65 64 3a 22 2c 20 62 75 66 2c  Unpadded:", buf,
12fc0 20 62 75 66 6c 65 6e 29 3b 0a 09 09 09 09 43 41   buflen);.....CA
12fd0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
12fe0 42 55 46 28 22 50 61 64 64 65 64 3a 22 2c 20 74  BUF("Padded:", t
12ff0 6d 70 62 75 66 2c 20 74 6d 70 62 75 66 6c 65 6e  mpbuf, tmpbuflen
13000 29 3b 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09  );....} else {..
13010 09 09 09 74 6d 70 62 75 66 20 3d 20 62 75 66 3b  ...tmpbuf = buf;
13020 0a 09 09 09 09 74 6d 70 62 75 66 6c 65 6e 20 3d  .....tmpbuflen =
13030 20 62 75 66 6c 65 6e 3b 0a 09 09 09 09 66 72 65   buflen;.....fre
13040 65 5f 74 6d 70 62 75 66 20 3d 20 30 3b 0a 09 09  e_tmpbuf = 0;...
13050 09 09 70 61 64 6c 65 6e 20 3d 20 30 3b 0a 09 09  ..padlen = 0;...
13060 09 7d 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  .}...} else {...
13070 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
13080 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20  INTF("Unable to 
13090 64 65 74 65 72 6d 69 6e 65 20 6b 65 79 20 73 69  determine key si
130a0 7a 65 2c 20 68 6f 70 69 6e 67 20 74 68 65 20 6d  ze, hoping the m
130b0 65 73 73 61 67 65 20 69 73 20 70 72 6f 70 65 72  essage is proper
130c0 6c 79 20 70 61 64 64 65 64 21 22 29 3b 0a 0a 09  ly padded!");...
130d0 09 09 74 6d 70 62 75 66 20 3d 20 62 75 66 3b 0a  ..tmpbuf = buf;.
130e0 09 09 09 74 6d 70 62 75 66 6c 65 6e 20 3d 20 62  ...tmpbuflen = b
130f0 75 66 6c 65 6e 3b 0a 09 09 09 66 72 65 65 5f 74  uflen;....free_t
13100 6d 70 62 75 66 20 3d 20 30 3b 0a 09 09 09 70 61  mpbuf = 0;....pa
13110 64 6c 65 6e 20 3d 20 30 3b 0a 09 09 7d 0a 09 7d  dlen = 0;...}..}
13120 20 65 6c 73 65 20 7b 0a 09 09 74 6d 70 62 75 66   else {...tmpbuf
13130 20 3d 20 62 75 66 3b 0a 09 09 74 6d 70 62 75 66   = buf;...tmpbuf
13140 6c 65 6e 20 3d 20 62 75 66 6c 65 6e 3b 0a 09 09  len = buflen;...
13150 66 72 65 65 5f 74 6d 70 62 75 66 20 3d 20 30 3b  free_tmpbuf = 0;
13160 0a 09 09 70 61 64 6c 65 6e 20 3d 20 30 3b 0a 09  ...padlen = 0;..
13170 7d 0a 0a 09 2f 2a 20 42 65 67 69 6e 20 74 72 61  }.../* Begin tra
13180 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 63 61 63  nsaction */..cac
13190 6b 65 79 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61  key_begin_transa
131a0 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 2f  ction(slot);.../
131b0 2a 20 53 65 6c 65 63 74 20 63 6f 72 72 65 63 74  * Select correct
131c0 20 61 70 70 6c 65 74 20 2a 2f 0a 09 73 77 69 74   applet */..swit
131d0 63 68 20 28 69 64 5f 74 79 70 65 29 20 7b 0a 09  ch (id_type) {..
131e0 09 63 61 73 65 20 43 41 43 4b 45 59 5f 49 44 5f  .case CACKEY_ID_
131f0 54 59 50 45 5f 43 41 43 3a 0a 09 09 09 43 41 43  TYPE_CAC:....CAC
13200 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
13210 28 22 53 65 6c 65 63 74 69 6e 67 20 61 70 70 6c  ("Selecting appl
13220 65 74 20 66 6f 75 6e 64 20 61 74 20 25 70 20 2e  et found at %p .
13230 2e 2e 22 2c 20 69 64 65 6e 74 69 74 79 2d 3e 70  ..", identity->p
13240 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 63 61  csc_identity->ca
13250 72 64 2e 63 61 63 2e 61 70 70 6c 65 74 29 3b 0a  rd.cac.applet);.
13260 09 09 09 63 61 63 6b 65 79 5f 73 65 6c 65 63 74  ...cackey_select
13270 5f 61 70 70 6c 65 74 28 73 6c 6f 74 2c 20 69 64  _applet(slot, id
13280 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65  entity->pcsc_ide
13290 6e 74 69 74 79 2d 3e 63 61 72 64 2e 63 61 63 2e  ntity->card.cac.
132a0 61 70 70 6c 65 74 2c 20 73 69 7a 65 6f 66 28 69  applet, sizeof(i
132b0 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64  dentity->pcsc_id
132c0 65 6e 74 69 74 79 2d 3e 63 61 72 64 2e 63 61 63  entity->card.cac
132d0 2e 61 70 70 6c 65 74 29 29 3b 0a 0a 09 09 09 2f  .applet));...../
132e0 2a 20 53 65 6c 65 63 74 20 63 6f 72 72 65 63 74  * Select correct
132f0 20 66 69 6c 65 20 2a 2f 0a 09 09 09 63 61 63 6b   file */....cack
13300 65 79 5f 73 65 6c 65 63 74 5f 66 69 6c 65 28 73  ey_select_file(s
13310 6c 6f 74 2c 20 69 64 65 6e 74 69 74 79 2d 3e 70  lot, identity->p
13320 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 63 61  csc_identity->ca
13330 72 64 2e 63 61 63 2e 66 69 6c 65 29 3b 0a 09 09  rd.cac.file);...
13340 09 62 72 65 61 6b 3b 0a 09 09 63 61 73 65 20 43  .break;...case C
13350 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 50 49  ACKEY_ID_TYPE_PI
13360 56 3a 0a 09 09 09 64 79 6e 5f 61 75 74 68 5f 74  V:....dyn_auth_t
13370 65 6d 70 6c 61 74 65 5b 30 5d 20 3d 20 30 78 37  emplate[0] = 0x7
13380 43 3b 0a 09 09 09 64 79 6e 5f 61 75 74 68 5f 74  C;....dyn_auth_t
13390 65 6d 70 6c 61 74 65 5b 31 5d 20 3d 20 30 78 38  emplate[1] = 0x8
133a0 32 3b 0a 09 09 09 64 79 6e 5f 61 75 74 68 5f 74  2;....dyn_auth_t
133b0 65 6d 70 6c 61 74 65 5b 32 5d 20 3d 20 28 28 74  emplate[2] = ((t
133c0 6d 70 62 75 66 6c 65 6e 20 2b 20 36 29 20 26 20  mpbuflen + 6) & 
133d0 30 78 66 66 30 30 29 20 3e 3e 20 38 3b 0a 09 09  0xff00) >> 8;...
133e0 09 64 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61  .dyn_auth_templa
133f0 74 65 5b 33 5d 20 3d 20 28 74 6d 70 62 75 66 6c  te[3] = (tmpbufl
13400 65 6e 20 2b 20 36 29 20 26 20 30 78 30 30 66 66  en + 6) & 0x00ff
13410 3b 0a 09 09 09 64 79 6e 5f 61 75 74 68 5f 74 65  ;....dyn_auth_te
13420 6d 70 6c 61 74 65 5b 34 5d 20 3d 20 30 78 38 32  mplate[4] = 0x82
13430 3b 0a 09 09 09 64 79 6e 5f 61 75 74 68 5f 74 65  ;....dyn_auth_te
13440 6d 70 6c 61 74 65 5b 35 5d 20 3d 20 30 78 30 30  mplate[5] = 0x00
13450 3b 0a 09 09 09 64 79 6e 5f 61 75 74 68 5f 74 65  ;....dyn_auth_te
13460 6d 70 6c 61 74 65 5b 36 5d 20 3d 20 30 78 38 31  mplate[6] = 0x81
13470 3b 0a 09 09 09 64 79 6e 5f 61 75 74 68 5f 74 65  ;....dyn_auth_te
13480 6d 70 6c 61 74 65 5b 37 5d 20 3d 20 30 78 38 32  mplate[7] = 0x82
13490 3b 0a 09 09 09 64 79 6e 5f 61 75 74 68 5f 74 65  ;....dyn_auth_te
134a0 6d 70 6c 61 74 65 5b 38 5d 20 3d 20 28 74 6d 70  mplate[8] = (tmp
134b0 62 75 66 6c 65 6e 20 26 20 30 78 66 66 30 30 29  buflen & 0xff00)
134c0 20 3e 3e 20 38 3b 0a 09 09 09 64 79 6e 5f 61 75   >> 8;....dyn_au
134d0 74 68 5f 74 65 6d 70 6c 61 74 65 5b 39 5d 20 3d  th_template[9] =
134e0 20 74 6d 70 62 75 66 6c 65 6e 20 26 20 30 78 30   tmpbuflen & 0x0
134f0 30 66 66 3b 0a 0a 09 09 09 64 79 6e 5f 61 75 74  0ff;.....dyn_aut
13500 68 5f 74 6d 70 62 75 66 20 3d 20 6d 61 6c 6c 6f  h_tmpbuf = mallo
13510 63 28 74 6d 70 62 75 66 6c 65 6e 20 2b 20 73 69  c(tmpbuflen + si
13520 7a 65 6f 66 28 64 79 6e 5f 61 75 74 68 5f 74 65  zeof(dyn_auth_te
13530 6d 70 6c 61 74 65 29 29 3b 0a 09 09 09 6d 65 6d  mplate));....mem
13540 63 70 79 28 64 79 6e 5f 61 75 74 68 5f 74 6d 70  cpy(dyn_auth_tmp
13550 62 75 66 2c 20 64 79 6e 5f 61 75 74 68 5f 74 65  buf, dyn_auth_te
13560 6d 70 6c 61 74 65 2c 20 73 69 7a 65 6f 66 28 64  mplate, sizeof(d
13570 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74 65  yn_auth_template
13580 29 29 3b 0a 09 09 09 6d 65 6d 63 70 79 28 64 79  ));....memcpy(dy
13590 6e 5f 61 75 74 68 5f 74 6d 70 62 75 66 20 2b 20  n_auth_tmpbuf + 
135a0 73 69 7a 65 6f 66 28 64 79 6e 5f 61 75 74 68 5f  sizeof(dyn_auth_
135b0 74 65 6d 70 6c 61 74 65 29 2c 20 74 6d 70 62 75  template), tmpbu
135c0 66 2c 20 74 6d 70 62 75 66 6c 65 6e 29 3b 0a 0a  f, tmpbuflen);..
135d0 09 09 09 69 66 20 28 66 72 65 65 5f 74 6d 70 62  ...if (free_tmpb
135e0 75 66 29 20 7b 0a 09 09 09 09 66 72 65 65 28 74  uf) {.....free(t
135f0 6d 70 62 75 66 29 3b 0a 09 09 09 7d 0a 0a 09 09  mpbuf);....}....
13600 09 74 6d 70 62 75 66 6c 65 6e 20 2b 3d 20 73 69  .tmpbuflen += si
13610 7a 65 6f 66 28 64 79 6e 5f 61 75 74 68 5f 74 65  zeof(dyn_auth_te
13620 6d 70 6c 61 74 65 29 3b 0a 09 09 09 74 6d 70 62  mplate);....tmpb
13630 75 66 20 3d 20 64 79 6e 5f 61 75 74 68 5f 74 6d  uf = dyn_auth_tm
13640 70 62 75 66 3b 0a 09 09 09 66 72 65 65 5f 74 6d  pbuf;....free_tm
13650 70 62 75 66 20 3d 20 31 3b 0a 0a 09 09 09 62 72  pbuf = 1;.....br
13660 65 61 6b 3b 0a 09 09 63 61 73 65 20 43 41 43 4b  eak;...case CACK
13670 45 59 5f 49 44 5f 54 59 50 45 5f 43 45 52 54 5f  EY_ID_TYPE_CERT_
13680 4f 4e 4c 59 3a 0a 09 09 09 62 72 65 61 6b 3b 0a  ONLY:....break;.
13690 09 7d 0a 0a 09 74 6d 70 62 75 66 5f 73 20 3d 20  .}...tmpbuf_s = 
136a0 74 6d 70 62 75 66 3b 0a 09 6f 75 74 62 75 66 5f  tmpbuf;..outbuf_
136b0 73 20 3d 20 6f 75 74 62 75 66 3b 0a 09 77 68 69  s = outbuf;..whi
136c0 6c 65 20 28 74 6d 70 62 75 66 6c 65 6e 29 20 7b  le (tmpbuflen) {
136d0 0a 09 09 74 6d 70 6f 75 74 62 75 66 6c 65 6e 20  ...tmpoutbuflen 
136e0 3d 20 6f 75 74 62 75 66 6c 65 6e 3b 0a 0a 09 09  = outbuflen;....
136f0 69 66 20 28 74 6d 70 62 75 66 6c 65 6e 20 3e 20  if (tmpbuflen > 
13700 43 41 43 4b 45 59 5f 41 50 44 55 5f 4d 54 55 29  CACKEY_APDU_MTU)
13710 20 7b 0a 09 09 09 62 79 74 65 73 5f 74 6f 5f 73   {....bytes_to_s
13720 65 6e 64 20 3d 20 43 41 43 4b 45 59 5f 41 50 44  end = CACKEY_APD
13730 55 5f 4d 54 55 3b 0a 09 09 7d 20 65 6c 73 65 20  U_MTU;...} else 
13740 7b 0a 09 09 09 62 79 74 65 73 5f 74 6f 5f 73 65  {....bytes_to_se
13750 6e 64 20 3d 20 74 6d 70 62 75 66 6c 65 6e 3b 0a  nd = tmpbuflen;.
13760 09 09 7d 0a 0a 09 09 73 65 6e 64 5f 72 65 74 20  ..}....send_ret 
13770 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  = CACKEY_PCSC_E_
13780 47 45 4e 45 52 49 43 3b 0a 09 09 73 77 69 74 63  GENERIC;...switc
13790 68 20 28 69 64 5f 74 79 70 65 29 20 7b 0a 09 09  h (id_type) {...
137a0 09 63 61 73 65 20 43 41 43 4b 45 59 5f 49 44 5f  .case CACKEY_ID_
137b0 54 59 50 45 5f 43 41 43 3a 0a 09 09 09 09 69 66  TYPE_CAC:.....if
137c0 20 28 74 6d 70 62 75 66 6c 65 6e 20 3e 20 43 41   (tmpbuflen > CA
137d0 43 4b 45 59 5f 41 50 44 55 5f 4d 54 55 29 20 7b  CKEY_APDU_MTU) {
137e0 0a 09 09 09 09 09 70 31 20 3d 20 30 78 38 30 3b  ......p1 = 0x80;
137f0 0a 09 09 09 09 09 6c 65 20 3d 20 30 78 30 30 3b  ......le = 0x00;
13800 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  .....} else {...
13810 09 09 09 70 31 20 3d 20 30 78 30 30 3b 0a 09 09  ...p1 = 0x00;...
13820 09 09 09 6c 65 20 3d 20 30 78 30 30 3b 0a 09 09  ...le = 0x00;...
13830 09 09 7d 0a 0a 09 09 09 09 73 65 6e 64 5f 72 65  ..}......send_re
13840 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f  t = cackey_send_
13850 61 70 64 75 28 73 6c 6f 74 2c 20 47 53 43 49 53  apdu(slot, GSCIS
13860 5f 43 4c 41 53 53 5f 47 4c 4f 42 41 4c 5f 50 4c  _CLASS_GLOBAL_PL
13870 41 54 46 4f 52 4d 2c 20 47 53 43 49 53 5f 49 4e  ATFORM, GSCIS_IN
13880 53 54 52 5f 53 49 47 4e 44 45 43 52 59 50 54 2c  STR_SIGNDECRYPT,
13890 20 70 31 2c 20 30 78 30 30 2c 20 62 79 74 65 73   p1, 0x00, bytes
138a0 5f 74 6f 5f 73 65 6e 64 2c 20 74 6d 70 62 75 66  _to_send, tmpbuf
138b0 2c 20 6c 65 2c 20 26 72 65 73 70 63 6f 64 65 2c  , le, &respcode,
138c0 20 6f 75 74 62 75 66 2c 20 26 74 6d 70 6f 75 74   outbuf, &tmpout
138d0 62 75 66 6c 65 6e 29 3b 0a 09 09 09 09 62 72 65  buflen);.....bre
138e0 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 41 43 4b  ak;....case CACK
138f0 45 59 5f 49 44 5f 54 59 50 45 5f 50 49 56 3a 0a  EY_ID_TYPE_PIV:.
13900 09 09 09 09 69 66 20 28 74 6d 70 62 75 66 6c 65  ....if (tmpbufle
13910 6e 20 3e 20 43 41 43 4b 45 59 5f 41 50 44 55 5f  n > CACKEY_APDU_
13920 4d 54 55 29 20 7b 0a 09 09 09 09 09 63 6c 61 73  MTU) {......clas
13930 73 20 3d 20 30 78 31 30 3b 0a 09 09 09 09 09 6c  s = 0x10;......l
13940 65 20 3d 20 30 78 30 30 3b 0a 09 09 09 09 7d 20  e = 0x00;.....} 
13950 65 6c 73 65 20 7b 0a 09 09 09 09 09 63 6c 61 73  else {......clas
13960 73 20 3d 20 47 53 43 49 53 5f 43 4c 41 53 53 5f  s = GSCIS_CLASS_
13970 49 53 4f 37 38 31 36 3b 0a 09 09 09 09 09 6c 65  ISO7816;......le
13980 20 3d 20 32 35 36 3b 0a 09 09 09 09 7d 0a 0a 09   = 256;.....}...
13990 09 09 09 73 65 6e 64 5f 72 65 74 20 3d 20 63 61  ...send_ret = ca
139a0 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 73  ckey_send_apdu(s
139b0 6c 6f 74 2c 20 63 6c 61 73 73 2c 20 4e 49 53 54  lot, class, NIST
139c0 53 50 38 30 30 5f 37 33 5f 33 5f 49 4e 53 54 52  SP800_73_3_INSTR
139d0 5f 47 45 4e 41 55 54 48 2c 20 4e 49 53 54 53 50  _GENAUTH, NISTSP
139e0 38 30 30 5f 37 38 5f 33 5f 41 4c 47 4f 5f 52 53  800_78_3_ALGO_RS
139f0 41 32 30 34 38 2c 20 69 64 65 6e 74 69 74 79 2d  A2048, identity-
13a00 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e  >pcsc_identity->
13a10 63 61 72 64 2e 70 69 76 2e 6b 65 79 5f 69 64 2c  card.piv.key_id,
13a20 20 62 79 74 65 73 5f 74 6f 5f 73 65 6e 64 2c 20   bytes_to_send, 
13a30 74 6d 70 62 75 66 2c 20 6c 65 2c 20 26 72 65 73  tmpbuf, le, &res
13a40 70 63 6f 64 65 2c 20 6f 75 74 62 75 66 2c 20 26  pcode, outbuf, &
13a50 74 6d 70 6f 75 74 62 75 66 6c 65 6e 29 3b 0a 09  tmpoutbuflen);..
13a60 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
13a70 65 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45  e CACKEY_ID_TYPE
13a80 5f 43 45 52 54 5f 4f 4e 4c 59 3a 0a 09 09 09 09  _CERT_ONLY:.....
13a90 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09 69 66  break;...}....if
13aa0 20 28 73 65 6e 64 5f 72 65 74 20 21 3d 20 43 41   (send_ret != CA
13ab0 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20  CKEY_PCSC_S_OK) 
13ac0 7b 0a 09 09 09 69 66 20 28 66 72 65 65 5f 74 6d  {....if (free_tm
13ad0 70 62 75 66 29 20 7b 0a 09 09 09 09 69 66 20 28  pbuf) {.....if (
13ae0 74 6d 70 62 75 66 5f 73 29 20 7b 0a 09 09 09 09  tmpbuf_s) {.....
13af0 09 66 72 65 65 28 74 6d 70 62 75 66 5f 73 29 3b  .free(tmpbuf_s);
13b00 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 09  .....}....}.....
13b10 2f 2a 20 45 6e 64 20 74 72 61 6e 73 61 63 74 69  /* End transacti
13b20 6f 6e 20 2a 2f 0a 09 09 09 63 61 63 6b 65 79 5f  on */....cackey_
13b30 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
13b40 73 6c 6f 74 29 3b 0a 0a 09 09 09 69 66 20 28 73  slot);.....if (s
13b50 65 6e 64 5f 72 65 74 20 3d 3d 20 43 41 43 4b 45  end_ret == CACKE
13b60 59 5f 50 43 53 43 5f 45 5f 52 45 54 52 59 29 20  Y_PCSC_E_RETRY) 
13b70 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  {.....CACKEY_DEB
13b80 55 47 5f 50 52 49 4e 54 46 28 22 41 44 50 55 20  UG_PRINTF("ADPU 
13b90 53 65 6e 64 69 6e 67 20 46 61 69 6c 65 64 20 2d  Sending Failed -
13ba0 2d 20 72 65 74 72 79 69 6e 67 2e 22 29 3b 0a 0a  - retrying.");..
13bb0 09 09 09 09 72 65 74 75 72 6e 28 63 61 63 6b 65  ....return(cacke
13bc0 79 5f 73 69 67 6e 64 65 63 72 79 70 74 28 73 6c  y_signdecrypt(sl
13bd0 6f 74 2c 20 69 64 65 6e 74 69 74 79 2c 20 62 75  ot, identity, bu
13be0 66 2c 20 62 75 66 6c 65 6e 2c 20 6f 75 74 62 75  f, buflen, outbu
13bf0 66 2c 20 6f 75 74 62 75 66 6c 65 6e 2c 20 70 61  f, outbuflen, pa
13c00 64 49 6e 70 75 74 2c 20 75 6e 70 61 64 4f 75 74  dInput, unpadOut
13c10 70 75 74 29 29 3b 0a 09 09 09 7d 0a 0a 09 09 09  put));....}.....
13c20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
13c30 4e 54 46 28 22 41 44 50 55 20 53 65 6e 64 69 6e  NTF("ADPU Sendin
13c40 67 20 46 61 69 6c 65 64 20 2d 2d 20 72 65 74 75  g Failed -- retu
13c50 72 6e 69 6e 67 20 69 6e 20 65 72 72 6f 72 2e 22  rning in error."
13c60 29 3b 0a 0a 09 09 09 69 66 20 28 72 65 73 70 63  );.....if (respc
13c70 6f 64 65 20 3d 3d 20 30 78 36 39 38 32 20 7c 7c  ode == 0x6982 ||
13c80 20 72 65 73 70 63 6f 64 65 20 3d 3d 20 30 78 36   respcode == 0x6
13c90 65 30 30 29 20 7b 0a 09 09 09 09 69 66 20 28 72  e00) {.....if (r
13ca0 65 73 70 63 6f 64 65 20 3d 3d 20 30 78 36 45 30  espcode == 0x6E0
13cb0 30 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59  0) {......CACKEY
13cc0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 47  _DEBUG_PRINTF("G
13cd0 6f 74 20 5c 22 57 52 4f 4e 47 20 43 4c 41 53 53  ot \"WRONG CLASS
13ce0 5c 22 2c 20 74 68 69 73 20 6d 65 61 6e 73 20 77  \", this means w
13cf0 65 20 61 72 65 20 74 61 6c 6b 69 6e 67 20 74 6f  e are talking to
13d00 20 74 68 65 20 77 72 6f 6e 67 20 6f 62 6a 65 63   the wrong objec
13d10 74 20 28 6c 69 6b 65 6c 79 20 62 65 63 61 75 73  t (likely becaus
13d20 65 20 74 68 65 20 63 61 72 64 20 77 65 6e 74 20  e the card went 
13d30 61 77 61 79 29 20 2d 2d 20 72 65 73 65 74 74 69  away) -- resetti
13d40 6e 67 22 29 3b 0a 09 09 09 09 7d 20 65 6c 73 65  ng");.....} else
13d50 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44   {......CACKEY_D
13d60 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 65 63  EBUG_PRINTF("Sec
13d70 75 72 69 74 79 20 73 74 61 74 75 73 20 6e 6f 74  urity status not
13d80 20 73 61 74 69 73 69 66 69 65 64 20 28 72 65 73   satisified (res
13d90 70 63 6f 64 65 20 3d 20 30 78 25 30 34 78 29 2e  pcode = 0x%04x).
13da0 20 20 52 65 74 75 72 6e 69 6e 67 20 4e 45 45 44    Returning NEED
13db0 4c 4f 47 49 4e 22 2c 20 28 69 6e 74 29 20 72 65  LOGIN", (int) re
13dc0 73 70 63 6f 64 65 29 3b 0a 09 09 09 09 7d 0a 0a  spcode);.....}..
13dd0 09 09 09 09 63 61 63 6b 65 79 5f 6d 61 72 6b 5f  ....cackey_mark_
13de0 73 6c 6f 74 5f 72 65 73 65 74 28 73 6c 6f 74 29  slot_reset(slot)
13df0 3b 0a 0a 09 09 09 09 73 6c 6f 74 2d 3e 74 6f 6b  ;......slot->tok
13e00 65 6e 5f 66 6c 61 67 73 20 3d 20 43 4b 46 5f 4c  en_flags = CKF_L
13e10 4f 47 49 4e 5f 52 45 51 55 49 52 45 44 3b 0a 0a  OGIN_REQUIRED;..
13e20 09 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ....return(CACKE
13e30 59 5f 50 43 53 43 5f 45 5f 4e 45 45 44 4c 4f 47  Y_PCSC_E_NEEDLOG
13e40 49 4e 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66  IN);....}.....if
13e50 20 28 73 65 6e 64 5f 72 65 74 20 3d 3d 20 43 41   (send_ret == CA
13e60 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45  CKEY_PCSC_E_TOKE
13e70 4e 41 42 53 45 4e 54 29 20 7b 0a 09 09 09 09 43  NABSENT) {.....C
13e80 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
13e90 54 46 28 22 54 6f 6b 65 6e 20 61 62 73 65 6e 74  TF("Token absent
13ea0 2e 20 20 52 65 74 75 72 6e 69 6e 67 20 54 4f 4b  .  Returning TOK
13eb0 45 4e 41 42 53 45 4e 54 22 29 3b 0a 0a 09 09 09  ENABSENT");.....
13ec0 09 63 61 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f  .cackey_mark_slo
13ed0 74 5f 72 65 73 65 74 28 73 6c 6f 74 29 3b 0a 0a  t_reset(slot);..
13ee0 09 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ....return(CACKE
13ef0 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42  Y_PCSC_E_TOKENAB
13f00 53 45 4e 54 29 3b 0a 09 09 09 7d 0a 0a 09 09 09  SENT);....}.....
13f10 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
13f20 4e 54 46 28 22 53 6f 6d 65 74 68 69 6e 67 20 77  NTF("Something w
13f30 65 6e 74 20 77 72 6f 6e 67 20 64 75 72 69 6e 67  ent wrong during
13f40 20 73 69 67 6e 69 6e 67 2c 20 72 65 73 65 74 74   signing, resett
13f50 69 6e 67 20 74 68 65 20 73 6c 6f 74 20 61 6e 64  ing the slot and
13f60 20 68 6f 70 69 6e 67 20 66 6f 72 20 74 68 65 20   hoping for the 
13f70 62 65 73 74 2e 22 29 3b 0a 0a 09 09 09 63 61 63  best.");.....cac
13f80 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65  key_mark_slot_re
13f90 73 65 74 28 73 6c 6f 74 29 3b 0a 0a 09 09 09 72  set(slot);.....r
13fa0 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
13fb0 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 09  C_E_GENERIC);...
13fc0 7d 0a 0a 09 09 74 6d 70 62 75 66 20 2b 3d 20 62  }....tmpbuf += b
13fd0 79 74 65 73 5f 74 6f 5f 73 65 6e 64 3b 0a 09 09  ytes_to_send;...
13fe0 74 6d 70 62 75 66 6c 65 6e 20 2d 3d 20 62 79 74  tmpbuflen -= byt
13ff0 65 73 5f 74 6f 5f 73 65 6e 64 3b 0a 0a 09 09 6f  es_to_send;....o
14000 75 74 62 75 66 20 2b 3d 20 74 6d 70 6f 75 74 62  utbuf += tmpoutb
14010 75 66 6c 65 6e 3b 0a 09 09 6f 75 74 62 75 66 6c  uflen;...outbufl
14020 65 6e 20 2d 3d 20 74 6d 70 6f 75 74 62 75 66 6c  en -= tmpoutbufl
14030 65 6e 3b 0a 09 09 72 65 74 76 61 6c 20 2b 3d 20  en;...retval += 
14040 74 6d 70 6f 75 74 62 75 66 6c 65 6e 3b 0a 09 7d  tmpoutbuflen;..}
14050 0a 0a 09 69 66 20 28 66 72 65 65 5f 74 6d 70 62  ...if (free_tmpb
14060 75 66 29 20 7b 0a 09 09 69 66 20 28 74 6d 70 62  uf) {...if (tmpb
14070 75 66 5f 73 29 20 7b 0a 09 09 09 66 72 65 65 28  uf_s) {....free(
14080 74 6d 70 62 75 66 5f 73 29 3b 0a 09 09 7d 0a 09  tmpbuf_s);...}..
14090 7d 0a 0a 09 6f 75 74 62 75 66 20 3d 20 6f 75 74  }...outbuf = out
140a0 62 75 66 5f 73 3b 0a 0a 09 2f 2a 20 45 6e 64 20  buf_s;.../* End 
140b0 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09  transaction */..
140c0 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73  cackey_end_trans
140d0 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 23  action(slot);..#
140e0 69 66 64 65 66 20 43 41 43 4b 45 59 5f 50 41 52  ifdef CACKEY_PAR
140f0 41 4e 4f 49 44 0a 23 20 20 69 66 64 65 66 20 5f  ANOID.#  ifdef _
14100 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58 0a  POSIX_SSIZE_MAX.
14110 09 69 66 20 28 6f 75 74 62 75 66 6c 65 6e 20 3e  .if (outbuflen >
14120 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41   _POSIX_SSIZE_MA
14130 58 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  X) {...CACKEY_DE
14140 42 55 47 5f 50 52 49 4e 54 46 28 22 4f 75 74 62  BUG_PRINTF("Outb
14150 75 66 6c 65 6e 20 65 78 63 65 65 64 73 20 6d 61  uflen exceeds ma
14160 78 69 6d 75 6d 20 76 61 6c 75 65 2c 20 72 65 74  ximum value, ret
14170 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
14180 65 2e 20 28 6d 61 78 20 3d 20 25 6c 69 2c 20 6f  e. (max = %li, o
14190 75 74 62 75 66 6c 65 6e 20 3d 20 25 6c 75 29 22  utbuflen = %lu)"
141a0 2c 20 28 6c 6f 6e 67 29 20 5f 50 4f 53 49 58 5f  , (long) _POSIX_
141b0 53 53 49 5a 45 5f 4d 41 58 2c 20 28 75 6e 73 69  SSIZE_MAX, (unsi
141c0 67 6e 65 64 20 6c 6f 6e 67 29 20 6f 75 74 62 75  gned long) outbu
141d0 66 6c 65 6e 29 3b 0a 0a 09 09 72 65 74 75 72 6e  flen);....return
141e0 28 2d 31 29 3b 0a 09 7d 0a 23 20 20 65 6e 64 69  (-1);..}.#  endi
141f0 66 0a 23 65 6e 64 69 66 0a 0a 09 2f 2a 20 57 65  f.#endif.../* We
14200 20 6d 75 73 74 20 72 65 6d 6f 76 65 20 74 68 65   must remove the
14210 20 22 37 43 22 20 74 61 67 20 74 6f 20 67 65 74   "7C" tag to get
14220 20 74 6f 20 74 68 65 20 73 69 67 6e 61 74 75 72   to the signatur
14230 65 20 2a 2f 0a 09 73 77 69 74 63 68 20 28 69 64  e */..switch (id
14240 5f 74 79 70 65 29 20 7b 0a 09 09 63 61 73 65 20  _type) {...case 
14250 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 50  CACKEY_ID_TYPE_P
14260 49 56 3a 0a 09 09 09 6f 75 74 62 75 66 5f 6c 65  IV:....outbuf_le
14270 6e 20 3d 20 72 65 74 76 61 6c 3b 0a 09 09 09 6f  n = retval;....o
14280 75 74 62 75 66 5f 70 20 3d 20 63 61 63 6b 65 79  utbuf_p = cackey
14290 5f 72 65 61 64 5f 62 65 72 74 6c 76 5f 74 61 67  _read_bertlv_tag
142a0 28 6f 75 74 62 75 66 2c 20 26 6f 75 74 62 75 66  (outbuf, &outbuf
142b0 5f 6c 65 6e 2c 20 30 78 37 43 2c 20 4e 55 4c 4c  _len, 0x7C, NULL
142c0 2c 20 20 26 6f 75 74 62 75 66 5f 6c 65 6e 29 3b  ,  &outbuf_len);
142d0 0a 09 09 09 69 66 20 28 6f 75 74 62 75 66 5f 70  ....if (outbuf_p
142e0 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09   == NULL) {.....
142f0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
14300 4e 54 46 28 22 52 65 73 70 6f 6e 73 65 20 66 72  NTF("Response fr
14310 6f 6d 20 50 49 56 20 66 6f 72 20 47 45 4e 45 52  om PIV for GENER
14320 41 54 45 20 41 55 54 48 45 4e 54 49 43 41 54 49  ATE AUTHENTICATI
14330 4f 4e 20 77 61 73 20 6e 6f 74 20 61 20 30 78 37  ON was not a 0x7
14340 43 20 74 61 67 2c 20 72 65 74 75 72 6e 69 6e 67  C tag, returning
14350 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a   in failure");..
14360 09 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a  ....return(-1);.
14370 09 09 09 7d 0a 0a 09 09 09 72 65 74 76 61 6c 20  ...}.....retval 
14380 3d 20 6f 75 74 62 75 66 5f 6c 65 6e 3b 0a 0a 09  = outbuf_len;...
14390 09 09 6f 75 74 62 75 66 5f 6c 65 6e 20 3d 20 72  ..outbuf_len = r
143a0 65 74 76 61 6c 3b 0a 09 09 09 6f 75 74 62 75 66  etval;....outbuf
143b0 5f 70 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64  _p = cackey_read
143c0 5f 62 65 72 74 6c 76 5f 74 61 67 28 6f 75 74 62  _bertlv_tag(outb
143d0 75 66 2c 20 26 6f 75 74 62 75 66 5f 6c 65 6e 2c  uf, &outbuf_len,
143e0 20 30 78 38 32 2c 20 4e 55 4c 4c 2c 20 20 26 6f   0x82, NULL,  &o
143f0 75 74 62 75 66 5f 6c 65 6e 29 3b 0a 09 09 09 69  utbuf_len);....i
14400 66 20 28 6f 75 74 62 75 66 5f 70 20 3d 3d 20 4e  f (outbuf_p == N
14410 55 4c 4c 29 20 7b 0a 09 09 09 09 43 41 43 4b 45  ULL) {.....CACKE
14420 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
14430 52 65 73 70 6f 6e 73 65 20 66 72 6f 6d 20 50 49  Response from PI
14440 56 20 66 6f 72 20 47 45 4e 45 52 41 54 45 20 41  V for GENERATE A
14450 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 20 77 61  UTHENTICATION wa
14460 73 20 6e 6f 74 20 61 20 30 78 38 32 20 77 69 74  s not a 0x82 wit
14470 68 69 6e 20 61 20 30 78 37 43 20 74 61 67 2c 20  hin a 0x7C tag, 
14480 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  returning in fai
14490 6c 75 72 65 22 29 3b 0a 0a 09 09 09 09 72 65 74  lure");......ret
144a0 75 72 6e 28 2d 31 29 3b 0a 09 09 09 7d 0a 0a 09  urn(-1);....}...
144b0 09 09 72 65 74 76 61 6c 20 3d 20 6f 75 74 62 75  ..retval = outbu
144c0 66 5f 6c 65 6e 3b 0a 0a 09 09 09 62 72 65 61 6b  f_len;.....break
144d0 3b 0a 09 09 63 61 73 65 20 43 41 43 4b 45 59 5f  ;...case CACKEY_
144e0 49 44 5f 54 59 50 45 5f 43 41 43 3a 0a 09 09 63  ID_TYPE_CAC:...c
144f0 61 73 65 20 43 41 43 4b 45 59 5f 49 44 5f 54 59  ase CACKEY_ID_TY
14500 50 45 5f 43 45 52 54 5f 4f 4e 4c 59 3a 0a 09 09  PE_CERT_ONLY:...
14510 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 2f 2a 20  .break;..}.../* 
14520 55 6e 70 61 64 20 72 65 70 6c 79 20 2a 2f 0a 09  Unpad reply */..
14530 69 66 20 28 75 6e 70 61 64 4f 75 74 70 75 74 29  if (unpadOutput)
14540 20 7b 0a 09 09 69 66 20 28 72 65 74 76 61 6c 20   {...if (retval 
14550 3c 20 33 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  < 3) {....CACKEY
14560 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
14570 65 70 6c 79 20 69 73 20 74 6f 6f 20 73 6d 61 6c  eply is too smal
14580 6c 2c 20 77 65 20 61 72 65 20 6e 6f 74 20 61 62  l, we are not ab
14590 6c 65 20 74 6f 20 75 6e 70 61 64 20 2d 2d 20 70  le to unpad -- p
145a0 61 73 73 69 6e 67 20 62 61 63 6b 20 61 6e 64 20  assing back and 
145b0 68 6f 70 69 6e 67 20 66 6f 72 20 74 68 65 20 62  hoping for the b
145c0 65 73 74 21 22 29 3b 0a 0a 09 09 09 43 41 43 4b  est!");.....CACK
145d0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
145e0 22 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 73 75  "Returning in su
145f0 63 63 65 73 73 2c 20 72 65 74 76 61 6c 20 3d 20  ccess, retval = 
14600 25 6c 69 20 28 62 79 74 65 73 29 22 2c 20 28 6c  %li (bytes)", (l
14610 6f 6e 67 29 20 72 65 74 76 61 6c 29 3b 0a 09 09  ong) retval);...
14620 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b  .return(retval);
14630 0a 09 09 7d 0a 0a 09 09 69 66 20 28 6f 75 74 62  ...}....if (outb
14640 75 66 5b 30 5d 20 21 3d 20 30 78 30 30 29 20 7b  uf[0] != 0x00) {
14650 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
14660 5f 50 52 49 4e 54 46 28 22 55 6e 72 65 63 6f 67  _PRINTF("Unrecog
14670 6e 69 7a 65 64 20 70 61 64 64 69 6e 67 20 73 63  nized padding sc
14680 68 65 6d 65 20 2d 2d 20 70 61 73 73 69 6e 67 20  heme -- passing 
14690 62 61 63 6b 20 61 6e 64 20 68 6f 70 69 6e 67 20  back and hoping 
146a0 66 6f 72 20 74 68 65 20 62 65 73 74 21 22 29 3b  for the best!");
146b0 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
146c0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
146d0 69 6e 67 20 69 6e 20 73 75 63 63 65 73 73 2c 20  ing in success, 
146e0 72 65 74 76 61 6c 20 3d 20 25 6c 69 20 28 62 79  retval = %li (by
146f0 74 65 73 29 22 2c 20 28 6c 6f 6e 67 29 20 72 65  tes)", (long) re
14700 74 76 61 6c 29 3b 0a 09 09 09 72 65 74 75 72 6e  tval);....return
14710 28 72 65 74 76 61 6c 29 3b 0a 09 09 7d 0a 0a 09  (retval);...}...
14720 09 62 6c 6f 63 6b 74 79 70 65 20 3d 20 6f 75 74  .blocktype = out
14730 62 75 66 5b 31 5d 3b 0a 09 09 75 6e 70 61 64 6f  buf[1];...unpado
14740 66 66 73 65 74 20 3d 20 30 3b 0a 0a 09 09 73 77  ffset = 0;....sw
14750 69 74 63 68 20 28 62 6c 6f 63 6b 74 79 70 65 29  itch (blocktype)
14760 20 7b 0a 09 09 09 63 61 73 65 20 30 78 30 30 3a   {....case 0x00:
14770 0a 09 09 09 09 2f 2a 20 50 61 64 64 69 6e 67 20  ...../* Padding 
14780 53 63 68 65 6d 65 20 31 2c 20 74 68 65 20 66 69  Scheme 1, the fi
14790 72 73 74 20 6e 6f 6e 2d 7a 65 72 6f 20 62 79 74  rst non-zero byt
147a0 65 20 69 73 20 74 68 65 20 73 74 61 72 74 20 6f  e is the start o
147b0 66 20 64 61 74 61 20 2a 2f 0a 09 09 09 09 66 6f  f data */.....fo
147c0 72 20 28 75 6e 70 61 64 6f 66 66 73 65 74 20 3d  r (unpadoffset =
147d0 20 32 3b 20 75 6e 70 61 64 6f 66 66 73 65 74 20   2; unpadoffset 
147e0 3c 20 72 65 74 76 61 6c 3b 20 75 6e 70 61 64 6f  < retval; unpado
147f0 66 66 73 65 74 2b 2b 29 20 7b 0a 09 09 09 09 09  ffset++) {......
14800 69 66 20 28 6f 75 74 62 75 66 5b 75 6e 70 61 64  if (outbuf[unpad
14810 6f 66 66 73 65 74 5d 20 21 3d 20 30 78 30 30 29  offset] != 0x00)
14820 20 7b 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a   {.......break;.
14830 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 09 09 09  .....}.....}....
14840 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
14850 30 78 30 31 3a 0a 09 09 09 09 2f 2a 20 50 61 64  0x01:...../* Pad
14860 64 69 6e 67 20 53 63 68 65 6d 65 20 32 2c 20 70  ding Scheme 2, p
14870 61 64 20 62 79 74 65 73 20 61 72 65 20 30 78 46  ad bytes are 0xF
14880 46 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 30 78  F followed by 0x
14890 30 30 20 2a 2f 0a 09 09 09 09 66 6f 72 20 28 75  00 */.....for (u
148a0 6e 70 61 64 6f 66 66 73 65 74 20 3d 20 32 3b 20  npadoffset = 2; 
148b0 75 6e 70 61 64 6f 66 66 73 65 74 20 3c 20 72 65  unpadoffset < re
148c0 74 76 61 6c 3b 20 75 6e 70 61 64 6f 66 66 73 65  tval; unpadoffse
148d0 74 2b 2b 29 20 7b 0a 09 09 09 09 09 69 66 20 28  t++) {......if (
148e0 6f 75 74 62 75 66 5b 75 6e 70 61 64 6f 66 66 73  outbuf[unpadoffs
148f0 65 74 5d 20 21 3d 20 30 78 46 46 29 20 7b 0a 09  et] != 0xFF) {..
14900 09 09 09 09 09 69 66 20 28 6f 75 74 62 75 66 5b  .....if (outbuf[
14910 75 6e 70 61 64 6f 66 66 73 65 74 5d 20 3d 3d 20  unpadoffset] == 
14920 30 78 30 30 29 20 7b 0a 09 09 09 09 09 09 09 75  0x00) {........u
14930 6e 70 61 64 6f 66 66 73 65 74 2b 2b 3b 0a 0a 09  npadoffset++;...
14940 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
14950 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09  ...} else {.....
14960 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
14970 50 52 49 4e 54 46 28 22 49 6e 76 61 6c 69 64 20  PRINTF("Invalid 
14980 70 61 64 64 69 6e 67 20 64 61 74 61 20 66 6f 75  padding data fou
14990 6e 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e  nd, returning in
149a0 20 66 61 69 6c 75 72 65 2c 20 73 68 6f 75 6c 64   failure, should
149b0 20 68 61 76 65 20 62 65 65 6e 20 30 78 30 30 20   have been 0x00 
149c0 66 6f 75 6e 64 20 30 78 25 30 32 78 22 2c 20 28  found 0x%02x", (
149d0 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 6f 75  unsigned int) ou
149e0 74 62 75 66 5b 75 6e 70 61 64 6f 66 66 73 65 74  tbuf[unpadoffset
149f0 5d 29 3b 0a 0a 09 09 09 09 09 09 09 72 65 74 75  ]);.........retu
14a00 72 6e 28 2d 31 29 3b 0a 09 09 09 09 09 09 7d 0a  rn(-1);.......}.
14a10 09 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  .....} else {...
14a20 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
14a30 5f 50 52 49 4e 54 46 28 22 49 6e 76 61 6c 69 64  _PRINTF("Invalid
14a40 20 70 61 64 64 69 6e 67 20 64 61 74 61 20 66 6f   padding data fo
14a50 75 6e 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69  und, returning i
14a60 6e 20 66 61 69 6c 75 72 65 2c 20 73 68 6f 75 6c  n failure, shoul
14a70 64 20 68 61 76 65 20 62 65 65 6e 20 30 78 46 46  d have been 0xFF
14a80 20 66 6f 75 6e 64 20 30 78 25 30 32 78 22 2c 20   found 0x%02x", 
14a90 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 6f  (unsigned int) o
14aa0 75 74 62 75 66 5b 75 6e 70 61 64 6f 66 66 73 65  utbuf[unpadoffse
14ab0 74 5d 29 3b 0a 0a 09 09 09 09 09 09 72 65 74 75  t]);........retu
14ac0 72 6e 28 2d 31 29 3b 0a 09 09 09 09 09 7d 0a 09  rn(-1);......}..
14ad0 09 09 09 7d 0a 09 09 09 09 62 72 65 61 6b 3b 0a  ...}.....break;.
14ae0 09 09 09 63 61 73 65 20 30 78 30 32 3a 0a 09 09  ...case 0x02:...
14af0 09 09 2f 2a 20 50 61 64 64 69 6e 67 20 53 63 68  ../* Padding Sch
14b00 65 6d 65 20 33 2c 20 70 61 64 20 62 79 74 65 73  eme 3, pad bytes
14b10 20 61 72 65 20 6e 6f 6e 2d 7a 65 72 6f 20 66 69   are non-zero fi
14b20 72 73 74 20 7a 65 72 6f 20 62 79 74 65 20 66 6f  rst zero byte fo
14b30 75 6e 64 20 69 73 20 74 68 65 20 73 65 70 65 72  und is the seper
14b40 61 74 6f 72 20 62 79 74 65 20 2a 2f 0a 09 09 09  ator byte */....
14b50 09 66 6f 72 20 28 75 6e 70 61 64 6f 66 66 73 65  .for (unpadoffse
14b60 74 20 3d 20 32 3b 20 75 6e 70 61 64 6f 66 66 73  t = 2; unpadoffs
14b70 65 74 20 3c 20 72 65 74 76 61 6c 3b 20 75 6e 70  et < retval; unp
14b80 61 64 6f 66 66 73 65 74 2b 2b 29 20 7b 0a 09 09  adoffset++) {...
14b90 09 09 09 69 66 20 28 6f 75 74 62 75 66 5b 75 6e  ...if (outbuf[un
14ba0 70 61 64 6f 66 66 73 65 74 5d 20 3d 3d 20 30 78  padoffset] == 0x
14bb0 30 30 29 20 7b 0a 09 09 09 09 09 09 75 6e 70 61  00) {.......unpa
14bc0 64 6f 66 66 73 65 74 2b 2b 3b 0a 0a 09 09 09 09  doffset++;......
14bd0 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 7d 0a  ..break;......}.
14be0 09 09 09 09 7d 0a 09 09 09 09 62 72 65 61 6b 3b  ....}.....break;
14bf0 0a 09 09 7d 0a 0a 09 09 69 66 20 28 75 6e 70 61  ...}....if (unpa
14c00 64 6f 66 66 73 65 74 20 3e 20 72 65 74 76 61 6c  doffset > retval
14c10 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
14c20 42 55 47 5f 50 52 49 4e 54 46 28 22 4f 66 66 73  BUG_PRINTF("Offs
14c30 65 74 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  et greater than 
14c40 72 65 70 6c 79 20 73 69 7a 65 2c 20 61 62 6f 72  reply size, abor
14c50 74 69 6e 67 2e 20 20 28 75 6e 70 61 64 6f 66 66  ting.  (unpadoff
14c60 73 65 74 20 3d 20 25 6c 75 2c 20 72 65 74 76 61  set = %lu, retva
14c70 6c 20 3d 20 25 6c 75 29 22 2c 20 28 75 6e 73 69  l = %lu)", (unsi
14c80 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6e 70 61 64  gned long) unpad
14c90 6f 66 66 73 65 74 2c 20 28 75 6e 73 69 67 6e 65  offset, (unsigne
14ca0 64 20 6c 6f 6e 67 29 20 72 65 74 76 61 6c 29 3b  d long) retval);
14cb0 0a 0a 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b  .....return(-1);
14cc0 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ...}....CACKEY_D
14cd0 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22 50  EBUG_PRINTBUF("P
14ce0 61 64 64 65 64 3a 22 2c 20 6f 75 74 62 75 66 2c  added:", outbuf,
14cf0 20 72 65 74 76 61 6c 29 3b 0a 0a 09 09 72 65 74   retval);....ret
14d00 76 61 6c 20 2d 3d 20 75 6e 70 61 64 6f 66 66 73  val -= unpadoffs
14d10 65 74 3b 0a 09 09 6d 65 6d 6d 6f 76 65 28 6f 75  et;...memmove(ou
14d20 74 62 75 66 2c 20 6f 75 74 62 75 66 20 2b 20 75  tbuf, outbuf + u
14d30 6e 70 61 64 6f 66 66 73 65 74 2c 20 72 65 74 76  npadoffset, retv
14d40 61 6c 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  al);....CACKEY_D
14d50 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22 55  EBUG_PRINTBUF("U
14d60 6e 70 61 64 64 65 64 3a 22 2c 20 6f 75 74 62 75  npadded:", outbu
14d70 66 2c 20 72 65 74 76 61 6c 29 3b 0a 09 7d 0a 0a  f, retval);..}..
14d80 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
14d90 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
14da0 20 69 6e 20 73 75 63 63 65 73 73 2c 20 72 65 74   in success, ret
14db0 76 61 6c 20 3d 20 25 6c 69 20 28 62 79 74 65 73  val = %li (bytes
14dc0 29 22 2c 20 28 6c 6f 6e 67 29 20 72 65 74 76 61  )", (long) retva
14dd0 6c 29 3b 0a 0a 09 72 65 74 75 72 6e 28 72 65 74  l);...return(ret
14de0 76 61 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53  val);.}../*. * S
14df0 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 2e  YNPOSIS. *     .
14e00 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e  ... *. * ARGUMEN
14e10 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a  TS. *     .... *
14e20 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45  . * RETURN VALUE
14e30 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20  . *     .... *. 
14e40 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 2e  * NOTES. *     .
14e50 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63  ... *. */.static
14e60 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b   cackey_ret cack
14e70 65 79 5f 74 6f 6b 65 6e 5f 70 72 65 73 65 6e 74  ey_token_present
14e80 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73  (struct cackey_s
14e90 6c 6f 74 20 2a 73 6c 6f 74 29 20 7b 0a 09 63 61  lot *slot) {..ca
14ea0 63 6b 65 79 5f 72 65 74 20 70 63 73 63 5f 63 6f  ckey_ret pcsc_co
14eb0 6e 6e 65 63 74 5f 72 65 74 3b 0a 09 44 57 4f 52  nnect_ret;..DWOR
14ec0 44 20 72 65 61 64 65 72 5f 6c 65 6e 20 3d 20 30  D reader_len = 0
14ed0 2c 20 73 74 61 74 65 20 3d 20 30 2c 20 70 72 6f  , state = 0, pro
14ee0 74 6f 63 6f 6c 20 3d 20 30 2c 20 61 74 72 5f 6c  tocol = 0, atr_l
14ef0 65 6e 3b 0a 09 42 59 54 45 20 61 74 72 5b 4d 41  en;..BYTE atr[MA
14f00 58 5f 41 54 52 5f 53 49 5a 45 5d 3b 0a 09 4c 4f  X_ATR_SIZE];..LO
14f10 4e 47 20 73 74 61 74 75 73 5f 72 65 74 2c 20 73  NG status_ret, s
14f20 63 61 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 74 3b  card_reconn_ret;
14f30 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
14f40 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
14f50 29 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 2d 3e 69  );...if (slot->i
14f60 6e 74 65 72 6e 61 6c 29 20 7b 0a 09 09 43 41 43  nternal) {...CAC
14f70 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
14f80 28 22 52 65 74 75 72 6e 69 6e 67 20 74 6f 6b 65  ("Returning toke
14f90 6e 20 70 72 65 73 65 6e 74 20 28 69 6e 74 65 72  n present (inter
14fa0 6e 61 6c 20 74 6f 6b 65 6e 29 22 29 3b 0a 0a 09  nal token)");...
14fb0 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
14fc0 43 53 43 5f 53 5f 54 4f 4b 45 4e 50 52 45 53 45  CSC_S_TOKENPRESE
14fd0 4e 54 29 3b 0a 09 7d 0a 0a 09 70 63 73 63 5f 63  NT);..}...pcsc_c
14fe0 6f 6e 6e 65 63 74 5f 72 65 74 20 3d 20 63 61 63  onnect_ret = cac
14ff0 6b 65 79 5f 63 6f 6e 6e 65 63 74 5f 63 61 72 64  key_connect_card
15000 28 73 6c 6f 74 29 3b 0a 09 69 66 20 28 70 63 73  (slot);..if (pcs
15010 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 20 21 3d  c_connect_ret !=
15020 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f   CACKEY_PCSC_S_O
15030 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  K) {...CACKEY_DE
15040 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62  BUG_PRINTF("Unab
15050 6c 65 20 74 6f 20 63 6f 6e 6e 65 63 74 20 74 6f  le to connect to
15060 20 63 61 72 64 2c 20 72 65 74 75 72 6e 69 6e 67   card, returning
15070 20 74 6f 6b 65 6e 20 61 62 73 65 6e 74 22 29 3b   token absent");
15080 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ....return(CACKE
15090 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42  Y_PCSC_E_TOKENAB
150a0 53 45 4e 54 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  SENT);..}...CACK
150b0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
150c0 22 43 61 6c 6c 69 6e 67 20 53 43 61 72 64 53 74  "Calling SCardSt
150d0 61 74 75 73 28 29 20 74 6f 20 64 65 74 65 72 6d  atus() to determ
150e0 69 6e 65 20 63 61 72 64 20 73 74 61 74 75 73 22  ine card status"
150f0 29 3b 0a 0a 09 61 74 72 5f 6c 65 6e 20 3d 20 73  );...atr_len = s
15100 69 7a 65 6f 66 28 61 74 72 29 3b 0a 09 73 74 61  izeof(atr);..sta
15110 74 75 73 5f 72 65 74 20 3d 20 53 43 61 72 64 53  tus_ret = SCardS
15120 74 61 74 75 73 28 73 6c 6f 74 2d 3e 70 63 73 63  tatus(slot->pcsc
15130 5f 63 61 72 64 2c 20 4e 55 4c 4c 2c 20 26 72 65  _card, NULL, &re
15140 61 64 65 72 5f 6c 65 6e 2c 20 26 73 74 61 74 65  ader_len, &state
15150 2c 20 26 70 72 6f 74 6f 63 6f 6c 2c 20 61 74 72  , &protocol, atr
15160 2c 20 26 61 74 72 5f 6c 65 6e 29 3b 0a 0a 09 69  , &atr_len);...i
15170 66 20 28 73 74 61 74 75 73 5f 72 65 74 20 3d 3d  f (status_ret ==
15180 20 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44   SCARD_E_INVALID
15190 5f 48 41 4e 44 4c 45 29 20 7b 0a 09 09 43 41 43  _HANDLE) {...CAC
151a0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
151b0 28 22 53 43 61 72 64 53 74 61 74 75 73 28 29 20  ("SCardStatus() 
151c0 72 65 74 75 72 6e 65 64 20 53 43 41 52 44 5f 45  returned SCARD_E
151d0 5f 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 2c  _INVALID_HANDLE,
151e0 20 6d 61 72 6b 69 6e 67 20 69 73 20 6e 6f 74 20   marking is not 
151f0 61 6c 72 65 61 64 79 20 63 6f 6e 6e 65 63 74 65  already connecte
15200 64 20 61 6e 64 20 74 72 79 69 6e 67 20 61 67 61  d and trying aga
15210 69 6e 22 29 3b 0a 09 09 63 61 63 6b 65 79 5f 6d  in");...cackey_m
15220 61 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74 28 73  ark_slot_reset(s
15230 6c 6f 74 29 3b 0a 0a 09 09 70 63 73 63 5f 63 6f  lot);....pcsc_co
15240 6e 6e 65 63 74 5f 72 65 74 20 3d 20 63 61 63 6b  nnect_ret = cack
15250 65 79 5f 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28  ey_connect_card(
15260 73 6c 6f 74 29 3b 0a 09 09 69 66 20 28 70 63 73  slot);...if (pcs
15270 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 20 21 3d  c_connect_ret !=
15280 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f   CACKEY_PCSC_S_O
15290 4b 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  K) {....CACKEY_D
152a0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61  EBUG_PRINTF("Una
152b0 62 6c 65 20 74 6f 20 63 6f 6e 6e 65 63 74 20 74  ble to connect t
152c0 6f 20 63 61 72 64 2c 20 72 65 74 75 72 6e 69 6e  o card, returnin
152d0 67 20 74 6f 6b 65 6e 20 61 62 73 65 6e 74 22 29  g token absent")
152e0 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43  ;.....return(CAC
152f0 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e  KEY_PCSC_E_TOKEN
15300 41 42 53 45 4e 54 29 3b 0a 09 09 7d 0a 0a 09 09  ABSENT);...}....
15310 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
15320 4e 54 46 28 22 43 61 6c 6c 69 6e 67 20 53 43 61  NTF("Calling SCa
15330 72 64 53 74 61 74 75 73 28 29 20 61 67 61 69 6e  rdStatus() again
15340 22 29 3b 0a 0a 09 09 61 74 72 5f 6c 65 6e 20 3d  ");....atr_len =
15350 20 73 69 7a 65 6f 66 28 61 74 72 29 3b 0a 09 09   sizeof(atr);...
15360 73 74 61 74 75 73 5f 72 65 74 20 3d 20 53 43 61  status_ret = SCa
15370 72 64 53 74 61 74 75 73 28 73 6c 6f 74 2d 3e 70  rdStatus(slot->p
15380 63 73 63 5f 63 61 72 64 2c 20 4e 55 4c 4c 2c 20  csc_card, NULL, 
15390 26 72 65 61 64 65 72 5f 6c 65 6e 2c 20 26 73 74  &reader_len, &st
153a0 61 74 65 2c 20 26 70 72 6f 74 6f 63 6f 6c 2c 20  ate, &protocol, 
153b0 61 74 72 2c 20 26 61 74 72 5f 6c 65 6e 29 3b 0a  atr, &atr_len);.
153c0 09 7d 0a 0a 09 69 66 20 28 73 74 61 74 75 73 5f  .}...if (status_
153d0 72 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f 53  ret != SCARD_S_S
153e0 55 43 43 45 53 53 29 20 7b 0a 09 09 63 61 63 6b  UCCESS) {...cack
153f0 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65 73  ey_mark_slot_res
15400 65 74 28 73 6c 6f 74 29 3b 0a 0a 09 09 69 66 20  et(slot);....if 
15410 28 73 74 61 74 75 73 5f 72 65 74 20 3d 3d 20 53  (status_ret == S
15420 43 41 52 44 5f 57 5f 52 45 53 45 54 5f 43 41 52  CARD_W_RESET_CAR
15430 44 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  D) {....CACKEY_D
15440 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 73  EBUG_PRINTF("Res
15450 65 74 20 72 65 71 75 69 72 65 64 2c 20 70 6c 65  et required, ple
15460 61 73 65 20 68 6f 6c 64 2e 2e 2e 22 29 3b 0a 0a  ase hold...");..
15470 09 09 09 73 63 61 72 64 5f 72 65 63 6f 6e 6e 5f  ...scard_reconn_
15480 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 72 65 63  ret = cackey_rec
15490 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73 6c 6f 74  onnect_card(slot
154a0 2c 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c  , SCARD_PROTOCOL
154b0 5f 54 30 20 7c 20 53 43 41 52 44 5f 50 52 4f 54  _T0 | SCARD_PROT
154c0 4f 43 4f 4c 5f 54 31 29 3b 0a 09 09 09 69 66 20  OCOL_T1);....if 
154d0 28 73 63 61 72 64 5f 72 65 63 6f 6e 6e 5f 72 65  (scard_reconn_re
154e0 74 20 3d 3d 20 53 43 41 52 44 5f 53 5f 53 55 43  t == SCARD_S_SUC
154f0 43 45 53 53 29 20 7b 0a 09 09 09 09 2f 2a 20 52  CESS) {...../* R
15500 65 2d 65 73 74 61 62 6c 69 73 68 20 74 72 61 6e  e-establish tran
15510 73 61 63 74 69 6f 6e 2c 20 69 66 20 69 74 20 77  saction, if it w
15520 61 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 09 09  as present */...
15530 09 09 69 66 20 28 73 6c 6f 74 2d 3e 74 72 61 6e  ..if (slot->tran
15540 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3e 20  saction_depth > 
15550 30 29 20 7b 0a 09 09 09 09 09 73 6c 6f 74 2d 3e  0) {......slot->
15560 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74  transaction_dept
15570 68 2d 2d 3b 0a 09 09 09 09 09 73 6c 6f 74 2d 3e  h--;......slot->
15580 74 72 61 6e 73 61 63 74 69 6f 6e 5f 6e 65 65 64  transaction_need
15590 5f 68 77 5f 6c 6f 63 6b 20 3d 20 31 3b 0a 09 09  _hw_lock = 1;...
155a0 09 09 09 63 61 63 6b 65 79 5f 62 65 67 69 6e 5f  ...cackey_begin_
155b0 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74  transaction(slot
155c0 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41  );.....}......CA
155d0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
155e0 46 28 22 52 65 73 65 74 20 73 75 63 63 65 73 73  F("Reset success
155f0 66 75 6c 2c 20 72 65 71 75 65 72 79 69 6e 67 22  ful, requerying"
15600 29 3b 0a 09 09 09 09 73 74 61 74 75 73 5f 72 65  );.....status_re
15610 74 20 3d 20 53 43 61 72 64 53 74 61 74 75 73 28  t = SCardStatus(
15620 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c  slot->pcsc_card,
15630 20 4e 55 4c 4c 2c 20 26 72 65 61 64 65 72 5f 6c   NULL, &reader_l
15640 65 6e 2c 20 26 73 74 61 74 65 2c 20 26 70 72 6f  en, &state, &pro
15650 74 6f 63 6f 6c 2c 20 61 74 72 2c 20 26 61 74 72  tocol, atr, &atr
15660 5f 6c 65 6e 29 3b 0a 09 09 09 09 69 66 20 28 73  _len);.....if (s
15670 74 61 74 75 73 5f 72 65 74 20 21 3d 20 53 43 41  tatus_ret != SCA
15680 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a  RD_S_SUCCESS) {.
15690 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
156a0 47 5f 50 52 49 4e 54 46 28 22 53 74 69 6c 6c 20  G_PRINTF("Still 
156b0 75 6e 61 62 6c 65 20 74 6f 20 71 75 65 72 79 20  unable to query 
156c0 63 61 72 64 20 73 74 61 74 75 73 2c 20 72 65 74  card status, ret
156d0 75 72 6e 69 6e 67 20 74 6f 6b 65 6e 20 61 62 73  urning token abs
156e0 65 6e 74 2e 20 20 53 43 61 72 64 53 74 61 74 75  ent.  SCardStatu
156f0 73 28 29 20 3d 20 25 73 22 2c 20 43 41 43 4b 45  s() = %s", CACKE
15700 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41  Y_DEBUG_FUNC_SCA
15710 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 74 61  RDERR_TO_STR(sta
15720 74 75 73 5f 72 65 74 29 29 3b 0a 0a 09 09 09 09  tus_ret));......
15730 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
15740 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e  CSC_E_TOKENABSEN
15750 54 29 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 20 65  T);.....}....} e
15760 6c 73 65 20 7b 0a 09 09 09 09 43 41 43 4b 45 59  lse {.....CACKEY
15770 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55  _DEBUG_PRINTF("U
15780 6e 61 62 6c 65 20 74 6f 20 72 65 63 6f 6e 6e 65  nable to reconne
15790 63 74 20 74 6f 20 63 61 72 64 2c 20 72 65 74 75  ct to card, retu
157a0 72 6e 69 6e 67 20 74 6f 6b 65 6e 20 61 62 73 65  rning token abse
157b0 6e 74 2e 20 20 53 43 61 72 64 52 65 63 6f 6e 6e  nt.  SCardReconn
157c0 65 63 74 28 29 20 3d 20 25 73 22 2c 20 43 41 43  ect() = %s", CAC
157d0 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53  KEY_DEBUG_FUNC_S
157e0 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73  CARDERR_TO_STR(s
157f0 63 61 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 74 29  card_reconn_ret)
15800 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 43  );......return(C
15810 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b  ACKEY_PCSC_E_TOK
15820 45 4e 41 42 53 45 4e 54 29 3b 0a 09 09 09 7d 0a  ENABSENT);....}.
15830 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 43 41  ..} else {....CA
15840 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
15850 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 71 75 65  F("Unable to que
15860 72 79 20 63 61 72 64 20 73 74 61 74 75 73 2c 20  ry card status, 
15870 72 65 74 75 72 6e 69 6e 67 20 74 6f 6b 65 6e 20  returning token 
15880 61 62 73 65 6e 74 2e 20 20 53 43 61 72 64 53 74  absent.  SCardSt
15890 61 74 75 73 28 29 20 3d 20 25 73 22 2c 20 43 41  atus() = %s", CA
158a0 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
158b0 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28  SCARDERR_TO_STR(
158c0 73 74 61 74 75 73 5f 72 65 74 29 29 3b 0a 0a 09  status_ret));...
158d0 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
158e0 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45  PCSC_E_TOKENABSE
158f0 4e 54 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66  NT);...}..}...if
15900 20 28 28 73 74 61 74 65 20 26 20 53 43 41 52 44   ((state & SCARD
15910 5f 41 42 53 45 4e 54 29 20 3d 3d 20 53 43 41 52  _ABSENT) == SCAR
15920 44 5f 41 42 53 45 4e 54 29 20 7b 0a 09 09 43 41  D_ABSENT) {...CA
15930 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
15940 46 28 22 43 61 72 64 20 69 73 20 61 62 73 65 6e  F("Card is absen
15950 74 2c 20 72 65 74 75 72 6e 69 6e 67 20 74 6f 6b  t, returning tok
15960 65 6e 20 61 62 73 65 6e 74 22 29 3b 0a 0a 09 09  en absent");....
15970 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
15980 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54  SC_E_TOKENABSENT
15990 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
159a0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
159b0 75 72 6e 69 6e 67 20 74 6f 6b 65 6e 20 70 72 65  urning token pre
159c0 73 65 6e 74 2e 22 29 3b 0a 0a 09 72 65 74 75 72  sent.");...retur
159d0 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  n(CACKEY_PCSC_S_
159e0 54 4f 4b 45 4e 50 52 45 53 45 4e 54 29 3b 0a 7d  TOKENPRESENT);.}
159f0 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53  ../*. * SYNPOSIS
15a00 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20  . *     .... *. 
15a10 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20  * ARGUMENTS. *  
15a20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54     .... *. * RET
15a30 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20  URN VALUE. *    
15a40 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53   .... *. * NOTES
15a50 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20  . *     .... *. 
15a60 2a 2f 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79  */.static cackey
15a70 5f 72 65 74 20 63 61 63 6b 65 79 5f 73 65 74 5f  _ret cackey_set_
15a80 70 69 6e 28 73 74 72 75 63 74 20 63 61 63 6b 65  pin(struct cacke
15a90 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e  y_slot *slot, un
15aa0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6f 6c 64  signed char *old
15ab0 5f 70 69 6e 2c 20 75 6e 73 69 67 6e 65 64 20 6c  _pin, unsigned l
15ac0 6f 6e 67 20 6f 6c 64 5f 70 69 6e 5f 6c 65 6e 2c  ong old_pin_len,
15ad0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
15ae0 70 69 6e 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f  pin, unsigned lo
15af0 6e 67 20 70 69 6e 5f 6c 65 6e 29 20 7b 0a 09 73  ng pin_len) {..s
15b00 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73  truct cackey_pcs
15b10 63 5f 69 64 65 6e 74 69 74 79 20 2a 70 63 73 63  c_identity *pcsc
15b20 5f 69 64 65 6e 74 69 74 69 65 73 3b 0a 09 75 6e  _identities;..un
15b30 73 69 67 6e 65 64 20 63 68 61 72 20 63 61 63 5f  signed char cac_
15b40 70 69 6e 5b 38 5d 20 3d 20 7b 30 78 46 46 2c 20  pin[8] = {0xFF, 
15b50 30 78 46 46 2c 20 30 78 46 46 2c 20 30 78 46 46  0xFF, 0xFF, 0xFF
15b60 2c 20 30 78 46 46 2c 20 30 78 46 46 2c 20 30 78  , 0xFF, 0xFF, 0x
15b70 46 46 2c 20 30 78 46 46 7d 3b 0a 09 75 6e 73 69  FF, 0xFF};..unsi
15b80 67 6e 65 64 20 63 68 61 72 20 6f 6c 64 5f 63 61  gned char old_ca
15b90 63 5f 70 69 6e 5b 38 5d 20 3d 20 7b 30 78 46 46  c_pin[8] = {0xFF
15ba0 2c 20 30 78 46 46 2c 20 30 78 46 46 2c 20 30 78  , 0xFF, 0xFF, 0x
15bb0 46 46 2c 20 30 78 46 46 2c 20 30 78 46 46 2c 20  FF, 0xFF, 0xFF, 
15bc0 30 78 46 46 2c 20 30 78 46 46 7d 3b 0a 09 75 6e  0xFF, 0xFF};..un
15bd0 73 69 67 6e 65 64 20 63 68 61 72 20 70 69 6e 5f  signed char pin_
15be0 75 70 64 61 74 65 5b 73 69 7a 65 6f 66 28 63 61  update[sizeof(ca
15bf0 63 5f 70 69 6e 29 20 2b 20 73 69 7a 65 6f 66 28  c_pin) + sizeof(
15c00 6f 6c 64 5f 63 61 63 5f 70 69 6e 29 5d 3b 0a 09  old_cac_pin)];..
15c10 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6e 75  unsigned long nu
15c20 6d 5f 63 65 72 74 73 3b 0a 09 75 69 6e 74 31 36  m_certs;..uint16
15c30 5f 74 20 72 65 73 70 6f 6e 73 65 5f 63 6f 64 65  _t response_code
15c40 3b 0a 09 69 6e 74 20 74 72 69 65 73 5f 72 65 6d  ;..int tries_rem
15c50 61 69 6e 69 6e 67 3b 0a 09 69 6e 74 20 73 65 6e  aining;..int sen
15c60 64 5f 72 65 74 3b 0a 09 69 6e 74 20 6b 65 79 5f  d_ret;..int key_
15c70 72 65 66 65 72 65 6e 63 65 20 3d 20 30 78 30 30  reference = 0x00
15c80 3b 0a 0a 09 2f 2a 20 41 70 70 61 72 65 6e 74 6c  ;.../* Apparentl
15c90 79 2c 20 43 41 43 20 50 49 4e 73 20 61 72 65 20  y, CAC PINs are 
15ca0 2a 45 58 41 43 54 4c 59 2a 20 38 20 62 79 74 65  *EXACTLY* 8 byte
15cb0 73 20 6c 6f 6e 67 20 2d 2d 20 70 61 64 20 77 69  s long -- pad wi
15cc0 74 68 20 30 78 46 46 20 69 66 20 74 6f 6f 20 73  th 0xFF if too s
15cd0 68 6f 72 74 20 2a 2f 0a 09 69 66 20 28 70 69 6e  hort */..if (pin
15ce0 5f 6c 65 6e 20 3e 3d 20 38 29 20 7b 0a 09 09 6d  _len >= 8) {...m
15cf0 65 6d 63 70 79 28 63 61 63 5f 70 69 6e 2c 20 70  emcpy(cac_pin, p
15d00 69 6e 2c 20 38 29 3b 0a 09 7d 20 65 6c 73 65 20  in, 8);..} else 
15d10 7b 0a 09 09 6d 65 6d 63 70 79 28 63 61 63 5f 70  {...memcpy(cac_p
15d20 69 6e 2c 20 70 69 6e 2c 20 70 69 6e 5f 6c 65 6e  in, pin, pin_len
15d30 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 6f 6c 64 5f  );..}...if (old_
15d40 70 69 6e 5f 6c 65 6e 20 3e 3d 20 38 29 20 7b 0a  pin_len >= 8) {.
15d50 09 09 6d 65 6d 63 70 79 28 6f 6c 64 5f 63 61 63  ..memcpy(old_cac
15d60 5f 70 69 6e 2c 20 6f 6c 64 5f 70 69 6e 2c 20 38  _pin, old_pin, 8
15d70 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 6d  );..} else {...m
15d80 65 6d 63 70 79 28 6f 6c 64 5f 63 61 63 5f 70 69  emcpy(old_cac_pi
15d90 6e 2c 20 6f 6c 64 5f 70 69 6e 2c 20 6f 6c 64 5f  n, old_pin, old_
15da0 70 69 6e 5f 6c 65 6e 29 3b 0a 09 7d 0a 0a 09 2f  pin_len);..}.../
15db0 2a 20 43 6f 6e 63 61 74 65 6e 61 74 65 20 62 6f  * Concatenate bo
15dc0 74 68 20 50 49 4e 73 20 74 6f 67 65 74 68 65 72  th PINs together
15dd0 20 74 6f 20 73 65 6e 64 20 61 73 20 61 20 73 69   to send as a si
15de0 6e 67 6c 65 20 69 6e 73 74 72 75 63 74 69 6f 6e  ngle instruction
15df0 20 2a 2f 0a 09 6d 65 6d 63 70 79 28 70 69 6e 5f   */..memcpy(pin_
15e00 75 70 64 61 74 65 2c 20 6f 6c 64 5f 63 61 63 5f  update, old_cac_
15e10 70 69 6e 2c 20 73 69 7a 65 6f 66 28 6f 6c 64 5f  pin, sizeof(old_
15e20 63 61 63 5f 70 69 6e 29 29 3b 0a 09 6d 65 6d 63  cac_pin));..memc
15e30 70 79 28 70 69 6e 5f 75 70 64 61 74 65 20 2b 20  py(pin_update + 
15e40 73 69 7a 65 6f 66 28 6f 6c 64 5f 63 61 63 5f 70  sizeof(old_cac_p
15e50 69 6e 29 2c 20 63 61 63 5f 70 69 6e 2c 20 73 69  in), cac_pin, si
15e60 7a 65 6f 66 28 63 61 63 5f 70 69 6e 29 29 3b 0a  zeof(cac_pin));.
15e70 0a 09 2f 2a 20 52 65 6a 65 63 74 20 50 49 4e 73  ../* Reject PINs
15e80 20 77 68 69 63 68 20 61 72 65 20 74 6f 6f 20 73   which are too s
15e90 68 6f 72 74 20 2a 2f 0a 09 69 66 20 28 70 69 6e  hort */..if (pin
15ea0 5f 6c 65 6e 20 3c 20 35 29 20 7b 0a 09 09 43 41  _len < 5) {...CA
15eb0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
15ec0 46 28 22 52 65 6a 65 63 74 69 6e 67 20 4e 65 77  F("Rejecting New
15ed0 20 50 49 4e 20 77 68 69 63 68 20 69 73 20 74 6f   PIN which is to
15ee0 6f 20 73 68 6f 72 74 20 28 6c 65 6e 67 74 68 20  o short (length 
15ef0 3d 20 25 6c 75 2c 20 6d 75 73 74 20 62 65 20 61  = %lu, must be a
15f00 74 6c 65 61 73 74 20 35 29 22 2c 20 70 69 6e 5f  tleast 5)", pin_
15f10 6c 65 6e 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  len);....return(
15f20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 42 41  CACKEY_PCSC_E_BA
15f30 44 50 49 4e 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  DPIN);..}...if (
15f40 6f 6c 64 5f 70 69 6e 5f 6c 65 6e 20 3c 20 35 29  old_pin_len < 5)
15f50 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
15f60 47 5f 50 52 49 4e 54 46 28 22 52 65 6a 65 63 74  G_PRINTF("Reject
15f70 69 6e 67 20 4f 6c 64 20 50 49 4e 20 77 68 69 63  ing Old PIN whic
15f80 68 20 69 73 20 74 6f 6f 20 73 68 6f 72 74 20 28  h is too short (
15f90 6c 65 6e 67 74 68 20 3d 20 25 6c 75 2c 20 6d 75  length = %lu, mu
15fa0 73 74 20 62 65 20 61 74 6c 65 61 73 74 20 35 29  st be atleast 5)
15fb0 22 2c 20 6f 6c 64 5f 70 69 6e 5f 6c 65 6e 29 3b  ", old_pin_len);
15fc0 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ....return(CACKE
15fd0 59 5f 50 43 53 43 5f 45 5f 42 41 44 50 49 4e 29  Y_PCSC_E_BADPIN)
15fe0 3b 0a 09 7d 0a 0a 09 2f 2a 20 50 49 56 20 61 75  ;..}.../* PIV au
15ff0 74 68 65 6e 74 69 63 61 74 69 6f 6e 20 75 73 65  thentication use
16000 73 20 61 20 22 6b 65 79 5f 72 65 66 65 72 65 6e  s a "key_referen
16010 63 65 22 20 6f 66 20 30 78 38 30 20 2a 2f 0a 09  ce" of 0x80 */..
16020 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 20  pcsc_identities 
16030 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 63 65  = cackey_read_ce
16040 72 74 73 28 73 6c 6f 74 2c 20 4e 55 4c 4c 2c 20  rts(slot, NULL, 
16050 26 6e 75 6d 5f 63 65 72 74 73 29 3b 0a 09 69 66  &num_certs);..if
16060 20 28 6e 75 6d 5f 63 65 72 74 73 20 3e 20 30 20   (num_certs > 0 
16070 26 26 20 70 63 73 63 5f 69 64 65 6e 74 69 74 69  && pcsc_identiti
16080 65 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  es != NULL) {...
16090 73 77 69 74 63 68 20 28 70 63 73 63 5f 69 64 65  switch (pcsc_ide
160a0 6e 74 69 74 69 65 73 5b 30 5d 2e 69 64 5f 74 79  ntities[0].id_ty
160b0 70 65 29 20 7b 0a 09 09 09 63 61 73 65 20 43 41  pe) {....case CA
160c0 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 50 49 56  CKEY_ID_TYPE_PIV
160d0 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  :.....CACKEY_DEB
160e0 55 47 5f 50 52 49 4e 54 46 28 22 57 65 20 68 61  UG_PRINTF("We ha
160f0 76 65 20 50 49 56 20 63 61 72 64 2c 20 73 6f 20  ve PIV card, so 
16100 77 65 20 77 69 6c 6c 20 61 74 74 65 6d 70 74 20  we will attempt 
16110 74 6f 20 61 75 74 68 65 6e 74 69 63 61 74 65 20  to authenticate 
16120 75 73 69 6e 67 20 74 68 65 20 50 49 56 20 41 70  using the PIV Ap
16130 70 6c 69 63 61 74 69 6f 6e 20 6b 65 79 20 72 65  plication key re
16140 66 65 72 65 6e 63 65 22 29 3b 0a 0a 09 09 09 09  ference");......
16150 6b 65 79 5f 72 65 66 65 72 65 6e 63 65 20 3d 20  key_reference = 
16160 30 78 38 30 3b 0a 09 09 09 09 62 72 65 61 6b 3b  0x80;.....break;
16170 0a 09 09 09 64 65 66 61 75 6c 74 3a 0a 09 09 09  ....default:....
16180 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09 63  .break;...}....c
16190 61 63 6b 65 79 5f 66 72 65 65 5f 63 65 72 74 73  ackey_free_certs
161a0 28 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73  (pcsc_identities
161b0 2c 20 6e 75 6d 5f 63 65 72 74 73 2c 20 31 29 3b  , num_certs, 1);
161c0 0a 09 7d 0a 0a 09 2f 2a 20 49 73 73 75 65 20 61  ..}.../* Issue a
161d0 20 53 65 74 20 50 49 4e 20 28 43 48 41 4e 47 45   Set PIN (CHANGE
161e0 20 52 45 46 45 52 45 4e 43 45 29 20 2a 2f 0a 09   REFERENCE) */..
161f0 73 65 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b 65  send_ret = cacke
16200 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f 74  y_send_apdu(slot
16210 2c 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 49 53  , GSCIS_CLASS_IS
16220 4f 37 38 31 36 2c 20 47 53 43 49 53 5f 49 4e 53  O7816, GSCIS_INS
16230 54 52 5f 43 48 41 4e 47 45 5f 52 45 46 45 52 45  TR_CHANGE_REFERE
16240 4e 43 45 2c 20 30 78 30 30 2c 20 6b 65 79 5f 72  NCE, 0x00, key_r
16250 65 66 65 72 65 6e 63 65 2c 20 73 69 7a 65 6f 66  eference, sizeof
16260 28 70 69 6e 5f 75 70 64 61 74 65 29 2c 20 70 69  (pin_update), pi
16270 6e 5f 75 70 64 61 74 65 2c 20 30 78 30 30 2c 20  n_update, 0x00, 
16280 26 72 65 73 70 6f 6e 73 65 5f 63 6f 64 65 2c 20  &response_code, 
16290 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 69  NULL, NULL);...i
162a0 66 20 28 73 65 6e 64 5f 72 65 74 20 21 3d 20 43  f (send_ret != C
162b0 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29  ACKEY_PCSC_S_OK)
162c0 20 7b 0a 09 09 69 66 20 28 28 72 65 73 70 6f 6e   {...if ((respon
162d0 73 65 5f 63 6f 64 65 20 26 20 30 78 36 33 43 30  se_code & 0x63C0
162e0 29 20 3d 3d 20 30 78 36 33 43 30 29 20 7b 0a 09  ) == 0x63C0) {..
162f0 09 09 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e  ..tries_remainin
16300 67 20 3d 20 28 72 65 73 70 6f 6e 73 65 5f 63 6f  g = (response_co
16310 64 65 20 26 20 30 78 46 29 3b 0a 0a 09 09 09 43  de & 0xF);.....C
16320 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
16330 54 46 28 22 50 49 4e 20 56 65 72 69 66 69 63 61  TF("PIN Verifica
16340 74 69 6f 6e 20 66 61 69 6c 65 64 2c 20 25 69 20  tion failed, %i 
16350 74 72 69 65 73 20 72 65 6d 61 69 6e 69 6e 67 22  tries remaining"
16360 2c 20 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e  , tries_remainin
16370 67 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43  g);.....return(C
16380 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 42 41 44  ACKEY_PCSC_E_BAD
16390 50 49 4e 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 20  PIN);...}....if 
163a0 28 72 65 73 70 6f 6e 73 65 5f 63 6f 64 65 20 3d  (response_code =
163b0 3d 20 30 78 36 39 38 33 29 20 7b 0a 09 09 09 43  = 0x6983) {....C
163c0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
163d0 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 73 65  TF("Unable to se
163e0 74 20 50 49 4e 2c 20 64 65 76 69 63 65 20 69 73  t PIN, device is
163f0 20 6c 6f 63 6b 65 64 20 6f 72 20 63 68 61 6e 67   locked or chang
16400 69 6e 67 20 74 68 65 20 50 49 4e 20 69 73 20 64  ing the PIN is d
16410 69 73 61 62 6c 65 64 22 29 3b 0a 0a 09 09 09 72  isabled");.....r
16420 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
16430 43 5f 45 5f 4c 4f 43 4b 45 44 29 3b 0a 09 09 7d  C_E_LOCKED);...}
16440 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ....return(CACKE
16450 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43  Y_PCSC_E_GENERIC
16460 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
16470 45 42 55 47 5f 50 52 49 4e 54 46 28 22 50 49 4e  EBUG_PRINTF("PIN
16480 20 43 68 61 6e 67 65 20 73 75 63 63 65 65 64 65   Change succeede
16490 64 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41  d");...return(CA
164a0 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b  CKEY_PCSC_S_OK);
164b0 0a 0a 09 2f 2a 20 44 69 73 61 62 6c 65 20 61 20  .../* Disable a 
164c0 77 61 72 6e 69 6e 67 2c 20 73 69 6e 63 65 20 74  warning, since t
164d0 68 69 73 20 69 73 20 6f 6e 6c 79 20 75 73 65 64  his is only used
164e0 20 69 6e 20 64 65 62 75 67 20 6d 6f 64 65 20 2a   in debug mode *
164f0 2f 0a 09 74 72 69 65 73 5f 72 65 6d 61 69 6e 69  /..tries_remaini
16500 6e 67 20 3d 20 74 72 69 65 73 5f 72 65 6d 61 69  ng = tries_remai
16510 6e 69 6e 67 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53  ning;.}../*. * S
16520 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 2e  YNPOSIS. *     .
16530 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e  ... *. * ARGUMEN
16540 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a  TS. *     .... *
16550 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45  . * RETURN VALUE
16560 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20  . *     .... *. 
16570 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 2e  * NOTES. *     .
16580 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63  ... *. */.static
16590 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b   cackey_ret cack
165a0 65 79 5f 6c 6f 67 69 6e 28 73 74 72 75 63 74 20  ey_login(struct 
165b0 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f  cackey_slot *slo
165c0 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  t, unsigned char
165d0 20 2a 70 69 6e 2c 20 75 6e 73 69 67 6e 65 64 20   *pin, unsigned 
165e0 6c 6f 6e 67 20 70 69 6e 5f 6c 65 6e 2c 20 69 6e  long pin_len, in
165f0 74 20 2a 74 72 69 65 73 5f 72 65 6d 61 69 6e 69  t *tries_remaini
16600 6e 67 5f 70 2c 20 69 6e 74 20 72 65 74 72 69 65  ng_p, int retrie
16610 73 29 20 7b 0a 09 73 74 72 75 63 74 20 63 61 63  s) {..struct cac
16620 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74  key_pcsc_identit
16630 79 20 2a 70 63 73 63 5f 69 64 65 6e 74 69 74 69  y *pcsc_identiti
16640 65 73 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68  es;..unsigned ch
16650 61 72 20 63 61 63 5f 70 69 6e 5b 38 5d 20 3d 20  ar cac_pin[8] = 
16660 7b 30 78 46 46 2c 20 30 78 46 46 2c 20 30 78 46  {0xFF, 0xFF, 0xF
16670 46 2c 20 30 78 46 46 2c 20 30 78 46 46 2c 20 30  F, 0xFF, 0xFF, 0
16680 78 46 46 2c 20 30 78 46 46 2c 20 30 78 46 46 7d  xFF, 0xFF, 0xFF}
16690 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  ;..unsigned long
166a0 20 6e 75 6d 5f 63 65 72 74 73 3b 0a 09 75 69 6e   num_certs;..uin
166b0 74 31 36 5f 74 20 72 65 73 70 6f 6e 73 65 5f 63  t16_t response_c
166c0 6f 64 65 3b 0a 09 69 6e 74 20 74 72 69 65 73 5f  ode;..int tries_
166d0 72 65 6d 61 69 6e 69 6e 67 3b 0a 09 69 6e 74 20  remaining;..int 
166e0 73 65 6e 64 5f 72 65 74 3b 0a 09 69 6e 74 20 6b  send_ret;..int k
166f0 65 79 5f 72 65 66 65 72 65 6e 63 65 20 3d 20 30  ey_reference = 0
16700 78 30 30 2c 20 68 61 76 65 5f 70 69 76 20 3d 20  x00, have_piv = 
16710 30 3b 0a 09 63 61 63 6b 65 79 5f 72 65 74 20 63  0;..cackey_ret c
16720 6f 6e 6e 65 63 74 5f 72 65 74 2c 20 74 6f 6b 65  onnect_ret, toke
16730 6e 5f 72 65 74 3b 0a 0a 09 2f 2a 20 49 6e 64 69  n_ret;.../* Indi
16740 63 61 74 65 20 74 68 61 74 20 77 65 20 64 6f 20  cate that we do 
16750 6e 6f 74 20 6b 6e 6f 77 20 61 62 6f 75 74 20 68  not know about h
16760 6f 77 20 6d 61 6e 79 20 74 72 69 65 73 20 61 72  ow many tries ar
16770 65 20 72 65 6d 61 69 6e 69 6e 67 20 2a 2f 0a 09  e remaining */..
16780 69 66 20 28 74 72 69 65 73 5f 72 65 6d 61 69 6e  if (tries_remain
16790 69 6e 67 5f 70 29 20 7b 0a 09 09 2a 74 72 69 65  ing_p) {...*trie
167a0 73 5f 72 65 6d 61 69 6e 69 6e 67 5f 70 20 3d 20  s_remaining_p = 
167b0 2d 31 3b 0a 09 7d 0a 0a 09 2f 2a 20 41 70 70 61  -1;..}.../* Appa
167c0 72 65 6e 74 6c 79 2c 20 43 41 43 20 50 49 4e 73  rently, CAC PINs
167d0 20 61 72 65 20 2a 45 58 41 43 54 4c 59 2a 20 38   are *EXACTLY* 8
167e0 20 62 79 74 65 73 20 6c 6f 6e 67 20 2d 2d 20 70   bytes long -- p
167f0 61 64 20 77 69 74 68 20 30 78 46 46 20 69 66 20  ad with 0xFF if 
16800 74 6f 6f 20 73 68 6f 72 74 20 2a 2f 0a 09 69 66  too short */..if
16810 20 28 70 69 6e 5f 6c 65 6e 20 3e 3d 20 38 29 20   (pin_len >= 8) 
16820 7b 0a 09 09 6d 65 6d 63 70 79 28 63 61 63 5f 70  {...memcpy(cac_p
16830 69 6e 2c 20 70 69 6e 2c 20 38 29 3b 0a 09 7d 20  in, pin, 8);..} 
16840 65 6c 73 65 20 7b 0a 09 09 6d 65 6d 63 70 79 28  else {...memcpy(
16850 63 61 63 5f 70 69 6e 2c 20 70 69 6e 2c 20 70 69  cac_pin, pin, pi
16860 6e 5f 6c 65 6e 29 3b 0a 09 7d 0a 0a 09 2f 2a 20  n_len);..}.../* 
16870 52 65 6a 65 63 74 20 50 49 4e 73 20 77 68 69 63  Reject PINs whic
16880 68 20 61 72 65 20 74 6f 6f 20 73 68 6f 72 74 20  h are too short 
16890 2a 2f 0a 09 69 66 20 28 70 69 6e 5f 6c 65 6e 20  */..if (pin_len 
168a0 3c 20 35 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  < 5) {...CACKEY_
168b0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
168c0 6a 65 63 74 69 6e 67 20 50 49 4e 20 77 68 69 63  jecting PIN whic
168d0 68 20 69 73 20 74 6f 6f 20 73 68 6f 72 74 20 28  h is too short (
168e0 6c 65 6e 67 74 68 20 3d 20 25 6c 75 2c 20 6d 75  length = %lu, mu
168f0 73 74 20 62 65 20 61 74 6c 65 61 73 74 20 35 29  st be atleast 5)
16900 22 2c 20 70 69 6e 5f 6c 65 6e 29 3b 0a 0a 09 09  ", pin_len);....
16910 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
16920 53 43 5f 45 5f 42 41 44 50 49 4e 29 3b 0a 09 7d  SC_E_BADPIN);..}
16930 0a 0a 09 2f 2a 20 50 49 56 20 61 75 74 68 65 6e  .../* PIV authen
16940 74 69 63 61 74 69 6f 6e 20 75 73 65 73 20 61 20  tication uses a 
16950 22 6b 65 79 5f 72 65 66 65 72 65 6e 63 65 22 20  "key_reference" 
16960 6f 66 20 30 78 38 30 20 2a 2f 0a 09 70 63 73 63  of 0x80 */..pcsc
16970 5f 69 64 65 6e 74 69 74 69 65 73 20 3d 20 63 61  _identities = ca
16980 63 6b 65 79 5f 72 65 61 64 5f 63 65 72 74 73 28  ckey_read_certs(
16990 73 6c 6f 74 2c 20 4e 55 4c 4c 2c 20 26 6e 75 6d  slot, NULL, &num
169a0 5f 63 65 72 74 73 29 3b 0a 09 69 66 20 28 6e 75  _certs);..if (nu
169b0 6d 5f 63 65 72 74 73 20 3e 20 30 20 26 26 20 70  m_certs > 0 && p
169c0 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 20 21  csc_identities !
169d0 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 73 77 69 74  = NULL) {...swit
169e0 63 68 20 28 70 63 73 63 5f 69 64 65 6e 74 69 74  ch (pcsc_identit
169f0 69 65 73 5b 30 5d 2e 69 64 5f 74 79 70 65 29 20  ies[0].id_type) 
16a00 7b 0a 09 09 09 63 61 73 65 20 43 41 43 4b 45 59  {....case CACKEY
16a10 5f 49 44 5f 54 59 50 45 5f 50 49 56 3a 0a 09 09  _ID_TYPE_PIV:...
16a20 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
16a30 52 49 4e 54 46 28 22 57 65 20 68 61 76 65 20 50  RINTF("We have P
16a40 49 56 20 63 61 72 64 2c 20 73 6f 20 77 65 20 77  IV card, so we w
16a50 69 6c 6c 20 61 74 74 65 6d 70 74 20 74 6f 20 61  ill attempt to a
16a60 75 74 68 65 6e 74 69 63 61 74 65 20 75 73 69 6e  uthenticate usin
16a70 67 20 74 68 65 20 50 49 56 20 41 70 70 6c 69 63  g the PIV Applic
16a80 61 74 69 6f 6e 20 6b 65 79 20 72 65 66 65 72 65  ation key refere
16a90 6e 63 65 22 29 3b 0a 0a 09 09 09 09 68 61 76 65  nce");......have
16aa0 5f 70 69 76 20 3d 20 31 3b 0a 09 09 09 09 62 72  _piv = 1;.....br
16ab0 65 61 6b 3b 0a 09 09 09 64 65 66 61 75 6c 74 3a  eak;....default:
16ac0 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a  .....break;...}.
16ad0 0a 09 09 63 61 63 6b 65 79 5f 66 72 65 65 5f 63  ...cackey_free_c
16ae0 65 72 74 73 28 70 63 73 63 5f 69 64 65 6e 74 69  erts(pcsc_identi
16af0 74 69 65 73 2c 20 6e 75 6d 5f 63 65 72 74 73 2c  ties, num_certs,
16b00 20 31 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 61   1);..}...if (ha
16b10 76 65 5f 70 69 76 20 3d 3d 20 31 29 20 7b 0a 09  ve_piv == 1) {..
16b20 09 6b 65 79 5f 72 65 66 65 72 65 6e 63 65 20 3d  .key_reference =
16b30 20 30 78 38 30 3b 0a 09 7d 0a 0a 09 2f 2a 20 49   0x80;..}.../* I
16b40 73 73 75 65 20 50 49 4e 20 56 65 72 69 66 79 20  ssue PIN Verify 
16b50 2a 2f 0a 09 73 65 6e 64 5f 72 65 74 20 3d 20 63  */..send_ret = c
16b60 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28  ackey_send_apdu(
16b70 73 6c 6f 74 2c 20 47 53 43 49 53 5f 43 4c 41 53  slot, GSCIS_CLAS
16b80 53 5f 49 53 4f 37 38 31 36 2c 20 47 53 43 49 53  S_ISO7816, GSCIS
16b90 5f 49 4e 53 54 52 5f 56 45 52 49 46 59 2c 20 30  _INSTR_VERIFY, 0
16ba0 78 30 30 2c 20 6b 65 79 5f 72 65 66 65 72 65 6e  x00, key_referen
16bb0 63 65 2c 20 73 69 7a 65 6f 66 28 63 61 63 5f 70  ce, sizeof(cac_p
16bc0 69 6e 29 2c 20 63 61 63 5f 70 69 6e 2c 20 30 78  in), cac_pin, 0x
16bd0 30 30 2c 20 26 72 65 73 70 6f 6e 73 65 5f 63 6f  00, &response_co
16be0 64 65 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b  de, NULL, NULL);
16bf0 0a 0a 09 69 66 20 28 73 65 6e 64 5f 72 65 74 20  ...if (send_ret 
16c00 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  != CACKEY_PCSC_S
16c10 5f 4f 4b 29 20 7b 0a 09 09 69 66 20 28 28 72 65  _OK) {...if ((re
16c20 73 70 6f 6e 73 65 5f 63 6f 64 65 20 26 20 30 78  sponse_code & 0x
16c30 36 33 43 30 29 20 3d 3d 20 30 78 36 33 43 30 29  63C0) == 0x63C0)
16c40 20 7b 0a 09 09 09 74 72 69 65 73 5f 72 65 6d 61   {....tries_rema
16c50 69 6e 69 6e 67 20 3d 20 28 72 65 73 70 6f 6e 73  ining = (respons
16c60 65 5f 63 6f 64 65 20 26 20 30 78 46 29 3b 0a 0a  e_code & 0xF);..
16c70 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
16c80 50 52 49 4e 54 46 28 22 50 49 4e 20 56 65 72 69  PRINTF("PIN Veri
16c90 66 69 63 61 74 69 6f 6e 20 66 61 69 6c 65 64 2c  fication failed,
16ca0 20 25 69 20 74 72 69 65 73 20 72 65 6d 61 69 6e   %i tries remain
16cb0 69 6e 67 22 2c 20 74 72 69 65 73 5f 72 65 6d 61  ing", tries_rema
16cc0 69 6e 69 6e 67 29 3b 0a 0a 09 09 09 69 66 20 28  ining);.....if (
16cd0 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 5f  tries_remaining_
16ce0 70 29 20 7b 0a 09 09 09 09 2a 74 72 69 65 73 5f  p) {.....*tries_
16cf0 72 65 6d 61 69 6e 69 6e 67 5f 70 20 3d 20 74 72  remaining_p = tr
16d00 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 3b 0a 09  ies_remaining;..
16d10 09 09 7d 0a 0a 09 09 09 72 65 74 75 72 6e 28 43  ..}.....return(C
16d20 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 42 41 44  ACKEY_PCSC_E_BAD
16d30 50 49 4e 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 20  PIN);...}....if 
16d40 28 72 65 73 70 6f 6e 73 65 5f 63 6f 64 65 20 3d  (response_code =
16d50 3d 20 30 78 36 39 38 33 29 20 7b 0a 09 09 09 43  = 0x6983) {....C
16d60 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
16d70 54 46 28 22 50 49 4e 20 56 65 72 69 66 69 63 61  TF("PIN Verifica
16d80 74 69 6f 6e 20 66 61 69 6c 65 64 2c 20 64 65 76  tion failed, dev
16d90 69 63 65 20 69 73 20 6c 6f 63 6b 65 64 22 29 3b  ice is locked");
16da0 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b  .....return(CACK
16db0 45 59 5f 50 43 53 43 5f 45 5f 4c 4f 43 4b 45 44  EY_PCSC_E_LOCKED
16dc0 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 72 65  );...}....if (re
16dd0 73 70 6f 6e 73 65 5f 63 6f 64 65 20 3d 3d 20 30  sponse_code == 0
16de0 78 36 64 30 30 29 20 7b 0a 09 09 09 69 66 20 28  x6d00) {....if (
16df0 72 65 74 72 69 65 73 20 3e 20 30 29 20 7b 0a 09  retries > 0) {..
16e00 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
16e10 50 52 49 4e 54 46 28 22 47 6f 74 20 49 53 4f 20  PRINTF("Got ISO 
16e20 37 38 31 36 20 52 65 73 70 6f 6e 73 65 20 5c 22  7816 Response \"
16e30 36 44 20 30 30 5c 22 20 69 6e 20 72 65 73 70 6f  6D 00\" in respo
16e40 6e 73 65 20 74 6f 20 61 20 56 45 52 49 46 59 20  nse to a VERIFY 
16e50 72 65 71 75 65 73 74 2e 22 29 3b 0a 09 09 09 09  request.");.....
16e60 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
16e70 4e 54 46 28 22 57 65 20 64 69 64 20 6e 6f 74 20  NTF("We did not 
16e80 65 78 70 65 63 74 20 74 68 69 73 20 62 65 63 61  expect this beca
16e90 75 73 65 20 69 74 20 69 73 20 6e 6f 74 20 6d 65  use it is not me
16ea0 6e 74 69 6f 6e 65 64 20 69 6e 20 4e 49 53 54 20  ntioned in NIST 
16eb0 53 50 20 38 30 30 2d 37 33 2d 33 20 50 61 72 74  SP 800-73-3 Part
16ec0 20 32 20 53 65 63 74 69 6f 6e 20 33 2e 32 2e 31   2 Section 3.2.1
16ed0 20 6f 72 20 47 53 43 2d 49 53 20 76 32 2e 31 22   or GSC-IS v2.1"
16ee0 29 3b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  );.....CACKEY_DE
16ef0 42 55 47 5f 50 52 49 4e 54 46 28 22 57 65 20 61  BUG_PRINTF("We a
16f00 72 65 20 67 6f 69 6e 67 20 74 6f 20 74 72 79 20  re going to try 
16f10 74 6f 20 72 65 73 65 74 20 74 68 65 20 63 61 72  to reset the car
16f20 64 20 61 6e 64 20 73 65 6c 65 63 74 20 74 68 65  d and select the
16f30 20 61 70 70 6c 65 74 20 61 67 61 69 6e 2e 22 29   applet again.")
16f40 3b 0a 0a 09 09 09 09 63 61 63 6b 65 79 5f 6d 61  ;......cackey_ma
16f50 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74 28 73 6c  rk_slot_reset(sl
16f60 6f 74 29 3b 0a 0a 09 09 09 09 63 6f 6e 6e 65 63  ot);......connec
16f70 74 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 63  t_ret = cackey_c
16f80 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73 6c 6f 74  onnect_card(slot
16f90 29 3b 0a 09 09 09 09 69 66 20 28 63 6f 6e 6e 65  );.....if (conne
16fa0 63 74 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59  ct_ret != CACKEY
16fb0 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09  _PCSC_S_OK) {...
16fc0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
16fd0 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74  PRINTF("Unable t
16fe0 6f 20 72 65 63 6f 6e 6e 65 63 74 20 61 66 74 65  o reconnect afte
16ff0 72 20 72 65 73 65 74 74 69 6e 67 20 74 68 65 20  r resetting the 
17000 63 61 72 64 2c 20 72 65 74 75 72 6e 69 6e 67 20  card, returning 
17010 69 6e 20 65 72 72 6f 72 2e 22 29 3b 0a 0a 09 09  in error.");....
17020 09 09 09 72 65 74 75 72 6e 28 63 6f 6e 6e 65 63  ...return(connec
17030 74 5f 72 65 74 29 3b 0a 09 09 09 09 7d 0a 0a 09  t_ret);.....}...
17040 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
17050 50 52 49 4e 54 46 28 22 56 65 72 69 66 79 69 6e  PRINTF("Verifyin
17060 67 20 77 65 20 73 74 69 6c 6c 20 68 61 76 65 20  g we still have 
17070 61 20 74 6f 6b 65 6e 2e 22 29 3b 0a 09 09 09 09  a token.");.....
17080 74 6f 6b 65 6e 5f 72 65 74 20 3d 20 63 61 63 6b  token_ret = cack
17090 65 79 5f 74 6f 6b 65 6e 5f 70 72 65 73 65 6e 74  ey_token_present
170a0 28 73 6c 6f 74 29 3b 0a 09 09 09 09 69 66 20 28  (slot);.....if (
170b0 74 6f 6b 65 6e 5f 72 65 74 20 21 3d 20 43 41 43  token_ret != CAC
170c0 4b 45 59 5f 50 43 53 43 5f 53 5f 54 4f 4b 45 4e  KEY_PCSC_S_TOKEN
170d0 50 52 45 53 45 4e 54 29 20 7b 0a 09 09 09 09 09  PRESENT) {......
170e0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
170f0 4e 54 46 28 22 54 6f 6b 65 6e 20 6e 6f 74 20 70  NTF("Token not p
17100 72 65 73 65 6e 74 2c 20 72 65 74 75 72 6e 69 6e  resent, returnin
17110 67 20 69 6e 20 65 72 72 6f 72 2e 22 29 3b 0a 0a  g in error.");..
17120 09 09 09 09 09 72 65 74 75 72 6e 28 74 6f 6b 65  .....return(toke
17130 6e 5f 72 65 74 29 3b 0a 09 09 09 09 7d 0a 0a 0a  n_ret);.....}...
17140 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
17150 5f 50 52 49 4e 54 46 28 22 54 72 79 69 6e 67 20  _PRINTF("Trying 
17160 74 6f 20 6c 6f 67 69 6e 20 61 67 61 69 6e 22 29  to login again")
17170 3b 0a 09 09 09 09 72 65 74 75 72 6e 28 63 61 63  ;.....return(cac
17180 6b 65 79 5f 6c 6f 67 69 6e 28 73 6c 6f 74 2c 20  key_login(slot, 
17190 70 69 6e 2c 20 70 69 6e 5f 6c 65 6e 2c 20 74 72  pin, pin_len, tr
171a0 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 5f 70 2c  ies_remaining_p,
171b0 20 72 65 74 72 69 65 73 20 2d 20 31 29 29 3b 0a   retries - 1));.
171c0 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 72 65 74 75  ...}...}....retu
171d0 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  rn(CACKEY_PCSC_E
171e0 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09  _GENERIC);..}...
171f0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
17200 4e 54 46 28 22 50 49 4e 20 56 65 72 69 66 69 63  NTF("PIN Verific
17210 61 74 69 6f 6e 20 73 75 63 63 65 65 64 65 64 22  ation succeeded"
17220 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41 43 4b  );...return(CACK
17230 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d  EY_PCSC_S_OK);.}
17240 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53  ../*. * SYNPOSIS
17250 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20  . *     .... *. 
17260 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20  * ARGUMENTS. *  
17270 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54     .... *. * RET
17280 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20  URN VALUE. *    
17290 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53   .... *. * NOTES
172a0 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20  . *     .... *. 
172b0 2a 2f 0a 73 74 61 74 69 63 20 73 73 69 7a 65 5f  */.static ssize_
172c0 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64  t cackey_pcsc_id
172d0 65 6e 74 69 74 79 5f 74 6f 5f 6c 61 62 65 6c 28  entity_to_label(
172e0 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63  struct cackey_pc
172f0 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 69 64 65  sc_identity *ide
17300 6e 74 69 74 79 2c 20 75 6e 73 69 67 6e 65 64 20  ntity, unsigned 
17310 63 68 61 72 20 2a 6c 61 62 65 6c 5f 62 75 66 2c  char *label_buf,
17320 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c   unsigned long l
17330 61 62 65 6c 5f 62 75 66 5f 6c 65 6e 29 20 7b 0a  abel_buf_len) {.
17340 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 63  .unsigned long c
17350 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 3b 0a  ertificate_len;.
17360 09 76 6f 69 64 20 2a 6c 61 62 65 6c 5f 61 73 6e  .void *label_asn
17370 31 3b 0a 09 76 6f 69 64 20 2a 63 65 72 74 69 66  1;..void *certif
17380 69 63 61 74 65 3b 0a 09 69 6e 74 20 78 35 30 39  icate;..int x509
17390 5f 72 65 61 64 5f 72 65 74 3b 0a 0a 09 63 65 72  _read_ret;...cer
173a0 74 69 66 69 63 61 74 65 20 3d 20 69 64 65 6e 74  tificate = ident
173b0 69 74 79 2d 3e 63 65 72 74 69 66 69 63 61 74 65  ity->certificate
173c0 3b 0a 09 63 65 72 74 69 66 69 63 61 74 65 5f 6c  ;..certificate_l
173d0 65 6e 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e 63  en = identity->c
173e0 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 3b 0a  ertificate_len;.
173f0 0a 09 69 66 20 28 63 65 72 74 69 66 69 63 61 74  ..if (certificat
17400 65 5f 6c 65 6e 20 3c 20 30 29 20 7b 0a 09 09 72  e_len < 0) {...r
17410 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09  eturn(-1);..}...
17420 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3d 20  x509_read_ret = 
17430 78 35 30 39 5f 74 6f 5f 73 75 62 6a 65 63 74 28  x509_to_subject(
17440 63 65 72 74 69 66 69 63 61 74 65 2c 20 63 65 72  certificate, cer
17450 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c 20 28 76  tificate_len, (v
17460 6f 69 64 20 2a 2a 29 20 26 6c 61 62 65 6c 5f 61  oid **) &label_a
17470 73 6e 31 29 3b 0a 09 69 66 20 28 78 35 30 39 5f  sn1);..if (x509_
17480 72 65 61 64 5f 72 65 74 20 3c 20 30 29 20 7b 0a  read_ret < 0) {.
17490 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d  ..return(-1);..}
174a0 0a 0a 09 78 35 30 39 5f 72 65 61 64 5f 72 65 74  ...x509_read_ret
174b0 20 3d 20 78 35 30 39 5f 64 6e 5f 74 6f 5f 73 74   = x509_dn_to_st
174c0 72 69 6e 67 28 6c 61 62 65 6c 5f 61 73 6e 31 2c  ring(label_asn1,
174d0 20 78 35 30 39 5f 72 65 61 64 5f 72 65 74 2c 20   x509_read_ret, 
174e0 28 63 68 61 72 20 2a 29 20 6c 61 62 65 6c 5f 62  (char *) label_b
174f0 75 66 2c 20 6c 61 62 65 6c 5f 62 75 66 5f 6c 65  uf, label_buf_le
17500 6e 2c 20 22 43 4e 22 29 3b 0a 09 69 66 20 28 78  n, "CN");..if (x
17510 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3c 3d 20  509_read_ret <= 
17520 30 29 20 7b 0a 09 09 78 35 30 39 5f 72 65 61 64  0) {...x509_read
17530 5f 72 65 74 20 3d 20 78 35 30 39 5f 64 6e 5f 74  _ret = x509_dn_t
17540 6f 5f 73 74 72 69 6e 67 28 6c 61 62 65 6c 5f 61  o_string(label_a
17550 73 6e 31 2c 20 78 35 30 39 5f 72 65 61 64 5f 72  sn1, x509_read_r
17560 65 74 2c 20 28 63 68 61 72 20 2a 29 20 6c 61 62  et, (char *) lab
17570 65 6c 5f 62 75 66 2c 20 6c 61 62 65 6c 5f 62 75  el_buf, label_bu
17580 66 5f 6c 65 6e 2c 20 4e 55 4c 4c 29 3b 0a 0a 09  f_len, NULL);...
17590 09 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72  .if (x509_read_r
175a0 65 74 20 3c 3d 20 30 29 20 7b 0a 09 09 09 72 65  et <= 0) {....re
175b0 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 09 7d  turn(-1);...}..}
175c0 0a 0a 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f  ..#ifdef CACKEY_
175d0 50 41 52 41 4e 4f 49 44 0a 23 20 20 69 66 64 65  PARANOID.#  ifde
175e0 66 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d  f _POSIX_SSIZE_M
175f0 41 58 0a 09 69 66 20 28 78 35 30 39 5f 72 65 61  AX..if (x509_rea
17600 64 5f 72 65 74 20 3e 20 5f 50 4f 53 49 58 5f 53  d_ret > _POSIX_S
17610 53 49 5a 45 5f 4d 41 58 29 20 7b 0a 09 09 43 41  SIZE_MAX) {...CA
17620 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
17630 46 28 22 78 35 30 39 5f 72 65 61 64 5f 72 65 74  F("x509_read_ret
17640 20 65 78 63 65 65 64 73 20 6d 61 78 69 6d 75 6d   exceeds maximum
17650 20 76 61 6c 75 65 2c 20 72 65 74 75 72 6e 69 6e   value, returnin
17660 67 20 69 6e 20 66 61 69 6c 75 72 65 2e 20 28 6d  g in failure. (m
17670 61 78 20 3d 20 25 6c 69 2c 20 78 35 30 39 5f 72  ax = %li, x509_r
17680 65 61 64 5f 72 65 74 20 3d 20 25 6c 75 29 22 2c  ead_ret = %lu)",
17690 20 28 6c 6f 6e 67 29 20 5f 50 4f 53 49 58 5f 53   (long) _POSIX_S
176a0 53 49 5a 45 5f 4d 41 58 2c 20 28 75 6e 73 69 67  SIZE_MAX, (unsig
176b0 6e 65 64 20 6c 6f 6e 67 29 20 78 35 30 39 5f 72  ned long) x509_r
176c0 65 61 64 5f 72 65 74 29 3b 0a 0a 09 09 72 65 74  ead_ret);....ret
176d0 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 23 20 20 65  urn(-1);..}.#  e
176e0 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 09 72 65  ndif.#endif...re
176f0 74 75 72 6e 28 78 35 30 39 5f 72 65 61 64 5f 72  turn(x509_read_r
17700 65 74 29 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72  et);.}../* Retur
17710 6e 73 20 30 20 6f 6e 20 73 75 63 63 65 73 73 20  ns 0 on success 
17720 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 61  */.static int ca
17730 63 6b 65 79 5f 6d 75 74 65 78 5f 63 72 65 61 74  ckey_mutex_creat
17740 65 28 76 6f 69 64 20 2a 2a 6d 75 74 65 78 29 20  e(void **mutex) 
17750 7b 0a 09 70 74 68 72 65 61 64 5f 6d 75 74 65 78  {..pthread_mutex
17760 5f 74 20 2a 70 74 68 72 65 61 64 5f 6d 75 74 65  _t *pthread_mute
17770 78 3b 0a 09 69 6e 74 20 70 74 68 72 65 61 64 5f  x;..int pthread_
17780 72 65 74 76 61 6c 3b 0a 09 43 4b 5f 52 56 20 63  retval;..CK_RV c
17790 75 73 74 6f 6d 5f 72 65 74 76 61 6c 3b 0a 0a 09  ustom_retval;...
177a0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
177b0 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
177c0 0a 09 69 66 20 28 28 63 61 63 6b 65 79 5f 61 72  ..if ((cackey_ar
177d0 67 73 2e 66 6c 61 67 73 20 26 20 43 4b 46 5f 4f  gs.flags & CKF_O
177e0 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20 3d 3d  S_LOCKING_OK) ==
177f0 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f   CKF_OS_LOCKING_
17800 4f 4b 29 20 7b 0a 09 09 70 74 68 72 65 61 64 5f  OK) {...pthread_
17810 6d 75 74 65 78 20 3d 20 6d 61 6c 6c 6f 63 28 73  mutex = malloc(s
17820 69 7a 65 6f 66 28 2a 70 74 68 72 65 61 64 5f 6d  izeof(*pthread_m
17830 75 74 65 78 29 29 3b 0a 09 09 69 66 20 28 21 70  utex));...if (!p
17840 74 68 72 65 61 64 5f 6d 75 74 65 78 29 20 7b 0a  thread_mutex) {.
17850 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
17860 50 52 49 4e 54 46 28 22 46 61 69 6c 65 64 20 74  PRINTF("Failed t
17870 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72  o allocate memor
17880 79 2e 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e  y.");.....return
17890 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09 09 70 74 68  (-1);...}....pth
178a0 72 65 61 64 5f 72 65 74 76 61 6c 20 3d 20 70 74  read_retval = pt
178b0 68 72 65 61 64 5f 6d 75 74 65 78 5f 69 6e 69 74  hread_mutex_init
178c0 28 70 74 68 72 65 61 64 5f 6d 75 74 65 78 2c 20  (pthread_mutex, 
178d0 4e 55 4c 4c 29 3b 0a 09 09 69 66 20 28 70 74 68  NULL);...if (pth
178e0 72 65 61 64 5f 72 65 74 76 61 6c 20 21 3d 20 30  read_retval != 0
178f0 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
17900 42 55 47 5f 50 52 49 4e 54 46 28 22 70 74 68 72  BUG_PRINTF("pthr
17910 65 61 64 5f 6d 75 74 65 78 5f 69 6e 69 74 28 29  ead_mutex_init()
17920 20 72 65 74 75 72 6e 65 64 20 65 72 72 6f 72 20   returned error 
17930 28 25 69 29 2e 22 2c 20 70 74 68 72 65 61 64 5f  (%i).", pthread_
17940 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09 72 65 74  retval);.....ret
17950 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09 09  urn(-1);...}....
17960 2a 6d 75 74 65 78 20 3d 20 70 74 68 72 65 61 64  *mutex = pthread
17970 5f 6d 75 74 65 78 3b 0a 09 7d 20 65 6c 73 65 20  _mutex;..} else 
17980 7b 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 61  {...if (cackey_a
17990 72 67 73 2e 43 72 65 61 74 65 4d 75 74 65 78 29  rgs.CreateMutex)
179a0 20 7b 0a 09 09 09 63 75 73 74 6f 6d 5f 72 65 74   {....custom_ret
179b0 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 61 72 67  val = cackey_arg
179c0 73 2e 43 72 65 61 74 65 4d 75 74 65 78 28 6d 75  s.CreateMutex(mu
179d0 74 65 78 29 3b 0a 0a 09 09 09 69 66 20 28 63 75  tex);.....if (cu
179e0 73 74 6f 6d 5f 72 65 74 76 61 6c 20 21 3d 20 43  stom_retval != C
179f0 4b 52 5f 4f 4b 29 20 7b 0a 09 09 09 09 43 41 43  KR_OK) {.....CAC
17a00 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
17a10 28 22 63 61 63 6b 65 79 5f 61 72 67 73 2e 43 72  ("cackey_args.Cr
17a20 65 61 74 65 4d 75 74 65 78 28 29 20 72 65 74 75  eateMutex() retu
17a30 72 6e 65 64 20 65 72 72 6f 72 20 28 25 6c 69 29  rned error (%li)
17a40 2e 22 2c 20 28 6c 6f 6e 67 29 20 63 75 73 74 6f  .", (long) custo
17a50 6d 5f 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09 09  m_retval);......
17a60 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 09 7d  return(-1);....}
17a70 0a 09 09 7d 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ...}..}...CACKEY
17a80 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
17a90 65 74 75 72 6e 69 6e 67 20 73 75 63 65 73 73 66  eturning sucessf
17aa0 75 6c 6c 79 20 28 30 29 22 29 3b 0a 0a 09 72 65  ully (0)");...re
17ab0 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a 2f 2a 20 52  turn(0);.}../* R
17ac0 65 74 75 72 6e 73 20 30 20 6f 6e 20 73 75 63 63  eturns 0 on succ
17ad0 65 73 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ess */.static in
17ae0 74 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c  t cackey_mutex_l
17af0 6f 63 6b 28 76 6f 69 64 20 2a 6d 75 74 65 78 29  ock(void *mutex)
17b00 20 7b 0a 09 70 74 68 72 65 61 64 5f 6d 75 74 65   {..pthread_mute
17b10 78 5f 74 20 2a 70 74 68 72 65 61 64 5f 6d 75 74  x_t *pthread_mut
17b20 65 78 3b 0a 09 69 6e 74 20 70 74 68 72 65 61 64  ex;..int pthread
17b30 5f 72 65 74 76 61 6c 3b 0a 09 43 4b 5f 52 56 20  _retval;..CK_RV 
17b40 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 3b 0a 0a  custom_retval;..
17b50 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
17b60 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
17b70 0a 0a 09 69 66 20 28 28 63 61 63 6b 65 79 5f 61  ...if ((cackey_a
17b80 72 67 73 2e 66 6c 61 67 73 20 26 20 43 4b 46 5f  rgs.flags & CKF_
17b90 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20 3d  OS_LOCKING_OK) =
17ba0 3d 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47  = CKF_OS_LOCKING
17bb0 5f 4f 4b 29 20 7b 0a 09 09 70 74 68 72 65 61 64  _OK) {...pthread
17bc0 5f 6d 75 74 65 78 20 3d 20 6d 75 74 65 78 3b 0a  _mutex = mutex;.
17bd0 0a 09 09 70 74 68 72 65 61 64 5f 72 65 74 76 61  ...pthread_retva
17be0 6c 20 3d 20 70 74 68 72 65 61 64 5f 6d 75 74 65  l = pthread_mute
17bf0 78 5f 6c 6f 63 6b 28 70 74 68 72 65 61 64 5f 6d  x_lock(pthread_m
17c00 75 74 65 78 29 3b 0a 09 09 69 66 20 28 70 74 68  utex);...if (pth
17c10 72 65 61 64 5f 72 65 74 76 61 6c 20 21 3d 20 30  read_retval != 0
17c20 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
17c30 42 55 47 5f 50 52 49 4e 54 46 28 22 70 74 68 72  BUG_PRINTF("pthr
17c40 65 61 64 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 29  ead_mutex_lock()
17c50 20 72 65 74 75 72 6e 65 64 20 65 72 72 6f 72 20   returned error 
17c60 28 25 69 29 2e 22 2c 20 70 74 68 72 65 61 64 5f  (%i).", pthread_
17c70 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09 72 65 74  retval);.....ret
17c80 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 09 7d 20  urn(-1);...}..} 
17c90 65 6c 73 65 20 7b 0a 09 09 69 66 20 28 63 61 63  else {...if (cac
17ca0 6b 65 79 5f 61 72 67 73 2e 4c 6f 63 6b 4d 75 74  key_args.LockMut
17cb0 65 78 29 20 7b 0a 09 09 09 63 75 73 74 6f 6d 5f  ex) {....custom_
17cc0 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
17cd0 61 72 67 73 2e 4c 6f 63 6b 4d 75 74 65 78 28 6d  args.LockMutex(m
17ce0 75 74 65 78 29 3b 0a 0a 09 09 09 69 66 20 28 63  utex);.....if (c
17cf0 75 73 74 6f 6d 5f 72 65 74 76 61 6c 20 21 3d 20  ustom_retval != 
17d00 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 09 09 43 41  CKR_OK) {.....CA
17d10 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
17d20 46 28 22 63 61 63 6b 65 79 5f 61 72 67 73 2e 4c  F("cackey_args.L
17d30 6f 63 6b 4d 75 74 65 78 28 29 20 72 65 74 75 72  ockMutex() retur
17d40 6e 65 64 20 65 72 72 6f 72 20 28 25 6c 69 29 2e  ned error (%li).
17d50 22 2c 20 28 6c 6f 6e 67 29 20 63 75 73 74 6f 6d  ", (long) custom
17d60 5f 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09 09 72  _retval);......r
17d70 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 09 7d 0a  eturn(-1);....}.
17d80 09 09 7d 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  ..}..}...CACKEY_
17d90 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
17da0 74 75 72 6e 69 6e 67 20 73 75 63 65 73 73 66 75  turning sucessfu
17db0 6c 6c 79 20 28 30 29 22 29 3b 0a 0a 09 72 65 74  lly (0)");...ret
17dc0 75 72 6e 28 30 29 3b 0a 7d 0a 0a 2f 2a 20 52 65  urn(0);.}../* Re
17dd0 74 75 72 6e 73 20 30 20 6f 6e 20 73 75 63 63 65  turns 0 on succe
17de0 73 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ss */.static int
17df0 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e   cackey_mutex_un
17e00 6c 6f 63 6b 28 76 6f 69 64 20 2a 6d 75 74 65 78  lock(void *mutex
17e10 29 20 7b 0a 09 70 74 68 72 65 61 64 5f 6d 75 74  ) {..pthread_mut
17e20 65 78 5f 74 20 2a 70 74 68 72 65 61 64 5f 6d 75  ex_t *pthread_mu
17e30 74 65 78 3b 0a 09 69 6e 74 20 70 74 68 72 65 61  tex;..int pthrea
17e40 64 5f 72 65 74 76 61 6c 3b 0a 09 43 4b 5f 52 56  d_retval;..CK_RV
17e50 20 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 3b 0a   custom_retval;.
17e60 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
17e70 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
17e80 3b 0a 0a 09 69 66 20 28 28 63 61 63 6b 65 79 5f  ;...if ((cackey_
17e90 61 72 67 73 2e 66 6c 61 67 73 20 26 20 43 4b 46  args.flags & CKF
17ea0 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20  _OS_LOCKING_OK) 
17eb0 3d 3d 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e  == CKF_OS_LOCKIN
17ec0 47 5f 4f 4b 29 20 7b 0a 09 09 70 74 68 72 65 61  G_OK) {...pthrea
17ed0 64 5f 6d 75 74 65 78 20 3d 20 6d 75 74 65 78 3b  d_mutex = mutex;
17ee0 0a 0a 09 09 70 74 68 72 65 61 64 5f 72 65 74 76  ....pthread_retv
17ef0 61 6c 20 3d 20 70 74 68 72 65 61 64 5f 6d 75 74  al = pthread_mut
17f00 65 78 5f 75 6e 6c 6f 63 6b 28 70 74 68 72 65 61  ex_unlock(pthrea
17f10 64 5f 6d 75 74 65 78 29 3b 0a 09 09 69 66 20 28  d_mutex);...if (
17f20 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c 20 21  pthread_retval !
17f30 3d 20 30 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  = 0) {....CACKEY
17f40 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 70  _DEBUG_PRINTF("p
17f50 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 75 6e 6c  thread_mutex_unl
17f60 6f 63 6b 28 29 20 72 65 74 75 72 6e 65 64 20 65  ock() returned e
17f70 72 72 6f 72 20 28 25 69 29 2e 22 2c 20 70 74 68  rror (%i).", pth
17f80 72 65 61 64 5f 72 65 74 76 61 6c 29 3b 0a 0a 09  read_retval);...
17f90 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09  ..return(-1);...
17fa0 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69 66  }..} else {...if
17fb0 20 28 63 61 63 6b 65 79 5f 61 72 67 73 2e 55 6e   (cackey_args.Un
17fc0 6c 6f 63 6b 4d 75 74 65 78 29 20 7b 0a 09 09 09  lockMutex) {....
17fd0 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 20 3d 20  custom_retval = 
17fe0 63 61 63 6b 65 79 5f 61 72 67 73 2e 55 6e 6c 6f  cackey_args.Unlo
17ff0 63 6b 4d 75 74 65 78 28 6d 75 74 65 78 29 3b 0a  ckMutex(mutex);.
18000 0a 09 09 09 69 66 20 28 63 75 73 74 6f 6d 5f 72  ....if (custom_r
18010 65 74 76 61 6c 20 21 3d 20 43 4b 52 5f 4f 4b 29  etval != CKR_OK)
18020 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45   {.....CACKEY_DE
18030 42 55 47 5f 50 52 49 4e 54 46 28 22 63 61 63 6b  BUG_PRINTF("cack
18040 65 79 5f 61 72 67 73 2e 55 6e 6c 6f 63 6b 4d 75  ey_args.UnlockMu
18050 74 65 78 28 29 20 72 65 74 75 72 6e 65 64 20 65  tex() returned e
18060 72 72 6f 72 20 28 25 6c 69 29 2e 22 2c 20 28 6c  rror (%li).", (l
18070 6f 6e 67 29 20 63 75 73 74 6f 6d 5f 72 65 74 76  ong) custom_retv
18080 61 6c 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e  al);......return
18090 28 2d 31 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a 09  (-1);....}...}..
180a0 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
180b0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
180c0 6e 67 20 73 75 63 65 73 73 66 75 6c 6c 79 20 28  ng sucessfully (
180d0 30 29 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 30  0)");...return(0
180e0 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 43 4b 5f  );.}..static CK_
180f0 41 54 54 52 49 42 55 54 45 5f 50 54 52 20 63 61  ATTRIBUTE_PTR ca
18100 63 6b 65 79 5f 67 65 74 5f 61 74 74 72 69 62 75  ckey_get_attribu
18110 74 65 73 28 43 4b 5f 4f 42 4a 45 43 54 5f 43 4c  tes(CK_OBJECT_CL
18120 41 53 53 20 6f 62 6a 65 63 74 63 6c 61 73 73 2c  ASS objectclass,
18130 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70   struct cackey_p
18140 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 69 64  csc_identity *id
18150 65 6e 74 69 74 79 2c 20 75 6e 73 69 67 6e 65 64  entity, unsigned
18160 20 6c 6f 6e 67 20 69 64 65 6e 74 69 74 79 5f 6e   long identity_n
18170 75 6d 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52  um, CK_ULONG_PTR
18180 20 70 75 6c 43 6f 75 6e 74 29 20 7b 0a 09 73 74   pulCount) {..st
18190 61 74 69 63 20 43 4b 5f 42 42 4f 4f 4c 20 63 6b  atic CK_BBOOL ck
181a0 5f 74 72 75 65 20 3d 20 31 3b 0a 09 73 74 61 74  _true = 1;..stat
181b0 69 63 20 43 4b 5f 42 42 4f 4f 4c 20 63 6b 5f 66  ic CK_BBOOL ck_f
181c0 61 6c 73 65 20 3d 20 30 3b 0a 09 73 74 61 74 69  alse = 0;..stati
181d0 63 20 43 4b 5f 54 52 55 53 54 20 63 6b 5f 74 72  c CK_TRUST ck_tr
181e0 75 73 74 65 64 20 3d 20 43 4b 5f 54 52 55 53 54  usted = CK_TRUST
181f0 45 44 5f 44 45 4c 45 47 41 54 4f 52 3b 0a 09 43  ED_DELEGATOR;..C
18200 4b 5f 55 4c 4f 4e 47 20 6e 75 6d 61 74 74 72 73  K_ULONG numattrs
18210 20 3d 20 30 2c 20 72 65 74 76 61 6c 5f 63 6f 75   = 0, retval_cou
18220 6e 74 3b 0a 09 43 4b 5f 41 54 54 52 49 42 55 54  nt;..CK_ATTRIBUT
18230 45 5f 54 59 50 45 20 63 75 72 72 5f 61 74 74 72  E_TYPE curr_attr
18240 5f 74 79 70 65 3b 0a 09 43 4b 5f 41 54 54 52 49  _type;..CK_ATTRI
18250 42 55 54 45 20 63 75 72 72 5f 61 74 74 72 2c 20  BUTE curr_attr, 
18260 2a 72 65 74 76 61 6c 3b 0a 09 43 4b 5f 56 4f 49  *retval;..CK_VOI
18270 44 5f 50 54 52 20 70 56 61 6c 75 65 3b 0a 09 43  D_PTR pValue;..C
18280 4b 5f 55 4c 4f 4e 47 20 75 6c 56 61 6c 75 65 4c  K_ULONG ulValueL
18290 65 6e 3b 0a 09 43 4b 5f 4f 42 4a 45 43 54 5f 43  en;..CK_OBJECT_C
182a0 4c 41 53 53 20 63 6b 5f 6f 62 6a 65 63 74 5f 63  LASS ck_object_c
182b0 6c 61 73 73 3b 0a 09 43 4b 5f 43 45 52 54 49 46  lass;..CK_CERTIF
182c0 49 43 41 54 45 5f 54 59 50 45 20 63 6b 5f 63 65  ICATE_TYPE ck_ce
182d0 72 74 69 66 69 63 61 74 65 5f 74 79 70 65 3b 0a  rtificate_type;.
182e0 09 43 4b 5f 4b 45 59 5f 54 59 50 45 20 63 6b 5f  .CK_KEY_TYPE ck_
182f0 6b 65 79 5f 74 79 70 65 3b 0a 09 43 4b 5f 55 54  key_type;..CK_UT
18300 46 38 43 48 41 52 20 75 63 54 6d 70 42 75 66 5b  F8CHAR ucTmpBuf[
18310 31 30 32 34 5d 3b 0a 09 53 48 41 31 43 6f 6e 74  1024];..SHA1Cont
18320 65 78 74 20 73 68 61 31 5f 63 74 78 3b 0a 09 4d  ext sha1_ctx;..M
18330 44 35 5f 43 54 58 20 6d 64 35 5f 63 74 78 3b 0a  D5_CTX md5_ctx;.
18340 09 75 69 6e 74 38 5f 74 20 73 68 61 31 5f 68 61  .uint8_t sha1_ha
18350 73 68 5b 53 48 41 31 48 61 73 68 53 69 7a 65 5d  sh[SHA1HashSize]
18360 3b 0a 09 75 69 6e 74 38 5f 74 20 6d 64 35 5f 68  ;..uint8_t md5_h
18370 61 73 68 5b 4d 44 35 48 61 73 68 53 69 7a 65 5d  ash[MD5HashSize]
18380 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72  ;..unsigned char
18390 20 2a 63 65 72 74 69 66 69 63 61 74 65 3b 0a 09   *certificate;..
183a0 73 73 69 7a 65 5f 74 20 63 65 72 74 69 66 69 63  ssize_t certific
183b0 61 74 65 5f 6c 65 6e 20 3d 20 2d 31 2c 20 78 35  ate_len = -1, x5
183c0 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09 69 6e  09_read_ret;..in
183d0 74 20 70 56 61 6c 75 65 5f 66 72 65 65 3b 0a 0a  t pValue_free;..
183e0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
183f0 49 4e 54 46 28 22 43 61 6c 6c 65 64 20 28 6f 62  INTF("Called (ob
18400 6a 65 63 74 43 6c 61 73 73 20 3d 20 25 6c 75 2c  jectClass = %lu,
18410 20 69 64 65 6e 74 69 74 79 5f 6e 75 6d 20 3d 20   identity_num = 
18420 25 6c 75 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65  %lu).", (unsigne
18430 64 20 6c 6f 6e 67 29 20 6f 62 6a 65 63 74 63 6c  d long) objectcl
18440 61 73 73 2c 20 69 64 65 6e 74 69 74 79 5f 6e 75  ass, identity_nu
18450 6d 29 3b 0a 0a 09 2a 70 75 6c 43 6f 75 6e 74 20  m);...*pulCount 
18460 3d 20 30 3b 0a 0a 09 69 66 20 28 6f 62 6a 65 63  = 0;...if (objec
18470 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 43 45  tclass != CKO_CE
18480 52 54 49 46 49 43 41 54 45 20 26 26 20 6f 62 6a  RTIFICATE && obj
18490 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f  ectclass != CKO_
184a0 50 55 42 4c 49 43 5f 4b 45 59 20 26 26 20 6f 62  PUBLIC_KEY && ob
184b0 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f  jectclass != CKO
184c0 5f 50 52 49 56 41 54 45 5f 4b 45 59 20 26 26 20  _PRIVATE_KEY && 
184d0 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43  objectclass != C
184e0 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53  KO_NETSCAPE_TRUS
184f0 54 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  T) {...CACKEY_DE
18500 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
18510 72 6e 69 6e 67 20 30 20 6f 62 6a 65 63 74 73 20  rning 0 objects 
18520 28 4e 55 4c 4c 29 2c 20 69 6e 76 61 6c 69 64 20  (NULL), invalid 
18530 6f 62 6a 65 63 74 20 63 6c 61 73 73 22 29 3b 0a  object class");.
18540 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b  ...return(NULL);
18550 0a 09 7d 0a 0a 09 2f 2a 20 47 65 74 20 43 65 72  ..}.../* Get Cer
18560 74 20 2a 2f 0a 09 69 66 20 28 69 64 65 6e 74 69  t */..if (identi
18570 74 79 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  ty == NULL) {...
18580 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
18590 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 30  NTF("Returning 0
185a0 20 6f 62 6a 65 63 74 73 20 28 4e 55 4c 4c 29 2c   objects (NULL),
185b0 20 69 6e 76 61 6c 69 64 20 69 64 65 6e 74 69 79   invalid identiy
185c0 20 70 72 6f 76 69 64 65 64 22 29 3b 0a 0a 09 09   provided");....
185d0 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d  return(NULL);..}
185e0 0a 0a 09 63 65 72 74 69 66 69 63 61 74 65 20 3d  ...certificate =
185f0 20 69 64 65 6e 74 69 74 79 2d 3e 63 65 72 74 69   identity->certi
18600 66 69 63 61 74 65 3b 0a 09 63 65 72 74 69 66 69  ficate;..certifi
18610 63 61 74 65 5f 6c 65 6e 20 3d 20 69 64 65 6e 74  cate_len = ident
18620 69 74 79 2d 3e 63 65 72 74 69 66 69 63 61 74 65  ity->certificate
18630 5f 6c 65 6e 3b 0a 0a 09 69 66 20 28 63 65 72 74  _len;...if (cert
18640 69 66 69 63 61 74 65 5f 6c 65 6e 20 3d 3d 20 2d  ificate_len == -
18650 31 20 7c 7c 20 63 65 72 74 69 66 69 63 61 74 65  1 || certificate
18660 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
18670 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
18680 46 28 22 52 65 74 75 72 6e 69 6e 67 20 30 20 6f  F("Returning 0 o
18690 62 6a 65 63 74 73 20 28 4e 55 4c 4c 29 2c 20 74  bjects (NULL), t
186a0 68 69 73 20 69 64 65 6e 74 69 74 79 20 64 6f 65  his identity doe
186b0 73 20 6e 6f 74 20 68 61 76 65 20 61 6e 20 58 2e  s not have an X.
186c0 35 30 39 20 63 65 72 74 69 66 69 63 61 74 65 20  509 certificate 
186d0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
186e0 69 74 20 61 6e 64 20 77 69 6c 6c 20 6e 6f 74 20  it and will not 
186f0 77 6f 72 6b 22 29 3b 0a 0a 09 09 72 65 74 75 72  work");....retur
18700 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 2f 2a  n(NULL);..}.../*
18710 20 56 65 72 69 66 79 20 74 68 61 74 20 63 65 72   Verify that cer
18720 74 69 66 69 63 61 74 65 20 69 73 20 41 53 4e 2e  tificate is ASN.
18730 31 20 65 6e 63 6f 64 65 64 20 58 2e 35 30 39 20  1 encoded X.509 
18740 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 09  certificate */..
18750 69 66 20 28 78 35 30 39 5f 74 6f 5f 73 65 72 69  if (x509_to_seri
18760 61 6c 28 63 65 72 74 69 66 69 63 61 74 65 2c 20  al(certificate, 
18770 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c  certificate_len,
18780 20 4e 55 4c 4c 29 20 3c 20 30 29 20 7b 0a 09 09   NULL) < 0) {...
18790 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
187a0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 30  NTF("Returning 0
187b0 20 6f 62 6a 65 63 74 73 20 28 4e 55 4c 4c 29 2c   objects (NULL),
187c0 20 74 68 65 20 58 2e 35 30 39 20 63 65 72 74 69   the X.509 certi
187d0 66 69 63 61 74 65 20 61 73 73 6f 63 69 61 74 65  ficate associate
187e0 64 20 77 69 74 68 20 74 68 69 73 20 69 64 65 6e  d with this iden
187f0 74 69 74 79 20 69 73 20 6e 6f 74 20 76 61 6c 69  tity is not vali
18800 64 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e  d");....return(N
18810 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 72 65 74 76 61  ULL);..}...retva
18820 6c 5f 63 6f 75 6e 74 20 3d 20 36 34 3b 0a 09 72  l_count = 64;..r
18830 65 74 76 61 6c 20 3d 20 6d 61 6c 6c 6f 63 28 72  etval = malloc(r
18840 65 74 76 61 6c 5f 63 6f 75 6e 74 20 2a 20 73 69  etval_count * si
18850 7a 65 6f 66 28 2a 72 65 74 76 61 6c 29 29 3b 0a  zeof(*retval));.
18860 0a 09 66 6f 72 20 28 63 75 72 72 5f 61 74 74 72  ..for (curr_attr
18870 5f 74 79 70 65 20 3d 20 30 3b 20 63 75 72 72 5f  _type = 0; curr_
18880 61 74 74 72 5f 74 79 70 65 20 3c 20 30 78 63 65  attr_type < 0xce
18890 35 33 36 33 62 66 3b 20 63 75 72 72 5f 61 74 74  5363bf; curr_att
188a0 72 5f 74 79 70 65 2b 2b 29 20 7b 0a 09 09 69 66  r_type++) {...if
188b0 20 28 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65   (curr_attr_type
188c0 20 3d 3d 20 30 78 38 30 30 29 20 7b 0a 09 09 09   == 0x800) {....
188d0 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 20 3d  curr_attr_type =
188e0 20 30 78 63 65 35 33 36 33 30 30 3b 0a 09 09 7d   0xce536300;...}
188f0 0a 0a 09 09 70 56 61 6c 75 65 5f 66 72 65 65 20  ....pValue_free 
18900 3d 20 30 3b 0a 09 09 70 56 61 6c 75 65 20 3d 20  = 0;...pValue = 
18910 4e 55 4c 4c 3b 0a 09 09 75 6c 56 61 6c 75 65 4c  NULL;...ulValueL
18920 65 6e 20 3d 20 28 43 4b 5f 4c 4f 4e 47 29 20 2d  en = (CK_LONG) -
18930 31 3b 0a 0a 09 09 73 77 69 74 63 68 20 28 63 75  1;....switch (cu
18940 72 72 5f 61 74 74 72 5f 74 79 70 65 29 20 7b 0a  rr_attr_type) {.
18950 09 09 09 63 61 73 65 20 43 4b 41 5f 43 4c 41 53  ...case CKA_CLAS
18960 53 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  S:.....CACKEY_DE
18970 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75  BUG_PRINTF("Requ
18980 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65  esting attribute
18990 20 43 4b 41 5f 43 4c 41 53 53 20 28 30 78 25 30   CKA_CLASS (0x%0
189a0 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69  8lx) ...", (unsi
189b0 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f  gned long) curr_
189c0 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09  attr_type);.....
189d0 09 63 6b 5f 6f 62 6a 65 63 74 5f 63 6c 61 73 73  .ck_object_class
189e0 20 3d 20 6f 62 6a 65 63 74 63 6c 61 73 73 3b 0a   = objectclass;.
189f0 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63  .....pValue = &c
18a00 6b 5f 6f 62 6a 65 63 74 5f 63 6c 61 73 73 3b 0a  k_object_class;.
18a10 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ....ulValueLen =
18a20 20 73 69 7a 65 6f 66 28 63 6b 5f 6f 62 6a 65 63   sizeof(ck_objec
18a30 74 5f 63 6c 61 73 73 29 3b 0a 0a 09 09 09 09 43  t_class);......C
18a40 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
18a50 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69  TF(" ... returni
18a60 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22  ng %lu (%p/%lu)"
18a70 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
18a80 29 20 2a 28 28 43 4b 5f 4f 42 4a 45 43 54 5f 43  ) *((CK_OBJECT_C
18a90 4c 41 53 53 20 2a 29 20 70 56 61 6c 75 65 29 2c  LASS *) pValue),
18aa0 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e   pValue, (unsign
18ab0 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65  ed long) ulValue
18ac0 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b  Len);......break
18ad0 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 54 4f  ;....case CKA_TO
18ae0 4b 45 4e 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f  KEN:.....CACKEY_
18af0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
18b00 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75  questing attribu
18b10 74 65 20 43 4b 41 5f 54 4f 4b 45 4e 20 28 30 78  te CKA_TOKEN (0x
18b20 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e  %08lx) ...", (un
18b30 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72  signed long) cur
18b40 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09  r_attr_type);...
18b50 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f  ...pValue = &ck_
18b60 74 72 75 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75  true;.....ulValu
18b70 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b  eLen = sizeof(ck
18b80 5f 74 72 75 65 29 3b 0a 0a 09 09 09 09 43 41 43  _true);......CAC
18b90 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
18ba0 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67  (" ... returning
18bb0 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20   %lu (%p/%lu)", 
18bc0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
18bd0 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70  *((CK_BBOOL *) p
18be0 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20  Value), pValue, 
18bf0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
18c00 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09  ulValueLen);....
18c10 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
18c20 20 43 4b 41 5f 50 52 49 56 41 54 45 3a 0a 09 09   CKA_PRIVATE:...
18c30 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
18c40 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e  RINTF("Requestin
18c50 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f  g attribute CKA_
18c60 50 52 49 56 41 54 45 20 28 30 78 25 30 38 6c 78  PRIVATE (0x%08lx
18c70 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65  ) ...", (unsigne
18c80 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74  d long) curr_att
18c90 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66  r_type);......if
18ca0 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d   (objectclass !=
18cb0 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52   CKO_NETSCAPE_TR
18cc0 55 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b  UST) {......CACK
18cd0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
18ce0 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65  " ... but not ge
18cf0 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65  tting it because
18d00 20 77 65 20 61 72 65 20 6e 6f 74 20 61 20 4e 65   we are not a Ne
18d10 74 73 63 61 70 65 20 74 72 75 73 74 20 6f 62 6a  tscape trust obj
18d20 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62 72 65  ect");.......bre
18d30 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 70  ak;.....}......p
18d40 56 61 6c 75 65 20 3d 20 26 63 6b 5f 66 61 6c 73  Value = &ck_fals
18d50 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65  e;.....ulValueLe
18d60 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 66 61  n = sizeof(ck_fa
18d70 6c 73 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45  lse);......CACKE
18d80 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
18d90 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25   ... returning %
18da0 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75  lu (%p/%lu)", (u
18db0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28  nsigned long) *(
18dc0 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61  (CK_BBOOL *) pVa
18dd0 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75  lue), pValue, (u
18de0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c  nsigned long) ul
18df0 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09  ValueLen);......
18e00 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43  break;....case C
18e10 4b 41 5f 54 52 55 53 54 45 44 3a 0a 09 09 09 09  KA_TRUSTED:.....
18e20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
18e30 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20  NTF("Requesting 
18e40 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 54 52  attribute CKA_TR
18e50 55 53 54 45 44 20 28 30 78 25 30 38 6c 78 29 20  USTED (0x%08lx) 
18e60 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  ...", (unsigned 
18e70 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f  long) curr_attr_
18e80 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28  type);......if (
18e90 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43  objectclass == C
18ea0 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53  KO_NETSCAPE_TRUS
18eb0 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59  T) {......CACKEY
18ec0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
18ed0 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74  ... but not gett
18ee0 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77  ing it because w
18ef0 65 20 61 72 65 20 61 20 4e 65 74 73 63 61 70 65  e are a Netscape
18f00 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29 3b   trust object");
18f10 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .......break;...
18f20 09 09 7d 0a 0a 09 09 09 09 70 56 61 6c 75 65 20  ..}......pValue 
18f30 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09 09 09 09  = &ck_true;.....
18f40 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a  ulValueLen = siz
18f50 65 6f 66 28 63 6b 5f 74 72 75 65 29 3b 0a 0a 09  eof(ck_true);...
18f60 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
18f70 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74  PRINTF(" ... ret
18f80 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25  urning %lu (%p/%
18f90 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  lu)", (unsigned 
18fa0 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f  long) *((CK_BBOO
18fb0 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56  L *) pValue), pV
18fc0 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20  alue, (unsigned 
18fd0 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e  long) ulValueLen
18fe0 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  );......break;..
18ff0 09 09 63 61 73 65 20 43 4b 41 5f 4d 4f 44 49 46  ..case CKA_MODIF
19000 49 41 42 4c 45 3a 0a 09 09 09 09 43 41 43 4b 45  IABLE:.....CACKE
19010 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
19020 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69  Requesting attri
19030 62 75 74 65 20 43 4b 41 5f 4d 4f 44 49 46 49 41  bute CKA_MODIFIA
19040 42 4c 45 20 28 30 78 25 30 38 6c 78 29 20 2e 2e  BLE (0x%08lx) ..
19050 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  .", (unsigned lo
19060 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79  ng) curr_attr_ty
19070 70 65 29 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65  pe);......pValue
19080 20 3d 20 26 63 6b 5f 66 61 6c 73 65 3b 0a 09 09   = &ck_false;...
19090 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73  ..ulValueLen = s
190a0 69 7a 65 6f 66 28 63 6b 5f 66 61 6c 73 65 29 3b  izeof(ck_false);
190b0 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
190c0 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
190d0 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25  returning %lu (%
190e0 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e  p/%lu)", (unsign
190f0 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42  ed long) *((CK_B
19100 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c  BOOL *) pValue),
19110 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e   pValue, (unsign
19120 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65  ed long) ulValue
19130 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b  Len);......break
19140 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 4c 41  ;....case CKA_LA
19150 42 45 4c 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f  BEL:.....CACKEY_
19160 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
19170 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75  questing attribu
19180 74 65 20 43 4b 41 5f 4c 41 42 45 4c 20 28 30 78  te CKA_LABEL (0x
19190 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e  %08lx) ...", (un
191a0 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72  signed long) cur
191b0 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09  r_attr_type);...
191c0 09 09 09 69 66 20 28 69 64 65 6e 74 69 74 79 2d  ...if (identity-
191d0 3e 69 64 5f 74 79 70 65 20 3d 3d 20 43 41 43 4b  >id_type == CACK
191e0 45 59 5f 49 44 5f 54 59 50 45 5f 50 49 56 29 20  EY_ID_TYPE_PIV) 
191f0 7b 0a 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20  {......pValue = 
19200 69 64 65 6e 74 69 74 79 2d 3e 63 61 72 64 2e 70  identity->card.p
19210 69 76 2e 6c 61 62 65 6c 3b 0a 09 09 09 09 09 75  iv.label;......u
19220 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 74 72 6c  lValueLen = strl
19230 65 6e 28 70 56 61 6c 75 65 29 3b 0a 09 09 09 09  en(pValue);.....
19240 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 75 6c  } else {......ul
19250 56 61 6c 75 65 4c 65 6e 20 3d 20 73 6e 70 72 69  ValueLen = snpri
19260 6e 74 66 28 28 63 68 61 72 20 2a 29 20 75 63 54  ntf((char *) ucT
19270 6d 70 42 75 66 2c 20 73 69 7a 65 6f 66 28 75 63  mpBuf, sizeof(uc
19280 54 6d 70 42 75 66 29 2c 20 22 49 64 65 6e 74 69  TmpBuf), "Identi
19290 74 79 20 23 25 6c 75 22 2c 20 28 75 6e 73 69 67  ty #%lu", (unsig
192a0 6e 65 64 20 6c 6f 6e 67 29 20 69 64 65 6e 74 69  ned long) identi
192b0 74 79 5f 6e 75 6d 29 3b 0a 09 09 09 09 09 70 56  ty_num);......pV
192c0 61 6c 75 65 20 3d 20 75 63 54 6d 70 42 75 66 3b  alue = ucTmpBuf;
192d0 0a 0a 09 09 09 09 09 69 66 20 28 75 6c 56 61 6c  .......if (ulVal
192e0 75 65 4c 65 6e 20 3e 3d 20 73 69 7a 65 6f 66 28  ueLen >= sizeof(
192f0 75 63 54 6d 70 42 75 66 29 29 20 7b 0a 09 09 09  ucTmpBuf)) {....
19300 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  ...ulValueLen = 
19310 30 3b 0a 09 09 09 09 09 09 70 56 61 6c 75 65 20  0;.......pValue 
19320 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 7d 0a 09  = NULL;......}..
19330 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59  ...}......CACKEY
19340 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
19350 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 28 25  ... returning (%
19360 70 2f 25 6c 75 29 22 2c 20 70 56 61 6c 75 65 2c  p/%lu)", pValue,
19370 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
19380 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09   ulValueLen);...
19390 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
193a0 65 20 43 4b 41 5f 56 41 4c 55 45 3a 0a 09 09 09  e CKA_VALUE:....
193b0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
193c0 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67  INTF("Requesting
193d0 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 56   attribute CKA_V
193e0 41 4c 55 45 20 28 30 78 25 30 38 6c 78 29 20 2e  ALUE (0x%08lx) .
193f0 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ..", (unsigned l
19400 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74  ong) curr_attr_t
19410 79 70 65 29 3b 0a 0a 09 09 09 09 73 77 69 74 63  ype);......switc
19420 68 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 29 20  h (objectclass) 
19430 7b 0a 09 09 09 09 09 63 61 73 65 20 43 4b 4f 5f  {......case CKO_
19440 50 52 49 56 41 54 45 5f 4b 45 59 3a 0a 09 09 09  PRIVATE_KEY:....
19450 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
19460 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74  PRINTF(" ... but
19470 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20   not getting it 
19480 62 65 63 61 75 73 65 20 77 65 20 61 72 65 20 61  because we are a
19490 20 70 72 69 76 61 74 65 20 6b 65 79 2e 22 29 3b   private key.");
194a0 0a 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09  ........break;..
194b0 09 09 09 09 63 61 73 65 20 43 4b 4f 5f 4e 45 54  ....case CKO_NET
194c0 53 43 41 50 45 5f 54 52 55 53 54 3a 0a 09 09 09  SCAPE_TRUST:....
194d0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
194e0 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74  PRINTF(" ... but
194f0 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20   not getting it 
19500 62 65 63 61 75 73 65 20 77 65 20 61 72 65 20 61  because we are a
19510 20 4e 65 74 73 63 61 70 65 20 74 72 75 73 74 20   Netscape trust 
19520 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09  object");.......
19530 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 63 61 73  .break;......cas
19540 65 20 43 4b 4f 5f 50 55 42 4c 49 43 5f 4b 45 59  e CKO_PUBLIC_KEY
19550 3a 0a 09 09 09 09 09 09 69 66 20 28 63 65 72 74  :.......if (cert
19560 69 66 69 63 61 74 65 5f 6c 65 6e 20 3e 3d 20 30  ificate_len >= 0
19570 29 20 7b 0a 09 09 09 09 09 09 09 78 35 30 39 5f  ) {........x509_
19580 72 65 61 64 5f 72 65 74 20 3d 20 78 35 30 39 5f  read_ret = x509_
19590 74 6f 5f 70 75 62 6b 65 79 28 63 65 72 74 69 66  to_pubkey(certif
195a0 69 63 61 74 65 2c 20 63 65 72 74 69 66 69 63 61  icate, certifica
195b0 74 65 5f 6c 65 6e 2c 20 26 70 56 61 6c 75 65 29  te_len, &pValue)
195c0 3b 0a 09 09 09 09 09 09 09 69 66 20 28 78 35 30  ;........if (x50
195d0 39 5f 72 65 61 64 5f 72 65 74 20 3c 20 30 29 20  9_read_ret < 0) 
195e0 7b 20 0a 09 09 09 09 09 09 09 09 70 56 61 6c 75  { .........pValu
195f0 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 09  e = NULL;.......
19600 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09  .} else {.......
19610 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 78  ..ulValueLen = x
19620 35 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09 09  509_read_ret;...
19630 09 09 09 09 09 7d 0a 09 09 09 09 09 09 7d 0a 0a  .....}.......}..
19640 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
19650 09 09 63 61 73 65 20 43 4b 4f 5f 43 45 52 54 49  ..case CKO_CERTI
19660 46 49 43 41 54 45 3a 0a 09 09 09 09 09 09 70 56  FICATE:.......pV
19670 61 6c 75 65 20 3d 20 63 65 72 74 69 66 69 63 61  alue = certifica
19680 74 65 3b 0a 09 09 09 09 09 09 75 6c 56 61 6c 75  te;.......ulValu
19690 65 4c 65 6e 20 3d 20 63 65 72 74 69 66 69 63 61  eLen = certifica
196a0 74 65 5f 6c 65 6e 3b 0a 0a 09 09 09 09 09 09 62  te_len;........b
196b0 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09  reak;.....}.....
196c0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
196d0 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72  INTF(" ... retur
196e0 6e 69 6e 67 20 25 70 2f 25 6c 75 22 2c 20 70 56  ning %p/%lu", pV
196f0 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20  alue, (unsigned 
19700 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e  long) ulValueLen
19710 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  );......break;..
19720 09 09 63 61 73 65 20 43 4b 41 5f 49 53 53 55 45  ..case CKA_ISSUE
19730 52 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  R:.....CACKEY_DE
19740 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75  BUG_PRINTF("Requ
19750 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65  esting attribute
19760 20 43 4b 41 5f 49 53 53 55 45 52 20 28 30 78 25   CKA_ISSUER (0x%
19770 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73  08lx) ...", (uns
19780 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72  igned long) curr
19790 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09  _attr_type);....
197a0 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73  ..if (objectclas
197b0 73 20 21 3d 20 43 4b 4f 5f 43 45 52 54 49 46 49  s != CKO_CERTIFI
197c0 43 41 54 45 20 26 26 20 6f 62 6a 65 63 74 63 6c  CATE && objectcl
197d0 61 73 73 20 21 3d 20 43 4b 4f 5f 4e 45 54 53 43  ass != CKO_NETSC
197e0 41 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09  APE_TRUST) {....
197f0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
19800 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20  RINTF(" ... but 
19810 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 62  not getting it b
19820 65 63 61 75 73 65 20 77 65 20 61 72 65 20 6e 6f  ecause we are no
19830 74 20 61 20 63 65 72 74 69 66 69 63 61 74 65 20  t a certificate 
19840 6f 72 20 4e 65 74 73 63 61 70 65 20 74 72 75 73  or Netscape trus
19850 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09  t object");.....
19860 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a  ..break;.....}..
19870 09 09 09 09 69 66 20 28 63 65 72 74 69 66 69 63  ....if (certific
19880 61 74 65 5f 6c 65 6e 20 3e 3d 20 30 29 20 7b 0a  ate_len >= 0) {.
19890 09 09 09 09 09 78 35 30 39 5f 72 65 61 64 5f 72  .....x509_read_r
198a0 65 74 20 3d 20 78 35 30 39 5f 74 6f 5f 69 73 73  et = x509_to_iss
198b0 75 65 72 28 63 65 72 74 69 66 69 63 61 74 65 2c  uer(certificate,
198c0 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e   certificate_len
198d0 2c 20 26 70 56 61 6c 75 65 29 3b 0a 09 09 09 09  , &pValue);.....
198e0 09 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72  .if (x509_read_r
198f0 65 74 20 3c 20 30 29 20 7b 0a 09 09 09 09 09 09  et < 0) {.......
19900 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09  pValue = NULL;..
19910 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ....} else {....
19920 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  ...ulValueLen = 
19930 78 35 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09  x509_read_ret;..
19940 09 09 09 09 7d 0a 09 09 09 09 7d 0a 0a 09 09 09  ....}.....}.....
19950 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
19960 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72  INTF(" ... retur
19970 6e 69 6e 67 20 25 70 2f 25 6c 75 22 2c 20 70 56  ning %p/%lu", pV
19980 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20  alue, (unsigned 
19990 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e  long) ulValueLen
199a0 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  );......break;..
199b0 09 09 63 61 73 65 20 43 4b 41 5f 53 45 52 49 41  ..case CKA_SERIA
199c0 4c 5f 4e 55 4d 42 45 52 3a 0a 09 09 09 09 43 41  L_NUMBER:.....CA
199d0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
199e0 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74  F("Requesting at
199f0 74 72 69 62 75 74 65 20 43 4b 41 5f 53 45 52 49  tribute CKA_SERI
19a00 41 4c 5f 4e 55 4d 42 45 52 20 28 30 78 25 30 38  AL_NUMBER (0x%08
19a10 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67  lx) ...", (unsig
19a20 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61  ned long) curr_a
19a30 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09  ttr_type);......
19a40 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20  if (objectclass 
19a50 21 3d 20 43 4b 4f 5f 43 45 52 54 49 46 49 43 41  != CKO_CERTIFICA
19a60 54 45 20 26 26 20 6f 62 6a 65 63 74 63 6c 61 73  TE && objectclas
19a70 73 20 21 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50  s != CKO_NETSCAP
19a80 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 09 09  E_TRUST) {......
19a90 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
19aa0 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f  NTF(" ... but no
19ab0 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63  t getting it bec
19ac0 61 75 73 65 20 77 65 20 61 72 65 20 6e 6f 74 20  ause we are not 
19ad0 61 20 63 65 72 74 69 66 69 63 61 74 65 20 6f 72  a certificate or
19ae0 20 4e 65 74 73 63 61 70 65 20 74 72 75 73 74 20   Netscape trust 
19af0 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09  object");.......
19b00 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09  break;.....}....
19b10 09 09 69 66 20 28 63 65 72 74 69 66 69 63 61 74  ..if (certificat
19b20 65 5f 6c 65 6e 20 3e 3d 20 30 29 20 7b 0a 09 09  e_len >= 0) {...
19b30 09 09 09 78 35 30 39 5f 72 65 61 64 5f 72 65 74  ...x509_read_ret
19b40 20 3d 20 78 35 30 39 5f 74 6f 5f 73 65 72 69 61   = x509_to_seria
19b50 6c 28 63 65 72 74 69 66 69 63 61 74 65 2c 20 63  l(certificate, c
19b60 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c 20  ertificate_len, 
19b70 26 70 56 61 6c 75 65 29 3b 0a 09 09 09 09 09 69  &pValue);......i
19b80 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74  f (x509_read_ret
19b90 20 3c 20 30 29 20 7b 0a 09 09 09 09 09 09 70 56   < 0) {.......pV
19ba0 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09  alue = NULL;....
19bb0 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09  ..} else {......
19bc0 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 78 35  .ulValueLen = x5
19bd0 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09 09 09  09_read_ret;....
19be0 09 09 7d 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43  ..}.....}......C
19bf0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
19c00 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69  TF(" ... returni
19c10 6e 67 20 28 25 70 2f 25 6c 75 29 22 2c 20 70 56  ng (%p/%lu)", pV
19c20 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20  alue, (unsigned 
19c30 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e  long) ulValueLen
19c40 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  );......break;..
19c50 09 09 63 61 73 65 20 43 4b 41 5f 53 55 42 4a 45  ..case CKA_SUBJE
19c60 43 54 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  CT:.....CACKEY_D
19c70 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71  EBUG_PRINTF("Req
19c80 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74  uesting attribut
19c90 65 20 43 4b 41 5f 53 55 42 4a 45 43 54 20 28 30  e CKA_SUBJECT (0
19ca0 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75  x%08lx) ...", (u
19cb0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75  nsigned long) cu
19cc0 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a  rr_attr_type);..
19cd0 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c  ....if (objectcl
19ce0 61 73 73 20 21 3d 20 43 4b 4f 5f 43 45 52 54 49  ass != CKO_CERTI
19cf0 46 49 43 41 54 45 29 20 7b 0a 09 09 09 09 09 43  FICATE) {......C
19d00 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
19d10 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74  TF(" ... but not
19d20 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 61   getting it beca
19d30 75 73 65 20 77 65 20 61 72 65 20 6e 6f 74 20 61  use we are not a
19d40 20 63 65 72 74 69 66 69 63 61 74 65 22 29 3b 0a   certificate");.
19d50 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
19d60 09 7d 0a 0a 09 09 09 09 69 66 20 28 63 65 72 74  .}......if (cert
19d70 69 66 69 63 61 74 65 5f 6c 65 6e 20 3e 3d 20 30  ificate_len >= 0
19d80 29 20 7b 0a 09 09 09 09 09 78 35 30 39 5f 72 65  ) {......x509_re
19d90 61 64 5f 72 65 74 20 3d 20 78 35 30 39 5f 74 6f  ad_ret = x509_to
19da0 5f 73 75 62 6a 65 63 74 28 63 65 72 74 69 66 69  _subject(certifi
19db0 63 61 74 65 2c 20 63 65 72 74 69 66 69 63 61 74  cate, certificat
19dc0 65 5f 6c 65 6e 2c 20 26 70 56 61 6c 75 65 29 3b  e_len, &pValue);
19dd0 0a 09 09 09 09 09 69 66 20 28 78 35 30 39 5f 72  ......if (x509_r
19de0 65 61 64 5f 72 65 74 20 3c 20 30 29 20 7b 0a 09  ead_ret < 0) {..
19df0 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 4e 55  .....pValue = NU
19e00 4c 4c 3b 0a 09 09 09 09 09 7d 20 65 6c 73 65 20  LL;......} else 
19e10 7b 0a 09 09 09 09 09 09 75 6c 56 61 6c 75 65 4c  {.......ulValueL
19e20 65 6e 20 3d 20 78 35 30 39 5f 72 65 61 64 5f 72  en = x509_read_r
19e30 65 74 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d  et;......}.....}
19e40 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
19e50 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
19e60 72 65 74 75 72 6e 69 6e 67 20 25 70 2f 25 6c 75  returning %p/%lu
19e70 22 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69  ", pValue, (unsi
19e80 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c  gned long) ulVal
19e90 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65  ueLen);......bre
19ea0 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f  ak;....case CKA_
19eb0 49 44 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  ID:.....CACKEY_D
19ec0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71  EBUG_PRINTF("Req
19ed0 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74  uesting attribut
19ee0 65 20 43 4b 41 5f 49 44 20 28 30 78 25 30 38 6c  e CKA_ID (0x%08l
19ef0 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e  x) ...", (unsign
19f00 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74  ed long) curr_at
19f10 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69  tr_type);......i
19f20 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d  f (objectclass =
19f30 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54  = CKO_NETSCAPE_T
19f40 52 55 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43  RUST) {......CAC
19f50 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
19f60 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67  (" ... but not g
19f70 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73  etting it becaus
19f80 65 20 77 65 20 61 72 65 20 61 20 4e 65 74 73 63  e we are a Netsc
19f90 61 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74  ape trust object
19fa0 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b  ");.......break;
19fb0 0a 09 09 09 09 7d 0a 0a 09 09 09 09 75 63 54 6d  .....}......ucTm
19fc0 70 42 75 66 5b 30 5d 20 3d 20 28 28 69 64 65 6e  pBuf[0] = ((iden
19fd0 74 69 74 79 5f 6e 75 6d 20 2b 20 31 29 20 3e 3e  tity_num + 1) >>
19fe0 20 38 29 20 26 20 30 78 66 66 3b 0a 09 09 09 09   8) & 0xff;.....
19ff0 75 63 54 6d 70 42 75 66 5b 31 5d 20 3d 20 20 28  ucTmpBuf[1] =  (
1a000 69 64 65 6e 74 69 74 79 5f 6e 75 6d 20 2b 20 31  identity_num + 1
1a010 29 20 26 20 30 78 66 66 3b 0a 0a 09 09 09 09 70  ) & 0xff;......p
1a020 56 61 6c 75 65 20 3d 20 26 75 63 54 6d 70 42 75  Value = &ucTmpBu
1a030 66 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65  f;.....ulValueLe
1a040 6e 20 3d 20 32 3b 0a 0a 09 09 09 09 43 41 43 4b  n = 2;......CACK
1a050 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1a060 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20  " ... returning 
1a070 25 70 2f 25 6c 75 22 2c 20 70 56 61 6c 75 65 2c  %p/%lu", pValue,
1a080 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
1a090 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09   ulValueLen);...
1a0a0 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
1a0b0 65 20 43 4b 41 5f 43 45 52 54 49 46 49 43 41 54  e CKA_CERTIFICAT
1a0c0 45 5f 54 59 50 45 3a 0a 09 09 09 09 43 41 43 4b  E_TYPE:.....CACK
1a0d0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1a0e0 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72  "Requesting attr
1a0f0 69 62 75 74 65 20 43 4b 41 5f 43 45 52 54 49 46  ibute CKA_CERTIF
1a100 49 43 41 54 45 5f 54 59 50 45 20 28 30 78 25 30  ICATE_TYPE (0x%0
1a110 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69  8lx) ...", (unsi
1a120 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f  gned long) curr_
1a130 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09  attr_type);.....
1a140 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73  .if (objectclass
1a150 20 21 3d 20 43 4b 4f 5f 43 45 52 54 49 46 49 43   != CKO_CERTIFIC
1a160 41 54 45 29 20 7b 0a 09 09 09 09 09 43 41 43 4b  ATE) {......CACK
1a170 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1a180 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65  " ... but not ge
1a190 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65  tting it because
1a1a0 20 77 65 20 61 72 65 20 6e 6f 74 20 61 20 63 65   we are not a ce
1a1b0 72 74 69 66 69 63 61 74 65 2e 22 29 3b 0a 0a 09  rtificate.");...
1a1c0 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d  ....break;.....}
1a1d0 0a 0a 09 09 09 09 2f 2a 20 57 65 20 6f 6e 6c 79  ....../* We only
1a1e0 20 73 75 70 70 6f 72 74 20 6f 6e 65 20 63 65 72   support one cer
1a1f0 74 69 66 69 63 61 74 65 20 74 79 70 65 20 2a 2f  tificate type */
1a200 0a 09 09 09 09 63 6b 5f 63 65 72 74 69 66 69 63  .....ck_certific
1a210 61 74 65 5f 74 79 70 65 20 3d 20 43 4b 43 5f 58  ate_type = CKC_X
1a220 5f 35 30 39 3b 0a 0a 09 09 09 09 70 56 61 6c 75  _509;......pValu
1a230 65 20 3d 20 26 63 6b 5f 63 65 72 74 69 66 69 63  e = &ck_certific
1a240 61 74 65 5f 74 79 70 65 3b 0a 09 09 09 09 75 6c  ate_type;.....ul
1a250 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f  ValueLen = sizeo
1a260 66 28 63 6b 5f 63 65 72 74 69 66 69 63 61 74 65  f(ck_certificate
1a270 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 43 41 43  _type);......CAC
1a280 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1a290 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67  (" ... returning
1a2a0 20 43 4b 43 5f 58 5f 35 30 39 20 28 25 6c 75 29   CKC_X_509 (%lu)
1a2b0 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73   (%p/%lu)", (uns
1a2c0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43  igned long) *((C
1a2d0 4b 5f 43 45 52 54 49 46 49 43 41 54 45 5f 54 59  K_CERTIFICATE_TY
1a2e0 50 45 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70  PE *) pValue), p
1a2f0 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64  Value, (unsigned
1a300 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65   long) ulValueLe
1a310 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a  n);......break;.
1a320 09 09 09 63 61 73 65 20 43 4b 41 5f 4b 45 59 5f  ...case CKA_KEY_
1a330 54 59 50 45 3a 0a 09 09 09 09 43 41 43 4b 45 59  TYPE:.....CACKEY
1a340 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
1a350 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62  equesting attrib
1a360 75 74 65 20 43 4b 41 5f 4b 45 59 5f 54 59 50 45  ute CKA_KEY_TYPE
1a370 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c   (0x%08lx) ...",
1a380 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
1a390 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29   curr_attr_type)
1a3a0 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63  ;......if (objec
1a3b0 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 50 52  tclass != CKO_PR
1a3c0 49 56 41 54 45 5f 4b 45 59 20 26 26 20 6f 62 6a  IVATE_KEY && obj
1a3d0 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f  ectclass != CKO_
1a3e0 50 55 42 4c 49 43 5f 4b 45 59 29 20 7b 0a 09 09  PUBLIC_KEY) {...
1a3f0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1a400 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74  PRINTF(" ... but
1a410 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20   not getting it 
1a420 62 65 63 61 75 73 65 20 77 65 20 61 72 65 20 6e  because we are n
1a430 6f 74 20 61 20 6b 65 79 2e 22 29 3b 0a 0a 09 09  ot a key.");....
1a440 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a  ...break;.....}.
1a450 0a 09 09 09 09 2f 2a 20 57 65 20 6f 6e 6c 79 20  ...../* We only 
1a460 73 75 70 70 6f 72 74 20 6f 6e 65 20 6b 65 79 20  support one key 
1a470 74 79 70 65 20 2a 2f 0a 09 09 09 09 63 6b 5f 6b  type */.....ck_k
1a480 65 79 5f 74 79 70 65 20 3d 20 43 4b 4b 5f 52 53  ey_type = CKK_RS
1a490 41 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d  A;......pValue =
1a4a0 20 26 63 6b 5f 6b 65 79 5f 74 79 70 65 3b 0a 09   &ck_key_type;..
1a4b0 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  ...ulValueLen = 
1a4c0 73 69 7a 65 6f 66 28 63 6b 5f 6b 65 79 5f 74 79  sizeof(ck_key_ty
1a4d0 70 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59  pe);......CACKEY
1a4e0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
1a4f0 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 43 4b  ... returning CK
1a500 4b 5f 52 53 41 20 28 25 6c 75 29 20 28 25 70 2f  K_RSA (%lu) (%p/
1a510 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64  %lu)", (unsigned
1a520 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 43 45 52   long) *((CK_CER
1a530 54 49 46 49 43 41 54 45 5f 54 59 50 45 20 2a 29  TIFICATE_TYPE *)
1a540 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65   pValue), pValue
1a550 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
1a560 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a  ) ulValueLen);..
1a570 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61  ....break;....ca
1a580 73 65 20 43 4b 41 5f 53 49 47 4e 3a 0a 09 09 09  se CKA_SIGN:....
1a590 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1a5a0 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67  INTF("Requesting
1a5b0 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 53   attribute CKA_S
1a5c0 49 47 4e 20 28 30 78 25 30 38 6c 78 29 20 2e 2e  IGN (0x%08lx) ..
1a5d0 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  .", (unsigned lo
1a5e0 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79  ng) curr_attr_ty
1a5f0 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62  pe);......if (ob
1a600 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f  jectclass == CKO
1a610 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54 29  _NETSCAPE_TRUST)
1a620 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44   {......CACKEY_D
1a630 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
1a640 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e  . but not gettin
1a650 67 20 69 74 20 62 65 63 61 75 73 65 20 77 65 20  g it because we 
1a660 61 72 65 20 61 20 4e 65 74 73 63 61 70 65 20 74  are a Netscape t
1a670 72 75 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a  rust object");..
1a680 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09  .....break;.....
1a690 7d 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63  }......if (objec
1a6a0 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 50 52  tclass == CKO_PR
1a6b0 49 56 41 54 45 5f 4b 45 59 29 20 7b 0a 09 09 09  IVATE_KEY) {....
1a6c0 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 74  ..pValue = &ck_t
1a6d0 72 75 65 3b 0a 09 09 09 09 09 75 6c 56 61 6c 75  rue;......ulValu
1a6e0 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b  eLen = sizeof(ck
1a6f0 5f 74 72 75 65 29 3b 0a 09 09 09 09 7d 20 65 6c  _true);.....} el
1a700 73 65 20 7b 0a 09 09 09 09 09 70 56 61 6c 75 65  se {......pValue
1a710 20 3d 20 26 63 6b 5f 66 61 6c 73 65 3b 0a 09 09   = &ck_false;...
1a720 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  ...ulValueLen = 
1a730 73 69 7a 65 6f 66 28 63 6b 5f 66 61 6c 73 65 29  sizeof(ck_false)
1a740 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43  ;.....}......CAC
1a750 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1a760 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67  (" ... returning
1a770 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20   %lu (%p/%lu)", 
1a780 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
1a790 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70  *((CK_BBOOL *) p
1a7a0 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20  Value), pValue, 
1a7b0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
1a7c0 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09  ulValueLen);....
1a7d0 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
1a7e0 20 43 4b 41 5f 53 49 47 4e 5f 52 45 43 4f 56 45   CKA_SIGN_RECOVE
1a7f0 52 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  R:.....CACKEY_DE
1a800 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75  BUG_PRINTF("Requ
1a810 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65  esting attribute
1a820 20 43 4b 41 5f 53 49 47 4e 5f 52 45 43 4f 56 45   CKA_SIGN_RECOVE
1a830 52 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22  R (0x%08lx) ..."
1a840 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
1a850 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65  ) curr_attr_type
1a860 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65  );......if (obje
1a870 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 4e  ctclass == CKO_N
1a880 45 54 53 43 41 50 45 5f 54 52 55 53 54 29 20 7b  ETSCAPE_TRUST) {
1a890 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
1a8a0 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
1a8b0 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20  but not getting 
1a8c0 69 74 20 62 65 63 61 75 73 65 20 77 65 20 61 72  it because we ar
1a8d0 65 20 61 20 4e 65 74 73 63 61 70 65 20 74 72 75  e a Netscape tru
1a8e0 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09  st object");....
1a8f0 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a  ...break;.....}.
1a900 0a 09 09 09 09 2f 2a 20 57 65 20 63 75 72 72 65  ...../* We curre
1a910 6e 74 6c 79 20 6f 6e 6c 79 20 73 75 70 70 6f 72  ntly only suppor
1a920 74 20 22 53 69 67 6e 20 77 69 74 68 20 41 70 70  t "Sign with App
1a930 65 6e 64 69 78 22 20 2a 2f 0a 09 09 09 09 70 56  endix" */.....pV
1a940 61 6c 75 65 20 3d 20 26 63 6b 5f 66 61 6c 73 65  alue = &ck_false
1a950 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e  ;.....ulValueLen
1a960 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 66 61 6c   = sizeof(ck_fal
1a970 73 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59  se);......CACKEY
1a980 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
1a990 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 6c  ... returning %l
1a9a0 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e  u (%p/%lu)", (un
1a9b0 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28  signed long) *((
1a9c0 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c  CK_BBOOL *) pVal
1a9d0 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e  ue), pValue, (un
1a9e0 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56  signed long) ulV
1a9f0 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62  alueLen);......b
1aa00 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b  reak;....case CK
1aa10 41 5f 44 45 43 52 59 50 54 3a 0a 09 09 09 09 43  A_DECRYPT:.....C
1aa20 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1aa30 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61  TF("Requesting a
1aa40 74 74 72 69 62 75 74 65 20 43 4b 41 5f 44 45 43  ttribute CKA_DEC
1aa50 52 59 50 54 20 28 30 78 25 30 38 6c 78 29 20 2e  RYPT (0x%08lx) .
1aa60 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ..", (unsigned l
1aa70 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74  ong) curr_attr_t
1aa80 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f  ype);......if (o
1aa90 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b  bjectclass == CK
1aaa0 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54  O_NETSCAPE_TRUST
1aab0 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f  ) {......CACKEY_
1aac0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
1aad0 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69  .. but not getti
1aae0 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77 65  ng it because we
1aaf0 20 61 72 65 20 61 20 4e 65 74 73 63 61 70 65 20   are a Netscape 
1ab00 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a  trust object");.
1ab10 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
1ab20 09 7d 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65  .}......if (obje
1ab30 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 50  ctclass == CKO_P
1ab40 52 49 56 41 54 45 5f 4b 45 59 20 7c 7c 20 6f 62  RIVATE_KEY || ob
1ab50 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f  jectclass == CKO
1ab60 5f 50 55 42 4c 49 43 5f 4b 45 59 29 20 7b 0a 09  _PUBLIC_KEY) {..
1ab70 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b  ....pValue = &ck
1ab80 5f 74 72 75 65 3b 0a 09 09 09 09 09 75 6c 56 61  _true;......ulVa
1ab90 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28  lueLen = sizeof(
1aba0 63 6b 5f 74 72 75 65 29 3b 0a 09 09 09 09 7d 20  ck_true);.....} 
1abb0 65 6c 73 65 20 7b 0a 09 09 09 09 09 70 56 61 6c  else {......pVal
1abc0 75 65 20 3d 20 26 63 6b 5f 66 61 6c 73 65 3b 0a  ue = &ck_false;.
1abd0 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20  .....ulValueLen 
1abe0 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 66 61 6c 73  = sizeof(ck_fals
1abf0 65 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43  e);.....}......C
1ac00 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1ac10 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69  TF(" ... returni
1ac20 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22  ng %lu (%p/%lu)"
1ac30 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
1ac40 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29  ) *((CK_BBOOL *)
1ac50 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65   pValue), pValue
1ac60 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
1ac70 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a  ) ulValueLen);..
1ac80 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61  ....break;....ca
1ac90 73 65 20 43 4b 41 5f 53 45 4e 53 49 54 49 56 45  se CKA_SENSITIVE
1aca0 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  :.....CACKEY_DEB
1acb0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65  UG_PRINTF("Reque
1acc0 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20  sting attribute 
1acd0 43 4b 41 5f 53 45 4e 53 49 54 49 56 45 20 28 30  CKA_SENSITIVE (0
1ace0 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75  x%08lx) ...", (u
1acf0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75  nsigned long) cu
1ad00 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a  rr_attr_type);..
1ad10 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c  ....if (objectcl
1ad20 61 73 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43  ass == CKO_NETSC
1ad30 41 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09  APE_TRUST) {....
1ad40 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1ad50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20  RINTF(" ... but 
1ad60 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 62  not getting it b
1ad70 65 63 61 75 73 65 20 77 65 20 61 72 65 20 61 20  ecause we are a 
1ad80 4e 65 74 73 63 61 70 65 20 74 72 75 73 74 20 6f  Netscape trust o
1ad90 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62  bject");.......b
1ada0 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09  reak;.....}.....
1adb0 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73  .if (objectclass
1adc0 20 3d 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f   == CKO_PRIVATE_
1add0 4b 45 59 29 20 7b 0a 09 09 09 09 09 70 56 61 6c  KEY) {......pVal
1ade0 75 65 20 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09  ue = &ck_true;..
1adf0 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ....ulValueLen =
1ae00 20 73 69 7a 65 6f 66 28 63 6b 5f 74 72 75 65 29   sizeof(ck_true)
1ae10 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09  ;.....} else {..
1ae20 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b  ....pValue = &ck
1ae30 5f 66 61 6c 73 65 3b 0a 09 09 09 09 09 75 6c 56  _false;......ulV
1ae40 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66  alueLen = sizeof
1ae50 28 63 6b 5f 66 61 6c 73 65 29 3b 0a 09 09 09 09  (ck_false);.....
1ae60 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  }......CACKEY_DE
1ae70 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
1ae80 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28   returning %lu (
1ae90 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67  %p/%lu)", (unsig
1aea0 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f  ned long) *((CK_
1aeb0 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29  BBOOL *) pValue)
1aec0 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67  , pValue, (unsig
1aed0 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75  ned long) ulValu
1aee0 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61  eLen);......brea
1aef0 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 45  k;....case CKA_E
1af00 58 54 52 41 43 54 41 42 4c 45 3a 0a 09 09 09 09  XTRACTABLE:.....
1af10 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1af20 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20  NTF("Requesting 
1af30 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 45 58  attribute CKA_EX
1af40 54 52 41 43 54 41 42 4c 45 20 28 30 78 25 30 38  TRACTABLE (0x%08
1af50 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67  lx) ...", (unsig
1af60 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61  ned long) curr_a
1af70 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09  ttr_type);......
1af80 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20  if (objectclass 
1af90 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f  == CKO_NETSCAPE_
1afa0 54 52 55 53 54 29 20 7b 0a 09 09 09 09 09 43 41  TRUST) {......CA
1afb0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1afc0 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20  F(" ... but not 
1afd0 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 75  getting it becau
1afe0 73 65 20 77 65 20 61 72 65 20 61 20 4e 65 74 73  se we are a Nets
1aff0 63 61 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63  cape trust objec
1b000 74 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b  t");.......break
1b010 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69 66 20  ;.....}......if 
1b020 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20  (objectclass == 
1b030 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b 45 59 29  CKO_PRIVATE_KEY)
1b040 20 7b 0a 09 09 09 09 09 70 56 61 6c 75 65 20 3d   {......pValue =
1b050 20 26 63 6b 5f 66 61 6c 73 65 3b 0a 09 09 09 09   &ck_false;.....
1b060 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69  .ulValueLen = si
1b070 7a 65 6f 66 28 63 6b 5f 74 72 75 65 29 3b 0a 09  zeof(ck_true);..
1b080 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09  ...} else {.....
1b090 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 74 72  .pValue = &ck_tr
1b0a0 75 65 3b 0a 09 09 09 09 09 75 6c 56 61 6c 75 65  ue;......ulValue
1b0b0 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f  Len = sizeof(ck_
1b0c0 66 61 6c 73 65 29 3b 0a 09 09 09 09 7d 0a 0a 09  false);.....}...
1b0d0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1b0e0 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74  PRINTF(" ... ret
1b0f0 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25  urning %lu (%p/%
1b100 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  lu)", (unsigned 
1b110 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f  long) *((CK_BBOO
1b120 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56  L *) pValue), pV
1b130 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20  alue, (unsigned 
1b140 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e  long) ulValueLen
1b150 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  );......break;..
1b160 09 09 63 61 73 65 20 43 4b 41 5f 4d 4f 44 55 4c  ..case CKA_MODUL
1b170 55 53 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  US:.....CACKEY_D
1b180 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71  EBUG_PRINTF("Req
1b190 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74  uesting attribut
1b1a0 65 20 43 4b 41 5f 4d 4f 44 55 4c 55 53 20 28 30  e CKA_MODULUS (0
1b1b0 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75  x%08lx) ...", (u
1b1c0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75  nsigned long) cu
1b1d0 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a  rr_attr_type);..
1b1e0 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c  ....if (objectcl
1b1f0 61 73 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43  ass == CKO_NETSC
1b200 41 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09  APE_TRUST) {....
1b210 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1b220 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20  RINTF(" ... but 
1b230 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 62  not getting it b
1b240 65 63 61 75 73 65 20 77 65 20 61 72 65 20 61 20  ecause we are a 
1b250 4e 65 74 73 63 61 70 65 20 74 72 75 73 74 20 6f  Netscape trust o
1b260 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62  bject");.......b
1b270 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09  reak;.....}.....
1b280 09 69 66 20 28 63 65 72 74 69 66 69 63 61 74 65  .if (certificate
1b290 5f 6c 65 6e 20 3e 3d 20 30 29 20 7b 0a 09 09 09  _len >= 0) {....
1b2a0 09 09 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20  ..x509_read_ret 
1b2b0 3d 20 78 35 30 39 5f 74 6f 5f 6d 6f 64 75 6c 75  = x509_to_modulu
1b2c0 73 28 63 65 72 74 69 66 69 63 61 74 65 2c 20 63  s(certificate, c
1b2d0 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c 20  ertificate_len, 
1b2e0 26 70 56 61 6c 75 65 29 3b 0a 09 09 09 09 09 69  &pValue);......i
1b2f0 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74  f (x509_read_ret
1b300 20 3c 20 30 29 20 7b 0a 09 09 09 09 09 09 70 56   < 0) {.......pV
1b310 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09  alue = NULL;....
1b320 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09  ..} else {......
1b330 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 78 35  .ulValueLen = x5
1b340 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09 09 09  09_read_ret;....
1b350 09 09 7d 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43  ..}.....}......C
1b360 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1b370 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69  TF(" ... returni
1b380 6e 67 20 28 25 70 2f 25 6c 75 29 22 2c 20 70 56  ng (%p/%lu)", pV
1b390 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20  alue, (unsigned 
1b3a0 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e  long) ulValueLen
1b3b0 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  );......break;..
1b3c0 09 09 63 61 73 65 20 43 4b 41 5f 50 55 42 4c 49  ..case CKA_PUBLI
1b3d0 43 5f 45 58 50 4f 4e 45 4e 54 3a 0a 09 09 09 09  C_EXPONENT:.....
1b3e0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1b3f0 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20  NTF("Requesting 
1b400 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 50 55  attribute CKA_PU
1b410 42 4c 49 43 5f 45 58 50 4f 4e 45 4e 54 20 28 30  BLIC_EXPONENT (0
1b420 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75  x%08lx) ...", (u
1b430 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75  nsigned long) cu
1b440 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a  rr_attr_type);..
1b450 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c  ....if (objectcl
1b460 61 73 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43  ass == CKO_NETSC
1b470 41 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09  APE_TRUST) {....
1b480 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1b490 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20  RINTF(" ... but 
1b4a0 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 62  not getting it b
1b4b0 65 63 61 75 73 65 20 77 65 20 61 72 65 20 61 20  ecause we are a 
1b4c0 4e 65 74 73 63 61 70 65 20 74 72 75 73 74 20 6f  Netscape trust o
1b4d0 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62  bject");.......b
1b4e0 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09  reak;.....}.....
1b4f0 09 69 66 20 28 63 65 72 74 69 66 69 63 61 74 65  .if (certificate
1b500 5f 6c 65 6e 20 3e 3d 20 30 29 20 7b 0a 09 09 09  _len >= 0) {....
1b510 09 09 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20  ..x509_read_ret 
1b520 3d 20 78 35 30 39 5f 74 6f 5f 65 78 70 6f 6e 65  = x509_to_expone
1b530 6e 74 28 63 65 72 74 69 66 69 63 61 74 65 2c 20  nt(certificate, 
1b540 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c  certificate_len,
1b550 20 26 70 56 61 6c 75 65 29 3b 0a 09 09 09 09 09   &pValue);......
1b560 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72 65  if (x509_read_re
1b570 74 20 3c 20 30 29 20 7b 0a 09 09 09 09 09 09 70  t < 0) {.......p
1b580 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09  Value = NULL;...
1b590 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09  ...} else {.....
1b5a0 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 78  ..ulValueLen = x
1b5b0 35 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09 09  509_read_ret;...
1b5c0 09 09 09 7d 0a 09 09 09 09 7d 0a 0a 09 09 09 09  ...}.....}......
1b5d0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1b5e0 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e  NTF(" ... return
1b5f0 69 6e 67 20 28 25 70 2f 25 6c 75 29 22 2c 20 70  ing (%p/%lu)", p
1b600 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64  Value, (unsigned
1b610 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65   long) ulValueLe
1b620 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a  n);......break;.
1b630 09 09 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53  ...case CKA_TRUS
1b640 54 5f 44 49 47 49 54 41 4c 5f 53 49 47 4e 41 54  T_DIGITAL_SIGNAT
1b650 55 52 45 3a 0a 09 09 09 63 61 73 65 20 43 4b 41  URE:....case CKA
1b660 5f 54 52 55 53 54 5f 4e 4f 4e 5f 52 45 50 55 44  _TRUST_NON_REPUD
1b670 49 41 54 49 4f 4e 3a 0a 09 09 09 63 61 73 65 20  IATION:....case 
1b680 43 4b 41 5f 54 52 55 53 54 5f 4b 45 59 5f 45 4e  CKA_TRUST_KEY_EN
1b690 43 49 50 48 45 52 4d 45 4e 54 3a 0a 09 09 09 63  CIPHERMENT:....c
1b6a0 61 73 65 20 43 4b 41 5f 54 52 55 53 54 5f 44 41  ase CKA_TRUST_DA
1b6b0 54 41 5f 45 4e 43 49 50 48 45 52 4d 45 4e 54 3a  TA_ENCIPHERMENT:
1b6c0 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 54 52 55  ....case CKA_TRU
1b6d0 53 54 5f 4b 45 59 5f 41 47 52 45 45 4d 45 4e 54  ST_KEY_AGREEMENT
1b6e0 3a 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 54 52  :....case CKA_TR
1b6f0 55 53 54 5f 4b 45 59 5f 43 45 52 54 5f 53 49 47  UST_KEY_CERT_SIG
1b700 4e 3a 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 54  N:....case CKA_T
1b710 52 55 53 54 5f 43 52 4c 5f 53 49 47 4e 3a 0a 09  RUST_CRL_SIGN:..
1b720 09 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54  ..case CKA_TRUST
1b730 5f 53 45 52 56 45 52 5f 41 55 54 48 3a 0a 09 09  _SERVER_AUTH:...
1b740 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54 5f  .case CKA_TRUST_
1b750 43 4c 49 45 4e 54 5f 41 55 54 48 3a 0a 09 09 09  CLIENT_AUTH:....
1b760 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54 5f 43  case CKA_TRUST_C
1b770 4f 44 45 5f 53 49 47 4e 49 4e 47 3a 0a 09 09 09  ODE_SIGNING:....
1b780 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54 5f 45  case CKA_TRUST_E
1b790 4d 41 49 4c 5f 50 52 4f 54 45 43 54 49 4f 4e 3a  MAIL_PROTECTION:
1b7a0 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
1b7b0 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73  G_PRINTF("Reques
1b7c0 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43  ting attribute C
1b7d0 4b 41 5f 54 52 55 53 54 5f 2e 2e 2e 20 28 30 78  KA_TRUST_... (0x
1b7e0 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e  %08lx) ...", (un
1b7f0 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72  signed long) cur
1b800 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09  r_attr_type);...
1b810 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f  ...pValue = &ck_
1b820 74 72 75 73 74 65 64 3b 0a 09 09 09 09 75 6c 56  trusted;.....ulV
1b830 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66  alueLen = sizeof
1b840 28 63 6b 5f 74 72 75 73 74 65 64 29 3b 0a 0a 09  (ck_trusted);...
1b850 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1b860 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74  PRINTF(" ... ret
1b870 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25  urning %lu (%p/%
1b880 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  lu)", (unsigned 
1b890 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 54 52 55 53  long) *((CK_TRUS
1b8a0 54 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56  T *) pValue), pV
1b8b0 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20  alue, (unsigned 
1b8c0 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e  long) ulValueLen
1b8d0 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  );......break;..
1b8e0 09 09 63 61 73 65 20 43 4b 41 5f 43 45 52 54 5f  ..case CKA_CERT_
1b8f0 53 48 41 31 5f 48 41 53 48 3a 0a 09 09 09 09 43  SHA1_HASH:.....C
1b900 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1b910 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61  TF("Requesting a
1b920 74 74 72 69 62 75 74 65 20 43 4b 41 5f 43 45 52  ttribute CKA_CER
1b930 54 5f 53 48 41 31 5f 48 41 53 48 20 28 30 78 25  T_SHA1_HASH (0x%
1b940 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73  08lx) ...", (uns
1b950 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72  igned long) curr
1b960 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09  _attr_type);....
1b970 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73  ..if (objectclas
1b980 73 20 21 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50  s != CKO_NETSCAP
1b990 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 09 09  E_TRUST) {......
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 20 2e 2e 2e 20 62 75 74 20 6e 6f  NTF(" ... but no
1b9c0 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63  t getting it bec
1b9d0 61 75 73 65 20 77 65 20 61 72 65 20 6e 6f 74 20  ause we are not 
1b9e0 61 20 4e 65 74 73 63 61 70 65 20 74 72 75 73 74  a Netscape trust
1b9f0 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09   object");......
1ba00 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09  .break;.....}...
1ba10 09 09 09 53 48 41 31 52 65 73 65 74 28 26 73 68  ...SHA1Reset(&sh
1ba20 61 31 5f 63 74 78 29 3b 0a 09 09 09 09 53 48 41  a1_ctx);.....SHA
1ba30 31 49 6e 70 75 74 28 26 73 68 61 31 5f 63 74 78  1Input(&sha1_ctx
1ba40 2c 20 63 65 72 74 69 66 69 63 61 74 65 2c 20 63  , certificate, c
1ba50 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b  ertificate_len);
1ba60 0a 09 09 09 09 53 48 41 31 52 65 73 75 6c 74 28  .....SHA1Result(
1ba70 26 73 68 61 31 5f 63 74 78 2c 20 73 68 61 31 5f  &sha1_ctx, sha1_
1ba80 68 61 73 68 29 3b 0a 0a 09 09 09 09 70 56 61 6c  hash);......pVal
1ba90 75 65 20 3d 20 73 68 61 31 5f 68 61 73 68 3b 0a  ue = sha1_hash;.
1baa0 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ....ulValueLen =
1bab0 20 73 69 7a 65 6f 66 28 73 68 61 31 5f 68 61 73   sizeof(sha1_has
1bac0 68 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f  h);......CACKEY_
1bad0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
1bae0 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 70 2f  .. returning %p/
1baf0 25 6c 75 22 2c 20 70 56 61 6c 75 65 2c 20 28 75  %lu", pValue, (u
1bb00 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c  nsigned long) ul
1bb10 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09  ValueLen);......
1bb20 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43  break;....case C
1bb30 4b 41 5f 43 45 52 54 5f 4d 44 35 5f 48 41 53 48  KA_CERT_MD5_HASH
1bb40 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  :.....CACKEY_DEB
1bb50 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65  UG_PRINTF("Reque
1bb60 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20  sting attribute 
1bb70 43 4b 41 5f 43 45 52 54 5f 4d 44 35 5f 48 41 53  CKA_CERT_MD5_HAS
1bb80 48 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22  H (0x%08lx) ..."
1bb90 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
1bba0 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65  ) curr_attr_type
1bbb0 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65  );......if (obje
1bbc0 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 4e  ctclass != CKO_N
1bbd0 45 54 53 43 41 50 45 5f 54 52 55 53 54 29 20 7b  ETSCAPE_TRUST) {
1bbe0 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
1bbf0 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
1bc00 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20  but not getting 
1bc10 69 74 20 62 65 63 61 75 73 65 20 77 65 20 61 72  it because we ar
1bc20 65 20 6e 6f 74 20 61 20 4e 65 74 73 63 61 70 65  e not a Netscape
1bc30 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29 3b   trust object");
1bc40 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .......break;...
1bc50 09 09 7d 0a 0a 09 09 09 09 4d 44 35 49 6e 69 74  ..}......MD5Init
1bc60 28 26 6d 64 35 5f 63 74 78 29 3b 0a 09 09 09 09  (&md5_ctx);.....
1bc70 4d 44 35 55 70 64 61 74 65 28 26 6d 64 35 5f 63  MD5Update(&md5_c
1bc80 74 78 2c 20 63 65 72 74 69 66 69 63 61 74 65 2c  tx, certificate,
1bc90 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e   certificate_len
1bca0 29 3b 0a 09 09 09 09 4d 44 35 46 69 6e 61 6c 28  );.....MD5Final(
1bcb0 6d 64 35 5f 68 61 73 68 2c 20 26 6d 64 35 5f 63  md5_hash, &md5_c
1bcc0 74 78 29 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65  tx);......pValue
1bcd0 20 3d 20 6d 64 35 5f 68 61 73 68 3b 0a 09 09 09   = md5_hash;....
1bce0 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69  .ulValueLen = si
1bcf0 7a 65 6f 66 28 6d 64 35 5f 68 61 73 68 29 3b 0a  zeof(md5_hash);.
1bd00 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
1bd10 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72  G_PRINTF(" ... r
1bd20 65 74 75 72 6e 69 6e 67 20 25 70 2f 25 6c 75 22  eturning %p/%lu"
1bd30 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67  , pValue, (unsig
1bd40 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75  ned long) ulValu
1bd50 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61  eLen);......brea
1bd60 6b 3b 0a 09 09 09 64 65 66 61 75 6c 74 3a 0a 09  k;....default:..
1bd70 09 09 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c  ...pValue = NULL
1bd80 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e  ;.....ulValueLen
1bd90 20 3d 20 28 43 4b 5f 4c 4f 4e 47 29 20 2d 31 3b   = (CK_LONG) -1;
1bda0 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a  .....break;...}.
1bdb0 0a 09 09 69 66 20 28 28 28 43 4b 5f 4c 4f 4e 47  ...if (((CK_LONG
1bdc0 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 20 21 3d  ) ulValueLen) !=
1bdd0 20 28 28 43 4b 5f 4c 4f 4e 47 29 20 2d 31 29 29   ((CK_LONG) -1))
1bde0 20 7b 0a 09 09 09 2f 2a 20 50 75 73 68 20 63 75   {..../* Push cu
1bdf0 72 72 5f 61 74 74 72 20 6f 6e 74 6f 20 74 68 65  rr_attr onto the
1be00 20 73 74 61 63 6b 20 2a 2f 0a 09 09 09 63 75 72   stack */....cur
1be10 72 5f 61 74 74 72 2e 74 79 70 65 20 3d 20 63 75  r_attr.type = cu
1be20 72 72 5f 61 74 74 72 5f 74 79 70 65 3b 0a 09 09  rr_attr_type;...
1be30 09 63 75 72 72 5f 61 74 74 72 2e 75 6c 56 61 6c  .curr_attr.ulVal
1be40 75 65 4c 65 6e 20 3d 20 75 6c 56 61 6c 75 65 4c  ueLen = ulValueL
1be50 65 6e 3b 0a 0a 09 09 09 63 75 72 72 5f 61 74 74  en;.....curr_att
1be60 72 2e 70 56 61 6c 75 65 20 3d 20 6d 61 6c 6c 6f  r.pValue = mallo
1be70 63 28 63 75 72 72 5f 61 74 74 72 2e 75 6c 56 61  c(curr_attr.ulVa
1be80 6c 75 65 4c 65 6e 29 3b 0a 09 09 09 6d 65 6d 63  lueLen);....memc
1be90 70 79 28 63 75 72 72 5f 61 74 74 72 2e 70 56 61  py(curr_attr.pVa
1bea0 6c 75 65 2c 20 70 56 61 6c 75 65 2c 20 63 75 72  lue, pValue, cur
1beb0 72 5f 61 74 74 72 2e 75 6c 56 61 6c 75 65 4c 65  r_attr.ulValueLe
1bec0 6e 29 3b 0a 0a 09 09 09 69 66 20 28 70 56 61 6c  n);.....if (pVal
1bed0 75 65 5f 66 72 65 65 20 26 26 20 70 56 61 6c 75  ue_free && pValu
1bee0 65 29 20 7b 0a 09 09 09 09 66 72 65 65 28 70 56  e) {.....free(pV
1bef0 61 6c 75 65 29 3b 0a 09 09 09 7d 0a 0a 09 09 09  alue);....}.....
1bf00 69 66 20 28 6e 75 6d 61 74 74 72 73 20 3e 3d 20  if (numattrs >= 
1bf10 72 65 74 76 61 6c 5f 63 6f 75 6e 74 29 20 7b 0a  retval_count) {.
1bf20 09 09 09 09 72 65 74 76 61 6c 20 3d 20 72 65 61  ....retval = rea
1bf30 6c 6c 6f 63 28 72 65 74 76 61 6c 2c 20 72 65 74  lloc(retval, ret
1bf40 76 61 6c 5f 63 6f 75 6e 74 20 2a 20 73 69 7a 65  val_count * size
1bf50 6f 66 28 2a 72 65 74 76 61 6c 29 29 3b 0a 09 09  of(*retval));...
1bf60 09 7d 0a 0a 09 09 09 6d 65 6d 63 70 79 28 26 72  .}.....memcpy(&r
1bf70 65 74 76 61 6c 5b 6e 75 6d 61 74 74 72 73 5d 2c  etval[numattrs],
1bf80 20 26 63 75 72 72 5f 61 74 74 72 2c 20 73 69 7a   &curr_attr, siz
1bf90 65 6f 66 28 63 75 72 72 5f 61 74 74 72 29 29 3b  eof(curr_attr));
1bfa0 0a 09 09 09 6e 75 6d 61 74 74 72 73 2b 2b 3b 0a  ....numattrs++;.
1bfb0 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28 6e 75 6d  ..}..}...if (num
1bfc0 61 74 74 72 73 20 21 3d 20 30 29 20 7b 0a 09 09  attrs != 0) {...
1bfd0 72 65 74 76 61 6c 5f 63 6f 75 6e 74 20 3d 20 6e  retval_count = n
1bfe0 75 6d 61 74 74 72 73 3b 0a 09 09 72 65 74 76 61  umattrs;...retva
1bff0 6c 20 3d 20 72 65 61 6c 6c 6f 63 28 72 65 74 76  l = realloc(retv
1c000 61 6c 2c 20 72 65 74 76 61 6c 5f 63 6f 75 6e 74  al, retval_count
1c010 20 2a 20 73 69 7a 65 6f 66 28 2a 72 65 74 76 61   * sizeof(*retva
1c020 6c 29 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09  l));..} else {..
1c030 09 66 72 65 65 28 72 65 74 76 61 6c 29 3b 0a 0a  .free(retval);..
1c040 09 09 72 65 74 76 61 6c 20 3d 20 4e 55 4c 4c 3b  ..retval = NULL;
1c050 0a 09 7d 0a 0a 09 2a 70 75 6c 43 6f 75 6e 74 20  ..}...*pulCount 
1c060 3d 20 6e 75 6d 61 74 74 72 73 3b 0a 0a 09 43 41  = numattrs;...CA
1c070 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1c080 46 28 22 52 65 74 75 72 6e 69 6e 67 20 25 6c 75  F("Returning %lu
1c090 20 6f 62 6a 65 63 74 73 20 28 25 70 29 2e 22 2c   objects (%p).",
1c0a0 20 6e 75 6d 61 74 74 72 73 2c 20 28 76 6f 69 64   numattrs, (void
1c0b0 20 2a 29 20 72 65 74 76 61 6c 29 3b 0a 0a 09 72   *) retval);...r
1c0c0 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d  eturn(retval);.}
1c0d0 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 61  ..static void ca
1c0e0 63 6b 65 79 5f 66 72 65 65 5f 69 64 65 6e 74 69  ckey_free_identi
1c0f0 74 69 65 73 28 73 74 72 75 63 74 20 63 61 63 6b  ties(struct cack
1c100 65 79 5f 69 64 65 6e 74 69 74 79 20 2a 69 64 65  ey_identity *ide
1c110 6e 74 69 74 69 65 73 2c 20 75 6e 73 69 67 6e 65  ntities, unsigne
1c120 64 20 6c 6f 6e 67 20 69 64 65 6e 74 69 74 69 65  d long identitie
1c130 73 5f 63 6f 75 6e 74 29 20 7b 0a 09 43 4b 5f 41  s_count) {..CK_A
1c140 54 54 52 49 42 55 54 45 20 2a 63 75 72 72 5f 61  TTRIBUTE *curr_a
1c150 74 74 72 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c  ttr;..unsigned l
1c160 6f 6e 67 20 69 64 5f 69 64 78 2c 20 61 74 74 72  ong id_idx, attr
1c170 5f 69 64 78 3b 0a 0a 09 69 66 20 28 69 64 65 6e  _idx;...if (iden
1c180 74 69 74 69 65 73 20 3d 3d 20 4e 55 4c 4c 20 7c  tities == NULL |
1c190 7c 20 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75  | identities_cou
1c1a0 6e 74 20 3d 3d 20 30 29 20 7b 0a 09 09 72 65 74  nt == 0) {...ret
1c1b0 75 72 6e 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 69  urn;..}...for (i
1c1c0 64 5f 69 64 78 20 3d 20 30 3b 20 69 64 5f 69 64  d_idx = 0; id_id
1c1d0 78 20 3c 20 69 64 65 6e 74 69 74 69 65 73 5f 63  x < identities_c
1c1e0 6f 75 6e 74 3b 20 69 64 5f 69 64 78 2b 2b 29 20  ount; id_idx++) 
1c1f0 7b 0a 09 09 69 66 20 28 69 64 65 6e 74 69 74 69  {...if (identiti
1c200 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69  es[id_idx].attri
1c210 62 75 74 65 73 29 20 7b 0a 09 09 09 66 6f 72 20  butes) {....for 
1c220 28 61 74 74 72 5f 69 64 78 20 3d 20 30 3b 20 61  (attr_idx = 0; a
1c230 74 74 72 5f 69 64 78 20 3c 20 69 64 65 6e 74 69  ttr_idx < identi
1c240 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74  ties[id_idx].att
1c250 72 69 62 75 74 65 73 5f 63 6f 75 6e 74 3b 20 61  ributes_count; a
1c260 74 74 72 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 09  ttr_idx++) {....
1c270 09 63 75 72 72 5f 61 74 74 72 20 3d 20 26 69 64  .curr_attr = &id
1c280 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d  entities[id_idx]
1c290 2e 61 74 74 72 69 62 75 74 65 73 5b 61 74 74 72  .attributes[attr
1c2a0 5f 69 64 78 5d 3b 0a 0a 09 09 09 09 69 66 20 28  _idx];......if (
1c2b0 63 75 72 72 5f 61 74 74 72 2d 3e 70 56 61 6c 75  curr_attr->pValu
1c2c0 65 29 20 7b 0a 09 09 09 09 09 66 72 65 65 28 63  e) {......free(c
1c2d0 75 72 72 5f 61 74 74 72 2d 3e 70 56 61 6c 75 65  urr_attr->pValue
1c2e0 29 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09  );.....}....}...
1c2f0 09 09 69 66 20 28 69 64 65 6e 74 69 74 69 65 73  ..if (identities
1c300 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75  [id_idx].attribu
1c310 74 65 73 29 20 7b 0a 09 09 09 09 66 72 65 65 28  tes) {.....free(
1c320 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64  identities[id_id
1c330 78 5d 2e 61 74 74 72 69 62 75 74 65 73 29 3b 0a  x].attributes);.
1c340 09 09 09 7d 0a 0a 09 09 09 63 61 63 6b 65 79 5f  ...}.....cackey_
1c350 66 72 65 65 5f 63 65 72 74 73 28 69 64 65 6e 74  free_certs(ident
1c360 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63  ities[id_idx].pc
1c370 73 63 5f 69 64 65 6e 74 69 74 79 2c 20 31 2c 20  sc_identity, 1, 
1c380 31 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 66 72 65  1);...}..}...fre
1c390 65 28 69 64 65 6e 74 69 74 69 65 73 29 3b 0a 7d  e(identities);.}
1c3a0 0a 0a 73 74 61 74 69 63 20 75 6e 73 69 67 6e 65  ..static unsigne
1c3b0 64 20 6c 6f 6e 67 20 63 61 63 6b 65 79 5f 72 65  d long cackey_re
1c3c0 61 64 5f 64 6f 64 5f 69 64 65 6e 74 69 74 69 65  ad_dod_identitie
1c3d0 73 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  s(struct cackey_
1c3e0 69 64 65 6e 74 69 74 79 20 2a 69 64 65 6e 74 69  identity *identi
1c3f0 74 69 65 73 2c 20 75 6e 73 69 67 6e 65 64 20 6c  ties, unsigned l
1c400 6f 6e 67 20 6e 75 6d 5f 64 6f 64 5f 63 65 72 74  ong num_dod_cert
1c410 73 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 6c  s) {..unsigned l
1c420 6f 6e 67 20 63 65 72 74 5f 69 64 78 2c 20 69 64  ong cert_idx, id
1c430 5f 69 64 78 20 3d 20 30 3b 0a 0a 09 69 66 20 28  _idx = 0;...if (
1c440 69 64 65 6e 74 69 74 69 65 73 20 3d 3d 20 4e 55  identities == NU
1c450 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 6e  LL) {...return(n
1c460 75 6d 5f 64 6f 64 5f 63 65 72 74 73 20 2a 20 33  um_dod_certs * 3
1c470 29 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 63 65 72  );..}...for (cer
1c480 74 5f 69 64 78 20 3d 20 30 3b 20 63 65 72 74 5f  t_idx = 0; cert_
1c490 69 64 78 20 3c 20 6e 75 6d 5f 64 6f 64 5f 63 65  idx < num_dod_ce
1c4a0 72 74 73 3b 20 63 65 72 74 5f 69 64 78 2b 2b 29  rts; cert_idx++)
1c4b0 20 7b 0a 09 09 69 64 65 6e 74 69 74 69 65 73 5b   {...identities[
1c4c0 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64 65  id_idx].pcsc_ide
1c4d0 6e 74 69 74 79 20 3d 20 4e 55 4c 4c 3b 0a 09 09  ntity = NULL;...
1c4e0 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64  identities[id_id
1c4f0 78 5d 2e 61 74 74 72 69 62 75 74 65 73 20 3d 20  x].attributes = 
1c500 63 61 63 6b 65 79 5f 67 65 74 5f 61 74 74 72 69  cackey_get_attri
1c510 62 75 74 65 73 28 43 4b 4f 5f 43 45 52 54 49 46  butes(CKO_CERTIF
1c520 49 43 41 54 45 2c 20 26 65 78 74 72 61 5f 63 65  ICATE, &extra_ce
1c530 72 74 73 5b 63 65 72 74 5f 69 64 78 5d 2c 20 30  rts[cert_idx], 0
1c540 78 66 30 30 30 20 7c 20 63 65 72 74 5f 69 64 78  xf000 | cert_idx
1c550 2c 20 26 69 64 65 6e 74 69 74 69 65 73 5b 69 64  , &identities[id
1c560 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73  _idx].attributes
1c570 5f 63 6f 75 6e 74 29 3b 0a 09 09 69 64 5f 69 64  _count);...id_id
1c580 78 2b 2b 3b 0a 0a 09 09 69 64 65 6e 74 69 74 69  x++;....identiti
1c590 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f  es[id_idx].pcsc_
1c5a0 69 64 65 6e 74 69 74 79 20 3d 20 4e 55 4c 4c 3b  identity = NULL;
1c5b0 0a 09 09 69 64 65 6e 74 69 74 69 65 73 5b 69 64  ...identities[id
1c5c0 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73  _idx].attributes
1c5d0 20 3d 20 63 61 63 6b 65 79 5f 67 65 74 5f 61 74   = cackey_get_at
1c5e0 74 72 69 62 75 74 65 73 28 43 4b 4f 5f 50 55 42  tributes(CKO_PUB
1c5f0 4c 49 43 5f 4b 45 59 2c 20 26 65 78 74 72 61 5f  LIC_KEY, &extra_
1c600 63 65 72 74 73 5b 63 65 72 74 5f 69 64 78 5d 2c  certs[cert_idx],
1c610 20 30 78 66 30 30 30 20 7c 20 63 65 72 74 5f 69   0xf000 | cert_i
1c620 64 78 2c 20 26 69 64 65 6e 74 69 74 69 65 73 5b  dx, &identities[
1c630 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74  id_idx].attribut
1c640 65 73 5f 63 6f 75 6e 74 29 3b 0a 09 09 69 64 5f  es_count);...id_
1c650 69 64 78 2b 2b 3b 0a 0a 09 09 69 64 65 6e 74 69  idx++;....identi
1c660 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73  ties[id_idx].pcs
1c670 63 5f 69 64 65 6e 74 69 74 79 20 3d 20 4e 55 4c  c_identity = NUL
1c680 4c 3b 0a 09 09 69 64 65 6e 74 69 74 69 65 73 5b  L;...identities[
1c690 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74  id_idx].attribut
1c6a0 65 73 20 3d 20 63 61 63 6b 65 79 5f 67 65 74 5f  es = cackey_get_
1c6b0 61 74 74 72 69 62 75 74 65 73 28 43 4b 4f 5f 4e  attributes(CKO_N
1c6c0 45 54 53 43 41 50 45 5f 54 52 55 53 54 2c 20 26  ETSCAPE_TRUST, &
1c6d0 65 78 74 72 61 5f 63 65 72 74 73 5b 63 65 72 74  extra_certs[cert
1c6e0 5f 69 64 78 5d 2c 20 30 78 66 30 30 30 20 7c 20  _idx], 0xf000 | 
1c6f0 63 65 72 74 5f 69 64 78 2c 20 26 69 64 65 6e 74  cert_idx, &ident
1c700 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74  ities[id_idx].at
1c710 74 72 69 62 75 74 65 73 5f 63 6f 75 6e 74 29 3b  tributes_count);
1c720 0a 09 09 69 64 5f 69 64 78 2b 2b 3b 0a 09 7d 0a  ...id_idx++;..}.
1c730 0a 09 72 65 74 75 72 6e 28 69 64 5f 69 64 78 29  ..return(id_idx)
1c740 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 73 74 72 75  ;.}..static stru
1c750 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69  ct cackey_identi
1c760 74 79 20 2a 63 61 63 6b 65 79 5f 72 65 61 64 5f  ty *cackey_read_
1c770 69 64 65 6e 74 69 74 69 65 73 28 73 74 72 75 63  identities(struc
1c780 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73  t cackey_slot *s
1c790 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f  lot, unsigned lo
1c7a0 6e 67 20 2a 69 64 73 5f 66 6f 75 6e 64 29 20 7b  ng *ids_found) {
1c7b0 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  ..struct cackey_
1c7c0 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 70  pcsc_identity *p
1c7d0 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 3b 0a  csc_identities;.
1c7e0 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69  .struct cackey_i
1c7f0 64 65 6e 74 69 74 79 20 2a 69 64 65 6e 74 69 74  dentity *identit
1c800 69 65 73 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c  ies;..unsigned l
1c810 6f 6e 67 20 6e 75 6d 5f 69 64 73 2c 20 69 64 5f  ong num_ids, id_
1c820 69 64 78 2c 20 63 75 72 72 5f 69 64 5f 74 79 70  idx, curr_id_typ
1c830 65 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  e;..unsigned lon
1c840 67 20 6e 75 6d 5f 63 65 72 74 73 2c 20 6e 75 6d  g num_certs, num
1c850 5f 64 6f 64 5f 63 65 72 74 73 2c 20 63 65 72 74  _dod_certs, cert
1c860 5f 69 64 78 3b 0a 09 69 6e 74 20 69 6e 63 6c 75  _idx;..int inclu
1c870 64 65 5f 65 78 74 72 61 5f 63 65 72 74 73 20 3d  de_extra_certs =
1c880 20 30 2c 20 69 6e 63 6c 75 64 65 5f 64 6f 64 5f   0, include_dod_
1c890 63 65 72 74 73 3b 0a 0a 09 43 41 43 4b 45 59 5f  certs;...CACKEY_
1c8a0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
1c8b0 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 69  lled.");...if (i
1c8c0 64 73 5f 66 6f 75 6e 64 20 3d 3d 20 4e 55 4c 4c  ds_found == NULL
1c8d0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1c8e0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1c8f0 2e 20 20 69 64 73 5f 66 6f 75 6e 64 20 69 73 20  .  ids_found is 
1c900 4e 55 4c 4c 22 29 3b 0a 0a 09 09 72 65 74 75 72  NULL");....retur
1c910 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 23 69 66  n(NULL);..}..#if
1c920 64 65 66 20 43 41 43 4b 45 59 5f 43 41 52 44 5f  def CACKEY_CARD_
1c930 53 4c 4f 54 5f 49 4e 43 4c 55 44 45 5f 45 58 54  SLOT_INCLUDE_EXT
1c940 52 41 5f 43 45 52 54 53 0a 09 69 6e 63 6c 75 64  RA_CERTS..includ
1c950 65 5f 65 78 74 72 61 5f 63 65 72 74 73 20 3d 20  e_extra_certs = 
1c960 31 3b 0a 23 65 6e 64 69 66 0a 0a 09 69 66 20 28  1;.#endif...if (
1c970 67 65 74 65 6e 76 28 22 43 41 43 4b 45 59 5f 44  getenv("CACKEY_D
1c980 4f 44 5f 43 45 52 54 53 5f 4f 4e 5f 48 57 5f 53  OD_CERTS_ON_HW_S
1c990 4c 4f 54 53 22 29 20 21 3d 20 4e 55 4c 4c 29 20  LOTS") != NULL) 
1c9a0 7b 0a 09 09 69 6e 63 6c 75 64 65 5f 65 78 74 72  {...include_extr
1c9b0 61 5f 63 65 72 74 73 20 3d 20 31 3b 0a 09 7d 0a  a_certs = 1;..}.
1c9c0 0a 09 69 66 20 28 67 65 74 65 6e 76 28 22 43 41  ..if (getenv("CA
1c9d0 43 4b 45 59 5f 4e 4f 5f 44 4f 44 5f 43 45 52 54  CKEY_NO_DOD_CERT
1c9e0 53 5f 4f 4e 5f 48 57 5f 53 4c 4f 54 53 22 29 20  S_ON_HW_SLOTS") 
1c9f0 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 69 6e 63  != NULL) {...inc
1ca00 6c 75 64 65 5f 65 78 74 72 61 5f 63 65 72 74 73  lude_extra_certs
1ca10 20 3d 20 30 3b 0a 09 7d 0a 0a 23 69 66 64 65 66   = 0;..}..#ifdef
1ca20 20 43 41 43 4b 45 59 5f 4e 4f 5f 45 58 54 52 41   CACKEY_NO_EXTRA
1ca30 5f 43 45 52 54 53 0a 09 69 66 20 28 67 65 74 65  _CERTS..if (gete
1ca40 6e 76 28 22 43 41 43 4b 45 59 5f 45 58 54 52 41  nv("CACKEY_EXTRA
1ca50 5f 43 45 52 54 53 22 29 20 21 3d 20 4e 55 4c 4c  _CERTS") != NULL
1ca60 29 20 7b 0a 09 09 69 6e 63 6c 75 64 65 5f 64 6f  ) {...include_do
1ca70 64 5f 63 65 72 74 73 20 3d 20 31 3b 0a 09 7d 20  d_certs = 1;..} 
1ca80 65 6c 73 65 20 7b 0a 09 09 69 6e 63 6c 75 64 65  else {...include
1ca90 5f 64 6f 64 5f 63 65 72 74 73 20 3d 20 30 3b 0a  _dod_certs = 0;.
1caa0 09 7d 0a 23 65 6c 73 65 0a 09 69 66 20 28 67 65  .}.#else..if (ge
1cab0 74 65 6e 76 28 22 43 41 43 4b 45 59 5f 4e 4f 5f  tenv("CACKEY_NO_
1cac0 45 58 54 52 41 5f 43 45 52 54 53 22 29 20 21 3d  EXTRA_CERTS") !=
1cad0 20 4e 55 4c 4c 29 20 7b 0a 09 09 69 6e 63 6c 75   NULL) {...inclu
1cae0 64 65 5f 64 6f 64 5f 63 65 72 74 73 20 3d 20 30  de_dod_certs = 0
1caf0 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69 6e  ;..} else {...in
1cb00 63 6c 75 64 65 5f 64 6f 64 5f 63 65 72 74 73 20  clude_dod_certs 
1cb10 3d 20 31 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a 0a  = 1;..}.#endif..
1cb20 09 69 66 20 28 69 6e 63 6c 75 64 65 5f 64 6f 64  .if (include_dod
1cb30 5f 63 65 72 74 73 29 20 7b 0a 09 09 6e 75 6d 5f  _certs) {...num_
1cb40 64 6f 64 5f 63 65 72 74 73 20 3d 20 73 69 7a 65  dod_certs = size
1cb50 6f 66 28 65 78 74 72 61 5f 63 65 72 74 73 29 20  of(extra_certs) 
1cb60 2f 20 73 69 7a 65 6f 66 28 65 78 74 72 61 5f 63  / sizeof(extra_c
1cb70 65 72 74 73 5b 30 5d 29 3b 0a 09 7d 20 65 6c 73  erts[0]);..} els
1cb80 65 20 7b 0a 09 09 6e 75 6d 5f 64 6f 64 5f 63 65  e {...num_dod_ce
1cb90 72 74 73 20 3d 20 30 3b 0a 09 7d 0a 0a 09 69 66  rts = 0;..}...if
1cba0 20 28 73 6c 6f 74 2d 3e 69 6e 74 65 72 6e 61 6c   (slot->internal
1cbb0 29 20 7b 0a 09 09 6e 75 6d 5f 69 64 73 20 3d 20  ) {...num_ids = 
1cbc0 63 61 63 6b 65 79 5f 72 65 61 64 5f 64 6f 64 5f  cackey_read_dod_
1cbd0 69 64 65 6e 74 69 74 69 65 73 28 4e 55 4c 4c 2c  identities(NULL,
1cbe0 20 6e 75 6d 5f 64 6f 64 5f 63 65 72 74 73 29 3b   num_dod_certs);
1cbf0 0a 0a 09 09 69 66 20 28 6e 75 6d 5f 69 64 73 20  ....if (num_ids 
1cc00 21 3d 20 30 29 20 7b 0a 09 09 09 69 64 65 6e 74  != 0) {....ident
1cc10 69 74 69 65 73 20 3d 20 6d 61 6c 6c 6f 63 28 6e  ities = malloc(n
1cc20 75 6d 5f 69 64 73 20 2a 20 73 69 7a 65 6f 66 28  um_ids * sizeof(
1cc30 2a 69 64 65 6e 74 69 74 69 65 73 29 29 3b 0a 0a  *identities));..
1cc40 09 09 09 63 61 63 6b 65 79 5f 72 65 61 64 5f 64  ...cackey_read_d
1cc50 6f 64 5f 69 64 65 6e 74 69 74 69 65 73 28 69 64  od_identities(id
1cc60 65 6e 74 69 74 69 65 73 2c 20 6e 75 6d 5f 64 6f  entities, num_do
1cc70 64 5f 63 65 72 74 73 29 3b 0a 09 09 7d 20 65 6c  d_certs);...} el
1cc80 73 65 20 7b 0a 09 09 09 69 64 65 6e 74 69 74 69  se {....identiti
1cc90 65 73 20 3d 20 4e 55 4c 4c 3b 0a 09 09 7d 0a 0a  es = NULL;...}..
1cca0 09 09 2a 69 64 73 5f 66 6f 75 6e 64 20 3d 20 6e  ..*ids_found = n
1ccb0 75 6d 5f 69 64 73 3b 0a 0a 09 09 72 65 74 75 72  um_ids;....retur
1ccc0 6e 28 69 64 65 6e 74 69 74 69 65 73 29 3b 0a 09  n(identities);..
1ccd0 7d 0a 0a 09 70 63 73 63 5f 69 64 65 6e 74 69 74  }...pcsc_identit
1cce0 69 65 73 20 3d 20 63 61 63 6b 65 79 5f 72 65 61  ies = cackey_rea
1ccf0 64 5f 63 65 72 74 73 28 73 6c 6f 74 2c 20 4e 55  d_certs(slot, NU
1cd00 4c 4c 2c 20 26 6e 75 6d 5f 63 65 72 74 73 29 3b  LL, &num_certs);
1cd10 0a 09 69 66 20 28 70 63 73 63 5f 69 64 65 6e 74  ..if (pcsc_ident
1cd20 69 74 69 65 73 20 21 3d 20 4e 55 4c 4c 29 20 7b  ities != NULL) {
1cd30 0a 09 09 2f 2a 20 43 6f 6e 76 65 72 74 20 6e 75  .../* Convert nu
1cd40 6d 62 65 72 20 6f 66 20 43 65 72 74 73 20 74 6f  mber of Certs to
1cd50 20 6e 75 6d 62 65 72 20 6f 66 20 6f 62 6a 65 63   number of objec
1cd60 74 73 20 2a 2f 0a 09 09 6e 75 6d 5f 69 64 73 20  ts */...num_ids 
1cd70 3d 20 28 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b  = (CKO_PRIVATE_K
1cd80 45 59 20 2d 20 43 4b 4f 5f 43 45 52 54 49 46 49  EY - CKO_CERTIFI
1cd90 43 41 54 45 20 2b 20 31 29 20 2a 20 6e 75 6d 5f  CATE + 1) * num_
1cda0 63 65 72 74 73 3b 0a 0a 09 09 69 66 20 28 69 6e  certs;....if (in
1cdb0 63 6c 75 64 65 5f 65 78 74 72 61 5f 63 65 72 74  clude_extra_cert
1cdc0 73 29 20 7b 0a 09 09 09 6e 75 6d 5f 69 64 73 20  s) {....num_ids 
1cdd0 2b 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 64  += cackey_read_d
1cde0 6f 64 5f 69 64 65 6e 74 69 74 69 65 73 28 4e 55  od_identities(NU
1cdf0 4c 4c 2c 20 6e 75 6d 5f 64 6f 64 5f 63 65 72 74  LL, num_dod_cert
1ce00 73 29 3b 0a 09 09 7d 0a 0a 09 09 69 64 65 6e 74  s);...}....ident
1ce10 69 74 69 65 73 20 3d 20 6d 61 6c 6c 6f 63 28 6e  ities = malloc(n
1ce20 75 6d 5f 69 64 73 20 2a 20 73 69 7a 65 6f 66 28  um_ids * sizeof(
1ce30 2a 69 64 65 6e 74 69 74 69 65 73 29 29 3b 0a 0a  *identities));..
1ce40 09 09 2f 2a 20 41 64 64 20 63 65 72 74 69 66 69  ../* Add certifi
1ce50 63 61 74 65 73 2c 20 70 75 62 6c 69 63 20 6b 65  cates, public ke
1ce60 79 73 2c 20 61 6e 64 20 70 72 69 76 61 74 65 20  ys, and private 
1ce70 6b 65 79 73 20 66 72 6f 6d 20 74 68 65 20 73 6d  keys from the sm
1ce80 61 72 74 63 61 72 64 20 2a 2f 0a 09 09 69 64 5f  artcard */...id_
1ce90 69 64 78 20 3d 20 30 3b 0a 09 09 66 6f 72 20 28  idx = 0;...for (
1cea0 63 65 72 74 5f 69 64 78 20 3d 20 30 3b 20 63 65  cert_idx = 0; ce
1ceb0 72 74 5f 69 64 78 20 3c 20 6e 75 6d 5f 63 65 72  rt_idx < num_cer
1cec0 74 73 3b 20 63 65 72 74 5f 69 64 78 2b 2b 29 20  ts; cert_idx++) 
1ced0 7b 0a 09 09 09 66 6f 72 20 28 63 75 72 72 5f 69  {....for (curr_i
1cee0 64 5f 74 79 70 65 20 3d 20 43 4b 4f 5f 43 45 52  d_type = CKO_CER
1cef0 54 49 46 49 43 41 54 45 3b 20 63 75 72 72 5f 69  TIFICATE; curr_i
1cf00 64 5f 74 79 70 65 20 3c 3d 20 43 4b 4f 5f 50 52  d_type <= CKO_PR
1cf10 49 56 41 54 45 5f 4b 45 59 3b 20 63 75 72 72 5f  IVATE_KEY; curr_
1cf20 69 64 5f 74 79 70 65 2b 2b 29 20 7b 0a 09 09 09  id_type++) {....
1cf30 09 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69  .identities[id_i
1cf40 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73 20 3d  dx].attributes =
1cf50 20 63 61 63 6b 65 79 5f 67 65 74 5f 61 74 74 72   cackey_get_attr
1cf60 69 62 75 74 65 73 28 63 75 72 72 5f 69 64 5f 74  ibutes(curr_id_t
1cf70 79 70 65 2c 20 26 70 63 73 63 5f 69 64 65 6e 74  ype, &pcsc_ident
1cf80 69 74 69 65 73 5b 63 65 72 74 5f 69 64 78 5d 2c  ities[cert_idx],
1cf90 20 63 65 72 74 5f 69 64 78 2c 20 26 69 64 65 6e   cert_idx, &iden
1cfa0 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61  tities[id_idx].a
1cfb0 74 74 72 69 62 75 74 65 73 5f 63 6f 75 6e 74 29  ttributes_count)
1cfc0 3b 0a 0a 09 09 09 09 69 64 65 6e 74 69 74 69 65  ;......identitie
1cfd0 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69  s[id_idx].pcsc_i
1cfe0 64 65 6e 74 69 74 79 20 3d 20 6d 61 6c 6c 6f 63  dentity = malloc
1cff0 28 73 69 7a 65 6f 66 28 2a 69 64 65 6e 74 69 74  (sizeof(*identit
1d000 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63  ies[id_idx].pcsc
1d010 5f 69 64 65 6e 74 69 74 79 29 29 3b 0a 09 09 09  _identity));....
1d020 09 6d 65 6d 63 70 79 28 69 64 65 6e 74 69 74 69  .memcpy(identiti
1d030 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f  es[id_idx].pcsc_
1d040 69 64 65 6e 74 69 74 79 2c 20 26 70 63 73 63 5f  identity, &pcsc_
1d050 69 64 65 6e 74 69 74 69 65 73 5b 63 65 72 74 5f  identities[cert_
1d060 69 64 78 5d 2c 20 73 69 7a 65 6f 66 28 2a 69 64  idx], sizeof(*id
1d070 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d  entities[id_idx]
1d080 2e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 29 29  .pcsc_identity))
1d090 3b 0a 0a 09 09 09 09 69 64 65 6e 74 69 74 69 65  ;......identitie
1d0a0 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69  s[id_idx].pcsc_i
1d0b0 64 65 6e 74 69 74 79 2d 3e 63 65 72 74 69 66 69  dentity->certifi
1d0c0 63 61 74 65 20 3d 20 6d 61 6c 6c 6f 63 28 70 63  cate = malloc(pc
1d0d0 73 63 5f 69 64 65 6e 74 69 74 69 65 73 5b 63 65  sc_identities[ce
1d0e0 72 74 5f 69 64 78 5d 2e 63 65 72 74 69 66 69 63  rt_idx].certific
1d0f0 61 74 65 5f 6c 65 6e 29 3b 0a 09 09 09 09 6d 65  ate_len);.....me
1d100 6d 63 70 79 28 69 64 65 6e 74 69 74 69 65 73 5b  mcpy(identities[
1d110 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64 65  id_idx].pcsc_ide
1d120 6e 74 69 74 79 2d 3e 63 65 72 74 69 66 69 63 61  ntity->certifica
1d130 74 65 2c 20 70 63 73 63 5f 69 64 65 6e 74 69 74  te, pcsc_identit
1d140 69 65 73 5b 63 65 72 74 5f 69 64 78 5d 2e 63 65  ies[cert_idx].ce
1d150 72 74 69 66 69 63 61 74 65 2c 20 70 63 73 63 5f  rtificate, pcsc_
1d160 69 64 65 6e 74 69 74 69 65 73 5b 63 65 72 74 5f  identities[cert_
1d170 69 64 78 5d 2e 63 65 72 74 69 66 69 63 61 74 65  idx].certificate
1d180 5f 6c 65 6e 29 3b 0a 0a 09 09 09 09 69 64 5f 69  _len);......id_i
1d190 64 78 2b 2b 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a  dx++;....}...}..
1d1a0 09 09 69 66 20 28 69 6e 63 6c 75 64 65 5f 65 78  ..if (include_ex
1d1b0 74 72 61 5f 63 65 72 74 73 29 20 7b 0a 09 09 09  tra_certs) {....
1d1c0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1d1d0 4e 54 46 28 22 49 6e 63 6c 75 64 69 6e 67 20 55  NTF("Including U
1d1e0 53 20 47 6f 76 65 72 6e 6d 65 6e 74 20 43 65 72  S Government Cer
1d1f0 74 69 66 69 63 61 74 65 73 20 6f 6e 20 68 61 72  tificates on har
1d200 64 77 61 72 65 20 73 6c 6f 74 22 29 3b 0a 0a 09  dware slot");...
1d210 09 09 63 61 63 6b 65 79 5f 72 65 61 64 5f 64 6f  ..cackey_read_do
1d220 64 5f 69 64 65 6e 74 69 74 69 65 73 28 69 64 65  d_identities(ide
1d230 6e 74 69 74 69 65 73 20 2b 20 69 64 5f 69 64 78  ntities + id_idx
1d240 2c 20 6e 75 6d 5f 64 6f 64 5f 63 65 72 74 73 29  , num_dod_certs)
1d250 3b 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f  ;...}....cackey_
1d260 66 72 65 65 5f 63 65 72 74 73 28 70 63 73 63 5f  free_certs(pcsc_
1d270 69 64 65 6e 74 69 74 69 65 73 2c 20 6e 75 6d 5f  identities, num_
1d280 63 65 72 74 73 2c 20 31 29 3b 0a 0a 09 09 2a 69  certs, 1);....*i
1d290 64 73 5f 66 6f 75 6e 64 20 3d 20 6e 75 6d 5f 69  ds_found = num_i
1d2a0 64 73 3b 0a 0a 09 09 72 65 74 75 72 6e 28 69 64  ds;....return(id
1d2b0 65 6e 74 69 74 69 65 73 29 3b 0a 09 7d 0a 0a 09  entities);..}...
1d2c0 2a 69 64 73 5f 66 6f 75 6e 64 20 3d 20 30 3b 0a  *ids_found = 0;.
1d2d0 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 7d  .return(NULL);.}
1d2e0 0a 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f  ..static cackey_
1d2f0 72 65 74 20 63 61 63 6b 65 79 5f 67 65 74 5f 70  ret cackey_get_p
1d300 69 6e 28 63 68 61 72 20 2a 70 69 6e 62 75 66 29  in(char *pinbuf)
1d310 20 7b 0a 09 46 49 4c 45 20 2a 70 69 6e 66 64 3b   {..FILE *pinfd;
1d320 0a 09 63 68 61 72 20 2a 66 67 65 74 73 5f 72 65  ..char *fgets_re
1d330 74 3b 0a 09 69 6e 74 20 70 63 6c 6f 73 65 5f 72  t;..int pclose_r
1d340 65 74 3b 0a 0a 09 69 66 20 28 63 61 63 6b 65 79  et;...if (cackey
1d350 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20 3d 3d 20  _pin_command == 
1d360 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e  NULL) {...return
1d370 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47  (CACKEY_PCSC_E_G
1d380 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 69 66  ENERIC);..}...if
1d390 20 28 70 69 6e 62 75 66 20 3d 3d 20 4e 55 4c 4c   (pinbuf == NULL
1d3a0 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 43 41 43  ) {...return(CAC
1d3b0 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52  KEY_PCSC_E_GENER
1d3c0 49 43 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  IC);..}...CACKEY
1d3d0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
1d3e0 41 43 4b 45 59 5f 50 49 4e 5f 43 4f 4d 4d 41 4e  ACKEY_PIN_COMMAN
1d3f0 44 20 3d 20 25 73 22 2c 20 63 61 63 6b 65 79 5f  D = %s", cackey_
1d400 70 69 6e 5f 63 6f 6d 6d 61 6e 64 29 3b 0a 0a 09  pin_command);...
1d410 70 69 6e 66 64 20 3d 20 70 6f 70 65 6e 28 63 61  pinfd = popen(ca
1d420 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64  ckey_pin_command
1d430 2c 20 22 72 22 29 3b 0a 09 69 66 20 28 70 69 6e  , "r");..if (pin
1d440 66 64 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  fd == NULL) {...
1d450 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1d460 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 25 73 3a  NTF("Error.  %s:
1d470 20 55 6e 61 62 6c 65 20 74 6f 20 72 75 6e 22 2c   Unable to run",
1d480 20 63 61 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d   cackey_pin_comm
1d490 61 6e 64 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  and);....return(
1d4a0 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 42 41  CACKEY_PCSC_E_BA
1d4b0 44 50 49 4e 29 3b 0a 09 7d 0a 0a 09 66 67 65 74  DPIN);..}...fget
1d4c0 73 5f 72 65 74 20 3d 20 66 67 65 74 73 28 70 69  s_ret = fgets(pi
1d4d0 6e 62 75 66 2c 20 33 32 2c 20 70 69 6e 66 64 29  nbuf, 32, pinfd)
1d4e0 3b 0a 09 69 66 20 28 66 67 65 74 73 5f 72 65 74  ;..if (fgets_ret
1d4f0 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 70 69   == NULL) {...pi
1d500 6e 62 75 66 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a  nbuf[0] = '\0';.
1d510 09 7d 0a 0a 09 70 63 6c 6f 73 65 5f 72 65 74 20  .}...pclose_ret 
1d520 3d 20 70 63 6c 6f 73 65 28 70 69 6e 66 64 29 3b  = pclose(pinfd);
1d530 0a 09 69 66 20 28 70 63 6c 6f 73 65 5f 72 65 74  ..if (pclose_ret
1d540 20 3d 3d 20 2d 31 20 26 26 20 65 72 72 6e 6f 20   == -1 && errno 
1d550 3d 3d 20 45 43 48 49 4c 44 29 20 7b 0a 09 09 43  == ECHILD) {...C
1d560 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1d570 54 46 28 22 4e 6f 74 69 63 65 2e 20 20 70 63 6c  TF("Notice.  pcl
1d580 6f 73 65 28 29 20 69 6e 64 69 63 61 74 65 64 20  ose() indicated 
1d590 69 74 20 63 6f 75 6c 64 20 6e 6f 74 20 67 65 74  it could not get
1d5a0 20 74 68 65 20 73 74 61 74 75 73 20 6f 66 20 74   the status of t
1d5b0 68 65 20 63 68 69 6c 64 2c 20 61 73 73 75 6d 69  he child, assumi
1d5c0 6e 67 20 69 74 20 73 75 63 63 65 65 65 64 65 64  ng it succeeeded
1d5d0 20 21 22 29 3b 0a 0a 09 09 70 63 6c 6f 73 65 5f   !");....pclose_
1d5e0 72 65 74 20 3d 20 30 3b 0a 09 7d 0a 0a 09 69 66  ret = 0;..}...if
1d5f0 20 28 70 63 6c 6f 73 65 5f 72 65 74 20 21 3d 20   (pclose_ret != 
1d600 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
1d610 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1d620 72 2e 20 20 25 73 3a 20 65 78 69 74 65 64 20 77  r.  %s: exited w
1d630 69 74 68 20 6e 6f 6e 2d 7a 65 72 6f 20 73 74 61  ith non-zero sta
1d640 74 75 73 20 6f 66 20 25 69 22 2c 20 63 61 63 6b  tus of %i", cack
1d650 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 2c 20  ey_pin_command, 
1d660 70 63 6c 6f 73 65 5f 72 65 74 29 3b 0a 0a 09 09  pclose_ret);....
1d670 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
1d680 53 43 5f 45 5f 42 41 44 50 49 4e 29 3b 0a 09 7d  SC_E_BADPIN);..}
1d690 0a 0a 09 69 66 20 28 73 74 72 6c 65 6e 28 70 69  ...if (strlen(pi
1d6a0 6e 62 75 66 29 20 3c 20 31 29 20 7b 0a 09 09 43  nbuf) < 1) {...C
1d6b0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1d6c0 54 46 28 22 45 72 72 6f 72 2e 20 20 25 73 3a 20  TF("Error.  %s: 
1d6d0 72 65 74 75 72 6e 65 64 20 6e 6f 20 64 61 74 61  returned no data
1d6e0 22 2c 20 63 61 63 6b 65 79 5f 70 69 6e 5f 63 6f  ", cackey_pin_co
1d6f0 6d 6d 61 6e 64 29 3b 0a 0a 09 09 72 65 74 75 72  mmand);....retur
1d700 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  n(CACKEY_PCSC_E_
1d710 42 41 44 50 49 4e 29 3b 0a 09 7d 0a 0a 09 69 66  BADPIN);..}...if
1d720 20 28 70 69 6e 62 75 66 5b 73 74 72 6c 65 6e 28   (pinbuf[strlen(
1d730 70 69 6e 62 75 66 29 20 2d 20 31 5d 20 3d 3d 20  pinbuf) - 1] == 
1d740 27 5c 6e 27 29 20 7b 0a 09 09 70 69 6e 62 75 66  '\n') {...pinbuf
1d750 5b 73 74 72 6c 65 6e 28 70 69 6e 62 75 66 29 20  [strlen(pinbuf) 
1d760 2d 20 31 5d 20 3d 20 27 5c 30 27 3b 0a 09 7d 0a  - 1] = '\0';..}.
1d770 0a 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
1d780 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 43  PCSC_S_OK);.}..C
1d790 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
1d7a0 4e 28 43 4b 5f 52 56 2c 20 43 5f 49 6e 69 74 69  N(CK_RV, C_Initi
1d7b0 61 6c 69 7a 65 29 28 43 4b 5f 56 4f 49 44 5f 50  alize)(CK_VOID_P
1d7c0 54 52 20 70 49 6e 69 74 41 72 67 73 29 20 7b 0a  TR pInitArgs) {.
1d7d0 09 43 4b 5f 43 5f 49 4e 49 54 49 41 4c 49 5a 45  .CK_C_INITIALIZE
1d7e0 5f 41 52 47 53 20 43 4b 5f 50 54 52 20 61 72 67  _ARGS CK_PTR arg
1d7f0 73 3b 0a 09 75 69 6e 74 33 32 5f 74 20 69 64 78  s;..uint32_t idx
1d800 2c 20 68 69 67 68 65 73 74 5f 73 6c 6f 74 3b 0a  , highest_slot;.
1d810 09 69 6e 74 20 6d 75 74 65 78 5f 69 6e 69 74 5f  .int mutex_init_
1d820 72 65 74 3b 0a 09 69 6e 74 20 69 6e 63 6c 75 64  ret;..int includ
1d830 65 5f 64 6f 64 5f 63 65 72 74 73 3b 0a 0a 09 43  e_dod_certs;...C
1d840 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1d850 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
1d860 09 69 66 20 28 63 61 63 6b 65 79 5f 69 6e 69 74  .if (cackey_init
1d870 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
1d880 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1d890 28 22 45 72 72 6f 72 2e 20 20 41 6c 72 65 61 64  ("Error.  Alread
1d8a0 79 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  y initialized.")
1d8b0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
1d8c0 43 52 59 50 54 4f 4b 49 5f 41 4c 52 45 41 44 59  CRYPTOKI_ALREADY
1d8d0 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
1d8e0 7d 0a 0a 09 69 66 20 28 70 49 6e 69 74 41 72 67  }...if (pInitArg
1d8f0 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 61  s != NULL) {...a
1d900 72 67 73 20 3d 20 70 49 6e 69 74 41 72 67 73 3b  rgs = pInitArgs;
1d910 0a 09 09 6d 65 6d 63 70 79 28 26 63 61 63 6b 65  ...memcpy(&cacke
1d920 79 5f 61 72 67 73 2c 20 61 72 67 73 2c 20 73 69  y_args, args, si
1d930 7a 65 6f 66 28 63 61 63 6b 65 79 5f 61 72 67 73  zeof(cackey_args
1d940 29 29 3b 0a 0a 09 09 69 66 20 28 61 72 67 73 2d  ));....if (args-
1d950 3e 43 72 65 61 74 65 4d 75 74 65 78 20 3d 3d 20  >CreateMutex == 
1d960 4e 55 4c 4c 20 7c 7c 20 61 72 67 73 2d 3e 44 65  NULL || args->De
1d970 73 74 72 6f 79 4d 75 74 65 78 20 3d 3d 20 4e 55  stroyMutex == NU
1d980 4c 4c 20 7c 7c 20 61 72 67 73 2d 3e 4c 6f 63 6b  LL || args->Lock
1d990 4d 75 74 65 78 20 3d 3d 20 4e 55 4c 4c 20 7c 7c  Mutex == NULL ||
1d9a0 20 61 72 67 73 2d 3e 55 6e 6c 6f 63 6b 4d 75 74   args->UnlockMut
1d9b0 65 78 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  ex == NULL) {...
1d9c0 09 69 66 20 28 61 72 67 73 2d 3e 43 72 65 61 74  .if (args->Creat
1d9d0 65 4d 75 74 65 78 20 21 3d 20 4e 55 4c 4c 20 7c  eMutex != NULL |
1d9e0 7c 20 61 72 67 73 2d 3e 44 65 73 74 72 6f 79 4d  | args->DestroyM
1d9f0 75 74 65 78 20 21 3d 20 4e 55 4c 4c 20 7c 7c 20  utex != NULL || 
1da00 61 72 67 73 2d 3e 4c 6f 63 6b 4d 75 74 65 78 20  args->LockMutex 
1da10 21 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 73 2d  != NULL || args-
1da20 3e 55 6e 6c 6f 63 6b 4d 75 74 65 78 20 21 3d 20  >UnlockMutex != 
1da30 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 43 41 43 4b  NULL) {.....CACK
1da40 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1da50 22 45 72 72 6f 72 2e 20 53 6f 6d 65 2c 20 62 75  "Error. Some, bu
1da60 74 20 6e 6f 74 20 41 6c 6c 20 74 68 72 65 61 64  t not All thread
1da70 69 6e 67 20 70 72 69 6d 69 74 69 76 65 73 20 70  ing primitives p
1da80 72 6f 76 69 64 65 64 2e 22 29 3b 0a 0a 09 09 09  rovided.");.....
1da90 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55  .return(CKR_ARGU
1daa0 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 09 09 7d  MENTS_BAD);....}
1dab0 0a 09 09 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09  ...}..} else {..
1dac0 09 63 61 63 6b 65 79 5f 61 72 67 73 2e 43 72 65  .cackey_args.Cre
1dad0 61 74 65 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b  ateMutex = NULL;
1dae0 0a 09 09 63 61 63 6b 65 79 5f 61 72 67 73 2e 44  ...cackey_args.D
1daf0 65 73 74 72 6f 79 4d 75 74 65 78 20 3d 20 4e 55  estroyMutex = NU
1db00 4c 4c 3b 0a 09 09 63 61 63 6b 65 79 5f 61 72 67  LL;...cackey_arg
1db10 73 2e 4c 6f 63 6b 4d 75 74 65 78 20 3d 20 4e 55  s.LockMutex = NU
1db20 4c 4c 3b 0a 09 09 63 61 63 6b 65 79 5f 61 72 67  LL;...cackey_arg
1db30 73 2e 55 6e 6c 6f 63 6b 4d 75 74 65 78 20 3d 20  s.UnlockMutex = 
1db40 4e 55 4c 4c 3b 0a 09 09 63 61 63 6b 65 79 5f 61  NULL;...cackey_a
1db50 72 67 73 2e 66 6c 61 67 73 20 3d 20 30 3b 0a 09  rgs.flags = 0;..
1db60 7d 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 30  }...for (idx = 0
1db70 3b 20 69 64 78 20 3c 20 28 73 69 7a 65 6f 66 28  ; idx < (sizeof(
1db80 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29  cackey_sessions)
1db90 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
1dba0 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 3b 20  _sessions[0])); 
1dbb0 69 64 78 2b 2b 29 20 7b 0a 09 09 63 61 63 6b 65  idx++) {...cacke
1dbc0 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e  y_sessions[idx].
1dbd0 61 63 74 69 76 65 20 3d 20 30 3b 0a 09 7d 0a 0a  active = 0;..}..
1dbe0 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69  .for (idx = 0; i
1dbf0 64 78 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63  dx < (sizeof(cac
1dc00 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a  key_slots) / siz
1dc10 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
1dc20 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29 20 7b 0a  [0])); idx++) {.
1dc30 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69  ..cackey_slots[i
1dc40 64 78 5d 2e 61 63 74 69 76 65 20 3d 20 30 3b 0a  dx].active = 0;.
1dc50 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69  ..cackey_slots[i
1dc60 64 78 5d 2e 70 63 73 63 5f 72 65 61 64 65 72 20  dx].pcsc_reader 
1dc70 3d 20 4e 55 4c 4c 3b 0a 09 09 63 61 63 6b 65 79  = NULL;...cackey
1dc80 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 74 72 61 6e  _slots[idx].tran
1dc90 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d 20  saction_depth = 
1dca0 30 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  0;...cackey_slot
1dcb0 73 5b 69 64 78 5d 2e 74 72 61 6e 73 61 63 74 69  s[idx].transacti
1dcc0 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b 20  on_need_hw_lock 
1dcd0 3d 20 30 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c  = 0;...cackey_sl
1dce0 6f 74 73 5b 69 64 78 5d 2e 73 6c 6f 74 5f 72 65  ots[idx].slot_re
1dcf0 73 65 74 20 3d 20 30 3b 0a 09 09 63 61 63 6b 65  set = 0;...cacke
1dd00 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 74 6f 6b  y_slots[idx].tok
1dd10 65 6e 5f 66 6c 61 67 73 20 3d 20 30 3b 0a 09 09  en_flags = 0;...
1dd20 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78  cackey_slots[idx
1dd30 5d 2e 6c 61 62 65 6c 20 3d 20 4e 55 4c 4c 3b 0a  ].label = NULL;.
1dd40 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69  ..cackey_slots[i
1dd50 64 78 5d 2e 69 6e 74 65 72 6e 61 6c 20 3d 20 30  dx].internal = 0
1dd60 3b 0a 09 7d 0a 0a 23 69 66 64 65 66 20 43 41 43  ;..}..#ifdef CAC
1dd70 4b 45 59 5f 4e 4f 5f 45 58 54 52 41 5f 43 45 52  KEY_NO_EXTRA_CER
1dd80 54 53 0a 09 69 66 20 28 67 65 74 65 6e 76 28 22  TS..if (getenv("
1dd90 43 41 43 4b 45 59 5f 45 58 54 52 41 5f 43 45 52  CACKEY_EXTRA_CER
1dda0 54 53 22 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  TS") != NULL) {.
1ddb0 09 09 69 6e 63 6c 75 64 65 5f 64 6f 64 5f 63 65  ..include_dod_ce
1ddc0 72 74 73 20 3d 20 31 3b 0a 09 7d 20 65 6c 73 65  rts = 1;..} else
1ddd0 20 7b 0a 09 09 69 6e 63 6c 75 64 65 5f 64 6f 64   {...include_dod
1dde0 5f 63 65 72 74 73 20 3d 20 30 3b 0a 09 7d 0a 23  _certs = 0;..}.#
1ddf0 65 6c 73 65 0a 09 69 66 20 28 67 65 74 65 6e 76  else..if (getenv
1de00 28 22 43 41 43 4b 45 59 5f 4e 4f 5f 45 58 54 52  ("CACKEY_NO_EXTR
1de10 41 5f 43 45 52 54 53 22 29 20 21 3d 20 4e 55 4c  A_CERTS") != NUL
1de20 4c 29 20 7b 0a 09 09 69 6e 63 6c 75 64 65 5f 64  L) {...include_d
1de30 6f 64 5f 63 65 72 74 73 20 3d 20 30 3b 0a 09 7d  od_certs = 0;..}
1de40 20 65 6c 73 65 20 7b 0a 09 09 69 6e 63 6c 75 64   else {...includ
1de50 65 5f 64 6f 64 5f 63 65 72 74 73 20 3d 20 31 3b  e_dod_certs = 1;
1de60 0a 09 7d 0a 23 65 6e 64 69 66 0a 0a 09 69 66 20  ..}.#endif...if 
1de70 28 69 6e 63 6c 75 64 65 5f 64 6f 64 5f 63 65 72  (include_dod_cer
1de80 74 73 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43  ts == 0) {...CAC
1de90 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1dea0 28 22 41 73 6b 65 64 20 6e 6f 74 20 74 6f 20 69  ("Asked not to i
1deb0 6e 63 6c 75 64 65 20 44 6f 44 20 63 65 72 74 69  nclude DoD certi
1dec0 66 69 63 61 74 65 73 22 29 3b 0a 09 7d 20 65 6c  ficates");..} el
1ded0 73 65 20 7b 0a 09 09 68 69 67 68 65 73 74 5f 73  se {...highest_s
1dee0 6c 6f 74 20 3d 20 28 73 69 7a 65 6f 66 28 63 61  lot = (sizeof(ca
1def0 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69  ckey_slots) / si
1df00 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
1df10 73 5b 30 5d 29 29 20 2d 20 31 3b 0a 0a 09 09 43  s[0])) - 1;....C
1df20 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1df30 54 46 28 22 49 6e 63 6c 75 64 69 6e 67 20 44 6f  TF("Including Do
1df40 44 20 63 65 72 74 73 20 69 6e 20 73 6c 6f 74 20  D certs in slot 
1df50 25 6c 75 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  %lu", (unsigned 
1df60 6c 6f 6e 67 29 20 68 69 67 68 65 73 74 5f 73 6c  long) highest_sl
1df70 6f 74 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 73  ot);....cackey_s
1df80 6c 6f 74 73 5b 68 69 67 68 65 73 74 5f 73 6c 6f  lots[highest_slo
1df90 74 5d 2e 61 63 74 69 76 65 20 3d 20 31 3b 0a 09  t].active = 1;..
1dfa0 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 68 69  .cackey_slots[hi
1dfb0 67 68 65 73 74 5f 73 6c 6f 74 5d 2e 69 6e 74 65  ghest_slot].inte
1dfc0 72 6e 61 6c 20 3d 20 31 3b 0a 09 09 63 61 63 6b  rnal = 1;...cack
1dfd0 65 79 5f 73 6c 6f 74 73 5b 68 69 67 68 65 73 74  ey_slots[highest
1dfe0 5f 73 6c 6f 74 5d 2e 6c 61 62 65 6c 20 3d 20 28  _slot].label = (
1dff0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
1e000 20 22 55 53 20 47 6f 76 65 72 6e 6d 65 6e 74 20   "US Government 
1e010 43 65 72 74 69 66 69 63 61 74 65 73 22 3b 0a 09  Certificates";..
1e020 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 68 69  .cackey_slots[hi
1e030 67 68 65 73 74 5f 73 6c 6f 74 5d 2e 70 63 73 63  ghest_slot].pcsc
1e040 5f 72 65 61 64 65 72 20 3d 20 22 43 41 43 4b 65  _reader = "CACKe
1e050 79 22 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f  y";...cackey_slo
1e060 74 73 5b 68 69 67 68 65 73 74 5f 73 6c 6f 74 5d  ts[highest_slot]
1e070 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 3d 20 30  .token_flags = 0
1e080 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 69 6e  ;..}...cackey_in
1e090 69 74 69 61 6c 69 7a 65 64 20 3d 20 31 3b 0a 0a  itialized = 1;..
1e0a0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 62 69 67  .if (!cackey_big
1e0b0 6c 6f 63 6b 5f 69 6e 69 74 29 20 7b 0a 09 09 6d  lock_init) {...m
1e0c0 75 74 65 78 5f 69 6e 69 74 5f 72 65 74 20 3d 20  utex_init_ret = 
1e0d0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 63 72 65  cackey_mutex_cre
1e0e0 61 74 65 28 26 63 61 63 6b 65 79 5f 62 69 67 6c  ate(&cackey_bigl
1e0f0 6f 63 6b 29 3b 0a 0a 09 09 69 66 20 28 6d 75 74  ock);....if (mut
1e100 65 78 5f 69 6e 69 74 5f 72 65 74 20 21 3d 20 30  ex_init_ret != 0
1e110 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
1e120 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1e130 72 2e 20 20 4d 75 74 65 78 20 69 6e 69 74 69 61  r.  Mutex initia
1e140 6c 69 7a 61 74 69 6f 6e 20 66 61 69 6c 65 64 2e  lization failed.
1e150 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43  ");.....return(C
1e160 4b 52 5f 43 41 4e 54 5f 4c 4f 43 4b 29 3b 0a 09  KR_CANT_LOCK);..
1e170 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 62 69 67  .}....cackey_big
1e180 6c 6f 63 6b 5f 69 6e 69 74 20 3d 20 31 3b 0a 09  lock_init = 1;..
1e190 7d 0a 0a 09 2f 2a 20 44 65 66 69 6e 65 20 61 20  }.../* Define a 
1e1a0 63 6f 6d 6d 61 6e 64 20 74 6f 20 70 72 6f 6d 70  command to promp
1e1b0 74 20 75 73 65 72 20 66 6f 72 20 61 20 50 49 4e  t user for a PIN
1e1c0 20 2a 2f 0a 23 69 66 64 65 66 20 43 41 43 4b 45   */.#ifdef CACKE
1e1d0 59 5f 50 49 4e 5f 43 4f 4d 4d 41 4e 44 5f 44 45  Y_PIN_COMMAND_DE
1e1e0 46 41 55 4c 54 0a 09 63 61 63 6b 65 79 5f 70 69  FAULT..cackey_pi
1e1f0 6e 5f 63 6f 6d 6d 61 6e 64 20 3d 20 73 74 72 64  n_command = strd
1e200 75 70 28 43 41 43 4b 45 59 5f 4d 41 43 52 4f 5f  up(CACKEY_MACRO_
1e210 44 45 46 41 55 4c 54 5f 58 53 54 52 28 43 41 43  DEFAULT_XSTR(CAC
1e220 4b 45 59 5f 50 49 4e 5f 43 4f 4d 4d 41 4e 44 5f  KEY_PIN_COMMAND_
1e230 44 45 46 41 55 4c 54 29 29 3b 0a 23 65 6e 64 69  DEFAULT));.#endi
1e240 66 0a 0a 23 69 66 64 65 66 20 43 41 43 4b 45 59  f..#ifdef CACKEY
1e250 5f 50 49 4e 5f 43 4f 4d 4d 41 4e 44 5f 58 4f 4e  _PIN_COMMAND_XON
1e260 4c 59 5f 44 45 46 41 55 4c 54 0a 09 69 66 20 28  LY_DEFAULT..if (
1e270 67 65 74 65 6e 76 28 22 44 49 53 50 4c 41 59 22  getenv("DISPLAY"
1e280 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 63  ) != NULL) {...c
1e290 61 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e  ackey_pin_comman
1e2a0 64 20 3d 20 73 74 72 64 75 70 28 43 41 43 4b 45  d = strdup(CACKE
1e2b0 59 5f 4d 41 43 52 4f 5f 44 45 46 41 55 4c 54 5f  Y_MACRO_DEFAULT_
1e2c0 58 53 54 52 28 43 41 43 4b 45 59 5f 50 49 4e 5f  XSTR(CACKEY_PIN_
1e2d0 43 4f 4d 4d 41 4e 44 5f 58 4f 4e 4c 59 5f 44 45  COMMAND_XONLY_DE
1e2e0 46 41 55 4c 54 29 29 3b 0a 09 7d 0a 23 65 6e 64  FAULT));..}.#end
1e2f0 69 66 0a 0a 09 69 66 20 28 67 65 74 65 6e 76 28  if...if (getenv(
1e300 22 43 41 43 4b 45 59 5f 50 49 4e 5f 43 4f 4d 4d  "CACKEY_PIN_COMM
1e310 41 4e 44 22 29 20 21 3d 20 4e 55 4c 4c 29 20 7b  AND") != NULL) {
1e320 0a 09 09 63 61 63 6b 65 79 5f 70 69 6e 5f 63 6f  ...cackey_pin_co
1e330 6d 6d 61 6e 64 20 3d 20 73 74 72 64 75 70 28 67  mmand = strdup(g
1e340 65 74 65 6e 76 28 22 43 41 43 4b 45 59 5f 50 49  etenv("CACKEY_PI
1e350 4e 5f 43 4f 4d 4d 41 4e 44 22 29 29 3b 0a 09 7d  N_COMMAND"));..}
1e360 0a 0a 09 69 66 20 28 67 65 74 65 6e 76 28 22 43  ...if (getenv("C
1e370 41 43 4b 45 59 5f 50 49 4e 5f 43 4f 4d 4d 41 4e  ACKEY_PIN_COMMAN
1e380 44 5f 58 4f 4e 4c 59 22 29 20 21 3d 20 4e 55 4c  D_XONLY") != NUL
1e390 4c 20 26 26 20 67 65 74 65 6e 76 28 22 44 49 53  L && getenv("DIS
1e3a0 50 4c 41 59 22 29 20 21 3d 20 4e 55 4c 4c 29 20  PLAY") != NULL) 
1e3b0 7b 0a 09 09 63 61 63 6b 65 79 5f 70 69 6e 5f 63  {...cackey_pin_c
1e3c0 6f 6d 6d 61 6e 64 20 3d 20 73 74 72 64 75 70 28  ommand = strdup(
1e3d0 67 65 74 65 6e 76 28 22 43 41 43 4b 45 59 5f 50  getenv("CACKEY_P
1e3e0 49 4e 5f 43 4f 4d 4d 41 4e 44 5f 58 4f 4e 4c 59  IN_COMMAND_XONLY
1e3f0 22 29 29 3b 0a 09 7d 0a 0a 23 69 66 64 65 66 20  "));..}..#ifdef 
1e400 43 41 43 4b 45 59 5f 52 45 41 44 45 52 53 5f 49  CACKEY_READERS_I
1e410 4e 43 4c 55 44 45 5f 4f 4e 4c 59 5f 44 45 46 41  NCLUDE_ONLY_DEFA
1e420 55 4c 54 0a 09 63 61 63 6b 65 79 5f 72 65 61 64  ULT..cackey_read
1e430 65 72 73 5f 69 6e 63 6c 75 64 65 5f 6f 6e 6c 79  ers_include_only
1e440 20 3d 20 73 74 72 64 75 70 28 43 41 43 4b 45 59   = strdup(CACKEY
1e450 5f 4d 41 43 52 4f 5f 44 45 46 41 55 4c 54 5f 58  _MACRO_DEFAULT_X
1e460 53 54 52 28 43 41 43 4b 45 59 5f 52 45 41 44 45  STR(CACKEY_READE
1e470 52 53 5f 49 4e 43 4c 55 44 45 5f 4f 4e 4c 59 5f  RS_INCLUDE_ONLY_
1e480 44 45 46 41 55 4c 54 29 29 3b 0a 23 65 6e 64 69  DEFAULT));.#endi
1e490 66 0a 0a 23 69 66 64 65 66 20 43 41 43 4b 45 59  f..#ifdef CACKEY
1e4a0 5f 52 45 41 44 45 52 53 5f 45 58 43 4c 55 44 45  _READERS_EXCLUDE
1e4b0 5f 44 45 46 41 55 4c 54 0a 09 63 61 63 6b 65 79  _DEFAULT..cackey
1e4c0 5f 72 65 61 64 65 72 73 5f 65 78 63 6c 75 64 65  _readers_exclude
1e4d0 20 3d 20 73 74 72 64 75 70 28 43 41 43 4b 45 59   = strdup(CACKEY
1e4e0 5f 4d 41 43 52 4f 5f 44 45 46 41 55 4c 54 5f 58  _MACRO_DEFAULT_X
1e4f0 53 54 52 28 43 41 43 4b 45 59 5f 52 45 41 44 45  STR(CACKEY_READE
1e500 52 53 5f 45 58 43 4c 55 44 45 5f 44 45 46 41 55  RS_EXCLUDE_DEFAU
1e510 4c 54 29 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 69  LT));.#endif...i
1e520 66 20 28 67 65 74 65 6e 76 28 22 43 41 43 4b 45  f (getenv("CACKE
1e530 59 5f 52 45 41 44 45 52 53 5f 49 4e 43 4c 55 44  Y_READERS_INCLUD
1e540 45 5f 4f 4e 4c 59 22 29 20 21 3d 20 4e 55 4c 4c  E_ONLY") != NULL
1e550 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 72 65 61  ) {...cackey_rea
1e560 64 65 72 73 5f 69 6e 63 6c 75 64 65 5f 6f 6e 6c  ders_include_onl
1e570 79 20 3d 20 73 74 72 64 75 70 28 67 65 74 65 6e  y = strdup(geten
1e580 76 28 22 43 41 43 4b 45 59 5f 52 45 41 44 45 52  v("CACKEY_READER
1e590 53 5f 49 4e 43 4c 55 44 45 5f 4f 4e 4c 59 22 29  S_INCLUDE_ONLY")
1e5a0 29 3b 0a 0a 09 09 69 66 20 28 63 61 63 6b 65 79  );....if (cackey
1e5b0 5f 72 65 61 64 65 72 73 5f 69 6e 63 6c 75 64 65  _readers_include
1e5c0 5f 6f 6e 6c 79 5b 30 5d 20 3d 3d 20 27 5c 30 27  _only[0] == '\0'
1e5d0 29 20 7b 0a 09 09 09 66 72 65 65 28 63 61 63 6b  ) {....free(cack
1e5e0 65 79 5f 72 65 61 64 65 72 73 5f 69 6e 63 6c 75  ey_readers_inclu
1e5f0 64 65 5f 6f 6e 6c 79 29 3b 0a 0a 09 09 09 63 61  de_only);.....ca
1e600 63 6b 65 79 5f 72 65 61 64 65 72 73 5f 69 6e 63  ckey_readers_inc
1e610 6c 75 64 65 5f 6f 6e 6c 79 20 3d 20 4e 55 4c 4c  lude_only = NULL
1e620 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28 67  ;...}..}...if (g
1e630 65 74 65 6e 76 28 22 43 41 43 4b 45 59 5f 52 45  etenv("CACKEY_RE
1e640 41 44 45 52 53 5f 45 58 43 4c 55 44 45 22 29 20  ADERS_EXCLUDE") 
1e650 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 63 61 63  != NULL) {...cac
1e660 6b 65 79 5f 72 65 61 64 65 72 73 5f 65 78 63 6c  key_readers_excl
1e670 75 64 65 20 3d 20 73 74 72 64 75 70 28 67 65 74  ude = strdup(get
1e680 65 6e 76 28 22 43 41 43 4b 45 59 5f 52 45 41 44  env("CACKEY_READ
1e690 45 52 53 5f 45 58 43 4c 55 44 45 22 29 29 3b 0a  ERS_EXCLUDE"));.
1e6a0 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 72 65  ...if (cackey_re
1e6b0 61 64 65 72 73 5f 65 78 63 6c 75 64 65 5b 30 5d  aders_exclude[0]
1e6c0 20 3d 3d 20 27 5c 30 27 29 20 7b 0a 09 09 09 66   == '\0') {....f
1e6d0 72 65 65 28 63 61 63 6b 65 79 5f 72 65 61 64 65  ree(cackey_reade
1e6e0 72 73 5f 65 78 63 6c 75 64 65 29 3b 0a 0a 09 09  rs_exclude);....
1e6f0 09 63 61 63 6b 65 79 5f 72 65 61 64 65 72 73 5f  .cackey_readers_
1e700 65 78 63 6c 75 64 65 20 3d 20 4e 55 4c 4c 3b 0a  exclude = NULL;.
1e710 09 09 7d 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  ..}..}...CACKEY_
1e720 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
1e730 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28  turning CKR_OK (
1e740 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a  %i)", CKR_OK);..
1e750 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b  .return(CKR_OK);
1e760 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
1e770 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
1e780 46 69 6e 61 6c 69 7a 65 29 28 43 4b 5f 56 4f 49  Finalize)(CK_VOI
1e790 44 5f 50 54 52 20 70 52 65 73 65 72 76 65 64 29  D_PTR pReserved)
1e7a0 20 7b 0a 09 75 69 6e 74 33 32 5f 74 20 69 64 78   {..uint32_t idx
1e7b0 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
1e7c0 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
1e7d0 22 29 3b 0a 0a 09 69 66 20 28 70 52 65 73 65 72  ");...if (pReser
1e7e0 76 65 64 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ved != NULL) {..
1e7f0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1e800 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 52 65  INTF("Error. pRe
1e810 73 65 72 76 65 64 20 69 73 20 6e 6f 74 20 4e 55  served is not NU
1e820 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  LL.");....return
1e830 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42  (CKR_ARGUMENTS_B
1e840 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63  AD);..}...if (!c
1e850 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
1e860 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
1e870 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1e880 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
1e890 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
1e8a0 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
1e8b0 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
1e8c0 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d  ..}...for (idx =
1e8d0 20 30 3b 20 69 64 78 20 3c 20 28 73 69 7a 65 6f   0; idx < (sizeo
1e8e0 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
1e8f0 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
1e900 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29  ey_sessions[0]))
1e910 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20  ; idx++) {...if 
1e920 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
1e930 5b 69 64 78 5d 2e 61 63 74 69 76 65 29 20 7b 0a  [idx].active) {.
1e940 09 09 09 43 5f 43 6c 6f 73 65 53 65 73 73 69 6f  ...C_CloseSessio
1e950 6e 28 69 64 78 29 3b 0a 09 09 7d 0a 09 7d 0a 0a  n(idx);...}..}..
1e960 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5f 64 69  .cackey_slots_di
1e970 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28 29 3b 0a  sconnect_all();.
1e980 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20  ..for (idx = 0; 
1e990 69 64 78 20 3c 20 28 73 69 7a 65 6f 66 28 63 61  idx < (sizeof(ca
1e9a0 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69  ckey_slots) / si
1e9b0 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
1e9c0 73 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29 20 7b  s[0])); idx++) {
1e9d0 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c  ...if (cackey_sl
1e9e0 6f 74 73 5b 69 64 78 5d 2e 69 6e 74 65 72 6e 61  ots[idx].interna
1e9f0 6c 29 20 7b 0a 09 09 09 63 6f 6e 74 69 6e 75 65  l) {....continue
1ea00 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 63 61 63  ;...}....if (cac
1ea10 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 70  key_slots[idx].p
1ea20 63 73 63 5f 72 65 61 64 65 72 29 20 7b 0a 09 09  csc_reader) {...
1ea30 09 66 72 65 65 28 63 61 63 6b 65 79 5f 73 6c 6f  .free(cackey_slo
1ea40 74 73 5b 69 64 78 5d 2e 70 63 73 63 5f 72 65 61  ts[idx].pcsc_rea
1ea50 64 65 72 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 20  der);...}....if 
1ea60 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64  (cackey_slots[id
1ea70 78 5d 2e 63 61 63 68 65 64 5f 63 65 72 74 73 29  x].cached_certs)
1ea80 20 7b 0a 09 09 09 63 61 63 6b 65 79 5f 66 72 65   {....cackey_fre
1ea90 65 5f 63 65 72 74 73 28 63 61 63 6b 65 79 5f 73  e_certs(cackey_s
1eaa0 6c 6f 74 73 5b 69 64 78 5d 2e 63 61 63 68 65 64  lots[idx].cached
1eab0 5f 63 65 72 74 73 2c 20 63 61 63 6b 65 79 5f 73  _certs, cackey_s
1eac0 6c 6f 74 73 5b 69 64 78 5d 2e 63 61 63 68 65 64  lots[idx].cached
1ead0 5f 63 65 72 74 73 5f 63 6f 75 6e 74 2c 20 31 29  _certs_count, 1)
1eae0 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f  ;.....cackey_slo
1eaf0 74 73 5b 69 64 78 5d 2e 63 61 63 68 65 64 5f 63  ts[idx].cached_c
1eb00 65 72 74 73 20 3d 20 4e 55 4c 4c 3b 0a 09 09 7d  erts = NULL;...}
1eb10 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 70 63 73  ..}...cackey_pcs
1eb20 63 5f 64 69 73 63 6f 6e 6e 65 63 74 28 29 3b 0a  c_disconnect();.
1eb30 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 70 69 6e  ..if (cackey_pin
1eb40 5f 63 6f 6d 6d 61 6e 64 20 21 3d 20 4e 55 4c 4c  _command != NULL
1eb50 29 20 7b 0a 09 09 66 72 65 65 28 63 61 63 6b 65  ) {...free(cacke
1eb60 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 29 3b 0a  y_pin_command);.
1eb70 0a 09 09 63 61 63 6b 65 79 5f 70 69 6e 5f 63 6f  ...cackey_pin_co
1eb80 6d 6d 61 6e 64 20 3d 20 4e 55 4c 4c 3b 0a 09 7d  mmand = NULL;..}
1eb90 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 72 65  ...if (cackey_re
1eba0 61 64 65 72 73 5f 69 6e 63 6c 75 64 65 5f 6f 6e  aders_include_on
1ebb0 6c 79 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  ly != NULL) {...
1ebc0 66 72 65 65 28 63 61 63 6b 65 79 5f 72 65 61 64  free(cackey_read
1ebd0 65 72 73 5f 69 6e 63 6c 75 64 65 5f 6f 6e 6c 79  ers_include_only
1ebe0 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 72 65 61  );....cackey_rea
1ebf0 64 65 72 73 5f 69 6e 63 6c 75 64 65 5f 6f 6e 6c  ders_include_onl
1ec00 79 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 0a 09 69  y = NULL;..}...i
1ec10 66 20 28 63 61 63 6b 65 79 5f 72 65 61 64 65 72  f (cackey_reader
1ec20 73 5f 65 78 63 6c 75 64 65 20 21 3d 20 4e 55 4c  s_exclude != NUL
1ec30 4c 29 20 7b 0a 09 09 66 72 65 65 28 63 61 63 6b  L) {...free(cack
1ec40 65 79 5f 72 65 61 64 65 72 73 5f 65 78 63 6c 75  ey_readers_exclu
1ec50 64 65 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 72  de);....cackey_r
1ec60 65 61 64 65 72 73 5f 65 78 63 6c 75 64 65 20 3d  eaders_exclude =
1ec70 20 4e 55 4c 4c 3b 0a 09 7d 0a 0a 09 63 61 63 6b   NULL;..}...cack
1ec80 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d  ey_initialized =
1ec90 20 30 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42   0;...CACKEY_DEB
1eca0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
1ecb0 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29  ning CKR_OK (%i)
1ecc0 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65  ", CKR_OK);...re
1ecd0 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a  turn(CKR_OK);.}.
1ece0 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
1ecf0 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74  ION(CK_RV, C_Get
1ed00 49 6e 66 6f 29 28 43 4b 5f 49 4e 46 4f 5f 50 54  Info)(CK_INFO_PT
1ed10 52 20 70 49 6e 66 6f 29 20 7b 0a 09 73 74 61 74  R pInfo) {..stat
1ed20 69 63 20 43 4b 5f 55 54 46 38 43 48 41 52 20 6d  ic CK_UTF8CHAR m
1ed30 61 6e 75 66 61 63 74 75 72 65 72 49 44 5b 5d 20  anufacturerID[] 
1ed40 3d 20 22 55 2e 53 2e 20 47 6f 76 65 72 6e 6d 65  = "U.S. Governme
1ed50 6e 74 22 3b 0a 09 73 74 61 74 69 63 20 43 4b 5f  nt";..static CK_
1ed60 55 54 46 38 43 48 41 52 20 6c 69 62 72 61 72 79  UTF8CHAR library
1ed70 44 65 73 63 72 69 70 74 69 6f 6e 5b 5d 20 3d 20  Description[] = 
1ed80 22 43 41 43 4b 65 79 22 3b 0a 0a 09 43 41 43 4b  "CACKey";...CACK
1ed90 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1eda0 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
1edb0 20 28 70 49 6e 66 6f 20 3d 3d 20 4e 55 4c 4c 29   (pInfo == NULL)
1edc0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1edd0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1ede0 20 70 49 6e 66 6f 20 69 73 20 4e 55 4c 4c 2e 22   pInfo is NULL."
1edf0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1ee00 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b  _ARGUMENTS_BAD);
1ee10 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ..}...if (!cacke
1ee20 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
1ee30 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1ee40 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
1ee50 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
1ee60 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
1ee70 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
1ee80 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
1ee90 0a 09 70 49 6e 66 6f 2d 3e 63 72 79 70 74 6f 6b  ..pInfo->cryptok
1eea0 69 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d  iVersion.major =
1eeb0 20 28 28 43 41 43 4b 45 59 5f 43 52 59 50 54 4f   ((CACKEY_CRYPTO
1eec0 4b 49 5f 56 45 52 53 49 4f 4e 5f 43 4f 44 45 29  KI_VERSION_CODE)
1eed0 20 3e 3e 20 31 36 29 20 26 20 30 78 66 66 3b 0a   >> 16) & 0xff;.
1eee0 09 70 49 6e 66 6f 2d 3e 63 72 79 70 74 6f 6b 69  .pInfo->cryptoki
1eef0 56 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20  Version.minor = 
1ef00 28 28 43 41 43 4b 45 59 5f 43 52 59 50 54 4f 4b  ((CACKEY_CRYPTOK
1ef10 49 5f 56 45 52 53 49 4f 4e 5f 43 4f 44 45 29 20  I_VERSION_CODE) 
1ef20 3e 3e 20 38 29 20 26 20 30 78 66 66 3b 0a 0a 09  >> 8) & 0xff;...
1ef30 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 6d 61  memset(pInfo->ma
1ef40 6e 75 66 61 63 74 75 72 65 72 49 44 2c 20 27 20  nufacturerID, ' 
1ef50 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d  ', sizeof(pInfo-
1ef60 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 29  >manufacturerID)
1ef70 29 3b 0a 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f  );..memcpy(pInfo
1ef80 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44  ->manufacturerID
1ef90 2c 20 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44  , manufacturerID
1efa0 2c 20 73 69 7a 65 6f 66 28 6d 61 6e 75 66 61 63  , sizeof(manufac
1efb0 74 75 72 65 72 49 44 29 20 2d 20 31 29 3b 0a 0a  turerID) - 1);..
1efc0 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20 3d 20  .pInfo->flags = 
1efd0 30 78 30 30 3b 0a 0a 09 6d 65 6d 73 65 74 28 70  0x00;...memset(p
1efe0 49 6e 66 6f 2d 3e 6c 69 62 72 61 72 79 44 65 73  Info->libraryDes
1eff0 63 72 69 70 74 69 6f 6e 2c 20 27 20 27 2c 20 73  cription, ' ', s
1f000 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6c 69 62  izeof(pInfo->lib
1f010 72 61 72 79 44 65 73 63 72 69 70 74 69 6f 6e 29  raryDescription)
1f020 29 3b 0a 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f  );..memcpy(pInfo
1f030 2d 3e 6c 69 62 72 61 72 79 44 65 73 63 72 69 70  ->libraryDescrip
1f040 74 69 6f 6e 2c 20 6c 69 62 72 61 72 79 44 65 73  tion, libraryDes
1f050 63 72 69 70 74 69 6f 6e 2c 20 73 69 7a 65 6f 66  cription, sizeof
1f060 28 6c 69 62 72 61 72 79 44 65 73 63 72 69 70 74  (libraryDescript
1f070 69 6f 6e 29 20 2d 20 31 29 3b 0a 0a 09 70 49 6e  ion) - 1);...pIn
1f080 66 6f 2d 3e 6c 69 62 72 61 72 79 56 65 72 73 69  fo->libraryVersi
1f090 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 28 63 61 63 6b  on.major = (cack
1f0a0 65 79 5f 67 65 74 76 65 72 73 69 6f 6e 28 29 20  ey_getversion() 
1f0b0 3e 3e 20 31 36 29 20 26 20 30 78 66 66 3b 0a 09  >> 16) & 0xff;..
1f0c0 70 49 6e 66 6f 2d 3e 6c 69 62 72 61 72 79 56 65  pInfo->libraryVe
1f0d0 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 28 63  rsion.minor = (c
1f0e0 61 63 6b 65 79 5f 67 65 74 76 65 72 73 69 6f 6e  ackey_getversion
1f0f0 28 29 20 3e 3e 20 38 29 20 26 20 30 78 66 66 3b  () >> 8) & 0xff;
1f100 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1f110 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
1f120 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20  g CKR_OK (%i)", 
1f130 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72  CKR_OK);...retur
1f140 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a  n(CKR_OK);.}../*
1f150 0a 20 2a 20 50 72 6f 63 65 73 73 20 6c 69 73 74  . * Process list
1f160 20 6f 66 20 72 65 61 64 65 72 73 2c 20 61 6e 64   of readers, and
1f170 20 63 72 65 61 74 65 20 6d 61 70 70 69 6e 67 20   create mapping 
1f180 62 65 74 77 65 65 6e 20 72 65 61 64 65 72 20 6e  between reader n
1f190 61 6d 65 20 61 6e 64 20 73 6c 6f 74 20 49 44 0a  ame and slot ID.
1f1a0 20 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55   */.CK_DEFINE_FU
1f1b0 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
1f1c0 47 65 74 53 6c 6f 74 4c 69 73 74 29 28 43 4b 5f  GetSlotList)(CK_
1f1d0 42 42 4f 4f 4c 20 74 6f 6b 65 6e 50 72 65 73 65  BBOOL tokenPrese
1f1e0 6e 74 2c 20 43 4b 5f 53 4c 4f 54 5f 49 44 5f 50  nt, CK_SLOT_ID_P
1f1f0 54 52 20 70 53 6c 6f 74 4c 69 73 74 2c 20 43 4b  TR pSlotList, CK
1f200 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 43 6f  _ULONG_PTR pulCo
1f210 75 6e 74 29 20 7b 0a 09 73 74 61 74 69 63 20 69  unt) {..static i
1f220 6e 74 20 66 69 72 73 74 5f 63 61 6c 6c 20 3d 20  nt first_call = 
1f230 31 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65  1;..int mutex_re
1f240 74 76 61 6c 3b 0a 09 69 6e 74 20 70 63 73 63 5f  tval;..int pcsc_
1f250 63 6f 6e 6e 65 63 74 5f 72 65 74 3b 0a 09 43 4b  connect_ret;..CK
1f260 5f 55 4c 4f 4e 47 20 63 6f 75 6e 74 2c 20 73 6c  _ULONG count, sl
1f270 6f 74 5f 63 6f 75 6e 74 20 3d 20 30 2c 20 63 75  ot_count = 0, cu
1f280 72 72 73 6c 6f 74 2c 20 73 6c 6f 74 5f 69 64 78  rrslot, slot_idx
1f290 3b 0a 09 63 68 61 72 20 2a 70 63 73 63 5f 72 65  ;..char *pcsc_re
1f2a0 61 64 65 72 73 2c 20 2a 70 63 73 63 5f 72 65 61  aders, *pcsc_rea
1f2b0 64 65 72 73 5f 73 2c 20 2a 70 63 73 63 5f 72 65  ders_s, *pcsc_re
1f2c0 61 64 65 72 73 5f 65 3b 0a 09 63 68 61 72 20 2a  aders_e;..char *
1f2d0 72 65 61 64 65 72 5f 63 68 65 63 6b 5f 70 61 74  reader_check_pat
1f2e0 74 65 72 6e 3b 0a 09 44 57 4f 52 44 20 70 63 73  tern;..DWORD pcs
1f2f0 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e 3b 0a 09  c_readers_len;..
1f300 4c 4f 4e 47 20 73 63 61 72 64 5f 6c 69 73 74 72  LONG scard_listr
1f310 65 61 64 65 72 73 5f 72 65 74 3b 0a 09 73 69 7a  eaders_ret;..siz
1f320 65 5f 74 20 63 75 72 72 5f 72 65 61 64 65 72 5f  e_t curr_reader_
1f330 6c 65 6e 3b 0a 09 69 6e 74 20 73 6c 6f 74 5f 72  len;..int slot_r
1f340 65 73 65 74 3b 0a 09 69 6e 74 20 69 6e 63 6c 75  eset;..int inclu
1f350 64 65 5f 72 65 61 64 65 72 3b 0a 0a 09 43 41 43  de_reader;...CAC
1f360 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1f370 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
1f380 66 20 28 70 75 6c 43 6f 75 6e 74 20 3d 3d 20 4e  f (pulCount == N
1f390 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
1f3a0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1f3b0 72 6f 72 2e 20 70 75 6c 43 6f 75 6e 74 20 69 73  ror. pulCount is
1f3c0 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74   NULL.");....ret
1f3d0 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54  urn(CKR_ARGUMENT
1f3e0 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  S_BAD);..}...if 
1f3f0 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
1f400 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
1f410 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1f420 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
1f430 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
1f440 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
1f450 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
1f460 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  D);..}...mutex_r
1f470 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
1f480 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79  utex_lock(cackey
1f490 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
1f4a0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
1f4b0 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
1f4c0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1f4d0 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c  r.  Locking fail
1f4e0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
1f4f0 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
1f500 4f 52 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 43 6c 65  OR);..}.../* Cle
1f510 61 72 20 6c 69 73 74 20 6f 66 20 73 6c 6f 74 73  ar list of slots
1f520 20 2a 2f 0a 09 73 6c 6f 74 5f 72 65 73 65 74 20   */..slot_reset 
1f530 3d 20 30 3b 0a 09 69 66 20 28 70 53 6c 6f 74 4c  = 0;..if (pSlotL
1f540 69 73 74 29 20 7b 0a 09 09 69 66 20 28 66 69 72  ist) {...if (fir
1f550 73 74 5f 63 61 6c 6c 29 20 7b 0a 09 09 09 66 69  st_call) {....fi
1f560 72 73 74 5f 63 61 6c 6c 20 3d 20 30 3b 0a 0a 09  rst_call = 0;...
1f570 09 09 73 6c 6f 74 5f 72 65 73 65 74 20 3d 20 31  ..slot_reset = 1
1f580 3b 0a 09 09 7d 0a 0a 09 09 2f 2a 20 49 66 20 61  ;...}..../* If a
1f590 6e 79 20 6f 66 20 74 68 65 20 73 6c 6f 74 73 20  ny of the slots 
1f5a0 68 61 76 65 20 62 65 65 6e 20 72 65 73 65 74 20  have been reset 
1f5b0 74 68 65 6e 20 70 75 72 67 65 20 61 6c 6c 20 69  then purge all i
1f5c0 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 6e 64 20 63  nformation and c
1f5d0 68 65 63 6b 20 61 67 61 69 6e 20 2a 2f 0a 09 09  heck again */...
1f5e0 66 6f 72 20 28 63 75 72 72 73 6c 6f 74 20 3d 20  for (currslot = 
1f5f0 30 3b 20 63 75 72 72 73 6c 6f 74 20 3c 20 28 73  0; currslot < (s
1f600 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f  izeof(cackey_slo
1f610 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63  ts) / sizeof(cac
1f620 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b 20  key_slots[0])); 
1f630 63 75 72 72 73 6c 6f 74 2b 2b 29 20 7b 0a 09 09  currslot++) {...
1f640 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74  .if (cackey_slot
1f650 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 69 6e 74 65  s[currslot].inte
1f660 72 6e 61 6c 29 20 7b 0a 09 09 09 09 63 6f 6e 74  rnal) {.....cont
1f670 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a 09 09 09 69  inue;....}.....i
1f680 66 20 28 21 63 61 63 6b 65 79 5f 73 6c 6f 74 73  f (!cackey_slots
1f690 5b 63 75 72 72 73 6c 6f 74 5d 2e 61 63 74 69 76  [currslot].activ
1f6a0 65 29 20 7b 0a 09 09 09 09 63 6f 6e 74 69 6e 75  e) {.....continu
1f6b0 65 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28  e;....}.....if (
1f6c0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72  cackey_slots[cur
1f6d0 72 73 6c 6f 74 5d 2e 73 6c 6f 74 5f 72 65 73 65  rslot].slot_rese
1f6e0 74 29 20 7b 0a 09 09 09 09 73 6c 6f 74 5f 72 65  t) {.....slot_re
1f6f0 73 65 74 20 3d 20 31 3b 0a 0a 09 09 09 09 62 72  set = 1;......br
1f700 65 61 6b 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09  eak;....}...}...
1f710 09 69 66 20 28 73 6c 6f 74 5f 72 65 73 65 74 29  .if (slot_reset)
1f720 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
1f730 55 47 5f 50 52 49 4e 54 46 28 22 50 75 72 67 69  UG_PRINTF("Purgi
1f740 6e 67 20 61 6c 6c 20 73 6c 6f 74 20 69 6e 66 6f  ng all slot info
1f750 72 6d 61 74 69 6f 6e 2e 22 29 3b 0a 0a 09 09 09  rmation.");.....
1f760 2f 2a 20 4f 6e 6c 79 20 75 70 64 61 74 65 20 74  /* Only update t
1f770 68 65 20 6c 69 73 74 20 6f 66 20 73 6c 6f 74 73  he list of slots
1f780 20 69 66 20 77 65 20 61 72 65 20 61 63 74 75 61   if we are actua
1f790 6c 6c 79 20 62 65 69 6e 67 20 73 75 70 70 6c 79  lly being supply
1f7a0 20 74 68 65 20 73 6c 6f 74 20 69 6e 66 6f 72 6d   the slot inform
1f7b0 61 74 69 6f 6e 20 2a 2f 0a 09 09 09 63 61 63 6b  ation */....cack
1f7c0 65 79 5f 73 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e  ey_slots_disconn
1f7d0 65 63 74 5f 61 6c 6c 28 29 3b 0a 0a 09 09 09 66  ect_all();.....f
1f7e0 6f 72 20 28 63 75 72 72 73 6c 6f 74 20 3d 20 30  or (currslot = 0
1f7f0 3b 20 63 75 72 72 73 6c 6f 74 20 3c 20 28 73 69  ; currslot < (si
1f800 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
1f810 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
1f820 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b 20 63  ey_slots[0])); c
1f830 75 72 72 73 6c 6f 74 2b 2b 29 20 7b 0a 09 09 09  urrslot++) {....
1f840 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74  .if (cackey_slot
1f850 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 69 6e 74 65  s[currslot].inte
1f860 72 6e 61 6c 29 20 7b 0a 09 09 09 09 09 63 6f 6e  rnal) {......con
1f870 74 69 6e 75 65 3b 0a 09 09 09 09 7d 0a 0a 09 09  tinue;.....}....
1f880 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f  ..if (cackey_slo
1f890 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 70 63 73  ts[currslot].pcs
1f8a0 63 5f 72 65 61 64 65 72 29 20 7b 0a 09 09 09 09  c_reader) {.....
1f8b0 09 66 72 65 65 28 63 61 63 6b 65 79 5f 73 6c 6f  .free(cackey_slo
1f8c0 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 70 63 73  ts[currslot].pcs
1f8d0 63 5f 72 65 61 64 65 72 29 3b 0a 0a 09 09 09 09  c_reader);......
1f8e0 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75  .cackey_slots[cu
1f8f0 72 72 73 6c 6f 74 5d 2e 70 63 73 63 5f 72 65 61  rrslot].pcsc_rea
1f900 64 65 72 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09  der = NULL;.....
1f910 7d 0a 0a 09 09 09 09 69 66 20 28 63 61 63 6b 65  }......if (cacke
1f920 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74  y_slots[currslot
1f930 5d 2e 6c 61 62 65 6c 29 20 7b 0a 09 09 09 09 09  ].label) {......
1f940 66 72 65 65 28 63 61 63 6b 65 79 5f 73 6c 6f 74  free(cackey_slot
1f950 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 6c 61 62 65  s[currslot].labe
1f960 6c 29 3b 0a 0a 09 09 09 09 09 63 61 63 6b 65 79  l);.......cackey
1f970 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d  _slots[currslot]
1f980 2e 6c 61 62 65 6c 20 3d 20 4e 55 4c 4c 3b 0a 09  .label = NULL;..
1f990 09 09 09 7d 0a 0a 09 09 09 09 63 61 63 6b 65 79  ...}......cackey
1f9a0 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d  _slots[currslot]
1f9b0 2e 61 63 74 69 76 65 20 3d 20 30 3b 0a 09 09 09  .active = 0;....
1f9c0 7d 0a 09 09 7d 0a 09 7d 0a 0a 09 2f 2a 20 44 65  }...}..}.../* De
1f9d0 74 65 72 6d 69 6e 65 20 6c 69 73 74 20 6f 66 20  termine list of 
1f9e0 72 65 61 64 65 72 73 20 2a 2f 0a 09 70 63 73 63  readers */..pcsc
1f9f0 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 20 3d 20 63  _connect_ret = c
1fa00 61 63 6b 65 79 5f 70 63 73 63 5f 63 6f 6e 6e 65  ackey_pcsc_conne
1fa10 63 74 28 29 3b 0a 09 69 66 20 28 70 63 73 63 5f  ct();..if (pcsc_
1fa20 63 6f 6e 6e 65 63 74 5f 72 65 74 20 21 3d 20 43  connect_ret != C
1fa30 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29  ACKEY_PCSC_S_OK)
1fa40 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1fa50 47 5f 50 52 49 4e 54 46 28 22 43 6f 6e 6e 65 63  G_PRINTF("Connec
1fa60 74 69 6f 6e 20 74 6f 20 50 43 2f 53 43 20 66 61  tion to PC/SC fa
1fa70 69 6c 65 64 2c 20 61 73 73 75 6d 69 6e 67 20 6e  iled, assuming n
1fa80 6f 20 68 61 72 64 77 61 72 65 20 73 6c 6f 74 73  o hardware slots
1fa90 22 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09  ");..} else {...
1faa0 70 63 73 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e  pcsc_readers_len
1fab0 20 3d 20 30 3b 0a 0a 09 09 73 63 61 72 64 5f 6c   = 0;....scard_l
1fac0 69 73 74 72 65 61 64 65 72 73 5f 72 65 74 20 3d  istreaders_ret =
1fad0 20 53 43 61 72 64 4c 69 73 74 52 65 61 64 65 72   SCardListReader
1fae0 73 28 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f 68  s(*cackey_pcsc_h
1faf0 61 6e 64 6c 65 2c 20 4e 55 4c 4c 2c 20 4e 55 4c  andle, NULL, NUL
1fb00 4c 2c 20 26 70 63 73 63 5f 72 65 61 64 65 72 73  L, &pcsc_readers
1fb10 5f 6c 65 6e 29 3b 0a 0a 09 09 69 66 20 28 73 63  _len);....if (sc
1fb20 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f  ard_listreaders_
1fb30 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 46 5f 43  ret == SCARD_F_C
1fb40 4f 4d 4d 5f 45 52 52 4f 52 29 20 7b 0a 09 09 09  OMM_ERROR) {....
1fb50 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1fb60 4e 54 46 28 22 45 72 72 6f 72 2e 20 53 43 61 72  NTF("Error. SCar
1fb70 64 4c 69 73 74 52 65 61 64 65 72 73 28 29 20 72  dListReaders() r
1fb80 65 74 75 72 6e 65 64 20 53 43 41 52 44 5f 46 5f  eturned SCARD_F_
1fb90 43 4f 4d 4d 5f 45 52 52 4f 52 2c 20 61 73 73 75  COMM_ERROR, assu
1fba0 6d 69 6e 67 20 43 6f 6e 6e 65 63 74 69 6f 6e 20  ming Connection 
1fbb0 74 6f 20 50 43 2f 53 43 20 77 65 6e 74 20 61 77  to PC/SC went aw
1fbc0 61 79 2e 20 52 65 63 6f 6e 6e 65 63 74 69 6e 67  ay. Reconnecting
1fbd0 2e 22 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f  .");.....cackey_
1fbe0 70 63 73 63 5f 64 69 73 63 6f 6e 6e 65 63 74 28  pcsc_disconnect(
1fbf0 29 3b 0a 09 09 09 63 61 63 6b 65 79 5f 70 63 73  );....cackey_pcs
1fc00 63 5f 63 6f 6e 6e 65 63 74 28 29 3b 0a 0a 09 09  c_connect();....
1fc10 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1fc20 49 4e 54 46 28 22 54 72 79 69 6e 67 20 53 43 61  INTF("Trying SCa
1fc30 72 64 4c 69 73 74 52 65 61 64 65 72 73 28 29 20  rdListReaders() 
1fc40 61 67 61 69 6e 22 29 3b 0a 09 09 09 73 63 61 72  again");....scar
1fc50 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65  d_listreaders_re
1fc60 74 20 3d 20 53 43 61 72 64 4c 69 73 74 52 65 61  t = SCardListRea
1fc70 64 65 72 73 28 2a 63 61 63 6b 65 79 5f 70 63 73  ders(*cackey_pcs
1fc80 63 5f 68 61 6e 64 6c 65 2c 20 4e 55 4c 4c 2c 20  c_handle, NULL, 
1fc90 4e 55 4c 4c 2c 20 26 70 63 73 63 5f 72 65 61 64  NULL, &pcsc_read
1fca0 65 72 73 5f 6c 65 6e 29 3b 0a 09 09 7d 0a 0a 09  ers_len);...}...
1fcb0 09 69 66 20 28 73 63 61 72 64 5f 6c 69 73 74 72  .if (scard_listr
1fcc0 65 61 64 65 72 73 5f 72 65 74 20 3d 3d 20 53 43  eaders_ret == SC
1fcd0 41 52 44 5f 53 5f 53 55 43 43 45 53 53 20 26 26  ARD_S_SUCCESS &&
1fce0 20 70 63 73 63 5f 72 65 61 64 65 72 73 5f 6c 65   pcsc_readers_le
1fcf0 6e 20 21 3d 20 30 29 20 7b 0a 09 09 09 70 63 73  n != 0) {....pcs
1fd00 63 5f 72 65 61 64 65 72 73 20 3d 20 6d 61 6c 6c  c_readers = mall
1fd10 6f 63 28 70 63 73 63 5f 72 65 61 64 65 72 73 5f  oc(pcsc_readers_
1fd20 6c 65 6e 29 3b 0a 09 09 09 70 63 73 63 5f 72 65  len);....pcsc_re
1fd30 61 64 65 72 73 5f 73 20 3d 20 70 63 73 63 5f 72  aders_s = pcsc_r
1fd40 65 61 64 65 72 73 3b 0a 0a 09 09 09 73 63 61 72  eaders;.....scar
1fd50 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65  d_listreaders_re
1fd60 74 20 3d 20 53 43 61 72 64 4c 69 73 74 52 65 61  t = SCardListRea
1fd70 64 65 72 73 28 2a 63 61 63 6b 65 79 5f 70 63 73  ders(*cackey_pcs
1fd80 63 5f 68 61 6e 64 6c 65 2c 20 4e 55 4c 4c 2c 20  c_handle, NULL, 
1fd90 70 63 73 63 5f 72 65 61 64 65 72 73 2c 20 26 70  pcsc_readers, &p
1fda0 63 73 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e 29  csc_readers_len)
1fdb0 3b 0a 09 09 09 69 66 20 28 73 63 61 72 64 5f 6c  ;....if (scard_l
1fdc0 69 73 74 72 65 61 64 65 72 73 5f 72 65 74 20 3d  istreaders_ret =
1fdd0 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53  = SCARD_S_SUCCES
1fde0 53 29 20 7b 0a 09 09 09 09 70 63 73 63 5f 72 65  S) {.....pcsc_re
1fdf0 61 64 65 72 73 5f 65 20 3d 20 70 63 73 63 5f 72  aders_e = pcsc_r
1fe00 65 61 64 65 72 73 20 2b 20 70 63 73 63 5f 72 65  eaders + pcsc_re
1fe10 61 64 65 72 73 5f 6c 65 6e 3b 0a 0a 09 09 09 09  aders_len;......
1fe20 2f 2a 20 53 74 61 72 74 20 77 69 74 68 20 53 6c  /* Start with Sl
1fe30 6f 74 20 49 44 20 31 2c 20 74 6f 20 61 76 6f 69  ot ID 1, to avoi
1fe40 64 20 61 20 62 75 67 20 69 6e 20 47 44 4d 20 6f  d a bug in GDM o
1fe50 6e 20 52 48 45 4c 20 2a 2f 0a 09 09 09 09 2f 2a  n RHEL */...../*
1fe60 20 42 75 67 20 35 39 34 39 31 31 3a 20 68 74 74   Bug 594911: htt
1fe70 70 73 3a 2f 2f 62 75 67 7a 69 6c 6c 61 2e 72 65  ps://bugzilla.re
1fe80 64 68 61 74 2e 63 6f 6d 2f 73 68 6f 77 5f 62 75  dhat.com/show_bu
1fe90 67 2e 63 67 69 3f 69 64 3d 35 39 34 39 31 31 20  g.cgi?id=594911 
1fea0 2a 2f 0a 09 09 09 09 63 75 72 72 73 6c 6f 74 20  */.....currslot 
1feb0 3d 20 31 3b 0a 09 09 09 09 77 68 69 6c 65 20 28  = 1;.....while (
1fec0 70 63 73 63 5f 72 65 61 64 65 72 73 20 3c 20 70  pcsc_readers < p
1fed0 63 73 63 5f 72 65 61 64 65 72 73 5f 65 29 20 7b  csc_readers_e) {
1fee0 0a 09 09 09 09 09 2f 2a 20 46 69 6e 64 20 6e 65  ....../* Find ne
1fef0 78 74 20 61 76 61 69 6c 61 62 6c 65 20 73 6c 6f  xt available slo
1ff00 74 20 2a 2f 0a 09 09 09 09 09 66 6f 72 20 28 3b  t */......for (;
1ff10 20 63 75 72 72 73 6c 6f 74 20 3c 20 28 73 69 7a   currslot < (siz
1ff20 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
1ff30 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
1ff40 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b 20 63 75  y_slots[0])); cu
1ff50 72 72 73 6c 6f 74 2b 2b 29 20 7b 0a 09 09 09 09  rrslot++) {.....
1ff60 09 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 6c  ..if (!cackey_sl
1ff70 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 61 63  ots[currslot].ac
1ff80 74 69 76 65 29 20 7b 0a 09 09 09 09 09 09 09 62  tive) {........b
1ff90 72 65 61 6b 3b 0a 09 09 09 09 09 09 7d 0a 09 09  reak;.......}...
1ffa0 09 09 09 7d 0a 0a 09 09 09 09 09 63 75 72 72 5f  ...}.......curr_
1ffb0 72 65 61 64 65 72 5f 6c 65 6e 20 3d 20 73 74 72  reader_len = str
1ffc0 6c 65 6e 28 70 63 73 63 5f 72 65 61 64 65 72 73  len(pcsc_readers
1ffd0 29 3b 0a 0a 09 09 09 09 09 69 66 20 28 28 70 63  );.......if ((pc
1ffe0 73 63 5f 72 65 61 64 65 72 73 20 2b 20 63 75 72  sc_readers + cur
1fff0 72 5f 72 65 61 64 65 72 5f 6c 65 6e 29 20 3e 20  r_reader_len) > 
20000 70 63 73 63 5f 72 65 61 64 65 72 73 5f 65 29 20  pcsc_readers_e) 
20010 7b 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09  {.......break;..
20020 09 09 09 09 7d 0a 0a 09 09 09 09 09 69 66 20 28  ....}.......if (
20030 63 75 72 72 5f 72 65 61 64 65 72 5f 6c 65 6e 20  curr_reader_len 
20040 3d 3d 20 30 29 20 7b 0a 09 09 09 09 09 09 62 72  == 0) {.......br
20050 65 61 6b 3b 0a 09 09 09 09 09 7d 0a 0a 09 09 09  eak;......}.....
20060 09 09 69 66 20 28 63 75 72 72 73 6c 6f 74 20 3e  ..if (currslot >
20070 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  = (sizeof(cackey
20080 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66  _slots) / sizeof
20090 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d  (cackey_slots[0]
200a0 29 29 29 20 7b 0a 09 09 09 09 09 09 43 41 43 4b  ))) {.......CACK
200b0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
200c0 22 46 6f 75 6e 64 20 6d 6f 72 65 20 72 65 61 64  "Found more read
200d0 65 72 73 20 74 68 61 6e 20 73 6c 6f 74 73 20 61  ers than slots a
200e0 72 65 20 61 76 61 69 6c 61 62 6c 65 21 22 29 3b  re available!");
200f0 0a 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09  ........break;..
20100 09 09 09 09 7d 0a 0a 09 09 09 09 09 43 41 43 4b  ....}.......CACK
20110 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
20120 22 46 6f 75 6e 64 20 72 65 61 64 65 72 3a 20 25  "Found reader: %
20130 73 20 28 63 75 72 72 73 6c 6f 74 20 3d 20 25 6c  s (currslot = %l
20140 75 29 22 2c 20 70 63 73 63 5f 72 65 61 64 65 72  u)", pcsc_reader
20150 73 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  s, (unsigned lon
20160 67 29 20 63 75 72 72 73 6c 6f 74 29 3b 0a 0a 09  g) currslot);...
20170 09 09 09 09 69 66 20 28 63 61 63 6b 65 79 5f 72  ....if (cackey_r
20180 65 61 64 65 72 73 5f 69 6e 63 6c 75 64 65 5f 6f  eaders_include_o
20190 6e 6c 79 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  nly != NULL) {..
201a0 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
201b0 47 5f 50 52 49 4e 54 46 28 22 41 73 6b 65 64 20  G_PRINTF("Asked 
201c0 74 6f 20 69 6e 63 6c 75 64 65 20 6f 6e 6c 79 20  to include only 
201d0 72 65 61 64 65 72 73 20 6d 61 74 63 68 69 6e 67  readers matching
201e0 3a 20 25 73 22 2c 20 63 61 63 6b 65 79 5f 72 65  : %s", cackey_re
201f0 61 64 65 72 73 5f 69 6e 63 6c 75 64 65 5f 6f 6e  aders_include_on
20200 6c 79 29 3b 0a 0a 09 09 09 09 09 09 69 6e 63 6c  ly);........incl
20210 75 64 65 5f 72 65 61 64 65 72 20 3d 20 30 3b 0a  ude_reader = 0;.
20220 09 09 09 09 09 09 72 65 61 64 65 72 5f 63 68 65  ......reader_che
20230 63 6b 5f 70 61 74 74 65 72 6e 20 3d 20 63 61 63  ck_pattern = cac
20240 6b 65 79 5f 72 65 61 64 65 72 73 5f 69 6e 63 6c  key_readers_incl
20250 75 64 65 5f 6f 6e 6c 79 3b 0a 09 09 09 09 09 7d  ude_only;......}
20260 20 65 6c 73 65 20 69 66 20 28 63 61 63 6b 65 79   else if (cackey
20270 5f 72 65 61 64 65 72 73 5f 65 78 63 6c 75 64 65  _readers_exclude
20280 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09   != NULL) {.....
20290 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
202a0 52 49 4e 54 46 28 22 41 73 6b 65 64 20 74 6f 20  RINTF("Asked to 
202b0 65 78 63 6c 75 64 65 20 72 65 61 64 65 72 73 20  exclude readers 
202c0 6d 61 74 63 68 69 6e 67 3a 20 25 73 22 2c 20 63  matching: %s", c
202d0 61 63 6b 65 79 5f 72 65 61 64 65 72 73 5f 65 78  ackey_readers_ex
202e0 63 6c 75 64 65 29 3b 0a 0a 09 09 09 09 09 09 69  clude);........i
202f0 6e 63 6c 75 64 65 5f 72 65 61 64 65 72 20 3d 20  nclude_reader = 
20300 31 3b 0a 09 09 09 09 09 09 72 65 61 64 65 72 5f  1;.......reader_
20310 63 68 65 63 6b 5f 70 61 74 74 65 72 6e 20 3d 20  check_pattern = 
20320 63 61 63 6b 65 79 5f 72 65 61 64 65 72 73 5f 65  cackey_readers_e
20330 78 63 6c 75 64 65 3b 0a 09 09 09 09 09 7d 20 65  xclude;......} e
20340 6c 73 65 20 7b 0a 09 09 09 09 09 09 69 6e 63 6c  lse {.......incl
20350 75 64 65 5f 72 65 61 64 65 72 20 3d 20 31 3b 0a  ude_reader = 1;.
20360 09 09 09 09 09 09 72 65 61 64 65 72 5f 63 68 65  ......reader_che
20370 63 6b 5f 70 61 74 74 65 72 6e 20 3d 20 4e 55 4c  ck_pattern = NUL
20380 4c 3b 0a 09 09 09 09 09 7d 0a 0a 09 09 09 09 09  L;......}.......
20390 69 66 20 28 72 65 61 64 65 72 5f 63 68 65 63 6b  if (reader_check
203a0 5f 70 61 74 74 65 72 6e 20 21 3d 20 4e 55 4c 4c  _pattern != NULL
203b0 29 20 7b 0a 09 09 09 09 09 09 69 66 20 28 73 74  ) {.......if (st
203c0 72 73 74 72 28 70 63 73 63 5f 72 65 61 64 65 72  rstr(pcsc_reader
203d0 73 2c 20 72 65 61 64 65 72 5f 63 68 65 63 6b 5f  s, reader_check_
203e0 70 61 74 74 65 72 6e 29 20 21 3d 20 4e 55 4c 4c  pattern) != NULL
203f0 29 20 7b 0a 09 09 09 09 09 09 09 43 41 43 4b 45  ) {........CACKE
20400 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
20410 54 68 69 73 20 72 65 61 64 65 72 20 6d 61 74 63  This reader matc
20420 68 65 64 20 74 68 65 20 70 61 74 74 65 72 6e 2e  hed the pattern.
20430 22 29 3b 0a 09 09 09 09 09 09 0a 09 09 09 09 09  ");.............
20440 09 09 69 6e 63 6c 75 64 65 5f 72 65 61 64 65 72  ..include_reader
20450 20 3d 20 21 69 6e 63 6c 75 64 65 5f 72 65 61 64   = !include_read
20460 65 72 3b 0a 09 09 09 09 09 09 7d 0a 09 09 09 09  er;.......}.....
20470 09 7d 0a 0a 09 09 09 09 09 69 66 20 28 69 6e 63  .}.......if (inc
20480 6c 75 64 65 5f 72 65 61 64 65 72 20 21 3d 20 31  lude_reader != 1
20490 29 20 7b 0a 09 09 09 09 09 09 43 41 43 4b 45 59  ) {.......CACKEY
204a0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53  _DEBUG_PRINTF("S
204b0 6b 69 70 70 69 6e 67 20 74 68 69 73 20 72 65 61  kipping this rea
204c0 64 65 72 2e 22 29 3b 0a 0a 09 09 09 09 09 09 70  der.");........p
204d0 63 73 63 5f 72 65 61 64 65 72 73 20 2b 3d 20 63  csc_readers += c
204e0 75 72 72 5f 72 65 61 64 65 72 5f 6c 65 6e 20 2b  urr_reader_len +
204f0 20 31 3b 0a 0a 09 09 09 09 09 09 63 6f 6e 74 69   1;........conti
20500 6e 75 65 3b 0a 09 09 09 09 09 7d 0a 0a 09 09 09  nue;......}.....
20510 09 09 2f 2a 20 4f 6e 6c 79 20 75 70 64 61 74 65  ../* Only update
20520 20 74 68 65 20 6c 69 73 74 20 6f 66 20 73 6c 6f   the list of slo
20530 74 73 20 69 66 20 77 65 20 61 72 65 20 61 63 74  ts if we are act
20540 75 61 6c 6c 79 20 62 65 69 6e 67 20 61 73 6b 65  ually being aske
20550 64 20 73 75 70 70 6c 79 20 74 68 65 20 73 6c 6f  d supply the slo
20560 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f  t information */
20570 0a 09 09 09 09 09 69 66 20 28 70 53 6c 6f 74 4c  ......if (pSlotL
20580 69 73 74 29 20 7b 0a 09 09 09 09 09 09 69 66 20  ist) {.......if 
20590 28 73 6c 6f 74 5f 72 65 73 65 74 29 20 7b 0a 09  (slot_reset) {..
205a0 09 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f  ......cackey_slo
205b0 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 61 63 74  ts[currslot].act
205c0 69 76 65 20 3d 20 31 3b 0a 09 09 09 09 09 09 09  ive = 1;........
205d0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72  cackey_slots[cur
205e0 72 73 6c 6f 74 5d 2e 69 6e 74 65 72 6e 61 6c 20  rslot].internal 
205f0 3d 20 30 3b 0a 09 09 09 09 09 09 09 63 61 63 6b  = 0;........cack
20600 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f  ey_slots[currslo
20610 74 5d 2e 70 63 73 63 5f 72 65 61 64 65 72 20 3d  t].pcsc_reader =
20620 20 73 74 72 64 75 70 28 70 63 73 63 5f 72 65 61   strdup(pcsc_rea
20630 64 65 72 73 29 3b 0a 09 09 09 09 09 09 09 63 61  ders);........ca
20640 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73  ckey_slots[currs
20650 6c 6f 74 5d 2e 70 63 73 63 5f 63 61 72 64 5f 63  lot].pcsc_card_c
20660 6f 6e 6e 65 63 74 65 64 20 3d 20 30 3b 0a 09 09  onnected = 0;...
20670 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  .....cackey_slot
20680 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 74 72 61 6e  s[currslot].tran
20690 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d 20  saction_depth = 
206a0 30 3b 0a 09 09 09 09 09 09 09 63 61 63 6b 65 79  0;........cackey
206b0 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d  _slots[currslot]
206c0 2e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 6e 65 65  .transaction_nee
206d0 64 5f 68 77 5f 6c 6f 63 6b 20 3d 20 30 3b 0a 09  d_hw_lock = 0;..
206e0 09 09 09 09 09 09 69 66 20 28 63 61 63 6b 65 79  ......if (cackey
206f0 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20 3d 3d 20  _pin_command == 
20700 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 09 09 09 09  NULL) {.........
20710 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72  cackey_slots[cur
20720 72 73 6c 6f 74 5d 2e 74 6f 6b 65 6e 5f 66 6c 61  rslot].token_fla
20730 67 73 20 3d 20 43 4b 46 5f 4c 4f 47 49 4e 5f 52  gs = CKF_LOGIN_R
20740 45 51 55 49 52 45 44 3b 0a 09 09 09 09 09 09 09  EQUIRED;........
20750 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09 09  } else {........
20760 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75  .cackey_slots[cu
20770 72 72 73 6c 6f 74 5d 2e 74 6f 6b 65 6e 5f 66 6c  rrslot].token_fl
20780 61 67 73 20 3d 20 30 3b 0a 09 09 09 09 09 09 09  ags = 0;........
20790 7d 0a 09 09 09 09 09 09 09 63 61 63 6b 65 79 5f  }........cackey_
207a0 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e  slots[currslot].
207b0 6c 61 62 65 6c 20 3d 20 4e 55 4c 4c 3b 0a 0a 09  label = NULL;...
207c0 09 09 09 09 09 09 63 61 63 6b 65 79 5f 6d 61 72  ......cackey_mar
207d0 6b 5f 73 6c 6f 74 5f 72 65 73 65 74 28 26 63 61  k_slot_reset(&ca
207e0 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73  ckey_slots[currs
207f0 6c 6f 74 5d 29 3b 0a 09 09 09 09 09 09 7d 0a 09  lot]);.......}..
20800 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ....} else {....
20810 09 09 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73  ...if (!cackey_s
20820 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 61  lots[currslot].a
20830 63 74 69 76 65 29 20 7b 0a 09 09 09 09 09 09 09  ctive) {........
20840 2f 2a 20 41 72 74 69 66 69 63 69 61 6c 6c 79 20  /* Artificially 
20850 69 6e 63 72 65 61 73 65 20 74 68 65 20 6e 75 6d  increase the num
20860 62 65 72 20 6f 66 20 61 63 74 69 76 65 20 73 6c  ber of active sl
20870 6f 74 73 20 62 79 20 77 68 61 74 20 77 69 6c 6c  ots by what will
20880 20 62 65 63 6f 6d 65 20 61 63 74 69 76 65 20 2a   become active *
20890 2f 0a 09 09 09 09 09 09 09 43 41 43 4b 45 59 5f  /........CACKEY_
208a0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 6f  DEBUG_PRINTF("Fo
208b0 75 6e 64 20 69 6e 2d 61 63 74 69 76 65 20 73 6c  und in-active sl
208c0 6f 74 20 25 6c 75 2c 20 62 75 74 20 69 74 20 77  ot %lu, but it w
208d0 69 6c 6c 20 62 65 20 61 63 74 69 76 65 20 61 66  ill be active af
208e0 74 65 72 20 61 20 72 65 73 65 74 20 2d 2d 20 6d  ter a reset -- m
208f0 61 72 6b 69 6e 67 20 61 73 20 61 63 74 69 76 65  arking as active
20900 20 66 6f 72 20 61 63 63 6f 75 6e 74 69 6e 67 20   for accounting 
20910 70 75 72 70 6f 73 65 73 22 2c 20 28 75 6e 73 69  purposes", (unsi
20920 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 73  gned long) currs
20930 6c 6f 74 29 3b 0a 0a 09 09 09 09 09 09 09 73 6c  lot);.........sl
20940 6f 74 5f 63 6f 75 6e 74 2b 2b 3b 0a 09 09 09 09  ot_count++;.....
20950 09 09 7d 0a 09 09 09 09 09 7d 0a 09 09 09 09 09  ..}......}......
20960 63 75 72 72 73 6c 6f 74 2b 2b 3b 0a 0a 09 09 09  currslot++;.....
20970 09 09 70 63 73 63 5f 72 65 61 64 65 72 73 20 2b  ..pcsc_readers +
20980 3d 20 63 75 72 72 5f 72 65 61 64 65 72 5f 6c 65  = curr_reader_le
20990 6e 20 2b 20 31 3b 0a 09 09 09 09 7d 0a 09 09 09  n + 1;.....}....
209a0 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 43 41 43  } else {.....CAC
209b0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
209c0 28 22 53 65 63 6f 6e 64 20 63 61 6c 6c 20 74 6f  ("Second call to
209d0 20 53 43 61 72 64 4c 69 73 74 52 65 61 64 65 72   SCardListReader
209e0 73 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e  s failed, return
209f0 20 25 73 2f 25 6c 69 22 2c 20 43 41 43 4b 45 59   %s/%li", CACKEY
20a00 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52  _DEBUG_FUNC_SCAR
20a10 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72  DERR_TO_STR(scar
20a20 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65  d_listreaders_re
20a30 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72 64  t), (long) scard
20a40 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65 74  _listreaders_ret
20a50 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 66 72 65 65  );....}.....free
20a60 28 70 63 73 63 5f 72 65 61 64 65 72 73 5f 73 29  (pcsc_readers_s)
20a70 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ;...} else {....
20a80 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
20a90 4e 54 46 28 22 46 69 72 73 74 20 63 61 6c 6c 20  NTF("First call 
20aa0 74 6f 20 53 43 61 72 64 4c 69 73 74 52 65 61 64  to SCardListRead
20ab0 65 72 73 20 66 61 69 6c 65 64 2c 20 72 65 74 75  ers failed, retu
20ac0 72 6e 20 25 73 2f 25 6c 69 22 2c 20 43 41 43 4b  rn %s/%li", CACK
20ad0 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43  EY_DEBUG_FUNC_SC
20ae0 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 63  ARDERR_TO_STR(sc
20af0 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f  ard_listreaders_
20b00 72 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61  ret), (long) sca
20b10 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72  rd_listreaders_r
20b20 65 74 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 66 6f  et);...}..}...fo
20b30 72 20 28 63 75 72 72 73 6c 6f 74 20 3d 20 30 3b  r (currslot = 0;
20b40 20 63 75 72 72 73 6c 6f 74 20 3c 20 28 73 69 7a   currslot < (siz
20b50 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
20b60 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
20b70 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b 20 63 75  y_slots[0])); cu
20b80 72 72 73 6c 6f 74 2b 2b 29 20 7b 0a 09 09 69 66  rrslot++) {...if
20b90 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63   (cackey_slots[c
20ba0 75 72 72 73 6c 6f 74 5d 2e 61 63 74 69 76 65 29  urrslot].active)
20bb0 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
20bc0 55 47 5f 50 52 49 4e 54 46 28 22 46 6f 75 6e 64  UG_PRINTF("Found
20bd0 20 61 63 74 69 76 65 20 73 6c 6f 74 20 25 6c 75   active slot %lu
20be0 2c 20 72 65 61 64 65 72 20 3d 20 25 73 22 2c 20  , reader = %s", 
20bf0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
20c00 63 75 72 72 73 6c 6f 74 2c 20 63 61 63 6b 65 79  currslot, cackey
20c10 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d  _slots[currslot]
20c20 2e 70 63 73 63 5f 72 65 61 64 65 72 29 3b 0a 0a  .pcsc_reader);..
20c30 09 09 09 73 6c 6f 74 5f 63 6f 75 6e 74 2b 2b 3b  ...slot_count++;
20c40 0a 09 09 7d 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f  ...}..}...mutex_
20c50 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
20c60 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
20c70 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
20c80 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
20c90 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
20ca0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
20cb0 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67  rror.  Unlocking
20cc0 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
20cd0 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
20ce0 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69  L_ERROR);..}...i
20cf0 66 20 28 70 53 6c 6f 74 4c 69 73 74 20 3d 3d 20  f (pSlotList == 
20d00 4e 55 4c 4c 29 20 7b 0a 09 09 2a 70 75 6c 43 6f  NULL) {...*pulCo
20d10 75 6e 74 20 3d 20 73 6c 6f 74 5f 63 6f 75 6e 74  unt = slot_count
20d20 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  ;....CACKEY_DEBU
20d30 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
20d40 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 2e  ing CKR_OK (%i).
20d50 20 20 46 6f 75 6e 64 20 25 6c 75 20 72 65 61 64    Found %lu read
20d60 65 72 73 2c 20 62 75 74 20 6e 6f 74 20 73 74 6f  ers, but not sto
20d70 72 69 6e 67 20 49 44 73 20 28 70 53 6c 6f 74 4c  ring IDs (pSlotL
20d80 69 73 74 20 3d 3d 20 4e 55 4c 4c 29 22 2c 20 43  ist == NULL)", C
20d90 4b 52 5f 4f 4b 2c 20 28 75 6e 73 69 67 6e 65 64  KR_OK, (unsigned
20da0 20 6c 6f 6e 67 29 20 73 6c 6f 74 5f 63 6f 75 6e   long) slot_coun
20db0 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  t);....return(CK
20dc0 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 63 6f 75 6e  R_OK);..}...coun
20dd0 74 20 3d 20 2a 70 75 6c 43 6f 75 6e 74 3b 0a 09  t = *pulCount;..
20de0 69 66 20 28 63 6f 75 6e 74 20 3c 20 73 6c 6f 74  if (count < slot
20df0 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 43 41 43 4b  _count) {...CACK
20e00 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
20e10 22 45 72 72 6f 72 2e 20 55 73 65 72 20 61 6c 6c  "Error. User all
20e20 6f 63 61 74 65 64 20 25 6c 75 20 65 6e 74 72 69  ocated %lu entri
20e30 65 73 2c 20 62 75 74 20 77 65 20 68 61 76 65 20  es, but we have 
20e40 25 6c 75 20 65 6e 74 72 69 65 73 2e 22 2c 20 63  %lu entries.", c
20e50 6f 75 6e 74 2c 20 73 6c 6f 74 5f 63 6f 75 6e 74  ount, slot_count
20e60 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  );....CACKEY_DEB
20e70 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
20e80 6e 69 6e 67 20 43 4b 52 5f 42 55 46 46 45 52 5f  ning CKR_BUFFER_
20e90 54 4f 4f 5f 53 4d 41 4c 4c 22 29 3b 0a 0a 09 09  TOO_SMALL");....
20ea0 72 65 74 75 72 6e 28 43 4b 52 5f 42 55 46 46 45  return(CKR_BUFFE
20eb0 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 3b 09 0a 09  R_TOO_SMALL);...
20ec0 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  }...mutex_retval
20ed0 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
20ee0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
20ef0 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
20f00 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
20f10 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
20f20 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c  RINTF("Error.  L
20f30 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
20f40 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
20f50 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
20f60 09 7d 0a 0a 09 73 6c 6f 74 5f 69 64 78 20 3d 20  .}...slot_idx = 
20f70 30 3b 0a 09 66 6f 72 20 28 63 75 72 72 73 6c 6f  0;..for (currslo
20f80 74 20 3d 20 30 3b 20 28 63 75 72 72 73 6c 6f 74  t = 0; (currslot
20f90 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65   < (sizeof(cacke
20fa0 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f  y_slots) / sizeo
20fb0 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30  f(cackey_slots[0
20fc0 5d 29 29 29 3b 20 63 75 72 72 73 6c 6f 74 2b 2b  ]))); currslot++
20fd0 29 20 7b 0a 09 09 69 66 20 28 21 63 61 63 6b 65  ) {...if (!cacke
20fe0 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74  y_slots[currslot
20ff0 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 09 63  ].active) {....c
21000 6f 6e 74 69 6e 75 65 3b 0a 09 09 7d 0a 0a 09 09  ontinue;...}....
21010 69 66 20 28 73 6c 6f 74 5f 69 64 78 20 3e 3d 20  if (slot_idx >= 
21020 63 6f 75 6e 74 29 20 7b 0a 09 09 09 43 41 43 4b  count) {....CACK
21030 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
21040 22 45 72 72 6f 72 2e 20 55 73 65 72 20 61 6c 6c  "Error. User all
21050 6f 63 61 74 65 64 20 25 6c 75 20 65 6e 74 72 69  ocated %lu entri
21060 65 73 2c 20 62 75 74 20 77 65 20 6a 75 73 74 20  es, but we just 
21070 74 72 69 65 64 20 74 6f 20 77 72 69 74 65 20 74  tried to write t
21080 6f 20 74 68 65 20 25 6c 75 20 69 6e 64 65 78 20  o the %lu index 
21090 2d 2d 20 69 67 6e 6f 72 69 6e 67 22 2c 20 63 6f  -- ignoring", co
210a0 75 6e 74 2c 20 73 6c 6f 74 5f 69 64 78 29 3b 0a  unt, slot_idx);.
210b0 0a 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09  ....continue;...
210c0 7d 0a 0a 09 09 70 53 6c 6f 74 4c 69 73 74 5b 73  }....pSlotList[s
210d0 6c 6f 74 5f 69 64 78 5d 20 3d 20 63 75 72 72 73  lot_idx] = currs
210e0 6c 6f 74 3b 0a 09 09 73 6c 6f 74 5f 69 64 78 2b  lot;...slot_idx+
210f0 2b 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65  +;..}...mutex_re
21100 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
21110 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
21120 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
21130 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
21140 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
21150 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
21160 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66  or.  Unlocking f
21170 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
21180 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
21190 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 2a 70 75  ERROR);..}...*pu
211a0 6c 43 6f 75 6e 74 20 3d 20 73 6c 6f 74 5f 63 6f  lCount = slot_co
211b0 75 6e 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  unt;...CACKEY_DE
211c0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
211d0 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69  rning CKR_OK (%i
211e0 29 2e 20 20 46 6f 75 6e 64 20 25 6c 75 20 72 65  ).  Found %lu re
211f0 61 64 65 72 73 2e 22 2c 20 43 4b 52 5f 4f 4b 2c  aders.", CKR_OK,
21200 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
21210 20 73 6c 6f 74 5f 63 6f 75 6e 74 29 3b 0a 0a 09   slot_count);...
21220 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a  return(CKR_OK);.
21230 0a 09 74 6f 6b 65 6e 50 72 65 73 65 6e 74 20 3d  ..tokenPresent =
21240 20 74 6f 6b 65 6e 50 72 65 73 65 6e 74 3b 20 2f   tokenPresent; /
21250 2a 20 53 75 70 72 65 73 73 20 75 6e 75 73 65 64  * Supress unused
21260 20 76 61 72 69 61 62 6c 65 20 77 61 72 6e 69 6e   variable warnin
21270 67 20 2a 2f 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  g */.}..CK_DEFIN
21280 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
21290 2c 20 43 5f 47 65 74 53 6c 6f 74 49 6e 66 6f 29  , C_GetSlotInfo)
212a0 28 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74  (CK_SLOT_ID slot
212b0 49 44 2c 20 43 4b 5f 53 4c 4f 54 5f 49 4e 46 4f  ID, CK_SLOT_INFO
212c0 5f 50 54 52 20 70 49 6e 66 6f 29 20 7b 0a 09 73  _PTR pInfo) {..s
212d0 74 61 74 69 63 20 43 4b 5f 55 54 46 38 43 48 41  tatic CK_UTF8CHA
212e0 52 20 73 6c 6f 74 44 65 73 63 72 69 70 74 69 6f  R slotDescriptio
212f0 6e 5b 5d 20 3d 20 22 43 41 43 4b 65 79 20 53 6c  n[] = "CACKey Sl
21300 6f 74 22 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f  ot";..int mutex_
21310 72 65 74 76 61 6c 3b 0a 09 69 6e 74 20 62 79 74  retval;..int byt
21320 65 73 5f 74 6f 5f 63 6f 70 79 3b 0a 0a 09 43 41  es_to_copy;...CA
21330 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
21340 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
21350 69 66 20 28 70 49 6e 66 6f 20 3d 3d 20 4e 55 4c  if (pInfo == NUL
21360 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
21370 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
21380 72 2e 20 70 49 6e 66 6f 20 69 73 20 4e 55 4c 4c  r. pInfo is NULL
21390 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
213a0 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44  KR_ARGUMENTS_BAD
213b0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63  );..}...if (!cac
213c0 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
213d0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
213e0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
213f0 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
21400 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
21410 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
21420 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
21430 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44 20 3c  }...if (slotID <
21440 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20   0 || slotID >= 
21450 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
21460 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  lots) / sizeof(c
21470 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29  ackey_slots[0]))
21480 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
21490 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
214a0 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72  . Invalid slot r
214b0 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20  equested (%lu), 
214c0 6f 75 74 73 69 64 65 20 6f 66 20 76 61 6c 69 64  outside of valid
214d0 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29   range", slotID)
214e0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
214f0 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29  SLOT_ID_INVALID)
21500 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74  ;..}...mutex_ret
21510 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
21520 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  ex_lock(cackey_b
21530 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
21540 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
21550 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
21560 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
21570 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64    Locking failed
21580 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
21590 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
215a0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b  );..}...if (cack
215b0 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
215c0 2e 61 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a  .active == 0) {.
215d0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
215e0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e  RINTF("Error. In
215f0 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65  valid slot reque
21600 73 74 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74  sted (%lu), slot
21610 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61   not currently a
21620 63 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b  ctive", slotID);
21630 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  ....cackey_mutex
21640 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
21650 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75  iglock);....retu
21660 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49  rn(CKR_SLOT_ID_I
21670 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 70 49  NVALID);..}...pI
21680 6e 66 6f 2d 3e 66 6c 61 67 73 20 3d 20 43 4b 46  nfo->flags = CKF
21690 5f 48 57 5f 53 4c 4f 54 3b 0a 0a 09 69 66 20 28  _HW_SLOT;...if (
216a0 21 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c  !cackey_slots[sl
216b0 6f 74 49 44 5d 2e 69 6e 74 65 72 6e 61 6c 29 20  otID].internal) 
216c0 7b 0a 09 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73  {...pInfo->flags
216d0 20 7c 3d 20 43 4b 46 5f 52 45 4d 4f 56 41 42 4c   |= CKF_REMOVABL
216e0 45 5f 44 45 56 49 43 45 3b 0a 09 7d 0a 0a 09 69  E_DEVICE;..}...i
216f0 66 20 28 63 61 63 6b 65 79 5f 74 6f 6b 65 6e 5f  f (cackey_token_
21700 70 72 65 73 65 6e 74 28 26 63 61 63 6b 65 79 5f  present(&cackey_
21710 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 29 20 3d  slots[slotID]) =
21720 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  = CACKEY_PCSC_S_
21730 54 4f 4b 45 4e 50 52 45 53 45 4e 54 29 20 7b 0a  TOKENPRESENT) {.
21740 09 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20 7c  ..pInfo->flags |
21750 3d 20 43 4b 46 5f 54 4f 4b 45 4e 5f 50 52 45 53  = CKF_TOKEN_PRES
21760 45 4e 54 3b 0a 09 7d 0a 0a 09 62 79 74 65 73 5f  ENT;..}...bytes_
21770 74 6f 5f 63 6f 70 79 20 3d 20 73 74 72 6c 65 6e  to_copy = strlen
21780 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c  (cackey_slots[sl
21790 6f 74 49 44 5d 2e 70 63 73 63 5f 72 65 61 64 65  otID].pcsc_reade
217a0 72 29 3b 0a 09 69 66 20 28 73 69 7a 65 6f 66 28  r);..if (sizeof(
217b0 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75  pInfo->manufactu
217c0 72 65 72 49 44 29 20 3c 20 62 79 74 65 73 5f 74  rerID) < bytes_t
217d0 6f 5f 63 6f 70 79 29 20 7b 0a 09 09 62 79 74 65  o_copy) {...byte
217e0 73 5f 74 6f 5f 63 6f 70 79 20 3d 20 73 69 7a 65  s_to_copy = size
217f0 6f 66 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61  of(pInfo->manufa
21800 63 74 75 72 65 72 49 44 29 3b 0a 09 7d 0a 09 6d  cturerID);..}..m
21810 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 6d 61 6e  emcpy(pInfo->man
21820 75 66 61 63 74 75 72 65 72 49 44 2c 20 63 61 63  ufacturerID, cac
21830 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44  key_slots[slotID
21840 5d 2e 70 63 73 63 5f 72 65 61 64 65 72 2c 20 62  ].pcsc_reader, b
21850 79 74 65 73 5f 74 6f 5f 63 6f 70 79 29 3b 0a 0a  ytes_to_copy);..
21860 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
21870 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
21880 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
21890 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
218a0 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
218b0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
218c0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e  INTF("Error.  Un
218d0 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  locking failed."
218e0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
218f0 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
21900 0a 09 7d 0a 0a 09 6d 65 6d 73 65 74 28 70 49 6e  ..}...memset(pIn
21910 66 6f 2d 3e 73 6c 6f 74 44 65 73 63 72 69 70 74  fo->slotDescript
21920 69 6f 6e 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66  ion, ' ', sizeof
21930 28 70 49 6e 66 6f 2d 3e 73 6c 6f 74 44 65 73 63  (pInfo->slotDesc
21940 72 69 70 74 69 6f 6e 29 29 3b 0a 09 6d 65 6d 63  ription));..memc
21950 70 79 28 70 49 6e 66 6f 2d 3e 73 6c 6f 74 44 65  py(pInfo->slotDe
21960 73 63 72 69 70 74 69 6f 6e 2c 20 73 6c 6f 74 44  scription, slotD
21970 65 73 63 72 69 70 74 69 6f 6e 2c 20 73 69 7a 65  escription, size
21980 6f 66 28 73 6c 6f 74 44 65 73 63 72 69 70 74 69  of(slotDescripti
21990 6f 6e 29 20 2d 20 31 29 3b 0a 0a 09 6d 65 6d 73  on) - 1);...mems
219a0 65 74 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61  et(pInfo->manufa
219b0 63 74 75 72 65 72 49 44 2c 20 27 20 27 2c 20 73  cturerID, ' ', s
219c0 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d 61 6e  izeof(pInfo->man
219d0 75 66 61 63 74 75 72 65 72 49 44 29 29 3b 0a 0a  ufacturerID));..
219e0 09 70 49 6e 66 6f 2d 3e 68 61 72 64 77 61 72 65  .pInfo->hardware
219f0 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20  Version.major = 
21a00 28 63 61 63 6b 65 79 5f 67 65 74 76 65 72 73 69  (cackey_getversi
21a10 6f 6e 28 29 20 3e 3e 20 31 36 29 20 26 20 30 78  on() >> 16) & 0x
21a20 66 66 3b 0a 09 70 49 6e 66 6f 2d 3e 68 61 72 64  ff;..pInfo->hard
21a30 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d 69 6e 6f  wareVersion.mino
21a40 72 20 3d 20 28 63 61 63 6b 65 79 5f 67 65 74 76  r = (cackey_getv
21a50 65 72 73 69 6f 6e 28 29 20 3e 3e 20 38 29 20 26  ersion() >> 8) &
21a60 20 30 78 66 66 3b 0a 0a 09 70 49 6e 66 6f 2d 3e   0xff;...pInfo->
21a70 66 69 72 6d 77 61 72 65 56 65 72 73 69 6f 6e 2e  firmwareVersion.
21a80 6d 61 6a 6f 72 20 3d 20 30 78 30 30 3b 0a 09 70  major = 0x00;..p
21a90 49 6e 66 6f 2d 3e 66 69 72 6d 77 61 72 65 56 65  Info->firmwareVe
21aa0 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 30 78  rsion.minor = 0x
21ab0 30 30 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  00;...CACKEY_DEB
21ac0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
21ad0 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29  ning CKR_OK (%i)
21ae0 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65  ", CKR_OK);...re
21af0 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a  turn(CKR_OK);.}.
21b00 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
21b10 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74  ION(CK_RV, C_Get
21b20 54 6f 6b 65 6e 49 6e 66 6f 29 28 43 4b 5f 53 4c  TokenInfo)(CK_SL
21b30 4f 54 5f 49 44 20 73 6c 6f 74 49 44 2c 20 43 4b  OT_ID slotID, CK
21b40 5f 54 4f 4b 45 4e 5f 49 4e 46 4f 5f 50 54 52 20  _TOKEN_INFO_PTR 
21b50 70 49 6e 66 6f 29 20 7b 0a 09 73 74 61 74 69 63  pInfo) {..static
21b60 20 43 4b 5f 55 54 46 38 43 48 41 52 20 6d 61 6e   CK_UTF8CHAR man
21b70 75 66 61 63 74 75 72 65 72 49 44 5b 5d 20 3d 20  ufacturerID[] = 
21b80 22 55 2e 53 2e 20 47 6f 76 65 72 6e 6d 65 6e 74  "U.S. Government
21b90 22 3b 0a 09 73 74 61 74 69 63 20 43 4b 5f 55 54  ";..static CK_UT
21ba0 46 38 43 48 41 52 20 64 65 66 61 75 6c 74 4c 61  F8CHAR defaultLa
21bb0 62 65 6c 5b 5d 20 3d 20 22 55 6e 6b 6e 6f 77 6e  bel[] = "Unknown
21bc0 20 54 6f 6b 65 6e 22 3b 0a 09 73 74 61 74 69 63   Token";..static
21bd0 20 43 4b 5f 55 54 46 38 43 48 41 52 20 6d 6f 64   CK_UTF8CHAR mod
21be0 65 6c 5b 5d 20 3d 20 22 43 41 43 20 54 6f 6b 65  el[] = "CAC Toke
21bf0 6e 22 3b 0a 09 73 74 72 75 63 74 20 63 61 63 6b  n";..struct cack
21c00 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79  ey_pcsc_identity
21c10 20 2a 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65   *pcsc_identitie
21c20 73 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  s;..unsigned lon
21c30 67 20 6e 75 6d 5f 63 65 72 74 73 3b 0a 09 73 73  g num_certs;..ss
21c40 69 7a 65 5f 74 20 6c 61 62 65 6c 5f 72 65 74 3b  ize_t label_ret;
21c50 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76  ..int mutex_retv
21c60 61 6c 3b 0a 09 69 6e 74 20 75 73 65 5f 64 65 66  al;..int use_def
21c70 61 75 6c 74 5f 6c 61 62 65 6c 3b 0a 0a 09 43 41  ault_label;...CA
21c80 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
21c90 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
21ca0 69 66 20 28 70 49 6e 66 6f 20 3d 3d 20 4e 55 4c  if (pInfo == NUL
21cb0 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
21cc0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
21cd0 72 2e 20 70 49 6e 66 6f 20 69 73 20 4e 55 4c 4c  r. pInfo is NULL
21ce0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
21cf0 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44  KR_ARGUMENTS_BAD
21d00 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63  );..}...if (!cac
21d10 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
21d20 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
21d30 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
21d40 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
21d50 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
21d60 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
21d70 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
21d80 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44 20 3c  }...if (slotID <
21d90 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20   0 || slotID >= 
21da0 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
21db0 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  lots) / sizeof(c
21dc0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29  ackey_slots[0]))
21dd0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
21de0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
21df0 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72  . Invalid slot r
21e00 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20  equested (%lu), 
21e10 6f 75 74 73 69 64 65 20 6f 66 20 76 61 6c 69 64  outside of valid
21e20 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29   range", slotID)
21e30 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
21e40 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29  SLOT_ID_INVALID)
21e50 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74  ;..}...mutex_ret
21e60 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
21e70 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  ex_lock(cackey_b
21e80 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
21e90 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
21ea0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
21eb0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
21ec0 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64    Locking failed
21ed0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
21ee0 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
21ef0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b  );..}...if (cack
21f00 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
21f10 2e 61 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a  .active == 0) {.
21f20 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
21f30 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e  RINTF("Error. In
21f40 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65  valid slot reque
21f50 73 74 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74  sted (%lu), slot
21f60 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61   not currently a
21f70 63 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b  ctive", slotID);
21f80 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  ....cackey_mutex
21f90 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
21fa0 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75  iglock);....retu
21fb0 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49  rn(CKR_SLOT_ID_I
21fc0 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66  NVALID);..}...if
21fd0 20 28 63 61 63 6b 65 79 5f 74 6f 6b 65 6e 5f 70   (cackey_token_p
21fe0 72 65 73 65 6e 74 28 26 63 61 63 6b 65 79 5f 73  resent(&cackey_s
21ff0 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 29 20 21 3d  lots[slotID]) !=
22000 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 54   CACKEY_PCSC_S_T
22010 4f 4b 45 4e 50 52 45 53 45 4e 54 29 20 7b 0a 09  OKENPRESENT) {..
22020 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
22030 49 4e 54 46 28 22 4e 6f 20 74 6f 6b 65 6e 20 69  INTF("No token i
22040 73 20 70 72 65 73 65 6e 74 20 69 6e 20 73 6c 6f  s present in slo
22050 74 49 44 20 3d 20 25 6c 75 22 2c 20 73 6c 6f 74  tID = %lu", slot
22060 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d  ID);....cackey_m
22070 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
22080 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
22090 72 65 74 75 72 6e 28 43 4b 52 5f 54 4f 4b 45 4e  return(CKR_TOKEN
220a0 5f 4e 4f 54 5f 50 52 45 53 45 4e 54 29 3b 0a 09  _NOT_PRESENT);..
220b0 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  }...mutex_retval
220c0 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
220d0 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
220e0 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
220f0 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
22100 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
22110 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
22120 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65   Unlocking faile
22130 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
22140 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
22150 52 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74 65  R);..}.../* Dete
22160 72 6d 69 6e 65 20 74 6f 6b 65 6e 20 6c 61 62 65  rmine token labe
22170 6c 20 66 72 6f 6d 20 63 65 72 74 69 66 69 63 61  l from certifica
22180 74 65 73 20 2a 2f 0a 09 6d 65 6d 73 65 74 28 70  tes */..memset(p
22190 49 6e 66 6f 2d 3e 6c 61 62 65 6c 2c 20 27 20 27  Info->label, ' '
221a0 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e  , sizeof(pInfo->
221b0 6c 61 62 65 6c 29 29 3b 0a 09 75 73 65 5f 64 65  label));..use_de
221c0 66 61 75 6c 74 5f 6c 61 62 65 6c 20 3d 20 31 3b  fault_label = 1;
221d0 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c  ...if (cackey_sl
221e0 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61 62 65  ots[slotID].labe
221f0 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 70  l == NULL) {...p
22200 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 20 3d  csc_identities =
22210 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 63 65 72   cackey_read_cer
22220 74 73 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ts(&cackey_slots
22230 5b 73 6c 6f 74 49 44 5d 2c 20 4e 55 4c 4c 2c 20  [slotID], NULL, 
22240 26 6e 75 6d 5f 63 65 72 74 73 29 3b 0a 09 09 69  &num_certs);...i
22250 66 20 28 70 63 73 63 5f 69 64 65 6e 74 69 74 69  f (pcsc_identiti
22260 65 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  es != NULL) {...
22270 09 69 66 20 28 6e 75 6d 5f 63 65 72 74 73 20 3e  .if (num_certs >
22280 20 30 29 20 7b 0a 09 09 09 09 6c 61 62 65 6c 5f   0) {.....label_
22290 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 70 63 73  ret = cackey_pcs
222a0 63 5f 69 64 65 6e 74 69 74 79 5f 74 6f 5f 6c 61  c_identity_to_la
222b0 62 65 6c 28 70 63 73 63 5f 69 64 65 6e 74 69 74  bel(pcsc_identit
222c0 69 65 73 2c 20 70 49 6e 66 6f 2d 3e 6c 61 62 65  ies, pInfo->labe
222d0 6c 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d  l, sizeof(pInfo-
222e0 3e 6c 61 62 65 6c 29 29 3b 0a 09 09 09 09 69 66  >label));.....if
222f0 20 28 6c 61 62 65 6c 5f 72 65 74 20 3e 20 30 29   (label_ret > 0)
22300 20 7b 0a 09 09 09 09 09 75 73 65 5f 64 65 66 61   {......use_defa
22310 75 6c 74 5f 6c 61 62 65 6c 20 3d 20 30 3b 0a 0a  ult_label = 0;..
22320 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  .....cackey_slot
22330 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61 62 65 6c 20  s[slotID].label 
22340 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28  = malloc(sizeof(
22350 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 29 29 3b 0a  pInfo->label));.
22360 0a 09 09 09 09 09 6d 65 6d 63 70 79 28 63 61 63  ......memcpy(cac
22370 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44  key_slots[slotID
22380 5d 2e 6c 61 62 65 6c 2c 20 70 49 6e 66 6f 2d 3e  ].label, pInfo->
22390 6c 61 62 65 6c 2c 20 73 69 7a 65 6f 66 28 70 49  label, sizeof(pI
223a0 6e 66 6f 2d 3e 6c 61 62 65 6c 29 29 3b 0a 09 09  nfo->label));...
223b0 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 09 63 61 63  ..}....}.....cac
223c0 6b 65 79 5f 66 72 65 65 5f 63 65 72 74 73 28 70  key_free_certs(p
223d0 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 2c 20  csc_identities, 
223e0 6e 75 6d 5f 63 65 72 74 73 2c 20 31 29 3b 0a 09  num_certs, 1);..
223f0 09 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 6d  .}..} else {...m
22400 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 6c 61 62  emcpy(pInfo->lab
22410 65 6c 2c 20 63 61 63 6b 65 79 5f 73 6c 6f 74 73  el, cackey_slots
22420 5b 73 6c 6f 74 49 44 5d 2e 6c 61 62 65 6c 2c 20  [slotID].label, 
22430 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6c 61  sizeof(pInfo->la
22440 62 65 6c 29 29 3b 0a 0a 09 09 75 73 65 5f 64 65  bel));....use_de
22450 66 61 75 6c 74 5f 6c 61 62 65 6c 20 3d 20 30 3b  fault_label = 0;
22460 0a 09 7d 0a 0a 09 69 66 20 28 75 73 65 5f 64 65  ..}...if (use_de
22470 66 61 75 6c 74 5f 6c 61 62 65 6c 29 20 7b 0a 09  fault_label) {..
22480 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 6c  .memcpy(pInfo->l
22490 61 62 65 6c 2c 20 64 65 66 61 75 6c 74 4c 61 62  abel, defaultLab
224a0 65 6c 2c 20 73 69 7a 65 6f 66 28 64 65 66 61 75  el, sizeof(defau
224b0 6c 74 4c 61 62 65 6c 29 20 2d 20 31 29 3b 0a 09  ltLabel) - 1);..
224c0 7d 0a 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f  }...memset(pInfo
224d0 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44  ->manufacturerID
224e0 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 28 70 49  , ' ', sizeof(pI
224f0 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65  nfo->manufacture
22500 72 49 44 29 29 3b 0a 09 6d 65 6d 63 70 79 28 70  rID));..memcpy(p
22510 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72  Info->manufactur
22520 65 72 49 44 2c 20 6d 61 6e 75 66 61 63 74 75 72  erID, manufactur
22530 65 72 49 44 2c 20 73 69 7a 65 6f 66 28 6d 61 6e  erID, sizeof(man
22540 75 66 61 63 74 75 72 65 72 49 44 29 20 2d 20 31  ufacturerID) - 1
22550 29 3b 0a 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66  );...memset(pInf
22560 6f 2d 3e 6d 6f 64 65 6c 2c 20 27 20 27 2c 20 73  o->model, ' ', s
22570 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d 6f 64  izeof(pInfo->mod
22580 65 6c 29 29 3b 0a 09 6d 65 6d 63 70 79 28 70 49  el));..memcpy(pI
22590 6e 66 6f 2d 3e 6d 6f 64 65 6c 2c 20 6d 6f 64 65  nfo->model, mode
225a0 6c 2c 20 73 69 7a 65 6f 66 28 6d 6f 64 65 6c 29  l, sizeof(model)
225b0 20 2d 20 31 29 3b 0a 0a 09 6d 65 6d 73 65 74 28   - 1);...memset(
225c0 70 49 6e 66 6f 2d 3e 73 65 72 69 61 6c 4e 75 6d  pInfo->serialNum
225d0 62 65 72 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66  ber, ' ', sizeof
225e0 28 70 49 6e 66 6f 2d 3e 73 65 72 69 61 6c 4e 75  (pInfo->serialNu
225f0 6d 62 65 72 29 29 3b 0a 0a 09 6d 65 6d 73 65 74  mber));...memset
22600 28 70 49 6e 66 6f 2d 3e 75 74 63 54 69 6d 65 2c  (pInfo->utcTime,
22610 20 27 20 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e   ' ', sizeof(pIn
22620 66 6f 2d 3e 75 74 63 54 69 6d 65 29 29 3b 0a 0a  fo->utcTime));..
22630 09 70 49 6e 66 6f 2d 3e 68 61 72 64 77 61 72 65  .pInfo->hardware
22640 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20  Version.major = 
22650 28 63 61 63 6b 65 79 5f 67 65 74 76 65 72 73 69  (cackey_getversi
22660 6f 6e 28 29 20 3e 3e 20 31 36 29 20 26 20 30 78  on() >> 16) & 0x
22670 66 66 3b 0a 09 70 49 6e 66 6f 2d 3e 68 61 72 64  ff;..pInfo->hard
22680 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d 69 6e 6f  wareVersion.mino
22690 72 20 3d 20 28 63 61 63 6b 65 79 5f 67 65 74 76  r = (cackey_getv
226a0 65 72 73 69 6f 6e 28 29 20 3e 3e 20 38 29 20 26  ersion() >> 8) &
226b0 20 30 78 66 66 3b 0a 0a 09 70 49 6e 66 6f 2d 3e   0xff;...pInfo->
226c0 66 69 72 6d 77 61 72 65 56 65 72 73 69 6f 6e 2e  firmwareVersion.
226d0 6d 61 6a 6f 72 20 3d 20 30 78 30 30 3b 0a 09 70  major = 0x00;..p
226e0 49 6e 66 6f 2d 3e 66 69 72 6d 77 61 72 65 56 65  Info->firmwareVe
226f0 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 30 78  rsion.minor = 0x
22700 30 30 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 66 6c 61  00;...pInfo->fla
22710 67 73 20 3d 20 43 4b 46 5f 57 52 49 54 45 5f 50  gs = CKF_WRITE_P
22720 52 4f 54 45 43 54 45 44 20 7c 20 43 4b 46 5f 55  ROTECTED | CKF_U
22730 53 45 52 5f 50 49 4e 5f 49 4e 49 54 49 41 4c 49  SER_PIN_INITIALI
22740 5a 45 44 20 7c 20 43 4b 46 5f 54 4f 4b 45 4e 5f  ZED | CKF_TOKEN_
22750 49 4e 49 54 49 41 4c 49 5a 45 44 20 7c 20 63 61  INITIALIZED | ca
22760 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
22770 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 3b 0a  D].token_flags;.
22780 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 70 69 6e  ..if (cackey_pin
22790 5f 63 6f 6d 6d 61 6e 64 20 21 3d 20 4e 55 4c 4c  _command != NULL
227a0 29 20 7b 0a 09 09 70 49 6e 66 6f 2d 3e 66 6c 61  ) {...pInfo->fla
227b0 67 73 20 7c 3d 20 43 4b 46 5f 50 52 4f 54 45 43  gs |= CKF_PROTEC
227c0 54 45 44 5f 41 55 54 48 45 4e 54 49 43 41 54 49  TED_AUTHENTICATI
227d0 4f 4e 5f 50 41 54 48 3b 0a 09 7d 0a 0a 09 70 49  ON_PATH;..}...pI
227e0 6e 66 6f 2d 3e 75 6c 4d 61 78 53 65 73 73 69 6f  nfo->ulMaxSessio
227f0 6e 43 6f 75 6e 74 20 3d 20 28 73 69 7a 65 6f 66  nCount = (sizeof
22800 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
22810 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
22820 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 20  y_sessions[0])) 
22830 2d 20 31 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 53  - 1;..pInfo->ulS
22840 65 73 73 69 6f 6e 43 6f 75 6e 74 20 3d 20 43 4b  essionCount = CK
22850 5f 55 4e 41 56 41 49 4c 41 42 4c 45 5f 49 4e 46  _UNAVAILABLE_INF
22860 4f 52 4d 41 54 49 4f 4e 3b 0a 09 70 49 6e 66 6f  ORMATION;..pInfo
22870 2d 3e 75 6c 4d 61 78 52 77 53 65 73 73 69 6f 6e  ->ulMaxRwSession
22880 43 6f 75 6e 74 20 3d 20 30 3b 0a 09 70 49 6e 66  Count = 0;..pInf
22890 6f 2d 3e 75 6c 52 77 53 65 73 73 69 6f 6e 43 6f  o->ulRwSessionCo
228a0 75 6e 74 20 3d 20 43 4b 5f 55 4e 41 56 41 49 4c  unt = CK_UNAVAIL
228b0 41 42 4c 45 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e  ABLE_INFORMATION
228c0 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 4d 61 78 50  ;..pInfo->ulMaxP
228d0 69 6e 4c 65 6e 20 3d 20 31 32 38 3b 0a 09 70 49  inLen = 128;..pI
228e0 6e 66 6f 2d 3e 75 6c 4d 69 6e 50 69 6e 4c 65 6e  nfo->ulMinPinLen
228f0 20 3d 20 30 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c   = 0;..pInfo->ul
22900 54 6f 74 61 6c 50 75 62 6c 69 63 4d 65 6d 6f 72  TotalPublicMemor
22910 79 20 3d 20 43 4b 5f 55 4e 41 56 41 49 4c 41 42  y = CK_UNAVAILAB
22920 4c 45 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a  LE_INFORMATION;.
22930 09 70 49 6e 66 6f 2d 3e 75 6c 46 72 65 65 50 75  .pInfo->ulFreePu
22940 62 6c 69 63 4d 65 6d 6f 72 79 20 3d 20 43 4b 5f  blicMemory = CK_
22950 55 4e 41 56 41 49 4c 41 42 4c 45 5f 49 4e 46 4f  UNAVAILABLE_INFO
22960 52 4d 41 54 49 4f 4e 3b 0a 09 70 49 6e 66 6f 2d  RMATION;..pInfo-
22970 3e 75 6c 54 6f 74 61 6c 50 72 69 76 61 74 65 4d  >ulTotalPrivateM
22980 65 6d 6f 72 79 20 3d 20 43 4b 5f 55 4e 41 56 41  emory = CK_UNAVA
22990 49 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d 41 54 49  ILABLE_INFORMATI
229a0 4f 4e 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 46 72  ON;..pInfo->ulFr
229b0 65 65 50 72 69 76 61 74 65 4d 65 6d 6f 72 79 20  eePrivateMemory 
229c0 3d 20 43 4b 5f 55 4e 41 56 41 49 4c 41 42 4c 45  = CK_UNAVAILABLE
229d0 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a 0a 09  _INFORMATION;...
229e0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
229f0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
22a00 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52  KR_OK (%i)", CKR
22a10 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  _OK);...return(C
22a20 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  KR_OK);.}..CK_DE
22a30 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
22a40 5f 52 56 2c 20 43 5f 57 61 69 74 46 6f 72 53 6c  _RV, C_WaitForSl
22a50 6f 74 45 76 65 6e 74 29 28 43 4b 5f 46 4c 41 47  otEvent)(CK_FLAG
22a60 53 20 66 6c 61 67 73 2c 20 43 4b 5f 53 4c 4f 54  S flags, CK_SLOT
22a70 5f 49 44 5f 50 54 52 20 70 53 6c 6f 74 49 44 2c  _ID_PTR pSlotID,
22a80 20 43 4b 5f 56 4f 49 44 5f 50 54 52 20 70 52 65   CK_VOID_PTR pRe
22a90 73 65 72 76 65 64 29 20 7b 0a 09 43 41 43 4b 45  served) {..CACKE
22aa0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
22ab0 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
22ac0 28 70 52 65 73 65 72 76 65 64 20 21 3d 20 4e 55  (pReserved != NU
22ad0 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
22ae0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
22af0 6f 72 2e 20 70 52 65 73 65 72 76 65 64 20 69 73  or. pReserved is
22b00 20 6e 6f 74 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09   not NULL.");...
22b10 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55  .return(CKR_ARGU
22b20 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a  MENTS_BAD);..}..
22b30 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
22b40 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
22b50 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
22b60 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
22b70 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
22b80 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
22b90 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
22ba0 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 2f 2a 20  LIZED);..}.../* 
22bb0 58 58 58 3a 20 54 4f 44 4f 3a 20 49 6d 70 6c 65  XXX: TODO: Imple
22bc0 6d 65 6e 74 20 74 68 69 73 2e 2e 2e 20 2a 2f 0a  ment this... */.
22bd0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
22be0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
22bf0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
22c00 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
22c10 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
22c20 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
22c30 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
22c40 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
22c50 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
22c60 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
22c70 2c 20 43 5f 47 65 74 4d 65 63 68 61 6e 69 73 6d  , C_GetMechanism
22c80 4c 69 73 74 29 28 43 4b 5f 53 4c 4f 54 5f 49 44  List)(CK_SLOT_ID
22c90 20 73 6c 6f 74 49 44 2c 20 43 4b 5f 4d 45 43 48   slotID, CK_MECH
22ca0 41 4e 49 53 4d 5f 54 59 50 45 5f 50 54 52 20 70  ANISM_TYPE_PTR p
22cb0 4d 65 63 68 61 6e 69 73 6d 4c 69 73 74 2c 20 43  MechanismList, C
22cc0 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 43  K_ULONG_PTR pulC
22cd0 6f 75 6e 74 29 20 7b 0a 09 43 41 43 4b 45 59 5f  ount) {..CACKEY_
22ce0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
22cf0 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
22d00 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
22d10 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
22d20 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
22d30 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
22d40 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
22d50 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
22d60 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
22d70 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 75 6c 43 6f  ;..}...if (pulCo
22d80 75 6e 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  unt == NULL) {..
22d90 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
22da0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 70 75  INTF("Error.  pu
22db0 6c 43 6f 75 6e 74 20 69 73 20 4e 55 4c 4c 2e 22  lCount is NULL."
22dc0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
22dd0 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b  _ARGUMENTS_BAD);
22de0 0a 09 7d 0a 0a 09 69 66 20 28 70 4d 65 63 68 61  ..}...if (pMecha
22df0 6e 69 73 6d 4c 69 73 74 20 3d 3d 20 4e 55 4c 4c  nismList == NULL
22e00 29 20 7b 0a 09 09 2a 70 75 6c 43 6f 75 6e 74 20  ) {...*pulCount 
22e10 3d 20 31 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  = 1;....CACKEY_D
22e20 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
22e30 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25  urning CKR_OK (%
22e40 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09  i)", CKR_OK);...
22e50 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b  .return(CKR_OK);
22e60 0a 09 7d 0a 0a 09 69 66 20 28 2a 70 75 6c 43 6f  ..}...if (*pulCo
22e70 75 6e 74 20 3c 20 31 29 20 7b 0a 09 09 43 41 43  unt < 1) {...CAC
22e80 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
22e90 28 22 45 72 72 6f 72 2e 20 20 42 75 66 66 65 72  ("Error.  Buffer
22ea0 20 74 6f 6f 20 73 6d 61 6c 6c 2e 22 29 3b 0a 0a   too small.");..
22eb0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 42 55 46  ..return(CKR_BUF
22ec0 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 3b 0a  FER_TOO_SMALL);.
22ed0 09 7d 0a 0a 09 70 4d 65 63 68 61 6e 69 73 6d 4c  .}...pMechanismL
22ee0 69 73 74 5b 30 5d 20 3d 20 43 4b 4d 5f 52 53 41  ist[0] = CKM_RSA
22ef0 5f 50 4b 43 53 3b 0a 09 2a 70 75 6c 43 6f 75 6e  _PKCS;..*pulCoun
22f00 74 20 3d 20 31 3b 0a 0a 09 43 41 43 4b 45 59 5f  t = 1;...CACKEY_
22f10 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
22f20 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28  turning CKR_OK (
22f30 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a  %i)", CKR_OK);..
22f40 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b  .return(CKR_OK);
22f50 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
22f60 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
22f70 47 65 74 4d 65 63 68 61 6e 69 73 6d 49 6e 66 6f  GetMechanismInfo
22f80 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f  )(CK_SLOT_ID slo
22f90 74 49 44 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53  tID, CK_MECHANIS
22fa0 4d 5f 54 59 50 45 20 74 79 70 65 2c 20 43 4b 5f  M_TYPE type, CK_
22fb0 4d 45 43 48 41 4e 49 53 4d 5f 49 4e 46 4f 5f 50  MECHANISM_INFO_P
22fc0 54 52 20 70 49 6e 66 6f 29 20 7b 0a 09 69 6e 74  TR pInfo) {..int
22fd0 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a   mutex_retval;..
22fe0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
22ff0 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
23000 0a 0a 09 69 66 20 28 70 49 6e 66 6f 20 3d 3d 20  ...if (pInfo == 
23010 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
23020 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
23030 72 72 6f 72 2e 20 70 49 6e 66 6f 20 69 73 20 4e  rror. pInfo is N
23040 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  ULL.");....retur
23050 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f  n(CKR_ARGUMENTS_
23060 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21  BAD);..}...if (!
23070 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
23080 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
23090 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
230a0 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
230b0 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
230c0 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
230d0 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
230e0 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 49  ;..}...if (slotI
230f0 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20  D < 0 || slotID 
23100 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65  >= (sizeof(cacke
23110 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f  y_slots) / sizeo
23120 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30  f(cackey_slots[0
23130 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ]))) {...CACKEY_
23140 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
23150 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f  ror. Invalid slo
23160 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75  t requested (%lu
23170 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 76 61  ), outside of va
23180 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74  lid range", slot
23190 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  ID);....return(C
231a0 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c  KR_SLOT_ID_INVAL
231b0 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f  ID);..}...mutex_
231c0 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
231d0 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65  mutex_lock(cacke
231e0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
231f0 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
23200 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
23210 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
23220 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69  or.  Locking fai
23230 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
23240 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
23250 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63  ROR);..}...if (c
23260 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
23270 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 29  ID].active == 0)
23280 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
23290 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
232a0 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65   Invalid slot re
232b0 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 73  quested (%lu), s
232c0 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c  lot not currentl
232d0 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 49  y active", slotI
232e0 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75  D);....cackey_mu
232f0 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
23300 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72  y_biglock);....r
23310 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49  eturn(CKR_SLOT_I
23320 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  D_INVALID);..}..
23330 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
23340 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
23350 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
23360 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
23370 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
23380 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
23390 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e  INTF("Error.  Un
233a0 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  locking failed."
233b0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
233c0 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
233d0 0a 09 7d 0a 0a 09 73 77 69 74 63 68 20 28 74 79  ..}...switch (ty
233e0 70 65 29 20 7b 0a 09 09 63 61 73 65 20 43 4b 4d  pe) {...case CKM
233f0 5f 52 53 41 5f 50 4b 43 53 3a 0a 09 09 09 70 49  _RSA_PKCS:....pI
23400 6e 66 6f 2d 3e 75 6c 4d 69 6e 4b 65 79 53 69 7a  nfo->ulMinKeySiz
23410 65 20 3d 20 35 31 32 3b 0a 09 09 09 70 49 6e 66  e = 512;....pInf
23420 6f 2d 3e 75 6c 4d 61 78 4b 65 79 53 69 7a 65 20  o->ulMaxKeySize 
23430 3d 20 38 31 39 32 3b 0a 09 09 09 70 49 6e 66 6f  = 8192;....pInfo
23440 2d 3e 66 6c 61 67 73 20 3d 20 43 4b 46 5f 48 57  ->flags = CKF_HW
23450 20 7c 20 43 4b 46 5f 45 4e 43 52 59 50 54 20 7c   | CKF_ENCRYPT |
23460 20 43 4b 46 5f 44 45 43 52 59 50 54 20 7c 20 43   CKF_DECRYPT | C
23470 4b 46 5f 53 49 47 4e 20 7c 20 43 4b 46 5f 56 45  KF_SIGN | CKF_VE
23480 52 49 46 59 3b 0a 09 09 09 62 72 65 61 6b 3b 0a  RIFY;....break;.
23490 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
234a0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
234b0 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22  ing CKR_OK (%i)"
234c0 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74  , CKR_OK);...ret
234d0 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a  urn(CKR_OK);.}..
234e0 2f 2a 20 57 65 20 64 6f 6e 27 74 20 73 75 70 70  /* We don't supp
234f0 6f 72 74 20 74 68 69 73 20 6d 65 74 68 6f 64 2e  ort this method.
23500 20 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55   */.CK_DEFINE_FU
23510 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
23520 49 6e 69 74 54 6f 6b 65 6e 29 28 43 4b 5f 53 4c  InitToken)(CK_SL
23530 4f 54 5f 49 44 20 73 6c 6f 74 49 44 2c 20 43 4b  OT_ID slotID, CK
23540 5f 55 54 46 38 43 48 41 52 5f 50 54 52 20 70 50  _UTF8CHAR_PTR pP
23550 69 6e 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50  in, CK_ULONG ulP
23560 69 6e 4c 65 6e 2c 20 43 4b 5f 55 54 46 38 43 48  inLen, CK_UTF8CH
23570 41 52 5f 50 54 52 20 70 4c 61 62 65 6c 29 20 7b  AR_PTR pLabel) {
23580 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
23590 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
235a0 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
235b0 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
235c0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
235d0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
235e0 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
235f0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
23600 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
23610 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
23620 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
23630 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
23640 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49 54 45 5f 50  KR_TOKEN_WRITE_P
23650 52 4f 54 45 43 54 45 44 20 28 25 69 29 22 2c 20  ROTECTED (%i)", 
23660 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49 54 45 5f  CKR_TOKEN_WRITE_
23670 50 52 4f 54 45 43 54 45 44 29 3b 0a 0a 09 72 65  PROTECTED);...re
23680 74 75 72 6e 28 43 4b 52 5f 54 4f 4b 45 4e 5f 57  turn(CKR_TOKEN_W
23690 52 49 54 45 5f 50 52 4f 54 45 43 54 45 44 29 3b  RITE_PROTECTED);
236a0 0a 7d 0a 0a 2f 2a 20 57 65 20 64 6f 6e 27 74 20  .}../* We don't 
236b0 73 75 70 70 6f 72 74 20 74 68 69 73 20 6d 65 74  support this met
236c0 68 6f 64 2e 20 2a 2f 0a 43 4b 5f 44 45 46 49 4e  hod. */.CK_DEFIN
236d0 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
236e0 2c 20 43 5f 49 6e 69 74 50 49 4e 29 28 43 4b 5f  , C_InitPIN)(CK_
236f0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
23700 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 55 54 46 38  Session, CK_UTF8
23710 43 48 41 52 5f 50 54 52 20 70 50 69 6e 2c 20 43  CHAR_PTR pPin, C
23720 4b 5f 55 4c 4f 4e 47 20 75 6c 50 69 6e 4c 65 6e  K_ULONG ulPinLen
23730 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
23740 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
23750 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
23760 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
23770 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
23780 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
23790 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
237a0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
237b0 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
237c0 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
237d0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
237e0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
237f0 67 20 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49 54  g CKR_TOKEN_WRIT
23800 45 5f 50 52 4f 54 45 43 54 45 44 20 28 25 69 29  E_PROTECTED (%i)
23810 22 2c 20 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49  ", CKR_TOKEN_WRI
23820 54 45 5f 50 52 4f 54 45 43 54 45 44 29 3b 0a 0a  TE_PROTECTED);..
23830 09 72 65 74 75 72 6e 28 43 4b 52 5f 54 4f 4b 45  .return(CKR_TOKE
23840 4e 5f 57 52 49 54 45 5f 50 52 4f 54 45 43 54 45  N_WRITE_PROTECTE
23850 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
23860 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
23870 20 43 5f 53 65 74 50 49 4e 29 28 43 4b 5f 53 45   C_SetPIN)(CK_SE
23880 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
23890 73 73 69 6f 6e 2c 20 43 4b 5f 55 54 46 38 43 48  ssion, CK_UTF8CH
238a0 41 52 5f 50 54 52 20 70 4f 6c 64 50 69 6e 2c 20  AR_PTR pOldPin, 
238b0 43 4b 5f 55 4c 4f 4e 47 20 75 6c 4f 6c 64 50 69  CK_ULONG ulOldPi
238c0 6e 4c 65 6e 2c 20 43 4b 5f 55 54 46 38 43 48 41  nLen, CK_UTF8CHA
238d0 52 5f 50 54 52 20 70 4e 65 77 50 69 6e 2c 20 43  R_PTR pNewPin, C
238e0 4b 5f 55 4c 4f 4e 47 20 75 6c 4e 65 77 50 69 6e  K_ULONG ulNewPin
238f0 4c 65 6e 29 20 7b 0a 09 63 68 61 72 20 6f 6c 64  Len) {..char old
23900 70 69 6e 62 75 66 5b 36 34 5d 2c 20 6e 65 77 70  pinbuf[64], newp
23910 69 6e 62 75 66 5b 36 34 5d 3b 0a 09 63 61 63 6b  inbuf[64];..cack
23920 65 79 5f 72 65 74 20 73 65 74 5f 70 69 6e 5f 72  ey_ret set_pin_r
23930 65 74 2c 20 67 65 74 5f 70 69 6e 5f 72 65 74 3b  et, get_pin_ret;
23940 0a 09 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f  ..CK_SLOT_ID slo
23950 74 49 44 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f  tID;..int mutex_
23960 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59  retval;...CACKEY
23970 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
23980 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
23990 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
239a0 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
239b0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
239c0 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
239d0 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
239e0 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
239f0 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
23a00 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65  );..}...mutex_re
23a10 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
23a20 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  tex_lock(cackey_
23a30 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
23a40 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
23a50 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
23a60 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
23a70 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65  .  Locking faile
23a80 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
23a90 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
23aa0 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61  R);..}...if (!ca
23ab0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
23ac0 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20  ession].active) 
23ad0 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  {...cackey_mutex
23ae0 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
23af0 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b  iglock);....CACK
23b00 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
23b10 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e  "Error.  Session
23b20 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a   not active.");.
23b30 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
23b40 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49  SESSION_HANDLE_I
23b50 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 73 6c  NVALID);..}...sl
23b60 6f 74 49 44 20 3d 20 63 61 63 6b 65 79 5f 73 65  otID = cackey_se
23b70 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
23b80 2e 73 6c 6f 74 49 44 3b 0a 0a 09 69 66 20 28 73  .slotID;...if (s
23b90 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f  lotID < 0 || slo
23ba0 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63  tID >= (sizeof(c
23bb0 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73  ackey_slots) / s
23bc0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f  izeof(cackey_slo
23bd0 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43  ts[0]))) {...CAC
23be0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
23bf0 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64  ("Error. Invalid
23c00 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20   slot requested 
23c10 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f  (%lu), outside o
23c20 66 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20  f valid range", 
23c30 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b  slotID);....cack
23c40 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
23c50 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
23c60 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
23c70 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
23c80 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73  }...if (cackey_s
23c90 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74  lots[slotID].act
23ca0 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41  ive == 0) {...CA
23cb0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
23cc0 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69  F("Error. Invali
23cd0 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64  d slot requested
23ce0 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74   (%lu), slot not
23cf0 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76   currently activ
23d00 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09  e", slotID);....
23d10 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
23d20 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
23d30 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  ck);....return(C
23d40 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
23d50 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b  );..}...if (cack
23d60 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20 21  ey_pin_command !
23d70 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 2f 2a 20 47  = NULL) {.../* G
23d80 65 74 20 6f 6c 64 20 50 49 4e 20 2a 2f 0a 09 09  et old PIN */...
23d90 67 65 74 5f 70 69 6e 5f 72 65 74 20 3d 20 63 61  get_pin_ret = ca
23da0 63 6b 65 79 5f 67 65 74 5f 70 69 6e 28 6f 6c 64  ckey_get_pin(old
23db0 70 69 6e 62 75 66 29 3b 0a 0a 09 09 69 66 20 28  pinbuf);....if (
23dc0 67 65 74 5f 70 69 6e 5f 72 65 74 20 21 3d 20 43  get_pin_ret != C
23dd0 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29  ACKEY_PCSC_S_OK)
23de0 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
23df0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
23e00 20 77 68 69 6c 65 20 67 65 74 74 69 6e 67 20 4f   while getting O
23e10 6c 64 20 50 49 4e 2c 20 72 65 74 75 72 6e 69 6e  ld PIN, returnin
23e20 67 20 43 4b 52 5f 50 49 4e 5f 49 4e 43 4f 52 52  g CKR_PIN_INCORR
23e30 45 43 54 2e 22 29 3b 0a 0a 09 09 09 63 61 63 6b  ECT.");.....cack
23e40 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
23e50 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
23e60 0a 09 09 09 0a 09 09 09 72 65 74 75 72 6e 28 43  ........return(C
23e70 4b 52 5f 50 49 4e 5f 49 4e 43 4f 52 52 45 43 54  KR_PIN_INCORRECT
23e80 29 3b 0a 09 09 7d 0a 0a 09 09 70 4f 6c 64 50 69  );...}....pOldPi
23e90 6e 20 3d 20 28 43 4b 5f 55 54 46 38 43 48 41 52  n = (CK_UTF8CHAR
23ea0 5f 50 54 52 29 20 6f 6c 64 70 69 6e 62 75 66 3b  _PTR) oldpinbuf;
23eb0 0a 09 09 75 6c 4f 6c 64 50 69 6e 4c 65 6e 20 3d  ...ulOldPinLen =
23ec0 20 73 74 72 6c 65 6e 28 6f 6c 64 70 69 6e 62 75   strlen(oldpinbu
23ed0 66 29 3b 0a 0a 09 09 2f 2a 20 47 65 74 20 6e 65  f);..../* Get ne
23ee0 77 20 50 49 4e 20 2a 2f 0a 09 09 67 65 74 5f 70  w PIN */...get_p
23ef0 69 6e 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f  in_ret = cackey_
23f00 67 65 74 5f 70 69 6e 28 6e 65 77 70 69 6e 62 75  get_pin(newpinbu
23f10 66 29 3b 0a 0a 09 09 69 66 20 28 67 65 74 5f 70  f);....if (get_p
23f20 69 6e 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59  in_ret != CACKEY
23f30 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09  _PCSC_S_OK) {...
23f40 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
23f50 49 4e 54 46 28 22 45 72 72 6f 72 20 77 68 69 6c  INTF("Error whil
23f60 65 20 67 65 74 74 69 6e 67 20 4e 65 77 20 50 49  e getting New PI
23f70 4e 2c 20 72 65 74 75 72 6e 69 6e 67 20 43 4b 52  N, returning CKR
23f80 5f 50 49 4e 5f 49 4e 56 41 4c 49 44 2e 22 29 3b  _PIN_INVALID.");
23f90 0a 0a 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65  .....cackey_mute
23fa0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
23fb0 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 09 0a 09 09  biglock);.......
23fc0 09 72 65 74 75 72 6e 28 43 4b 52 5f 50 49 4e 5f  .return(CKR_PIN_
23fd0 49 4e 56 41 4c 49 44 29 3b 0a 09 09 7d 0a 0a 09  INVALID);...}...
23fe0 09 70 4e 65 77 50 69 6e 20 3d 20 28 43 4b 5f 55  .pNewPin = (CK_U
23ff0 54 46 38 43 48 41 52 5f 50 54 52 29 20 6e 65 77  TF8CHAR_PTR) new
24000 70 69 6e 62 75 66 3b 0a 09 09 75 6c 4e 65 77 50  pinbuf;...ulNewP
24010 69 6e 4c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 6e  inLen = strlen(n
24020 65 77 70 69 6e 62 75 66 29 3b 0a 09 7d 0a 0a 09  ewpinbuf);..}...
24030 69 66 20 28 70 4f 6c 64 50 69 6e 20 3d 3d 20 4e  if (pOldPin == N
24040 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
24050 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4f 6c  DEBUG_PRINTF("Ol
24060 64 20 50 49 4e 20 76 61 6c 75 65 20 69 73 20 77  d PIN value is w
24070 72 6f 6e 67 20 28 6e 75 6c 6c 29 2e 22 29 3b 0a  rong (null).");.
24080 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
24090 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
240a0 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72  glock);....retur
240b0 6e 28 43 4b 52 5f 50 49 4e 5f 49 4e 43 4f 52 52  n(CKR_PIN_INCORR
240c0 45 43 54 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75  ECT);..}...if (u
240d0 6c 4f 6c 64 50 69 6e 4c 65 6e 20 3d 3d 20 30 20  lOldPinLen == 0 
240e0 7c 7c 20 75 6c 4f 6c 64 50 69 6e 4c 65 6e 20 3e  || ulOldPinLen >
240f0 20 38 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   8) {...CACKEY_D
24100 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4f 6c 64  EBUG_PRINTF("Old
24110 20 50 49 4e 20 6c 65 6e 67 74 68 20 69 73 20 77   PIN length is w
24120 72 6f 6e 67 3a 20 25 6c 75 2e 22 2c 20 28 75 6e  rong: %lu.", (un
24130 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 4f  signed long) ulO
24140 6c 64 50 69 6e 4c 65 6e 29 3b 0a 0a 09 09 63 61  ldPinLen);....ca
24150 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
24160 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
24170 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
24180 5f 50 49 4e 5f 49 4e 43 4f 52 52 45 43 54 29 3b  _PIN_INCORRECT);
24190 0a 09 7d 0a 0a 09 69 66 20 28 70 4e 65 77 50 69  ..}...if (pNewPi
241a0 6e 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  n == NULL) {...C
241b0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
241c0 54 46 28 22 4e 65 77 20 50 49 4e 20 76 61 6c 75  TF("New PIN valu
241d0 65 20 69 73 20 77 72 6f 6e 67 20 28 65 69 74 68  e is wrong (eith
241e0 65 72 20 4e 55 4c 4c 2c 20 6f 72 20 74 6f 6f 20  er NULL, or too 
241f0 6c 6f 6e 67 2f 73 68 6f 72 74 29 2e 22 29 3b 0a  long/short).");.
24200 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
24210 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
24220 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72  glock);....retur
24230 6e 28 43 4b 52 5f 50 49 4e 5f 49 4e 56 41 4c 49  n(CKR_PIN_INVALI
24240 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 6c 4e  D);..}...if (ulN
24250 65 77 50 69 6e 4c 65 6e 20 3c 20 35 20 7c 7c 20  ewPinLen < 5 || 
24260 75 6c 4e 65 77 50 69 6e 4c 65 6e 20 3e 20 38 29  ulNewPinLen > 8)
24270 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
24280 47 5f 50 52 49 4e 54 46 28 22 4e 65 77 20 50 49  G_PRINTF("New PI
24290 4e 20 6c 65 6e 67 74 68 20 69 73 20 77 72 6f 6e  N length is wron
242a0 67 3a 20 25 6c 75 2c 20 6d 75 73 74 20 62 65 20  g: %lu, must be 
242b0 61 74 6c 65 61 73 74 20 35 20 61 6e 64 20 6e 6f  atleast 5 and no
242c0 20 6d 6f 72 65 20 74 68 61 6e 20 38 2e 22 2c 20   more than 8.", 
242d0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
242e0 75 6c 4e 65 77 50 69 6e 4c 65 6e 29 3b 0a 0a 09  ulNewPinLen);...
242f0 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
24300 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
24310 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  ock);....return(
24320 43 4b 52 5f 50 49 4e 5f 4c 45 4e 5f 52 41 4e 47  CKR_PIN_LEN_RANG
24330 45 29 3b 0a 09 7d 0a 0a 09 73 65 74 5f 70 69 6e  E);..}...set_pin
24340 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65  _ret = cackey_se
24350 74 5f 70 69 6e 28 26 63 61 63 6b 65 79 5f 73 6c  t_pin(&cackey_sl
24360 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c 20 70 4f 6c  ots[slotID], pOl
24370 64 50 69 6e 2c 20 75 6c 4f 6c 64 50 69 6e 4c 65  dPin, ulOldPinLe
24380 6e 2c 20 70 4e 65 77 50 69 6e 2c 20 75 6c 4e 65  n, pNewPin, ulNe
24390 77 50 69 6e 4c 65 6e 29 3b 0a 0a 09 69 66 20 28  wPinLen);...if (
243a0 73 65 74 5f 70 69 6e 5f 72 65 74 20 21 3d 20 43  set_pin_ret != C
243b0 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29  ACKEY_PCSC_S_OK)
243c0 20 7b 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f   {...if (cackey_
243d0 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20 3d 3d 20 4e  pin_command == N
243e0 55 4c 4c 29 20 7b 0a 09 09 09 63 61 63 6b 65 79  ULL) {....cackey
243f0 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 74  _slots[slotID].t
24400 6f 6b 65 6e 5f 66 6c 61 67 73 20 7c 3d 20 43 4b  oken_flags |= CK
24410 46 5f 4c 4f 47 49 4e 5f 52 45 51 55 49 52 45 44  F_LOGIN_REQUIRED
24420 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 73 65 74  ;...}....if (set
24430 5f 70 69 6e 5f 72 65 74 20 3d 3d 20 43 41 43 4b  _pin_ret == CACK
24440 45 59 5f 50 43 53 43 5f 45 5f 4c 4f 43 4b 45 44  EY_PCSC_E_LOCKED
24450 29 20 7b 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c  ) {....cackey_sl
24460 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 74 6f 6b 65  ots[slotID].toke
24470 6e 5f 66 6c 61 67 73 20 7c 3d 20 43 4b 46 5f 55  n_flags |= CKF_U
24480 53 45 52 5f 50 49 4e 5f 4c 4f 43 4b 45 44 3b 0a  SER_PIN_LOCKED;.
24490 09 09 7d 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  ..}..}...mutex_r
244a0 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
244b0 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
244c0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
244d0 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
244e0 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
244f0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
24500 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20  ror.  Unlocking 
24510 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
24520 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
24530 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 73 77  _ERROR);..}...sw
24540 69 74 63 68 20 28 73 65 74 5f 70 69 6e 5f 72 65  itch (set_pin_re
24550 74 29 20 7b 0a 09 09 63 61 73 65 20 43 41 43 4b  t) {...case CACK
24560 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 3a 0a 09 09  EY_PCSC_S_OK:...
24570 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
24580 49 4e 54 46 28 22 53 75 63 63 65 73 73 66 75 6c  INTF("Successful
24590 6c 79 20 73 65 74 20 50 49 4e 2e 22 29 3b 0a 0a  ly set PIN.");..
245a0 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b  ...return(CKR_OK
245b0 29 3b 0a 09 09 63 61 73 65 20 43 41 43 4b 45 59  );...case CACKEY
245c0 5f 50 43 53 43 5f 45 5f 42 41 44 50 49 4e 3a 0a  _PCSC_E_BADPIN:.
245d0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
245e0 50 52 49 4e 54 46 28 22 50 49 4e 20 77 61 73 20  PRINTF("PIN was 
245f0 69 6e 76 61 6c 69 64 2e 22 29 3b 0a 0a 09 09 09  invalid.");.....
24600 72 65 74 75 72 6e 28 43 4b 52 5f 50 49 4e 5f 49  return(CKR_PIN_I
24610 4e 56 41 4c 49 44 29 3b 0a 09 09 63 61 73 65 20  NVALID);...case 
24620 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4c 4f  CACKEY_PCSC_E_LO
24630 43 4b 45 44 3a 0a 09 09 09 43 41 43 4b 45 59 5f  CKED:....CACKEY_
24640 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54 6f  DEBUG_PRINTF("To
24650 6b 65 6e 20 69 73 20 6c 6f 63 6b 65 64 20 6f 72  ken is locked or
24660 20 74 68 69 73 20 63 68 61 6e 67 65 20 69 73 20   this change is 
24670 6e 6f 74 20 70 65 72 6d 69 74 74 65 64 2e 22 29  not permitted.")
24680 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 4b 52  ;.....return(CKR
24690 5f 50 49 4e 5f 4c 4f 43 4b 45 44 29 3b 0a 09 09  _PIN_LOCKED);...
246a0 64 65 66 61 75 6c 74 3a 0a 09 09 09 43 41 43 4b  default:....CACK
246b0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
246c0 22 53 6f 6d 65 74 68 69 6e 67 20 65 6c 73 65 20  "Something else 
246d0 77 65 6e 74 20 77 72 6f 6e 67 20 63 68 61 6e 67  went wrong chang
246e0 69 6e 67 20 74 68 65 20 50 49 4e 3a 20 25 69 22  ing the PIN: %i"
246f0 2c 20 73 65 74 5f 70 69 6e 5f 72 65 74 29 3b 0a  , set_pin_ret);.
24700 0a 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
24710 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
24720 7d 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  }...return(CKR_G
24730 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 7d  ENERAL_ERROR);.}
24740 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
24750 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 4f 70  TION(CK_RV, C_Op
24760 65 6e 53 65 73 73 69 6f 6e 29 28 43 4b 5f 53 4c  enSession)(CK_SL
24770 4f 54 5f 49 44 20 73 6c 6f 74 49 44 2c 20 43 4b  OT_ID slotID, CK
24780 5f 46 4c 41 47 53 20 66 6c 61 67 73 2c 20 43 4b  _FLAGS flags, CK
24790 5f 56 4f 49 44 5f 50 54 52 20 70 41 70 70 6c 69  _VOID_PTR pAppli
247a0 63 61 74 69 6f 6e 2c 20 43 4b 5f 4e 4f 54 49 46  cation, CK_NOTIF
247b0 59 20 6e 6f 74 69 66 79 2c 20 43 4b 5f 53 45 53  Y notify, CK_SES
247c0 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 50 54 52 20  SION_HANDLE_PTR 
247d0 70 68 53 65 73 73 69 6f 6e 29 20 7b 0a 09 75 6e  phSession) {..un
247e0 73 69 67 6e 65 64 20 6c 6f 6e 67 20 69 64 78 3b  signed long idx;
247f0 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76  ..int mutex_retv
24800 61 6c 3b 0a 09 69 6e 74 20 66 6f 75 6e 64 5f 73  al;..int found_s
24810 65 73 73 69 6f 6e 20 3d 20 30 3b 0a 0a 09 43 41  ession = 0;...CA
24820 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
24830 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
24840 69 66 20 28 28 66 6c 61 67 73 20 26 20 43 4b 46  if ((flags & CKF
24850 5f 53 45 52 49 41 4c 5f 53 45 53 53 49 4f 4e 29  _SERIAL_SESSION)
24860 20 21 3d 20 43 4b 46 5f 53 45 52 49 41 4c 5f 53   != CKF_SERIAL_S
24870 45 53 53 49 4f 4e 29 20 7b 0a 09 09 72 65 74 75  ESSION) {...retu
24880 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 50  rn(CKR_SESSION_P
24890 41 52 41 4c 4c 45 4c 5f 4e 4f 54 5f 53 55 50 50  ARALLEL_NOT_SUPP
248a0 4f 52 54 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  ORTED);..}...if 
248b0 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
248c0 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
248d0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
248e0 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
248f0 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
24900 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
24910 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
24920 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f  D);..}...if (slo
24930 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49  tID < 0 || slotI
24940 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63  D >= (sizeof(cac
24950 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a  key_slots) / siz
24960 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
24970 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45  [0]))) {...CACKE
24980 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
24990 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73  Error. Invalid s
249a0 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25  lot requested (%
249b0 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20  lu), outside of 
249c0 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c  valid range", sl
249d0 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e  otID);....return
249e0 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56  (CKR_SLOT_ID_INV
249f0 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65  ALID);..}...mute
24a00 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
24a10 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63  y_mutex_lock(cac
24a20 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
24a30 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
24a40 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
24a50 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
24a60 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66  rror.  Locking f
24a70 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
24a80 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
24a90 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20  ERROR);..}...if 
24aa0 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c  (cackey_slots[sl
24ab0 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20  otID].active == 
24ac0 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
24ad0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
24ae0 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20  r. Invalid slot 
24af0 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c  requested (%lu),
24b00 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e   slot not curren
24b10 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f  tly active", slo
24b20 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f  tID);....cackey_
24b30 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
24b40 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
24b50 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54  .return(CKR_SLOT
24b60 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  _ID_INVALID);..}
24b70 0a 0a 09 2f 2a 20 56 65 72 69 66 79 20 74 68 61  .../* Verify tha
24b80 74 20 74 68 65 20 63 61 72 64 20 69 73 20 61 63  t the card is ac
24b90 74 75 61 6c 6c 79 20 69 6e 20 74 68 65 20 73 6c  tually in the sl
24ba0 6f 74 2e 20 2a 2f 0a 09 2f 2a 20 58 58 58 3a 20  ot. */../* XXX: 
24bb0 43 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75  Check to make su
24bc0 72 65 20 74 68 69 73 20 69 73 20 69 6e 20 74 68  re this is in th
24bd0 65 20 50 4b 43 53 23 31 31 20 73 70 65 63 69 66  e PKCS#11 specif
24be0 69 63 61 74 69 6f 6e 20 2a 2f 0a 09 69 66 20 28  ication */..if (
24bf0 63 61 63 6b 65 79 5f 74 6f 6b 65 6e 5f 70 72 65  cackey_token_pre
24c00 73 65 6e 74 28 26 63 61 63 6b 65 79 5f 73 6c 6f  sent(&cackey_slo
24c10 74 73 5b 73 6c 6f 74 49 44 5d 29 20 21 3d 20 43  ts[slotID]) != C
24c20 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 54 4f 4b  ACKEY_PCSC_S_TOK
24c30 45 4e 50 52 45 53 45 4e 54 29 20 7b 0a 09 09 43  ENPRESENT) {...C
24c40 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
24c50 54 46 28 22 45 72 72 6f 72 2e 20 20 43 61 72 64  TF("Error.  Card
24c60 20 6e 6f 74 20 70 72 65 73 65 6e 74 2e 20 20 52   not present.  R
24c70 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 44 45 56  eturning CKR_DEV
24c80 49 43 45 5f 52 45 4d 4f 56 45 44 22 29 3b 0a 0a  ICE_REMOVED");..
24c90 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
24ca0 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
24cb0 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e  lock);....return
24cc0 28 43 4b 52 5f 44 45 56 49 43 45 5f 52 45 4d 4f  (CKR_DEVICE_REMO
24cd0 56 45 44 29 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28  VED);..}...for (
24ce0 69 64 78 20 3d 20 31 3b 20 69 64 78 20 3c 20 28  idx = 1; idx < (
24cf0 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
24d00 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66  ssions) / sizeof
24d10 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
24d20 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29 20 7b 0a  [0])); idx++) {.
24d30 09 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65  ..if (!cackey_se
24d40 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 61 63 74 69  ssions[idx].acti
24d50 76 65 29 20 7b 0a 09 09 09 66 6f 75 6e 64 5f 73  ve) {....found_s
24d60 65 73 73 69 6f 6e 20 3d 20 31 3b 0a 0a 09 09 09  ession = 1;.....
24d70 2a 70 68 53 65 73 73 69 6f 6e 20 3d 20 69 64 78  *phSession = idx
24d80 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73  ;.....cackey_ses
24d90 73 69 6f 6e 73 5b 69 64 78 5d 2e 61 63 74 69 76  sions[idx].activ
24da0 65 20 3d 20 31 3b 0a 09 09 09 63 61 63 6b 65 79  e = 1;....cackey
24db0 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 73  _sessions[idx].s
24dc0 6c 6f 74 49 44 20 3d 20 73 6c 6f 74 49 44 3b 0a  lotID = slotID;.
24dd0 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
24de0 6e 73 5b 69 64 78 5d 2e 73 74 61 74 65 20 3d 20  ns[idx].state = 
24df0 43 4b 53 5f 52 4f 5f 50 55 42 4c 49 43 5f 53 45  CKS_RO_PUBLIC_SE
24e00 53 53 49 4f 4e 3b 0a 09 09 09 63 61 63 6b 65 79  SSION;....cackey
24e10 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 66  _sessions[idx].f
24e20 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 09 09  lags = flags;...
24e30 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
24e40 5b 69 64 78 5d 2e 75 6c 44 65 76 69 63 65 45 72  [idx].ulDeviceEr
24e50 72 6f 72 20 3d 20 30 3b 0a 09 09 09 63 61 63 6b  ror = 0;....cack
24e60 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d  ey_sessions[idx]
24e70 2e 70 41 70 70 6c 69 63 61 74 69 6f 6e 20 3d 20  .pApplication = 
24e80 70 41 70 70 6c 69 63 61 74 69 6f 6e 3b 0a 09 09  pApplication;...
24e90 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
24ea0 5b 69 64 78 5d 2e 4e 6f 74 69 66 79 20 3d 20 6e  [idx].Notify = n
24eb0 6f 74 69 66 79 3b 0a 0a 09 09 09 63 61 63 6b 65  otify;.....cacke
24ec0 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e  y_sessions[idx].
24ed0 69 64 65 6e 74 69 74 69 65 73 20 3d 20 4e 55 4c  identities = NUL
24ee0 4c 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73  L;....cackey_ses
24ef0 73 69 6f 6e 73 5b 69 64 78 5d 2e 69 64 65 6e 74  sions[idx].ident
24f00 69 74 69 65 73 5f 63 6f 75 6e 74 20 3d 20 30 3b  ities_count = 0;
24f10 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73  .....cackey_sess
24f20 69 6f 6e 73 5b 69 64 78 5d 2e 73 65 61 72 63 68  ions[idx].search
24f30 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a 0a 09 09  _active = 0;....
24f40 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
24f50 5b 69 64 78 5d 2e 73 69 67 6e 5f 61 63 74 69 76  [idx].sign_activ
24f60 65 20 3d 20 30 3b 0a 0a 09 09 09 63 61 63 6b 65  e = 0;.....cacke
24f70 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e  y_sessions[idx].
24f80 64 65 63 72 79 70 74 5f 61 63 74 69 76 65 20 3d  decrypt_active =
24f90 20 30 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73   0;.....cackey_s
24fa0 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 69 64 65  essions[idx].ide
24fb0 6e 74 69 74 69 65 73 20 3d 20 63 61 63 6b 65 79  ntities = cackey
24fc0 5f 72 65 61 64 5f 69 64 65 6e 74 69 74 69 65 73  _read_identities
24fd0 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73  (&cackey_slots[s
24fe0 6c 6f 74 49 44 5d 2c 20 26 63 61 63 6b 65 79 5f  lotID], &cackey_
24ff0 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 69 64  sessions[idx].id
25000 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 29 3b  entities_count);
25010 0a 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d  ......break;...}
25020 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  ..}...mutex_retv
25030 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
25040 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
25050 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
25060 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
25070 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
25080 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
25090 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69  .  Unlocking fai
250a0 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
250b0 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
250c0 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21  ROR);..}...if (!
250d0 66 6f 75 6e 64 5f 73 65 73 73 69 6f 6e 29 20 7b  found_session) {
250e0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
250f0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
25100 67 20 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 43 4f  g CKR_SESSION_CO
25110 55 4e 54 20 28 25 69 29 22 2c 20 43 4b 52 5f 53  UNT (%i)", CKR_S
25120 45 53 53 49 4f 4e 5f 43 4f 55 4e 54 29 3b 0a 0a  ESSION_COUNT);..
25130 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53  ..return(CKR_SES
25140 53 49 4f 4e 5f 43 4f 55 4e 54 29 3b 0a 09 7d 0a  SION_COUNT);..}.
25150 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
25160 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
25170 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43   CKR_OK (%i)", C
25180 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e  KR_OK);...return
25190 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f  (CKR_OK);.}..CK_
251a0 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
251b0 43 4b 5f 52 56 2c 20 43 5f 43 6c 6f 73 65 53 65  CK_RV, C_CloseSe
251c0 73 73 69 6f 6e 29 28 43 4b 5f 53 45 53 53 49 4f  ssion)(CK_SESSIO
251d0 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
251e0 6e 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f  n) {..int mutex_
251f0 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59  retval;...CACKEY
25200 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
25210 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
25220 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
25230 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
25240 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
25250 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
25260 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
25270 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
25280 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
25290 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73  );..}...if (hSes
252a0 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65  sion == 0 || hSe
252b0 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66  ssion >= (sizeof
252c0 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
252d0 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
252e0 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29  y_sessions[0])))
252f0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
25300 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
25310 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66    Session out of
25320 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09   range.");......
25330 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
25340 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  ON_HANDLE_INVALI
25350 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  D);..}...mutex_r
25360 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
25370 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79  utex_lock(cackey
25380 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
25390 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
253a0 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
253b0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
253c0 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c  r.  Locking fail
253d0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
253e0 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
253f0 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63  OR);..}...if (!c
25400 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
25410 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29  Session].active)
25420 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65   {...cackey_mute
25430 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
25440 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43  biglock);....CAC
25450 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
25460 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f  ("Error.  Sessio
25470 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b  n not active.");
25480 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
25490 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
254a0 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 63  INVALID);..}...c
254b0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
254c0 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 20  Session].active 
254d0 3d 20 30 3b 0a 09 63 61 63 6b 65 79 5f 66 72 65  = 0;..cackey_fre
254e0 65 5f 69 64 65 6e 74 69 74 69 65 73 28 63 61 63  e_identities(cac
254f0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
25500 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65  ssion].identitie
25510 73 2c 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  s, cackey_sessio
25520 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65  ns[hSession].ide
25530 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 29 3b 0a  ntities_count);.
25540 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
25550 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e   cackey_mutex_un
25560 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
25570 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
25580 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
25590 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
255a0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55  RINTF("Error.  U
255b0 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e  nlocking failed.
255c0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
255d0 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
255e0 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
255f0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
25600 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69  rning CKR_OK (%i
25610 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72  )", CKR_OK);...r
25620 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d  eturn(CKR_OK);.}
25630 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
25640 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 43 6c  TION(CK_RV, C_Cl
25650 6f 73 65 41 6c 6c 53 65 73 73 69 6f 6e 73 29 28  oseAllSessions)(
25660 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49  CK_SLOT_ID slotI
25670 44 29 20 7b 0a 09 75 69 6e 74 33 32 5f 74 20 69  D) {..uint32_t i
25680 64 78 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72  dx;..int mutex_r
25690 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f  etval;...CACKEY_
256a0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
256b0 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
256c0 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
256d0 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
256e0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
256f0 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
25700 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
25710 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
25720 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
25730 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 49  ;..}...if (slotI
25740 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20  D < 0 || slotID 
25750 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65  >= (sizeof(cacke
25760 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f  y_slots) / sizeo
25770 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30  f(cackey_slots[0
25780 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ]))) {...CACKEY_
25790 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
257a0 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f  ror. Invalid slo
257b0 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75  t requested (%lu
257c0 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 76 61  ), outside of va
257d0 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74  lid range", slot
257e0 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  ID);....return(C
257f0 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c  KR_SLOT_ID_INVAL
25800 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f  ID);..}...mutex_
25810 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
25820 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65  mutex_lock(cacke
25830 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
25840 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
25850 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
25860 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
25870 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69  or.  Locking fai
25880 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
25890 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
258a0 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63  ROR);..}...if (c
258b0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
258c0 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 29  ID].active == 0)
258d0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
258e0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
258f0 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65   Invalid slot re
25900 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 73  quested (%lu), s
25910 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c  lot not currentl
25920 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 49  y active", slotI
25930 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75  D);....cackey_mu
25940 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
25950 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72  y_biglock);....r
25960 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49  eturn(CKR_SLOT_I
25970 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  D_INVALID);..}..
25980 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69  .for (idx = 0; i
25990 64 78 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63  dx < (sizeof(cac
259a0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20  key_sessions) / 
259b0 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
259c0 73 73 69 6f 6e 73 5b 30 5d 29 29 3b 20 69 64 78  ssions[0])); idx
259d0 2b 2b 29 20 7b 0a 09 09 69 66 20 28 63 61 63 6b  ++) {...if (cack
259e0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d  ey_sessions[idx]
259f0 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 09 69 66  .active) {....if
25a00 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e   (cackey_session
25a10 73 5b 69 64 78 5d 2e 73 6c 6f 74 49 44 20 21 3d  s[idx].slotID !=
25a20 20 73 6c 6f 74 49 44 29 20 7b 0a 09 09 09 09 63   slotID) {.....c
25a30 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a 09  ontinue;....}...
25a40 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
25a50 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
25a60 6c 6f 63 6b 29 3b 0a 09 09 09 43 5f 43 6c 6f 73  lock);....C_Clos
25a70 65 53 65 73 73 69 6f 6e 28 69 64 78 29 3b 0a 09  eSession(idx);..
25a80 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c  ..cackey_mutex_l
25a90 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
25aa0 63 6b 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 6d 75  ck);...}..}...mu
25ab0 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
25ac0 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
25ad0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
25ae0 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
25af0 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
25b00 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
25b10 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63  F("Error.  Unloc
25b20 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
25b30 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
25b40 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
25b50 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
25b60 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
25b70 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20  g CKR_OK (%i)", 
25b80 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72  CKR_OK);...retur
25b90 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b  n(CKR_OK);.}..CK
25ba0 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
25bb0 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 53 65 73  (CK_RV, C_GetSes
25bc0 73 69 6f 6e 49 6e 66 6f 29 28 43 4b 5f 53 45 53  sionInfo)(CK_SES
25bd0 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
25be0 73 69 6f 6e 2c 20 43 4b 5f 53 45 53 53 49 4f 4e  sion, CK_SESSION
25bf0 5f 49 4e 46 4f 5f 50 54 52 20 70 49 6e 66 6f 29  _INFO_PTR pInfo)
25c00 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65   {..int mutex_re
25c10 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  tval;...CACKEY_D
25c20 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
25c30 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70 49  led.");...if (pI
25c40 6e 66 6f 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  nfo == NULL) {..
25c50 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
25c60 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 49 6e  INTF("Error. pIn
25c70 66 6f 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a  fo is NULL.");..
25c80 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47  ..return(CKR_ARG
25c90 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a  UMENTS_BAD);..}.
25ca0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
25cb0 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
25cc0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
25cd0 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
25ce0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
25cf0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
25d00 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
25d10 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66  ALIZED);..}...if
25d20 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20   (hSession == 0 
25d30 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28  || hSession >= (
25d40 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
25d50 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66  ssions) / sizeof
25d60 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
25d70 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45  [0]))) {...CACKE
25d80 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
25d90 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20  Error.  Session 
25da0 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b  out of range.");
25db0 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
25dc0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
25dd0 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d  INVALID);..}...m
25de0 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
25df0 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28  ckey_mutex_lock(
25e00 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
25e10 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
25e20 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
25e30 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
25e40 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e  ("Error.  Lockin
25e50 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
25e60 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
25e70 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
25e80 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73  if (!cackey_sess
25e90 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61  ions[hSession].a
25ea0 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65  ctive) {...cacke
25eb0 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
25ec0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
25ed0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
25ee0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
25ef0 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69  Session not acti
25f00 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ve.");......retu
25f10 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48  rn(CKR_SESSION_H
25f20 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a  ANDLE_INVALID);.
25f30 09 7d 0a 0a 09 70 49 6e 66 6f 2d 3e 73 6c 6f 74  .}...pInfo->slot
25f40 49 44 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73  ID = cackey_sess
25f50 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
25f60 6c 6f 74 49 44 3b 0a 09 70 49 6e 66 6f 2d 3e 73  lotID;..pInfo->s
25f70 74 61 74 65 20 3d 20 63 61 63 6b 65 79 5f 73 65  tate = cackey_se
25f80 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
25f90 2e 73 74 61 74 65 3b 0a 09 70 49 6e 66 6f 2d 3e  .state;..pInfo->
25fa0 66 6c 61 67 73 20 3d 20 63 61 63 6b 65 79 5f 73  flags = cackey_s
25fb0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
25fc0 5d 2e 66 6c 61 67 73 3b 0a 09 70 49 6e 66 6f 2d  ].flags;..pInfo-
25fd0 3e 75 6c 44 65 76 69 63 65 45 72 72 6f 72 20 3d  >ulDeviceError =
25fe0 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73   cackey_sessions
25ff0 5b 68 53 65 73 73 69 6f 6e 5d 2e 75 6c 44 65 76  [hSession].ulDev
26000 69 63 65 45 72 72 6f 72 3b 0a 0a 09 6d 75 74 65  iceError;...mute
26010 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
26020 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
26030 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
26040 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
26050 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
26060 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
26070 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69  "Error.  Unlocki
26080 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
26090 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
260a0 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
260b0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
260c0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
260d0 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b  CKR_OK (%i)", CK
260e0 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28  R_OK);...return(
260f0 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44  CKR_OK);.}..CK_D
26100 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
26110 4b 5f 52 56 2c 20 43 5f 47 65 74 4f 70 65 72 61  K_RV, C_GetOpera
26120 74 69 6f 6e 53 74 61 74 65 29 28 43 4b 5f 53 45  tionState)(CK_SE
26130 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
26140 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  ssion, CK_BYTE_P
26150 54 52 20 70 4f 70 65 72 61 74 69 6f 6e 53 74 61  TR pOperationSta
26160 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52  te, CK_ULONG_PTR
26170 20 70 75 6c 4f 70 65 72 61 74 69 6f 6e 53 74 61   pulOperationSta
26180 74 65 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59  teLen) {..CACKEY
26190 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
261a0 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
261b0 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
261c0 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
261d0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
261e0 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
261f0 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
26200 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
26210 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
26220 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
26230 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
26240 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
26250 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
26260 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
26270 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
26280 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
26290 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
262a0 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
262b0 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
262c0 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 65 74 4f 70  N(CK_RV, C_SetOp
262d0 65 72 61 74 69 6f 6e 53 74 61 74 65 29 28 43 4b  erationState)(CK
262e0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
262f0 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54  hSession, CK_BYT
26300 45 5f 50 54 52 20 70 4f 70 65 72 61 74 69 6f 6e  E_PTR pOperation
26310 53 74 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20  State, CK_ULONG 
26320 75 6c 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 65  ulOperationState
26330 4c 65 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48  Len, CK_OBJECT_H
26340 41 4e 44 4c 45 20 68 45 6e 63 72 79 70 74 69 6f  ANDLE hEncryptio
26350 6e 4b 65 79 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f  nKey, CK_OBJECT_
26360 48 41 4e 44 4c 45 20 68 41 75 74 68 65 6e 74 69  HANDLE hAuthenti
26370 63 61 74 69 6f 6e 4b 65 79 29 20 7b 0a 09 43 41  cationKey) {..CA
26380 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
26390 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
263a0 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
263b0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
263c0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
263d0 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
263e0 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
263f0 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
26400 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
26410 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
26420 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
26430 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
26440 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
26450 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
26460 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
26470 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
26480 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
26490 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
264a0 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
264b0 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 4c  CTION(CK_RV, C_L
264c0 6f 67 69 6e 4d 75 74 65 78 41 72 67 29 28 43 4b  oginMutexArg)(CK
264d0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
264e0 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 55 53 45  hSession, CK_USE
264f0 52 5f 54 59 50 45 20 75 73 65 72 54 79 70 65 2c  R_TYPE userType,
26500 20 43 4b 5f 55 54 46 38 43 48 41 52 5f 50 54 52   CK_UTF8CHAR_PTR
26510 20 70 50 69 6e 2c 20 43 4b 5f 55 4c 4f 4e 47 20   pPin, CK_ULONG 
26520 75 6c 50 69 6e 4c 65 6e 2c 20 69 6e 74 20 6c 6f  ulPinLen, int lo
26530 63 6b 5f 6d 75 74 65 78 29 20 7b 0a 09 43 4b 5f  ck_mutex) {..CK_
26540 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 3b 0a  SLOT_ID slotID;.
26550 09 63 61 63 6b 65 79 5f 72 65 74 20 67 65 74 5f  .cackey_ret get_
26560 70 69 6e 5f 72 65 74 3b 0a 09 63 68 61 72 20 70  pin_ret;..char p
26570 69 6e 62 75 66 5b 36 34 5d 3b 0a 09 69 6e 74 20  inbuf[64];..int 
26580 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09 69  mutex_retval;..i
26590 6e 74 20 74 72 69 65 73 5f 72 65 6d 61 69 6e 69  nt tries_remaini
265a0 6e 67 3b 0a 09 69 6e 74 20 6c 6f 67 69 6e 5f 72  ng;..int login_r
265b0 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  et;...CACKEY_DEB
265c0 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
265d0 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
265e0 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
265f0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
26600 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
26610 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
26620 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
26630 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
26640 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
26650 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e  }...if (hSession
26660 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f   == 0 || hSessio
26670 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63  n >= (sizeof(cac
26680 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20  key_sessions) / 
26690 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
266a0 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09  ssions[0]))) {..
266b0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
266c0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65  INTF("Error.  Se
266d0 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e  ssion out of ran
266e0 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ge.");......retu
266f0 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48  rn(CKR_SESSION_H
26700 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a  ANDLE_INVALID);.
26710 09 7d 0a 0a 09 69 66 20 28 75 73 65 72 54 79 70  .}...if (userTyp
26720 65 20 21 3d 20 43 4b 55 5f 55 53 45 52 29 20 7b  e != CKU_USER) {
26730 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
26740 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
26750 57 65 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 20  We only support 
26760 55 53 45 52 20 6d 6f 64 65 2c 20 61 73 6b 65 64  USER mode, asked
26770 20 66 6f 72 20 25 6c 75 20 6d 6f 64 65 2e 22 2c   for %lu mode.",
26780 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
26790 20 75 73 65 72 54 79 70 65 29 0a 0a 09 09 72 65   userType)....re
267a0 74 75 72 6e 28 43 4b 52 5f 55 53 45 52 5f 54 59  turn(CKR_USER_TY
267b0 50 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  PE_INVALID);..}.
267c0 0a 09 69 66 20 28 6c 6f 63 6b 5f 6d 75 74 65 78  ..if (lock_mutex
267d0 29 20 7b 0a 09 09 6d 75 74 65 78 5f 72 65 74 76  ) {...mutex_retv
267e0 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
267f0 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  x_lock(cackey_bi
26800 67 6c 6f 63 6b 29 3b 0a 09 09 69 66 20 28 6d 75  glock);...if (mu
26810 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
26820 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
26830 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
26840 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65  .  Locking faile
26850 64 2e 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e  d.");.....return
26860 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
26870 4f 52 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66  OR);...}..}...if
26880 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   (!cackey_sessio
26890 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74  ns[hSession].act
268a0 69 76 65 29 20 7b 0a 09 09 69 66 20 28 6c 6f 63  ive) {...if (loc
268b0 6b 5f 6d 75 74 65 78 29 20 7b 0a 09 09 09 63 61  k_mutex) {....ca
268c0 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
268d0 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
268e0 29 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59  );...}....CACKEY
268f0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
26900 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e  rror.  Session n
26910 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09  ot active.");...
26920 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
26930 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56  SSION_HANDLE_INV
26940 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74  ALID);..}...slot
26950 49 44 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73  ID = cackey_sess
26960 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
26970 6c 6f 74 49 44 3b 0a 0a 09 69 66 20 28 73 6c 6f  lotID;...if (slo
26980 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49  tID < 0 || slotI
26990 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63  D >= (sizeof(cac
269a0 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a  key_slots) / siz
269b0 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
269c0 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45  [0]))) {...CACKE
269d0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
269e0 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73  Error. Invalid s
269f0 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25  lot requested (%
26a00 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20  lu), outside of 
26a10 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c  valid range", sl
26a20 6f 74 49 44 29 3b 0a 0a 09 09 69 66 20 28 6c 6f  otID);....if (lo
26a30 63 6b 5f 6d 75 74 65 78 29 20 7b 0a 09 09 09 63  ck_mutex) {....c
26a40 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
26a50 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
26a60 6b 29 3b 0a 09 09 7d 0a 0a 09 09 72 65 74 75 72  k);...}....retur
26a70 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
26a80 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63  ROR);..}...if (c
26a90 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
26aa0 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 29  ID].active == 0)
26ab0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
26ac0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
26ad0 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65   Invalid slot re
26ae0 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 73  quested (%lu), s
26af0 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c  lot not currentl
26b00 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 49  y active", slotI
26b10 44 29 3b 0a 0a 09 09 69 66 20 28 6c 6f 63 6b 5f  D);....if (lock_
26b20 6d 75 74 65 78 29 20 7b 0a 09 09 09 63 61 63 6b  mutex) {....cack
26b30 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
26b40 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
26b50 0a 09 09 7d 0a 0a 09 09 72 65 74 75 72 6e 28 43  ...}....return(C
26b60 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
26b70 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b  );..}...if (cack
26b80 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20 21  ey_pin_command !
26b90 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 69 66 20 28  = NULL) {...if (
26ba0 70 50 69 6e 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  pPin != NULL) {.
26bb0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
26bc0 50 52 49 4e 54 46 28 22 50 72 6f 74 65 63 74 65  PRINTF("Protecte
26bd0 64 20 61 75 74 68 65 6e 74 69 63 61 74 69 6f 6e  d authentication
26be0 20 70 61 74 68 20 69 6e 20 65 66 66 65 63 74 20   path in effect 
26bf0 61 6e 64 20 50 49 4e 20 70 72 6f 76 69 64 65 64  and PIN provided
26c00 20 21 3f 22 29 3b 0a 09 09 7d 0a 0a 09 09 67 65   !?");...}....ge
26c10 74 5f 70 69 6e 5f 72 65 74 20 3d 20 63 61 63 6b  t_pin_ret = cack
26c20 65 79 5f 67 65 74 5f 70 69 6e 28 70 69 6e 62 75  ey_get_pin(pinbu
26c30 66 29 3b 0a 0a 09 09 69 66 20 28 67 65 74 5f 70  f);....if (get_p
26c40 69 6e 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59  in_ret != CACKEY
26c50 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09  _PCSC_S_OK) {...
26c60 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
26c70 49 4e 54 46 28 22 63 61 63 6b 65 79 5f 67 65 74  INTF("cackey_get
26c80 5f 70 69 6e 28 29 20 72 65 74 75 72 6e 65 64 20  _pin() returned 
26c90 69 6e 20 66 61 69 6c 75 72 65 2c 20 61 73 73 75  in failure, assu
26ca0 6d 69 6e 67 20 74 68 65 20 50 49 4e 20 77 61 73  ming the PIN was
26cb0 20 69 6e 63 6f 72 72 65 63 74 2e 22 29 3b 0a 0a   incorrect.");..
26cc0 09 09 09 69 66 20 28 6c 6f 63 6b 5f 6d 75 74 65  ...if (lock_mute
26cd0 78 29 20 7b 0a 09 09 09 09 63 61 63 6b 65 79 5f  x) {.....cackey_
26ce0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
26cf0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 09  key_biglock);...
26d00 09 7d 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 4b  .}.....return(CK
26d10 52 5f 50 49 4e 5f 49 4e 43 4f 52 52 45 43 54 29  R_PIN_INCORRECT)
26d20 3b 0a 09 09 7d 0a 0a 09 09 70 50 69 6e 20 3d 20  ;...}....pPin = 
26d30 28 43 4b 5f 55 54 46 38 43 48 41 52 5f 50 54 52  (CK_UTF8CHAR_PTR
26d40 29 20 70 69 6e 62 75 66 3b 0a 09 09 75 6c 50 69  ) pinbuf;...ulPi
26d50 6e 4c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 70 69  nLen = strlen(pi
26d60 6e 62 75 66 29 3b 0a 09 7d 0a 0a 09 6c 6f 67 69  nbuf);..}...logi
26d70 6e 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 6c  n_ret = cackey_l
26d80 6f 67 69 6e 28 26 63 61 63 6b 65 79 5f 73 6c 6f  ogin(&cackey_slo
26d90 74 73 5b 73 6c 6f 74 49 44 5d 2c 20 70 50 69 6e  ts[slotID], pPin
26da0 2c 20 75 6c 50 69 6e 4c 65 6e 2c 20 26 74 72 69  , ulPinLen, &tri
26db0 65 73 5f 72 65 6d 61 69 6e 69 6e 67 2c 20 33 29  es_remaining, 3)
26dc0 3b 0a 09 69 66 20 28 6c 6f 67 69 6e 5f 72 65 74  ;..if (login_ret
26dd0 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f   != CACKEY_PCSC_
26de0 53 5f 4f 4b 29 20 7b 0a 09 09 69 66 20 28 6c 6f  S_OK) {...if (lo
26df0 63 6b 5f 6d 75 74 65 78 29 20 7b 0a 09 09 09 63  ck_mutex) {....c
26e00 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
26e10 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
26e20 6b 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 6c  k);...}....if (l
26e30 6f 67 69 6e 5f 72 65 74 20 3d 3d 20 43 41 43 4b  ogin_ret == CACK
26e40 45 59 5f 50 43 53 43 5f 45 5f 4c 4f 43 4b 45 44  EY_PCSC_E_LOCKED
26e50 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
26e60 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
26e70 72 2e 20 20 54 6f 6b 65 6e 20 69 73 20 6c 6f 63  r.  Token is loc
26e80 6b 65 64 2e 22 29 3b 0a 0a 09 09 09 63 61 63 6b  ked.");.....cack
26e90 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
26ea0 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 7c 3d 20  .token_flags |= 
26eb0 43 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 4c 4f 43  CKF_USER_PIN_LOC
26ec0 4b 45 44 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f  KED;.....CACKEY_
26ed0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
26ee0 74 75 72 6e 69 6e 67 20 43 4b 52 5f 50 49 4e 5f  turning CKR_PIN_
26ef0 4c 4f 43 4b 45 44 20 28 25 69 29 22 2c 20 28 69  LOCKED (%i)", (i
26f00 6e 74 29 20 43 4b 52 5f 50 49 4e 5f 4c 4f 43 4b  nt) CKR_PIN_LOCK
26f10 45 44 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28  ED);.....return(
26f20 43 4b 52 5f 50 49 4e 5f 4c 4f 43 4b 45 44 29 3b  CKR_PIN_LOCKED);
26f30 0a 09 09 7d 20 65 6c 73 65 20 69 66 20 28 6c 6f  ...} else if (lo
26f40 67 69 6e 5f 72 65 74 20 3d 3d 20 43 41 43 4b 45  gin_ret == CACKE
26f50 59 5f 50 43 53 43 5f 45 5f 42 41 44 50 49 4e 29  Y_PCSC_E_BADPIN)
26f60 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
26f70 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
26f80 2e 20 20 49 6e 76 61 6c 69 64 20 50 49 4e 2e 22  .  Invalid PIN."
26f90 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c  );.....cackey_sl
26fa0 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 74 6f 6b 65  ots[slotID].toke
26fb0 6e 5f 66 6c 61 67 73 20 7c 3d 20 43 4b 46 5f 55  n_flags |= CKF_U
26fc0 53 45 52 5f 50 49 4e 5f 43 4f 55 4e 54 5f 4c 4f  SER_PIN_COUNT_LO
26fd0 57 3b 0a 0a 09 09 09 69 66 20 28 74 72 69 65 73  W;.....if (tries
26fe0 5f 72 65 6d 61 69 6e 69 6e 67 20 3d 3d 20 31 29  _remaining == 1)
26ff0 20 7b 0a 09 09 09 09 63 61 63 6b 65 79 5f 73 6c   {.....cackey_sl
27000 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 74 6f 6b 65  ots[slotID].toke
27010 6e 5f 66 6c 61 67 73 20 7c 3d 20 43 4b 46 5f 55  n_flags |= CKF_U
27020 53 45 52 5f 50 49 4e 5f 46 49 4e 41 4c 5f 54 52  SER_PIN_FINAL_TR
27030 59 3b 0a 09 09 09 7d 0a 0a 09 09 09 43 41 43 4b  Y;....}.....CACK
27040 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
27050 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 50  "Returning CKR_P
27060 49 4e 5f 49 4e 43 4f 52 52 45 43 54 20 28 25 69  IN_INCORRECT (%i
27070 29 22 2c 20 28 69 6e 74 29 20 43 4b 52 5f 50 49  )", (int) CKR_PI
27080 4e 5f 49 4e 43 4f 52 52 45 43 54 29 3b 0a 0a 09  N_INCORRECT);...
27090 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 50 49 4e  ..return(CKR_PIN
270a0 5f 49 4e 43 4f 52 52 45 43 54 29 3b 0a 09 09 7d  _INCORRECT);...}
270b0 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
270c0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
270d0 20 55 6e 6b 6e 6f 77 6e 20 65 72 72 6f 72 20 72   Unknown error r
270e0 65 74 75 72 6e 65 64 20 66 72 6f 6d 20 63 61 63  eturned from cac
270f0 6b 65 79 5f 6c 6f 67 69 6e 28 29 20 28 25 69 29  key_login() (%i)
27100 22 2c 20 6c 6f 67 69 6e 5f 72 65 74 29 3b 0a 0a  ", login_ret);..
27110 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
27120 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
27130 0a 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73  ..cackey_slots[s
27140 6c 6f 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61  lotID].token_fla
27150 67 73 20 26 3d 20 7e 28 43 4b 46 5f 55 53 45 52  gs &= ~(CKF_USER
27160 5f 50 49 4e 5f 4c 4f 43 4b 45 44 20 7c 20 43 4b  _PIN_LOCKED | CK
27170 46 5f 55 53 45 52 5f 50 49 4e 5f 43 4f 55 4e 54  F_USER_PIN_COUNT
27180 5f 4c 4f 57 20 7c 20 43 4b 46 5f 4c 4f 47 49 4e  _LOW | CKF_LOGIN
27190 5f 52 45 51 55 49 52 45 44 20 7c 20 43 4b 46 5f  _REQUIRED | CKF_
271a0 55 53 45 52 5f 50 49 4e 5f 46 49 4e 41 4c 5f 54  USER_PIN_FINAL_T
271b0 52 59 29 3b 0a 0a 09 63 61 63 6b 65 79 5f 73 65  RY);...cackey_se
271c0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
271d0 2e 73 74 61 74 65 20 3d 20 43 4b 53 5f 52 4f 5f  .state = CKS_RO_
271e0 55 53 45 52 5f 46 55 4e 43 54 49 4f 4e 53 3b 0a  USER_FUNCTIONS;.
271f0 0a 09 69 66 20 28 6c 6f 63 6b 5f 6d 75 74 65 78  ..if (lock_mutex
27200 29 20 7b 0a 09 09 6d 75 74 65 78 5f 72 65 74 76  ) {...mutex_retv
27210 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
27220 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
27230 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 69 66 20 28  biglock);...if (
27240 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
27250 30 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  0) {....CACKEY_D
27260 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
27270 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66  or.  Unlocking f
27280 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 09 72 65  ailed.");.....re
27290 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
272a0 5f 45 52 52 4f 52 29 3b 0a 09 09 7d 0a 09 7d 0a  _ERROR);...}..}.
272b0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
272c0 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
272d0 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43   CKR_OK (%i)", C
272e0 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e  KR_OK);...return
272f0 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f  (CKR_OK);.}..CK_
27300 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
27310 43 4b 5f 52 56 2c 20 43 5f 4c 6f 67 69 6e 29 28  CK_RV, C_Login)(
27320 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
27330 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 55  E hSession, CK_U
27340 53 45 52 5f 54 59 50 45 20 75 73 65 72 54 79 70  SER_TYPE userTyp
27350 65 2c 20 43 4b 5f 55 54 46 38 43 48 41 52 5f 50  e, CK_UTF8CHAR_P
27360 54 52 20 70 50 69 6e 2c 20 43 4b 5f 55 4c 4f 4e  TR pPin, CK_ULON
27370 47 20 75 6c 50 69 6e 4c 65 6e 29 20 7b 0a 09 72  G ulPinLen) {..r
27380 65 74 75 72 6e 28 43 5f 4c 6f 67 69 6e 4d 75 74  eturn(C_LoginMut
27390 65 78 41 72 67 28 68 53 65 73 73 69 6f 6e 2c 20  exArg(hSession, 
273a0 75 73 65 72 54 79 70 65 2c 20 70 50 69 6e 2c 20  userType, pPin, 
273b0 75 6c 50 69 6e 4c 65 6e 2c 20 31 29 29 3b 0a 7d  ulPinLen, 1));.}
273c0 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
273d0 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 4c 6f  TION(CK_RV, C_Lo
273e0 67 6f 75 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e  gout)(CK_SESSION
273f0 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
27400 29 20 7b 0a 09 43 4b 5f 53 4c 4f 54 5f 49 44 20  ) {..CK_SLOT_ID 
27410 73 6c 6f 74 49 44 3b 0a 09 69 6e 74 20 6d 75 74  slotID;..int mut
27420 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43  ex_retval;...CAC
27430 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
27440 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
27450 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
27460 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
27470 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
27480 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
27490 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
274a0 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
274b0 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
274c0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68  ZED);..}...if (h
274d0 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20  Session == 0 || 
274e0 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a  hSession >= (siz
274f0 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
27500 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ons) / sizeof(ca
27510 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d  ckey_sessions[0]
27520 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ))) {...CACKEY_D
27530 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
27540 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74  or.  Session out
27550 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09   of range.");...
27560 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
27570 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56  SSION_HANDLE_INV
27580 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65  ALID);..}...mute
27590 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
275a0 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63  y_mutex_lock(cac
275b0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
275c0 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
275d0 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
275e0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
275f0 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66  rror.  Locking f
27600 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
27610 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
27620 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20  ERROR);..}...if 
27630 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  (!cackey_session
27640 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69  s[hSession].acti
27650 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d  ve) {...cackey_m
27660 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
27670 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
27680 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
27690 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73  NTF("Error.  Ses
276a0 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e  sion not active.
276b0 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
276c0 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  CKR_SESSION_HAND
276d0 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  LE_INVALID);..}.
276e0 0a 09 73 6c 6f 74 49 44 20 3d 20 63 61 63 6b 65  ..slotID = cacke
276f0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
27700 69 6f 6e 5d 2e 73 6c 6f 74 49 44 3b 0a 0a 09 69  ion].slotID;...i
27710 66 20 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c  f (slotID < 0 ||
27720 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65   slotID >= (size
27730 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29  of(cackey_slots)
27740 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
27750 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09  _slots[0]))) {..
27760 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
27770 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76  INTF("Error. Inv
27780 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73  alid slot reques
27790 74 65 64 20 28 25 6c 75 29 2c 20 6f 75 74 73 69  ted (%lu), outsi
277a0 64 65 20 6f 66 20 76 61 6c 69 64 20 72 61 6e 67  de of valid rang
277b0 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09  e", slotID);....
277c0 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
277d0 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
277e0 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  if (cackey_slots
277f0 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65 20  [slotID].active 
27800 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  == 0) {...CACKEY
27810 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
27820 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c  rror. Invalid sl
27830 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c  ot requested (%l
27840 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72  u), slot not cur
27850 72 65 6e 74 6c 79 20 61 63 74 69 76 65 22 2c 20  rently active", 
27860 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b  slotID);....cack
27870 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
27880 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
27890 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
278a0 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
278b0 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69  }...cackey_sessi
278c0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 74  ons[hSession].st
278d0 61 74 65 20 3d 20 43 4b 53 5f 52 4f 5f 50 55 42  ate = CKS_RO_PUB
278e0 4c 49 43 5f 53 45 53 53 49 4f 4e 3b 0a 0a 09 69  LIC_SESSION;...i
278f0 66 20 28 63 61 63 6b 65 79 5f 70 69 6e 5f 63 6f  f (cackey_pin_co
27900 6d 6d 61 6e 64 20 3d 3d 20 4e 55 4c 4c 29 20 7b  mmand == NULL) {
27910 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ...cackey_slots[
27920 73 6c 6f 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c  slotID].token_fl
27930 61 67 73 20 3d 20 43 4b 46 5f 4c 4f 47 49 4e 5f  ags = CKF_LOGIN_
27940 52 45 51 55 49 52 45 44 3b 0a 09 7d 20 65 6c 73  REQUIRED;..} els
27950 65 20 7b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f  e {...cackey_slo
27960 74 73 5b 73 6c 6f 74 49 44 5d 2e 74 6f 6b 65 6e  ts[slotID].token
27970 5f 66 6c 61 67 73 20 3d 20 30 3b 0a 09 7d 0a 0a  _flags = 0;..}..
27980 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
27990 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
279a0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
279b0 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
279c0 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
279d0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
279e0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e  INTF("Error.  Un
279f0 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  locking failed."
27a00 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
27a10 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
27a20 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
27a30 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
27a40 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29  ning CKR_OK (%i)
27a50 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65  ", CKR_OK);...re
27a60 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a  turn(CKR_OK);.}.
27a70 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
27a80 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 43 72 65  ION(CK_RV, C_Cre
27a90 61 74 65 4f 62 6a 65 63 74 29 28 43 4b 5f 53 45  ateObject)(CK_SE
27aa0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
27ab0 73 73 69 6f 6e 2c 20 43 4b 5f 41 54 54 52 49 42  ssion, CK_ATTRIB
27ac0 55 54 45 5f 50 54 52 20 70 54 65 6d 70 6c 61 74  UTE_PTR pTemplat
27ad0 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f  e, CK_ULONG ulCo
27ae0 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48  unt, CK_OBJECT_H
27af0 41 4e 44 4c 45 5f 50 54 52 20 70 68 4f 62 6a 65  ANDLE_PTR phObje
27b00 63 74 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  ct) {..CACKEY_DE
27b10 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
27b20 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
27b30 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
27b40 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
27b50 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
27b60 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
27b70 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
27b80 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
27b90 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
27ba0 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
27bb0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
27bc0 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
27bd0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
27be0 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
27bf0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
27c00 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
27c10 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
27c20 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
27c30 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
27c40 4b 5f 52 56 2c 20 43 5f 43 6f 70 79 4f 62 6a 65  K_RV, C_CopyObje
27c50 63 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  ct)(CK_SESSION_H
27c60 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
27c70 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45  CK_OBJECT_HANDLE
27c80 20 68 4f 62 6a 65 63 74 2c 20 43 4b 5f 41 54 54   hObject, CK_ATT
27c90 52 49 42 55 54 45 5f 50 54 52 20 70 54 65 6d 70  RIBUTE_PTR pTemp
27ca0 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  late, CK_ULONG u
27cb0 6c 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43  lCount, CK_OBJEC
27cc0 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 4e  T_HANDLE_PTR phN
27cd0 65 77 4f 62 6a 65 63 74 29 20 7b 0a 09 43 41 43  ewObject) {..CAC
27ce0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
27cf0 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
27d00 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
27d10 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
27d20 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
27d30 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
27d40 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
27d50 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
27d60 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
27d70 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
27d80 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
27d90 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
27da0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
27db0 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
27dc0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
27dd0 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
27de0 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
27df0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
27e00 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
27e10 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65  TION(CK_RV, C_De
27e20 73 74 72 6f 79 4f 62 6a 65 63 74 29 28 43 4b 5f  stroyObject)(CK_
27e30 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
27e40 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45  Session, CK_OBJE
27e50 43 54 5f 48 41 4e 44 4c 45 20 68 4f 62 6a 65 63  CT_HANDLE hObjec
27e60 74 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  t) {..CACKEY_DEB
27e70 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
27e80 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
27e90 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
27ea0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
27eb0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
27ec0 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
27ed0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
27ee0 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
27ef0 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
27f00 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
27f10 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
27f20 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
27f30 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
27f40 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
27f50 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
27f60 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
27f70 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
27f80 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  ORTED);.}..CK_DE
27f90 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
27fa0 5f 52 56 2c 20 43 5f 47 65 74 4f 62 6a 65 63 74  _RV, C_GetObject
27fb0 53 69 7a 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e  Size)(CK_SESSION
27fc0 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
27fd0 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44  , CK_OBJECT_HAND
27fe0 4c 45 20 68 4f 62 6a 65 63 74 2c 20 43 4b 5f 55  LE hObject, CK_U
27ff0 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 53 69 7a 65  LONG_PTR pulSize
28000 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
28010 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
28020 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
28030 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
28040 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
28050 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
28060 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
28070 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
28080 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
28090 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
280a0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
280b0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
280c0 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
280d0 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
280e0 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
280f0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
28100 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
28110 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
28120 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
28130 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
28140 52 56 2c 20 43 5f 47 65 74 41 74 74 72 69 62 75  RV, C_GetAttribu
28150 74 65 56 61 6c 75 65 29 28 43 4b 5f 53 45 53 53  teValue)(CK_SESS
28160 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
28170 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48  ion, CK_OBJECT_H
28180 41 4e 44 4c 45 20 68 4f 62 6a 65 63 74 2c 20 43  ANDLE hObject, C
28190 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52 20  K_ATTRIBUTE_PTR 
281a0 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c  pTemplate, CK_UL
281b0 4f 4e 47 20 75 6c 43 6f 75 6e 74 29 20 7b 0a 09  ONG ulCount) {..
281c0 43 4b 5f 41 54 54 52 49 42 55 54 45 20 2a 63 75  CK_ATTRIBUTE *cu
281d0 72 72 5f 61 74 74 72 3b 0a 09 73 74 72 75 63 74  rr_attr;..struct
281e0 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79   cackey_identity
281f0 20 2a 69 64 65 6e 74 69 74 79 3b 0a 09 75 6e 73   *identity;..uns
28200 69 67 6e 65 64 20 6c 6f 6e 67 20 69 64 65 6e 74  igned long ident
28210 69 74 79 5f 69 64 78 2c 20 61 74 74 72 5f 69 64  ity_idx, attr_id
28220 78 2c 20 73 65 73 73 5f 61 74 74 72 5f 69 64 78  x, sess_attr_idx
28230 2c 20 6e 75 6d 5f 69 64 73 3b 0a 09 69 6e 74 20  , num_ids;..int 
28240 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09 43  mutex_retval;..C
28250 4b 5f 52 56 20 72 65 74 76 61 6c 20 3d 20 43 4b  K_RV retval = CK
28260 52 5f 4f 4b 3b 0a 09 43 4b 5f 56 4f 49 44 5f 50  R_OK;..CK_VOID_P
28270 54 52 20 70 56 61 6c 75 65 3b 0a 09 43 4b 5f 55  TR pValue;..CK_U
28280 4c 4f 4e 47 20 75 6c 56 61 6c 75 65 4c 65 6e 3b  LONG ulValueLen;
28290 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
282a0 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
282b0 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
282c0 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
282d0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
282e0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
282f0 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
28300 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
28310 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
28320 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
28330 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d  .if (hSession ==
28340 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e   0 || hSession >
28350 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  = (sizeof(cackey
28360 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a  _sessions) / siz
28370 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
28380 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41  ons[0]))) {...CA
28390 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
283a0 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69  F("Error.  Sessi
283b0 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e  on out of range.
283c0 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
283d0 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  CKR_SESSION_HAND
283e0 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  LE_INVALID);..}.
283f0 0a 09 69 66 20 28 68 4f 62 6a 65 63 74 20 3d 3d  ..if (hObject ==
28400 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
28410 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
28420 6f 72 2e 20 20 4f 62 6a 65 63 74 20 68 61 6e 64  or.  Object hand
28430 6c 65 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e  le out of range.
28440 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
28450 43 4b 52 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c  CKR_OBJECT_HANDL
28460 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
28470 09 69 66 20 28 75 6c 43 6f 75 6e 74 20 3d 3d 20  .if (ulCount == 
28480 30 29 20 7b 0a 09 09 2f 2a 20 53 68 6f 72 74 20  0) {.../* Short 
28490 63 69 72 63 75 69 74 2c 20 69 66 20 7a 65 72 6f  circuit, if zero
284a0 20 6f 62 6a 65 63 74 73 20 77 65 72 65 20 73 70   objects were sp
284b0 65 63 69 66 69 65 64 20 72 65 74 75 72 6e 20 7a  ecified return z
284c0 65 72 6f 20 69 74 65 6d 73 20 69 6d 6d 65 64 69  ero items immedi
284d0 61 74 65 6c 79 20 2a 2f 0a 09 09 43 41 43 4b 45  ately */...CACKE
284e0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
284f0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b  Returning CKR_OK
28500 20 28 25 69 29 20 28 73 68 6f 72 74 20 63 69 72   (%i) (short cir
28510 63 75 69 74 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b  cuit)", CKR_OK);
28520 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ....return(CKR_O
28530 4b 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 54 65  K);..}...if (pTe
28540 6d 70 6c 61 74 65 20 3d 3d 20 4e 55 4c 4c 29 20  mplate == NULL) 
28550 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
28560 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
28570 20 70 54 65 6d 70 6c 61 74 65 20 69 73 20 4e 55   pTemplate is NU
28580 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  LL.");....return
28590 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42  (CKR_ARGUMENTS_B
285a0 41 44 29 3b 0a 09 7d 0a 0a 09 69 64 65 6e 74 69  AD);..}...identi
285b0 74 79 5f 69 64 78 20 3d 20 68 4f 62 6a 65 63 74  ty_idx = hObject
285c0 20 2d 20 31 3b 0a 0a 09 6d 75 74 65 78 5f 72 65   - 1;...mutex_re
285d0 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
285e0 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  tex_lock(cackey_
285f0 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
28600 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
28610 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
28620 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
28630 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65  .  Locking faile
28640 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
28650 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
28660 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61  R);..}...if (!ca
28670 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
28680 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20  ession].active) 
28690 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  {...cackey_mutex
286a0 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
286b0 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b  iglock);....CACK
286c0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
286d0 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e  "Error.  Session
286e0 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a   not active.");.
286f0 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
28700 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49  SESSION_HANDLE_I
28710 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6e 75  NVALID);..}...nu
28720 6d 5f 69 64 73 20 3d 20 63 61 63 6b 65 79 5f 73  m_ids = cackey_s
28730 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
28740 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75  ].identities_cou
28750 6e 74 3b 0a 0a 09 69 66 20 28 69 64 65 6e 74 69  nt;...if (identi
28760 74 79 5f 69 64 78 20 3e 3d 20 6e 75 6d 5f 69 64  ty_idx >= num_id
28770 73 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75  s) {...cackey_mu
28780 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
28790 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43  y_biglock);....C
287a0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
287b0 54 46 28 22 45 72 72 6f 72 2e 20 20 4f 62 6a 65  TF("Error.  Obje
287c0 63 74 20 68 61 6e 64 6c 65 20 6f 75 74 20 6f 66  ct handle out of
287d0 20 72 61 6e 67 65 2e 20 20 69 64 65 6e 74 69 74   range.  identit
287e0 79 5f 69 64 78 20 3d 20 25 6c 75 2c 20 6e 75 6d  y_idx = %lu, num
287f0 5f 69 64 73 20 3d 20 25 6c 75 2e 22 2c 20 28 75  _ids = %lu.", (u
28800 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 69 64  nsigned long) id
28810 65 6e 74 69 74 79 5f 69 64 78 2c 20 28 75 6e 73  entity_idx, (uns
28820 69 67 6e 65 64 20 6c 6f 6e 67 29 20 6e 75 6d 5f  igned long) num_
28830 69 64 73 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  ids);....return(
28840 43 4b 52 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c  CKR_OBJECT_HANDL
28850 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
28860 09 69 64 65 6e 74 69 74 79 20 3d 20 26 63 61 63  .identity = &cac
28870 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
28880 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65  ssion].identitie
28890 73 5b 69 64 65 6e 74 69 74 79 5f 69 64 78 5d 3b  s[identity_idx];
288a0 0a 0a 09 66 6f 72 20 28 61 74 74 72 5f 69 64 78  ...for (attr_idx
288b0 20 3d 20 30 3b 20 61 74 74 72 5f 69 64 78 20 3c   = 0; attr_idx <
288c0 20 75 6c 43 6f 75 6e 74 3b 20 61 74 74 72 5f 69   ulCount; attr_i
288d0 64 78 2b 2b 29 20 7b 0a 09 09 63 75 72 72 5f 61  dx++) {...curr_a
288e0 74 74 72 20 3d 20 26 70 54 65 6d 70 6c 61 74 65  ttr = &pTemplate
288f0 5b 61 74 74 72 5f 69 64 78 5d 3b 0a 0a 09 09 70  [attr_idx];....p
28900 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09  Value = NULL;...
28910 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 28 43 4b  ulValueLen = (CK
28920 5f 4c 4f 4e 47 29 20 2d 31 3b 0a 0a 09 09 43 41  _LONG) -1;....CA
28930 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
28940 46 28 22 4c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61  F("Looking for a
28950 74 74 72 69 62 75 74 65 20 30 78 25 30 38 6c 78  ttribute 0x%08lx
28960 20 28 69 64 65 6e 74 69 74 79 3a 25 6c 75 29 20   (identity:%lu) 
28970 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  ...", (unsigned 
28980 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 2d  long) curr_attr-
28990 3e 74 79 70 65 2c 20 28 75 6e 73 69 67 6e 65 64  >type, (unsigned
289a0 20 6c 6f 6e 67 29 20 69 64 65 6e 74 69 74 79 5f   long) identity_
289b0 69 64 78 29 3b 0a 0a 09 09 66 6f 72 20 28 73 65  idx);....for (se
289c0 73 73 5f 61 74 74 72 5f 69 64 78 20 3d 20 30 3b  ss_attr_idx = 0;
289d0 20 73 65 73 73 5f 61 74 74 72 5f 69 64 78 20 3c   sess_attr_idx <
289e0 20 69 64 65 6e 74 69 74 79 2d 3e 61 74 74 72 69   identity->attri
289f0 62 75 74 65 73 5f 63 6f 75 6e 74 3b 20 73 65 73  butes_count; ses
28a00 73 5f 61 74 74 72 5f 69 64 78 2b 2b 29 20 7b 0a  s_attr_idx++) {.
28a10 09 09 09 69 66 20 28 69 64 65 6e 74 69 74 79 2d  ...if (identity-
28a20 3e 61 74 74 72 69 62 75 74 65 73 5b 73 65 73 73  >attributes[sess
28a30 5f 61 74 74 72 5f 69 64 78 5d 2e 74 79 70 65 20  _attr_idx].type 
28a40 3d 3d 20 63 75 72 72 5f 61 74 74 72 2d 3e 74 79  == curr_attr->ty
28a50 70 65 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59  pe) {.....CACKEY
28a60 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
28a70 2e 2e 2e 20 66 6f 75 6e 64 20 69 74 2c 20 70 56  ... found it, pV
28a80 61 6c 75 65 20 3d 20 25 70 2c 20 75 6c 56 61 6c  alue = %p, ulVal
28a90 75 65 4c 65 6e 20 3d 20 25 6c 75 22 2c 20 69 64  ueLen = %lu", id
28aa0 65 6e 74 69 74 79 2d 3e 61 74 74 72 69 62 75 74  entity->attribut
28ab0 65 73 5b 73 65 73 73 5f 61 74 74 72 5f 69 64 78  es[sess_attr_idx
28ac0 5d 2e 70 56 61 6c 75 65 2c 20 69 64 65 6e 74 69  ].pValue, identi
28ad0 74 79 2d 3e 61 74 74 72 69 62 75 74 65 73 5b 73  ty->attributes[s
28ae0 65 73 73 5f 61 74 74 72 5f 69 64 78 5d 2e 75 6c  ess_attr_idx].ul
28af0 56 61 6c 75 65 4c 65 6e 29 3b 0a 09 09 09 09 0a  ValueLen);......
28b00 09 09 09 09 70 56 61 6c 75 65 20 3d 20 69 64 65  ....pValue = ide
28b10 6e 74 69 74 79 2d 3e 61 74 74 72 69 62 75 74 65  ntity->attribute
28b20 73 5b 73 65 73 73 5f 61 74 74 72 5f 69 64 78 5d  s[sess_attr_idx]
28b30 2e 70 56 61 6c 75 65 3b 0a 09 09 09 09 75 6c 56  .pValue;.....ulV
28b40 61 6c 75 65 4c 65 6e 20 3d 20 69 64 65 6e 74 69  alueLen = identi
28b50 74 79 2d 3e 61 74 74 72 69 62 75 74 65 73 5b 73  ty->attributes[s
28b60 65 73 73 5f 61 74 74 72 5f 69 64 78 5d 2e 75 6c  ess_attr_idx].ul
28b70 56 61 6c 75 65 4c 65 6e 3b 0a 09 09 09 7d 0a 09  ValueLen;....}..
28b80 09 7d 0a 0a 09 09 69 66 20 28 63 75 72 72 5f 61  .}....if (curr_a
28b90 74 74 72 2d 3e 70 56 61 6c 75 65 20 26 26 20 70  ttr->pValue && p
28ba0 56 61 6c 75 65 29 20 7b 0a 09 09 09 69 66 20 28  Value) {....if (
28bb0 63 75 72 72 5f 61 74 74 72 2d 3e 75 6c 56 61 6c  curr_attr->ulVal
28bc0 75 65 4c 65 6e 20 3e 3d 20 75 6c 56 61 6c 75 65  ueLen >= ulValue
28bd0 4c 65 6e 29 20 7b 0a 09 09 09 09 6d 65 6d 63 70  Len) {.....memcp
28be0 79 28 63 75 72 72 5f 61 74 74 72 2d 3e 70 56 61  y(curr_attr->pVa
28bf0 6c 75 65 2c 20 70 56 61 6c 75 65 2c 20 75 6c 56  lue, pValue, ulV
28c00 61 6c 75 65 4c 65 6e 29 3b 0a 09 09 09 7d 20 65  alueLen);....} e
28c10 6c 73 65 20 7b 0a 09 09 09 09 75 6c 56 61 6c 75  lse {.....ulValu
28c20 65 4c 65 6e 20 3d 20 28 43 4b 5f 4c 4f 4e 47 29  eLen = (CK_LONG)
28c30 20 2d 31 3b 0a 0a 09 09 09 09 72 65 74 76 61 6c   -1;......retval
28c40 20 3d 20 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f   = CKR_BUFFER_TO
28c50 4f 5f 53 4d 41 4c 4c 3b 0a 09 09 09 7d 0a 09 09  O_SMALL;....}...
28c60 7d 0a 0a 09 09 63 75 72 72 5f 61 74 74 72 2d 3e  }....curr_attr->
28c70 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 75 6c 56  ulValueLen = ulV
28c80 61 6c 75 65 4c 65 6e 3b 0a 09 7d 0a 0a 09 6d 75  alueLen;..}...mu
28c90 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
28ca0 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
28cb0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
28cc0 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
28cd0 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
28ce0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
28cf0 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63  F("Error.  Unloc
28d00 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
28d10 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
28d20 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
28d30 0a 0a 09 69 66 20 28 72 65 74 76 61 6c 20 3d 3d  ...if (retval ==
28d40 20 43 4b 52 5f 41 54 54 52 49 42 55 54 45 5f 54   CKR_ATTRIBUTE_T
28d50 59 50 45 5f 49 4e 56 41 4c 49 44 29 20 7b 0a 09  YPE_INVALID) {..
28d60 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
28d70 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
28d80 43 4b 52 5f 41 54 54 52 49 42 55 54 45 5f 54 59  CKR_ATTRIBUTE_TY
28d90 50 45 5f 49 4e 56 41 4c 49 44 20 28 25 69 29 22  PE_INVALID (%i)"
28da0 2c 20 28 69 6e 74 29 20 72 65 74 76 61 6c 29 3b  , (int) retval);
28db0 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 72 65 74  ..} else if (ret
28dc0 76 61 6c 20 3d 3d 20 43 4b 52 5f 42 55 46 46 45  val == CKR_BUFFE
28dd0 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 20 7b 0a 09  R_TOO_SMALL) {..
28de0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
28df0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
28e00 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53  CKR_BUFFER_TOO_S
28e10 4d 41 4c 4c 20 28 25 69 29 22 2c 20 28 69 6e 74  MALL (%i)", (int
28e20 29 20 72 65 74 76 61 6c 29 3b 0a 09 7d 20 65 6c  ) retval);..} el
28e30 73 65 20 69 66 20 28 72 65 74 76 61 6c 20 3d 3d  se if (retval ==
28e40 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 43 41 43   CKR_OK) {...CAC
28e50 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
28e60 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
28e70 4f 4b 20 28 25 69 29 22 2c 20 28 69 6e 74 29 20  OK (%i)", (int) 
28e80 72 65 74 76 61 6c 29 3b 0a 09 7d 20 65 6c 73 65  retval);..} else
28e90 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
28ea0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
28eb0 69 6e 67 20 25 69 22 2c 20 28 69 6e 74 29 20 72  ing %i", (int) r
28ec0 65 74 76 61 6c 29 3b 0a 09 7d 0a 0a 09 72 65 74  etval);..}...ret
28ed0 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a  urn(retval);.}..
28ee0 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
28ef0 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 65 74 41  ON(CK_RV, C_SetA
28f00 74 74 72 69 62 75 74 65 56 61 6c 75 65 29 28 43  ttributeValue)(C
28f10 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
28f20 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42   hSession, CK_OB
28f30 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4f 62 6a  JECT_HANDLE hObj
28f40 65 63 74 2c 20 43 4b 5f 41 54 54 52 49 42 55 54  ect, CK_ATTRIBUT
28f50 45 5f 50 54 52 20 70 54 65 6d 70 6c 61 74 65 2c  E_PTR pTemplate,
28f60 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e   CK_ULONG ulCoun
28f70 74 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  t) {..CACKEY_DEB
28f80 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
28f90 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
28fa0 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
28fb0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
28fc0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
28fd0 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
28fe0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
28ff0 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
29000 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
29010 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
29020 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
29030 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
29040 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
29050 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
29060 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
29070 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
29080 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
29090 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  ORTED);.}..CK_DE
290a0 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
290b0 5f 52 56 2c 20 43 5f 46 69 6e 64 4f 62 6a 65 63  _RV, C_FindObjec
290c0 74 73 49 6e 69 74 29 28 43 4b 5f 53 45 53 53 49  tsInit)(CK_SESSI
290d0 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
290e0 6f 6e 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45  on, CK_ATTRIBUTE
290f0 5f 50 54 52 20 70 54 65 6d 70 6c 61 74 65 2c 20  _PTR pTemplate, 
29100 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e 74  CK_ULONG ulCount
29110 29 20 7b 0a 09 43 4b 5f 53 4c 4f 54 5f 49 44 20  ) {..CK_SLOT_ID 
29120 73 6c 6f 74 49 44 3b 0a 09 43 4b 5f 55 4c 4f 4e  slotID;..CK_ULON
29130 47 20 69 64 78 3b 0a 09 69 6e 74 20 6d 75 74 65  G idx;..int mute
29140 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b  x_retval;...CACK
29150 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
29160 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
29170 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
29180 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
29190 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
291a0 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
291b0 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
291c0 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
291d0 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
291e0 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53  ED);..}...if (hS
291f0 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68  ession == 0 || h
29200 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65  Session >= (size
29210 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
29220 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63  ns) / sizeof(cac
29230 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29  key_sessions[0])
29240 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  )) {...CACKEY_DE
29250 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
29260 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20  r.  Session out 
29270 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a  of range.");....
29280 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53  ..return(CKR_SES
29290 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41  SION_HANDLE_INVA
292a0 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78  LID);..}...mutex
292b0 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
292c0 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b  _mutex_lock(cack
292d0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
292e0 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
292f0 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
29300 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
29310 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61  ror.  Locking fa
29320 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
29330 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
29340 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  RROR);..}...if (
29350 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  !cackey_sessions
29360 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76  [hSession].activ
29370 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75  e) {...cackey_mu
29380 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
29390 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43  y_biglock);....C
293a0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
293b0 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73  TF("Error.  Sess
293c0 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22  ion not active."
293d0 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
293e0 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  KR_SESSION_HANDL
293f0 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
29400 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73  .if (cackey_sess
29410 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
29420 65 61 72 63 68 5f 61 63 74 69 76 65 29 20 7b 0a  earch_active) {.
29430 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
29440 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
29450 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59  lock);....CACKEY
29460 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
29470 72 72 6f 72 2e 20 20 53 65 61 72 63 68 20 61 6c  rror.  Search al
29480 72 65 61 64 79 20 61 63 74 69 76 65 2e 22 29 3b  ready active.");
29490 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
294a0 5f 4f 50 45 52 41 54 49 4f 4e 5f 41 43 54 49 56  _OPERATION_ACTIV
294b0 45 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 49 44 20  E);..}...slotID 
294c0 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  = cackey_session
294d0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74  s[hSession].slot
294e0 49 44 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44  ID;...if (slotID
294f0 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e   < 0 || slotID >
29500 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  = (sizeof(cackey
29510 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66  _slots) / sizeof
29520 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d  (cackey_slots[0]
29530 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ))) {...CACKEY_D
29540 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
29550 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74  or. Invalid slot
29560 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29   requested (%lu)
29570 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 76 61 6c  , outside of val
29580 69 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49  id range", slotI
29590 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  D);....return(CK
295a0 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
295b0 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65  ;..}...if (cacke
295c0 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e  y_slots[slotID].
295d0 61 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09  active == 0) {..
295e0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
295f0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76  INTF("Error. Inv
29600 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73  alid slot reques
29610 74 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20  ted (%lu), slot 
29620 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61 63  not currently ac
29630 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a  tive", slotID);.
29640 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
29650 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
29660 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72  glock);....retur
29670 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
29680 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63  ROR);..}...if (c
29690 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
296a0 49 44 5d 2e 73 6c 6f 74 5f 72 65 73 65 74 29 20  ID].slot_reset) 
296b0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
296c0 5f 50 52 49 4e 54 46 28 22 54 68 65 20 73 6c 6f  _PRINTF("The slo
296d0 74 20 68 61 73 20 62 65 65 6e 20 72 65 73 65 74  t has been reset
296e0 20 73 69 6e 63 65 20 77 65 20 6c 61 73 74 20 6c   since we last l
296f0 6f 6f 6b 65 64 20 66 6f 72 20 69 64 65 6e 74 69  ooked for identi
29700 74 69 65 73 20 2d 2d 20 72 65 73 63 61 6e 6e 69  ties -- rescanni
29710 6e 67 22 29 3b 0a 0a 09 09 69 66 20 28 63 61 63  ng");....if (cac
29720 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
29730 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65  ssion].identitie
29740 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09  s != NULL) {....
29750 63 61 63 6b 65 79 5f 66 72 65 65 5f 69 64 65 6e  cackey_free_iden
29760 74 69 74 69 65 73 28 63 61 63 6b 65 79 5f 73 65  tities(cackey_se
29770 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
29780 2e 69 64 65 6e 74 69 74 69 65 73 2c 20 63 61 63  .identities, cac
29790 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
297a0 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65  ssion].identitie
297b0 73 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09 09 63 61  s_count);.....ca
297c0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
297d0 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69  ession].identiti
297e0 65 73 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 63 61  es = NULL;....ca
297f0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
29800 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69  ession].identiti
29810 65 73 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 09 09  es_count = 0;...
29820 7d 0a 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f  }....if (cackey_
29830 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61  slots[slotID].la
29840 62 65 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  bel != NULL) {..
29850 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f 73 6c  ..free(cackey_sl
29860 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61 62 65  ots[slotID].labe
29870 6c 29 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c  l);....cackey_sl
29880 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61 62 65  ots[slotID].labe
29890 6c 20 3d 20 4e 55 4c 4c 3b 0a 09 09 7d 0a 0a 09  l = NULL;...}...
298a0 09 63 61 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f  .cackey_mark_slo
298b0 74 5f 72 65 73 65 74 28 26 63 61 63 6b 65 79 5f  t_reset(&cackey_
298c0 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 29 3b 0a  slots[slotID]);.
298d0 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73  ..cackey_slots[s
298e0 6c 6f 74 49 44 5d 2e 73 6c 6f 74 5f 72 65 73 65  lotID].slot_rese
298f0 74 20 3d 20 30 3b 0a 09 7d 0a 0a 09 69 66 20 28  t = 0;..}...if (
29900 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
29910 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69  hSession].identi
29920 74 69 65 73 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  ties == NULL) {.
29930 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
29940 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e  s[hSession].iden
29950 74 69 74 69 65 73 20 3d 20 63 61 63 6b 65 79 5f  tities = cackey_
29960 72 65 61 64 5f 69 64 65 6e 74 69 74 69 65 73 28  read_identities(
29970 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c  &cackey_slots[sl
29980 6f 74 49 44 5d 2c 20 26 63 61 63 6b 65 79 5f 73  otID], &cackey_s
29990 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
299a0 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75  ].identities_cou
299b0 6e 74 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 54  nt);..}...if (pT
299c0 65 6d 70 6c 61 74 65 20 21 3d 20 4e 55 4c 4c 29  emplate != NULL)
299d0 20 7b 0a 09 09 69 66 20 28 75 6c 43 6f 75 6e 74   {...if (ulCount
299e0 20 21 3d 20 30 29 20 7b 0a 09 09 09 63 61 63 6b   != 0) {....cack
299f0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
29a00 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65  sion].search_que
29a10 72 79 5f 63 6f 75 6e 74 20 3d 20 75 6c 43 6f 75  ry_count = ulCou
29a20 6e 74 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65  nt;....cackey_se
29a30 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
29a40 2e 73 65 61 72 63 68 5f 71 75 65 72 79 20 3d 20  .search_query = 
29a50 6d 61 6c 6c 6f 63 28 75 6c 43 6f 75 6e 74 20 2a  malloc(ulCount *
29a60 20 73 69 7a 65 6f 66 28 2a 70 54 65 6d 70 6c 61   sizeof(*pTempla
29a70 74 65 29 29 3b 0a 0a 09 09 09 6d 65 6d 63 70 79  te));.....memcpy
29a80 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
29a90 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63  [hSession].searc
29aa0 68 5f 71 75 65 72 79 2c 20 70 54 65 6d 70 6c 61  h_query, pTempla
29ab0 74 65 2c 20 75 6c 43 6f 75 6e 74 20 2a 20 73 69  te, ulCount * si
29ac0 7a 65 6f 66 28 2a 70 54 65 6d 70 6c 61 74 65 29  zeof(*pTemplate)
29ad0 29 3b 0a 09 09 09 66 6f 72 20 28 69 64 78 20 3d  );....for (idx =
29ae0 20 30 3b 20 69 64 78 20 3c 20 75 6c 43 6f 75 6e   0; idx < ulCoun
29af0 74 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 09 09  t; idx++) {.....
29b00 69 66 20 28 70 54 65 6d 70 6c 61 74 65 5b 69 64  if (pTemplate[id
29b10 78 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 3d  x].ulValueLen ==
29b20 20 30 29 20 7b 0a 09 09 09 09 09 63 61 63 6b 65   0) {......cacke
29b30 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
29b40 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72  ion].search_quer
29b50 79 5b 69 64 78 5d 2e 70 56 61 6c 75 65 20 3d 20  y[idx].pValue = 
29b60 4e 55 4c 4c 3b 0a 0a 09 09 09 09 09 63 6f 6e 74  NULL;.......cont
29b70 69 6e 75 65 3b 0a 09 09 09 09 7d 0a 0a 09 09 09  inue;.....}.....
29b80 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
29b90 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63  [hSession].searc
29ba0 68 5f 71 75 65 72 79 5b 69 64 78 5d 2e 70 56 61  h_query[idx].pVa
29bb0 6c 75 65 20 3d 20 6d 61 6c 6c 6f 63 28 70 54 65  lue = malloc(pTe
29bc0 6d 70 6c 61 74 65 5b 69 64 78 5d 2e 75 6c 56 61  mplate[idx].ulVa
29bd0 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 69 66  lueLen);......if
29be0 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e   (cackey_session
29bf0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72  s[hSession].sear
29c00 63 68 5f 71 75 65 72 79 5b 69 64 78 5d 2e 70 56  ch_query[idx].pV
29c10 61 6c 75 65 29 20 7b 0a 09 09 09 09 09 6d 65 6d  alue) {......mem
29c20 63 70 79 28 63 61 63 6b 65 79 5f 73 65 73 73 69  cpy(cackey_sessi
29c30 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65  ons[hSession].se
29c40 61 72 63 68 5f 71 75 65 72 79 5b 69 64 78 5d 2e  arch_query[idx].
29c50 70 56 61 6c 75 65 2c 20 70 54 65 6d 70 6c 61 74  pValue, pTemplat
29c60 65 5b 69 64 78 5d 2e 70 56 61 6c 75 65 2c 20 70  e[idx].pValue, p
29c70 54 65 6d 70 6c 61 74 65 5b 69 64 78 5d 2e 75 6c  Template[idx].ul
29c80 56 61 6c 75 65 4c 65 6e 29 3b 0a 09 09 09 09 7d  ValueLen);.....}
29c90 0a 09 09 09 7d 0a 09 09 7d 20 65 6c 73 65 20 7b  ....}...} else {
29ca0 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ....cackey_sessi
29cb0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65  ons[hSession].se
29cc0 61 72 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74  arch_query_count
29cd0 20 3d 20 30 3b 0a 09 09 09 63 61 63 6b 65 79 5f   = 0;....cackey_
29ce0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
29cf0 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 20  n].search_query 
29d00 3d 20 4e 55 4c 4c 3b 0a 09 09 7d 0a 09 7d 20 65  = NULL;...}..} e
29d10 6c 73 65 20 7b 0a 09 09 69 66 20 28 75 6c 43 6f  lse {...if (ulCo
29d20 75 6e 74 20 21 3d 20 30 29 20 7b 0a 09 09 09 63  unt != 0) {....c
29d30 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
29d40 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
29d50 6b 29 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44  k);.....CACKEY_D
29d60 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
29d70 6f 72 2e 20 20 53 65 61 72 63 68 20 71 75 65 72  or.  Search quer
29d80 79 20 73 70 65 63 69 66 69 65 64 20 61 73 20 4e  y specified as N
29d90 55 4c 4c 2c 20 62 75 74 20 6e 75 6d 62 65 72 20  ULL, but number 
29da0 6f 66 20 71 75 65 72 79 20 74 65 72 6d 73 20 6e  of query terms n
29db0 6f 74 20 73 70 65 63 69 66 69 65 64 20 61 73 20  ot specified as 
29dc0 30 2e 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e  0.");.....return
29dd0 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42  (CKR_ARGUMENTS_B
29de0 41 44 29 3b 0a 09 09 7d 0a 0a 09 09 63 61 63 6b  AD);...}....cack
29df0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
29e00 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65  sion].search_que
29e10 72 79 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 09 09  ry_count = 0;...
29e20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
29e30 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68  hSession].search
29e40 5f 71 75 65 72 79 20 3d 20 4e 55 4c 4c 3b 0a 09  _query = NULL;..
29e50 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69  }...cackey_sessi
29e60 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65  ons[hSession].se
29e70 61 72 63 68 5f 61 63 74 69 76 65 20 3d 20 31 3b  arch_active = 1;
29e80 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
29e90 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72  s[hSession].sear
29ea0 63 68 5f 63 75 72 72 5f 69 64 20 3d 20 30 3b 0a  ch_curr_id = 0;.
29eb0 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
29ec0 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e   cackey_mutex_un
29ed0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
29ee0 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
29ef0 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
29f00 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
29f10 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55  RINTF("Error.  U
29f20 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e  nlocking failed.
29f30 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
29f40 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
29f50 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
29f60 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
29f70 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69  rning CKR_OK (%i
29f80 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72  )", CKR_OK);...r
29f90 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d  eturn(CKR_OK);.}
29fa0 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 63 61 63  ..static int cac
29fb0 6b 65 79 5f 70 6b 63 73 31 31 5f 63 6f 6d 70 61  key_pkcs11_compa
29fc0 72 65 5f 61 74 74 72 69 62 75 74 65 73 28 43 4b  re_attributes(CK
29fd0 5f 41 54 54 52 49 42 55 54 45 20 2a 61 2c 20 43  _ATTRIBUTE *a, C
29fe0 4b 5f 41 54 54 52 49 42 55 54 45 20 2a 62 29 20  K_ATTRIBUTE *b) 
29ff0 7b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72  {..unsigned char
2a000 20 2a 73 6d 61 6c 6c 62 75 66 2c 20 2a 6c 61 72   *smallbuf, *lar
2a010 67 65 62 75 66 3b 0a 09 73 69 7a 65 5f 74 20 73  gebuf;..size_t s
2a020 6d 61 6c 6c 62 75 66 5f 6c 65 6e 2c 20 6c 61 72  mallbuf_len, lar
2a030 67 65 62 75 66 5f 6c 65 6e 3b 0a 0a 09 69 66 20  gebuf_len;...if 
2a040 28 61 2d 3e 74 79 70 65 20 21 3d 20 62 2d 3e 74  (a->type != b->t
2a050 79 70 65 29 20 7b 0a 09 09 72 65 74 75 72 6e 28  ype) {...return(
2a060 30 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  0);..}...CACKEY_
2a070 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 20  DEBUG_PRINTF("  
2a080 20 20 2e 2e 2e 20 66 6f 75 6e 64 20 6d 61 74 63    ... found matc
2a090 68 69 6e 67 20 74 79 70 65 20 2e 2e 2e 22 29 3b  hing type ...");
2a0a0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2a0b0 50 52 49 4e 54 42 55 46 28 22 20 20 20 20 2e 2e  PRINTBUF("    ..
2a0c0 2e 20 6f 75 72 20 76 61 6c 75 65 3a 22 2c 20 61  . our value:", a
2a0d0 2d 3e 70 56 61 6c 75 65 2c 20 61 2d 3e 75 6c 56  ->pValue, a->ulV
2a0e0 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 69 66 20 28  alueLen);...if (
2a0f0 62 2d 3e 70 56 61 6c 75 65 20 3d 3d 20 4e 55 4c  b->pValue == NUL
2a100 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
2a110 42 55 47 5f 50 52 49 4e 54 46 28 22 20 20 20 20  BUG_PRINTF("    
2a120 20 20 20 2e 2e 2e 20 66 6f 75 6e 64 20 77 69 6c     ... found wil
2a130 64 63 61 72 64 20 6d 61 74 63 68 22 29 3b 0a 0a  dcard match");..
2a140 09 09 72 65 74 75 72 6e 28 31 29 3b 0a 09 7d 0a  ..return(1);..}.
2a150 0a 09 69 66 20 28 61 2d 3e 70 56 61 6c 75 65 20  ..if (a->pValue 
2a160 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74  == NULL) {...ret
2a170 75 72 6e 28 30 29 3b 0a 09 7d 0a 0a 20 09 69 66  urn(0);..}.. .if
2a180 20 28 62 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 20   (b->ulValueLen 
2a190 3d 3d 20 61 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e  == a->ulValueLen
2a1a0 20 26 26 20 6d 65 6d 63 6d 70 28 61 2d 3e 70 56   && memcmp(a->pV
2a1b0 61 6c 75 65 2c 20 62 2d 3e 70 56 61 6c 75 65 2c  alue, b->pValue,
2a1c0 20 62 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 29 20   b->ulValueLen) 
2a1d0 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  == 0) {...CACKEY
2a1e0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
2a1f0 20 20 20 20 20 20 2e 2e 2e 20 66 6f 75 6e 64 20        ... found 
2a200 65 78 61 63 74 20 6d 61 74 63 68 22 29 3b 0a 0a  exact match");..
2a210 09 09 72 65 74 75 72 6e 28 31 29 3b 0a 09 7d 0a  ..return(1);..}.
2a220 0a 09 73 77 69 74 63 68 20 28 61 2d 3e 74 79 70  ..switch (a->typ
2a230 65 29 20 7b 0a 09 09 63 61 73 65 20 43 4b 41 5f  e) {...case CKA_
2a240 4d 4f 44 55 4c 55 53 3a 0a 09 09 09 69 66 20 28  MODULUS:....if (
2a250 61 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 3d  a->ulValueLen ==
2a260 20 62 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 29 20   b->ulValueLen) 
2a270 7b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  {.....break;....
2a280 7d 0a 0a 09 09 09 69 66 20 28 61 2d 3e 75 6c 56  }.....if (a->ulV
2a290 61 6c 75 65 4c 65 6e 20 3e 20 62 2d 3e 75 6c 56  alueLen > b->ulV
2a2a0 61 6c 75 65 4c 65 6e 29 20 7b 0a 09 09 09 09 73  alueLen) {.....s
2a2b0 6d 61 6c 6c 62 75 66 20 3d 20 62 2d 3e 70 56 61  mallbuf = b->pVa
2a2c0 6c 75 65 3b 0a 09 09 09 09 73 6d 61 6c 6c 62 75  lue;.....smallbu
2a2d0 66 5f 6c 65 6e 20 3d 20 62 2d 3e 75 6c 56 61 6c  f_len = b->ulVal
2a2e0 75 65 4c 65 6e 3b 0a 0a 09 09 09 09 6c 61 72 67  ueLen;......larg
2a2f0 65 62 75 66 20 3d 20 61 2d 3e 70 56 61 6c 75 65  ebuf = a->pValue
2a300 3b 0a 09 09 09 09 6c 61 72 67 65 62 75 66 5f 6c  ;.....largebuf_l
2a310 65 6e 20 3d 20 61 2d 3e 75 6c 56 61 6c 75 65 4c  en = a->ulValueL
2a320 65 6e 3b 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a  en;....} else {.
2a330 09 09 09 09 73 6d 61 6c 6c 62 75 66 20 3d 20 61  ....smallbuf = a
2a340 2d 3e 70 56 61 6c 75 65 3b 0a 09 09 09 09 73 6d  ->pValue;.....sm
2a350 61 6c 6c 62 75 66 5f 6c 65 6e 20 3d 20 61 2d 3e  allbuf_len = a->
2a360 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 0a 09 09 09  ulValueLen;.....
2a370 09 6c 61 72 67 65 62 75 66 20 3d 20 62 2d 3e 70  .largebuf = b->p
2a380 56 61 6c 75 65 3b 0a 09 09 09 09 6c 61 72 67 65  Value;.....large
2a390 62 75 66 5f 6c 65 6e 20 3d 20 62 2d 3e 75 6c 56  buf_len = b->ulV
2a3a0 61 6c 75 65 4c 65 6e 3b 0a 09 09 09 7d 0a 0a 09  alueLen;....}...
2a3b0 09 09 66 6f 72 20 28 3b 20 6c 61 72 67 65 62 75  ..for (; largebu
2a3c0 66 5f 6c 65 6e 20 21 3d 20 73 6d 61 6c 6c 62 75  f_len != smallbu
2a3d0 66 5f 6c 65 6e 3b 20 6c 61 72 67 65 62 75 66 2b  f_len; largebuf+
2a3e0 2b 2c 6c 61 72 67 65 62 75 66 5f 6c 65 6e 2d 2d  +,largebuf_len--
2a3f0 29 20 7b 0a 09 09 09 09 69 66 20 28 6c 61 72 67  ) {.....if (larg
2a400 65 62 75 66 5b 30 5d 20 21 3d 20 30 29 20 7b 0a  ebuf[0] != 0) {.
2a410 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09  .....break;.....
2a420 7d 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 6c  }....}.....if (l
2a430 61 72 67 65 62 75 66 5f 6c 65 6e 20 21 3d 20 73  argebuf_len != s
2a440 6d 61 6c 6c 62 75 66 5f 6c 65 6e 29 20 7b 0a 09  mallbuf_len) {..
2a450 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 7d 0a 0a  ...break;....}..
2a460 09 09 09 69 66 20 28 6d 65 6d 63 6d 70 28 6c 61  ...if (memcmp(la
2a470 72 67 65 62 75 66 2c 20 73 6d 61 6c 6c 62 75 66  rgebuf, smallbuf
2a480 2c 20 73 6d 61 6c 6c 62 75 66 5f 6c 65 6e 29 20  , smallbuf_len) 
2a490 3d 3d 20 30 29 20 7b 0a 09 09 09 09 43 41 43 4b  == 0) {.....CACK
2a4a0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2a4b0 22 20 20 20 20 20 20 20 2e 2e 2e 20 66 6f 75 6e  "       ... foun
2a4c0 64 20 61 70 70 72 6f 78 69 6d 61 74 65 20 6d 61  d approximate ma
2a4d0 74 63 68 22 29 3b 0a 0a 09 09 09 09 72 65 74 75  tch");......retu
2a4e0 72 6e 28 31 29 3b 0a 09 09 09 7d 0a 0a 09 09 09  rn(1);....}.....
2a4f0 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 72 65 74 75  break;..}...retu
2a500 72 6e 28 30 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  rn(0);.}..CK_DEF
2a510 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
2a520 52 56 2c 20 43 5f 46 69 6e 64 4f 62 6a 65 63 74  RV, C_FindObject
2a530 73 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  s)(CK_SESSION_HA
2a540 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
2a550 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f  K_OBJECT_HANDLE_
2a560 50 54 52 20 70 68 4f 62 6a 65 63 74 2c 20 43 4b  PTR phObject, CK
2a570 5f 55 4c 4f 4e 47 20 75 6c 4d 61 78 4f 62 6a 65  _ULONG ulMaxObje
2a580 63 74 43 6f 75 6e 74 2c 20 43 4b 5f 55 4c 4f 4e  ctCount, CK_ULON
2a590 47 5f 50 54 52 20 70 75 6c 4f 62 6a 65 63 74 43  G_PTR pulObjectC
2a5a0 6f 75 6e 74 29 20 7b 0a 09 73 74 72 75 63 74 20  ount) {..struct 
2a5b0 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79 20  cackey_identity 
2a5c0 2a 63 75 72 72 5f 69 64 3b 0a 09 43 4b 5f 41 54  *curr_id;..CK_AT
2a5d0 54 52 49 42 55 54 45 20 2a 63 75 72 72 5f 61 74  TRIBUTE *curr_at
2a5e0 74 72 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 63 75  tr;..CK_ULONG cu
2a5f0 72 72 5f 69 64 5f 69 64 78 2c 20 63 75 72 72 5f  rr_id_idx, curr_
2a600 6f 75 74 5f 69 64 5f 69 64 78 2c 20 63 75 72 72  out_id_idx, curr
2a610 5f 61 74 74 72 5f 69 64 78 2c 20 73 65 73 73 5f  _attr_idx, sess_
2a620 61 74 74 72 5f 69 64 78 3b 0a 09 43 4b 5f 55 4c  attr_idx;..CK_UL
2a630 4f 4e 47 20 6d 61 74 63 68 65 64 5f 63 6f 75 6e  ONG matched_coun
2a640 74 2c 20 70 72 65 76 5f 6d 61 74 63 68 65 64 5f  t, prev_matched_
2a650 63 6f 75 6e 74 3b 0a 09 69 6e 74 20 6d 75 74 65  count;..int mute
2a660 78 5f 72 65 74 76 61 6c 3b 0a 23 69 66 64 65 66  x_retval;.#ifdef
2a670 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 53 45   CACKEY_DEBUG_SE
2a680 41 52 43 48 5f 53 50 45 45 44 54 45 53 54 0a 09  ARCH_SPEEDTEST..
2a690 73 74 72 75 63 74 20 74 69 6d 65 76 61 6c 20 73  struct timeval s
2a6a0 74 61 72 74 2c 20 65 6e 64 3b 0a 09 75 69 6e 74  tart, end;..uint
2a6b0 36 34 5f 74 20 73 74 61 72 74 5f 69 6e 74 2c 20  64_t start_int, 
2a6c0 65 6e 64 5f 69 6e 74 3b 0a 23 65 6e 64 69 66 0a  end_int;.#endif.
2a6d0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2a6e0 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
2a6f0 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
2a700 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
2a710 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2a720 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
2a730 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
2a740 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
2a750 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
2a760 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
2a770 69 66 20 28 70 75 6c 4f 62 6a 65 63 74 43 6f 75  if (pulObjectCou
2a780 6e 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  nt == NULL) {...
2a790 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2a7a0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 70 75 6c  NTF("Error.  pul
2a7b0 4f 62 6a 65 63 74 43 6f 75 6e 74 20 69 73 20 4e  ObjectCount is N
2a7c0 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  ULL.");....retur
2a7d0 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f  n(CKR_ARGUMENTS_
2a7e0 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70  BAD);..}...if (p
2a7f0 68 4f 62 6a 65 63 74 20 3d 3d 20 4e 55 4c 4c 20  hObject == NULL 
2a800 26 26 20 75 6c 4d 61 78 4f 62 6a 65 63 74 43 6f  && ulMaxObjectCo
2a810 75 6e 74 20 3d 3d 20 30 29 20 7b 0a 09 09 2f 2a  unt == 0) {.../*
2a820 20 53 68 6f 72 74 20 63 69 72 63 75 69 74 2c 20   Short circuit, 
2a830 69 66 20 7a 65 72 6f 20 6f 62 6a 65 63 74 73 20  if zero objects 
2a840 77 65 72 65 20 73 70 65 63 69 66 69 65 64 20 72  were specified r
2a850 65 74 75 72 6e 20 7a 65 72 6f 20 69 74 65 6d 73  eturn zero items
2a860 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 2a 2f 0a   immediately */.
2a870 09 09 2a 70 75 6c 4f 62 6a 65 63 74 43 6f 75 6e  ..*pulObjectCoun
2a880 74 20 3d 20 30 3b 0a 0a 09 09 43 41 43 4b 45 59  t = 0;....CACKEY
2a890 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
2a8a0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20  eturning CKR_OK 
2a8b0 28 25 69 29 20 28 73 68 6f 72 74 20 63 69 72 63  (%i) (short circ
2a8c0 75 69 74 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a  uit)", CKR_OK);.
2a8d0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b  ...return(CKR_OK
2a8e0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 68 4f 62  );..}...if (phOb
2a8f0 6a 65 63 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  ject == NULL) {.
2a900 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2a910 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 70  RINTF("Error.  p
2a920 68 4f 62 6a 65 63 74 20 69 73 20 4e 55 4c 4c 2e  hObject is NULL.
2a930 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
2a940 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29  R_ARGUMENTS_BAD)
2a950 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 6c 4d 61 78  ;..}...if (ulMax
2a960 4f 62 6a 65 63 74 43 6f 75 6e 74 20 3d 3d 20 30  ObjectCount == 0
2a970 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
2a980 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2a990 2e 20 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65  .  Maximum numbe
2a9a0 72 20 6f 66 20 6f 62 6a 65 63 74 73 20 73 70 65  r of objects spe
2a9b0 63 69 66 69 65 64 20 61 73 20 7a 65 72 6f 2e 22  cified as zero."
2a9c0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
2a9d0 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b  _ARGUMENTS_BAD);
2a9e0 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69  ..}...if (hSessi
2a9f0 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73  on == 0 || hSess
2aa00 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63  ion >= (sizeof(c
2aa10 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20  ackey_sessions) 
2aa20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f  / sizeof(cackey_
2aa30 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b  sessions[0]))) {
2aa40 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2aa50 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
2aa60 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72  Session out of r
2aa70 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  ange.");......re
2aa80 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e  turn(CKR_SESSION
2aa90 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29  _HANDLE_INVALID)
2aaa0 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74  ;..}...mutex_ret
2aab0 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
2aac0 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  ex_lock(cackey_b
2aad0 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
2aae0 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
2aaf0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
2ab00 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2ab10 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64    Locking failed
2ab20 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
2ab30 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
2ab40 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63  );..}...if (!cac
2ab50 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
2ab60 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b  ssion].active) {
2ab70 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
2ab80 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
2ab90 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45  glock);....CACKE
2aba0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2abb0 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20  Error.  Session 
2abc0 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09  not active.");..
2abd0 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
2abe0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e  ESSION_HANDLE_IN
2abf0 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  VALID);..}...if 
2ac00 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  (!cackey_session
2ac10 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72  s[hSession].sear
2ac20 63 68 5f 61 63 74 69 76 65 29 20 7b 0a 09 09 63  ch_active) {...c
2ac30 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
2ac40 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
2ac50 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  k);....CACKEY_DE
2ac60 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2ac70 72 2e 20 20 53 65 61 72 63 68 20 6e 6f 74 20 61  r.  Search not a
2ac80 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72  ctive.");......r
2ac90 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54  eturn(CKR_OPERAT
2aca0 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  ION_NOT_INITIALI
2acb0 5a 45 44 29 3b 0a 09 7d 0a 0a 23 69 66 64 65 66  ZED);..}..#ifdef
2acc0 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 53 45   CACKEY_DEBUG_SE
2acd0 41 52 43 48 5f 53 50 45 45 44 54 45 53 54 0a 09  ARCH_SPEEDTEST..
2ace0 67 65 74 74 69 6d 65 6f 66 64 61 79 28 26 73 74  gettimeofday(&st
2acf0 61 72 74 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6e 64  art, NULL);.#end
2ad00 69 66 0a 0a 09 63 75 72 72 5f 6f 75 74 5f 69 64  if...curr_out_id
2ad10 5f 69 64 78 20 3d 20 30 3b 0a 09 66 6f 72 20 28  _idx = 0;..for (
2ad20 63 75 72 72 5f 69 64 5f 69 64 78 20 3d 20 63 61  curr_id_idx = ca
2ad30 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
2ad40 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 63  ession].search_c
2ad50 75 72 72 5f 69 64 3b 20 63 75 72 72 5f 69 64 5f  urr_id; curr_id_
2ad60 69 64 78 20 3c 20 63 61 63 6b 65 79 5f 73 65 73  idx < cackey_ses
2ad70 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
2ad80 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74  identities_count
2ad90 20 26 26 20 75 6c 4d 61 78 4f 62 6a 65 63 74 43   && ulMaxObjectC
2ada0 6f 75 6e 74 3b 20 63 75 72 72 5f 69 64 5f 69 64  ount; curr_id_id
2adb0 78 2b 2b 29 20 7b 0a 09 09 63 75 72 72 5f 69 64  x++) {...curr_id
2adc0 20 3d 20 26 63 61 63 6b 65 79 5f 73 65 73 73 69   = &cackey_sessi
2add0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64  ons[hSession].id
2ade0 65 6e 74 69 74 69 65 73 5b 63 75 72 72 5f 69 64  entities[curr_id
2adf0 5f 69 64 78 5d 3b 0a 0a 09 09 43 41 43 4b 45 59  _idx];....CACKEY
2ae00 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 50  _DEBUG_PRINTF("P
2ae10 72 6f 63 65 73 73 69 6e 67 20 69 64 65 6e 74 69  rocessing identi
2ae20 74 79 3a 25 6c 75 22 2c 20 28 75 6e 73 69 67 6e  ty:%lu", (unsign
2ae30 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 69 64  ed long) curr_id
2ae40 5f 69 64 78 29 3b 0a 0a 09 09 6d 61 74 63 68 65  _idx);....matche
2ae50 64 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 0a 09 09  d_count = 0;....
2ae60 66 6f 72 20 28 63 75 72 72 5f 61 74 74 72 5f 69  for (curr_attr_i
2ae70 64 78 20 3d 20 30 3b 20 63 75 72 72 5f 61 74 74  dx = 0; curr_att
2ae80 72 5f 69 64 78 20 3c 20 63 61 63 6b 65 79 5f 73  r_idx < cackey_s
2ae90 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
2aea0 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5f 63  ].search_query_c
2aeb0 6f 75 6e 74 3b 20 63 75 72 72 5f 61 74 74 72 5f  ount; curr_attr_
2aec0 69 64 78 2b 2b 29 20 7b 0a 09 09 09 70 72 65 76  idx++) {....prev
2aed0 5f 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 20 3d  _matched_count =
2aee0 20 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 3b 0a   matched_count;.
2aef0 0a 09 09 09 63 75 72 72 5f 61 74 74 72 20 3d 20  ....curr_attr = 
2af00 26 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  &cackey_sessions
2af10 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63  [hSession].searc
2af20 68 5f 71 75 65 72 79 5b 63 75 72 72 5f 61 74 74  h_query[curr_att
2af30 72 5f 69 64 78 5d 3b 0a 0a 09 09 09 43 41 43 4b  r_idx];.....CACK
2af40 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2af50 22 20 20 43 68 65 63 6b 69 6e 67 20 66 6f 72 20  "  Checking for 
2af60 61 74 74 72 69 62 75 74 65 20 25 73 20 28 30 78  attribute %s (0x
2af70 25 30 38 6c 78 29 20 69 6e 20 69 64 65 6e 74 69  %08lx) in identi
2af80 74 79 3a 25 69 2e 2e 2e 22 2c 20 43 41 43 4b 45  ty:%i...", CACKE
2af90 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 41 54 54  Y_DEBUG_FUNC_ATT
2afa0 52 49 42 55 54 45 5f 54 4f 5f 53 54 52 28 63 75  RIBUTE_TO_STR(cu
2afb0 72 72 5f 61 74 74 72 2d 3e 74 79 70 65 29 2c 20  rr_attr->type), 
2afc0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
2afd0 63 75 72 72 5f 61 74 74 72 2d 3e 74 79 70 65 2c  curr_attr->type,
2afe0 20 28 69 6e 74 29 20 63 75 72 72 5f 69 64 5f 69   (int) curr_id_i
2aff0 64 78 29 3b 0a 09 09 09 43 41 43 4b 45 59 5f 44  dx);....CACKEY_D
2b000 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22 20  EBUG_PRINTBUF(" 
2b010 20 20 20 56 61 6c 75 65 20 6c 6f 6f 6b 69 6e 67     Value looking
2b020 20 66 6f 72 3a 22 2c 20 63 75 72 72 5f 61 74 74   for:", curr_att
2b030 72 2d 3e 70 56 61 6c 75 65 2c 20 63 75 72 72 5f  r->pValue, curr_
2b040 61 74 74 72 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e  attr->ulValueLen
2b050 29 3b 0a 0a 09 09 09 66 6f 72 20 28 73 65 73 73  );.....for (sess
2b060 5f 61 74 74 72 5f 69 64 78 20 3d 20 30 3b 20 73  _attr_idx = 0; s
2b070 65 73 73 5f 61 74 74 72 5f 69 64 78 20 3c 20 63  ess_attr_idx < c
2b080 75 72 72 5f 69 64 2d 3e 61 74 74 72 69 62 75 74  urr_id->attribut
2b090 65 73 5f 63 6f 75 6e 74 3b 20 73 65 73 73 5f 61  es_count; sess_a
2b0a0 74 74 72 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 09  ttr_idx++) {....
2b0b0 09 69 66 20 28 63 61 63 6b 65 79 5f 70 6b 63 73  .if (cackey_pkcs
2b0c0 31 31 5f 63 6f 6d 70 61 72 65 5f 61 74 74 72 69  11_compare_attri
2b0d0 62 75 74 65 73 28 26 63 75 72 72 5f 69 64 2d 3e  butes(&curr_id->
2b0e0 61 74 74 72 69 62 75 74 65 73 5b 73 65 73 73 5f  attributes[sess_
2b0f0 61 74 74 72 5f 69 64 78 5d 2c 20 63 75 72 72 5f  attr_idx], curr_
2b100 61 74 74 72 29 29 20 7b 0a 09 09 09 09 09 6d 61  attr)) {......ma
2b110 74 63 68 65 64 5f 63 6f 75 6e 74 2b 2b 3b 0a 0a  tched_count++;..
2b120 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09  .....break;.....
2b130 7d 0a 09 09 09 7d 0a 0a 09 09 09 2f 2a 20 49 66  }....}...../* If
2b140 20 74 68 65 20 61 74 74 72 69 62 75 74 65 20 63   the attribute c
2b150 6f 75 6c 64 20 6e 6f 74 20 62 65 20 6d 61 74 63  ould not be matc
2b160 68 65 64 2c 20 64 6f 20 6e 6f 74 20 74 72 79 20  hed, do not try 
2b170 74 6f 20 6d 61 74 63 68 20 61 64 64 69 74 69 6f  to match additio
2b180 6e 61 6c 20 61 74 74 72 69 62 75 74 65 73 20 2a  nal attributes *
2b190 2f 0a 09 09 09 69 66 20 28 70 72 65 76 5f 6d 61  /....if (prev_ma
2b1a0 74 63 68 65 64 5f 63 6f 75 6e 74 20 3d 3d 20 6d  tched_count == m
2b1b0 61 74 63 68 65 64 5f 63 6f 75 6e 74 29 20 7b 0a  atched_count) {.
2b1c0 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 7d 0a  ....break;....}.
2b1d0 09 09 7d 0a 0a 09 09 69 66 20 28 6d 61 74 63 68  ..}....if (match
2b1e0 65 64 5f 63 6f 75 6e 74 20 3d 3d 20 63 61 63 6b  ed_count == cack
2b1f0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
2b200 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65  sion].search_que
2b210 72 79 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 09 43  ry_count) {....C
2b220 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2b230 54 46 28 22 20 20 2e 2e 2e 20 41 6c 6c 20 25 69  TF("  ... All %i
2b240 20 61 74 74 72 69 62 75 74 65 73 20 63 68 65 63   attributes chec
2b250 6b 65 64 20 66 6f 72 20 66 6f 75 6e 64 2c 20 61  ked for found, a
2b260 64 64 69 6e 67 20 69 64 65 6e 74 69 74 79 3a 25  dding identity:%
2b270 69 20 74 6f 20 72 65 74 75 72 6e 65 64 20 6c 69  i to returned li
2b280 73 74 22 2c 20 28 69 6e 74 29 20 63 61 63 6b 65  st", (int) cacke
2b290 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
2b2a0 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72  ion].search_quer
2b2b0 79 5f 63 6f 75 6e 74 2c 20 28 69 6e 74 29 20 63  y_count, (int) c
2b2c0 75 72 72 5f 69 64 5f 69 64 78 29 3b 0a 0a 09 09  urr_id_idx);....
2b2d0 09 70 68 4f 62 6a 65 63 74 5b 63 75 72 72 5f 6f  .phObject[curr_o
2b2e0 75 74 5f 69 64 5f 69 64 78 5d 20 3d 20 63 75 72  ut_id_idx] = cur
2b2f0 72 5f 69 64 5f 69 64 78 20 2b 20 31 3b 0a 0a 09  r_id_idx + 1;...
2b300 09 09 75 6c 4d 61 78 4f 62 6a 65 63 74 43 6f 75  ..ulMaxObjectCou
2b310 6e 74 2d 2d 3b 0a 0a 09 09 09 63 75 72 72 5f 6f  nt--;.....curr_o
2b320 75 74 5f 69 64 5f 69 64 78 2b 2b 3b 0a 09 09 7d  ut_id_idx++;...}
2b330 20 65 6c 73 65 20 7b 0a 09 09 09 43 41 43 4b 45   else {....CACKE
2b340 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2b350 20 20 2e 2e 2e 20 4e 6f 74 20 61 6c 6c 20 25 69    ... Not all %i
2b360 20 28 6f 6e 6c 79 20 66 6f 75 6e 64 20 25 69 29   (only found %i)
2b370 20 61 74 74 72 69 62 75 74 65 73 20 63 68 65 63   attributes chec
2b380 6b 65 64 20 66 6f 72 20 66 6f 75 6e 64 2c 20 6e  ked for found, n
2b390 6f 74 20 61 64 64 69 6e 67 20 69 64 65 6e 74 69  ot adding identi
2b3a0 74 79 3a 25 69 22 2c 20 28 69 6e 74 29 20 63 61  ty:%i", (int) ca
2b3b0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
2b3c0 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71  ession].search_q
2b3d0 75 65 72 79 5f 63 6f 75 6e 74 2c 20 28 69 6e 74  uery_count, (int
2b3e0 29 20 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 2c  ) matched_count,
2b3f0 20 28 69 6e 74 29 20 63 75 72 72 5f 69 64 5f 69   (int) curr_id_i
2b400 64 78 29 3b 0a 09 09 7d 0a 09 7d 0a 09 63 61 63  dx);...}..}..cac
2b410 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
2b420 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 63 75  ssion].search_cu
2b430 72 72 5f 69 64 20 3d 20 63 75 72 72 5f 69 64 5f  rr_id = curr_id_
2b440 69 64 78 3b 0a 09 2a 70 75 6c 4f 62 6a 65 63 74  idx;..*pulObject
2b450 43 6f 75 6e 74 20 3d 20 63 75 72 72 5f 6f 75 74  Count = curr_out
2b460 5f 69 64 5f 69 64 78 3b 0a 0a 23 69 66 64 65 66  _id_idx;..#ifdef
2b470 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 53 45   CACKEY_DEBUG_SE
2b480 41 52 43 48 5f 53 50 45 45 44 54 45 53 54 0a 09  ARCH_SPEEDTEST..
2b490 67 65 74 74 69 6d 65 6f 66 64 61 79 28 26 65 6e  gettimeofday(&en
2b4a0 64 2c 20 4e 55 4c 4c 29 3b 0a 09 73 74 61 72 74  d, NULL);..start
2b4b0 5f 69 6e 74 20 3d 20 28 73 74 61 72 74 2e 74 76  _int = (start.tv
2b4c0 5f 73 65 63 20 2a 20 31 30 30 30 30 30 30 29 20  _sec * 1000000) 
2b4d0 2b 20 73 74 61 72 74 2e 74 76 5f 75 73 65 63 3b  + start.tv_usec;
2b4e0 0a 09 65 6e 64 5f 69 6e 74 20 3d 20 28 65 6e 64  ..end_int = (end
2b4f0 2e 74 76 5f 73 65 63 20 2a 20 31 30 30 30 30 30  .tv_sec * 100000
2b500 30 29 20 2b 20 65 6e 64 2e 74 76 5f 75 73 65 63  0) + end.tv_usec
2b510 3b 0a 09 66 70 72 69 6e 74 66 28 73 74 64 65 72  ;..fprintf(stder
2b520 72 2c 20 22 53 65 61 72 63 68 20 74 6f 6f 6b 20  r, "Search took 
2b530 25 6c 75 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73  %lu microseconds
2b540 5c 6e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  \n", (unsigned l
2b550 6f 6e 67 29 20 28 65 6e 64 5f 69 6e 74 20 2d 20  ong) (end_int - 
2b560 73 74 61 72 74 5f 69 6e 74 29 29 3b 0a 23 65 6e  start_int));.#en
2b570 64 69 66 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  dif...mutex_retv
2b580 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
2b590 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
2b5a0 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
2b5b0 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
2b5c0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
2b5d0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2b5e0 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69  .  Unlocking fai
2b5f0 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
2b600 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
2b610 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ROR);..}...CACKE
2b620 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2b630 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b  Returning CKR_OK
2b640 20 28 25 69 29 2c 20 6e 75 6d 20 6f 62 6a 65 63   (%i), num objec
2b650 74 73 20 3d 20 25 6c 75 22 2c 20 43 4b 52 5f 4f  ts = %lu", CKR_O
2b660 4b 2c 20 2a 70 75 6c 4f 62 6a 65 63 74 43 6f 75  K, *pulObjectCou
2b670 6e 74 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  nt);...return(CK
2b680 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  R_OK);.}..CK_DEF
2b690 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
2b6a0 52 56 2c 20 43 5f 46 69 6e 64 4f 62 6a 65 63 74  RV, C_FindObject
2b6b0 73 46 69 6e 61 6c 29 28 43 4b 5f 53 45 53 53 49  sFinal)(CK_SESSI
2b6c0 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
2b6d0 6f 6e 29 20 7b 0a 09 43 4b 5f 55 4c 4f 4e 47 20  on) {..CK_ULONG 
2b6e0 69 64 78 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f  idx;..int mutex_
2b6f0 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59  retval;...CACKEY
2b700 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
2b710 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
2b720 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
2b730 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
2b740 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2b750 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
2b760 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
2b770 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
2b780 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
2b790 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73  );..}...if (hSes
2b7a0 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65  sion == 0 || hSe
2b7b0 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66  ssion >= (sizeof
2b7c0 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
2b7d0 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
2b7e0 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29  y_sessions[0])))
2b7f0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
2b800 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2b810 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66    Session out of
2b820 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09   range.");......
2b830 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
2b840 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  ON_HANDLE_INVALI
2b850 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  D);..}...mutex_r
2b860 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
2b870 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79  utex_lock(cackey
2b880 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
2b890 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
2b8a0 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
2b8b0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2b8c0 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c  r.  Locking fail
2b8d0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
2b8e0 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
2b8f0 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63  OR);..}...if (!c
2b900 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
2b910 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29  Session].active)
2b920 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65   {...cackey_mute
2b930 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
2b940 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43  biglock);....CAC
2b950 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2b960 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f  ("Error.  Sessio
2b970 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b  n not active.");
2b980 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
2b990 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
2b9a0 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69  INVALID);..}...i
2b9b0 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69  f (!cackey_sessi
2b9c0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65  ons[hSession].se
2b9d0 61 72 63 68 5f 61 63 74 69 76 65 29 20 7b 0a 09  arch_active) {..
2b9e0 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
2b9f0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
2ba00 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f  ock);....CACKEY_
2ba10 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2ba20 72 6f 72 2e 20 20 53 65 61 72 63 68 20 6e 6f 74  ror.  Search not
2ba30 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09   active.");.....
2ba40 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52  .return(CKR_OPER
2ba50 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41  ATION_NOT_INITIA
2ba60 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 63 61 63  LIZED);..}...cac
2ba70 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
2ba80 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 61 63  ssion].search_ac
2ba90 74 69 76 65 20 3d 20 30 3b 0a 0a 09 66 6f 72 20  tive = 0;...for 
2baa0 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20  (idx = 0; idx < 
2bab0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2bac0 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68  hSession].search
2bad0 5f 71 75 65 72 79 5f 63 6f 75 6e 74 3b 20 69 64  _query_count; id
2bae0 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28 63 61 63  x++) {...if (cac
2baf0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
2bb00 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75  ssion].search_qu
2bb10 65 72 79 5b 69 64 78 5d 2e 70 56 61 6c 75 65 29  ery[idx].pValue)
2bb20 20 7b 0a 09 09 09 66 72 65 65 28 63 61 63 6b 65   {....free(cacke
2bb30 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
2bb40 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72  ion].search_quer
2bb50 79 5b 69 64 78 5d 2e 70 56 61 6c 75 65 29 3b 0a  y[idx].pValue);.
2bb60 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63  ..}..}...if (cac
2bb70 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
2bb80 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75  ssion].search_qu
2bb90 65 72 79 29 20 7b 0a 09 09 66 72 65 65 28 63 61  ery) {...free(ca
2bba0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
2bbb0 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71  ession].search_q
2bbc0 75 65 72 79 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65  uery);..}...mute
2bbd0 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
2bbe0 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
2bbf0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
2bc00 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
2bc10 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
2bc20 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2bc30 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69  "Error.  Unlocki
2bc40 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
2bc50 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
2bc60 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
2bc70 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2bc80 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
2bc90 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b  CKR_OK (%i)", CK
2bca0 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28  R_OK);...return(
2bcb0 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44  CKR_OK);.}..CK_D
2bcc0 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
2bcd0 4b 5f 52 56 2c 20 43 5f 45 6e 63 72 79 70 74 49  K_RV, C_EncryptI
2bce0 6e 69 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  nit)(CK_SESSION_
2bcf0 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
2bd00 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54   CK_MECHANISM_PT
2bd10 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b  R pMechanism, CK
2bd20 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68  _OBJECT_HANDLE h
2bd30 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  Key) {..CACKEY_D
2bd40 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
2bd50 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
2bd60 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
2bd70 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
2bd80 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2bd90 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
2bda0 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
2bdb0 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
2bdc0 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
2bdd0 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
2bde0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
2bdf0 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
2be00 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
2be10 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
2be20 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
2be30 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
2be40 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
2be50 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
2be60 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
2be70 43 4b 5f 52 56 2c 20 43 5f 45 6e 63 72 79 70 74  CK_RV, C_Encrypt
2be80 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
2be90 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
2bea0 5f 42 59 54 45 5f 50 54 52 20 70 44 61 74 61 2c  _BYTE_PTR pData,
2beb0 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 44 61 74 61   CK_ULONG ulData
2bec0 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  Len, CK_BYTE_PTR
2bed0 20 70 45 6e 63 72 79 70 74 65 64 44 61 74 61 2c   pEncryptedData,
2bee0 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75   CK_ULONG_PTR pu
2bef0 6c 45 6e 63 72 79 70 74 65 64 44 61 74 61 4c 65  lEncryptedDataLe
2bf00 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  n) {..CACKEY_DEB
2bf10 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
2bf20 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
2bf30 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
2bf40 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
2bf50 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2bf60 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
2bf70 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
2bf80 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
2bf90 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
2bfa0 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
2bfb0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
2bfc0 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
2bfd0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
2bfe0 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
2bff0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
2c000 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
2c010 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
2c020 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  ORTED);.}..CK_DE
2c030 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
2c040 5f 52 56 2c 20 43 5f 45 6e 63 72 79 70 74 55 70  _RV, C_EncryptUp
2c050 64 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e  date)(CK_SESSION
2c060 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
2c070 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50  , CK_BYTE_PTR pP
2c080 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  art, CK_ULONG ul
2c090 50 61 72 74 4c 65 6e 2c 20 43 4b 5f 42 59 54 45  PartLen, CK_BYTE
2c0a0 5f 50 54 52 20 70 45 6e 63 72 79 70 74 65 64 50  _PTR pEncryptedP
2c0b0 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54  art, CK_ULONG_PT
2c0c0 52 20 70 75 6c 45 6e 63 72 79 70 74 65 64 50 61  R pulEncryptedPa
2c0d0 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59  rtLen) {..CACKEY
2c0e0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
2c0f0 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
2c100 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
2c110 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
2c120 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2c130 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
2c140 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
2c150 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
2c160 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
2c170 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
2c180 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
2c190 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
2c1a0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
2c1b0 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
2c1c0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
2c1d0 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
2c1e0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
2c1f0 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
2c200 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
2c210 4e 28 43 4b 5f 52 56 2c 20 43 5f 45 6e 63 72 79  N(CK_RV, C_Encry
2c220 70 74 46 69 6e 61 6c 29 28 43 4b 5f 53 45 53 53  ptFinal)(CK_SESS
2c230 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
2c240 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  ion, CK_BYTE_PTR
2c250 20 70 4c 61 73 74 45 6e 63 72 79 70 74 65 64 50   pLastEncryptedP
2c260 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54  art, CK_ULONG_PT
2c270 52 20 70 75 6c 4c 61 73 74 45 6e 63 72 79 70 74  R pulLastEncrypt
2c280 65 64 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41  edPartLen) {..CA
2c290 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2c2a0 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
2c2b0 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
2c2c0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
2c2d0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2c2e0 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
2c2f0 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
2c300 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
2c310 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
2c320 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
2c330 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2c340 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
2c350 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
2c360 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
2c370 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
2c380 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
2c390 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
2c3a0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
2c3b0 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
2c3c0 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44  CTION(CK_RV, C_D
2c3d0 65 63 72 79 70 74 49 6e 69 74 29 28 43 4b 5f 53  ecryptInit)(CK_S
2c3e0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
2c3f0 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41  ession, CK_MECHA
2c400 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e  NISM_PTR pMechan
2c410 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48  ism, CK_OBJECT_H
2c420 41 4e 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09 69  ANDLE hKey) {..i
2c430 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b  nt mutex_retval;
2c440 0a 0a 09 68 4b 65 79 2d 2d 3b 0a 0a 09 43 41 43  ...hKey--;...CAC
2c450 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2c460 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
2c470 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
2c480 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
2c490 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2c4a0 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
2c4b0 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
2c4c0 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
2c4d0 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
2c4e0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70  ZED);..}...if (p
2c4f0 4d 65 63 68 61 6e 69 73 6d 20 3d 3d 20 4e 55 4c  Mechanism == NUL
2c500 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
2c510 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2c520 72 2e 20 70 4d 65 63 68 61 6e 69 73 6d 20 69 73  r. pMechanism is
2c530 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74   NULL.");....ret
2c540 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54  urn(CKR_ARGUMENT
2c550 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  S_BAD);..}...if 
2c560 28 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d 65 63  (pMechanism->mec
2c570 68 61 6e 69 73 6d 20 21 3d 20 43 4b 4d 5f 52 53  hanism != CKM_RS
2c580 41 5f 50 4b 43 53 29 20 7b 0a 09 09 43 41 43 4b  A_PKCS) {...CACK
2c590 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2c5a0 22 45 72 72 6f 72 2e 20 70 4d 65 63 68 61 6e 69  "Error. pMechani
2c5b0 73 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d 20 6e 6f  sm->mechanism no
2c5c0 74 20 73 70 65 63 69 66 69 65 64 20 61 73 20 43  t specified as C
2c5d0 4b 4d 5f 52 53 41 5f 50 4b 43 53 22 29 3b 0a 0a  KM_RSA_PKCS");..
2c5e0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4d 45 43  ..return(CKR_MEC
2c5f0 48 41 4e 49 53 4d 5f 50 41 52 41 4d 5f 49 4e 56  HANISM_PARAM_INV
2c600 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  ALID);..}...if (
2c610 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c  hSession == 0 ||
2c620 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69   hSession >= (si
2c630 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
2c640 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  ions) / sizeof(c
2c650 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30  ackey_sessions[0
2c660 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ]))) {...CACKEY_
2c670 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2c680 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75  ror.  Session ou
2c690 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09  t of range.");..
2c6a0 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
2c6b0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e  ESSION_HANDLE_IN
2c6c0 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74  VALID);..}...mut
2c6d0 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
2c6e0 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61  ey_mutex_lock(ca
2c6f0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
2c700 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
2c710 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
2c720 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2c730 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20  Error.  Locking 
2c740 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
2c750 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
2c760 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66  _ERROR);..}...if
2c770 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   (!cackey_sessio
2c780 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74  ns[hSession].act
2c790 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  ive) {...cackey_
2c7a0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
2c7b0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
2c7c0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2c7d0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65  INTF("Error.  Se
2c7e0 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65  ssion not active
2c7f0 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
2c800 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  (CKR_SESSION_HAN
2c810 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  DLE_INVALID);..}
2c820 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65  ...if (cackey_se
2c830 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
2c840 2e 64 65 63 72 79 70 74 5f 61 63 74 69 76 65 29  .decrypt_active)
2c850 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65   {...cackey_mute
2c860 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
2c870 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43  biglock);....CAC
2c880 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2c890 28 22 45 72 72 6f 72 2e 20 20 44 65 63 72 79 70  ("Error.  Decryp
2c8a0 74 20 61 6c 72 65 61 64 79 20 69 6e 20 70 72 6f  t already in pro
2c8b0 67 72 65 73 73 2e 22 29 3b 0a 09 09 0a 09 09 72  gress.");......r
2c8c0 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54  eturn(CKR_OPERAT
2c8d0 49 4f 4e 5f 41 43 54 49 56 45 29 3b 0a 09 7d 0a  ION_ACTIVE);..}.
2c8e0 0a 09 69 66 20 28 68 4b 65 79 20 3e 3d 20 63 61  ..if (hKey >= ca
2c8f0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
2c900 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69  ession].identiti
2c910 65 73 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 63 61  es_count) {...ca
2c920 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
2c930 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
2c940 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  );....CACKEY_DEB
2c950 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2c960 2e 20 20 4b 65 79 20 68 61 6e 64 6c 65 20 6f 75  .  Key handle ou
2c970 74 20 6f 66 20 72 61 6e 67 65 20 28 72 65 71 75  t of range (requ
2c980 65 73 74 65 64 20 6b 65 79 20 25 6c 75 2c 20 6f  ested key %lu, o
2c990 6e 6c 79 20 25 6c 75 20 69 64 65 6e 74 69 74 69  nly %lu identiti
2c9a0 65 73 20 61 76 61 69 6c 61 62 6c 65 29 2e 22 2c  es available).",
2c9b0 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
2c9c0 20 68 4b 65 79 2c 20 28 75 6e 73 69 67 6e 65 64   hKey, (unsigned
2c9d0 20 6c 6f 6e 67 29 20 63 61 63 6b 65 79 5f 73 65   long) cackey_se
2c9e0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
2c9f0 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e  .identities_coun
2ca00 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  t);....return(CK
2ca10 52 5f 4b 45 59 5f 48 41 4e 44 4c 45 5f 49 4e 56  R_KEY_HANDLE_INV
2ca20 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b  ALID);..}...cack
2ca30 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
2ca40 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 61 63  sion].decrypt_ac
2ca50 74 69 76 65 20 3d 20 31 3b 0a 0a 09 63 61 63 6b  tive = 1;...cack
2ca60 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
2ca70 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 6d 65  sion].decrypt_me
2ca80 63 68 61 6e 69 73 6d 20 3d 20 70 4d 65 63 68 61  chanism = pMecha
2ca90 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d 3b  nism->mechanism;
2caa0 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
2cab0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72  s[hSession].decr
2cac0 79 70 74 5f 6d 65 63 68 5f 70 61 72 6d 20 3d 20  ypt_mech_parm = 
2cad0 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 70 50 61 72  pMechanism->pPar
2cae0 61 6d 65 74 65 72 3b 0a 09 63 61 63 6b 65 79 5f  ameter;..cackey_
2caf0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
2cb00 6e 5d 2e 64 65 63 72 79 70 74 5f 6d 65 63 68 5f  n].decrypt_mech_
2cb10 70 61 72 6d 6c 65 6e 20 3d 20 70 4d 65 63 68 61  parmlen = pMecha
2cb20 6e 69 73 6d 2d 3e 75 6c 50 61 72 61 6d 65 74 65  nism->ulParamete
2cb30 72 4c 65 6e 3b 0a 09 63 61 63 6b 65 79 5f 73 65  rLen;..cackey_se
2cb40 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
2cb50 2e 64 65 63 72 79 70 74 5f 69 64 65 6e 74 69 74  .decrypt_identit
2cb60 79 20 3d 20 26 63 61 63 6b 65 79 5f 73 65 73 73  y = &cackey_sess
2cb70 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69  ions[hSession].i
2cb80 64 65 6e 74 69 74 69 65 73 5b 68 4b 65 79 5d 3b  dentities[hKey];
2cb90 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
2cba0 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  = cackey_mutex_u
2cbb0 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
2cbc0 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
2cbd0 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
2cbe0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2cbf0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
2cc00 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64  Unlocking failed
2cc10 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
2cc20 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
2cc30 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
2cc40 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
2cc50 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25  urning CKR_OK (%
2cc60 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09  i)", CKR_OK);...
2cc70 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a  return(CKR_OK);.
2cc80 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
2cc90 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44  CTION(CK_RV, C_D
2cca0 65 63 72 79 70 74 29 28 43 4b 5f 53 45 53 53 49  ecrypt)(CK_SESSI
2ccb0 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
2ccc0 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  on, CK_BYTE_PTR 
2ccd0 70 45 6e 63 72 79 70 74 65 64 44 61 74 61 2c 20  pEncryptedData, 
2cce0 43 4b 5f 55 4c 4f 4e 47 20 75 6c 45 6e 63 72 79  CK_ULONG ulEncry
2ccf0 70 74 65 64 44 61 74 61 4c 65 6e 2c 20 43 4b 5f  ptedDataLen, CK_
2cd00 42 59 54 45 5f 50 54 52 20 70 44 61 74 61 2c 20  BYTE_PTR pData, 
2cd10 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c  CK_ULONG_PTR pul
2cd20 44 61 74 61 4c 65 6e 29 20 7b 0a 09 43 4b 5f 55  DataLen) {..CK_U
2cd30 4c 4f 4e 47 20 64 61 74 61 6c 65 6e 5f 75 70 64  LONG datalen_upd
2cd40 61 74 65 2c 20 64 61 74 61 6c 65 6e 5f 66 69 6e  ate, datalen_fin
2cd50 61 6c 3b 0a 09 43 4b 5f 52 56 20 64 65 63 72 79  al;..CK_RV decry
2cd60 70 74 5f 72 65 74 3b 0a 09 69 6e 74 20 6d 75 74  pt_ret;..int mut
2cd70 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43  ex_retval;...CAC
2cd80 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2cd90 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
2cda0 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
2cdb0 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
2cdc0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2cdd0 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
2cde0 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
2cdf0 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
2ce00 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
2ce10 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70  ZED);..}...if (p
2ce20 75 6c 44 61 74 61 4c 65 6e 20 3d 3d 20 4e 55 4c  ulDataLen == NUL
2ce30 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
2ce40 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2ce50 72 2e 20 70 75 6c 44 61 74 61 4c 65 6e 20 69 73  r. pulDataLen is
2ce60 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74   NULL.");....ret
2ce70 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54  urn(CKR_ARGUMENT
2ce80 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 64 61 74  S_BAD);..}...dat
2ce90 61 6c 65 6e 5f 75 70 64 61 74 65 20 3d 20 2a 70  alen_update = *p
2cea0 75 6c 44 61 74 61 4c 65 6e 3b 0a 0a 09 64 65 63  ulDataLen;...dec
2ceb0 72 79 70 74 5f 72 65 74 20 3d 20 43 5f 44 65 63  rypt_ret = C_Dec
2cec0 72 79 70 74 55 70 64 61 74 65 28 68 53 65 73 73  ryptUpdate(hSess
2ced0 69 6f 6e 2c 20 70 45 6e 63 72 79 70 74 65 64 44  ion, pEncryptedD
2cee0 61 74 61 2c 20 75 6c 45 6e 63 72 79 70 74 65 64  ata, ulEncrypted
2cef0 44 61 74 61 4c 65 6e 2c 20 70 44 61 74 61 2c 20  DataLen, pData, 
2cf00 26 64 61 74 61 6c 65 6e 5f 75 70 64 61 74 65 29  &datalen_update)
2cf10 3b 0a 09 69 66 20 28 64 65 63 72 79 70 74 5f 72  ;..if (decrypt_r
2cf20 65 74 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a  et != CKR_OK) {.
2cf30 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2cf40 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 44  RINTF("Error.  D
2cf50 65 63 72 79 70 74 55 70 64 61 74 65 28 29 20 72  ecryptUpdate() r
2cf60 65 74 75 72 6e 65 64 20 66 61 69 6c 75 72 65 20  eturned failure 
2cf70 28 72 76 20 3d 20 25 6c 75 29 2e 22 2c 20 28 75  (rv = %lu).", (u
2cf80 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 64 65  nsigned long) de
2cf90 63 72 79 70 74 5f 72 65 74 29 3b 0a 0a 09 09 69  crypt_ret);....i
2cfa0 66 20 28 64 65 63 72 79 70 74 5f 72 65 74 20 21  f (decrypt_ret !
2cfb0 3d 20 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f  = CKR_BUFFER_TOO
2cfc0 5f 53 4d 41 4c 4c 29 20 7b 0a 09 09 09 2f 2a 20  _SMALL) {..../* 
2cfd0 54 65 72 6d 69 6e 61 74 65 20 64 65 63 72 79 70  Terminate decryp
2cfe0 74 69 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 20 2a  tion operation *
2cff0 2f 0a 0a 09 09 09 6d 75 74 65 78 5f 72 65 74 76  /.....mutex_retv
2d000 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
2d010 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  x_lock(cackey_bi
2d020 67 6c 6f 63 6b 29 3b 0a 09 09 09 69 66 20 28 6d  glock);....if (m
2d030 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
2d040 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  ) {.....CACKEY_D
2d050 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2d060 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69  or.  Locking fai
2d070 6c 65 64 2e 22 29 3b 0a 0a 09 09 09 09 72 65 74  led.");......ret
2d080 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
2d090 45 52 52 4f 52 29 3b 0a 09 09 09 7d 0a 0a 09 09  ERROR);....}....
2d0a0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73  .if (!cackey_ses
2d0b0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
2d0c0 61 63 74 69 76 65 29 20 7b 0a 09 09 09 09 63 61  active) {.....ca
2d0d0 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
2d0e0 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
2d0f0 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  );......CACKEY_D
2d100 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2d110 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74  or.  Session not
2d120 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09   active.");.....
2d130 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
2d140 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56  SSION_HANDLE_INV
2d150 41 4c 49 44 29 3b 0a 09 09 09 7d 0a 0a 09 09 09  ALID);....}.....
2d160 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73  if (!cackey_sess
2d170 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64  ions[hSession].d
2d180 65 63 72 79 70 74 5f 61 63 74 69 76 65 29 20 7b  ecrypt_active) {
2d190 0a 09 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65  .....cackey_mute
2d1a0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
2d1b0 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 09 09 43  biglock);......C
2d1c0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2d1d0 54 46 28 22 45 72 72 6f 72 2e 20 20 44 65 63 72  TF("Error.  Decr
2d1e0 79 70 74 20 6e 6f 74 20 61 63 74 69 76 65 2e 22  ypt not active."
2d1f0 29 3b 0a 09 09 0a 09 09 09 09 72 65 74 75 72 6e  );........return
2d200 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e  (CKR_OPERATION_N
2d210 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
2d220 0a 09 09 09 7d 0a 0a 09 09 09 63 61 63 6b 65 79  ....}.....cackey
2d230 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
2d240 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 61 63 74 69  on].decrypt_acti
2d250 76 65 20 3d 20 30 3b 0a 0a 09 09 09 6d 75 74 65  ve = 0;.....mute
2d260 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
2d270 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
2d280 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
2d290 09 09 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ...if (mutex_ret
2d2a0 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 09 09  val != 0) {.....
2d2b0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2d2c0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c  NTF("Error.  Unl
2d2d0 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
2d2e0 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
2d2f0 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
2d300 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 72 65  ;....}...}....re
2d310 74 75 72 6e 28 64 65 63 72 79 70 74 5f 72 65 74  turn(decrypt_ret
2d320 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 44 61 74  );..}...if (pDat
2d330 61 29 20 7b 0a 09 09 70 44 61 74 61 20 2b 3d 20  a) {...pData += 
2d340 64 61 74 61 6c 65 6e 5f 75 70 64 61 74 65 3b 0a  datalen_update;.
2d350 09 7d 0a 09 64 61 74 61 6c 65 6e 5f 66 69 6e 61  .}..datalen_fina
2d360 6c 20 3d 20 2a 70 75 6c 44 61 74 61 4c 65 6e 20  l = *pulDataLen 
2d370 2d 20 64 61 74 61 6c 65 6e 5f 75 70 64 61 74 65  - datalen_update
2d380 3b 0a 0a 09 64 65 63 72 79 70 74 5f 72 65 74 20  ;...decrypt_ret 
2d390 3d 20 43 5f 44 65 63 72 79 70 74 46 69 6e 61 6c  = C_DecryptFinal
2d3a0 28 68 53 65 73 73 69 6f 6e 2c 20 70 44 61 74 61  (hSession, pData
2d3b0 2c 20 26 64 61 74 61 6c 65 6e 5f 66 69 6e 61 6c  , &datalen_final
2d3c0 29 3b 0a 09 69 66 20 28 64 65 63 72 79 70 74 5f  );..if (decrypt_
2d3d0 72 65 74 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b  ret != CKR_OK) {
2d3e0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2d3f0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
2d400 44 65 63 72 79 70 74 46 69 6e 61 6c 28 29 20 72  DecryptFinal() r
2d410 65 74 75 72 6e 65 64 20 66 61 69 6c 75 72 65 20  eturned failure 
2d420 28 72 76 20 3d 20 25 6c 75 29 2e 22 2c 20 28 75  (rv = %lu).", (u
2d430 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 64 65  nsigned long) de
2d440 63 72 79 70 74 5f 72 65 74 29 3b 0a 0a 09 09 72  crypt_ret);....r
2d450 65 74 75 72 6e 28 64 65 63 72 79 70 74 5f 72 65  eturn(decrypt_re
2d460 74 29 3b 0a 09 7d 0a 0a 09 2a 70 75 6c 44 61 74  t);..}...*pulDat
2d470 61 4c 65 6e 20 3d 20 64 61 74 61 6c 65 6e 5f 75  aLen = datalen_u
2d480 70 64 61 74 65 20 2b 20 64 61 74 61 6c 65 6e 5f  pdate + datalen_
2d490 66 69 6e 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f  final;...CACKEY_
2d4a0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
2d4b0 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28  turning CKR_OK (
2d4c0 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a  %i)", CKR_OK);..
2d4d0 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b  .return(CKR_OK);
2d4e0 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
2d4f0 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
2d500 44 65 63 72 79 70 74 55 70 64 61 74 65 29 28 43  DecryptUpdate)(C
2d510 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
2d520 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59   hSession, CK_BY
2d530 54 45 5f 50 54 52 20 70 45 6e 63 72 79 70 74 65  TE_PTR pEncrypte
2d540 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20  dPart, CK_ULONG 
2d550 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c  ulEncryptedPartL
2d560 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  en, CK_BYTE_PTR 
2d570 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f  pPart, CK_ULONG_
2d580 50 54 52 20 70 75 6c 50 61 72 74 4c 65 6e 29 20  PTR pulPartLen) 
2d590 7b 0a 09 73 74 61 74 69 63 20 43 4b 5f 42 59 54  {..static CK_BYT
2d5a0 45 20 62 75 66 5b 31 36 33 38 34 5d 3b 0a 09 73  E buf[16384];..s
2d5b0 73 69 7a 65 5f 74 20 62 75 66 6c 65 6e 3b 0a 09  size_t buflen;..
2d5c0 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49  CK_SLOT_ID slotI
2d5d0 44 3b 0a 09 43 4b 5f 52 56 20 72 65 74 76 61 6c  D;..CK_RV retval
2d5e0 20 3d 20 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45   = CKR_GENERAL_E
2d5f0 52 52 4f 52 3b 0a 09 69 6e 74 20 6d 75 74 65 78  RROR;..int mutex
2d600 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45  _retval;...CACKE
2d610 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2d620 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
2d630 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
2d640 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
2d650 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2d660 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
2d670 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
2d680 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
2d690 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
2d6a0 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65  D);..}...if (hSe
2d6b0 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53  ssion == 0 || hS
2d6c0 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f  ession >= (sizeo
2d6d0 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
2d6e0 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
2d6f0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29  ey_sessions[0]))
2d700 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
2d710 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2d720 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f  .  Session out o
2d730 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09  f range.");.....
2d740 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
2d750 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
2d760 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 45  ID);..}...if (pE
2d770 6e 63 72 79 70 74 65 64 50 61 72 74 20 3d 3d 20  ncryptedPart == 
2d780 4e 55 4c 4c 20 26 26 20 75 6c 45 6e 63 72 79 70  NULL && ulEncryp
2d790 74 65 64 50 61 72 74 4c 65 6e 20 3d 3d 20 30 29  tedPartLen == 0)
2d7a0 20 7b 0a 09 09 2f 2a 20 53 68 6f 72 74 20 63 69   {.../* Short ci
2d7b0 72 63 75 69 74 20 69 66 20 77 65 20 61 72 65 20  rcuit if we are 
2d7c0 61 73 6b 65 64 20 74 6f 20 64 65 63 72 79 70 74  asked to decrypt
2d7d0 20 6e 6f 74 68 69 6e 67 2e 2e 2e 20 2a 2f 0a 09   nothing... */..
2d7e0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2d7f0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
2d800 43 4b 52 5f 4f 4b 20 28 25 69 29 20 28 73 68 6f  CKR_OK (%i) (sho
2d810 72 74 20 63 69 72 63 75 69 74 29 22 2c 20 43 4b  rt circuit)", CK
2d820 52 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74 75 72 6e  R_OK);....return
2d830 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69  (CKR_OK);..}...i
2d840 66 20 28 70 45 6e 63 72 79 70 74 65 64 50 61 72  f (pEncryptedPar
2d850 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  t == NULL) {...C
2d860 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2d870 54 46 28 22 45 72 72 6f 72 2e 20 70 45 6e 63 72  TF("Error. pEncr
2d880 79 70 74 65 64 50 61 72 74 20 69 73 20 4e 55 4c  yptedPart is NUL
2d890 4c 2c 20 62 75 74 20 75 6c 45 6e 63 72 79 70 74  L, but ulEncrypt
2d8a0 65 64 50 61 72 74 4c 65 6e 20 69 73 20 6e 6f 74  edPartLen is not
2d8b0 20 30 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e   0.");....return
2d8c0 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42  (CKR_ARGUMENTS_B
2d8d0 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 6c  AD);..}...if (ul
2d8e0 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e  EncryptedPartLen
2d8f0 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   == 0) {...CACKE
2d900 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2d910 45 72 72 6f 72 2e 20 75 6c 45 6e 63 72 79 70 74  Error. ulEncrypt
2d920 65 64 50 61 72 74 4c 65 6e 20 69 73 20 30 2c 20  edPartLen is 0, 
2d930 62 75 74 20 70 50 61 72 74 20 69 73 20 6e 6f 74  but pPart is not
2d940 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74   NULL.");....ret
2d950 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54  urn(CKR_ARGUMENT
2d960 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  S_BAD);..}...if 
2d970 28 70 75 6c 50 61 72 74 4c 65 6e 20 3d 3d 20 4e  (pulPartLen == N
2d980 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
2d990 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2d9a0 72 6f 72 2e 20 70 75 6c 50 61 72 74 4c 65 6e 20  ror. pulPartLen 
2d9b0 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72  is NULL.");....r
2d9c0 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45  eturn(CKR_ARGUME
2d9d0 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 6d  NTS_BAD);..}...m
2d9e0 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
2d9f0 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28  ckey_mutex_lock(
2da00 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
2da10 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
2da20 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
2da30 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2da40 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e  ("Error.  Lockin
2da50 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
2da60 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
2da70 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
2da80 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73  if (!cackey_sess
2da90 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61  ions[hSession].a
2daa0 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65  ctive) {...cacke
2dab0 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
2dac0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
2dad0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2dae0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
2daf0 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69  Session not acti
2db00 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ve.");......retu
2db10 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48  rn(CKR_SESSION_H
2db20 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a  ANDLE_INVALID);.
2db30 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  .}...if (!cackey
2db40 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
2db50 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 61 63 74 69  on].decrypt_acti
2db60 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d  ve) {...cackey_m
2db70 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
2db80 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
2db90 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2dba0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 44 65 63  NTF("Error.  Dec
2dbb0 72 79 70 74 20 6e 6f 74 20 61 63 74 69 76 65 2e  rypt not active.
2dbc0 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
2dbd0 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f  CKR_OPERATION_NO
2dbe0 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
2dbf0 09 7d 0a 0a 09 73 6c 6f 74 49 44 20 3d 20 63 61  .}...slotID = ca
2dc00 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
2dc10 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44 3b 0a  ession].slotID;.
2dc20 0a 09 69 66 20 28 73 6c 6f 74 49 44 20 3c 20 30  ..if (slotID < 0
2dc30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73   || slotID >= (s
2dc40 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f  izeof(cackey_slo
2dc50 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63  ts) / sizeof(cac
2dc60 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20  key_slots[0]))) 
2dc70 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
2dc80 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2dc90 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71  Invalid slot req
2dca0 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 6f 75  uested (%lu), ou
2dcb0 74 73 69 64 65 20 6f 66 20 76 61 6c 69 64 20 72  tside of valid r
2dcc0 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a  ange", slotID);.
2dcd0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
2dce0 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
2dcf0 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c  ...if (cackey_sl
2dd00 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69  ots[slotID].acti
2dd10 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43  ve == 0) {...CAC
2dd20 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2dd30 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64  ("Error. Invalid
2dd40 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20   slot requested 
2dd50 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20  (%lu), slot not 
2dd60 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65  currently active
2dd70 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63  ", slotID);....c
2dd80 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
2dd90 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
2dda0 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  k);....return(CK
2ddb0 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
2ddc0 3b 0a 09 7d 0a 0a 09 73 77 69 74 63 68 20 28 63  ;..}...switch (c
2ddd0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
2dde0 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74  Session].decrypt
2ddf0 5f 6d 65 63 68 61 6e 69 73 6d 29 20 7b 0a 09 09  _mechanism) {...
2de00 63 61 73 65 20 43 4b 4d 5f 52 53 41 5f 50 4b 43  case CKM_RSA_PKC
2de10 53 3a 0a 09 09 09 2f 2a 20 41 73 6b 20 63 61 72  S:..../* Ask car
2de20 64 20 74 6f 20 64 65 63 72 79 70 74 20 2a 2f 0a  d to decrypt */.
2de30 09 09 09 62 75 66 6c 65 6e 20 3d 20 63 61 63 6b  ...buflen = cack
2de40 65 79 5f 73 69 67 6e 64 65 63 72 79 70 74 28 26  ey_signdecrypt(&
2de50 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f  cackey_slots[slo
2de60 74 49 44 5d 2c 20 63 61 63 6b 65 79 5f 73 65 73  tID], cackey_ses
2de70 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
2de80 64 65 63 72 79 70 74 5f 69 64 65 6e 74 69 74 79  decrypt_identity
2de90 2c 20 70 45 6e 63 72 79 70 74 65 64 50 61 72 74  , pEncryptedPart
2dea0 2c 20 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72  , ulEncryptedPar
2deb0 74 4c 65 6e 2c 20 62 75 66 2c 20 73 69 7a 65 6f  tLen, buf, sizeo
2dec0 66 28 62 75 66 29 2c 20 30 2c 20 31 29 3b 0a 0a  f(buf), 0, 1);..
2ded0 09 09 09 69 66 20 28 62 75 66 6c 65 6e 20 3d 3d  ...if (buflen ==
2dee0 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4e   CACKEY_PCSC_E_N
2def0 45 45 44 4c 4f 47 49 4e 20 26 26 20 63 61 63 6b  EEDLOGIN && cack
2df00 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20 21  ey_pin_command !
2df10 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 69 66  = NULL) {.....if
2df20 20 28 43 5f 4c 6f 67 69 6e 4d 75 74 65 78 41 72   (C_LoginMutexAr
2df30 67 28 68 53 65 73 73 69 6f 6e 2c 20 43 4b 55 5f  g(hSession, CKU_
2df40 55 53 45 52 2c 20 4e 55 4c 4c 2c 20 30 2c 20 30  USER, NULL, 0, 0
2df50 29 20 3d 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09  ) == CKR_OK) {..
2df60 09 09 09 09 62 75 66 6c 65 6e 20 3d 20 63 61 63  ....buflen = cac
2df70 6b 65 79 5f 73 69 67 6e 64 65 63 72 79 70 74 28  key_signdecrypt(
2df80 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c  &cackey_slots[sl
2df90 6f 74 49 44 5d 2c 20 63 61 63 6b 65 79 5f 73 65  otID], cackey_se
2dfa0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
2dfb0 2e 64 65 63 72 79 70 74 5f 69 64 65 6e 74 69 74  .decrypt_identit
2dfc0 79 2c 20 70 45 6e 63 72 79 70 74 65 64 50 61 72  y, pEncryptedPar
2dfd0 74 2c 20 75 6c 45 6e 63 72 79 70 74 65 64 50 61  t, ulEncryptedPa
2dfe0 72 74 4c 65 6e 2c 20 62 75 66 2c 20 73 69 7a 65  rtLen, buf, size
2dff0 6f 66 28 62 75 66 29 2c 20 30 2c 20 31 29 3b 0a  of(buf), 0, 1);.
2e000 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 09 69  ....}....}.....i
2e010 66 20 28 62 75 66 6c 65 6e 20 3c 20 30 29 20 7b  f (buflen < 0) {
2e020 0a 09 09 09 09 2f 2a 20 44 65 63 72 79 70 74 69  ...../* Decrypti
2e030 6f 6e 20 66 61 69 6c 65 64 2e 20 2a 2f 0a 09 09  on failed. */...
2e040 09 09 69 66 20 28 62 75 66 6c 65 6e 20 3d 3d 20  ..if (buflen == 
2e050 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4e 45  CACKEY_PCSC_E_NE
2e060 45 44 4c 4f 47 49 4e 29 20 7b 0a 09 09 09 09 09  EDLOGIN) {......
2e070 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 55 53 45  retval = CKR_USE
2e080 52 5f 4e 4f 54 5f 4c 4f 47 47 45 44 5f 49 4e 3b  R_NOT_LOGGED_IN;
2e090 0a 09 09 09 09 7d 20 65 6c 73 65 20 69 66 20 28  .....} else if (
2e0a0 62 75 66 6c 65 6e 20 3d 3d 20 43 41 43 4b 45 59  buflen == CACKEY
2e0b0 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53  _PCSC_E_TOKENABS
2e0c0 45 4e 54 29 20 7b 0a 09 09 09 09 09 72 65 74 76  ENT) {......retv
2e0d0 61 6c 20 3d 20 43 4b 52 5f 44 45 56 49 43 45 5f  al = CKR_DEVICE_
2e0e0 52 45 4d 4f 56 45 44 3b 0a 09 09 09 09 7d 20 65  REMOVED;.....} e
2e0f0 6c 73 65 20 7b 0a 09 09 09 09 09 43 41 43 4b 45  lse {......CACKE
2e100 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2e110 46 61 69 6c 65 64 20 74 6f 20 73 65 6e 64 20 41  Failed to send A
2e120 50 44 55 2c 20 65 72 72 6f 72 20 3d 20 25 6c 69  PDU, error = %li
2e130 22 2c 20 28 6c 6f 6e 67 20 69 6e 74 29 20 62 75  ", (long int) bu
2e140 66 6c 65 6e 29 3b 0a 0a 09 09 09 09 09 72 65 74  flen);.......ret
2e150 76 61 6c 20 3d 20 43 4b 52 5f 47 45 4e 45 52 41  val = CKR_GENERA
2e160 4c 5f 45 52 52 4f 52 3b 0a 09 09 09 09 7d 0a 09  L_ERROR;.....}..
2e170 09 09 7d 20 65 6c 73 65 20 69 66 20 28 28 28 75  ..} else if (((u
2e180 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 62 75  nsigned long) bu
2e190 66 6c 65 6e 29 20 3e 20 2a 70 75 6c 50 61 72 74  flen) > *pulPart
2e1a0 4c 65 6e 20 26 26 20 70 50 61 72 74 29 20 7b 0a  Len && pPart) {.
2e1b0 09 09 09 09 2f 2a 20 44 65 63 72 79 70 74 65 64  ..../* Decrypted
2e1c0 20 64 61 74 61 20 74 6f 6f 20 6c 61 72 67 65 20   data too large 
2e1d0 2a 2f 0a 09 09 09 09 72 65 74 76 61 6c 20 3d 20  */.....retval = 
2e1e0 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53  CKR_BUFFER_TOO_S
2e1f0 4d 41 4c 4c 3b 0a 09 09 09 7d 20 65 6c 73 65 20  MALL;....} else 
2e200 7b 0a 09 09 09 09 69 66 20 28 70 50 61 72 74 29  {.....if (pPart)
2e210 20 7b 0a 09 09 09 09 09 6d 65 6d 63 70 79 28 70   {......memcpy(p
2e220 50 61 72 74 2c 20 62 75 66 2c 20 62 75 66 6c 65  Part, buf, bufle
2e230 6e 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 2a  n);.....}......*
2e240 70 75 6c 50 61 72 74 4c 65 6e 20 3d 20 62 75 66  pulPartLen = buf
2e250 6c 65 6e 3b 0a 0a 09 09 09 09 72 65 74 76 61 6c  len;......retval
2e260 20 3d 20 43 4b 52 5f 4f 4b 3b 0a 09 09 09 7d 0a   = CKR_OK;....}.
2e270 0a 09 09 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09  ....break;..}...
2e280 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
2e290 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
2e2a0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
2e2b0 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
2e2c0 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
2e2d0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2e2e0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c  NTF("Error.  Unl
2e2f0 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
2e300 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
2e310 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
2e320 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
2e330 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
2e340 69 6e 67 20 25 69 22 2c 20 28 69 6e 74 29 20 72  ing %i", (int) r
2e350 65 74 76 61 6c 29 3b 0a 0a 09 72 65 74 75 72 6e  etval);...return
2e360 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 43 4b 5f  (retval);.}..CK_
2e370 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
2e380 43 4b 5f 52 56 2c 20 43 5f 44 65 63 72 79 70 74  CK_RV, C_Decrypt
2e390 46 69 6e 61 6c 29 28 43 4b 5f 53 45 53 53 49 4f  Final)(CK_SESSIO
2e3a0 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
2e3b0 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
2e3c0 4c 61 73 74 50 61 72 74 2c 20 43 4b 5f 55 4c 4f  LastPart, CK_ULO
2e3d0 4e 47 5f 50 54 52 20 70 75 6c 4c 61 73 74 50 61  NG_PTR pulLastPa
2e3e0 72 74 4c 65 6e 29 20 7b 0a 09 69 6e 74 20 6d 75  rtLen) {..int mu
2e3f0 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09 69 6e 74  tex_retval;..int
2e400 20 74 65 72 6d 69 6e 61 74 65 5f 64 65 63 72 79   terminate_decry
2e410 70 74 20 3d 20 31 3b 0a 0a 09 43 41 43 4b 45 59  pt = 1;...CACKEY
2e420 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
2e430 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
2e440 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
2e450 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
2e460 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2e470 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
2e480 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
2e490 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
2e4a0 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
2e4b0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73  );..}...if (hSes
2e4c0 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65  sion == 0 || hSe
2e4d0 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66  ssion >= (sizeof
2e4e0 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
2e4f0 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
2e500 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29  y_sessions[0])))
2e510 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
2e520 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2e530 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66    Session out of
2e540 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09   range.");......
2e550 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
2e560 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  ON_HANDLE_INVALI
2e570 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 75 6c  D);..}...if (pul
2e580 4c 61 73 74 50 61 72 74 4c 65 6e 20 3d 3d 20 4e  LastPartLen == N
2e590 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
2e5a0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2e5b0 72 6f 72 2e 20 70 75 6c 4c 61 73 74 50 61 72 74  ror. pulLastPart
2e5c0 4c 65 6e 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a  Len is NULL.");.
2e5d0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52  ...return(CKR_AR
2e5e0 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d  GUMENTS_BAD);..}
2e5f0 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
2e600 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c  = cackey_mutex_l
2e610 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
2e620 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
2e630 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
2e640 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2e650 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f  INTF("Error.  Lo
2e660 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
2e670 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
2e680 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
2e690 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  }...if (!cackey_
2e6a0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
2e6b0 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63  n].active) {...c
2e6c0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
2e6d0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
2e6e0 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  k);....CACKEY_DE
2e6f0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2e700 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20  r.  Session not 
2e710 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09  active.");......
2e720 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
2e730 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  ON_HANDLE_INVALI
2e740 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61  D);..}...if (!ca
2e750 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
2e760 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f  ession].decrypt_
2e770 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b  active) {...cack
2e780 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
2e790 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
2e7a0 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
2e7b0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2e7c0 20 44 65 63 72 79 70 74 20 6e 6f 74 20 61 63 74   Decrypt not act
2e7d0 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  ive.");......ret
2e7e0 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f  urn(CKR_OPERATIO
2e7f0 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  N_NOT_INITIALIZE
2e800 44 29 3b 0a 09 7d 0a 0a 09 2a 70 75 6c 4c 61 73  D);..}...*pulLas
2e810 74 50 61 72 74 4c 65 6e 20 3d 20 30 3b 0a 0a 09  tPartLen = 0;...
2e820 69 66 20 28 70 4c 61 73 74 50 61 72 74 20 3d 3d  if (pLastPart ==
2e830 20 4e 55 4c 4c 29 20 7b 0a 09 09 74 65 72 6d 69   NULL) {...termi
2e840 6e 61 74 65 5f 64 65 63 72 79 70 74 20 3d 20 30  nate_decrypt = 0
2e850 3b 0a 09 7d 0a 0a 09 69 66 20 28 74 65 72 6d 69  ;..}...if (termi
2e860 6e 61 74 65 5f 64 65 63 72 79 70 74 29 20 7b 0a  nate_decrypt) {.
2e870 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
2e880 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72  s[hSession].decr
2e890 79 70 74 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a  ypt_active = 0;.
2e8a0 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  .}...mutex_retva
2e8b0 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
2e8c0 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
2e8d0 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
2e8e0 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
2e8f0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
2e900 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2e910 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c    Unlocking fail
2e920 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
2e930 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
2e940 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  OR);..}...CACKEY
2e950 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
2e960 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20  eturning CKR_OK 
2e970 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a  (%i)", CKR_OK);.
2e980 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29  ..return(CKR_OK)
2e990 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
2e9a0 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
2e9b0 5f 44 69 67 65 73 74 49 6e 69 74 29 28 43 4b 5f  _DigestInit)(CK_
2e9c0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
2e9d0 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48  Session, CK_MECH
2e9e0 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61  ANISM_PTR pMecha
2e9f0 6e 69 73 6d 29 20 7b 0a 09 43 41 43 4b 45 59 5f  nism) {..CACKEY_
2ea00 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
2ea10 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
2ea20 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
2ea30 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
2ea40 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2ea50 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
2ea60 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
2ea70 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
2ea80 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
2ea90 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
2eaa0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
2eab0 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
2eac0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
2ead0 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
2eae0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
2eaf0 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
2eb00 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2eb10 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
2eb20 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
2eb30 28 43 4b 5f 52 56 2c 20 43 5f 44 69 67 65 73 74  (CK_RV, C_Digest
2eb40 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
2eb50 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
2eb60 5f 42 59 54 45 5f 50 54 52 20 70 44 61 74 61 2c  _BYTE_PTR pData,
2eb70 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 44 61 74 61   CK_ULONG ulData
2eb80 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  Len, CK_BYTE_PTR
2eb90 20 70 44 69 67 65 73 74 2c 20 43 4b 5f 55 4c 4f   pDigest, CK_ULO
2eba0 4e 47 5f 50 54 52 20 70 75 6c 44 69 67 65 73 74  NG_PTR pulDigest
2ebb0 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  Len) {..CACKEY_D
2ebc0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
2ebd0 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
2ebe0 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
2ebf0 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
2ec00 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2ec10 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
2ec20 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
2ec30 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
2ec40 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
2ec50 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
2ec60 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
2ec70 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
2ec80 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
2ec90 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
2eca0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
2ecb0 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
2ecc0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
2ecd0 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
2ece0 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
2ecf0 43 4b 5f 52 56 2c 20 43 5f 44 69 67 65 73 74 55  CK_RV, C_DigestU
2ed00 70 64 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f  pdate)(CK_SESSIO
2ed10 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
2ed20 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
2ed30 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  Part, CK_ULONG u
2ed40 6c 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43  lPartLen) {..CAC
2ed50 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2ed60 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
2ed70 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
2ed80 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
2ed90 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2eda0 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
2edb0 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
2edc0 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
2edd0 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
2ede0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
2edf0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2ee00 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
2ee10 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
2ee20 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
2ee30 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
2ee40 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
2ee50 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
2ee60 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
2ee70 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
2ee80 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 69  TION(CK_RV, C_Di
2ee90 67 65 73 74 4b 65 79 29 28 43 4b 5f 53 45 53 53  gestKey)(CK_SESS
2eea0 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
2eeb0 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48  ion, CK_OBJECT_H
2eec0 41 4e 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09 43  ANDLE hKey) {..C
2eed0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2eee0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
2eef0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
2ef00 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
2ef10 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2ef20 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
2ef30 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
2ef40 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
2ef50 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
2ef60 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
2ef70 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2ef80 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
2ef90 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
2efa0 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
2efb0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2efc0 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
2efd0 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
2efe0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
2eff0 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
2f000 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
2f010 44 69 67 65 73 74 46 69 6e 61 6c 29 28 43 4b 5f  DigestFinal)(CK_
2f020 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
2f030 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45  Session, CK_BYTE
2f040 5f 50 54 52 20 70 44 69 67 65 73 74 2c 20 43 4b  _PTR pDigest, CK
2f050 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 44 69  _ULONG_PTR pulDi
2f060 67 65 73 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b  gestLen) {..CACK
2f070 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2f080 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
2f090 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
2f0a0 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
2f0b0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2f0c0 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
2f0d0 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
2f0e0 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
2f0f0 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
2f100 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
2f110 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
2f120 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
2f130 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
2f140 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
2f150 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
2f160 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
2f170 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
2f180 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
2f190 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
2f1a0 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 69 67  ION(CK_RV, C_Sig
2f1b0 6e 49 6e 69 74 29 28 43 4b 5f 53 45 53 53 49 4f  nInit)(CK_SESSIO
2f1c0 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
2f1d0 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f  n, CK_MECHANISM_
2f1e0 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20  PTR pMechanism, 
2f1f0 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45  CK_OBJECT_HANDLE
2f200 20 68 4b 65 79 29 20 7b 0a 09 69 6e 74 20 6d 75   hKey) {..int mu
2f210 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 68 4b  tex_retval;...hK
2f220 65 79 2d 2d 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  ey--;...CACKEY_D
2f230 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
2f240 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
2f250 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
2f260 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
2f270 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2f280 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
2f290 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
2f2a0 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
2f2b0 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
2f2c0 0a 09 7d 0a 0a 09 69 66 20 28 70 4d 65 63 68 61  ..}...if (pMecha
2f2d0 6e 69 73 6d 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  nism == NULL) {.
2f2e0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2f2f0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 4d  RINTF("Error. pM
2f300 65 63 68 61 6e 69 73 6d 20 69 73 20 4e 55 4c 4c  echanism is NULL
2f310 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
2f320 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44  KR_ARGUMENTS_BAD
2f330 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 4d 65 63  );..}...if (pMec
2f340 68 61 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e 69 73  hanism->mechanis
2f350 6d 20 21 3d 20 43 4b 4d 5f 52 53 41 5f 50 4b 43  m != CKM_RSA_PKC
2f360 53 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  S) {...CACKEY_DE
2f370 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2f380 72 2e 20 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d  r. pMechanism->m
2f390 65 63 68 61 6e 69 73 6d 20 6e 6f 74 20 73 70 65  echanism not spe
2f3a0 63 69 66 69 65 64 20 61 73 20 43 4b 4d 5f 52 53  cified as CKM_RS
2f3b0 41 5f 50 4b 43 53 22 29 3b 0a 0a 09 09 72 65 74  A_PKCS");....ret
2f3c0 75 72 6e 28 43 4b 52 5f 4d 45 43 48 41 4e 49 53  urn(CKR_MECHANIS
2f3d0 4d 5f 50 41 52 41 4d 5f 49 4e 56 41 4c 49 44 29  M_PARAM_INVALID)
2f3e0 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73  ;..}...if (hSess
2f3f0 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73  ion == 0 || hSes
2f400 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28  sion >= (sizeof(
2f410 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29  cackey_sessions)
2f420 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
2f430 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20  _sessions[0]))) 
2f440 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
2f450 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2f460 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20   Session out of 
2f470 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72  range.");......r
2f480 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f  eturn(CKR_SESSIO
2f490 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44  N_HANDLE_INVALID
2f4a0 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65  );..}...mutex_re
2f4b0 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
2f4c0 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  tex_lock(cackey_
2f4d0 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
2f4e0 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
2f4f0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
2f500 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2f510 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65  .  Locking faile
2f520 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
2f530 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
2f540 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61  R);..}...if (!ca
2f550 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
2f560 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20  ession].active) 
2f570 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  {...cackey_mutex
2f580 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
2f590 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b  iglock);....CACK
2f5a0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2f5b0 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e  "Error.  Session
2f5c0 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a   not active.");.
2f5d0 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
2f5e0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49  SESSION_HANDLE_I
2f5f0 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66  NVALID);..}...if
2f600 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e   (cackey_session
2f610 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
2f620 5f 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63  _active) {...cac
2f630 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
2f640 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
2f650 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  ;....CACKEY_DEBU
2f660 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2f670 20 20 53 69 67 6e 20 61 6c 72 65 61 64 79 20 69    Sign already i
2f680 6e 20 70 72 6f 67 72 65 73 73 2e 22 29 3b 0a 09  n progress.");..
2f690 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ....return(CKR_O
2f6a0 50 45 52 41 54 49 4f 4e 5f 41 43 54 49 56 45 29  PERATION_ACTIVE)
2f6b0 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 4b 65 79 20  ;..}...if (hKey 
2f6c0 3e 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  >= cackey_sessio
2f6d0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65  ns[hSession].ide
2f6e0 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 29 20 7b  ntities_count) {
2f6f0 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
2f700 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
2f710 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45  glock);....CACKE
2f720 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2f730 45 72 72 6f 72 2e 20 20 4b 65 79 20 68 61 6e 64  Error.  Key hand
2f740 6c 65 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 20  le out of range 
2f750 28 72 65 71 75 65 73 74 65 64 20 6b 65 79 20 25  (requested key %
2f760 6c 75 2c 20 6f 6e 6c 79 20 25 6c 75 20 69 64 65  lu, only %lu ide
2f770 6e 74 69 74 69 65 73 20 61 76 61 69 6c 61 62 6c  ntities availabl
2f780 65 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  e).", (unsigned 
2f790 6c 6f 6e 67 29 20 68 4b 65 79 2c 20 28 75 6e 73  long) hKey, (uns
2f7a0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 61 63 6b  igned long) cack
2f7b0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
2f7c0 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73  sion].identities
2f7d0 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09 72 65 74 75  _count);....retu
2f7e0 72 6e 28 43 4b 52 5f 4b 45 59 5f 48 41 4e 44 4c  rn(CKR_KEY_HANDL
2f7f0 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
2f800 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
2f810 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
2f820 61 63 74 69 76 65 20 3d 20 31 3b 0a 0a 09 63 61  active = 1;...ca
2f830 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
2f840 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 6d 65 63  ession].sign_mec
2f850 68 61 6e 69 73 6d 20 3d 20 70 4d 65 63 68 61 6e  hanism = pMechan
2f860 69 73 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d 3b 0a  ism->mechanism;.
2f870 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
2f880 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
2f890 5f 62 75 66 6c 65 6e 20 3d 20 31 32 38 3b 0a 09  _buflen = 128;..
2f8a0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2f8b0 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62  hSession].sign_b
2f8c0 75 66 75 73 65 64 20 3d 20 30 3b 0a 09 63 61 63  ufused = 0;..cac
2f8d0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
2f8e0 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 20  ssion].sign_buf 
2f8f0 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28  = malloc(sizeof(
2f900 2a 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  *cackey_sessions
2f910 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
2f920 62 75 66 29 20 2a 20 63 61 63 6b 65 79 5f 73 65  buf) * cackey_se
2f930 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
2f940 2e 73 69 67 6e 5f 62 75 66 6c 65 6e 29 3b 0a 0a  .sign_buflen);..
2f950 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2f960 49 4e 54 46 28 22 53 65 73 73 69 6f 6e 20 25 6c  INTF("Session %l
2f970 75 20 73 69 67 6e 5f 69 64 65 6e 74 69 74 79 20  u sign_identity 
2f980 69 73 20 25 70 20 28 69 64 65 6e 74 69 74 79 20  is %p (identity 
2f990 23 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65  #%lu)", (unsigne
2f9a0 64 20 6c 6f 6e 67 29 20 68 53 65 73 73 69 6f 6e  d long) hSession
2f9b0 2c 20 28 76 6f 69 64 20 2a 29 20 26 63 61 63 6b  , (void *) &cack
2f9c0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
2f9d0 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73  sion].identities
2f9e0 5b 68 4b 65 79 5d 2c 20 28 75 6e 73 69 67 6e 65  [hKey], (unsigne
2f9f0 64 20 6c 6f 6e 67 29 20 68 4b 65 79 29 3b 0a 09  d long) hKey);..
2fa00 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2fa10 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 69  hSession].sign_i
2fa20 64 65 6e 74 69 74 79 20 3d 20 26 63 61 63 6b 65  dentity = &cacke
2fa30 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
2fa40 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5b  ion].identities[
2fa50 68 4b 65 79 5d 3b 0a 0a 09 6d 75 74 65 78 5f 72  hKey];...mutex_r
2fa60 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
2fa70 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
2fa80 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
2fa90 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
2faa0 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
2fab0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2fac0 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20  ror.  Unlocking 
2fad0 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
2fae0 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
2faf0 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41  _ERROR);..}...CA
2fb00 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2fb10 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
2fb20 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f  _OK (%i)", CKR_O
2fb30 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  K);...return(CKR
2fb40 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  _OK);.}..CK_DEFI
2fb50 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
2fb60 56 2c 20 43 5f 53 69 67 6e 29 28 43 4b 5f 53 45  V, C_Sign)(CK_SE
2fb70 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
2fb80 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  ssion, CK_BYTE_P
2fb90 54 52 20 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f  TR pData, CK_ULO
2fba0 4e 47 20 75 6c 44 61 74 61 4c 65 6e 2c 20 43 4b  NG ulDataLen, CK
2fbb0 5f 42 59 54 45 5f 50 54 52 20 70 53 69 67 6e 61  _BYTE_PTR pSigna
2fbc0 74 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50  ture, CK_ULONG_P
2fbd0 54 52 20 70 75 6c 53 69 67 6e 61 74 75 72 65 4c  TR pulSignatureL
2fbe0 65 6e 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20  en) {..unsigned 
2fbf0 6c 6f 6e 67 20 73 74 61 72 74 5f 73 69 67 6e 5f  long start_sign_
2fc00 62 75 66 75 73 65 64 3b 0a 09 43 4b 5f 52 56 20  bufused;..CK_RV 
2fc10 73 69 67 6e 5f 72 65 74 3b 0a 09 69 6e 74 20 6d  sign_ret;..int m
2fc20 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43  utex_retval;...C
2fc30 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2fc40 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
2fc50 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
2fc60 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
2fc70 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2fc80 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
2fc90 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
2fca0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
2fcb0 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
2fcc0 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  LIZED);..}...if 
2fcd0 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c  (hSession == 0 |
2fce0 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73  | hSession >= (s
2fcf0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
2fd00 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28  sions) / sizeof(
2fd10 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2fd20 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59  0]))) {...CACKEY
2fd30 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2fd40 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f  rror.  Session o
2fd50 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a  ut of range.");.
2fd60 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
2fd70 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49  SESSION_HANDLE_I
2fd80 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 73 74  NVALID);..}...st
2fd90 61 72 74 5f 73 69 67 6e 5f 62 75 66 75 73 65 64  art_sign_bufused
2fda0 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   = cackey_sessio
2fdb0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
2fdc0 6e 5f 62 75 66 75 73 65 64 3b 0a 0a 09 73 69 67  n_bufused;...sig
2fdd0 6e 5f 72 65 74 20 3d 20 43 5f 53 69 67 6e 55 70  n_ret = C_SignUp
2fde0 64 61 74 65 28 68 53 65 73 73 69 6f 6e 2c 20 70  date(hSession, p
2fdf0 44 61 74 61 2c 20 75 6c 44 61 74 61 4c 65 6e 29  Data, ulDataLen)
2fe00 3b 0a 09 69 66 20 28 73 69 67 6e 5f 72 65 74 20  ;..if (sign_ret 
2fe10 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 43  != CKR_OK) {...C
2fe20 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2fe30 54 46 28 22 45 72 72 6f 72 2e 20 20 53 69 67 6e  TF("Error.  Sign
2fe40 55 70 64 61 74 65 28 29 20 72 65 74 75 72 6e 65  Update() returne
2fe50 64 20 66 61 69 6c 75 72 65 20 28 72 76 20 3d 20  d failure (rv = 
2fe60 25 6c 75 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65  %lu).", (unsigne
2fe70 64 20 6c 6f 6e 67 29 20 73 69 67 6e 5f 72 65 74  d long) sign_ret
2fe80 29 3b 0a 0a 09 09 69 66 20 28 73 69 67 6e 5f 72  );....if (sign_r
2fe90 65 74 20 21 3d 20 43 4b 52 5f 42 55 46 46 45 52  et != CKR_BUFFER
2fea0 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 20 7b 0a 09 09  _TOO_SMALL) {...
2feb0 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
2fec0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63  cackey_mutex_loc
2fed0 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
2fee0 29 3b 0a 09 09 09 69 66 20 28 6d 75 74 65 78 5f  );....if (mutex_
2fef0 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
2ff00 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2ff10 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
2ff20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  Locking failed."
2ff30 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 43  );......return(C
2ff40 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
2ff50 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28  );....}.....if (
2ff60 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  !cackey_sessions
2ff70 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76  [hSession].activ
2ff80 65 29 20 7b 0a 09 09 09 09 63 61 63 6b 65 79 5f  e) {.....cackey_
2ff90 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
2ffa0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
2ffb0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2ffc0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
2ffd0 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69  Session not acti
2ffe0 76 65 2e 22 29 3b 0a 09 09 0a 09 09 09 09 72 65  ve.");........re
2fff0 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e  turn(CKR_SESSION
30000 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29  _HANDLE_INVALID)
30010 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 21  ;....}.....if (!
30020 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
30030 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 61  hSession].sign_a
30040 63 74 69 76 65 29 20 7b 0a 09 09 09 09 63 61 63  ctive) {.....cac
30050 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
30060 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
30070 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  ;......CACKEY_DE
30080 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
30090 72 2e 20 20 53 69 67 6e 20 6e 6f 74 20 61 63 74  r.  Sign not act
300a0 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 09 09 72  ive.");........r
300b0 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54  eturn(CKR_OPERAT
300c0 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  ION_NOT_INITIALI
300d0 5a 45 44 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 63  ZED);....}.....c
300e0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
300f0 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 61 63  Session].sign_ac
30100 74 69 76 65 20 3d 20 30 3b 0a 0a 09 09 09 6d 75  tive = 0;.....mu
30110 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
30120 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
30130 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
30140 3b 0a 09 09 09 69 66 20 28 6d 75 74 65 78 5f 72  ;....if (mutex_r
30150 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
30160 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
30170 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55  RINTF("Error.  U
30180 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e  nlocking failed.
30190 22 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28  ");......return(
301a0 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
301b0 52 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09  R);....}...}....
301c0 72 65 74 75 72 6e 28 73 69 67 6e 5f 72 65 74 29  return(sign_ret)
301d0 3b 0a 09 7d 0a 0a 09 73 69 67 6e 5f 72 65 74 20  ;..}...sign_ret 
301e0 3d 20 43 5f 53 69 67 6e 46 69 6e 61 6c 28 68 53  = C_SignFinal(hS
301f0 65 73 73 69 6f 6e 2c 20 70 53 69 67 6e 61 74 75  ession, pSignatu
30200 72 65 2c 20 70 75 6c 53 69 67 6e 61 74 75 72 65  re, pulSignature
30210 4c 65 6e 29 3b 0a 09 69 66 20 28 73 69 67 6e 5f  Len);..if (sign_
30220 72 65 74 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b  ret != CKR_OK) {
30230 0a 09 09 69 66 20 28 73 69 67 6e 5f 72 65 74 20  ...if (sign_ret 
30240 3d 3d 20 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f  == CKR_BUFFER_TO
30250 4f 5f 53 4d 41 4c 4c 29 20 7b 0a 09 09 09 43 41  O_SMALL) {....CA
30260 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
30270 46 28 22 53 69 67 6e 46 69 6e 61 6c 28 29 20 72  F("SignFinal() r
30280 65 74 75 72 6e 65 64 20 43 4b 52 5f 42 55 46 46  eturned CKR_BUFF
30290 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 20 28 72 76  ER_TOO_SMALL (rv
302a0 20 3d 20 25 6c 75 29 2c 20 75 6e 64 6f 69 6e 67   = %lu), undoing
302b0 20 43 5f 53 69 67 6e 55 70 64 61 74 65 28 29 22   C_SignUpdate()"
302c0 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
302d0 29 20 73 69 67 6e 5f 72 65 74 29 3b 0a 0a 09 09  ) sign_ret);....
302e0 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
302f0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
30300 62 75 66 75 73 65 64 20 3d 20 73 74 61 72 74 5f  bufused = start_
30310 73 69 67 6e 5f 62 75 66 75 73 65 64 3b 0a 0a 09  sign_bufused;...
30320 09 09 72 65 74 75 72 6e 28 73 69 67 6e 5f 72 65  ..return(sign_re
30330 74 29 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45  t);...}....CACKE
30340 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
30350 45 72 72 6f 72 2e 20 20 53 69 67 6e 46 69 6e 61  Error.  SignFina
30360 6c 28 29 20 72 65 74 75 72 6e 65 64 20 66 61 69  l() returned fai
30370 6c 75 72 65 20 28 72 76 20 3d 20 25 6c 75 29 2e  lure (rv = %lu).
30380 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
30390 67 29 20 73 69 67 6e 5f 72 65 74 29 3b 0a 0a 09  g) sign_ret);...
303a0 09 72 65 74 75 72 6e 28 73 69 67 6e 5f 72 65 74  .return(sign_ret
303b0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 53 69 67  );..}...if (pSig
303c0 6e 61 74 75 72 65 20 3d 3d 20 4e 55 4c 4c 29 20  nature == NULL) 
303d0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
303e0 5f 50 52 49 4e 54 46 28 22 70 53 69 67 6e 61 74  _PRINTF("pSignat
303f0 75 72 65 20 73 70 65 63 69 66 69 65 64 20 61 73  ure specified as
30400 20 4e 55 4c 4c 2c 20 75 6e 64 6f 69 6e 67 20 43   NULL, undoing C
30410 5f 53 69 67 6e 55 70 64 61 74 65 28 29 22 29 3b  _SignUpdate()");
30420 0a 0a 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ....cackey_sessi
30430 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
30440 67 6e 5f 62 75 66 75 73 65 64 20 3d 20 73 74 61  gn_bufused = sta
30450 72 74 5f 73 69 67 6e 5f 62 75 66 75 73 65 64 3b  rt_sign_bufused;
30460 0a 0a 09 09 72 65 74 75 72 6e 28 73 69 67 6e 5f  ....return(sign_
30470 72 65 74 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ret);..}...CACKE
30480 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
30490 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b  Returning CKR_OK
304a0 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b   (%i)", CKR_OK);
304b0 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b  ...return(CKR_OK
304c0 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
304d0 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
304e0 43 5f 53 69 67 6e 55 70 64 61 74 65 29 28 43 4b  C_SignUpdate)(CK
304f0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
30500 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54  hSession, CK_BYT
30510 45 5f 50 54 52 20 70 50 61 72 74 2c 20 43 4b 5f  E_PTR pPart, CK_
30520 55 4c 4f 4e 47 20 75 6c 50 61 72 74 4c 65 6e 29  ULONG ulPartLen)
30530 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65   {..int mutex_re
30540 74 76 61 6c 3b 0a 09 69 6e 74 20 72 65 73 69 7a  tval;..int resiz
30550 65 52 65 74 72 79 3b 0a 09 69 6e 74 20 6e 65 65  eRetry;..int nee
30560 64 52 65 73 69 7a 65 3b 0a 0a 09 43 41 43 4b 45  dResize;...CACKE
30570 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
30580 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
30590 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
305a0 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
305b0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
305c0 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
305d0 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
305e0 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
305f0 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
30600 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65  D);..}...if (hSe
30610 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53  ssion == 0 || hS
30620 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f  ession >= (sizeo
30630 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
30640 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
30650 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29  ey_sessions[0]))
30660 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
30670 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
30680 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f  .  Session out o
30690 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09  f range.");.....
306a0 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
306b0 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
306c0 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 50  ID);..}...if (pP
306d0 61 72 74 20 3d 3d 20 4e 55 4c 4c 20 26 26 20 75  art == NULL && u
306e0 6c 50 61 72 74 4c 65 6e 20 3d 3d 20 30 29 20 7b  lPartLen == 0) {
306f0 0a 09 09 2f 2a 20 53 68 6f 72 74 20 63 69 72 63  .../* Short circ
30700 75 69 74 20 69 66 20 77 65 20 61 72 65 20 61 73  uit if we are as
30710 6b 65 64 20 74 6f 20 73 69 67 6e 20 6e 6f 74 68  ked to sign noth
30720 69 6e 67 2e 2e 2e 20 2a 2f 0a 09 09 43 41 43 4b  ing... */...CACK
30730 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
30740 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
30750 4b 20 28 25 69 29 20 28 73 68 6f 72 74 20 63 69  K (%i) (short ci
30760 72 63 75 69 74 29 22 2c 20 43 4b 52 5f 4f 4b 29  rcuit)", CKR_OK)
30770 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
30780 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 50  OK);..}...if (pP
30790 61 72 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  art == NULL) {..
307a0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
307b0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 50 61  INTF("Error. pPa
307c0 72 74 20 69 73 20 4e 55 4c 4c 2c 20 62 75 74 20  rt is NULL, but 
307d0 75 6c 50 61 72 74 4c 65 6e 20 69 73 20 6e 6f 74  ulPartLen is not
307e0 20 30 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e   0.");....return
307f0 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42  (CKR_ARGUMENTS_B
30800 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 6c  AD);..}...if (ul
30810 50 61 72 74 4c 65 6e 20 3d 3d 20 30 29 20 7b 0a  PartLen == 0) {.
30820 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
30830 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 75 6c  RINTF("Error. ul
30840 50 61 72 74 4c 65 6e 20 69 73 20 30 2c 20 62 75  PartLen is 0, bu
30850 74 20 70 50 61 72 74 20 69 73 20 6e 6f 74 20 4e  t pPart is not N
30860 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  ULL.");....retur
30870 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f  n(CKR_ARGUMENTS_
30880 42 41 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78  BAD);..}...mutex
30890 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
308a0 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b  _mutex_lock(cack
308b0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
308c0 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
308d0 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
308e0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
308f0 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61  ror.  Locking fa
30900 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
30910 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
30920 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  RROR);..}...if (
30930 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  !cackey_sessions
30940 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76  [hSession].activ
30950 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75  e) {...cackey_mu
30960 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
30970 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43  y_biglock);....C
30980 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
30990 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73  TF("Error.  Sess
309a0 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22  ion not active."
309b0 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
309c0 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  KR_SESSION_HANDL
309d0 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
309e0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73  .if (!cackey_ses
309f0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
30a00 73 69 67 6e 5f 61 63 74 69 76 65 29 20 7b 0a 09  sign_active) {..
30a10 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
30a20 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
30a30 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f  ock);....CACKEY_
30a40 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
30a50 72 6f 72 2e 20 20 53 69 67 6e 20 6e 6f 74 20 61  ror.  Sign not a
30a60 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72  ctive.");......r
30a70 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54  eturn(CKR_OPERAT
30a80 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  ION_NOT_INITIALI
30a90 5a 45 44 29 3b 0a 09 7d 0a 0a 09 73 77 69 74 63  ZED);..}...switc
30aa0 68 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  h (cackey_sessio
30ab0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
30ac0 6e 5f 6d 65 63 68 61 6e 69 73 6d 29 20 7b 0a 09  n_mechanism) {..
30ad0 09 63 61 73 65 20 43 4b 4d 5f 52 53 41 5f 50 4b  .case CKM_RSA_PK
30ae0 43 53 3a 0a 09 09 09 2f 2a 20 41 63 63 75 6d 75  CS:..../* Accumu
30af0 6c 61 74 65 20 64 69 72 65 63 74 6c 79 20 2a 2f  late directly */
30b00 0a 09 09 09 66 6f 72 20 28 72 65 73 69 7a 65 52  ....for (resizeR
30b10 65 74 72 79 20 3d 20 30 3b 20 72 65 73 69 7a 65  etry = 0; resize
30b20 52 65 74 72 79 20 3c 20 31 31 3b 20 72 65 73 69  Retry < 11; resi
30b30 7a 65 52 65 74 72 79 2b 2b 29 20 7b 0a 09 09 09  zeRetry++) {....
30b40 09 6e 65 65 64 52 65 73 69 7a 65 20 3d 20 30 3b  .needResize = 0;
30b50 0a 09 09 09 09 69 66 20 28 28 63 61 63 6b 65 79  .....if ((cackey
30b60 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
30b70 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65 64  on].sign_bufused
30b80 20 2b 20 75 6c 50 61 72 74 4c 65 6e 29 20 3e 20   + ulPartLen) > 
30b90 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
30ba0 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62  hSession].sign_b
30bb0 75 66 6c 65 6e 29 20 7b 0a 09 09 09 09 09 6e 65  uflen) {......ne
30bc0 65 64 52 65 73 69 7a 65 20 3d 20 31 3b 0a 09 09  edResize = 1;...
30bd0 09 09 7d 0a 0a 09 09 09 09 69 66 20 28 21 6e 65  ..}......if (!ne
30be0 65 64 52 65 73 69 7a 65 29 20 7b 0a 09 09 09 09  edResize) {.....
30bf0 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09  .break;.....}...
30c00 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
30c10 50 52 49 4e 54 46 28 22 52 65 73 69 7a 69 6e 67  PRINTF("Resizing
30c20 20 73 69 67 6e 69 6e 67 20 62 75 66 66 65 72 20   signing buffer 
30c30 28 74 72 79 20 23 25 69 20 6f 66 20 31 30 20 2d  (try #%i of 10 -
30c40 2d 20 31 31 74 68 20 69 73 20 66 61 74 61 6c 29  - 11th is fatal)
30c50 22 2c 20 72 65 73 69 7a 65 52 65 74 72 79 29 3b  ", resizeRetry);
30c60 0a 0a 09 09 09 09 69 66 20 28 72 65 73 69 7a 65  ......if (resize
30c70 52 65 74 72 79 20 3d 3d 20 31 30 29 20 7b 0a 09  Retry == 10) {..
30c80 09 09 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f  ....free(cackey_
30c90 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
30ca0 6e 5d 2e 73 69 67 6e 5f 62 75 66 29 3b 0a 0a 09  n].sign_buf);...
30cb0 09 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ....cackey_sessi
30cc0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
30cd0 67 6e 5f 62 75 66 6c 65 6e 20 3d 20 30 3b 0a 09  gn_buflen = 0;..
30ce0 09 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ....cackey_sessi
30cf0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
30d00 67 6e 5f 62 75 66 20 3d 20 4e 55 4c 4c 3b 0a 0a  gn_buf = NULL;..
30d10 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09  .....break;.....
30d20 7d 0a 0a 09 09 09 09 63 61 63 6b 65 79 5f 73 65  }......cackey_se
30d30 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
30d40 2e 73 69 67 6e 5f 62 75 66 6c 65 6e 20 2a 3d 20  .sign_buflen *= 
30d50 32 3b 0a 0a 09 09 09 09 63 61 63 6b 65 79 5f 73  2;......cackey_s
30d60 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
30d70 5d 2e 73 69 67 6e 5f 62 75 66 20 3d 20 72 65 61  ].sign_buf = rea
30d80 6c 6c 6f 63 28 63 61 63 6b 65 79 5f 73 65 73 73  lloc(cackey_sess
30d90 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
30da0 69 67 6e 5f 62 75 66 2c 20 73 69 7a 65 6f 66 28  ign_buf, sizeof(
30db0 2a 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  *cackey_sessions
30dc0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
30dd0 62 75 66 29 20 2a 20 63 61 63 6b 65 79 5f 73 65  buf) * cackey_se
30de0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
30df0 2e 73 69 67 6e 5f 62 75 66 6c 65 6e 29 3b 0a 09  .sign_buflen);..
30e00 09 09 7d 0a 0a 09 09 09 69 66 20 28 63 61 63 6b  ..}.....if (cack
30e10 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
30e20 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 20 3d  sion].sign_buf =
30e30 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 63 61  = NULL) {.....ca
30e40 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
30e50 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
30e60 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  );......CACKEY_D
30e70 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
30e80 6f 72 2e 20 20 53 69 67 6e 69 6e 67 20 62 75 66  or.  Signing buf
30e90 66 65 72 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a  fer is NULL.");.
30ea0 0a 09 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
30eb0 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
30ec0 09 09 09 7d 0a 0a 09 09 09 6d 65 6d 63 70 79 28  ...}.....memcpy(
30ed0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
30ee0 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62  hSession].sign_b
30ef0 75 66 20 2b 20 63 61 63 6b 65 79 5f 73 65 73 73  uf + cackey_sess
30f00 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
30f10 69 67 6e 5f 62 75 66 75 73 65 64 2c 20 70 50 61  ign_bufused, pPa
30f20 72 74 2c 20 75 6c 50 61 72 74 4c 65 6e 29 3b 0a  rt, ulPartLen);.
30f30 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ....cackey_sessi
30f40 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
30f50 67 6e 5f 62 75 66 75 73 65 64 20 2b 3d 20 75 6c  gn_bufused += ul
30f60 50 61 72 74 4c 65 6e 3b 0a 0a 09 09 09 62 72 65  PartLen;.....bre
30f70 61 6b 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  ak;..}...mutex_r
30f80 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
30f90 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
30fa0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
30fb0 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
30fc0 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
30fd0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
30fe0 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20  ror.  Unlocking 
30ff0 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
31000 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
31010 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41  _ERROR);..}...CA
31020 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
31030 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
31040 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f  _OK (%i)", CKR_O
31050 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  K);...return(CKR
31060 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  _OK);.}..CK_DEFI
31070 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
31080 56 2c 20 43 5f 53 69 67 6e 46 69 6e 61 6c 29 28  V, C_SignFinal)(
31090 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
310a0 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42  E hSession, CK_B
310b0 59 54 45 5f 50 54 52 20 70 53 69 67 6e 61 74 75  YTE_PTR pSignatu
310c0 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52  re, CK_ULONG_PTR
310d0 20 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e   pulSignatureLen
310e0 29 20 7b 0a 09 73 74 61 74 69 63 20 43 4b 5f 42  ) {..static CK_B
310f0 59 54 45 20 73 69 67 62 75 66 5b 31 30 32 34 5d  YTE sigbuf[1024]
31100 3b 0a 09 73 73 69 7a 65 5f 74 20 73 69 67 62 75  ;..ssize_t sigbu
31110 66 6c 65 6e 3b 0a 09 43 4b 5f 53 4c 4f 54 5f 49  flen;..CK_SLOT_I
31120 44 20 73 6c 6f 74 49 44 3b 0a 09 43 4b 5f 52 56  D slotID;..CK_RV
31130 20 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 47 45   retval = CKR_GE
31140 4e 45 52 41 4c 5f 45 52 52 4f 52 3b 0a 09 69 6e  NERAL_ERROR;..in
31150 74 20 74 65 72 6d 69 6e 61 74 65 5f 73 69 67 6e  t terminate_sign
31160 20 3d 20 31 3b 0a 09 69 6e 74 20 6d 75 74 65 78   = 1;..int mutex
31170 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45  _retval;...CACKE
31180 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
31190 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
311a0 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
311b0 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
311c0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
311d0 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
311e0 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
311f0 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
31200 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
31210 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 75 6c  D);..}...if (pul
31220 53 69 67 6e 61 74 75 72 65 4c 65 6e 20 3d 3d 20  SignatureLen == 
31230 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
31240 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
31250 72 72 6f 72 2e 20 70 75 6c 53 69 67 6e 61 74 75  rror. pulSignatu
31260 72 65 4c 65 6e 20 69 73 20 4e 55 4c 4c 2e 22 29  reLen is NULL.")
31270 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
31280 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a  ARGUMENTS_BAD);.
31290 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f  .}...if (hSessio
312a0 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69  n == 0 || hSessi
312b0 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61  on >= (sizeof(ca
312c0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f  ckey_sessions) /
312d0 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73   sizeof(cackey_s
312e0 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a  essions[0]))) {.
312f0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
31300 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
31310 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61  ession out of ra
31320 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  nge.");......ret
31330 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  urn(CKR_SESSION_
31340 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
31350 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  ..}...mutex_retv
31360 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
31370 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  x_lock(cackey_bi
31380 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
31390 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
313a0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
313b0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
313c0 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e   Locking failed.
313d0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
313e0 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
313f0 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b  ;..}...if (!cack
31400 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
31410 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a  sion].active) {.
31420 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
31430 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
31440 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59  lock);....CACKEY
31450 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
31460 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e  rror.  Session n
31470 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09  ot active.");...
31480 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
31490 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56  SSION_HANDLE_INV
314a0 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  ALID);..}...if (
314b0 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  !cackey_sessions
314c0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
314d0 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b  active) {...cack
314e0 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
314f0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
31500 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
31510 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
31520 20 53 69 67 6e 20 6e 6f 74 20 61 63 74 69 76 65   Sign not active
31530 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
31540 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e  (CKR_OPERATION_N
31550 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
31560 0a 09 7d 0a 0a 09 73 6c 6f 74 49 44 20 3d 20 63  ..}...slotID = c
31570 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
31580 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44 3b  Session].slotID;
31590 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44 20 3c 20  ...if (slotID < 
315a0 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28  0 || slotID >= (
315b0 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
315c0 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ots) / sizeof(ca
315d0 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29  ckey_slots[0])))
315e0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
315f0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
31600 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65   Invalid slot re
31610 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 6f  quested (%lu), o
31620 75 74 73 69 64 65 20 6f 66 20 76 61 6c 69 64 20  utside of valid 
31630 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b  range", slotID);
31640 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
31650 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
31660 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73  }...if (cackey_s
31670 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74  lots[slotID].act
31680 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41  ive == 0) {...CA
31690 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
316a0 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69  F("Error. Invali
316b0 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64  d slot requested
316c0 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74   (%lu), slot not
316d0 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76   currently activ
316e0 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09  e", slotID);....
316f0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
31700 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
31710 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  ck);....return(C
31720 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
31730 29 3b 0a 09 7d 0a 0a 09 73 77 69 74 63 68 20 28  );..}...switch (
31740 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
31750 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 6d  hSession].sign_m
31760 65 63 68 61 6e 69 73 6d 29 20 7b 0a 09 09 63 61  echanism) {...ca
31770 73 65 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 3a  se CKM_RSA_PKCS:
31780 0a 09 09 09 2f 2a 20 41 73 6b 20 63 61 72 64 20  ..../* Ask card 
31790 74 6f 20 73 69 67 6e 20 2a 2f 0a 09 09 09 43 41  to sign */....CA
317a0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
317b0 46 28 22 41 73 6b 69 6e 67 20 74 6f 20 73 69 67  F("Asking to sig
317c0 6e 20 66 72 6f 6d 20 69 64 65 6e 74 69 74 79 20  n from identity 
317d0 25 70 20 69 6e 20 73 65 73 73 69 6f 6e 20 25 6c  %p in session %l
317e0 75 22 2c 20 28 76 6f 69 64 20 2a 29 20 63 61 63  u", (void *) cac
317f0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
31800 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 69 64 65 6e  ssion].sign_iden
31810 74 69 74 79 2c 20 28 75 6e 73 69 67 6e 65 64 20  tity, (unsigned 
31820 6c 6f 6e 67 29 20 68 53 65 73 73 69 6f 6e 29 3b  long) hSession);
31830 0a 09 09 09 73 69 67 62 75 66 6c 65 6e 20 3d 20  ....sigbuflen = 
31840 63 61 63 6b 65 79 5f 73 69 67 6e 64 65 63 72 79  cackey_signdecry
31850 70 74 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73  pt(&cackey_slots
31860 5b 73 6c 6f 74 49 44 5d 2c 20 63 61 63 6b 65 79  [slotID], cackey
31870 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
31880 6f 6e 5d 2e 73 69 67 6e 5f 69 64 65 6e 74 69 74  on].sign_identit
31890 79 2c 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  y, cackey_sessio
318a0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
318b0 6e 5f 62 75 66 2c 20 63 61 63 6b 65 79 5f 73 65  n_buf, cackey_se
318c0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
318d0 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 2c 20 73  .sign_bufused, s
318e0 69 67 62 75 66 2c 20 73 69 7a 65 6f 66 28 73 69  igbuf, sizeof(si
318f0 67 62 75 66 29 2c 20 31 2c 20 30 29 3b 0a 0a 09  gbuf), 1, 0);...
31900 09 09 69 66 20 28 73 69 67 62 75 66 6c 65 6e 20  ..if (sigbuflen 
31910 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  == CACKEY_PCSC_E
31920 5f 4e 45 45 44 4c 4f 47 49 4e 20 26 26 20 63 61  _NEEDLOGIN && ca
31930 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64  ckey_pin_command
31940 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09   != NULL) {.....
31950 69 66 20 28 43 5f 4c 6f 67 69 6e 4d 75 74 65 78  if (C_LoginMutex
31960 41 72 67 28 68 53 65 73 73 69 6f 6e 2c 20 43 4b  Arg(hSession, CK
31970 55 5f 55 53 45 52 2c 20 4e 55 4c 4c 2c 20 30 2c  U_USER, NULL, 0,
31980 20 30 29 20 3d 3d 20 43 4b 52 5f 4f 4b 29 20 7b   0) == CKR_OK) {
31990 0a 09 09 09 09 09 73 69 67 62 75 66 6c 65 6e 20  ......sigbuflen 
319a0 3d 20 63 61 63 6b 65 79 5f 73 69 67 6e 64 65 63  = cackey_signdec
319b0 72 79 70 74 28 26 63 61 63 6b 65 79 5f 73 6c 6f  rypt(&cackey_slo
319c0 74 73 5b 73 6c 6f 74 49 44 5d 2c 20 63 61 63 6b  ts[slotID], cack
319d0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
319e0 73 69 6f 6e 5d 2e 73 69 67 6e 5f 69 64 65 6e 74  sion].sign_ident
319f0 69 74 79 2c 20 63 61 63 6b 65 79 5f 73 65 73 73  ity, cackey_sess
31a00 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
31a10 69 67 6e 5f 62 75 66 2c 20 63 61 63 6b 65 79 5f  ign_buf, cackey_
31a20 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
31a30 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 2c  n].sign_bufused,
31a40 20 73 69 67 62 75 66 2c 20 73 69 7a 65 6f 66 28   sigbuf, sizeof(
31a50 73 69 67 62 75 66 29 2c 20 31 2c 20 30 29 3b 0a  sigbuf), 1, 0);.
31a60 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 09 69  ....}....}.....i
31a70 66 20 28 73 69 67 62 75 66 6c 65 6e 20 3c 20 30  f (sigbuflen < 0
31a80 29 20 7b 0a 09 09 09 09 2f 2a 20 53 69 67 6e 69  ) {...../* Signi
31a90 6e 67 20 66 61 69 6c 65 64 2e 20 2a 2f 0a 09 09  ng failed. */...
31aa0 09 09 69 66 20 28 73 69 67 62 75 66 6c 65 6e 20  ..if (sigbuflen 
31ab0 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  == CACKEY_PCSC_E
31ac0 5f 4e 45 45 44 4c 4f 47 49 4e 29 20 7b 0a 09 09  _NEEDLOGIN) {...
31ad0 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f  ...retval = CKR_
31ae0 55 53 45 52 5f 4e 4f 54 5f 4c 4f 47 47 45 44 5f  USER_NOT_LOGGED_
31af0 49 4e 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 69  IN;.....} else i
31b00 66 20 28 73 69 67 62 75 66 6c 65 6e 20 3d 3d 20  f (sigbuflen == 
31b10 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f  CACKEY_PCSC_E_TO
31b20 4b 45 4e 41 42 53 45 4e 54 29 20 7b 0a 09 09 09  KENABSENT) {....
31b30 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 44  ..retval = CKR_D
31b40 45 56 49 43 45 5f 52 45 4d 4f 56 45 44 3b 0a 09  EVICE_REMOVED;..
31b50 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09  ...} else {.....
31b60 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 47 45  .retval = CKR_GE
31b70 4e 45 52 41 4c 5f 45 52 52 4f 52 3b 0a 09 09 09  NERAL_ERROR;....
31b80 09 7d 0a 09 09 09 7d 20 65 6c 73 65 20 69 66 20  .}....} else if 
31b90 28 28 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  (((unsigned long
31ba0 29 20 73 69 67 62 75 66 6c 65 6e 29 20 3e 20 2a  ) sigbuflen) > *
31bb0 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 20  pulSignatureLen 
31bc0 26 26 20 70 53 69 67 6e 61 74 75 72 65 29 20 7b  && pSignature) {
31bd0 0a 09 09 09 09 2f 2a 20 53 69 67 6e 65 64 20 64  ...../* Signed d
31be0 61 74 61 20 74 6f 6f 20 6c 61 72 67 65 20 2a 2f  ata too large */
31bf0 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
31c00 47 5f 50 52 49 4e 54 46 28 22 72 65 74 76 61 6c  G_PRINTF("retval
31c10 20 3d 20 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f   = CKR_BUFFER_TO
31c20 4f 5f 53 4d 41 4c 4c 3b 20 20 73 69 67 62 75 66  O_SMALL;  sigbuf
31c30 6c 65 6e 20 3d 20 25 6c 75 2c 20 70 75 6c 53 69  len = %lu, pulSi
31c40 67 6e 61 74 75 72 65 4c 65 6e 20 3d 20 25 6c 75  gnatureLen = %lu
31c50 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
31c60 67 29 20 73 69 67 62 75 66 6c 65 6e 2c 20 28 75  g) sigbuflen, (u
31c70 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 70  nsigned long) *p
31c80 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 29 3b  ulSignatureLen);
31c90 0a 0a 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43  ......retval = C
31ca0 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d  KR_BUFFER_TOO_SM
31cb0 41 4c 4c 3b 0a 0a 09 09 09 09 74 65 72 6d 69 6e  ALL;......termin
31cc0 61 74 65 5f 73 69 67 6e 20 3d 20 30 3b 0a 09 09  ate_sign = 0;...
31cd0 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 74 65  .} else {.....te
31ce0 72 6d 69 6e 61 74 65 5f 73 69 67 6e 20 3d 20 30  rminate_sign = 0
31cf0 3b 0a 0a 09 09 09 09 69 66 20 28 70 53 69 67 6e  ;......if (pSign
31d00 61 74 75 72 65 29 20 7b 0a 09 09 09 09 09 6d 65  ature) {......me
31d10 6d 63 70 79 28 70 53 69 67 6e 61 74 75 72 65 2c  mcpy(pSignature,
31d20 20 73 69 67 62 75 66 2c 20 73 69 67 62 75 66 6c   sigbuf, sigbufl
31d30 65 6e 29 3b 0a 0a 09 09 09 09 09 74 65 72 6d 69  en);.......termi
31d40 6e 61 74 65 5f 73 69 67 6e 20 3d 20 31 3b 0a 09  nate_sign = 1;..
31d50 09 09 09 7d 0a 0a 09 09 09 09 2a 70 75 6c 53 69  ...}......*pulSi
31d60 67 6e 61 74 75 72 65 4c 65 6e 20 3d 20 73 69 67  gnatureLen = sig
31d70 62 75 66 6c 65 6e 3b 0a 0a 09 09 09 09 72 65 74  buflen;......ret
31d80 76 61 6c 20 3d 20 43 4b 52 5f 4f 4b 3b 0a 09 09  val = CKR_OK;...
31d90 09 7d 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 7d  .}.....break;..}
31da0 0a 0a 09 69 66 20 28 74 65 72 6d 69 6e 61 74 65  ...if (terminate
31db0 5f 73 69 67 6e 29 20 7b 0a 09 09 69 66 20 28 63  _sign) {...if (c
31dc0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
31dd0 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75  Session].sign_bu
31de0 66 29 20 7b 0a 09 09 09 66 72 65 65 28 63 61 63  f) {....free(cac
31df0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
31e00 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 29  ssion].sign_buf)
31e10 3b 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f  ;...}....cackey_
31e20 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
31e30 6e 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65 20 3d  n].sign_active =
31e40 20 30 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72   0;..}...mutex_r
31e50 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
31e60 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
31e70 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
31e80 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
31e90 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
31ea0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
31eb0 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20  ror.  Unlocking 
31ec0 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
31ed0 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
31ee0 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41  _ERROR);..}...CA
31ef0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
31f00 46 28 22 52 65 74 75 72 6e 69 6e 67 20 25 69 22  F("Returning %i"
31f10 2c 20 28 69 6e 74 29 20 72 65 74 76 61 6c 29 3b  , (int) retval);
31f20 0a 0a 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c  ...return(retval
31f30 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
31f40 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
31f50 43 5f 53 69 67 6e 52 65 63 6f 76 65 72 49 6e 69  C_SignRecoverIni
31f60 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  t)(CK_SESSION_HA
31f70 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
31f80 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20  K_MECHANISM_PTR 
31f90 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f  pMechanism, CK_O
31fa0 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65  BJECT_HANDLE hKe
31fb0 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  y) {..CACKEY_DEB
31fc0 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
31fd0 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
31fe0 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
31ff0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
32000 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
32010 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
32020 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
32030 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
32040 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
32050 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
32060 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
32070 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
32080 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
32090 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
320a0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
320b0 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
320c0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
320d0 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  ORTED);.}..CK_DE
320e0 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
320f0 5f 52 56 2c 20 43 5f 53 69 67 6e 52 65 63 6f 76  _RV, C_SignRecov
32100 65 72 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  er)(CK_SESSION_H
32110 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
32120 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 44 61 74  CK_BYTE_PTR pDat
32130 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 44 61  a, CK_ULONG ulDa
32140 74 61 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  taLen, CK_BYTE_P
32150 54 52 20 70 53 69 67 6e 61 74 75 72 65 2c 20 43  TR pSignature, C
32160 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 53  K_ULONG_PTR pulS
32170 69 67 6e 61 74 75 72 65 4c 65 6e 29 20 7b 0a 09  ignatureLen) {..
32180 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
32190 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
321a0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
321b0 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
321c0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
321d0 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
321e0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
321f0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
32200 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
32210 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
32220 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
32230 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
32240 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
32250 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
32260 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
32270 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
32280 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
32290 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
322a0 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
322b0 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
322c0 5f 56 65 72 69 66 79 49 6e 69 74 29 28 43 4b 5f  _VerifyInit)(CK_
322d0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
322e0 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48  Session, CK_MECH
322f0 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61  ANISM_PTR pMecha
32300 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f  nism, CK_OBJECT_
32310 48 41 4e 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09  HANDLE hKey) {..
32320 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
32330 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
32340 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
32350 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
32360 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
32370 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
32380 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
32390 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
323a0 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
323b0 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
323c0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
323d0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
323e0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
323f0 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
32400 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
32410 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
32420 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
32430 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
32440 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
32450 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
32460 5f 56 65 72 69 66 79 29 28 43 4b 5f 53 45 53 53  _Verify)(CK_SESS
32470 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
32480 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  ion, CK_BYTE_PTR
32490 20 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47   pData, CK_ULONG
324a0 20 75 6c 44 61 74 61 4c 65 6e 2c 20 43 4b 5f 42   ulDataLen, CK_B
324b0 59 54 45 5f 50 54 52 20 70 53 69 67 6e 61 74 75  YTE_PTR pSignatu
324c0 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 53  re, CK_ULONG ulS
324d0 69 67 6e 61 74 75 72 65 4c 65 6e 29 20 7b 0a 09  ignatureLen) {..
324e0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
324f0 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
32500 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
32510 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
32520 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
32530 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
32540 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
32550 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
32560 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
32570 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
32580 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
32590 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
325a0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
325b0 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
325c0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
325d0 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
325e0 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
325f0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
32600 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
32610 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
32620 5f 56 65 72 69 66 79 55 70 64 61 74 65 29 28 43  _VerifyUpdate)(C
32630 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
32640 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59   hSession, CK_BY
32650 54 45 5f 50 54 52 20 70 50 61 72 74 2c 20 43 4b  TE_PTR pPart, CK
32660 5f 55 4c 4f 4e 47 20 75 6c 50 61 72 74 4c 65 6e  _ULONG ulPartLen
32670 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
32680 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
32690 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
326a0 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
326b0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
326c0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
326d0 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
326e0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
326f0 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
32700 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
32710 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
32720 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
32730 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
32740 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
32750 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
32760 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
32770 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
32780 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
32790 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
327a0 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
327b0 52 56 2c 20 43 5f 56 65 72 69 66 79 46 69 6e 61  RV, C_VerifyFina
327c0 6c 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  l)(CK_SESSION_HA
327d0 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
327e0 4b 5f 42 59 54 45 5f 50 54 52 20 70 53 69 67 6e  K_BYTE_PTR pSign
327f0 61 74 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20  ature, CK_ULONG 
32800 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 29 20  ulSignatureLen) 
32810 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
32820 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
32830 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
32840 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
32850 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
32860 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
32870 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
32880 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
32890 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
328a0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
328b0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
328c0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
328d0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
328e0 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
328f0 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
32900 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
32910 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
32920 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
32930 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
32940 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
32950 2c 20 43 5f 56 65 72 69 66 79 52 65 63 6f 76 65  , C_VerifyRecove
32960 72 49 6e 69 74 29 28 43 4b 5f 53 45 53 53 49 4f  rInit)(CK_SESSIO
32970 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
32980 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f  n, CK_MECHANISM_
32990 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20  PTR pMechanism, 
329a0 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45  CK_OBJECT_HANDLE
329b0 20 68 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59   hKey) {..CACKEY
329c0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
329d0 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
329e0 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
329f0 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
32a00 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
32a10 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
32a20 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
32a30 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
32a40 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
32a50 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
32a60 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
32a70 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
32a80 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
32a90 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
32aa0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
32ab0 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
32ac0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
32ad0 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
32ae0 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
32af0 4e 28 43 4b 5f 52 56 2c 20 43 5f 56 65 72 69 66  N(CK_RV, C_Verif
32b00 79 52 65 63 6f 76 65 72 29 28 43 4b 5f 53 45 53  yRecover)(CK_SES
32b10 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
32b20 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  sion, CK_BYTE_PT
32b30 52 20 70 53 69 67 6e 61 74 75 72 65 2c 20 43 4b  R pSignature, CK
32b40 5f 55 4c 4f 4e 47 20 75 6c 53 69 67 6e 61 74 75  _ULONG ulSignatu
32b50 72 65 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  reLen, CK_BYTE_P
32b60 54 52 20 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f  TR pData, CK_ULO
32b70 4e 47 5f 50 54 52 20 70 75 6c 44 61 74 61 4c 65  NG_PTR pulDataLe
32b80 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  n) {..CACKEY_DEB
32b90 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
32ba0 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
32bb0 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
32bc0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
32bd0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
32be0 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
32bf0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
32c00 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
32c10 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
32c20 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
32c30 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
32c40 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
32c50 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
32c60 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
32c70 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
32c80 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
32c90 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
32ca0 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  ORTED);.}..CK_DE
32cb0 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
32cc0 5f 52 56 2c 20 43 5f 44 69 67 65 73 74 45 6e 63  _RV, C_DigestEnc
32cd0 72 79 70 74 55 70 64 61 74 65 29 28 43 4b 5f 53  ryptUpdate)(CK_S
32ce0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
32cf0 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f  ession, CK_BYTE_
32d00 50 54 52 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c  PTR pPart, CK_UL
32d10 4f 4e 47 20 75 6c 50 61 72 74 4c 65 6e 2c 20 43  ONG ulPartLen, C
32d20 4b 5f 42 59 54 45 5f 50 54 52 20 70 45 6e 63 72  K_BYTE_PTR pEncr
32d30 79 70 74 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c  yptedPart, CK_UL
32d40 4f 4e 47 5f 50 54 52 20 70 75 6c 45 6e 63 72 79  ONG_PTR pulEncry
32d50 70 74 65 64 50 61 72 74 4c 65 6e 29 20 7b 0a 09  ptedPartLen) {..
32d60 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
32d70 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
32d80 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
32d90 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
32da0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
32db0 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
32dc0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
32dd0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
32de0 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
32df0 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
32e00 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
32e10 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
32e20 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
32e30 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
32e40 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
32e50 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
32e60 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
32e70 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
32e80 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
32e90 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
32ea0 5f 44 65 63 72 79 70 74 44 69 67 65 73 74 55 70  _DecryptDigestUp
32eb0 64 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e  date)(CK_SESSION
32ec0 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
32ed0 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 45  , CK_BYTE_PTR pE
32ee0 6e 63 72 79 70 74 65 64 50 61 72 74 2c 20 43 4b  ncryptedPart, CK
32ef0 5f 55 4c 4f 4e 47 20 75 6c 45 6e 63 72 79 70 74  _ULONG ulEncrypt
32f00 65 64 50 61 72 74 4c 65 6e 2c 20 43 4b 5f 42 59  edPartLen, CK_BY
32f10 54 45 5f 50 54 52 20 70 50 61 72 74 2c 20 43 4b  TE_PTR pPart, CK
32f20 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 50 61  _ULONG_PTR pulPa
32f30 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59  rtLen) {..CACKEY
32f40 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
32f50 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
32f60 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
32f70 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
32f80 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
32f90 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
32fa0 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
32fb0 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
32fc0 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
32fd0 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
32fe0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
32ff0 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
33000 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
33010 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
33020 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
33030 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
33040 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
33050 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
33060 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
33070 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 69 67 6e 45  N(CK_RV, C_SignE
33080 6e 63 72 79 70 74 55 70 64 61 74 65 29 28 43 4b  ncryptUpdate)(CK
33090 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
330a0 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54  hSession, CK_BYT
330b0 45 5f 50 54 52 20 70 50 61 72 74 2c 20 43 4b 5f  E_PTR pPart, CK_
330c0 55 4c 4f 4e 47 20 75 6c 50 61 72 74 4c 65 6e 2c  ULONG ulPartLen,
330d0 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 45 6e   CK_BYTE_PTR pEn
330e0 63 72 79 70 74 65 64 50 61 72 74 2c 20 43 4b 5f  cryptedPart, CK_
330f0 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 45 6e 63  ULONG_PTR pulEnc
33100 72 79 70 74 65 64 50 61 72 74 4c 65 6e 29 20 7b  ryptedPartLen) {
33110 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
33120 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
33130 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
33140 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
33150 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
33160 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
33170 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
33180 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
33190 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
331a0 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
331b0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
331c0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
331d0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
331e0 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
331f0 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
33200 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
33210 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
33220 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
33230 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
33240 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
33250 20 43 5f 44 65 63 72 79 70 74 56 65 72 69 66 79   C_DecryptVerify
33260 55 70 64 61 74 65 29 28 43 4b 5f 53 45 53 53 49  Update)(CK_SESSI
33270 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
33280 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  on, CK_BYTE_PTR 
33290 70 45 6e 63 72 79 70 74 65 64 50 61 72 74 2c 20  pEncryptedPart, 
332a0 43 4b 5f 55 4c 4f 4e 47 20 75 6c 45 6e 63 72 79  CK_ULONG ulEncry
332b0 70 74 65 64 50 61 72 74 4c 65 6e 2c 20 43 4b 5f  ptedPartLen, CK_
332c0 42 59 54 45 5f 50 54 52 20 70 50 61 72 74 2c 20  BYTE_PTR pPart, 
332d0 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c  CK_ULONG_PTR pul
332e0 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b  PartLen) {..CACK
332f0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
33300 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
33310 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
33320 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
33330 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
33340 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
33350 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
33360 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
33370 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
33380 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
33390 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
333a0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
333b0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
333c0 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
333d0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
333e0 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
333f0 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
33400 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
33410 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
33420 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 6e  ION(CK_RV, C_Gen
33430 65 72 61 74 65 4b 65 79 29 28 43 4b 5f 53 45 53  erateKey)(CK_SES
33440 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
33450 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49  sion, CK_MECHANI
33460 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73  SM_PTR pMechanis
33470 6d 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f  m, CK_ATTRIBUTE_
33480 50 54 52 20 70 54 65 6d 70 6c 61 74 65 2c 20 43  PTR pTemplate, C
33490 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e 74 2c  K_ULONG ulCount,
334a0 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c   CK_OBJECT_HANDL
334b0 45 5f 50 54 52 20 70 68 4b 65 79 29 20 7b 0a 09  E_PTR phKey) {..
334c0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
334d0 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
334e0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
334f0 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
33500 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
33510 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
33520 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
33530 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
33540 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
33550 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
33560 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
33570 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
33580 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
33590 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
335a0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
335b0 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
335c0 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
335d0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
335e0 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
335f0 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
33600 5f 47 65 6e 65 72 61 74 65 4b 65 79 50 61 69 72  _GenerateKeyPair
33610 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
33620 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
33630 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70  _MECHANISM_PTR p
33640 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 41 54  Mechanism, CK_AT
33650 54 52 49 42 55 54 45 5f 50 54 52 20 70 50 75 62  TRIBUTE_PTR pPub
33660 6c 69 63 4b 65 79 54 65 6d 70 6c 61 74 65 2c 20  licKeyTemplate, 
33670 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 75 62 6c 69  CK_ULONG ulPubli
33680 63 4b 65 79 41 74 74 72 69 62 75 74 65 43 6f 75  cKeyAttributeCou
33690 6e 74 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45  nt, CK_ATTRIBUTE
336a0 5f 50 54 52 20 70 50 72 69 76 61 74 65 4b 65 79  _PTR pPrivateKey
336b0 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f  Template, CK_ULO
336c0 4e 47 20 75 6c 50 72 69 76 61 74 65 4b 65 79 41  NG ulPrivateKeyA
336d0 74 74 72 69 62 75 74 65 43 6f 75 6e 74 2c 20 43  ttributeCount, C
336e0 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f  K_OBJECT_HANDLE_
336f0 50 54 52 20 70 68 50 75 62 6c 69 63 4b 65 79 2c  PTR phPublicKey,
33700 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c   CK_OBJECT_HANDL
33710 45 5f 50 54 52 20 70 68 50 72 69 76 61 74 65 4b  E_PTR phPrivateK
33720 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  ey) {..CACKEY_DE
33730 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
33740 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
33750 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
33760 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
33770 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
33780 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
33790 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
337a0 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
337b0 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
337c0 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
337d0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
337e0 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
337f0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
33800 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
33810 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
33820 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
33830 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
33840 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
33850 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
33860 4b 5f 52 56 2c 20 43 5f 57 72 61 70 4b 65 79 29  K_RV, C_WrapKey)
33870 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
33880 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
33890 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d  MECHANISM_PTR pM
338a0 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a  echanism, CK_OBJ
338b0 45 43 54 5f 48 41 4e 44 4c 45 20 68 57 72 61 70  ECT_HANDLE hWrap
338c0 70 69 6e 67 4b 65 79 2c 20 43 4b 5f 4f 42 4a 45  pingKey, CK_OBJE
338d0 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79 2c 20  CT_HANDLE hKey, 
338e0 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 57 72 61  CK_BYTE_PTR pWra
338f0 70 70 65 64 4b 65 79 2c 20 43 4b 5f 55 4c 4f 4e  ppedKey, CK_ULON
33900 47 5f 50 54 52 20 70 75 6c 57 72 61 70 70 65 64  G_PTR pulWrapped
33910 4b 65 79 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45  KeyLen) {..CACKE
33920 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
33930 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
33940 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
33950 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
33960 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
33970 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
33980 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
33990 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
339a0 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
339b0 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
339c0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
339d0 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
339e0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
339f0 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
33a00 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
33a10 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
33a20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
33a30 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
33a40 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
33a50 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 55 6e 77 72  ON(CK_RV, C_Unwr
33a60 61 70 4b 65 79 29 28 43 4b 5f 53 45 53 53 49 4f  apKey)(CK_SESSIO
33a70 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
33a80 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f  n, CK_MECHANISM_
33a90 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20  PTR pMechanism, 
33aa0 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45  CK_OBJECT_HANDLE
33ab0 20 68 55 6e 77 72 61 70 70 69 6e 67 4b 65 79 2c   hUnwrappingKey,
33ac0 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 57 72   CK_BYTE_PTR pWr
33ad0 61 70 70 65 64 4b 65 79 2c 20 43 4b 5f 55 4c 4f  appedKey, CK_ULO
33ae0 4e 47 20 75 6c 57 72 61 70 70 65 64 4b 65 79 4c  NG ulWrappedKeyL
33af0 65 6e 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45  en, CK_ATTRIBUTE
33b00 5f 50 54 52 20 70 54 65 6d 70 6c 61 74 65 2c 20  _PTR pTemplate, 
33b10 43 4b 5f 55 4c 4f 4e 47 20 75 6c 41 74 74 72 69  CK_ULONG ulAttri
33b20 62 75 74 65 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42  buteCount, CK_OB
33b30 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20  JECT_HANDLE_PTR 
33b40 70 68 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59  phKey) {..CACKEY
33b50 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
33b60 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
33b70 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
33b80 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
33b90 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
33ba0 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
33bb0 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
33bc0 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
33bd0 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
33be0 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
33bf0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
33c00 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
33c10 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
33c20 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
33c30 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
33c40 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
33c50 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
33c60 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
33c70 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
33c80 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65 72 69 76  N(CK_RV, C_Deriv
33c90 65 4b 65 79 29 28 43 4b 5f 53 45 53 53 49 4f 4e  eKey)(CK_SESSION
33ca0 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
33cb0 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50  , CK_MECHANISM_P
33cc0 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43  TR pMechanism, C
33cd0 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20  K_OBJECT_HANDLE 
33ce0 68 42 61 73 65 4b 65 79 2c 20 43 4b 5f 41 54 54  hBaseKey, CK_ATT
33cf0 52 49 42 55 54 45 5f 50 54 52 20 70 54 65 6d 70  RIBUTE_PTR pTemp
33d00 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  late, CK_ULONG u
33d10 6c 41 74 74 72 69 62 75 74 65 43 6f 75 6e 74 2c  lAttributeCount,
33d20 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c   CK_OBJECT_HANDL
33d30 45 5f 50 54 52 20 70 68 4b 65 79 29 20 7b 0a 09  E_PTR phKey) {..
33d40 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
33d50 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
33d60 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
33d70 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
33d80 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
33d90 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
33da0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
33db0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
33dc0 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
33dd0 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
33de0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
33df0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
33e00 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
33e10 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
33e20 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
33e30 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
33e40 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
33e50 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
33e60 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
33e70 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
33e80 5f 53 65 65 64 52 61 6e 64 6f 6d 29 28 43 4b 5f  _SeedRandom)(CK_
33e90 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
33ea0 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45  Session, CK_BYTE
33eb0 5f 50 54 52 20 70 53 65 65 64 2c 20 43 4b 5f 55  _PTR pSeed, CK_U
33ec0 4c 4f 4e 47 20 75 6c 53 65 65 64 4c 65 6e 29 20  LONG ulSeedLen) 
33ed0 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
33ee0 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
33ef0 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
33f00 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
33f10 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
33f20 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
33f30 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
33f40 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
33f50 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
33f60 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
33f70 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
33f80 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
33f90 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
33fa0 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
33fb0 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
33fc0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
33fd0 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
33fe0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
33ff0 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
34000 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
34010 2c 20 43 5f 47 65 6e 65 72 61 74 65 52 61 6e 64  , C_GenerateRand
34020 6f 6d 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  om)(CK_SESSION_H
34030 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
34040 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 52 61 6e  CK_BYTE_PTR pRan
34050 64 6f 6d 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e  domData, CK_ULON
34060 47 20 75 6c 52 61 6e 64 6f 6d 4c 65 6e 29 20 7b  G ulRandomLen) {
34070 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
34080 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
34090 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
340a0 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
340b0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
340c0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
340d0 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
340e0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
340f0 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
34100 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
34110 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
34120 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
34130 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
34140 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
34150 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
34160 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
34170 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
34180 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
34190 44 29 3b 0a 7d 0a 0a 2f 2a 20 44 65 70 72 65 63  D);.}../* Deprec
341a0 61 74 65 64 20 46 75 6e 63 74 69 6f 6e 20 2a 2f  ated Function */
341b0 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
341c0 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74  ION(CK_RV, C_Get
341d0 46 75 6e 63 74 69 6f 6e 53 74 61 74 75 73 29 28  FunctionStatus)(
341e0 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
341f0 45 20 68 53 65 73 73 69 6f 6e 29 20 7b 0a 09 43  E hSession) {..C
34200 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
34210 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
34220 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
34230 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
34240 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
34250 5f 50 41 52 41 4c 4c 45 4c 20 28 25 69 29 22 2c  _PARALLEL (%i)",
34260 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
34270 54 5f 50 41 52 41 4c 4c 45 4c 29 3b 0a 0a 09 72  T_PARALLEL);...r
34280 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
34290 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c 29  ON_NOT_PARALLEL)
342a0 3b 0a 0a 09 68 53 65 73 73 69 6f 6e 20 3d 20 68  ;...hSession = h
342b0 53 65 73 73 69 6f 6e 3b 20 2f 2a 20 53 75 70 72  Session; /* Supr
342c0 65 73 73 20 75 6e 75 73 65 64 20 76 61 72 69 61  ess unused varia
342d0 62 6c 65 20 77 61 72 6e 69 6e 67 20 2a 2f 0a 7d  ble warning */.}
342e0 0a 0a 2f 2a 20 44 65 70 72 65 63 61 74 65 64 20  ../* Deprecated 
342f0 46 75 6e 63 74 69 6f 6e 20 2a 2f 0a 43 4b 5f 44  Function */.CK_D
34300 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
34310 4b 5f 52 56 2c 20 43 5f 43 61 6e 63 65 6c 46 75  K_RV, C_CancelFu
34320 6e 63 74 69 6f 6e 29 28 43 4b 5f 53 45 53 53 49  nction)(CK_SESSI
34330 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
34340 6f 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  on) {..CACKEY_DE
34350 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
34360 65 64 2e 22 29 3b 0a 0a 09 43 41 43 4b 45 59 5f  ed.");...CACKEY_
34370 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
34380 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
34390 54 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45  TION_NOT_PARALLE
343a0 4c 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  L (%i)", CKR_FUN
343b0 43 54 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c  CTION_NOT_PARALL
343c0 45 4c 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  EL);...return(CK
343d0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 50  R_FUNCTION_NOT_P
343e0 41 52 41 4c 4c 45 4c 29 3b 0a 0a 09 68 53 65 73  ARALLEL);...hSes
343f0 73 69 6f 6e 20 3d 20 68 53 65 73 73 69 6f 6e 3b  sion = hSession;
34400 20 2f 2a 20 53 75 70 72 65 73 73 20 75 6e 75 73   /* Supress unus
34410 65 64 20 76 61 72 69 61 62 6c 65 20 77 61 72 6e  ed variable warn
34420 69 6e 67 20 2a 2f 0a 7d 0a 0a 43 4b 5f 44 45 46  ing */.}..CK_DEF
34430 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
34440 52 56 2c 20 43 5f 47 65 74 46 75 6e 63 74 69 6f  RV, C_GetFunctio
34450 6e 4c 69 73 74 29 28 43 4b 5f 46 55 4e 43 54 49  nList)(CK_FUNCTI
34460 4f 4e 5f 4c 49 53 54 5f 50 54 52 5f 50 54 52 20  ON_LIST_PTR_PTR 
34470 70 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 29 20  ppFunctionList) 
34480 7b 0a 09 73 74 61 74 69 63 20 43 4b 5f 46 55 4e  {..static CK_FUN
34490 43 54 49 4f 4e 5f 4c 49 53 54 5f 50 54 52 20 73  CTION_LIST_PTR s
344a0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 20 3d 20  pFunctionList = 
344b0 4e 55 4c 4c 3b 0a 09 43 4b 5f 46 55 4e 43 54 49  NULL;..CK_FUNCTI
344c0 4f 4e 5f 4c 49 53 54 5f 50 54 52 20 70 46 75 6e  ON_LIST_PTR pFun
344d0 63 74 69 6f 6e 4c 69 73 74 3b 0a 0a 09 43 41 43  ctionList;...CAC
344e0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
344f0 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
34500 66 20 28 70 70 46 75 6e 63 74 69 6f 6e 4c 69 73  f (ppFunctionLis
34510 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  t == NULL) {...C
34520 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
34530 54 46 28 22 45 72 72 6f 72 2e 20 70 70 46 75 6e  TF("Error. ppFun
34540 63 74 69 6f 6e 4c 69 73 74 20 69 73 20 4e 55 4c  ctionList is NUL
34550 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  L.");....return(
34560 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41  CKR_ARGUMENTS_BA
34570 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 70 46  D);..}...if (spF
34580 75 6e 63 74 69 6f 6e 4c 69 73 74 20 21 3d 20 4e  unctionList != N
34590 55 4c 4c 29 20 7b 0a 09 09 2a 70 70 46 75 6e 63  ULL) {...*ppFunc
345a0 74 69 6f 6e 4c 69 73 74 20 3d 20 73 70 46 75 6e  tionList = spFun
345b0 63 74 69 6f 6e 4c 69 73 74 3b 0a 0a 09 09 43 41  ctionList;....CA
345c0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
345d0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
345e0 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f  _OK (%i)", CKR_O
345f0 4b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  K);....return(CK
34600 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 70 46 75 6e  R_OK);..}...pFun
34610 63 74 69 6f 6e 4c 69 73 74 20 3d 20 6d 61 6c 6c  ctionList = mall
34620 6f 63 28 73 69 7a 65 6f 66 28 2a 70 46 75 6e 63  oc(sizeof(*pFunc
34630 74 69 6f 6e 4c 69 73 74 29 29 3b 0a 0a 09 70 46  tionList));...pF
34640 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 76 65 72  unctionList->ver
34650 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 28 28 43  sion.major = ((C
34660 41 43 4b 45 59 5f 43 52 59 50 54 4f 4b 49 5f 56  ACKEY_CRYPTOKI_V
34670 45 52 53 49 4f 4e 5f 43 4f 44 45 29 20 3e 3e 20  ERSION_CODE) >> 
34680 31 36 29 20 26 20 30 78 66 66 3b 0a 09 70 46 75  16) & 0xff;..pFu
34690 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 76 65 72 73  nctionList->vers
346a0 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 28 28 43 41  ion.minor = ((CA
346b0 43 4b 45 59 5f 43 52 59 50 54 4f 4b 49 5f 56 45  CKEY_CRYPTOKI_VE
346c0 52 53 49 4f 4e 5f 43 4f 44 45 29 20 3e 3e 20 38  RSION_CODE) >> 8
346d0 29 20 26 20 30 78 66 66 3b 0a 0a 09 70 46 75 6e  ) & 0xff;...pFun
346e0 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 49 6e 69  ctionList->C_Ini
346f0 74 69 61 6c 69 7a 65 20 3d 20 43 5f 49 6e 69 74  tialize = C_Init
34700 69 61 6c 69 7a 65 3b 0a 09 70 46 75 6e 63 74 69  ialize;..pFuncti
34710 6f 6e 4c 69 73 74 2d 3e 43 5f 46 69 6e 61 6c 69  onList->C_Finali
34720 7a 65 20 3d 20 43 5f 46 69 6e 61 6c 69 7a 65 3b  ze = C_Finalize;
34730 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
34740 3e 43 5f 47 65 74 49 6e 66 6f 20 3d 20 43 5f 47  >C_GetInfo = C_G
34750 65 74 49 6e 66 6f 3b 0a 09 70 46 75 6e 63 74 69  etInfo;..pFuncti
34760 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 53 6c 6f  onList->C_GetSlo
34770 74 4c 69 73 74 20 3d 20 43 5f 47 65 74 53 6c 6f  tList = C_GetSlo
34780 74 4c 69 73 74 3b 0a 09 70 46 75 6e 63 74 69 6f  tList;..pFunctio
34790 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 53 6c 6f 74  nList->C_GetSlot
347a0 49 6e 66 6f 20 3d 20 43 5f 47 65 74 53 6c 6f 74  Info = C_GetSlot
347b0 49 6e 66 6f 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  Info;..pFunction
347c0 4c 69 73 74 2d 3e 43 5f 47 65 74 54 6f 6b 65 6e  List->C_GetToken
347d0 49 6e 66 6f 20 3d 20 43 5f 47 65 74 54 6f 6b 65  Info = C_GetToke
347e0 6e 49 6e 66 6f 3b 0a 09 70 46 75 6e 63 74 69 6f  nInfo;..pFunctio
347f0 6e 4c 69 73 74 2d 3e 43 5f 57 61 69 74 46 6f 72  nList->C_WaitFor
34800 53 6c 6f 74 45 76 65 6e 74 20 3d 20 43 5f 57 61  SlotEvent = C_Wa
34810 69 74 46 6f 72 53 6c 6f 74 45 76 65 6e 74 3b 0a  itForSlotEvent;.
34820 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
34830 43 5f 47 65 74 4d 65 63 68 61 6e 69 73 6d 4c 69  C_GetMechanismLi
34840 73 74 20 3d 20 43 5f 47 65 74 4d 65 63 68 61 6e  st = C_GetMechan
34850 69 73 6d 4c 69 73 74 3b 0a 09 70 46 75 6e 63 74  ismList;..pFunct
34860 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 4d 65  ionList->C_GetMe
34870 63 68 61 6e 69 73 6d 49 6e 66 6f 20 3d 20 43 5f  chanismInfo = C_
34880 47 65 74 4d 65 63 68 61 6e 69 73 6d 49 6e 66 6f  GetMechanismInfo
34890 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
348a0 2d 3e 43 5f 49 6e 69 74 54 6f 6b 65 6e 20 3d 20  ->C_InitToken = 
348b0 43 5f 49 6e 69 74 54 6f 6b 65 6e 3b 0a 09 70 46  C_InitToken;..pF
348c0 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 49  unctionList->C_I
348d0 6e 69 74 50 49 4e 20 3d 20 43 5f 49 6e 69 74 50  nitPIN = C_InitP
348e0 49 4e 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  IN;..pFunctionLi
348f0 73 74 2d 3e 43 5f 53 65 74 50 49 4e 20 3d 20 43  st->C_SetPIN = C
34900 5f 53 65 74 50 49 4e 3b 0a 09 70 46 75 6e 63 74  _SetPIN;..pFunct
34910 69 6f 6e 4c 69 73 74 2d 3e 43 5f 4f 70 65 6e 53  ionList->C_OpenS
34920 65 73 73 69 6f 6e 20 3d 20 43 5f 4f 70 65 6e 53  ession = C_OpenS
34930 65 73 73 69 6f 6e 3b 0a 09 70 46 75 6e 63 74 69  ession;..pFuncti
34940 6f 6e 4c 69 73 74 2d 3e 43 5f 43 6c 6f 73 65 53  onList->C_CloseS
34950 65 73 73 69 6f 6e 20 3d 20 43 5f 43 6c 6f 73 65  ession = C_Close
34960 53 65 73 73 69 6f 6e 3b 0a 09 70 46 75 6e 63 74  Session;..pFunct
34970 69 6f 6e 4c 69 73 74 2d 3e 43 5f 43 6c 6f 73 65  ionList->C_Close
34980 41 6c 6c 53 65 73 73 69 6f 6e 73 20 3d 20 43 5f  AllSessions = C_
34990 43 6c 6f 73 65 41 6c 6c 53 65 73 73 69 6f 6e 73  CloseAllSessions
349a0 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
349b0 2d 3e 43 5f 47 65 74 53 65 73 73 69 6f 6e 49 6e  ->C_GetSessionIn
349c0 66 6f 20 3d 20 43 5f 47 65 74 53 65 73 73 69 6f  fo = C_GetSessio
349d0 6e 49 6e 66 6f 3b 0a 09 70 46 75 6e 63 74 69 6f  nInfo;..pFunctio
349e0 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 4f 70 65 72  nList->C_GetOper
349f0 61 74 69 6f 6e 53 74 61 74 65 20 3d 20 43 5f 47  ationState = C_G
34a00 65 74 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 65  etOperationState
34a10 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
34a20 2d 3e 43 5f 53 65 74 4f 70 65 72 61 74 69 6f 6e  ->C_SetOperation
34a30 53 74 61 74 65 20 3d 20 43 5f 53 65 74 4f 70 65  State = C_SetOpe
34a40 72 61 74 69 6f 6e 53 74 61 74 65 3b 0a 09 70 46  rationState;..pF
34a50 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 4c  unctionList->C_L
34a60 6f 67 69 6e 20 3d 20 43 5f 4c 6f 67 69 6e 3b 0a  ogin = C_Login;.
34a70 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
34a80 43 5f 4c 6f 67 6f 75 74 20 3d 20 43 5f 4c 6f 67  C_Logout = C_Log
34a90 6f 75 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  out;..pFunctionL
34aa0 69 73 74 2d 3e 43 5f 43 72 65 61 74 65 4f 62 6a  ist->C_CreateObj
34ab0 65 63 74 20 3d 20 43 5f 43 72 65 61 74 65 4f 62  ect = C_CreateOb
34ac0 6a 65 63 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  ject;..pFunction
34ad0 4c 69 73 74 2d 3e 43 5f 43 6f 70 79 4f 62 6a 65  List->C_CopyObje
34ae0 63 74 20 3d 20 43 5f 43 6f 70 79 4f 62 6a 65 63  ct = C_CopyObjec
34af0 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  t;..pFunctionLis
34b00 74 2d 3e 43 5f 44 65 73 74 72 6f 79 4f 62 6a 65  t->C_DestroyObje
34b10 63 74 20 3d 20 43 5f 44 65 73 74 72 6f 79 4f 62  ct = C_DestroyOb
34b20 6a 65 63 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  ject;..pFunction
34b30 4c 69 73 74 2d 3e 43 5f 47 65 74 4f 62 6a 65 63  List->C_GetObjec
34b40 74 53 69 7a 65 20 3d 20 43 5f 47 65 74 4f 62 6a  tSize = C_GetObj
34b50 65 63 74 53 69 7a 65 3b 0a 09 70 46 75 6e 63 74  ectSize;..pFunct
34b60 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 41 74  ionList->C_GetAt
34b70 74 72 69 62 75 74 65 56 61 6c 75 65 20 3d 20 43  tributeValue = C
34b80 5f 47 65 74 41 74 74 72 69 62 75 74 65 56 61 6c  _GetAttributeVal
34b90 75 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  ue;..pFunctionLi
34ba0 73 74 2d 3e 43 5f 53 65 74 41 74 74 72 69 62 75  st->C_SetAttribu
34bb0 74 65 56 61 6c 75 65 20 3d 20 43 5f 53 65 74 41  teValue = C_SetA
34bc0 74 74 72 69 62 75 74 65 56 61 6c 75 65 3b 0a 09  ttributeValue;..
34bd0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
34be0 5f 46 69 6e 64 4f 62 6a 65 63 74 73 49 6e 69 74  _FindObjectsInit
34bf0 20 3d 20 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73   = C_FindObjects
34c00 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  Init;..pFunction
34c10 4c 69 73 74 2d 3e 43 5f 46 69 6e 64 4f 62 6a 65  List->C_FindObje
34c20 63 74 73 20 3d 20 43 5f 46 69 6e 64 4f 62 6a 65  cts = C_FindObje
34c30 63 74 73 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  cts;..pFunctionL
34c40 69 73 74 2d 3e 43 5f 46 69 6e 64 4f 62 6a 65 63  ist->C_FindObjec
34c50 74 73 46 69 6e 61 6c 20 3d 20 43 5f 46 69 6e 64  tsFinal = C_Find
34c60 4f 62 6a 65 63 74 73 46 69 6e 61 6c 3b 0a 09 70  ObjectsFinal;..p
34c70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
34c80 45 6e 63 72 79 70 74 49 6e 69 74 20 3d 20 43 5f  EncryptInit = C_
34c90 45 6e 63 72 79 70 74 49 6e 69 74 3b 0a 09 70 46  EncryptInit;..pF
34ca0 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 45  unctionList->C_E
34cb0 6e 63 72 79 70 74 20 3d 20 43 5f 45 6e 63 72 79  ncrypt = C_Encry
34cc0 70 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  pt;..pFunctionLi
34cd0 73 74 2d 3e 43 5f 45 6e 63 72 79 70 74 55 70 64  st->C_EncryptUpd
34ce0 61 74 65 20 3d 20 43 5f 45 6e 63 72 79 70 74 55  ate = C_EncryptU
34cf0 70 64 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f  pdate;..pFunctio
34d00 6e 4c 69 73 74 2d 3e 43 5f 45 6e 63 72 79 70 74  nList->C_Encrypt
34d10 46 69 6e 61 6c 20 3d 20 43 5f 45 6e 63 72 79 70  Final = C_Encryp
34d20 74 46 69 6e 61 6c 3b 0a 09 70 46 75 6e 63 74 69  tFinal;..pFuncti
34d30 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65 63 72 79 70  onList->C_Decryp
34d40 74 49 6e 69 74 20 3d 20 43 5f 44 65 63 72 79 70  tInit = C_Decryp
34d50 74 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f  tInit;..pFunctio
34d60 6e 4c 69 73 74 2d 3e 43 5f 44 65 63 72 79 70 74  nList->C_Decrypt
34d70 20 3d 20 43 5f 44 65 63 72 79 70 74 3b 0a 09 70   = C_Decrypt;..p
34d80 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
34d90 44 65 63 72 79 70 74 55 70 64 61 74 65 20 3d 20  DecryptUpdate = 
34da0 43 5f 44 65 63 72 79 70 74 55 70 64 61 74 65 3b  C_DecryptUpdate;
34db0 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
34dc0 3e 43 5f 44 65 63 72 79 70 74 46 69 6e 61 6c 20  >C_DecryptFinal 
34dd0 3d 20 43 5f 44 65 63 72 79 70 74 46 69 6e 61 6c  = C_DecryptFinal
34de0 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
34df0 2d 3e 43 5f 44 69 67 65 73 74 49 6e 69 74 20 3d  ->C_DigestInit =
34e00 20 43 5f 44 69 67 65 73 74 49 6e 69 74 3b 0a 09   C_DigestInit;..
34e10 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
34e20 5f 44 69 67 65 73 74 20 3d 20 43 5f 44 69 67 65  _Digest = C_Dige
34e30 73 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  st;..pFunctionLi
34e40 73 74 2d 3e 43 5f 44 69 67 65 73 74 55 70 64 61  st->C_DigestUpda
34e50 74 65 20 3d 20 43 5f 44 69 67 65 73 74 55 70 64  te = C_DigestUpd
34e60 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  ate;..pFunctionL
34e70 69 73 74 2d 3e 43 5f 44 69 67 65 73 74 4b 65 79  ist->C_DigestKey
34e80 20 3d 20 43 5f 44 69 67 65 73 74 4b 65 79 3b 0a   = C_DigestKey;.
34e90 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
34ea0 43 5f 44 69 67 65 73 74 46 69 6e 61 6c 20 3d 20  C_DigestFinal = 
34eb0 43 5f 44 69 67 65 73 74 46 69 6e 61 6c 3b 0a 09  C_DigestFinal;..
34ec0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
34ed0 5f 53 69 67 6e 49 6e 69 74 20 3d 20 43 5f 53 69  _SignInit = C_Si
34ee0 67 6e 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69  gnInit;..pFuncti
34ef0 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 20 3d  onList->C_Sign =
34f00 20 43 5f 53 69 67 6e 3b 0a 09 70 46 75 6e 63 74   C_Sign;..pFunct
34f10 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 55  ionList->C_SignU
34f20 70 64 61 74 65 20 3d 20 43 5f 53 69 67 6e 55 70  pdate = C_SignUp
34f30 64 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  date;..pFunction
34f40 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 46 69 6e 61  List->C_SignFina
34f50 6c 20 3d 20 43 5f 53 69 67 6e 46 69 6e 61 6c 3b  l = C_SignFinal;
34f60 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
34f70 3e 43 5f 53 69 67 6e 52 65 63 6f 76 65 72 49 6e  >C_SignRecoverIn
34f80 69 74 20 3d 20 43 5f 53 69 67 6e 52 65 63 6f 76  it = C_SignRecov
34f90 65 72 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69  erInit;..pFuncti
34fa0 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 52 65  onList->C_SignRe
34fb0 63 6f 76 65 72 20 3d 20 43 5f 53 69 67 6e 52 65  cover = C_SignRe
34fc0 63 6f 76 65 72 3b 0a 09 70 46 75 6e 63 74 69 6f  cover;..pFunctio
34fd0 6e 4c 69 73 74 2d 3e 43 5f 56 65 72 69 66 79 49  nList->C_VerifyI
34fe0 6e 69 74 20 3d 20 43 5f 56 65 72 69 66 79 49 6e  nit = C_VerifyIn
34ff0 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  it;..pFunctionLi
35000 73 74 2d 3e 43 5f 56 65 72 69 66 79 20 3d 20 43  st->C_Verify = C
35010 5f 56 65 72 69 66 79 3b 0a 09 70 46 75 6e 63 74  _Verify;..pFunct
35020 69 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65 72 69 66  ionList->C_Verif
35030 79 55 70 64 61 74 65 20 3d 20 43 5f 56 65 72 69  yUpdate = C_Veri
35040 66 79 55 70 64 61 74 65 3b 0a 09 70 46 75 6e 63  fyUpdate;..pFunc
35050 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65 72 69  tionList->C_Veri
35060 66 79 46 69 6e 61 6c 20 3d 20 43 5f 56 65 72 69  fyFinal = C_Veri
35070 66 79 46 69 6e 61 6c 3b 0a 09 70 46 75 6e 63 74  fyFinal;..pFunct
35080 69 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65 72 69 66  ionList->C_Verif
35090 79 52 65 63 6f 76 65 72 49 6e 69 74 20 3d 20 43  yRecoverInit = C
350a0 5f 56 65 72 69 66 79 52 65 63 6f 76 65 72 49 6e  _VerifyRecoverIn
350b0 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  it;..pFunctionLi
350c0 73 74 2d 3e 43 5f 56 65 72 69 66 79 52 65 63 6f  st->C_VerifyReco
350d0 76 65 72 20 3d 20 43 5f 56 65 72 69 66 79 52 65  ver = C_VerifyRe
350e0 63 6f 76 65 72 3b 0a 09 70 46 75 6e 63 74 69 6f  cover;..pFunctio
350f0 6e 4c 69 73 74 2d 3e 43 5f 44 69 67 65 73 74 45  nList->C_DigestE
35100 6e 63 72 79 70 74 55 70 64 61 74 65 20 3d 20 43  ncryptUpdate = C
35110 5f 44 69 67 65 73 74 45 6e 63 72 79 70 74 55 70  _DigestEncryptUp
35120 64 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  date;..pFunction
35130 4c 69 73 74 2d 3e 43 5f 44 65 63 72 79 70 74 44  List->C_DecryptD
35140 69 67 65 73 74 55 70 64 61 74 65 20 3d 20 43 5f  igestUpdate = C_
35150 44 65 63 72 79 70 74 44 69 67 65 73 74 55 70 64  DecryptDigestUpd
35160 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  ate;..pFunctionL
35170 69 73 74 2d 3e 43 5f 53 69 67 6e 45 6e 63 72 79  ist->C_SignEncry
35180 70 74 55 70 64 61 74 65 20 3d 20 43 5f 53 69 67  ptUpdate = C_Sig
35190 6e 45 6e 63 72 79 70 74 55 70 64 61 74 65 3b 0a  nEncryptUpdate;.
351a0 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
351b0 43 5f 44 65 63 72 79 70 74 56 65 72 69 66 79 55  C_DecryptVerifyU
351c0 70 64 61 74 65 20 3d 20 43 5f 44 65 63 72 79 70  pdate = C_Decryp
351d0 74 56 65 72 69 66 79 55 70 64 61 74 65 3b 0a 09  tVerifyUpdate;..
351e0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
351f0 5f 47 65 6e 65 72 61 74 65 4b 65 79 20 3d 20 43  _GenerateKey = C
35200 5f 47 65 6e 65 72 61 74 65 4b 65 79 3b 0a 09 70  _GenerateKey;..p
35210 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
35220 47 65 6e 65 72 61 74 65 4b 65 79 50 61 69 72 20  GenerateKeyPair 
35230 3d 20 43 5f 47 65 6e 65 72 61 74 65 4b 65 79 50  = C_GenerateKeyP
35240 61 69 72 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  air;..pFunctionL
35250 69 73 74 2d 3e 43 5f 57 72 61 70 4b 65 79 20 3d  ist->C_WrapKey =
35260 20 43 5f 57 72 61 70 4b 65 79 3b 0a 09 70 46 75   C_WrapKey;..pFu
35270 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 55 6e  nctionList->C_Un
35280 77 72 61 70 4b 65 79 20 3d 20 43 5f 55 6e 77 72  wrapKey = C_Unwr
35290 61 70 4b 65 79 3b 0a 09 70 46 75 6e 63 74 69 6f  apKey;..pFunctio
352a0 6e 4c 69 73 74 2d 3e 43 5f 44 65 72 69 76 65 4b  nList->C_DeriveK
352b0 65 79 20 3d 20 43 5f 44 65 72 69 76 65 4b 65 79  ey = C_DeriveKey
352c0 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
352d0 2d 3e 43 5f 53 65 65 64 52 61 6e 64 6f 6d 20 3d  ->C_SeedRandom =
352e0 20 43 5f 53 65 65 64 52 61 6e 64 6f 6d 3b 0a 09   C_SeedRandom;..
352f0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
35300 5f 47 65 6e 65 72 61 74 65 52 61 6e 64 6f 6d 20  _GenerateRandom 
35310 3d 20 43 5f 47 65 6e 65 72 61 74 65 52 61 6e 64  = C_GenerateRand
35320 6f 6d 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  om;..pFunctionLi
35330 73 74 2d 3e 43 5f 47 65 74 46 75 6e 63 74 69 6f  st->C_GetFunctio
35340 6e 53 74 61 74 75 73 20 3d 20 43 5f 47 65 74 46  nStatus = C_GetF
35350 75 6e 63 74 69 6f 6e 53 74 61 74 75 73 3b 0a 09  unctionStatus;..
35360 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
35370 5f 43 61 6e 63 65 6c 46 75 6e 63 74 69 6f 6e 20  _CancelFunction 
35380 3d 20 43 5f 43 61 6e 63 65 6c 46 75 6e 63 74 69  = C_CancelFuncti
35390 6f 6e 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  on;..pFunctionLi
353a0 73 74 2d 3e 43 5f 47 65 74 46 75 6e 63 74 69 6f  st->C_GetFunctio
353b0 6e 4c 69 73 74 20 3d 20 43 5f 47 65 74 46 75 6e  nList = C_GetFun
353c0 63 74 69 6f 6e 4c 69 73 74 3b 0a 0a 09 73 70 46  ctionList;...spF
353d0 75 6e 63 74 69 6f 6e 4c 69 73 74 20 20 3d 20 70  unctionList  = p
353e0 46 75 6e 63 74 69 6f 6e 4c 69 73 74 3b 0a 09 2a  FunctionList;..*
353f0 70 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 20 3d  ppFunctionList =
35400 20 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 3b 0a   pFunctionList;.
35410 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
35420 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
35430 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43   CKR_OK (%i)", C
35440 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e  KR_OK);...return
35450 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a              (CKR_OK);.}.