Hex Artifact Content

Artifact 0922233e4dbad44820d0fd52467b62aea98489ee:


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 3b 20 5c 0a 09 75 6e 73 69  _user_p; \..unsi
1990: 67 6e 65 64 20 6c 6f 6e 67 20 62 75 66 5f 75 73  gned long buf_us
19a0: 65 72 5f 73 69 7a 65 3b 20 5c 0a 09 75 6e 73 69  er_size; \..unsi
19b0: 67 6e 65 64 20 63 68 61 72 20 2a 54 4d 50 42 55  gned char *TMPBU
19c0: 46 3b 20 5c 0a 09 75 6e 73 69 67 6e 65 64 20 6c  F; \..unsigned l
19d0: 6f 6e 67 20 69 64 78 3b 20 5c 0a 09 69 6e 74 20  ong idx; \..int 
19e0: 73 6e 70 72 69 6e 74 66 5f 72 65 74 3b 20 5c 0a  snprintf_ret; \.
19f0: 09 54 4d 50 42 55 46 20 3d 20 28 75 6e 73 69 67  .TMPBUF = (unsig
1a00: 6e 65 64 20 63 68 61 72 20 2a 29 20 28 78 29 3b  ned char *) (x);
1a10: 20 5c 0a 09 62 75 66 5f 75 73 65 72 5b 30 5d 20   \..buf_user[0] 
1a20: 3d 20 30 3b 20 5c 0a 09 62 75 66 5f 75 73 65 72  = 0; \..buf_user
1a30: 5f 70 20 3d 20 62 75 66 5f 75 73 65 72 3b 20 5c  _p = buf_user; \
1a40: 0a 09 62 75 66 5f 75 73 65 72 5f 73 69 7a 65 20  ..buf_user_size 
1a50: 3d 20 73 69 7a 65 6f 66 28 62 75 66 5f 75 73 65  = sizeof(buf_use
1a60: 72 29 3b 20 5c 0a 09 66 6f 72 20 28 69 64 78 20  r); \..for (idx 
1a70: 3d 20 31 3b 20 69 64 78 20 3c 20 28 79 29 3b 20  = 1; idx < (y); 
1a80: 69 64 78 2b 2b 29 20 7b 20 5c 0a 09 09 69 66 20  idx++) { \...if 
1a90: 28 62 75 66 5f 75 73 65 72 5f 73 69 7a 65 20 3c  (buf_user_size <
1aa0: 3d 20 30 29 20 7b 20 5c 0a 09 09 09 62 72 65 61  = 0) { \....brea
1ab0: 6b 3b 20 5c 0a 09 09 7d 3b 20 5c 0a 09 09 73 6e  k; \...}; \...sn
1ac0: 70 72 69 6e 74 66 5f 72 65 74 20 3d 20 73 6e 70  printf_ret = snp
1ad0: 72 69 6e 74 66 28 62 75 66 5f 75 73 65 72 5f 70  rintf(buf_user_p
1ae0: 2c 20 62 75 66 5f 75 73 65 72 5f 73 69 7a 65 2c  , buf_user_size,
1af0: 20 22 2c 20 25 30 32 78 22 2c 20 54 4d 50 42 55   ", %02x", TMPBU
1b00: 46 5b 69 64 78 5d 29 3b 20 5c 0a 09 09 69 66 20  F[idx]); \...if 
1b10: 28 73 6e 70 72 69 6e 74 66 5f 72 65 74 20 3c 3d  (snprintf_ret <=
1b20: 20 30 29 20 7b 20 5c 0a 09 09 09 62 72 65 61 6b   0) { \....break
1b30: 3b 20 5c 0a 09 09 7d 3b 20 5c 0a 09 09 62 75 66  ; \...}; \...buf
1b40: 5f 75 73 65 72 5f 70 20 2b 3d 20 73 6e 70 72 69  _user_p += snpri
1b50: 6e 74 66 5f 72 65 74 3b 20 5c 0a 09 09 62 75 66  ntf_ret; \...buf
1b60: 5f 75 73 65 72 5f 73 69 7a 65 20 2d 3d 20 73 6e  _user_size -= sn
1b70: 70 72 69 6e 74 66 5f 72 65 74 3b 20 5c 0a 09 7d  printf_ret; \..}
1b80: 3b 20 5c 0a 09 62 75 66 5f 75 73 65 72 5b 73 69  ; \..buf_user[si
1b90: 7a 65 6f 66 28 62 75 66 5f 75 73 65 72 29 20 2d  zeof(buf_user) -
1ba0: 20 31 5d 20 3d 20 27 5c 30 27 3b 20 5c 0a 09 66   1] = '\0'; \..f
1bb0: 70 72 69 6e 74 66 28 63 61 63 6b 65 79 5f 64 65  printf(cackey_de
1bc0: 62 75 67 5f 66 64 28 29 2c 20 22 5b 25 6c 75 5d  bug_fd(), "[%lu]
1bd0: 3a 20 25 73 28 29 3a 25 69 3a 20 25 73 20 20 28  : %s():%i: %s  (
1be0: 25 73 2f 25 6c 75 20 3d 20 7b 25 30 32 78 25 73  %s/%lu = {%02x%s
1bf0: 7d 29 5c 6e 22 2c 20 43 41 43 4b 45 59 5f 44 45  })\n", CACKEY_DE
1c00: 42 55 47 5f 47 45 54 54 49 4d 45 28 29 2c 20 5f  BUG_GETTIME(), _
1c10: 5f 66 75 6e 63 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f  _func__, __LINE_
1c20: 5f 2c 20 66 2c 20 23 78 2c 20 28 75 6e 73 69 67  _, f, #x, (unsig
1c30: 6e 65 64 20 6c 6f 6e 67 29 20 28 79 29 2c 20 54  ned long) (y), T
1c40: 4d 50 42 55 46 5b 30 5d 2c 20 62 75 66 5f 75 73  MPBUF[0], buf_us
1c50: 65 72 29 3b 20 5c 0a 09 66 66 6c 75 73 68 28 63  er); \..fflush(c
1c60: 61 63 6b 65 79 5f 64 65 62 75 67 5f 66 64 28 29  ackey_debug_fd()
1c70: 29 3b 20 5c 0a 7d 0a 23 20 20 64 65 66 69 6e 65  ); \.}.#  define
1c80: 20 66 72 65 65 28 78 29 20 7b 20 43 41 43 4b 45   free(x) { CACKE
1c90: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1ca0: 46 52 45 45 28 25 70 29 20 28 25 73 29 22 2c 20  FREE(%p) (%s)", 
1cb0: 28 76 6f 69 64 20 2a 29 20 78 2c 20 23 78 29 3b  (void *) x, #x);
1cc0: 20 66 72 65 65 28 78 29 3b 20 7d 0a 0a 73 74 61   free(x); }..sta
1cd0: 74 69 63 20 46 49 4c 45 20 2a 63 61 63 6b 65 79  tic FILE *cackey
1ce0: 5f 64 65 62 75 67 5f 66 64 28 76 6f 69 64 29 20  _debug_fd(void) 
1cf0: 7b 0a 09 73 74 61 74 69 63 20 46 49 4c 45 20 2a  {..static FILE *
1d00: 66 64 20 3d 20 4e 55 4c 4c 3b 0a 09 63 68 61 72  fd = NULL;..char
1d10: 20 2a 6c 6f 67 66 69 6c 65 3b 0a 0a 09 69 66 20   *logfile;...if 
1d20: 28 66 64 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  (fd != NULL) {..
1d30: 09 72 65 74 75 72 6e 28 66 64 29 3b 0a 09 7d 0a  .return(fd);..}.
1d40: 0a 09 2f 2a 0a 09 20 2a 20 4c 6f 67 20 74 6f 20  ../*.. * Log to 
1d50: 73 74 64 65 72 72 20 69 6e 69 74 69 61 6c 6c 79  stderr initially
1d60: 20 73 6f 20 77 65 20 63 61 6e 20 75 73 65 20 64   so we can use d
1d70: 65 62 75 67 67 69 6e 67 20 77 69 74 68 69 6e 0a  ebugging within.
1d80: 09 20 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f  . * this functio
1d90: 6e 20 77 69 74 68 6f 75 74 20 67 65 74 74 69 6e  n without gettin
1da0: 67 20 69 6e 74 6f 20 61 6e 20 69 6e 66 69 6e 69  g into an infini
1db0: 74 65 20 6c 6f 6f 70 0a 09 20 2a 2f 0a 09 66 64  te loop.. */..fd
1dc0: 20 3d 20 73 74 64 65 72 72 3b 0a 0a 09 6c 6f 67   = stderr;...log
1dd0: 66 69 6c 65 20 3d 20 67 65 74 65 6e 76 28 22 43  file = getenv("C
1de0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 4c 4f 47 46  ACKEY_DEBUG_LOGF
1df0: 49 4c 45 22 29 3b 0a 09 69 66 20 28 6c 6f 67 66  ILE");..if (logf
1e00: 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ile != NULL) {..
1e10: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1e20: 49 4e 54 46 28 22 46 6f 75 6e 64 20 65 6e 76 69  INTF("Found envi
1e30: 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65  ronment variable
1e40: 3a 20 25 73 22 2c 20 6c 6f 67 66 69 6c 65 29 3b  : %s", logfile);
1e50: 0a 0a 09 09 6c 6f 67 66 69 6c 65 20 3d 20 73 74  ....logfile = st
1e60: 72 63 68 72 28 6c 6f 67 66 69 6c 65 2c 20 27 3d  rchr(logfile, '=
1e70: 27 29 3b 0a 09 09 69 66 20 28 6c 6f 67 66 69 6c  ');...if (logfil
1e80: 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09  e == NULL) {....
1e90: 6c 6f 67 66 69 6c 65 20 3d 20 67 65 74 65 6e 76  logfile = getenv
1ea0: 28 22 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 4c  ("CACKEY_DEBUG_L
1eb0: 4f 47 46 49 4c 45 22 29 3b 0a 09 09 7d 20 65 6c  OGFILE");...} el
1ec0: 73 65 20 7b 0a 09 09 09 6c 6f 67 66 69 6c 65 2b  se {....logfile+
1ed0: 2b 3b 0a 09 09 7d 0a 09 7d 0a 0a 23 69 66 64 65  +;...}..}..#ifde
1ee0: 66 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 4c  f CACKEY_DEBUG_L
1ef0: 4f 47 46 49 4c 45 0a 09 69 66 20 28 6c 6f 67 66  OGFILE..if (logf
1f00: 69 6c 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ile == NULL) {..
1f10: 09 6c 6f 67 66 69 6c 65 20 3d 20 43 41 43 4b 45  .logfile = CACKE
1f20: 59 5f 44 45 42 55 47 5f 4c 4f 47 46 49 4c 45 3b  Y_DEBUG_LOGFILE;
1f30: 0a 09 7d 0a 23 65 6e 64 69 66 0a 0a 09 69 66 20  ..}.#endif...if 
1f40: 28 6c 6f 67 66 69 6c 65 20 21 3d 20 4e 55 4c 4c  (logfile != NULL
1f50: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1f60: 55 47 5f 50 52 49 4e 54 46 28 22 46 6f 75 6e 64  UG_PRINTF("Found
1f70: 20 6c 6f 67 20 66 69 6c 65 3a 20 25 73 22 2c 20   log file: %s", 
1f80: 6c 6f 67 66 69 6c 65 29 3b 0a 0a 09 09 66 64 20  logfile);....fd 
1f90: 3d 20 66 6f 70 65 6e 28 6c 6f 67 66 69 6c 65 2c  = fopen(logfile,
1fa0: 20 22 61 22 29 3b 0a 09 7d 0a 0a 09 69 66 20 28   "a");..}...if (
1fb0: 66 64 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  fd == NULL) {...
1fc0: 66 64 20 3d 20 73 74 64 65 72 72 3b 0a 09 7d 0a  fd = stderr;..}.
1fd0: 0a 09 69 66 20 28 66 64 20 3d 3d 20 73 74 64 65  ..if (fd == stde
1fe0: 72 72 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  rr) {...CACKEY_D
1ff0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
2000: 75 72 6e 69 6e 67 20 73 74 64 65 72 72 22 29 3b  urning stderr");
2010: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 43 41 43  ..} else {...CAC
2020: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2030: 28 22 52 65 74 75 72 6e 69 6e 67 20 25 70 22 2c  ("Returning %p",
2040: 20 28 76 6f 69 64 20 2a 29 20 66 64 29 3b 0a 09   (void *) fd);..
2050: 7d 0a 0a 09 72 65 74 75 72 6e 28 66 64 29 3b 0a  }...return(fd);.
2060: 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a  }..static void *
2070: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e  CACKEY_DEBUG_FUN
2080: 43 5f 4d 41 4c 4c 4f 43 28 73 69 7a 65 5f 74 20  C_MALLOC(size_t 
2090: 73 69 7a 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  size, const char
20a0: 20 2a 66 75 6e 63 2c 20 69 6e 74 20 6c 69 6e 65   *func, int line
20b0: 29 20 7b 0a 09 76 6f 69 64 20 2a 72 65 74 76 61  ) {..void *retva
20c0: 6c 3b 0a 0a 09 72 65 74 76 61 6c 20 3d 20 6d 61  l;...retval = ma
20d0: 6c 6c 6f 63 28 73 69 7a 65 29 3b 0a 0a 09 66 70  lloc(size);...fp
20e0: 72 69 6e 74 66 28 63 61 63 6b 65 79 5f 64 65 62  rintf(cackey_deb
20f0: 75 67 5f 66 64 28 29 2c 20 22 5b 25 6c 75 5d 3a  ug_fd(), "[%lu]:
2100: 20 25 73 28 29 3a 25 69 3a 20 4d 41 4c 4c 4f 43   %s():%i: MALLOC
2110: 28 29 20 3d 20 25 70 5c 6e 22 2c 20 43 41 43 4b  () = %p\n", CACK
2120: 45 59 5f 44 45 42 55 47 5f 47 45 54 54 49 4d 45  EY_DEBUG_GETTIME
2130: 28 29 2c 20 66 75 6e 63 2c 20 6c 69 6e 65 2c 20  (), func, line, 
2140: 72 65 74 76 61 6c 29 3b 0a 09 66 66 6c 75 73 68  retval);..fflush
2150: 28 63 61 63 6b 65 79 5f 64 65 62 75 67 5f 66 64  (cackey_debug_fd
2160: 28 29 29 3b 0a 0a 09 72 65 74 75 72 6e 28 72 65  ());...return(re
2170: 74 76 61 6c 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  tval);.}..static
2180: 20 76 6f 69 64 20 2a 43 41 43 4b 45 59 5f 44 45   void *CACKEY_DE
2190: 42 55 47 5f 46 55 4e 43 5f 52 45 41 4c 4c 4f 43  BUG_FUNC_REALLOC
21a0: 28 76 6f 69 64 20 2a 70 74 72 2c 20 73 69 7a 65  (void *ptr, size
21b0: 5f 74 20 73 69 7a 65 2c 20 63 6f 6e 73 74 20 63  _t size, const c
21c0: 68 61 72 20 2a 66 75 6e 63 2c 20 69 6e 74 20 6c  har *func, int l
21d0: 69 6e 65 29 20 7b 0a 09 76 6f 69 64 20 2a 72 65  ine) {..void *re
21e0: 74 76 61 6c 3b 0a 0a 09 72 65 74 76 61 6c 20 3d  tval;...retval =
21f0: 20 72 65 61 6c 6c 6f 63 28 70 74 72 2c 20 73 69   realloc(ptr, si
2200: 7a 65 29 3b 0a 0a 09 69 66 20 28 72 65 74 76 61  ze);...if (retva
2210: 6c 20 21 3d 20 70 74 72 29 20 7b 0a 09 09 66 70  l != ptr) {...fp
2220: 72 69 6e 74 66 28 63 61 63 6b 65 79 5f 64 65 62  rintf(cackey_deb
2230: 75 67 5f 66 64 28 29 2c 20 22 5b 25 6c 75 5d 3a  ug_fd(), "[%lu]:
2240: 20 25 73 28 29 3a 25 69 3a 20 52 45 41 4c 4c 4f   %s():%i: REALLO
2250: 43 28 25 70 29 20 3d 20 25 70 5c 6e 22 2c 20 43  C(%p) = %p\n", C
2260: 41 43 4b 45 59 5f 44 45 42 55 47 5f 47 45 54 54  ACKEY_DEBUG_GETT
2270: 49 4d 45 28 29 2c 20 66 75 6e 63 2c 20 6c 69 6e  IME(), func, lin
2280: 65 2c 20 70 74 72 2c 20 72 65 74 76 61 6c 29 3b  e, ptr, retval);
2290: 0a 09 09 66 66 6c 75 73 68 28 63 61 63 6b 65 79  ...fflush(cackey
22a0: 5f 64 65 62 75 67 5f 66 64 28 29 29 3b 0a 09 7d  _debug_fd());..}
22b0: 0a 0a 09 69 66 20 28 72 65 74 76 61 6c 20 3d 3d  ...if (retval ==
22c0: 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
22d0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
22e0: 20 2a 2a 2a 20 45 52 52 4f 52 20 2a 2a 2a 20 72   *** ERROR *** r
22f0: 65 61 6c 6c 6f 63 20 72 65 74 75 72 6e 65 64 20  ealloc returned 
2300: 4e 55 4c 4c 20 28 73 69 7a 65 20 3d 20 25 6c 75  NULL (size = %lu
2310: 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  )", (unsigned lo
2320: 6e 67 29 20 73 69 7a 65 29 3b 0a 09 7d 0a 0a 09  ng) size);..}...
2330: 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a  return(retval);.
2340: 7d 0a 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  }..static char *
2350: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e  CACKEY_DEBUG_FUN
2360: 43 5f 53 54 52 44 55 50 28 63 6f 6e 73 74 20 63  C_STRDUP(const c
2370: 68 61 72 20 2a 70 74 72 2c 20 63 6f 6e 73 74 20  har *ptr, const 
2380: 63 68 61 72 20 2a 66 75 6e 63 2c 20 69 6e 74 20  char *func, int 
2390: 6c 69 6e 65 29 20 7b 0a 09 63 68 61 72 20 2a 72  line) {..char *r
23a0: 65 74 76 61 6c 3b 0a 0a 09 72 65 74 76 61 6c 20  etval;...retval 
23b0: 3d 20 73 74 72 64 75 70 28 70 74 72 29 3b 0a 0a  = strdup(ptr);..
23c0: 09 66 70 72 69 6e 74 66 28 63 61 63 6b 65 79 5f  .fprintf(cackey_
23d0: 64 65 62 75 67 5f 66 64 28 29 2c 20 22 5b 25 6c  debug_fd(), "[%l
23e0: 75 5d 3a 20 25 73 28 29 3a 25 69 3a 20 53 54 52  u]: %s():%i: STR
23f0: 44 55 50 5f 4d 41 4c 4c 4f 43 28 29 20 3d 20 25  DUP_MALLOC() = %
2400: 70 5c 6e 22 2c 20 43 41 43 4b 45 59 5f 44 45 42  p\n", CACKEY_DEB
2410: 55 47 5f 47 45 54 54 49 4d 45 28 29 2c 20 66 75  UG_GETTIME(), fu
2420: 6e 63 2c 20 6c 69 6e 65 2c 20 72 65 74 76 61 6c  nc, line, retval
2430: 29 3b 0a 09 66 66 6c 75 73 68 28 63 61 63 6b 65  );..fflush(cacke
2440: 79 5f 64 65 62 75 67 5f 66 64 28 29 29 3b 0a 0a  y_debug_fd());..
2450: 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b  .return(retval);
2460: 0a 7d 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .}..static const
2470: 20 63 68 61 72 20 2a 43 41 43 4b 45 59 5f 44 45   char *CACKEY_DE
2480: 42 55 47 5f 46 55 4e 43 5f 54 41 47 5f 54 4f 5f  BUG_FUNC_TAG_TO_
2490: 53 54 52 28 75 6e 73 69 67 6e 65 64 20 63 68 61  STR(unsigned cha
24a0: 72 20 74 61 67 29 20 7b 0a 09 73 77 69 74 63 68  r tag) {..switch
24b0: 20 28 74 61 67 29 20 7b 0a 09 09 63 61 73 65 20   (tag) {...case 
24c0: 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44 49 44  GSCIS_TAG_CARDID
24d0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
24e0: 49 53 5f 54 41 47 5f 43 41 52 44 49 44 22 29 3b  IS_TAG_CARDID");
24f0: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
2500: 47 5f 43 43 43 5f 56 45 52 3a 0a 09 09 09 72 65  G_CCC_VER:....re
2510: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
2520: 43 43 43 5f 56 45 52 22 29 3b 0a 09 09 63 61 73  CCC_VER");...cas
2530: 65 20 47 53 43 49 53 5f 54 41 47 5f 43 43 47 5f  e GSCIS_TAG_CCG_
2540: 56 45 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  VER:....return("
2550: 47 53 43 49 53 5f 54 41 47 5f 43 43 47 5f 56 45  GSCIS_TAG_CCG_VE
2560: 52 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  R");...case GSCI
2570: 53 5f 54 41 47 5f 43 41 52 44 55 52 4c 3a 0a 09  S_TAG_CARDURL:..
2580: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
2590: 54 41 47 5f 43 41 52 44 55 52 4c 22 29 3b 0a 09  TAG_CARDURL");..
25a0: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
25b0: 50 4b 43 53 31 35 3a 0a 09 09 09 72 65 74 75 72  PKCS15:....retur
25c0: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 50 4b 43  n("GSCIS_TAG_PKC
25d0: 53 31 35 22 29 3b 0a 09 09 63 61 73 65 20 47 53  S15");...case GS
25e0: 43 49 53 5f 54 41 47 5f 52 45 47 5f 44 41 54 41  CIS_TAG_REG_DATA
25f0: 5f 4d 4f 44 45 4c 3a 0a 09 09 09 72 65 74 75 72  _MODEL:....retur
2600: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 52 45 47  n("GSCIS_TAG_REG
2610: 5f 44 41 54 41 5f 4d 4f 44 45 4c 22 29 3b 0a 09  _DATA_MODEL");..
2620: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
2630: 41 43 52 5f 54 41 42 4c 45 3a 0a 09 09 09 72 65  ACR_TABLE:....re
2640: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
2650: 41 43 52 5f 54 41 42 4c 45 22 29 3b 0a 09 09 63  ACR_TABLE");...c
2660: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43 41  ase GSCIS_TAG_CA
2670: 52 44 5f 41 50 44 55 3a 0a 09 09 09 72 65 74 75  RD_APDU:....retu
2680: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 43 41  rn("GSCIS_TAG_CA
2690: 52 44 5f 41 50 44 55 22 29 3b 0a 09 09 63 61 73  RD_APDU");...cas
26a0: 65 20 47 53 43 49 53 5f 54 41 47 5f 52 45 44 49  e GSCIS_TAG_REDI
26b0: 52 45 43 54 49 4f 4e 3a 0a 09 09 09 72 65 74 75  RECTION:....retu
26c0: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 52 45  rn("GSCIS_TAG_RE
26d0: 44 49 52 45 43 54 49 4f 4e 22 29 3b 0a 09 09 63  DIRECTION");...c
26e0: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43 54  ase GSCIS_TAG_CT
26f0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
2700: 49 53 5f 54 41 47 5f 43 54 22 29 3b 0a 09 09 63  IS_TAG_CT");...c
2710: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 53 54  ase GSCIS_TAG_ST
2720: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
2730: 49 53 5f 54 41 47 5f 53 54 22 29 3b 0a 09 09 63  IS_TAG_ST");...c
2740: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4e 45  ase GSCIS_TAG_NE
2750: 58 54 43 43 43 3a 0a 09 09 09 72 65 74 75 72 6e  XTCCC:....return
2760: 28 22 47 53 43 49 53 5f 54 41 47 5f 4e 45 58 54  ("GSCIS_TAG_NEXT
2770: 43 43 43 22 29 3b 0a 09 09 63 61 73 65 20 47 53  CCC");...case GS
2780: 43 49 53 5f 54 41 47 5f 46 4e 41 4d 45 3a 0a 09  CIS_TAG_FNAME:..
2790: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
27a0: 54 41 47 5f 46 4e 41 4d 45 22 29 3b 0a 09 09 63  TAG_FNAME");...c
27b0: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4d 4e  ase GSCIS_TAG_MN
27c0: 41 4d 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  AME:....return("
27d0: 47 53 43 49 53 5f 54 41 47 5f 4d 4e 41 4d 45 22  GSCIS_TAG_MNAME"
27e0: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
27f0: 54 41 47 5f 4c 4e 41 4d 45 3a 0a 09 09 09 72 65  TAG_LNAME:....re
2800: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
2810: 4c 4e 41 4d 45 22 29 3b 0a 09 09 63 61 73 65 20  LNAME");...case 
2820: 47 53 43 49 53 5f 54 41 47 5f 53 55 46 46 49 58  GSCIS_TAG_SUFFIX
2830: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
2840: 49 53 5f 54 41 47 5f 53 55 46 46 49 58 22 29 3b  IS_TAG_SUFFIX");
2850: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
2860: 47 5f 47 4f 56 54 5f 41 47 45 4e 43 59 3a 0a 09  G_GOVT_AGENCY:..
2870: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
2880: 54 41 47 5f 47 4f 56 54 5f 41 47 45 4e 43 59 22  TAG_GOVT_AGENCY"
2890: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
28a0: 54 41 47 5f 42 55 52 45 41 55 3a 0a 09 09 09 72  TAG_BUREAU:....r
28b0: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
28c0: 5f 42 55 52 45 41 55 22 29 3b 0a 09 09 63 61 73  _BUREAU");...cas
28d0: 65 20 47 53 43 49 53 5f 54 41 47 5f 42 55 52 45  e GSCIS_TAG_BURE
28e0: 41 55 5f 43 4f 44 45 3a 0a 09 09 09 72 65 74 75  AU_CODE:....retu
28f0: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 42 55  rn("GSCIS_TAG_BU
2900: 52 45 41 55 5f 43 4f 44 45 22 29 3b 0a 09 09 63  REAU_CODE");...c
2910: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 44 45  ase GSCIS_TAG_DE
2920: 50 54 5f 43 4f 44 45 3a 0a 09 09 09 72 65 74 75  PT_CODE:....retu
2930: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 44 45  rn("GSCIS_TAG_DE
2940: 50 54 5f 43 4f 44 45 22 29 3b 0a 09 09 63 61 73  PT_CODE");...cas
2950: 65 20 47 53 43 49 53 5f 54 41 47 5f 54 49 54 4c  e GSCIS_TAG_TITL
2960: 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  E:....return("GS
2970: 43 49 53 5f 54 41 47 5f 54 49 54 4c 45 22 29 3b  CIS_TAG_TITLE");
2980: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
2990: 47 5f 42 55 49 4c 44 49 4e 47 3a 0a 09 09 09 72  G_BUILDING:....r
29a0: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
29b0: 5f 42 55 49 4c 44 49 4e 47 22 29 3b 0a 09 09 63  _BUILDING");...c
29c0: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46  ase GSCIS_TAG_OF
29d0: 46 49 43 45 5f 41 44 44 52 31 3a 0a 09 09 09 72  FICE_ADDR1:....r
29e0: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
29f0: 5f 4f 46 46 49 43 45 5f 41 44 44 52 31 22 29 3b  _OFFICE_ADDR1");
2a00: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
2a10: 47 5f 4f 46 46 49 43 45 5f 41 44 44 52 32 3a 0a  G_OFFICE_ADDR2:.
2a20: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
2a30: 5f 54 41 47 5f 4f 46 46 49 43 45 5f 41 44 44 52  _TAG_OFFICE_ADDR
2a40: 32 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  2");...case GSCI
2a50: 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 43 49 54  S_TAG_OFFICE_CIT
2a60: 59 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  Y:....return("GS
2a70: 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 43  CIS_TAG_OFFICE_C
2a80: 49 54 59 22 29 3b 0a 09 09 63 61 73 65 20 47 53  ITY");...case GS
2a90: 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 53  CIS_TAG_OFFICE_S
2aa0: 54 41 54 45 3a 0a 09 09 09 72 65 74 75 72 6e 28  TATE:....return(
2ab0: 22 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43  "GSCIS_TAG_OFFIC
2ac0: 45 5f 53 54 41 54 45 22 29 3b 0a 09 09 63 61 73  E_STATE");...cas
2ad0: 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49  e GSCIS_TAG_OFFI
2ae0: 43 45 5f 5a 49 50 3a 0a 09 09 09 72 65 74 75 72  CE_ZIP:....retur
2af0: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4f 46 46  n("GSCIS_TAG_OFF
2b00: 49 43 45 5f 5a 49 50 22 29 3b 0a 09 09 63 61 73  ICE_ZIP");...cas
2b10: 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49  e GSCIS_TAG_OFFI
2b20: 43 45 5f 43 4f 55 4e 54 52 59 3a 0a 09 09 09 72  CE_COUNTRY:....r
2b30: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
2b40: 5f 4f 46 46 49 43 45 5f 43 4f 55 4e 54 52 59 22  _OFFICE_COUNTRY"
2b50: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
2b60: 54 41 47 5f 4f 46 46 49 43 45 5f 50 48 4f 4e 45  TAG_OFFICE_PHONE
2b70: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
2b80: 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 50 48  IS_TAG_OFFICE_PH
2b90: 4f 4e 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53  ONE");...case GS
2ba0: 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 50  CIS_TAG_OFFICE_P
2bb0: 48 4f 4e 45 5f 45 58 54 3a 0a 09 09 09 72 65 74  HONE_EXT:....ret
2bc0: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4f  urn("GSCIS_TAG_O
2bd0: 46 46 49 43 45 5f 50 48 4f 4e 45 5f 45 58 54 22  FFICE_PHONE_EXT"
2be0: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
2bf0: 54 41 47 5f 4f 46 46 49 43 45 5f 46 41 58 3a 0a  TAG_OFFICE_FAX:.
2c00: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
2c10: 5f 54 41 47 5f 4f 46 46 49 43 45 5f 46 41 58 22  _TAG_OFFICE_FAX"
2c20: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
2c30: 54 41 47 5f 4f 46 46 49 43 45 5f 45 4d 41 49 4c  TAG_OFFICE_EMAIL
2c40: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
2c50: 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 45 4d  IS_TAG_OFFICE_EM
2c60: 41 49 4c 22 29 3b 0a 09 09 63 61 73 65 20 47 53  AIL");...case GS
2c70: 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 52  CIS_TAG_OFFICE_R
2c80: 4f 4f 4d 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  OOM:....return("
2c90: 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45  GSCIS_TAG_OFFICE
2ca0: 5f 52 4f 4f 4d 22 29 3b 0a 09 09 63 61 73 65 20  _ROOM");...case 
2cb0: 47 53 43 49 53 5f 54 41 47 5f 4e 4f 4e 47 4f 56  GSCIS_TAG_NONGOV
2cc0: 5f 41 47 45 4e 43 59 3a 0a 09 09 09 72 65 74 75  _AGENCY:....retu
2cd0: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4e 4f  rn("GSCIS_TAG_NO
2ce0: 4e 47 4f 56 5f 41 47 45 4e 43 59 22 29 3b 0a 09  NGOV_AGENCY");..
2cf0: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
2d00: 53 53 4e 5f 44 45 53 49 47 4e 41 54 4f 52 3a 0a  SSN_DESIGNATOR:.
2d10: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
2d20: 5f 54 41 47 5f 53 53 4e 5f 44 45 53 49 47 4e 41  _TAG_SSN_DESIGNA
2d30: 54 4f 52 22 29 3b 0a 09 09 63 61 73 65 20 47 53  TOR");...case GS
2d40: 43 49 53 5f 54 41 47 5f 53 53 4e 3a 0a 09 09 09  CIS_TAG_SSN:....
2d50: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
2d60: 47 5f 53 53 4e 22 29 3b 0a 09 09 63 61 73 65 20  G_SSN");...case 
2d70: 47 53 43 49 53 5f 54 41 47 5f 44 4f 42 3a 0a 09  GSCIS_TAG_DOB:..
2d80: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
2d90: 54 41 47 5f 44 4f 42 22 29 3b 0a 09 09 63 61 73  TAG_DOB");...cas
2da0: 65 20 47 53 43 49 53 5f 54 41 47 5f 47 45 4e 44  e GSCIS_TAG_GEND
2db0: 45 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47  ER:....return("G
2dc0: 53 43 49 53 5f 54 41 47 5f 47 45 4e 44 45 52 22  SCIS_TAG_GENDER"
2dd0: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
2de0: 54 41 47 5f 55 53 45 52 49 44 3a 0a 09 09 09 72  TAG_USERID:....r
2df0: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
2e00: 5f 55 53 45 52 49 44 22 29 3b 0a 09 09 63 61 73  _USERID");...cas
2e10: 65 20 47 53 43 49 53 5f 54 41 47 5f 44 4f 4d 41  e GSCIS_TAG_DOMA
2e20: 49 4e 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47  IN:....return("G
2e30: 53 43 49 53 5f 54 41 47 5f 44 4f 4d 41 49 4e 22  SCIS_TAG_DOMAIN"
2e40: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
2e50: 54 41 47 5f 50 41 53 53 57 4f 52 44 3a 0a 09 09  TAG_PASSWORD:...
2e60: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
2e70: 41 47 5f 50 41 53 53 57 4f 52 44 22 29 3b 0a 09  AG_PASSWORD");..
2e80: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
2e90: 49 53 53 55 45 52 49 44 3a 0a 09 09 09 72 65 74  ISSUERID:....ret
2ea0: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 49  urn("GSCIS_TAG_I
2eb0: 53 53 55 45 52 49 44 22 29 3b 0a 09 09 63 61 73  SSUERID");...cas
2ec0: 65 20 47 53 43 49 53 5f 54 41 47 5f 53 45 52 4e  e GSCIS_TAG_SERN
2ed0: 4f 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  O:....return("GS
2ee0: 43 49 53 5f 54 41 47 5f 53 45 52 4e 4f 22 29 3b  CIS_TAG_SERNO");
2ef0: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
2f00: 47 5f 49 53 53 55 45 5f 44 41 54 45 3a 0a 09 09  G_ISSUE_DATE:...
2f10: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
2f20: 41 47 5f 49 53 53 55 45 5f 44 41 54 45 22 29 3b  AG_ISSUE_DATE");
2f30: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
2f40: 47 5f 45 58 50 49 52 45 5f 44 41 54 45 3a 0a 09  G_EXPIRE_DATE:..
2f50: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
2f60: 54 41 47 5f 45 58 50 49 52 45 5f 44 41 54 45 22  TAG_EXPIRE_DATE"
2f70: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
2f80: 54 41 47 5f 43 41 52 44 5f 54 59 50 45 3a 0a 09  TAG_CARD_TYPE:..
2f90: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
2fa0: 54 41 47 5f 43 41 52 44 5f 54 59 50 45 22 29 3b  TAG_CARD_TYPE");
2fb0: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
2fc0: 47 5f 53 45 43 55 52 49 54 59 5f 43 4f 44 45 3a  G_SECURITY_CODE:
2fd0: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49  ....return("GSCI
2fe0: 53 5f 54 41 47 5f 53 45 43 55 52 49 54 59 5f 43  S_TAG_SECURITY_C
2ff0: 4f 44 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53  ODE");...case GS
3000: 43 49 53 5f 54 41 47 5f 43 41 52 44 49 44 5f 41  CIS_TAG_CARDID_A
3010: 49 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47  ID:....return("G
3020: 53 43 49 53 5f 54 41 47 5f 43 41 52 44 49 44 5f  SCIS_TAG_CARDID_
3030: 41 49 44 22 29 3b 0a 09 09 63 61 73 65 20 47 53  AID");...case GS
3040: 43 49 53 5f 54 41 47 5f 43 45 52 54 49 46 49 43  CIS_TAG_CERTIFIC
3050: 41 54 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ATE:....return("
3060: 47 53 43 49 53 5f 54 41 47 5f 43 45 52 54 49 46  GSCIS_TAG_CERTIF
3070: 49 43 41 54 45 22 29 3b 0a 09 09 63 61 73 65 20  ICATE");...case 
3080: 47 53 43 49 53 5f 54 41 47 5f 43 45 52 54 5f 49  GSCIS_TAG_CERT_I
3090: 53 53 55 45 5f 44 41 54 45 3a 0a 09 09 09 72 65  SSUE_DATE:....re
30a0: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
30b0: 43 45 52 54 5f 49 53 53 55 45 5f 44 41 54 45 22  CERT_ISSUE_DATE"
30c0: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
30d0: 54 41 47 5f 43 45 52 54 5f 45 58 50 49 52 45 5f  TAG_CERT_EXPIRE_
30e0: 44 41 54 45 3a 0a 09 09 09 72 65 74 75 72 6e 28  DATE:....return(
30f0: 22 47 53 43 49 53 5f 54 41 47 5f 43 45 52 54 5f  "GSCIS_TAG_CERT_
3100: 45 58 50 49 52 45 5f 44 41 54 45 22 29 3b 0a 09  EXPIRE_DATE");..
3110: 7d 0a 0a 09 72 65 74 75 72 6e 28 22 55 4e 4b 4e  }...return("UNKN
3120: 4f 57 4e 22 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  OWN");.}..static
3130: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 43 41 43   const char *CAC
3140: 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53  KEY_DEBUG_FUNC_S
3150: 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 4c  CARDERR_TO_STR(L
3160: 4f 4e 47 20 72 65 74 63 6f 64 65 29 20 7b 0a 09  ONG retcode) {..
3170: 73 77 69 74 63 68 20 28 72 65 74 63 6f 64 65 29  switch (retcode)
3180: 20 7b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f   {...case SCARD_
3190: 53 5f 53 55 43 43 45 53 53 3a 0a 09 09 09 72 65  S_SUCCESS:....re
31a0: 74 75 72 6e 28 22 53 43 41 52 44 5f 53 5f 53 55  turn("SCARD_S_SU
31b0: 43 43 45 53 53 22 29 3b 0a 09 09 63 61 73 65 20  CCESS");...case 
31c0: 53 43 41 52 44 5f 45 5f 43 41 4e 43 45 4c 4c 45  SCARD_E_CANCELLE
31d0: 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43  D:....return("SC
31e0: 41 52 44 5f 45 5f 43 41 4e 43 45 4c 4c 45 44 22  ARD_E_CANCELLED"
31f0: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  );...case SCARD_
3200: 45 5f 43 41 4e 54 5f 44 49 53 50 4f 53 45 3a 0a  E_CANT_DISPOSE:.
3210: 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44  ...return("SCARD
3220: 5f 45 5f 43 41 4e 54 5f 44 49 53 50 4f 53 45 22  _E_CANT_DISPOSE"
3230: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  );...case SCARD_
3240: 45 5f 49 4e 53 55 46 46 49 43 49 45 4e 54 5f 42  E_INSUFFICIENT_B
3250: 55 46 46 45 52 3a 0a 09 09 09 72 65 74 75 72 6e  UFFER:....return
3260: 28 22 53 43 41 52 44 5f 45 5f 49 4e 53 55 46 46  ("SCARD_E_INSUFF
3270: 49 43 49 45 4e 54 5f 42 55 46 46 45 52 22 29 3b  ICIENT_BUFFER");
3280: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
3290: 49 4e 56 41 4c 49 44 5f 41 54 52 3a 0a 09 09 09  INVALID_ATR:....
32a0: 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f  return("SCARD_E_
32b0: 49 4e 56 41 4c 49 44 5f 41 54 52 22 29 3b 0a 09  INVALID_ATR");..
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 48 41 4e 44 4c 45 3a 0a 09 09  VALID_HANDLE:...
32e0: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45  .return("SCARD_E
32f0: 5f 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 22  _INVALID_HANDLE"
3300: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  );...case SCARD_
3310: 45 5f 49 4e 56 41 4c 49 44 5f 50 41 52 41 4d 45  E_INVALID_PARAME
3320: 54 45 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  TER:....return("
3330: 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f  SCARD_E_INVALID_
3340: 50 41 52 41 4d 45 54 45 52 22 29 3b 0a 09 09 63  PARAMETER");...c
3350: 61 73 65 20 53 43 41 52 44 5f 45 5f 49 4e 56 41  ase SCARD_E_INVA
3360: 4c 49 44 5f 54 41 52 47 45 54 3a 0a 09 09 09 72  LID_TARGET:....r
3370: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 49  eturn("SCARD_E_I
3380: 4e 56 41 4c 49 44 5f 54 41 52 47 45 54 22 29 3b  NVALID_TARGET");
3390: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
33a0: 49 4e 56 41 4c 49 44 5f 56 41 4c 55 45 3a 0a 09  INVALID_VALUE:..
33b0: 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f  ..return("SCARD_
33c0: 45 5f 49 4e 56 41 4c 49 44 5f 56 41 4c 55 45 22  E_INVALID_VALUE"
33d0: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  );...case SCARD_
33e0: 45 5f 4e 4f 5f 4d 45 4d 4f 52 59 3a 0a 09 09 09  E_NO_MEMORY:....
33f0: 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f  return("SCARD_E_
3400: 4e 4f 5f 4d 45 4d 4f 52 59 22 29 3b 0a 09 09 63  NO_MEMORY");...c
3410: 61 73 65 20 53 43 41 52 44 5f 45 5f 55 4e 4b 4e  ase SCARD_E_UNKN
3420: 4f 57 4e 5f 52 45 41 44 45 52 3a 0a 09 09 09 72  OWN_READER:....r
3430: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 55  eturn("SCARD_E_U
3440: 4e 4b 4e 4f 57 4e 5f 52 45 41 44 45 52 22 29 3b  NKNOWN_READER");
3450: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
3460: 54 49 4d 45 4f 55 54 3a 0a 09 09 09 72 65 74 75  TIMEOUT:....retu
3470: 72 6e 28 22 53 43 41 52 44 5f 45 5f 54 49 4d 45  rn("SCARD_E_TIME
3480: 4f 55 54 22 29 3b 0a 09 09 63 61 73 65 20 53 43  OUT");...case SC
3490: 41 52 44 5f 45 5f 53 48 41 52 49 4e 47 5f 56 49  ARD_E_SHARING_VI
34a0: 4f 4c 41 54 49 4f 4e 3a 0a 09 09 09 72 65 74 75  OLATION:....retu
34b0: 72 6e 28 22 53 43 41 52 44 5f 45 5f 53 48 41 52  rn("SCARD_E_SHAR
34c0: 49 4e 47 5f 56 49 4f 4c 41 54 49 4f 4e 22 29 3b  ING_VIOLATION");
34d0: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
34e0: 4e 4f 5f 53 4d 41 52 54 43 41 52 44 3a 0a 09 09  NO_SMARTCARD:...
34f0: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45  .return("SCARD_E
3500: 5f 4e 4f 5f 53 4d 41 52 54 43 41 52 44 22 29 3b  _NO_SMARTCARD");
3510: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
3520: 55 4e 4b 4e 4f 57 4e 5f 43 41 52 44 3a 0a 09 09  UNKNOWN_CARD:...
3530: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45  .return("SCARD_E
3540: 5f 55 4e 4b 4e 4f 57 4e 5f 43 41 52 44 22 29 3b  _UNKNOWN_CARD");
3550: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
3560: 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 3a 0a  PROTO_MISMATCH:.
3570: 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44  ...return("SCARD
3580: 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43  _E_PROTO_MISMATC
3590: 48 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52  H");...case SCAR
35a0: 44 5f 45 5f 4e 4f 54 5f 52 45 41 44 59 3a 0a 09  D_E_NOT_READY:..
35b0: 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f  ..return("SCARD_
35c0: 45 5f 4e 4f 54 5f 52 45 41 44 59 22 29 3b 0a 09  E_NOT_READY");..
35d0: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 53 59  .case SCARD_E_SY
35e0: 53 54 45 4d 5f 43 41 4e 43 45 4c 4c 45 44 3a 0a  STEM_CANCELLED:.
35f0: 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44  ...return("SCARD
3600: 5f 45 5f 53 59 53 54 45 4d 5f 43 41 4e 43 45 4c  _E_SYSTEM_CANCEL
3610: 4c 45 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43  LED");...case SC
3620: 41 52 44 5f 45 5f 4e 4f 54 5f 54 52 41 4e 53 41  ARD_E_NOT_TRANSA
3630: 43 54 45 44 3a 0a 09 09 09 72 65 74 75 72 6e 28  CTED:....return(
3640: 22 53 43 41 52 44 5f 45 5f 4e 4f 54 5f 54 52 41  "SCARD_E_NOT_TRA
3650: 4e 53 41 43 54 45 44 22 29 3b 0a 09 09 63 61 73  NSACTED");...cas
3660: 65 20 53 43 41 52 44 5f 45 5f 52 45 41 44 45 52  e SCARD_E_READER
3670: 5f 55 4e 41 56 41 49 4c 41 42 4c 45 3a 0a 09 09  _UNAVAILABLE:...
3680: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45  .return("SCARD_E
3690: 5f 52 45 41 44 45 52 5f 55 4e 41 56 41 49 4c 41  _READER_UNAVAILA
36a0: 42 4c 45 22 29 3b 0a 09 09 63 61 73 65 20 53 43  BLE");...case SC
36b0: 41 52 44 5f 57 5f 55 4e 53 55 50 50 4f 52 54 45  ARD_W_UNSUPPORTE
36c0: 44 5f 43 41 52 44 3a 0a 09 09 09 72 65 74 75 72  D_CARD:....retur
36d0: 6e 28 22 53 43 41 52 44 5f 57 5f 55 4e 53 55 50  n("SCARD_W_UNSUP
36e0: 50 4f 52 54 45 44 5f 43 41 52 44 22 29 3b 0a 09  PORTED_CARD");..
36f0: 09 63 61 73 65 20 53 43 41 52 44 5f 57 5f 55 4e  .case SCARD_W_UN
3700: 52 45 53 50 4f 4e 53 49 56 45 5f 43 41 52 44 3a  RESPONSIVE_CARD:
3710: 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52  ....return("SCAR
3720: 44 5f 57 5f 55 4e 52 45 53 50 4f 4e 53 49 56 45  D_W_UNRESPONSIVE
3730: 5f 43 41 52 44 22 29 3b 0a 09 09 63 61 73 65 20  _CARD");...case 
3740: 53 43 41 52 44 5f 57 5f 55 4e 50 4f 57 45 52 45  SCARD_W_UNPOWERE
3750: 44 5f 43 41 52 44 3a 0a 09 09 09 72 65 74 75 72  D_CARD:....retur
3760: 6e 28 22 53 43 41 52 44 5f 57 5f 55 4e 50 4f 57  n("SCARD_W_UNPOW
3770: 45 52 45 44 5f 43 41 52 44 22 29 3b 0a 09 09 63  ERED_CARD");...c
3780: 61 73 65 20 53 43 41 52 44 5f 57 5f 52 45 53 45  ase SCARD_W_RESE
3790: 54 5f 43 41 52 44 3a 0a 09 09 09 72 65 74 75 72  T_CARD:....retur
37a0: 6e 28 22 53 43 41 52 44 5f 57 5f 52 45 53 45 54  n("SCARD_W_RESET
37b0: 5f 43 41 52 44 22 29 3b 0a 09 09 63 61 73 65 20  _CARD");...case 
37c0: 53 43 41 52 44 5f 57 5f 52 45 4d 4f 56 45 44 5f  SCARD_W_REMOVED_
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 4d 4f 56 45 44  "SCARD_W_REMOVED
37f0: 5f 43 41 52 44 22 29 3b 0a 09 09 63 61 73 65 20  _CARD");...case 
3800: 53 43 41 52 44 5f 45 5f 50 43 49 5f 54 4f 4f 5f  SCARD_E_PCI_TOO_
3810: 53 4d 41 4c 4c 3a 0a 09 09 09 72 65 74 75 72 6e  SMALL:....return
3820: 28 22 53 43 41 52 44 5f 45 5f 50 43 49 5f 54 4f  ("SCARD_E_PCI_TO
3830: 4f 5f 53 4d 41 4c 4c 22 29 3b 0a 09 09 63 61 73  O_SMALL");...cas
3840: 65 20 53 43 41 52 44 5f 45 5f 52 45 41 44 45 52  e SCARD_E_READER
3850: 5f 55 4e 53 55 50 50 4f 52 54 45 44 3a 0a 09 09  _UNSUPPORTED:...
3860: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45  .return("SCARD_E
3870: 5f 52 45 41 44 45 52 5f 55 4e 53 55 50 50 4f 52  _READER_UNSUPPOR
3880: 54 45 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43  TED");...case SC
3890: 41 52 44 5f 45 5f 44 55 50 4c 49 43 41 54 45 5f  ARD_E_DUPLICATE_
38a0: 52 45 41 44 45 52 3a 0a 09 09 09 72 65 74 75 72  READER:....retur
38b0: 6e 28 22 53 43 41 52 44 5f 45 5f 44 55 50 4c 49  n("SCARD_E_DUPLI
38c0: 43 41 54 45 5f 52 45 41 44 45 52 22 29 3b 0a 09  CATE_READER");..
38d0: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 43 41  .case SCARD_E_CA
38e0: 52 44 5f 55 4e 53 55 50 50 4f 52 54 45 44 3a 0a  RD_UNSUPPORTED:.
38f0: 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44  ...return("SCARD
3900: 5f 45 5f 43 41 52 44 5f 55 4e 53 55 50 50 4f 52  _E_CARD_UNSUPPOR
3910: 54 45 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43  TED");...case SC
3920: 41 52 44 5f 45 5f 4e 4f 5f 53 45 52 56 49 43 45  ARD_E_NO_SERVICE
3930: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41  :....return("SCA
3940: 52 44 5f 45 5f 4e 4f 5f 53 45 52 56 49 43 45 22  RD_E_NO_SERVICE"
3950: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  );...case SCARD_
3960: 45 5f 53 45 52 56 49 43 45 5f 53 54 4f 50 50 45  E_SERVICE_STOPPE
3970: 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43  D:....return("SC
3980: 41 52 44 5f 45 5f 53 45 52 56 49 43 45 5f 53 54  ARD_E_SERVICE_ST
3990: 4f 50 50 45 44 22 29 3b 0a 09 09 63 61 73 65 20  OPPED");...case 
39a0: 53 43 41 52 44 5f 45 5f 55 4e 53 55 50 50 4f 52  SCARD_E_UNSUPPOR
39b0: 54 45 44 5f 46 45 41 54 55 52 45 3a 0a 09 09 09  TED_FEATURE:....
39c0: 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f  return("SCARD_E_
39d0: 55 4e 53 55 50 50 4f 52 54 45 44 5f 46 45 41 54  UNSUPPORTED_FEAT
39e0: 55 52 45 22 29 3b 0a 23 69 66 64 65 66 20 53 43  URE");.#ifdef SC
39f0: 41 52 44 5f 57 5f 49 4e 53 45 52 54 45 44 5f 43  ARD_W_INSERTED_C
3a00: 41 52 44 0a 09 09 63 61 73 65 20 53 43 41 52 44  ARD...case SCARD
3a10: 5f 57 5f 49 4e 53 45 52 54 45 44 5f 43 41 52 44  _W_INSERTED_CARD
3a20: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41  :....return("SCA
3a30: 52 44 5f 57 5f 49 4e 53 45 52 54 45 44 5f 43 41  RD_W_INSERTED_CA
3a40: 52 44 22 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  RD");.#endif.#if
3a50: 64 65 66 20 53 43 41 52 44 5f 45 5f 4e 4f 5f 52  def SCARD_E_NO_R
3a60: 45 41 44 45 52 53 5f 41 56 41 49 4c 41 42 4c 45  EADERS_AVAILABLE
3a70: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
3a80: 4e 4f 5f 52 45 41 44 45 52 53 5f 41 56 41 49 4c  NO_READERS_AVAIL
3a90: 41 42 4c 45 3a 0a 09 09 09 72 65 74 75 72 6e 28  ABLE:....return(
3aa0: 22 53 43 41 52 44 5f 45 5f 4e 4f 5f 52 45 41 44  "SCARD_E_NO_READ
3ab0: 45 52 53 5f 41 56 41 49 4c 41 42 4c 45 22 29 3b  ERS_AVAILABLE");
3ac0: 0a 23 65 6e 64 69 66 0a 09 7d 0a 0a 09 72 65 74  .#endif..}...ret
3ad0: 75 72 6e 28 22 55 4e 4b 4e 4f 57 4e 22 29 3b 0a  urn("UNKNOWN");.
3ae0: 7d 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  }..static const 
3af0: 63 68 61 72 20 2a 43 41 43 4b 45 59 5f 44 45 42  char *CACKEY_DEB
3b00: 55 47 5f 46 55 4e 43 5f 4f 42 4a 49 44 5f 54 4f  UG_FUNC_OBJID_TO
3b10: 5f 53 54 52 28 75 69 6e 74 31 36 5f 74 20 6f 62  _STR(uint16_t ob
3b20: 6a 69 64 29 20 7b 0a 09 73 77 69 74 63 68 20 28  jid) {..switch (
3b30: 6f 62 6a 69 64 29 20 7b 0a 09 09 63 61 73 65 20  objid) {...case 
3b40: 30 78 32 30 30 30 3a 0a 09 09 09 72 65 74 75 72  0x2000:....retur
3b50: 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42  n("CACKEY_TLV_OB
3b60: 4a 49 44 5f 47 45 4e 45 52 41 4c 49 4e 46 4f 22  JID_GENERALINFO"
3b70: 29 3b 0a 09 09 63 61 73 65 20 30 78 32 31 30 30  );...case 0x2100
3b80: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43  :....return("CAC
3b90: 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 50 52  KEY_TLV_OBJID_PR
3ba0: 4f 50 45 52 53 4f 4e 41 4c 49 4e 46 4f 22 29 3b  OPERSONALINFO");
3bb0: 0a 09 09 63 61 73 65 20 30 78 33 30 30 30 3a 0a  ...case 0x3000:.
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 41 43 43 45  Y_TLV_OBJID_ACCE
3be0: 53 53 43 4f 4e 54 52 4f 4c 22 29 3b 0a 09 09 63  SSCONTROL");...c
3bf0: 61 73 65 20 30 78 34 30 30 30 3a 0a 09 09 09 72  ase 0x4000:....r
3c00: 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c  eturn("CACKEY_TL
3c10: 56 5f 4f 42 4a 49 44 5f 4c 4f 47 49 4e 22 29 3b  V_OBJID_LOGIN");
3c20: 0a 09 09 63 61 73 65 20 30 78 35 30 30 30 3a 0a  ...case 0x5000:.
3c30: 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45  ...return("CACKE
3c40: 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 52 44  Y_TLV_OBJID_CARD
3c50: 49 4e 46 4f 22 29 3b 0a 09 09 63 61 73 65 20 30  INFO");...case 0
3c60: 78 36 30 30 30 3a 0a 09 09 09 72 65 74 75 72 6e  x6000:....return
3c70: 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a  ("CACKEY_TLV_OBJ
3c80: 49 44 5f 42 49 4f 4d 45 54 52 49 43 53 22 29 3b  ID_BIOMETRICS");
3c90: 0a 09 09 63 61 73 65 20 30 78 37 30 30 30 3a 0a  ...case 0x7000:.
3ca0: 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45  ...return("CACKE
3cb0: 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 44 49 47 49  Y_TLV_OBJID_DIGI
3cc0: 54 41 4c 53 49 47 43 45 52 54 22 29 3b 0a 09 09  TALSIGCERT");...
3cd0: 63 61 73 65 20 30 78 30 32 30 30 3a 0a 09 09 09  case 0x0200:....
3ce0: 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54  return("CACKEY_T
3cf0: 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 50 45 52  LV_OBJID_CAC_PER
3d00: 53 4f 4e 22 29 3b 0a 09 09 63 61 73 65 20 30 78  SON");...case 0x
3d10: 30 32 30 32 3a 0a 09 09 09 72 65 74 75 72 6e 28  0202:....return(
3d20: 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49  "CACKEY_TLV_OBJI
3d30: 44 5f 43 41 43 5f 42 45 4e 45 46 49 54 53 22 29  D_CAC_BENEFITS")
3d40: 3b 0a 09 09 63 61 73 65 20 30 78 30 32 30 33 3a  ;...case 0x0203:
3d50: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b  ....return("CACK
3d60: 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43  EY_TLV_OBJID_CAC
3d70: 5f 4f 54 48 45 52 42 45 4e 45 46 49 54 53 22 29  _OTHERBENEFITS")
3d80: 3b 0a 09 09 63 61 73 65 20 30 78 30 32 30 31 3a  ;...case 0x0201:
3d90: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b  ....return("CACK
3da0: 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43  EY_TLV_OBJID_CAC
3db0: 5f 50 45 52 53 4f 4e 4e 45 4c 22 29 3b 0a 09 09  _PERSONNEL");...
3dc0: 63 61 73 65 20 30 78 30 32 46 45 3a 0a 09 09 09  case 0x02FE:....
3dd0: 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54  return("CACKEY_T
3de0: 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 50 4b 49  LV_OBJID_CAC_PKI
3df0: 43 45 52 54 22 29 3b 0a 09 7d 0a 09 0a 09 72 65  CERT");..}....re
3e00: 74 75 72 6e 28 22 55 4e 4b 4e 4f 57 4e 22 29 3b  turn("UNKNOWN");
3e10: 0a 7d 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .}..static const
3e20: 20 63 68 61 72 20 2a 43 41 43 4b 45 59 5f 44 45   char *CACKEY_DE
3e30: 42 55 47 5f 46 55 4e 43 5f 41 50 50 54 59 50 45  BUG_FUNC_APPTYPE
3e40: 5f 54 4f 5f 53 54 52 28 75 69 6e 74 38 5f 74 20  _TO_STR(uint8_t 
3e50: 61 70 70 74 79 70 65 29 20 7b 0a 09 73 77 69 74  apptype) {..swit
3e60: 63 68 20 28 61 70 70 74 79 70 65 29 20 7b 0a 09  ch (apptype) {..
3e70: 09 63 61 73 65 20 30 78 30 30 3a 0a 09 09 09 72  .case 0x00:....r
3e80: 65 74 75 72 6e 28 22 4e 4f 4e 45 22 29 3b 0a 09  eturn("NONE");..
3e90: 09 63 61 73 65 20 30 78 30 31 3a 0a 09 09 09 72  .case 0x01:....r
3ea0: 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c  eturn("CACKEY_TL
3eb0: 56 5f 41 50 50 5f 47 45 4e 45 52 49 43 22 29 3b  V_APP_GENERIC");
3ec0: 0a 09 09 63 61 73 65 20 30 78 30 32 3a 0a 09 09  ...case 0x02:...
3ed0: 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f  .return("CACKEY_
3ee0: 54 4c 56 5f 41 50 50 5f 53 4b 49 22 29 3b 0a 09  TLV_APP_SKI");..
3ef0: 09 63 61 73 65 20 30 78 30 33 3a 0a 09 09 09 72  .case 0x03:....r
3f00: 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c  eturn("CACKEY_TL
3f10: 56 5f 41 50 50 5f 47 45 4e 45 52 49 43 20 7c 20  V_APP_GENERIC | 
3f20: 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 53  CACKEY_TLV_APP_S
3f30: 4b 49 22 29 3b 0a 09 09 63 61 73 65 20 30 78 30  KI");...case 0x0
3f40: 34 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41  4:....return("CA
3f50: 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 50 4b 49  CKEY_TLV_APP_PKI
3f60: 22 29 3b 0a 09 09 63 61 73 65 20 30 78 30 35 3a  ");...case 0x05:
3f70: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b  ....return("CACK
3f80: 45 59 5f 54 4c 56 5f 41 50 50 5f 47 45 4e 45 52  EY_TLV_APP_GENER
3f90: 49 43 20 7c 20 43 41 43 4b 45 59 5f 54 4c 56 5f  IC | CACKEY_TLV_
3fa0: 41 50 50 5f 50 4b 49 22 29 3b 0a 09 09 63 61 73  APP_PKI");...cas
3fb0: 65 20 30 78 30 36 3a 0a 09 09 09 72 65 74 75 72  e 0x06:....retur
3fc0: 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50  n("CACKEY_TLV_AP
3fd0: 50 5f 53 4b 49 20 7c 20 43 41 43 4b 45 59 5f 54  P_SKI | CACKEY_T
3fe0: 4c 56 5f 41 50 50 5f 50 4b 49 22 29 3b 0a 09 09  LV_APP_PKI");...
3ff0: 63 61 73 65 20 30 78 30 37 3a 0a 09 09 09 72 65  case 0x07:....re
4000: 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56  turn("CACKEY_TLV
4010: 5f 41 50 50 5f 47 45 4e 45 52 49 43 20 7c 20 43  _APP_GENERIC | C
4020: 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 53 4b  ACKEY_TLV_APP_SK
4030: 49 20 7c 20 43 41 43 4b 45 59 5f 54 4c 56 5f 41  I | CACKEY_TLV_A
4040: 50 50 5f 50 4b 49 22 29 3b 0a 09 7d 0a 0a 09 72  PP_PKI");..}...r
4050: 65 74 75 72 6e 28 22 49 4e 56 41 4c 49 44 22 29  eturn("INVALID")
4060: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73  ;.}..static cons
4070: 74 20 63 68 61 72 20 2a 43 41 43 4b 45 59 5f 44  t char *CACKEY_D
4080: 45 42 55 47 5f 46 55 4e 43 5f 41 54 54 52 49 42  EBUG_FUNC_ATTRIB
4090: 55 54 45 5f 54 4f 5f 53 54 52 28 43 4b 5f 41 54  UTE_TO_STR(CK_AT
40a0: 54 52 49 42 55 54 45 5f 54 59 50 45 20 61 74 74  TRIBUTE_TYPE att
40b0: 72 29 20 7b 0a 09 73 77 69 74 63 68 20 28 61 74  r) {..switch (at
40c0: 74 72 29 20 7b 0a 09 09 63 61 73 65 20 43 4b 41  tr) {...case CKA
40d0: 5f 43 4c 41 53 53 3a 0a 09 09 09 72 65 74 75 72  _CLASS:....retur
40e0: 6e 28 22 43 4b 41 5f 43 4c 41 53 53 22 29 3b 0a  n("CKA_CLASS");.
40f0: 09 09 63 61 73 65 20 43 4b 41 5f 54 4f 4b 45 4e  ..case CKA_TOKEN
4100: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41  :....return("CKA
4110: 5f 54 4f 4b 45 4e 22 29 3b 0a 09 09 63 61 73 65  _TOKEN");...case
4120: 20 43 4b 41 5f 50 52 49 56 41 54 45 3a 0a 09 09   CKA_PRIVATE:...
4130: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 50 52 49  .return("CKA_PRI
4140: 56 41 54 45 22 29 3b 0a 09 09 63 61 73 65 20 43  VATE");...case C
4150: 4b 41 5f 4c 41 42 45 4c 3a 0a 09 09 09 72 65 74  KA_LABEL:....ret
4160: 75 72 6e 28 22 43 4b 41 5f 4c 41 42 45 4c 22 29  urn("CKA_LABEL")
4170: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 41 50 50  ;...case CKA_APP
4180: 4c 49 43 41 54 49 4f 4e 3a 0a 09 09 09 72 65 74  LICATION:....ret
4190: 75 72 6e 28 22 43 4b 41 5f 41 50 50 4c 49 43 41  urn("CKA_APPLICA
41a0: 54 49 4f 4e 22 29 3b 0a 09 09 63 61 73 65 20 43  TION");...case C
41b0: 4b 41 5f 56 41 4c 55 45 3a 0a 09 09 09 72 65 74  KA_VALUE:....ret
41c0: 75 72 6e 28 22 43 4b 41 5f 56 41 4c 55 45 22 29  urn("CKA_VALUE")
41d0: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 4f 42 4a  ;...case CKA_OBJ
41e0: 45 43 54 5f 49 44 3a 0a 09 09 09 72 65 74 75 72  ECT_ID:....retur
41f0: 6e 28 22 43 4b 41 5f 4f 42 4a 45 43 54 5f 49 44  n("CKA_OBJECT_ID
4200: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 43  ");...case CKA_C
4210: 45 52 54 49 46 49 43 41 54 45 5f 54 59 50 45 3a  ERTIFICATE_TYPE:
4220: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f  ....return("CKA_
4230: 43 45 52 54 49 46 49 43 41 54 45 5f 54 59 50 45  CERTIFICATE_TYPE
4240: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 49  ");...case CKA_I
4250: 53 53 55 45 52 3a 0a 09 09 09 72 65 74 75 72 6e  SSUER:....return
4260: 28 22 43 4b 41 5f 49 53 53 55 45 52 22 29 3b 0a  ("CKA_ISSUER");.
4270: 09 09 63 61 73 65 20 43 4b 41 5f 53 45 52 49 41  ..case CKA_SERIA
4280: 4c 5f 4e 55 4d 42 45 52 3a 0a 09 09 09 72 65 74  L_NUMBER:....ret
4290: 75 72 6e 28 22 43 4b 41 5f 53 45 52 49 41 4c 5f  urn("CKA_SERIAL_
42a0: 4e 55 4d 42 45 52 22 29 3b 0a 09 09 63 61 73 65  NUMBER");...case
42b0: 20 43 4b 41 5f 41 43 5f 49 53 53 55 45 52 3a 0a   CKA_AC_ISSUER:.
42c0: 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 41  ...return("CKA_A
42d0: 43 5f 49 53 53 55 45 52 22 29 3b 0a 09 09 63 61  C_ISSUER");...ca
42e0: 73 65 20 43 4b 41 5f 4f 57 4e 45 52 3a 0a 09 09  se CKA_OWNER:...
42f0: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 4f 57 4e  .return("CKA_OWN
4300: 45 52 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  ER");...case CKA
4310: 5f 41 54 54 52 5f 54 59 50 45 53 3a 0a 09 09 09  _ATTR_TYPES:....
4320: 72 65 74 75 72 6e 28 22 43 4b 41 5f 41 54 54 52  return("CKA_ATTR
4330: 5f 54 59 50 45 53 22 29 3b 0a 09 09 63 61 73 65  _TYPES");...case
4340: 20 43 4b 41 5f 54 52 55 53 54 45 44 3a 0a 09 09   CKA_TRUSTED:...
4350: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 54 52 55  .return("CKA_TRU
4360: 53 54 45 44 22 29 3b 0a 09 09 63 61 73 65 20 43  STED");...case C
4370: 4b 41 5f 4b 45 59 5f 54 59 50 45 3a 0a 09 09 09  KA_KEY_TYPE:....
4380: 72 65 74 75 72 6e 28 22 43 4b 41 5f 4b 45 59 5f  return("CKA_KEY_
4390: 54 59 50 45 22 29 3b 0a 09 09 63 61 73 65 20 43  TYPE");...case C
43a0: 4b 41 5f 53 55 42 4a 45 43 54 3a 0a 09 09 09 72  KA_SUBJECT:....r
43b0: 65 74 75 72 6e 28 22 43 4b 41 5f 53 55 42 4a 45  eturn("CKA_SUBJE
43c0: 43 54 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  CT");...case CKA
43d0: 5f 49 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  _ID:....return("
43e0: 43 4b 41 5f 49 44 22 29 3b 0a 09 09 63 61 73 65  CKA_ID");...case
43f0: 20 43 4b 41 5f 53 45 4e 53 49 54 49 56 45 3a 0a   CKA_SENSITIVE:.
4400: 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 53  ...return("CKA_S
4410: 45 4e 53 49 54 49 56 45 22 29 3b 0a 09 09 63 61  ENSITIVE");...ca
4420: 73 65 20 43 4b 41 5f 45 4e 43 52 59 50 54 3a 0a  se CKA_ENCRYPT:.
4430: 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 45  ...return("CKA_E
4440: 4e 43 52 59 50 54 22 29 3b 0a 09 09 63 61 73 65  NCRYPT");...case
4450: 20 43 4b 41 5f 44 45 43 52 59 50 54 3a 0a 09 09   CKA_DECRYPT:...
4460: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 44 45 43  .return("CKA_DEC
4470: 52 59 50 54 22 29 3b 0a 09 09 63 61 73 65 20 43  RYPT");...case C
4480: 4b 41 5f 57 52 41 50 3a 0a 09 09 09 72 65 74 75  KA_WRAP:....retu
4490: 72 6e 28 22 43 4b 41 5f 57 52 41 50 22 29 3b 0a  rn("CKA_WRAP");.
44a0: 09 09 63 61 73 65 20 43 4b 41 5f 55 4e 57 52 41  ..case CKA_UNWRA
44b0: 50 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b  P:....return("CK
44c0: 41 5f 55 4e 57 52 41 50 22 29 3b 0a 09 09 63 61  A_UNWRAP");...ca
44d0: 73 65 20 43 4b 41 5f 53 49 47 4e 3a 0a 09 09 09  se CKA_SIGN:....
44e0: 72 65 74 75 72 6e 28 22 43 4b 41 5f 53 49 47 4e  return("CKA_SIGN
44f0: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 53  ");...case CKA_S
4500: 49 47 4e 5f 52 45 43 4f 56 45 52 3a 0a 09 09 09  IGN_RECOVER:....
4510: 72 65 74 75 72 6e 28 22 43 4b 41 5f 53 49 47 4e  return("CKA_SIGN
4520: 5f 52 45 43 4f 56 45 52 22 29 3b 0a 09 09 63 61  _RECOVER");...ca
4530: 73 65 20 43 4b 41 5f 56 45 52 49 46 59 3a 0a 09  se CKA_VERIFY:..
4540: 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 56 45  ..return("CKA_VE
4550: 52 49 46 59 22 29 3b 0a 09 09 63 61 73 65 20 43  RIFY");...case C
4560: 4b 41 5f 56 45 52 49 46 59 5f 52 45 43 4f 56 45  KA_VERIFY_RECOVE
4570: 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b  R:....return("CK
4580: 41 5f 56 45 52 49 46 59 5f 52 45 43 4f 56 45 52  A_VERIFY_RECOVER
4590: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 44  ");...case CKA_D
45a0: 45 52 49 56 45 3a 0a 09 09 09 72 65 74 75 72 6e  ERIVE:....return
45b0: 28 22 43 4b 41 5f 44 45 52 49 56 45 22 29 3b 0a  ("CKA_DERIVE");.
45c0: 09 09 63 61 73 65 20 43 4b 41 5f 53 54 41 52 54  ..case CKA_START
45d0: 5f 44 41 54 45 3a 0a 09 09 09 72 65 74 75 72 6e  _DATE:....return
45e0: 28 22 43 4b 41 5f 53 54 41 52 54 5f 44 41 54 45  ("CKA_START_DATE
45f0: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 45  ");...case CKA_E
4600: 4e 44 5f 44 41 54 45 3a 0a 09 09 09 72 65 74 75  ND_DATE:....retu
4610: 72 6e 28 22 43 4b 41 5f 45 4e 44 5f 44 41 54 45  rn("CKA_END_DATE
4620: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 4d  ");...case CKA_M
4630: 4f 44 55 4c 55 53 3a 0a 09 09 09 72 65 74 75 72  ODULUS:....retur
4640: 6e 28 22 43 4b 41 5f 4d 4f 44 55 4c 55 53 22 29  n("CKA_MODULUS")
4650: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 4d 4f 44  ;...case CKA_MOD
4660: 55 4c 55 53 5f 42 49 54 53 3a 0a 09 09 09 72 65  ULUS_BITS:....re
4670: 74 75 72 6e 28 22 43 4b 41 5f 4d 4f 44 55 4c 55  turn("CKA_MODULU
4680: 53 5f 42 49 54 53 22 29 3b 0a 09 09 63 61 73 65  S_BITS");...case
4690: 20 43 4b 41 5f 50 55 42 4c 49 43 5f 45 58 50 4f   CKA_PUBLIC_EXPO
46a0: 4e 45 4e 54 3a 0a 09 09 09 72 65 74 75 72 6e 28  NENT:....return(
46b0: 22 43 4b 41 5f 50 55 42 4c 49 43 5f 45 58 50 4f  "CKA_PUBLIC_EXPO
46c0: 4e 45 4e 54 22 29 3b 0a 09 09 63 61 73 65 20 43  NENT");...case C
46d0: 4b 41 5f 50 52 49 56 41 54 45 5f 45 58 50 4f 4e  KA_PRIVATE_EXPON
46e0: 45 4e 54 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ENT:....return("
46f0: 43 4b 41 5f 50 52 49 56 41 54 45 5f 45 58 50 4f  CKA_PRIVATE_EXPO
4700: 4e 45 4e 54 22 29 3b 0a 09 09 63 61 73 65 20 43  NENT");...case C
4710: 4b 41 5f 50 52 49 4d 45 5f 31 3a 0a 09 09 09 72  KA_PRIME_1:....r
4720: 65 74 75 72 6e 28 22 43 4b 41 5f 50 52 49 4d 45  eturn("CKA_PRIME
4730: 5f 31 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  _1");...case CKA
4740: 5f 50 52 49 4d 45 5f 32 3a 0a 09 09 09 72 65 74  _PRIME_2:....ret
4750: 75 72 6e 28 22 43 4b 41 5f 50 52 49 4d 45 5f 32  urn("CKA_PRIME_2
4760: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 45  ");...case CKA_E
4770: 58 50 4f 4e 45 4e 54 5f 31 3a 0a 09 09 09 72 65  XPONENT_1:....re
4780: 74 75 72 6e 28 22 43 4b 41 5f 45 58 50 4f 4e 45  turn("CKA_EXPONE
4790: 4e 54 5f 31 22 29 3b 0a 09 09 63 61 73 65 20 43  NT_1");...case C
47a0: 4b 41 5f 45 58 50 4f 4e 45 4e 54 5f 32 3a 0a 09  KA_EXPONENT_2:..
47b0: 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 45 58  ..return("CKA_EX
47c0: 50 4f 4e 45 4e 54 5f 32 22 29 3b 0a 09 09 63 61  PONENT_2");...ca
47d0: 73 65 20 43 4b 41 5f 43 4f 45 46 46 49 43 49 45  se CKA_COEFFICIE
47e0: 4e 54 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  NT:....return("C
47f0: 4b 41 5f 43 4f 45 46 46 49 43 49 45 4e 54 22 29  KA_COEFFICIENT")
4800: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 50 52 49  ;...case CKA_PRI
4810: 4d 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  ME:....return("C
4820: 4b 41 5f 50 52 49 4d 45 22 29 3b 0a 09 09 63 61  KA_PRIME");...ca
4830: 73 65 20 43 4b 41 5f 53 55 42 50 52 49 4d 45 3a  se CKA_SUBPRIME:
4840: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f  ....return("CKA_
4850: 53 55 42 50 52 49 4d 45 22 29 3b 0a 09 09 63 61  SUBPRIME");...ca
4860: 73 65 20 43 4b 41 5f 42 41 53 45 3a 0a 09 09 09  se CKA_BASE:....
4870: 72 65 74 75 72 6e 28 22 43 4b 41 5f 42 41 53 45  return("CKA_BASE
4880: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 50  ");...case CKA_P
4890: 52 49 4d 45 5f 42 49 54 53 3a 0a 09 09 09 72 65  RIME_BITS:....re
48a0: 74 75 72 6e 28 22 43 4b 41 5f 50 52 49 4d 45 5f  turn("CKA_PRIME_
48b0: 42 49 54 53 22 29 3b 0a 09 09 63 61 73 65 20 43  BITS");...case C
48c0: 4b 41 5f 53 55 42 5f 50 52 49 4d 45 5f 42 49 54  KA_SUB_PRIME_BIT
48d0: 53 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b  S:....return("CK
48e0: 41 5f 53 55 42 5f 50 52 49 4d 45 5f 42 49 54 53  A_SUB_PRIME_BITS
48f0: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 56  ");...case CKA_V
4900: 41 4c 55 45 5f 42 49 54 53 3a 0a 09 09 09 72 65  ALUE_BITS:....re
4910: 74 75 72 6e 28 22 43 4b 41 5f 56 41 4c 55 45 5f  turn("CKA_VALUE_
4920: 42 49 54 53 22 29 3b 0a 09 09 63 61 73 65 20 43  BITS");...case C
4930: 4b 41 5f 56 41 4c 55 45 5f 4c 45 4e 3a 0a 09 09  KA_VALUE_LEN:...
4940: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 56 41 4c  .return("CKA_VAL
4950: 55 45 5f 4c 45 4e 22 29 3b 0a 09 09 63 61 73 65  UE_LEN");...case
4960: 20 43 4b 41 5f 45 58 54 52 41 43 54 41 42 4c 45   CKA_EXTRACTABLE
4970: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41  :....return("CKA
4980: 5f 45 58 54 52 41 43 54 41 42 4c 45 22 29 3b 0a  _EXTRACTABLE");.
4990: 09 09 63 61 73 65 20 43 4b 41 5f 4c 4f 43 41 4c  ..case CKA_LOCAL
49a0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41  :....return("CKA
49b0: 5f 4c 4f 43 41 4c 22 29 3b 0a 09 09 63 61 73 65  _LOCAL");...case
49c0: 20 43 4b 41 5f 4e 45 56 45 52 5f 45 58 54 52 41   CKA_NEVER_EXTRA
49d0: 43 54 41 42 4c 45 3a 0a 09 09 09 72 65 74 75 72  CTABLE:....retur
49e0: 6e 28 22 43 4b 41 5f 4e 45 56 45 52 5f 45 58 54  n("CKA_NEVER_EXT
49f0: 52 41 43 54 41 42 4c 45 22 29 3b 0a 09 09 63 61  RACTABLE");...ca
4a00: 73 65 20 43 4b 41 5f 41 4c 57 41 59 53 5f 53 45  se CKA_ALWAYS_SE
4a10: 4e 53 49 54 49 56 45 3a 0a 09 09 09 72 65 74 75  NSITIVE:....retu
4a20: 72 6e 28 22 43 4b 41 5f 41 4c 57 41 59 53 5f 53  rn("CKA_ALWAYS_S
4a30: 45 4e 53 49 54 49 56 45 22 29 3b 0a 09 09 63 61  ENSITIVE");...ca
4a40: 73 65 20 43 4b 41 5f 4b 45 59 5f 47 45 4e 5f 4d  se CKA_KEY_GEN_M
4a50: 45 43 48 41 4e 49 53 4d 3a 0a 09 09 09 72 65 74  ECHANISM:....ret
4a60: 75 72 6e 28 22 43 4b 41 5f 4b 45 59 5f 47 45 4e  urn("CKA_KEY_GEN
4a70: 5f 4d 45 43 48 41 4e 49 53 4d 22 29 3b 0a 09 09  _MECHANISM");...
4a80: 63 61 73 65 20 43 4b 41 5f 4d 4f 44 49 46 49 41  case CKA_MODIFIA
4a90: 42 4c 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  BLE:....return("
4aa0: 43 4b 41 5f 4d 4f 44 49 46 49 41 42 4c 45 22 29  CKA_MODIFIABLE")
4ab0: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 45 43 44  ;...case CKA_ECD
4ac0: 53 41 5f 50 41 52 41 4d 53 3a 0a 09 09 09 72 65  SA_PARAMS:....re
4ad0: 74 75 72 6e 28 22 43 4b 41 5f 45 43 44 53 41 5f  turn("CKA_ECDSA_
4ae0: 50 41 52 41 4d 53 22 29 3b 0a 09 09 63 61 73 65  PARAMS");...case
4af0: 20 43 4b 41 5f 45 43 5f 50 4f 49 4e 54 3a 0a 09   CKA_EC_POINT:..
4b00: 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 45 43  ..return("CKA_EC
4b10: 5f 50 4f 49 4e 54 22 29 3b 0a 09 09 63 61 73 65  _POINT");...case
4b20: 20 43 4b 41 5f 53 45 43 4f 4e 44 41 52 59 5f 41   CKA_SECONDARY_A
4b30: 55 54 48 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  UTH:....return("
4b40: 43 4b 41 5f 53 45 43 4f 4e 44 41 52 59 5f 41 55  CKA_SECONDARY_AU
4b50: 54 48 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  TH");...case CKA
4b60: 5f 41 55 54 48 5f 50 49 4e 5f 46 4c 41 47 53 3a  _AUTH_PIN_FLAGS:
4b70: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f  ....return("CKA_
4b80: 41 55 54 48 5f 50 49 4e 5f 46 4c 41 47 53 22 29  AUTH_PIN_FLAGS")
4b90: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 48 57 5f  ;...case CKA_HW_
4ba0: 46 45 41 54 55 52 45 5f 54 59 50 45 3a 0a 09 09  FEATURE_TYPE:...
4bb0: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 48 57 5f  .return("CKA_HW_
4bc0: 46 45 41 54 55 52 45 5f 54 59 50 45 22 29 3b 0a  FEATURE_TYPE");.
4bd0: 09 09 63 61 73 65 20 43 4b 41 5f 52 45 53 45 54  ..case CKA_RESET
4be0: 5f 4f 4e 5f 49 4e 49 54 3a 0a 09 09 09 72 65 74  _ON_INIT:....ret
4bf0: 75 72 6e 28 22 43 4b 41 5f 52 45 53 45 54 5f 4f  urn("CKA_RESET_O
4c00: 4e 5f 49 4e 49 54 22 29 3b 0a 09 09 63 61 73 65  N_INIT");...case
4c10: 20 43 4b 41 5f 48 41 53 5f 52 45 53 45 54 3a 0a   CKA_HAS_RESET:.
4c20: 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 48  ...return("CKA_H
4c30: 41 53 5f 52 45 53 45 54 22 29 3b 0a 09 09 63 61  AS_RESET");...ca
4c40: 73 65 20 43 4b 41 5f 56 45 4e 44 4f 52 5f 44 45  se CKA_VENDOR_DE
4c50: 46 49 4e 45 44 3a 0a 09 09 09 72 65 74 75 72 6e  FINED:....return
4c60: 28 22 43 4b 41 5f 56 45 4e 44 4f 52 5f 44 45 46  ("CKA_VENDOR_DEF
4c70: 49 4e 45 44 22 29 3b 0a 09 7d 0a 0a 09 72 65 74  INED");..}...ret
4c80: 75 72 6e 28 22 55 4e 4b 4e 4f 57 4e 22 29 3b 0a  urn("UNKNOWN");.
4c90: 7d 0a 0a 23 20 20 64 65 66 69 6e 65 20 6d 61 6c  }..#  define mal
4ca0: 6c 6f 63 28 78 29 20 43 41 43 4b 45 59 5f 44 45  loc(x) CACKEY_DE
4cb0: 42 55 47 5f 46 55 4e 43 5f 4d 41 4c 4c 4f 43 28  BUG_FUNC_MALLOC(
4cc0: 78 2c 20 5f 5f 66 75 6e 63 5f 5f 2c 20 5f 5f 4c  x, __func__, __L
4cd0: 49 4e 45 5f 5f 29 0a 23 20 20 64 65 66 69 6e 65  INE__).#  define
4ce0: 20 72 65 61 6c 6c 6f 63 28 78 2c 20 79 29 20 43   realloc(x, y) C
4cf0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43  ACKEY_DEBUG_FUNC
4d00: 5f 52 45 41 4c 4c 4f 43 28 78 2c 20 79 2c 20 5f  _REALLOC(x, y, _
4d10: 5f 66 75 6e 63 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f  _func__, __LINE_
4d20: 5f 29 0a 23 20 20 69 66 64 65 66 20 73 74 72 64  _).#  ifdef strd
4d30: 75 70 0a 23 20 20 20 20 75 6e 64 65 66 20 73 74  up.#    undef st
4d40: 72 64 75 70 0a 23 20 20 65 6e 64 69 66 0a 23 20  rdup.#  endif.# 
4d50: 20 64 65 66 69 6e 65 20 73 74 72 64 75 70 28 78   define strdup(x
4d60: 29 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46  ) CACKEY_DEBUG_F
4d70: 55 4e 43 5f 53 54 52 44 55 50 28 78 2c 20 5f 5f  UNC_STRDUP(x, __
4d80: 66 75 6e 63 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f 5f  func__, __LINE__
4d90: 29 0a 23 65 6c 73 65 0a 23 20 20 64 65 66 69 6e  ).#else.#  defin
4da0: 65 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  e CACKEY_DEBUG_P
4db0: 52 49 4e 54 46 28 78 2e 2e 2e 29 20 2f 2a 2a 2f  RINTF(x...) /**/
4dc0: 0a 23 20 20 64 65 66 69 6e 65 20 43 41 43 4b 45  .#  define CACKE
4dd0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46  Y_DEBUG_PRINTBUF
4de0: 28 66 2c 20 78 2c 20 79 29 20 2f 2a 2a 2f 0a 23  (f, x, y) /**/.#
4df0: 20 20 64 65 66 69 6e 65 20 43 41 43 4b 45 59 5f    define CACKEY_
4e00: 44 45 42 55 47 5f 46 55 4e 43 5f 54 41 47 5f 54  DEBUG_FUNC_TAG_T
4e10: 4f 5f 53 54 52 28 78 29 20 22 44 45 42 55 47 5f  O_STR(x) "DEBUG_
4e20: 44 49 53 41 42 4c 45 44 22 0a 23 20 20 64 65 66  DISABLED".#  def
4e30: 69 6e 65 20 43 41 43 4b 45 59 5f 44 45 42 55 47  ine CACKEY_DEBUG
4e40: 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54  _FUNC_SCARDERR_T
4e50: 4f 5f 53 54 52 28 78 29 20 22 44 45 42 55 47 5f  O_STR(x) "DEBUG_
4e60: 44 49 53 41 42 4c 45 44 22 0a 23 20 20 64 65 66  DISABLED".#  def
4e70: 69 6e 65 20 43 41 43 4b 45 59 5f 44 45 42 55 47  ine CACKEY_DEBUG
4e80: 5f 46 55 4e 43 5f 4f 42 4a 49 44 5f 54 4f 5f 53  _FUNC_OBJID_TO_S
4e90: 54 52 28 78 29 20 22 44 45 42 55 47 5f 44 49 53  TR(x) "DEBUG_DIS
4ea0: 41 42 4c 45 44 22 0a 23 20 20 64 65 66 69 6e 65  ABLED".#  define
4eb0: 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55   CACKEY_DEBUG_FU
4ec0: 4e 43 5f 41 50 50 54 59 50 45 5f 54 4f 5f 53 54  NC_APPTYPE_TO_ST
4ed0: 52 28 78 29 20 22 44 45 42 55 47 5f 44 49 53 41  R(x) "DEBUG_DISA
4ee0: 42 4c 45 44 22 0a 23 20 20 64 65 66 69 6e 65 20  BLED".#  define 
4ef0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e  CACKEY_DEBUG_FUN
4f00: 43 5f 41 54 54 52 49 42 55 54 45 5f 54 4f 5f 53  C_ATTRIBUTE_TO_S
4f10: 54 52 28 78 29 20 22 44 45 42 55 47 5f 44 49 53  TR(x) "DEBUG_DIS
4f20: 41 42 4c 45 44 22 0a 23 65 6e 64 69 66 0a 0a 2f  ABLED".#endif../
4f30: 2a 0a 20 2a 20 49 6e 63 6c 75 64 65 20 74 68 65  *. * Include the
4f40: 73 65 20 73 6f 75 72 63 65 20 66 69 6c 65 73 20  se source files 
4f50: 69 6e 20 74 68 69 73 20 74 72 61 6e 73 6c 61 74  in this translat
4f60: 69 6f 6e 20 75 6e 69 74 20 73 6f 20 74 68 61 74  ion unit so that
4f70: 20 77 65 20 63 61 6e 20 62 69 6e 64 20 74 6f 0a   we can bind to.
4f80: 20 2a 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64   * functions and
4f90: 20 6e 6f 74 20 69 6e 63 6c 75 64 65 20 61 6e 79   not include any
4fa0: 20 73 79 6d 62 6f 6c 73 20 69 6e 20 74 68 65 20   symbols in the 
4fb0: 6f 75 74 70 75 74 20 73 68 61 72 65 64 20 6f 62  output shared ob
4fc0: 6a 65 63 74 2e 0a 20 2a 2f 0a 23 69 6e 63 6c 75  ject.. */.#inclu
4fd0: 64 65 20 22 61 73 6e 31 2d 78 35 30 39 2e 63 22  de "asn1-x509.c"
4fe0: 0a 23 69 6e 63 6c 75 64 65 20 22 73 68 61 31 2e  .#include "sha1.
4ff0: 63 22 0a 23 69 6e 63 6c 75 64 65 20 22 6d 64 35  c".#include "md5
5000: 2e 63 22 0a 0a 74 79 70 65 64 65 66 20 65 6e 75  .c"..typedef enu
5010: 6d 20 7b 0a 09 43 41 43 4b 45 59 5f 49 44 5f 54  m {..CACKEY_ID_T
5020: 59 50 45 5f 43 41 43 2c 0a 09 43 41 43 4b 45 59  YPE_CAC,..CACKEY
5030: 5f 49 44 5f 54 59 50 45 5f 50 49 56 2c 0a 09 43  _ID_TYPE_PIV,..C
5040: 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43 45  ACKEY_ID_TYPE_CE
5050: 52 54 5f 4f 4e 4c 59 0a 7d 20 63 61 63 6b 65 79  RT_ONLY.} cackey
5060: 5f 70 63 73 63 5f 69 64 5f 74 79 70 65 3b 0a 0a  _pcsc_id_type;..
5070: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63  struct cackey_pc
5080: 73 63 5f 69 64 65 6e 74 69 74 79 20 7b 0a 09 63  sc_identity {..c
5090: 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 5f 74 79  ackey_pcsc_id_ty
50a0: 70 65 20 69 64 5f 74 79 70 65 3b 0a 0a 09 73 69  pe id_type;...si
50b0: 7a 65 5f 74 20 63 65 72 74 69 66 69 63 61 74 65  ze_t certificate
50c0: 5f 6c 65 6e 3b 0a 09 75 6e 73 69 67 6e 65 64 20  _len;..unsigned 
50d0: 63 68 61 72 20 2a 63 65 72 74 69 66 69 63 61 74  char *certificat
50e0: 65 3b 0a 0a 09 73 73 69 7a 65 5f 74 20 6b 65 79  e;...ssize_t key
50f0: 73 69 7a 65 3b 0a 0a 09 75 6e 69 6f 6e 20 7b 0a  size;...union {.
5100: 09 09 73 74 72 75 63 74 20 7b 0a 09 09 09 75 6e  ..struct {....un
5110: 73 69 67 6e 65 64 20 63 68 61 72 20 61 70 70 6c  signed char appl
5120: 65 74 5b 37 5d 3b 0a 09 09 09 75 69 6e 74 31 36  et[7];....uint16
5130: 5f 74 20 66 69 6c 65 3b 0a 09 09 7d 20 63 61 63  _t file;...} cac
5140: 3b 0a 0a 09 09 73 74 72 75 63 74 20 7b 0a 09 09  ;....struct {...
5150: 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6b  .unsigned char k
5160: 65 79 5f 69 64 3b 0a 09 09 09 63 68 61 72 20 6c  ey_id;....char l
5170: 61 62 65 6c 5b 33 32 5d 3b 0a 09 09 7d 20 70 69  abel[32];...} pi
5180: 76 3b 0a 09 7d 20 63 61 72 64 3b 0a 7d 3b 0a 0a  v;..} card;.};..
5190: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69 64  struct cackey_id
51a0: 65 6e 74 69 74 79 20 7b 0a 09 73 74 72 75 63 74  entity {..struct
51b0: 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65   cackey_pcsc_ide
51c0: 6e 74 69 74 79 20 2a 70 63 73 63 5f 69 64 65 6e  ntity *pcsc_iden
51d0: 74 69 74 79 3b 0a 0a 09 43 4b 5f 41 54 54 52 49  tity;...CK_ATTRI
51e0: 42 55 54 45 20 2a 61 74 74 72 69 62 75 74 65 73  BUTE *attributes
51f0: 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 61 74 74 72  ;..CK_ULONG attr
5200: 69 62 75 74 65 73 5f 63 6f 75 6e 74 3b 0a 7d 3b  ibutes_count;.};
5210: 0a 0a 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  ..struct cackey_
5220: 73 65 73 73 69 6f 6e 20 7b 0a 09 69 6e 74 20 61  session {..int a
5230: 63 74 69 76 65 3b 0a 0a 09 43 4b 5f 53 4c 4f 54  ctive;...CK_SLOT
5240: 5f 49 44 20 73 6c 6f 74 49 44 3b 0a 0a 09 43 4b  _ID slotID;...CK
5250: 5f 53 54 41 54 45 20 73 74 61 74 65 3b 0a 09 43  _STATE state;..C
5260: 4b 5f 46 4c 41 47 53 20 66 6c 61 67 73 3b 0a 09  K_FLAGS flags;..
5270: 43 4b 5f 55 4c 4f 4e 47 20 75 6c 44 65 76 69 63  CK_ULONG ulDevic
5280: 65 45 72 72 6f 72 3b 0a 09 43 4b 5f 56 4f 49 44  eError;..CK_VOID
5290: 5f 50 54 52 20 70 41 70 70 6c 69 63 61 74 69 6f  _PTR pApplicatio
52a0: 6e 3b 0a 09 43 4b 5f 4e 4f 54 49 46 59 20 4e 6f  n;..CK_NOTIFY No
52b0: 74 69 66 79 3b 0a 0a 09 73 74 72 75 63 74 20 63  tify;...struct c
52c0: 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79 20 2a  ackey_identity *
52d0: 69 64 65 6e 74 69 74 69 65 73 3b 0a 09 75 6e 73  identities;..uns
52e0: 69 67 6e 65 64 20 6c 6f 6e 67 20 69 64 65 6e 74  igned long ident
52f0: 69 74 69 65 73 5f 63 6f 75 6e 74 3b 0a 0a 09 69  ities_count;...i
5300: 6e 74 20 73 65 61 72 63 68 5f 61 63 74 69 76 65  nt search_active
5310: 3b 0a 09 43 4b 5f 41 54 54 52 49 42 55 54 45 5f  ;..CK_ATTRIBUTE_
5320: 50 54 52 20 73 65 61 72 63 68 5f 71 75 65 72 79  PTR search_query
5330: 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 73 65 61 72  ;..CK_ULONG sear
5340: 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74 3b 0a  ch_query_count;.
5350: 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 73  .unsigned long s
5360: 65 61 72 63 68 5f 63 75 72 72 5f 69 64 3b 0a 0a  earch_curr_id;..
5370: 09 69 6e 74 20 73 69 67 6e 5f 61 63 74 69 76 65  .int sign_active
5380: 3b 0a 09 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f  ;..CK_MECHANISM_
5390: 54 59 50 45 20 73 69 67 6e 5f 6d 65 63 68 61 6e  TYPE sign_mechan
53a0: 69 73 6d 3b 0a 09 43 4b 5f 42 59 54 45 5f 50 54  ism;..CK_BYTE_PT
53b0: 52 20 73 69 67 6e 5f 62 75 66 3b 0a 09 75 6e 73  R sign_buf;..uns
53c0: 69 67 6e 65 64 20 6c 6f 6e 67 20 73 69 67 6e 5f  igned long sign_
53d0: 62 75 66 6c 65 6e 3b 0a 09 75 6e 73 69 67 6e 65  buflen;..unsigne
53e0: 64 20 6c 6f 6e 67 20 73 69 67 6e 5f 62 75 66 75  d long sign_bufu
53f0: 73 65 64 3b 0a 09 73 74 72 75 63 74 20 63 61 63  sed;..struct cac
5400: 6b 65 79 5f 69 64 65 6e 74 69 74 79 20 2a 73 69  key_identity *si
5410: 67 6e 5f 69 64 65 6e 74 69 74 79 3b 0a 0a 09 69  gn_identity;...i
5420: 6e 74 20 64 65 63 72 79 70 74 5f 61 63 74 69 76  nt decrypt_activ
5430: 65 3b 0a 09 43 4b 5f 4d 45 43 48 41 4e 49 53 4d  e;..CK_MECHANISM
5440: 5f 54 59 50 45 20 64 65 63 72 79 70 74 5f 6d 65  _TYPE decrypt_me
5450: 63 68 61 6e 69 73 6d 3b 0a 09 43 4b 5f 56 4f 49  chanism;..CK_VOI
5460: 44 5f 50 54 52 20 64 65 63 72 79 70 74 5f 6d 65  D_PTR decrypt_me
5470: 63 68 5f 70 61 72 6d 3b 0a 09 43 4b 5f 55 4c 4f  ch_parm;..CK_ULO
5480: 4e 47 20 64 65 63 72 79 70 74 5f 6d 65 63 68 5f  NG decrypt_mech_
5490: 70 61 72 6d 6c 65 6e 3b 0a 09 73 74 72 75 63 74  parmlen;..struct
54a0: 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79   cackey_identity
54b0: 20 2a 64 65 63 72 79 70 74 5f 69 64 65 6e 74 69   *decrypt_identi
54c0: 74 79 3b 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 63  ty;.};..struct c
54d0: 61 63 6b 65 79 5f 73 6c 6f 74 20 7b 0a 09 69 6e  ackey_slot {..in
54e0: 74 20 61 63 74 69 76 65 3b 0a 09 69 6e 74 20 69  t active;..int i
54f0: 6e 74 65 72 6e 61 6c 3b 0a 0a 09 63 68 61 72 20  nternal;...char 
5500: 2a 70 63 73 63 5f 72 65 61 64 65 72 3b 0a 0a 09  *pcsc_reader;...
5510: 69 6e 74 20 70 63 73 63 5f 63 61 72 64 5f 63 6f  int pcsc_card_co
5520: 6e 6e 65 63 74 65 64 3b 0a 09 53 43 41 52 44 48  nnected;..SCARDH
5530: 41 4e 44 4c 45 20 70 63 73 63 5f 63 61 72 64 3b  ANDLE pcsc_card;
5540: 0a 0a 09 69 6e 74 20 74 72 61 6e 73 61 63 74 69  ...int transacti
5550: 6f 6e 5f 64 65 70 74 68 3b 0a 09 69 6e 74 20 74  on_depth;..int t
5560: 72 61 6e 73 61 63 74 69 6f 6e 5f 6e 65 65 64 5f  ransaction_need_
5570: 68 77 5f 6c 6f 63 6b 3b 0a 0a 09 69 6e 74 20 73  hw_lock;...int s
5580: 6c 6f 74 5f 72 65 73 65 74 3b 0a 0a 09 43 4b 5f  lot_reset;...CK_
5590: 46 4c 41 47 53 20 74 6f 6b 65 6e 5f 66 6c 61 67  FLAGS token_flag
55a0: 73 3b 0a 0a 09 75 6e 73 69 67 6e 65 64 20 63 68  s;...unsigned ch
55b0: 61 72 20 2a 6c 61 62 65 6c 3b 0a 0a 09 44 57 4f  ar *label;...DWO
55c0: 52 44 20 70 72 6f 74 6f 63 6f 6c 3b 0a 0a 09 75  RD protocol;...u
55d0: 6e 73 69 67 6e 65 64 20 69 6e 74 20 63 61 63 68  nsigned int cach
55e0: 65 64 5f 63 65 72 74 73 5f 63 6f 75 6e 74 3b 0a  ed_certs_count;.
55f0: 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70  .struct cackey_p
5600: 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 63 61  csc_identity *ca
5610: 63 68 65 64 5f 63 65 72 74 73 3b 0a 7d 3b 0a 0a  ched_certs;.};..
5620: 74 79 70 65 64 65 66 20 65 6e 75 6d 20 7b 0a 09  typedef enum {..
5630: 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 47  CACKEY_TLV_APP_G
5640: 45 4e 45 52 49 43 20 3d 20 30 78 30 31 2c 0a 09  ENERIC = 0x01,..
5650: 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 53  CACKEY_TLV_APP_S
5660: 4b 49 20 20 20 20 20 3d 20 30 78 30 32 2c 0a 09  KI     = 0x02,..
5670: 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 50  CACKEY_TLV_APP_P
5680: 4b 49 20 20 20 20 20 3d 20 30 78 30 34 0a 7d 20  KI     = 0x04.} 
5690: 63 61 63 6b 65 79 5f 74 6c 76 5f 61 70 70 74 79  cackey_tlv_appty
56a0: 70 65 3b 0a 0a 74 79 70 65 64 65 66 20 65 6e 75  pe;..typedef enu
56b0: 6d 20 7b 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f  m {..CACKEY_TLV_
56c0: 4f 42 4a 49 44 5f 47 45 4e 45 52 41 4c 49 4e 46  OBJID_GENERALINF
56d0: 4f 20 20 20 20 20 20 20 3d 20 30 78 32 30 30 30  O       = 0x2000
56e0: 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42  ,..CACKEY_TLV_OB
56f0: 4a 49 44 5f 50 52 4f 50 45 52 53 4f 4e 41 4c 49  JID_PROPERSONALI
5700: 4e 46 4f 20 20 20 3d 20 30 78 32 31 30 30 2c 0a  NFO   = 0x2100,.
5710: 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49  .CACKEY_TLV_OBJI
5720: 44 5f 41 43 43 45 53 53 43 4f 4e 54 52 4f 4c 20  D_ACCESSCONTROL 
5730: 20 20 20 20 3d 20 30 78 33 30 30 30 2c 0a 09 43      = 0x3000,..C
5740: 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f  ACKEY_TLV_OBJID_
5750: 4c 4f 47 49 4e 20 20 20 20 20 20 20 20 20 20 20  LOGIN           
5760: 20 20 3d 20 30 78 34 30 30 30 2c 0a 09 43 41 43    = 0x4000,..CAC
5770: 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41  KEY_TLV_OBJID_CA
5780: 52 44 49 4e 46 4f 20 20 20 20 20 20 20 20 20 20  RDINFO          
5790: 3d 20 30 78 35 30 30 30 2c 0a 09 43 41 43 4b 45  = 0x5000,..CACKE
57a0: 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 42 49 4f 4d  Y_TLV_OBJID_BIOM
57b0: 45 54 52 49 43 53 20 20 20 20 20 20 20 20 3d 20  ETRICS        = 
57c0: 30 78 36 30 30 30 2c 0a 09 43 41 43 4b 45 59 5f  0x6000,..CACKEY_
57d0: 54 4c 56 5f 4f 42 4a 49 44 5f 44 49 47 49 54 41  TLV_OBJID_DIGITA
57e0: 4c 53 49 47 43 45 52 54 20 20 20 20 3d 20 30 78  LSIGCERT    = 0x
57f0: 37 30 30 30 2c 0a 09 43 41 43 4b 45 59 5f 54 4c  7000,..CACKEY_TL
5800: 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 50 45 52 53  V_OBJID_CAC_PERS
5810: 4f 4e 20 20 20 20 20 20 20 20 3d 20 30 78 30 32  ON        = 0x02
5820: 30 30 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f  00,..CACKEY_TLV_
5830: 4f 42 4a 49 44 5f 43 41 43 5f 42 45 4e 45 46 49  OBJID_CAC_BENEFI
5840: 54 53 20 20 20 20 20 20 3d 20 30 78 30 32 30 32  TS      = 0x0202
5850: 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42  ,..CACKEY_TLV_OB
5860: 4a 49 44 5f 43 41 43 5f 4f 54 48 45 52 42 45 4e  JID_CAC_OTHERBEN
5870: 45 46 49 54 53 20 3d 20 30 78 30 32 30 33 2c 0a  EFITS = 0x0203,.
5880: 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49  .CACKEY_TLV_OBJI
5890: 44 5f 43 41 43 5f 50 45 52 53 4f 4e 4e 45 4c 20  D_CAC_PERSONNEL 
58a0: 20 20 20 20 3d 20 30 78 30 32 30 31 2c 0a 09 43      = 0x0201,..C
58b0: 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f  ACKEY_TLV_OBJID_
58c0: 43 41 43 5f 50 4b 49 43 45 52 54 20 20 20 20 20  CAC_PKICERT     
58d0: 20 20 3d 20 30 78 30 32 46 45 0a 7d 20 63 61 63    = 0x02FE.} cac
58e0: 6b 65 79 5f 74 6c 76 5f 6f 62 6a 65 63 74 69 64  key_tlv_objectid
58f0: 3b 0a 0a 74 79 70 65 64 65 66 20 65 6e 75 6d 20  ;..typedef enum 
5900: 7b 0a 09 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  {..CACKEY_PCSC_S
5910: 5f 54 4f 4b 45 4e 50 52 45 53 45 4e 54 20 20 20  _TOKENPRESENT   
5920: 20 3d 20 31 2c 0a 09 43 41 43 4b 45 59 5f 50 43   = 1,..CACKEY_PC
5930: 53 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 20  SC_S_OK         
5940: 20 20 20 20 20 3d 20 30 2c 0a 09 43 41 43 4b 45       = 0,..CACKE
5950: 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43  Y_PCSC_E_GENERIC
5960: 20 20 20 20 20 20 20 20 20 3d 20 2d 31 2c 0a 09           = -1,..
5970: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 42 41  CACKEY_PCSC_E_BA
5980: 44 50 49 4e 20 20 20 20 20 20 20 20 20 20 3d 20  DPIN          = 
5990: 2d 32 2c 0a 09 43 41 43 4b 45 59 5f 50 43 53 43  -2,..CACKEY_PCSC
59a0: 5f 45 5f 4c 4f 43 4b 45 44 20 20 20 20 20 20 20  _E_LOCKED       
59b0: 20 20 20 3d 20 2d 33 2c 0a 09 43 41 43 4b 45 59     = -3,..CACKEY
59c0: 5f 50 43 53 43 5f 45 5f 4e 45 45 44 4c 4f 47 49  _PCSC_E_NEEDLOGI
59d0: 4e 20 20 20 20 20 20 20 3d 20 2d 34 2c 0a 09 43  N       = -4,..C
59e0: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b  ACKEY_PCSC_E_TOK
59f0: 45 4e 41 42 53 45 4e 54 20 20 20 20 20 3d 20 2d  ENABSENT     = -
5a00: 36 2c 0a 09 43 41 43 4b 45 59 5f 50 43 53 43 5f  6,..CACKEY_PCSC_
5a10: 45 5f 52 45 54 52 59 20 20 20 20 20 20 20 20 20  E_RETRY         
5a20: 20 20 3d 20 2d 37 0a 7d 20 63 61 63 6b 65 79 5f    = -7.} cackey_
5a30: 72 65 74 3b 0a 0a 73 74 72 75 63 74 20 63 61 63  ret;..struct cac
5a40: 6b 65 79 5f 74 6c 76 5f 63 61 72 64 75 72 6c 20  key_tlv_cardurl 
5a50: 7b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72  {..unsigned char
5a60: 20 20 20 20 20 20 20 20 72 69 64 5b 35 5d 3b 0a          rid[5];.
5a70: 09 63 61 63 6b 65 79 5f 74 6c 76 5f 61 70 70 74  .cackey_tlv_appt
5a80: 79 70 65 20 20 20 61 70 70 74 79 70 65 3b 0a 09  ype   apptype;..
5a90: 63 61 63 6b 65 79 5f 74 6c 76 5f 6f 62 6a 65 63  cackey_tlv_objec
5aa0: 74 69 64 20 20 6f 62 6a 65 63 74 69 64 3b 0a 09  tid  objectid;..
5ab0: 63 61 63 6b 65 79 5f 74 6c 76 5f 6f 62 6a 65 63  cackey_tlv_objec
5ac0: 74 69 64 20 20 61 70 70 69 64 3b 0a 09 75 6e 73  tid  appid;..uns
5ad0: 69 67 6e 65 64 20 63 68 61 72 20 20 20 20 20 20  igned char      
5ae0: 20 20 70 69 6e 69 64 3b 0a 7d 3b 0a 0a 73 74 72    pinid;.};..str
5af0: 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65  uct cackey_tlv_e
5b00: 6e 74 69 74 79 3b 0a 73 74 72 75 63 74 20 63 61  ntity;.struct ca
5b10: 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20  ckey_tlv_entity 
5b20: 7b 0a 09 75 69 6e 74 38 5f 74 20 74 61 67 3b 0a  {..uint8_t tag;.
5b30: 09 73 69 7a 65 5f 74 20 6c 65 6e 67 74 68 3b 0a  .size_t length;.
5b40: 0a 09 75 6e 69 6f 6e 20 7b 0a 09 09 76 6f 69 64  ..union {...void
5b50: 20 2a 76 61 6c 75 65 3b 0a 09 09 73 74 72 75 63   *value;...struc
5b60: 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 63 61 72  t cackey_tlv_car
5b70: 64 75 72 6c 20 2a 76 61 6c 75 65 5f 63 61 72 64  durl *value_card
5b80: 75 72 6c 3b 0a 09 09 75 69 6e 74 38 5f 74 20 76  url;...uint8_t v
5b90: 61 6c 75 65 5f 62 79 74 65 3b 0a 09 7d 3b 0a 0a  alue_byte;..};..
5ba0: 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74  .struct cackey_t
5bb0: 6c 76 5f 65 6e 74 69 74 79 20 2a 5f 6e 65 78 74  lv_entity *_next
5bc0: 3b 0a 7d 3b 0a 0a 2f 2a 20 43 41 43 4b 45 59 20  ;.};../* CACKEY 
5bd0: 47 6c 6f 62 61 6c 20 48 61 6e 64 6c 65 73 20 2a  Global Handles *
5be0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 63  /.static void *c
5bf0: 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 20 3d 20  ackey_biglock = 
5c00: 4e 55 4c 4c 3b 0a 73 74 61 74 69 63 20 73 74 72  NULL;.static str
5c10: 75 63 74 20 63 61 63 6b 65 79 5f 73 65 73 73 69  uct cackey_sessi
5c20: 6f 6e 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  on cackey_sessio
5c30: 6e 73 5b 31 32 38 5d 3b 0a 73 74 61 74 69 63 20  ns[128];.static 
5c40: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c  struct cackey_sl
5c50: 6f 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ot cackey_slots[
5c60: 31 32 38 5d 3b 0a 73 74 61 74 69 63 20 69 6e 74  128];.static int
5c70: 20 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69   cackey_initiali
5c80: 7a 65 64 20 3d 20 30 3b 0a 73 74 61 74 69 63 20  zed = 0;.static 
5c90: 69 6e 74 20 63 61 63 6b 65 79 5f 62 69 67 6c 6f  int cackey_biglo
5ca0: 63 6b 5f 69 6e 69 74 20 3d 20 30 3b 0a 43 4b 5f  ck_init = 0;.CK_
5cb0: 43 5f 49 4e 49 54 49 41 4c 49 5a 45 5f 41 52 47  C_INITIALIZE_ARG
5cc0: 53 20 63 61 63 6b 65 79 5f 61 72 67 73 3b 0a 0a  S cackey_args;..
5cd0: 2f 2a 2a 20 45 78 74 72 61 20 63 65 72 74 69 66  /** Extra certif
5ce0: 69 63 61 74 65 73 20 74 6f 20 69 6e 63 6c 75 64  icates to includ
5cf0: 65 20 69 6e 20 74 6f 6b 65 6e 20 2a 2a 2f 0a 73  e in token **/.s
5d00: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73  truct cackey_pcs
5d10: 63 5f 69 64 65 6e 74 69 74 79 20 65 78 74 72 61  c_identity extra
5d20: 5f 63 65 72 74 73 5b 5d 20 3d 20 7b 0a 23 69 6e  _certs[] = {.#in
5d30: 63 6c 75 64 65 20 22 63 61 63 6b 65 79 5f 62 75  clude "cackey_bu
5d40: 69 6c 74 69 6e 5f 63 65 72 74 73 2e 68 22 0a 7d  iltin_certs.h".}
5d50: 3b 0a 0a 23 64 65 66 69 6e 65 20 43 41 43 4b 45  ;..#define CACKE
5d60: 59 5f 4d 41 43 52 4f 5f 44 45 46 41 55 4c 54 5f  Y_MACRO_DEFAULT_
5d70: 58 53 54 52 28 73 74 72 29 20 43 41 43 4b 45 59  XSTR(str) CACKEY
5d80: 5f 4d 41 43 52 4f 5f 44 45 46 41 55 4c 54 5f 53  _MACRO_DEFAULT_S
5d90: 54 52 28 73 74 72 29 0a 23 64 65 66 69 6e 65 20  TR(str).#define 
5da0: 43 41 43 4b 45 59 5f 4d 41 43 52 4f 5f 44 45 46  CACKEY_MACRO_DEF
5db0: 41 55 4c 54 5f 53 54 52 28 73 74 72 29 20 23 73  AULT_STR(str) #s
5dc0: 74 72 0a 0a 2f 2a 20 50 72 6f 74 65 63 74 65 64  tr../* Protected
5dd0: 20 41 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 20   Authentication 
5de0: 50 61 74 68 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  Path command */.
5df0: 73 74 61 74 69 63 20 63 68 61 72 20 2a 63 61 63  static char *cac
5e00: 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20  key_pin_command 
5e10: 3d 20 4e 55 4c 4c 3b 0a 0a 2f 2a 20 52 65 61 64  = NULL;../* Read
5e20: 65 72 20 45 78 63 6c 75 73 69 6f 6e 20 6f 72 20  er Exclusion or 
5e30: 49 6e 63 6c 75 64 65 2d 6f 6e 6c 79 20 2a 2f 0a  Include-only */.
5e40: 73 74 61 74 69 63 20 63 68 61 72 20 2a 63 61 63  static char *cac
5e50: 6b 65 79 5f 72 65 61 64 65 72 73 5f 69 6e 63 6c  key_readers_incl
5e60: 75 64 65 5f 6f 6e 6c 79 20 3d 20 4e 55 4c 4c 3b  ude_only = NULL;
5e70: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 63 61  .static char *ca
5e80: 63 6b 65 79 5f 72 65 61 64 65 72 73 5f 65 78 63  ckey_readers_exc
5e90: 6c 75 64 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 2f 2a  lude = NULL;../*
5ea0: 20 50 43 53 43 20 47 6c 6f 62 61 6c 20 48 61 6e   PCSC Global Han
5eb0: 64 6c 65 73 20 2a 2f 0a 73 74 61 74 69 63 20 4c  dles */.static L
5ec0: 50 53 43 41 52 44 43 4f 4e 54 45 58 54 20 63 61  PSCARDCONTEXT ca
5ed0: 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65  ckey_pcsc_handle
5ee0: 20 3d 20 4e 55 4c 4c 3b 0a 0a 73 74 61 74 69 63   = NULL;..static
5ef0: 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 63   unsigned long c
5f00: 61 63 6b 65 79 5f 67 65 74 76 65 72 73 69 6f 6e  ackey_getversion
5f10: 28 76 6f 69 64 29 20 7b 0a 09 73 74 61 74 69 63  (void) {..static
5f20: 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 72   unsigned long r
5f30: 65 74 76 61 6c 20 3d 20 32 35 35 3b 0a 09 75 6e  etval = 255;..un
5f40: 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6d 61 6a 6f  signed long majo
5f50: 72 20 3d 20 30 3b 0a 09 75 6e 73 69 67 6e 65 64  r = 0;..unsigned
5f60: 20 6c 6f 6e 67 20 6d 69 6e 6f 72 20 3d 20 30 3b   long minor = 0;
5f70: 0a 09 63 68 61 72 20 2a 6d 61 6a 6f 72 5f 73 74  ..char *major_st
5f80: 72 20 3d 20 4e 55 4c 4c 3b 0a 09 63 68 61 72 20  r = NULL;..char 
5f90: 2a 6d 69 6e 6f 72 5f 73 74 72 20 3d 20 4e 55 4c  *minor_str = NUL
5fa0: 4c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  L;...CACKEY_DEBU
5fb0: 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
5fc0: 2e 22 29 3b 0a 0a 09 69 66 20 28 72 65 74 76 61  .");...if (retva
5fd0: 6c 20 21 3d 20 32 35 35 29 20 7b 0a 09 09 43 41  l != 255) {...CA
5fe0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
5ff0: 46 28 22 52 65 74 75 72 6e 69 6e 67 20 30 78 25  F("Returning 0x%
6000: 6c 78 20 28 63 61 63 68 65 64 29 2e 22 2c 20 72  lx (cached).", r
6010: 65 74 76 61 6c 29 3b 0a 0a 09 09 72 65 74 75 72  etval);....retur
6020: 6e 28 72 65 74 76 61 6c 29 3b 0a 09 7d 0a 0a 09  n(retval);..}...
6030: 72 65 74 76 61 6c 20 3d 20 30 3b 0a 0a 23 69 66  retval = 0;..#if
6040: 64 65 66 20 50 41 43 4b 41 47 45 5f 56 45 52 53  def PACKAGE_VERS
6050: 49 4f 4e 0a 20 20 20 20 20 20 20 20 6d 61 6a 6f  ION.        majo
6060: 72 5f 73 74 72 20 3d 20 50 41 43 4b 41 47 45 5f  r_str = PACKAGE_
6070: 56 45 52 53 49 4f 4e 3b 0a 09 69 66 20 28 6d 61  VERSION;..if (ma
6080: 6a 6f 72 5f 73 74 72 29 20 7b 0a 09 20 20 20 20  jor_str) {..    
6090: 20 20 20 20 6d 61 6a 6f 72 20 3d 20 73 74 72 74      major = strt
60a0: 6f 75 6c 28 6d 61 6a 6f 72 5f 73 74 72 2c 20 26  oul(major_str, &
60b0: 6d 69 6e 6f 72 5f 73 74 72 2c 20 31 30 29 3b 0a  minor_str, 10);.
60c0: 0a 09 09 69 66 20 28 6d 69 6e 6f 72 5f 73 74 72  ...if (minor_str
60d0: 29 20 7b 0a 09 09 09 6d 69 6e 6f 72 20 3d 20 73  ) {....minor = s
60e0: 74 72 74 6f 75 6c 28 6d 69 6e 6f 72 5f 73 74 72  trtoul(minor_str
60f0: 20 2b 20 31 2c 20 4e 55 4c 4c 2c 20 31 30 29 3b   + 1, NULL, 10);
6100: 0a 09 09 7d 0a 09 7d 0a 0a 09 72 65 74 76 61 6c  ...}..}...retval
6110: 20 3d 20 28 6d 61 6a 6f 72 20 3c 3c 20 31 36 29   = (major << 16)
6120: 20 7c 20 28 6d 69 6e 6f 72 20 3c 3c 20 38 29 3b   | (minor << 8);
6130: 0a 23 65 6e 64 69 66 0a 0a 09 43 41 43 4b 45 59  .#endif...CACKEY
6140: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
6150: 65 74 75 72 6e 69 6e 67 20 30 78 25 6c 78 22 2c  eturning 0x%lx",
6160: 20 72 65 74 76 61 6c 29 3b 0a 0a 09 72 65 74 75   retval);...retu
6170: 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 2f  rn(retval);.}../
6180: 2a 20 50 43 2f 53 43 20 52 65 6c 61 74 65 64 20  * PC/SC Related 
6190: 46 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 2f 2a 0a  Functions */./*.
61a0: 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20   * SYNPOSIS. *  
61b0: 20 20 20 76 6f 69 64 20 63 61 63 6b 65 79 5f 73     void cackey_s
61c0: 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e 65 63 74 5f  lots_disconnect_
61d0: 61 6c 6c 28 76 6f 69 64 29 3b 0a 20 2a 0a 20 2a  all(void);. *. *
61e0: 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20   ARGUMENTS. *   
61f0: 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 52 45 54    None. *. * RET
6200: 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20  URN VALUE. *    
6210: 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 4e 4f 54 45   None. *. * NOTE
6220: 53 0a 20 2a 20 20 20 20 20 54 68 69 73 20 66 75  S. *     This fu
6230: 6e 63 74 69 6f 6e 20 64 69 73 63 6f 6e 6e 65 63  nction disconnec
6240: 74 73 20 66 72 6f 6d 20 61 6c 6c 20 63 61 72 64  ts from all card
6250: 73 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63  s.. *. */.static
6260: 20 76 6f 69 64 20 63 61 63 6b 65 79 5f 73 6c 6f   void cackey_slo
6270: 74 73 5f 64 69 73 63 6f 6e 6e 65 63 74 5f 61 6c  ts_disconnect_al
6280: 6c 28 76 6f 69 64 29 20 7b 0a 09 75 69 6e 74 33  l(void) {..uint3
6290: 32 5f 74 20 69 64 78 3b 0a 0a 09 43 41 43 4b 45  2_t idx;...CACKE
62a0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
62b0: 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 66 6f 72  Called.");...for
62c0: 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c   (idx = 0; idx <
62d0: 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
62e0: 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28  slots) / sizeof(
62f0: 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29  cackey_slots[0])
6300: 29 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66  ); idx++) {...if
6310: 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69   (cackey_slots[i
6320: 64 78 5d 2e 69 6e 74 65 72 6e 61 6c 29 20 7b 0a  dx].internal) {.
6330: 09 09 09 2f 2a 20 53 6b 69 70 20 69 6e 74 65 72  .../* Skip inter
6340: 6e 61 6c 20 73 6c 6f 74 73 20 2a 2f 0a 09 09 09  nal slots */....
6350: 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 7d 0a 0a 09  continue;...}...
6360: 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74  .if (cackey_slot
6370: 73 5b 69 64 78 5d 2e 70 63 73 63 5f 63 61 72 64  s[idx].pcsc_card
6380: 5f 63 6f 6e 6e 65 63 74 65 64 29 20 7b 0a 09 09  _connected) {...
6390: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
63a0: 49 4e 54 46 28 22 53 43 61 72 64 44 69 73 63 6f  INTF("SCardDisco
63b0: 6e 6e 65 63 74 28 25 6c 75 29 20 63 61 6c 6c 65  nnect(%lu) calle
63c0: 64 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  d", (unsigned lo
63d0: 6e 67 29 20 69 64 78 29 3b 0a 0a 09 09 09 53 43  ng) idx);.....SC
63e0: 61 72 64 44 69 73 63 6f 6e 6e 65 63 74 28 63 61  ardDisconnect(ca
63f0: 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e  ckey_slots[idx].
6400: 70 63 73 63 5f 63 61 72 64 2c 20 53 43 41 52 44  pcsc_card, SCARD
6410: 5f 4c 45 41 56 45 5f 43 41 52 44 29 3b 0a 09 09  _LEAVE_CARD);...
6420: 7d 0a 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f  }....if (cackey_
6430: 73 6c 6f 74 73 5b 69 64 78 5d 2e 6c 61 62 65 6c  slots[idx].label
6440: 29 20 7b 0a 09 09 09 66 72 65 65 28 63 61 63 6b  ) {....free(cack
6450: 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 6c 61  ey_slots[idx].la
6460: 62 65 6c 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79  bel);.....cackey
6470: 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 6c 61 62 65  _slots[idx].labe
6480: 6c 20 3d 20 4e 55 4c 4c 3b 0a 09 09 7d 0a 0a 09  l = NULL;...}...
6490: 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64  .cackey_slots[id
64a0: 78 5d 2e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e  x].pcsc_card_con
64b0: 6e 65 63 74 65 64 20 3d 20 30 3b 0a 09 09 63 61  nected = 0;...ca
64c0: 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e  ckey_slots[idx].
64d0: 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74  transaction_dept
64e0: 68 20 3d 20 30 3b 0a 09 09 63 61 63 6b 65 79 5f  h = 0;...cackey_
64f0: 73 6c 6f 74 73 5b 69 64 78 5d 2e 74 72 61 6e 73  slots[idx].trans
6500: 61 63 74 69 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c  action_need_hw_l
6510: 6f 63 6b 20 3d 20 30 3b 0a 0a 09 09 69 66 20 28  ock = 0;....if (
6520: 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78  cackey_slots[idx
6530: 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 09 43  ].active) {....C
6540: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
6550: 54 46 28 22 4d 61 72 6b 69 6e 67 20 61 63 74 69  TF("Marking acti
6560: 76 65 20 73 6c 6f 74 20 25 6c 75 20 61 73 20 62  ve slot %lu as b
6570: 65 69 6e 67 20 72 65 73 65 74 22 2c 20 28 75 6e  eing reset", (un
6580: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 69 64 78  signed long) idx
6590: 29 3b 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79  );...}....cackey
65a0: 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 73 6c 6f 74  _slots[idx].slot
65b0: 5f 72 65 73 65 74 20 3d 20 31 3b 0a 09 7d 0a 0a  _reset = 1;..}..
65c0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
65d0: 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 22  INTF("Returning"
65e0: 29 3b 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a  );...return;.}..
65f0: 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20  /*. * SYNPOSIS. 
6600: 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 72 65 74  *     cackey_ret
6610: 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 63 6f 6e   cackey_pcsc_con
6620: 6e 65 63 74 28 76 6f 69 64 29 3b 0a 20 2a 0a 20  nect(void);. *. 
6630: 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20  * ARGUMENTS. *  
6640: 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 52 45     None. *. * RE
6650: 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20  TURN VALUE. *   
6660: 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f    CACKEY_PCSC_S_
6670: 4f 4b 20 20 20 20 20 20 20 20 20 4f 6e 20 73 75  OK         On su
6680: 63 63 65 73 73 0a 20 2a 20 20 20 20 20 43 41 43  ccess. *     CAC
6690: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52  KEY_PCSC_E_GENER
66a0: 49 43 20 20 20 20 4f 6e 20 65 72 72 6f 72 0a 20  IC    On error. 
66b0: 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20  *. * NOTES. *   
66c0: 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20    This function 
66d0: 63 6f 6e 6e 65 63 74 73 20 74 6f 20 74 68 65 20  connects to the 
66e0: 50 43 2f 53 43 20 43 6f 6e 6e 65 63 74 69 6f 6e  PC/SC Connection
66f0: 20 4d 61 6e 61 67 65 72 20 61 6e 64 20 75 70 64   Manager and upd
6700: 61 74 65 73 20 74 68 65 0a 20 2a 20 20 20 20 20  ates the. *     
6710: 67 6c 6f 62 61 6c 20 68 61 6e 64 6c 65 2e 0a 20  global handle.. 
6720: 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 61 63  *. */.static cac
6730: 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 70  key_ret cackey_p
6740: 63 73 63 5f 63 6f 6e 6e 65 63 74 28 76 6f 69 64  csc_connect(void
6750: 29 20 7b 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f  ) {..LONG scard_
6760: 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74 3b  est_context_ret;
6770: 0a 23 69 66 64 65 66 20 48 41 56 45 5f 53 43 41  .#ifdef HAVE_SCA
6780: 52 44 49 53 56 41 4c 49 44 43 4f 4e 54 45 58 54  RDISVALIDCONTEXT
6790: 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f 69 73 76  ..LONG scard_isv
67a0: 61 6c 69 64 5f 72 65 74 3b 0a 23 65 6e 64 69 66  alid_ret;.#endif
67b0: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
67c0: 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
67d0: 29 3b 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f  );...if (cackey_
67e0: 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d 3d 20 4e  pcsc_handle == N
67f0: 55 4c 4c 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  ULL) {...cackey_
6800: 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d 20 6d 61  pcsc_handle = ma
6810: 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63 61 63  lloc(sizeof(*cac
6820: 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 29  key_pcsc_handle)
6830: 29 3b 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f  );...if (cackey_
6840: 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d 3d 20 4e  pcsc_handle == N
6850: 55 4c 4c 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  ULL) {....CACKEY
6860: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
6870: 61 6c 6c 20 74 6f 20 6d 61 6c 6c 6f 63 28 29 20  all to malloc() 
6880: 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 69 6e  failed, returnin
6890: 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a  g in failure");.
68a0: 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ....cackey_slots
68b0: 5f 64 69 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28  _disconnect_all(
68c0: 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 41  );.....return(CA
68d0: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45  CKEY_PCSC_E_GENE
68e0: 52 49 43 29 3b 0a 09 09 7d 0a 0a 09 09 43 41 43  RIC);...}....CAC
68f0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
6900: 28 22 53 43 61 72 64 45 73 74 61 62 6c 69 73 68  ("SCardEstablish
6910: 43 6f 6e 74 65 78 74 28 29 20 63 61 6c 6c 65 64  Context() called
6920: 22 29 3b 0a 09 09 73 63 61 72 64 5f 65 73 74 5f  ");...scard_est_
6930: 63 6f 6e 74 65 78 74 5f 72 65 74 20 3d 20 53 43  context_ret = SC
6940: 61 72 64 45 73 74 61 62 6c 69 73 68 43 6f 6e 74  ardEstablishCont
6950: 65 78 74 28 53 43 41 52 44 5f 53 43 4f 50 45 5f  ext(SCARD_SCOPE_
6960: 53 59 53 54 45 4d 2c 20 4e 55 4c 4c 2c 20 4e 55  SYSTEM, NULL, NU
6970: 4c 4c 2c 20 63 61 63 6b 65 79 5f 70 63 73 63 5f  LL, cackey_pcsc_
6980: 68 61 6e 64 6c 65 29 3b 0a 09 09 69 66 20 28 73  handle);...if (s
6990: 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74  card_est_context
69a0: 5f 72 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f  _ret != SCARD_S_
69b0: 53 55 43 43 45 53 53 29 20 7b 0a 09 09 09 43 41  SUCCESS) {....CA
69c0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
69d0: 46 28 22 43 61 6c 6c 20 74 6f 20 53 43 61 72 64  F("Call to SCard
69e0: 45 73 74 61 62 6c 69 73 68 43 6f 6e 74 65 78 74  EstablishContext
69f0: 20 66 61 69 6c 65 64 20 28 72 65 74 75 72 6e 65   failed (returne
6a00: 64 20 25 73 2f 25 6c 69 29 2c 20 72 65 74 75 72  d %s/%li), retur
6a10: 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22  ning in failure"
6a20: 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46  , CACKEY_DEBUG_F
6a30: 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f  UNC_SCARDERR_TO_
6a40: 53 54 52 28 73 63 61 72 64 5f 65 73 74 5f 63 6f  STR(scard_est_co
6a50: 6e 74 65 78 74 5f 72 65 74 29 2c 20 28 6c 6f 6e  ntext_ret), (lon
6a60: 67 29 20 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e  g) scard_est_con
6a70: 74 65 78 74 5f 72 65 74 29 3b 0a 0a 09 09 09 66  text_ret);.....f
6a80: 72 65 65 28 63 61 63 6b 65 79 5f 70 63 73 63 5f  ree(cackey_pcsc_
6a90: 68 61 6e 64 6c 65 29 3b 0a 09 09 09 63 61 63 6b  handle);....cack
6aa0: 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d  ey_pcsc_handle =
6ab0: 20 4e 55 4c 4c 3b 0a 0a 09 09 09 63 61 63 6b 65   NULL;.....cacke
6ac0: 79 5f 73 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e 65  y_slots_disconne
6ad0: 63 74 5f 61 6c 6c 28 29 3b 0a 0a 09 09 09 72 65  ct_all();.....re
6ae0: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
6af0: 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 09 7d  _E_GENERIC);...}
6b00: 0a 09 7d 0a 0a 23 69 66 64 65 66 20 48 41 56 45  ..}..#ifdef HAVE
6b10: 5f 53 43 41 52 44 49 53 56 41 4c 49 44 43 4f 4e  _SCARDISVALIDCON
6b20: 54 45 58 54 0a 09 43 41 43 4b 45 59 5f 44 45 42  TEXT..CACKEY_DEB
6b30: 55 47 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64  UG_PRINTF("SCard
6b40: 49 73 56 61 6c 69 64 43 6f 6e 74 65 78 74 28 29  IsValidContext()
6b50: 20 63 61 6c 6c 65 64 22 29 3b 0a 09 73 63 61 72   called");..scar
6b60: 64 5f 69 73 76 61 6c 69 64 5f 72 65 74 20 3d 20  d_isvalid_ret = 
6b70: 53 43 61 72 64 49 73 56 61 6c 69 64 43 6f 6e 74  SCardIsValidCont
6b80: 65 78 74 28 2a 63 61 63 6b 65 79 5f 70 63 73 63  ext(*cackey_pcsc
6b90: 5f 68 61 6e 64 6c 65 29 3b 0a 09 69 66 20 28 73  _handle);..if (s
6ba0: 63 61 72 64 5f 69 73 76 61 6c 69 64 5f 72 65 74  card_isvalid_ret
6bb0: 20 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43   != SCARD_S_SUCC
6bc0: 45 53 53 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ESS) {...CACKEY_
6bd0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 48 61  DEBUG_PRINTF("Ha
6be0: 6e 64 6c 65 20 68 61 73 20 62 65 63 6f 6d 65 20  ndle has become 
6bf0: 69 6e 76 61 6c 69 64 20 28 53 43 61 72 64 49 73  invalid (SCardIs
6c00: 56 61 6c 69 64 43 6f 6e 74 65 78 74 20 3d 20 25  ValidContext = %
6c10: 73 2f 25 6c 69 29 2c 20 74 72 79 69 6e 67 20 74  s/%li), trying t
6c20: 6f 20 72 65 2d 65 73 74 61 62 6c 69 73 68 2e 2e  o re-establish..
6c30: 2e 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47  .", CACKEY_DEBUG
6c40: 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54  _FUNC_SCARDERR_T
6c50: 4f 5f 53 54 52 28 73 63 61 72 64 5f 69 73 76 61  O_STR(scard_isva
6c60: 6c 69 64 5f 72 65 74 29 2c 20 28 6c 6f 6e 67 29  lid_ret), (long)
6c70: 20 73 63 61 72 64 5f 69 73 76 61 6c 69 64 5f 72   scard_isvalid_r
6c80: 65 74 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  et);....CACKEY_D
6c90: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43 61  EBUG_PRINTF("SCa
6ca0: 72 64 45 73 74 61 62 6c 69 73 68 43 6f 6e 74 65  rdEstablishConte
6cb0: 78 74 28 29 20 63 61 6c 6c 65 64 22 29 3b 0a 09  xt() called");..
6cc0: 09 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65  .scard_est_conte
6cd0: 78 74 5f 72 65 74 20 3d 20 53 43 61 72 64 45 73  xt_ret = SCardEs
6ce0: 74 61 62 6c 69 73 68 43 6f 6e 74 65 78 74 28 53  tablishContext(S
6cf0: 43 41 52 44 5f 53 43 4f 50 45 5f 53 59 53 54 45  CARD_SCOPE_SYSTE
6d00: 4d 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 63  M, NULL, NULL, c
6d10: 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c  ackey_pcsc_handl
6d20: 65 29 3b 0a 09 09 69 66 20 28 73 63 61 72 64 5f  e);...if (scard_
6d30: 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74 20  est_context_ret 
6d40: 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45  != SCARD_S_SUCCE
6d50: 53 53 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  SS) {....CACKEY_
6d60: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
6d70: 6c 6c 20 74 6f 20 53 43 61 72 64 45 73 74 61 62  ll to SCardEstab
6d80: 6c 69 73 68 43 6f 6e 74 65 78 74 20 66 61 69 6c  lishContext fail
6d90: 65 64 20 28 72 65 74 75 72 6e 65 64 20 25 73 2f  ed (returned %s/
6da0: 25 6c 69 29 2c 20 72 65 74 75 72 6e 69 6e 67 20  %li), returning 
6db0: 69 6e 20 66 61 69 6c 75 72 65 22 2c 20 43 41 43  in failure", CAC
6dc0: 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53  KEY_DEBUG_FUNC_S
6dd0: 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73  CARDERR_TO_STR(s
6de0: 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74  card_est_context
6df0: 5f 72 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63  _ret), (long) sc
6e00: 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f  ard_est_context_
6e10: 72 65 74 29 3b 0a 0a 09 09 09 66 72 65 65 28 63  ret);.....free(c
6e20: 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c  ackey_pcsc_handl
6e30: 65 29 3b 0a 09 09 09 63 61 63 6b 65 79 5f 70 63  e);....cackey_pc
6e40: 73 63 5f 68 61 6e 64 6c 65 20 3d 20 4e 55 4c 4c  sc_handle = NULL
6e50: 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f  ;.....cackey_slo
6e60: 74 73 5f 64 69 73 63 6f 6e 6e 65 63 74 5f 61 6c  ts_disconnect_al
6e70: 6c 28 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28  l();.....return(
6e80: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45  CACKEY_PCSC_E_GE
6e90: 4e 45 52 49 43 29 3b 0a 09 09 7d 0a 0a 09 09 43  NERIC);...}....C
6ea0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
6eb0: 54 46 28 22 48 61 6e 64 6c 65 20 68 61 73 20 62  TF("Handle has b
6ec0: 65 65 6e 20 72 65 2d 65 73 74 61 62 6c 69 73 68  een re-establish
6ed0: 65 64 22 29 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a  ed");..}.#endif.
6ee0: 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
6ef0: 52 49 4e 54 46 28 22 53 75 63 65 73 73 66 75 6c  RINTF("Sucessful
6f00: 6c 79 20 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20  ly connected to 
6f10: 50 43 2f 53 43 2c 20 72 65 74 75 72 6e 69 6e 67  PC/SC, returning
6f20: 20 69 6e 20 73 75 63 63 65 73 73 22 29 3b 0a 0a   in success");..
6f30: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
6f40: 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a  CSC_S_OK);.}../*
6f50: 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20  . * SYNPOSIS. * 
6f60: 20 20 20 20 63 61 63 6b 65 79 5f 72 65 74 20 63      cackey_ret c
6f70: 61 63 6b 65 79 5f 70 63 73 63 5f 64 69 73 63 6f  ackey_pcsc_disco
6f80: 6e 6e 65 63 74 28 76 6f 69 64 29 3b 0a 20 2a 0a  nnect(void);. *.
6f90: 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20   * ARGUMENTS. * 
6fa0: 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 52      None. *. * R
6fb0: 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20  ETURN VALUE. *  
6fc0: 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53     CACKEY_PCSC_S
6fd0: 5f 4f 4b 20 20 20 20 20 20 20 20 20 4f 6e 20 73  _OK         On s
6fe0: 75 63 63 65 73 73 0a 20 2a 20 20 20 20 20 43 41  uccess. *     CA
6ff0: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45  CKEY_PCSC_E_GENE
7000: 52 49 43 20 20 20 20 4f 6e 20 65 72 72 6f 72 0a  RIC    On error.
7010: 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20   *. * NOTES. *  
7020: 20 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e     This function
7030: 20 64 69 73 63 6f 6e 6e 65 63 74 73 20 66 72 6f   disconnects fro
7040: 6d 20 74 68 65 20 50 43 2f 53 43 20 43 6f 6e 6e  m the PC/SC Conn
7050: 65 63 74 69 6f 6e 20 6d 61 6e 61 67 65 72 20 61  ection manager a
7060: 6e 64 20 75 70 64 61 74 65 73 0a 20 2a 20 20 20  nd updates. *   
7070: 20 20 74 68 65 20 67 6c 6f 62 61 6c 20 68 61 6e    the global han
7080: 64 6c 65 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74  dle.. *. */.stat
7090: 69 63 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61  ic cackey_ret ca
70a0: 63 6b 65 79 5f 70 63 73 63 5f 64 69 73 63 6f 6e  ckey_pcsc_discon
70b0: 6e 65 63 74 28 76 6f 69 64 29 20 7b 0a 09 4c 4f  nect(void) {..LO
70c0: 4e 47 20 73 63 61 72 64 5f 72 65 6c 5f 63 6f 6e  NG scard_rel_con
70d0: 74 65 78 74 5f 72 65 74 3b 0a 0a 09 43 41 43 4b  text_ret;...CACK
70e0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
70f0: 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
7100: 20 28 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61   (cackey_pcsc_ha
7110: 6e 64 6c 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  ndle == NULL) {.
7120: 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
7130: 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 09 7d 0a 0a  PCSC_S_OK);..}..
7140: 09 73 63 61 72 64 5f 72 65 6c 5f 63 6f 6e 74 65  .scard_rel_conte
7150: 78 74 5f 72 65 74 20 3d 20 53 43 61 72 64 52 65  xt_ret = SCardRe
7160: 6c 65 61 73 65 43 6f 6e 74 65 78 74 28 2a 63 61  leaseContext(*ca
7170: 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65  ckey_pcsc_handle
7180: 29 3b 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f  );...if (cackey_
7190: 70 63 73 63 5f 68 61 6e 64 6c 65 29 20 7b 0a 09  pcsc_handle) {..
71a0: 09 66 72 65 65 28 63 61 63 6b 65 79 5f 70 63 73  .free(cackey_pcs
71b0: 63 5f 68 61 6e 64 6c 65 29 3b 0a 09 0a 09 09 63  c_handle);.....c
71c0: 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c  ackey_pcsc_handl
71d0: 65 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 0a 09 69  e = NULL;..}...i
71e0: 66 20 28 73 63 61 72 64 5f 72 65 6c 5f 63 6f 6e  f (scard_rel_con
71f0: 74 65 78 74 5f 72 65 74 20 21 3d 20 53 43 41 52  text_ret != SCAR
7200: 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09  D_S_SUCCESS) {..
7210: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
7220: 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a  CSC_E_GENERIC);.
7230: 09 7d 0a 0a 09 72 65 74 75 72 6e 28 43 41 43 4b  .}...return(CACK
7240: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d  EY_PCSC_S_OK);.}
7250: 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53  ../*. * SYNPOSIS
7260: 0a 20 2a 20 20 20 20 20 76 6f 69 64 20 63 61 63  . *     void cac
7270: 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65  key_mark_slot_re
7280: 73 65 74 28 73 74 72 75 63 74 20 63 61 63 6b 65  set(struct cacke
7290: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 3b 0a 20  y_slot *slot);. 
72a0: 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20  *. * ARGUMENTS. 
72b0: 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a  *     None. *. *
72c0: 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a   RETURN VALUE. *
72d0: 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 20       None. *. * 
72e0: 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 54 68 69  NOTES. *     Thi
72f0: 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 72 6b 73  s function marks
7300: 20 61 20 73 6c 6f 74 20 68 61 73 20 68 61 76 69   a slot has havi
7310: 6e 67 20 62 65 65 6e 20 72 65 73 65 74 2c 20 74  ng been reset, t
7320: 6f 20 6c 61 74 65 72 20 62 65 20 63 6c 65 61 6e  o later be clean
7330: 65 64 20 75 70 2e 0a 20 2a 20 20 20 20 20 43 6c  ed up.. *     Cl
7340: 65 61 6e 75 70 20 6f 6e 6c 79 20 68 61 70 70 65  eanup only happe
7350: 6e 73 20 77 68 65 6e 20 61 20 50 4b 43 53 23 31  ns when a PKCS#1
7360: 31 20 63 6c 69 65 6e 74 20 63 61 6c 6c 73 20 43  1 client calls C
7370: 5f 46 69 6e 64 4f 62 6a 65 63 74 73 49 6e 69 74  _FindObjectsInit
7380: 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20  .. *. */.static 
7390: 76 6f 69 64 20 63 61 63 6b 65 79 5f 6d 61 72 6b  void cackey_mark
73a0: 5f 73 6c 6f 74 5f 72 65 73 65 74 28 73 74 72 75  _slot_reset(stru
73b0: 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a  ct cackey_slot *
73c0: 73 6c 6f 74 29 20 7b 0a 09 69 66 20 28 73 6c 6f  slot) {..if (slo
73d0: 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72  t == NULL) {...r
73e0: 65 74 75 72 6e 3b 0a 09 7d 0a 0a 09 43 41 43 4b  eturn;..}...CACK
73f0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
7400: 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
7410: 20 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72   (slot->pcsc_car
7420: 64 5f 63 6f 6e 6e 65 63 74 65 64 29 20 7b 0a 09  d_connected) {..
7430: 09 53 43 61 72 64 44 69 73 63 6f 6e 6e 65 63 74  .SCardDisconnect
7440: 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64  (slot->pcsc_card
7450: 2c 20 53 43 41 52 44 5f 4c 45 41 56 45 5f 43 41  , SCARD_LEAVE_CA
7460: 52 44 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 2d 3e  RD);..}...slot->
7470: 73 6c 6f 74 5f 72 65 73 65 74 20 3d 20 31 3b 0a  slot_reset = 1;.
7480: 09 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64  .slot->pcsc_card
7490: 5f 63 6f 6e 6e 65 63 74 65 64 20 3d 20 30 3b 0a  _connected = 0;.
74a0: 09 69 66 20 28 63 61 63 6b 65 79 5f 70 69 6e 5f  .if (cackey_pin_
74b0: 63 6f 6d 6d 61 6e 64 20 3d 3d 20 4e 55 4c 4c 29  command == NULL)
74c0: 20 7b 0a 09 09 73 6c 6f 74 2d 3e 74 6f 6b 65 6e   {...slot->token
74d0: 5f 66 6c 61 67 73 20 3d 20 43 4b 46 5f 4c 4f 47  _flags = CKF_LOG
74e0: 49 4e 5f 52 45 51 55 49 52 45 44 3b 0a 09 7d 20  IN_REQUIRED;..} 
74f0: 65 6c 73 65 20 7b 0a 09 09 73 6c 6f 74 2d 3e 74  else {...slot->t
7500: 6f 6b 65 6e 5f 66 6c 61 67 73 20 3d 20 30 3b 0a  oken_flags = 0;.
7510: 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
7520: 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
7530: 69 6e 67 2e 22 29 3b 0a 0a 09 72 65 74 75 72 6e  ing.");...return
7540: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f  ;.}../*. * SYNPO
7550: 53 49 53 0a 20 2a 20 20 20 20 20 4c 4f 4e 47 20  SIS. *     LONG 
7560: 63 61 63 6b 65 79 5f 72 65 63 6f 6e 6e 65 63 74  cackey_reconnect
7570: 5f 63 61 72 64 28 73 74 72 75 63 74 20 63 61 63  _card(struct cac
7580: 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20  key_slot *slot, 
7590: 44 57 4f 52 44 20 64 65 66 61 75 6c 74 5f 70 72  DWORD default_pr
75a0: 6f 74 6f 63 6f 6c 29 3b 0a 20 2a 0a 20 2a 20 41  otocol);. *. * A
75b0: 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20  RGUMENTS. *     
75c0: 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f  cackey_slot *slo
75d0: 74 0a 20 2a 20 20 20 20 20 20 20 20 20 53 6c 6f  t. *         Slo
75e0: 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d 6d 61 6e  t to send comman
75f0: 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 20 20 20 20  ds to. *. *     
7600: 44 57 4f 52 44 20 64 65 66 61 75 6c 74 5f 70 72  DWORD default_pr
7610: 6f 74 6f 63 6f 6c 0a 20 2a 20 20 20 20 20 20 20  otocol. *       
7620: 20 20 50 72 6f 74 6f 63 6f 6c 20 74 6f 20 61 74    Protocol to at
7630: 74 65 6d 70 74 20 66 69 72 73 74 0a 20 2a 0a 20  tempt first. *. 
7640: 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20  * RETURN VALUE. 
7650: 2a 20 20 20 20 20 54 68 65 20 72 65 74 75 72 6e  *     The return
7660: 20 76 61 6c 75 65 20 66 72 6f 6d 20 53 43 61 72   value from SCar
7670: 64 52 65 63 6f 6e 6e 65 63 74 28 29 0a 20 2a 0a  dReconnect(). *.
7680: 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20   * NOTES. *     
7690: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
76a0: 20 61 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e   a wrapper aroun
76b0: 64 20 53 43 61 72 64 52 65 63 6f 6e 6e 65 63 74  d SCardReconnect
76c0: 28 29 0a 20 2a 0a 20 2a 20 20 20 20 20 54 68 65  (). *. *     The
76d0: 20 53 43 61 72 64 52 65 63 6f 6e 6e 65 63 74 28   SCardReconnect(
76e0: 29 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20  ) function call 
76f0: 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 66  will be called f
7700: 69 72 73 74 20 77 69 74 68 20 74 68 65 0a 20 2a  irst with the. *
7710: 20 20 20 20 20 64 77 50 72 65 66 65 72 72 65 64       dwPreferred
7720: 50 72 6f 74 6f 63 6f 6c 73 20 6f 66 20 22 64 65  Protocols of "de
7730: 66 61 75 6c 74 5f 70 72 6f 74 6f 63 6f 6c 22 2e  fault_protocol".
7740: 20 20 49 66 20 74 68 61 74 20 63 61 6c 6c 20 72    If that call r
7750: 65 74 75 72 6e 73 0a 20 2a 20 20 20 20 20 53 43  eturns. *     SC
7760: 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d  ARD_E_PROTO_MISM
7770: 41 54 43 48 20 74 72 79 20 61 67 61 69 6e 20 77  ATCH try again w
7780: 69 74 68 20 61 20 70 72 6f 74 6f 63 6f 6c 20 6f  ith a protocol o
7790: 66 20 54 3d 30 2c 20 61 6e 64 20 66 61 69 6c 69  f T=0, and faili
77a0: 6e 67 0a 20 2a 20 20 20 20 20 74 68 61 74 20 54  ng. *     that T
77b0: 3d 31 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69  =1.. *. */.stati
77c0: 63 20 4c 4f 4e 47 20 63 61 63 6b 65 79 5f 72 65  c LONG cackey_re
77d0: 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73 74 72  connect_card(str
77e0: 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20  uct cackey_slot 
77f0: 2a 73 6c 6f 74 2c 20 44 57 4f 52 44 20 64 65 66  *slot, DWORD def
7800: 61 75 6c 74 5f 70 72 6f 74 6f 63 6f 6c 29 20 7b  ault_protocol) {
7810: 0a 09 44 57 4f 52 44 20 73 65 6c 65 63 74 65 64  ..DWORD selected
7820: 5f 70 72 6f 74 6f 63 6f 6c 3b 0a 09 4c 4f 4e 47  _protocol;..LONG
7830: 20 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 3b   scard_conn_ret;
7840: 0a 0a 09 73 65 6c 65 63 74 65 64 5f 70 72 6f 74  ...selected_prot
7850: 6f 63 6f 6c 20 3d 20 30 3b 0a 0a 09 73 63 61 72  ocol = 0;...scar
7860: 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 53 43 61  d_conn_ret = SCa
7870: 72 64 52 65 63 6f 6e 6e 65 63 74 28 73 6c 6f 74  rdReconnect(slot
7880: 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 53 43 41  ->pcsc_card, SCA
7890: 52 44 5f 53 48 41 52 45 5f 53 48 41 52 45 44 2c  RD_SHARE_SHARED,
78a0: 20 64 65 66 61 75 6c 74 5f 70 72 6f 74 6f 63 6f   default_protoco
78b0: 6c 2c 20 53 43 41 52 44 5f 52 45 53 45 54 5f 43  l, SCARD_RESET_C
78c0: 41 52 44 2c 20 26 73 65 6c 65 63 74 65 64 5f 70  ARD, &selected_p
78d0: 72 6f 74 6f 63 6f 6c 29 3b 0a 0a 09 69 66 20 28  rotocol);...if (
78e0: 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d  scard_conn_ret =
78f0: 3d 20 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f  = SCARD_E_PROTO_
7900: 4d 49 53 4d 41 54 43 48 29 20 7b 0a 09 09 43 41  MISMATCH) {...CA
7910: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
7920: 46 28 22 53 43 61 72 64 52 65 63 6f 6e 6e 65 63  F("SCardReconnec
7930: 74 28 29 20 72 65 74 75 72 6e 65 64 20 53 43 41  t() returned SCA
7940: 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41  RD_E_PROTO_MISMA
7950: 54 43 48 2c 20 74 72 79 69 6e 67 20 77 69 74 68  TCH, trying with
7960: 20 6a 75 73 74 20 54 3d 30 22 29 0a 09 09 73 63   just T=0")...sc
7970: 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 53  ard_conn_ret = S
7980: 43 61 72 64 52 65 63 6f 6e 6e 65 63 74 28 73 6c  CardReconnect(sl
7990: 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 53  ot->pcsc_card, S
79a0: 43 41 52 44 5f 53 48 41 52 45 5f 53 48 41 52 45  CARD_SHARE_SHARE
79b0: 44 2c 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f  D, SCARD_PROTOCO
79c0: 4c 5f 54 30 2c 20 53 43 41 52 44 5f 52 45 53 45  L_T0, SCARD_RESE
79d0: 54 5f 43 41 52 44 2c 20 26 73 65 6c 65 63 74 65  T_CARD, &selecte
79e0: 64 5f 70 72 6f 74 6f 63 6f 6c 29 3b 0a 0a 09 09  d_protocol);....
79f0: 69 66 20 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72  if (scard_conn_r
7a00: 65 74 20 3d 3d 20 53 43 41 52 44 5f 45 5f 50 52  et == SCARD_E_PR
7a10: 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 29 20 7b 0a  OTO_MISMATCH) {.
7a20: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
7a30: 50 52 49 4e 54 46 28 22 53 43 61 72 64 52 65 63  PRINTF("SCardRec
7a40: 6f 6e 6e 65 63 74 28 29 20 72 65 74 75 72 6e 65  onnect() returne
7a50: 64 20 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f  d SCARD_E_PROTO_
7a60: 4d 49 53 4d 41 54 43 48 2c 20 74 72 79 69 6e 67  MISMATCH, trying
7a70: 20 77 69 74 68 20 6a 75 73 74 20 54 3d 31 22 29   with just T=1")
7a80: 0a 09 09 09 73 63 61 72 64 5f 63 6f 6e 6e 5f 72  ....scard_conn_r
7a90: 65 74 20 3d 20 53 43 61 72 64 52 65 63 6f 6e 6e  et = SCardReconn
7aa0: 65 63 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63  ect(slot->pcsc_c
7ab0: 61 72 64 2c 20 53 43 41 52 44 5f 53 48 41 52 45  ard, SCARD_SHARE
7ac0: 5f 53 48 41 52 45 44 2c 20 53 43 41 52 44 5f 50  _SHARED, SCARD_P
7ad0: 52 4f 54 4f 43 4f 4c 5f 54 31 2c 20 53 43 41 52  ROTOCOL_T1, SCAR
7ae0: 44 5f 52 45 53 45 54 5f 43 41 52 44 2c 20 26 73  D_RESET_CARD, &s
7af0: 65 6c 65 63 74 65 64 5f 70 72 6f 74 6f 63 6f 6c  elected_protocol
7b00: 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28  );...}..}...if (
7b10: 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d  scard_conn_ret =
7b20: 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53  = SCARD_S_SUCCES
7b30: 53 29 20 7b 0a 09 09 73 6c 6f 74 2d 3e 70 72 6f  S) {...slot->pro
7b40: 74 6f 63 6f 6c 20 3d 20 73 65 6c 65 63 74 65 64  tocol = selected
7b50: 5f 70 72 6f 74 6f 63 6f 6c 3b 0a 09 7d 0a 0a 09  _protocol;..}...
7b60: 72 65 74 75 72 6e 28 73 63 61 72 64 5f 63 6f 6e  return(scard_con
7b70: 6e 5f 72 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a  n_ret);.}../*. *
7b80: 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20   SYNPOSIS. *    
7b90: 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b   cackey_ret cack
7ba0: 65 79 5f 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28  ey_connect_card(
7bb0: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c  struct cackey_sl
7bc0: 6f 74 20 2a 73 6c 6f 74 29 3b 0a 20 2a 0a 20 2a  ot *slot);. *. *
7bd0: 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20   ARGUMENTS. *   
7be0: 20 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73    cackey_slot *s
7bf0: 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20 53  lot. *         S
7c00: 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d 6d  lot to send comm
7c10: 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 52 45  ands to. *. * RE
7c20: 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20  TURN VALUE. *   
7c30: 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f    CACKEY_PCSC_S_
7c40: 4f 4b 20 20 20 20 20 20 20 20 20 4f 6e 20 73 75  OK         On su
7c50: 63 63 65 73 73 0a 20 2a 20 20 20 20 20 43 41 43  ccess. *     CAC
7c60: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52  KEY_PCSC_E_GENER
7c70: 49 43 20 20 20 20 4f 6e 20 65 72 72 6f 72 0a 20  IC    On error. 
7c80: 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20  *. * NOTES. *   
7c90: 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 2f 0a 73 74    None. *. */.st
7ca0: 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74 20  atic cackey_ret 
7cb0: 63 61 63 6b 65 79 5f 63 6f 6e 6e 65 63 74 5f 63  cackey_connect_c
7cc0: 61 72 64 28 73 74 72 75 63 74 20 63 61 63 6b 65  ard(struct cacke
7cd0: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 20 7b 0a  y_slot *slot) {.
7ce0: 09 63 61 63 6b 65 79 5f 72 65 74 20 70 63 73 63  .cackey_ret pcsc
7cf0: 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 3b 0a 09 44  _connect_ret;..D
7d00: 57 4f 52 44 20 70 72 6f 74 6f 63 6f 6c 3b 0a 09  WORD protocol;..
7d10: 4c 4f 4e 47 20 73 63 61 72 64 5f 63 6f 6e 6e 5f  LONG scard_conn_
7d20: 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ret;...CACKEY_DE
7d30: 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
7d40: 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 73 6c  ed.");...if (!sl
7d50: 6f 74 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ot) {...CACKEY_D
7d60: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 49 6e 76  EBUG_PRINTF("Inv
7d70: 61 6c 69 64 20 73 6c 6f 74 20 73 70 65 63 69 66  alid slot specif
7d80: 69 65 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69  ied, returning i
7d90: 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09  n failure");....
7da0: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
7db0: 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09  SC_E_GENERIC);..
7dc0: 7d 0a 0a 09 70 63 73 63 5f 63 6f 6e 6e 65 63 74  }...pcsc_connect
7dd0: 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 70 63  _ret = cackey_pc
7de0: 73 63 5f 63 6f 6e 6e 65 63 74 28 29 3b 0a 09 69  sc_connect();..i
7df0: 66 20 28 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f  f (pcsc_connect_
7e00: 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43  ret != CACKEY_PC
7e10: 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43  SC_S_OK) {...CAC
7e20: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
7e30: 28 22 43 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  ("Connection to 
7e40: 50 43 2f 53 43 20 66 61 69 6c 65 64 2c 20 72 65  PC/SC failed, re
7e50: 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
7e60: 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  re");....return(
7e70: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45  CACKEY_PCSC_E_GE
7e80: 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 2f 2a 20  NERIC);..}.../* 
7e90: 43 6f 6e 6e 65 63 74 20 74 6f 20 72 65 61 64 65  Connect to reade
7ea0: 72 2c 20 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a  r, if needed */.
7eb0: 09 69 66 20 28 21 73 6c 6f 74 2d 3e 70 63 73 63  .if (!slot->pcsc
7ec0: 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 29  _card_connected)
7ed0: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
7ee0: 47 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64 43  G_PRINTF("SCardC
7ef0: 6f 6e 6e 65 63 74 28 25 73 29 20 63 61 6c 6c 65  onnect(%s) calle
7f00: 64 20 66 6f 72 20 73 6c 6f 74 20 25 70 22 2c 20  d for slot %p", 
7f10: 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64 65  slot->pcsc_reade
7f20: 72 2c 20 73 6c 6f 74 29 3b 0a 09 09 73 63 61 72  r, slot);...scar
7f30: 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 53 43 61  d_conn_ret = SCa
7f40: 72 64 43 6f 6e 6e 65 63 74 28 2a 63 61 63 6b 65  rdConnect(*cacke
7f50: 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20 73  y_pcsc_handle, s
7f60: 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64 65 72  lot->pcsc_reader
7f70: 2c 20 53 43 41 52 44 5f 53 48 41 52 45 5f 53 48  , SCARD_SHARE_SH
7f80: 41 52 45 44 2c 20 53 43 41 52 44 5f 50 52 4f 54  ARED, SCARD_PROT
7f90: 4f 43 4f 4c 5f 54 30 20 7c 20 53 43 41 52 44 5f  OCOL_T0 | SCARD_
7fa0: 50 52 4f 54 4f 43 4f 4c 5f 54 31 2c 20 26 73 6c  PROTOCOL_T1, &sl
7fb0: 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 26  ot->pcsc_card, &
7fc0: 70 72 6f 74 6f 63 6f 6c 29 3b 0a 0a 09 09 69 66  protocol);....if
7fd0: 20 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74   (scard_conn_ret
7fe0: 20 3d 3d 20 53 43 41 52 44 5f 45 5f 50 52 4f 54   == SCARD_E_PROT
7ff0: 4f 5f 4d 49 53 4d 41 54 43 48 29 20 7b 0a 09 09  O_MISMATCH) {...
8000: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
8010: 49 4e 54 46 28 22 53 43 61 72 64 43 6f 6e 6e 65  INTF("SCardConne
8020: 63 74 28 29 20 72 65 74 75 72 6e 65 64 20 53 43  ct() returned SC
8030: 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d  ARD_E_PROTO_MISM
8040: 41 54 43 48 2c 20 74 72 79 69 6e 67 20 77 69 74  ATCH, trying wit
8050: 68 20 6a 75 73 74 20 54 3d 30 22 29 0a 09 09 09  h just T=0")....
8060: 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d  scard_conn_ret =
8070: 20 53 43 61 72 64 43 6f 6e 6e 65 63 74 28 2a 63   SCardConnect(*c
8080: 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c  ackey_pcsc_handl
8090: 65 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 65  e, slot->pcsc_re
80a0: 61 64 65 72 2c 20 53 43 41 52 44 5f 53 48 41 52  ader, SCARD_SHAR
80b0: 45 5f 53 48 41 52 45 44 2c 20 53 43 41 52 44 5f  E_SHARED, SCARD_
80c0: 50 52 4f 54 4f 43 4f 4c 5f 54 30 2c 20 26 73 6c  PROTOCOL_T0, &sl
80d0: 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 26  ot->pcsc_card, &
80e0: 70 72 6f 74 6f 63 6f 6c 29 3b 0a 0a 09 09 09 69  protocol);.....i
80f0: 66 20 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65  f (scard_conn_re
8100: 74 20 3d 3d 20 53 43 41 52 44 5f 45 5f 50 52 4f  t == SCARD_E_PRO
8110: 54 4f 5f 4d 49 53 4d 41 54 43 48 29 20 7b 0a 09  TO_MISMATCH) {..
8120: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
8130: 50 52 49 4e 54 46 28 22 53 43 61 72 64 43 6f 6e  PRINTF("SCardCon
8140: 6e 65 63 74 28 29 20 72 65 74 75 72 6e 65 64 20  nect() returned 
8150: 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49  SCARD_E_PROTO_MI
8160: 53 4d 41 54 43 48 2c 20 74 72 79 69 6e 67 20 77  SMATCH, trying w
8170: 69 74 68 20 6a 75 73 74 20 54 3d 31 22 29 0a 09  ith just T=1")..
8180: 09 09 09 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65  ...scard_conn_re
8190: 74 20 3d 20 53 43 61 72 64 43 6f 6e 6e 65 63 74  t = SCardConnect
81a0: 28 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61  (*cackey_pcsc_ha
81b0: 6e 64 6c 65 2c 20 73 6c 6f 74 2d 3e 70 63 73 63  ndle, slot->pcsc
81c0: 5f 72 65 61 64 65 72 2c 20 53 43 41 52 44 5f 53  _reader, SCARD_S
81d0: 48 41 52 45 5f 53 48 41 52 45 44 2c 20 53 43 41  HARE_SHARED, SCA
81e0: 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31 2c 20  RD_PROTOCOL_T1, 
81f0: 26 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64  &slot->pcsc_card
8200: 2c 20 26 70 72 6f 74 6f 63 6f 6c 29 3b 0a 09 09  , &protocol);...
8210: 09 7d 0a 09 09 7d 0a 0a 09 09 69 66 20 28 73 63  .}...}....if (sc
8220: 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20  ard_conn_ret == 
8230: 53 43 41 52 44 5f 57 5f 55 4e 50 4f 57 45 52 45  SCARD_W_UNPOWERE
8240: 44 5f 43 41 52 44 29 20 7b 0a 09 09 09 43 41 43  D_CARD) {....CAC
8250: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
8260: 28 22 53 43 61 72 64 43 6f 6e 6e 65 63 74 28 29  ("SCardConnect()
8270: 20 72 65 74 75 72 6e 65 64 20 53 43 41 52 44 5f   returned SCARD_
8280: 57 5f 55 4e 50 4f 57 45 52 45 44 5f 43 41 52 44  W_UNPOWERED_CARD
8290: 2c 20 74 72 79 69 6e 67 20 74 6f 20 72 65 2d 63  , trying to re-c
82a0: 6f 6e 6e 65 63 74 2e 2e 2e 22 29 3b 0a 0a 09 09  onnect...");....
82b0: 09 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20  .scard_conn_ret 
82c0: 3d 20 53 43 61 72 64 43 6f 6e 6e 65 63 74 28 2a  = SCardConnect(*
82d0: 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64  cackey_pcsc_hand
82e0: 6c 65 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72  le, slot->pcsc_r
82f0: 65 61 64 65 72 2c 20 53 43 41 52 44 5f 53 48 41  eader, SCARD_SHA
8300: 52 45 5f 44 49 52 45 43 54 2c 20 53 43 41 52 44  RE_DIRECT, SCARD
8310: 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 20 7c 20 53  _PROTOCOL_T0 | S
8320: 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31  CARD_PROTOCOL_T1
8330: 2c 20 26 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61  , &slot->pcsc_ca
8340: 72 64 2c 20 26 70 72 6f 74 6f 63 6f 6c 29 3b 0a  rd, &protocol);.
8350: 0a 09 09 09 69 66 20 28 73 63 61 72 64 5f 63 6f  ....if (scard_co
8360: 6e 6e 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f  nn_ret == SCARD_
8370: 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48  E_PROTO_MISMATCH
8380: 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  ) {.....CACKEY_D
8390: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43 61  EBUG_PRINTF("SCa
83a0: 72 64 43 6f 6e 6e 65 63 74 28 29 20 72 65 74 75  rdConnect() retu
83b0: 72 6e 65 64 20 53 43 41 52 44 5f 45 5f 50 52 4f  rned SCARD_E_PRO
83c0: 54 4f 5f 4d 49 53 4d 41 54 43 48 2c 20 74 72 79  TO_MISMATCH, try
83d0: 69 6e 67 20 77 69 74 68 20 6a 75 73 74 20 54 3d  ing with just T=
83e0: 30 22 29 0a 09 09 09 09 73 63 61 72 64 5f 63 6f  0").....scard_co
83f0: 6e 6e 5f 72 65 74 20 3d 20 53 43 61 72 64 43 6f  nn_ret = SCardCo
8400: 6e 6e 65 63 74 28 2a 63 61 63 6b 65 79 5f 70 63  nnect(*cackey_pc
8410: 73 63 5f 68 61 6e 64 6c 65 2c 20 73 6c 6f 74 2d  sc_handle, slot-
8420: 3e 70 63 73 63 5f 72 65 61 64 65 72 2c 20 53 43  >pcsc_reader, SC
8430: 41 52 44 5f 53 48 41 52 45 5f 53 48 41 52 45 44  ARD_SHARE_SHARED
8440: 2c 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c  , SCARD_PROTOCOL
8450: 5f 54 30 2c 20 26 73 6c 6f 74 2d 3e 70 63 73 63  _T0, &slot->pcsc
8460: 5f 63 61 72 64 2c 20 26 70 72 6f 74 6f 63 6f 6c  _card, &protocol
8470: 29 3b 0a 0a 09 09 09 09 69 66 20 28 73 63 61 72  );......if (scar
8480: 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53 43  d_conn_ret == SC
8490: 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d  ARD_E_PROTO_MISM
84a0: 41 54 43 48 29 20 7b 0a 09 09 09 09 09 43 41 43  ATCH) {......CAC
84b0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
84c0: 28 22 53 43 61 72 64 43 6f 6e 6e 65 63 74 28 29  ("SCardConnect()
84d0: 20 72 65 74 75 72 6e 65 64 20 53 43 41 52 44 5f   returned SCARD_
84e0: 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48  E_PROTO_MISMATCH
84f0: 2c 20 74 72 79 69 6e 67 20 77 69 74 68 20 6a 75  , trying with ju
8500: 73 74 20 54 3d 31 22 29 0a 09 09 09 09 09 73 63  st T=1")......sc
8510: 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 53  ard_conn_ret = S
8520: 43 61 72 64 43 6f 6e 6e 65 63 74 28 2a 63 61 63  CardConnect(*cac
8530: 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c  key_pcsc_handle,
8540: 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64   slot->pcsc_read
8550: 65 72 2c 20 53 43 41 52 44 5f 53 48 41 52 45 5f  er, SCARD_SHARE_
8560: 53 48 41 52 45 44 2c 20 53 43 41 52 44 5f 50 52  SHARED, SCARD_PR
8570: 4f 54 4f 43 4f 4c 5f 54 31 2c 20 26 73 6c 6f 74  OTOCOL_T1, &slot
8580: 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 26 70 72  ->pcsc_card, &pr
8590: 6f 74 6f 63 6f 6c 29 3b 0a 09 09 09 09 7d 0a 09  otocol);.....}..
85a0: 09 09 7d 0a 0a 09 09 09 73 63 61 72 64 5f 63 6f  ..}.....scard_co
85b0: 6e 6e 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f  nn_ret = cackey_
85c0: 72 65 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73  reconnect_card(s
85d0: 6c 6f 74 2c 20 70 72 6f 74 6f 63 6f 6c 29 3b 0a  lot, protocol);.
85e0: 09 09 7d 0a 0a 09 09 69 66 20 28 73 63 61 72 64  ..}....if (scard
85f0: 5f 63 6f 6e 6e 5f 72 65 74 20 21 3d 20 53 43 41  _conn_ret != SCA
8600: 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a  RD_S_SUCCESS) {.
8610: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
8620: 50 52 49 4e 54 46 28 22 43 6f 6e 6e 65 63 74 69  PRINTF("Connecti
8630: 6f 6e 20 74 6f 20 63 61 72 64 20 66 61 69 6c 65  on to card faile
8640: 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20  d, returning in 
8650: 66 61 69 6c 75 72 65 20 28 53 43 61 72 64 43 6f  failure (SCardCo
8660: 6e 6e 65 63 74 28 29 20 3d 20 25 73 2f 25 6c 69  nnect() = %s/%li
8670: 29 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47  )", CACKEY_DEBUG
8680: 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54  _FUNC_SCARDERR_T
8690: 4f 5f 53 54 52 28 73 63 61 72 64 5f 63 6f 6e 6e  O_STR(scard_conn
86a0: 5f 72 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63  _ret), (long) sc
86b0: 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 29 3b 0a 0a  ard_conn_ret);..
86c0: 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
86d0: 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29  _PCSC_E_GENERIC)
86e0: 3b 0a 09 09 7d 0a 0a 09 09 73 6c 6f 74 2d 3e 70  ;...}....slot->p
86f0: 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74  csc_card_connect
8700: 65 64 20 3d 20 31 3b 0a 09 09 73 6c 6f 74 2d 3e  ed = 1;...slot->
8710: 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74  transaction_dept
8720: 68 20 3d 20 30 3b 0a 09 09 73 6c 6f 74 2d 3e 74  h = 0;...slot->t
8730: 72 61 6e 73 61 63 74 69 6f 6e 5f 6e 65 65 64 5f  ransaction_need_
8740: 68 77 5f 6c 6f 63 6b 20 3d 20 30 3b 0a 09 09 73  hw_lock = 0;...s
8750: 6c 6f 74 2d 3e 70 72 6f 74 6f 63 6f 6c 20 3d 20  lot->protocol = 
8760: 70 72 6f 74 6f 63 6f 6c 3b 0a 09 7d 0a 0a 09 43  protocol;..}...C
8770: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
8780: 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e  TF("Returning in
8790: 20 73 75 63 63 65 73 73 22 29 3b 0a 0a 09 72 65   success");...re
87a0: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
87b0: 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a  _S_OK);.}../*. *
87c0: 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20   SYNPOSIS. *    
87d0: 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b   cackey_ret cack
87e0: 65 79 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 63  ey_begin_transac
87f0: 74 69 6f 6e 28 73 74 72 75 63 74 20 63 61 63 6b  tion(struct cack
8800: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 3b 0a  ey_slot *slot);.
8810: 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a   *. * ARGUMENTS.
8820: 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 73 6c   *     cackey_sl
8830: 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20  ot *slot. *     
8840: 20 20 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64      Slot to send
8850: 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a   commands to. *.
8860: 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a   * RETURN VALUE.
8870: 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43   *     CACKEY_PC
8880: 53 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 20  SC_S_OK         
8890: 4f 6e 20 73 75 63 63 65 73 73 0a 20 2a 20 20 20  On success. *   
88a0: 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f    CACKEY_PCSC_E_
88b0: 47 45 4e 45 52 49 43 20 20 20 20 4f 6e 20 65 72  GENERIC    On er
88c0: 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a  ror. *. * NOTES.
88d0: 20 2a 20 20 20 20 20 54 68 65 20 74 72 61 6e 73   *     The trans
88e0: 61 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65  action should be
88f0: 20 74 65 72 6d 69 6e 61 74 65 64 20 75 73 69 6e   terminated usin
8900: 67 20 22 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72  g "cackey_end_tr
8910: 61 6e 73 61 63 74 69 6f 6e 22 0a 20 2a 0a 20 2a  ansaction". *. *
8920: 2f 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f  /.static cackey_
8930: 72 65 74 20 63 61 63 6b 65 79 5f 62 65 67 69 6e  ret cackey_begin
8940: 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 74 72  _transaction(str
8950: 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20  uct cackey_slot 
8960: 2a 73 6c 6f 74 29 20 7b 0a 09 63 61 63 6b 65 79  *slot) {..cackey
8970: 5f 72 65 74 20 63 61 63 6b 65 79 5f 63 6f 6e 6e  _ret cackey_conn
8980: 5f 72 65 74 3b 0a 09 4c 4f 4e 47 20 73 63 61 72  _ret;..LONG scar
8990: 64 5f 74 72 61 6e 73 5f 72 65 74 3b 0a 0a 09 43  d_trans_ret;...C
89a0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
89b0: 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
89c0: 09 63 61 63 6b 65 79 5f 63 6f 6e 6e 5f 72 65 74  .cackey_conn_ret
89d0: 20 3d 20 63 61 63 6b 65 79 5f 63 6f 6e 6e 65 63   = cackey_connec
89e0: 74 5f 63 61 72 64 28 73 6c 6f 74 29 3b 0a 09 69  t_card(slot);..i
89f0: 66 20 28 63 61 63 6b 65 79 5f 63 6f 6e 6e 5f 72  f (cackey_conn_r
8a00: 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53  et != CACKEY_PCS
8a10: 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b  C_S_OK) {...CACK
8a20: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
8a30: 22 55 6e 61 62 6c 65 20 74 6f 20 63 6f 6e 6e 65  "Unable to conne
8a40: 63 74 20 74 6f 20 63 61 72 64 2c 20 72 65 74 75  ct to card, retu
8a50: 72 6e 69 6e 67 20 69 6e 20 65 72 72 6f 72 22 29  rning in error")
8a60: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b  ;....return(CACK
8a70: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49  EY_PCSC_E_GENERI
8a80: 43 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 2d 3e 74  C);..}...slot->t
8a90: 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68  ransaction_depth
8aa0: 2b 2b 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 2d 3e  ++;...if (slot->
8ab0: 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74  transaction_dept
8ac0: 68 20 3e 20 31 20 26 26 20 21 73 6c 6f 74 2d 3e  h > 1 && !slot->
8ad0: 74 72 61 6e 73 61 63 74 69 6f 6e 5f 6e 65 65 64  transaction_need
8ae0: 5f 68 77 5f 6c 6f 63 6b 29 20 7b 0a 09 09 43 41  _hw_lock) {...CA
8af0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
8b00: 46 28 22 41 6c 72 65 61 64 79 20 69 6e 20 61 20  F("Already in a 
8b10: 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 70 65 72  transaction, per
8b20: 66 6f 72 6d 69 6e 67 20 6e 6f 20 61 63 74 69 6f  forming no actio
8b30: 6e 20 28 6e 65 77 20 64 65 70 74 68 20 3d 20 25  n (new depth = %
8b40: 69 29 22 2c 20 73 6c 6f 74 2d 3e 74 72 61 6e 73  i)", slot->trans
8b50: 61 63 74 69 6f 6e 5f 64 65 70 74 68 29 3b 0a 0a  action_depth);..
8b60: 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
8b70: 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 09 7d 0a 0a  PCSC_S_OK);..}..
8b80: 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69  .slot->transacti
8b90: 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b 20  on_need_hw_lock 
8ba0: 3d 20 30 3b 0a 0a 09 73 63 61 72 64 5f 74 72 61  = 0;...scard_tra
8bb0: 6e 73 5f 72 65 74 20 3d 20 53 43 61 72 64 42 65  ns_ret = SCardBe
8bc0: 67 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 28 73  ginTransaction(s
8bd0: 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 29 3b  lot->pcsc_card);
8be0: 0a 09 69 66 20 28 73 63 61 72 64 5f 74 72 61 6e  ..if (scard_tran
8bf0: 73 5f 72 65 74 20 21 3d 20 53 43 41 52 44 5f 53  s_ret != SCARD_S
8c00: 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09 43 41  _SUCCESS) {...CA
8c10: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
8c20: 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 62 65 67  F("Unable to beg
8c30: 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  in transaction, 
8c40: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 65 72 72  returning in err
8c50: 6f 72 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  or");....return(
8c60: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45  CACKEY_PCSC_E_GE
8c70: 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 43 41 43  NERIC);..}...CAC
8c80: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
8c90: 28 22 53 75 63 65 73 73 66 75 6c 6c 79 20 62 65  ("Sucessfully be
8ca0: 67 61 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  gan transaction 
8cb0: 6f 6e 20 73 6c 6f 74 20 28 25 73 29 22 2c 20 73  on slot (%s)", s
8cc0: 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64 65 72  lot->pcsc_reader
8cd0: 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41 43 4b  );...return(CACK
8ce0: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d  EY_PCSC_S_OK);.}
8cf0: 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53  ../*. * SYNPOSIS
8d00: 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 72  . *     cackey_r
8d10: 65 74 20 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72  et cackey_end_tr
8d20: 61 6e 73 61 63 74 69 6f 6e 28 73 74 72 75 63 74  ansaction(struct
8d30: 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c   cackey_slot *sl
8d40: 6f 74 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d  ot);. *. * ARGUM
8d50: 45 4e 54 53 0a 20 2a 20 20 20 20 20 63 61 63 6b  ENTS. *     cack
8d60: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a  ey_slot *slot. *
8d70: 20 20 20 20 20 20 20 20 20 53 6c 6f 74 20 74 6f           Slot to
8d80: 20 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74   send commands t
8d90: 6f 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56  o. *. * RETURN V
8da0: 41 4c 55 45 0a 20 2a 20 20 20 20 20 43 41 43 4b  ALUE. *     CACK
8db0: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20 20  EY_PCSC_S_OK    
8dc0: 20 20 20 20 20 4f 6e 20 73 75 63 63 65 73 73 0a       On success.
8dd0: 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43   *     CACKEY_PC
8de0: 53 43 5f 45 5f 47 45 4e 45 52 49 43 20 20 20 20  SC_E_GENERIC    
8df0: 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a 20 2a 20 4e  On error. *. * N
8e00: 4f 54 45 53 0a 20 2a 20 20 20 20 20 54 68 69 73  OTES. *     This
8e10: 20 66 75 6e 63 74 69 6f 6e 20 72 65 71 75 69 72   function requir
8e20: 65 73 20 22 63 61 63 6b 65 79 5f 62 65 67 69 6e  es "cackey_begin
8e30: 5f 74 72 61 6e 73 61 63 74 69 6f 6e 22 20 74 6f  _transaction" to
8e40: 20 62 65 20 63 61 6c 6c 65 64 20 66 69 72 73 74   be called first
8e50: 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63  . *. */.static c
8e60: 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79  ackey_ret cackey
8e70: 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
8e80: 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73  (struct cackey_s
8e90: 6c 6f 74 20 2a 73 6c 6f 74 29 20 7b 0a 09 4c 4f  lot *slot) {..LO
8ea0: 4e 47 20 73 63 61 72 64 5f 74 72 61 6e 73 5f 72  NG scard_trans_r
8eb0: 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  et;...CACKEY_DEB
8ec0: 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
8ed0: 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 73 6c 6f  d.");...if (!slo
8ee0: 74 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e  t->pcsc_card_con
8ef0: 6e 65 63 74 65 64 29 20 7b 0a 09 09 43 41 43 4b  nected) {...CACK
8f00: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
8f10: 22 43 61 72 64 20 69 73 20 6e 6f 74 20 63 6f 6e  "Card is not con
8f20: 6e 65 63 74 65 64 2c 20 75 6e 61 62 6c 65 20 74  nected, unable t
8f30: 6f 20 65 6e 64 20 74 72 61 6e 73 61 63 74 69 6f  o end transactio
8f40: 6e 20 6f 6e 20 63 61 72 64 22 29 3b 0a 0a 09 09  n on card");....
8f50: 69 66 20 28 73 6c 6f 74 2d 3e 74 72 61 6e 73 61  if (slot->transa
8f60: 63 74 69 6f 6e 5f 64 65 70 74 68 20 3e 20 30 29  ction_depth > 0)
8f70: 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
8f80: 55 47 5f 50 52 49 4e 54 46 28 22 44 65 63 72 65  UG_PRINTF("Decre
8f90: 61 73 69 6e 67 20 74 72 61 6e 73 61 63 74 69 6f  asing transactio
8fa0: 6e 20 64 65 70 74 68 20 61 6e 64 20 61 73 6b 69  n depth and aski
8fb0: 6e 67 20 66 6f 72 20 61 20 68 61 72 64 77 61 72  ng for a hardwar
8fc0: 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6e 65  e lock on the ne
8fd0: 78 74 20 62 65 67 69 6e 20 74 72 61 6e 73 61 63  xt begin transac
8fe0: 74 69 6f 6e 20 28 63 75 72 72 65 6e 74 20 64 65  tion (current de
8ff0: 70 74 68 20 3d 20 25 69 29 22 2c 20 73 6c 6f 74  pth = %i)", slot
9000: 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65  ->transaction_de
9010: 70 74 68 29 3b 0a 0a 09 09 09 73 6c 6f 74 2d 3e  pth);.....slot->
9020: 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74  transaction_dept
9030: 68 2d 2d 3b 0a 0a 09 09 09 69 66 20 28 73 6c 6f  h--;.....if (slo
9040: 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64  t->transaction_d
9050: 65 70 74 68 20 3e 20 30 29 20 7b 0a 09 09 09 09  epth > 0) {.....
9060: 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f  slot->transactio
9070: 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b 20 3d  n_need_hw_lock =
9080: 20 31 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09   1;....}...}....
9090: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
90a0: 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09  SC_E_GENERIC);..
90b0: 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 2d 3e 74 72  }...if (slot->tr
90c0: 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20  ansaction_depth 
90d0: 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  == 0) {...CACKEY
90e0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54  _DEBUG_PRINTF("T
90f0: 65 72 6d 69 6e 61 74 69 6e 67 20 61 20 74 72 61  erminating a tra
9100: 6e 73 61 63 74 69 6f 6e 20 74 68 61 74 20 68 61  nsaction that ha
9110: 73 20 6e 6f 74 20 62 65 67 75 6e 21 22 29 3b 0a  s not begun!");.
9120: 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
9130: 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29  _PCSC_E_GENERIC)
9140: 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 2d 3e 74 72 61  ;..}...slot->tra
9150: 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 2d 2d  nsaction_depth--
9160: 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 2d 3e 74 72  ;...if (slot->tr
9170: 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20  ansaction_depth 
9180: 3e 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  > 0) {...CACKEY_
9190: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54 72  DEBUG_PRINTF("Tr
91a0: 61 6e 73 61 63 74 69 6f 6e 73 20 73 74 69 6c 6c  ansactions still
91b0: 20 69 6e 20 70 72 6f 67 72 65 73 73 2c 20 6e 6f   in progress, no
91c0: 74 20 74 65 72 6d 69 6e 61 74 69 6e 67 20 6f 6e  t terminating on
91d0: 2d 63 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f  -card Transactio
91e0: 6e 20 28 63 75 72 72 65 6e 74 20 64 65 70 74 68  n (current depth
91f0: 20 3d 20 25 69 29 22 2c 20 73 6c 6f 74 2d 3e 74   = %i)", slot->t
9200: 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68  ransaction_depth
9210: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43  );....return(CAC
9220: 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a  KEY_PCSC_S_OK);.
9230: 09 7d 0a 0a 09 73 63 61 72 64 5f 74 72 61 6e 73  .}...scard_trans
9240: 5f 72 65 74 20 3d 20 53 43 61 72 64 45 6e 64 54  _ret = SCardEndT
9250: 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 2d  ransaction(slot-
9260: 3e 70 63 73 63 5f 63 61 72 64 2c 20 53 43 41 52  >pcsc_card, SCAR
9270: 44 5f 4c 45 41 56 45 5f 43 41 52 44 29 3b 0a 09  D_LEAVE_CARD);..
9280: 69 66 20 28 73 63 61 72 64 5f 74 72 61 6e 73 5f  if (scard_trans_
9290: 72 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f 53  ret != SCARD_S_S
92a0: 55 43 43 45 53 53 29 20 7b 0a 09 09 43 41 43 4b  UCCESS) {...CACK
92b0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
92c0: 22 55 6e 61 62 6c 65 20 74 6f 20 65 6e 64 20 74  "Unable to end t
92d0: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 72 65 74 75  ransaction, retu
92e0: 72 6e 69 6e 67 20 69 6e 20 65 72 72 6f 72 22 29  rning in error")
92f0: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b  ;....return(CACK
9300: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49  EY_PCSC_E_GENERI
9310: 43 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  C);..}...CACKEY_
9320: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 75  DEBUG_PRINTF("Su
9330: 63 65 73 73 66 75 6c 6c 79 20 74 65 72 6d 69 6e  cessfully termin
9340: 61 74 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e  ated transaction
9350: 20 6f 6e 20 73 6c 6f 74 20 28 25 73 29 22 2c 20   on slot (%s)", 
9360: 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64 65  slot->pcsc_reade
9370: 72 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41 43  r);...return(CAC
9380: 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a  KEY_PCSC_S_OK);.
9390: 7d 0a 0a 2f 2a 20 41 50 44 55 20 52 65 6c 61 74  }../* APDU Relat
93a0: 65 64 20 46 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a  ed Functions */.
93b0: 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20  /*. * SYNPOSIS. 
93c0: 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 72 65 74  *     cackey_ret
93d0: 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64   cackey_send_apd
93e0: 75 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  u(struct cackey_
93f0: 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69  slot *slot, unsi
9400: 67 6e 65 64 20 63 68 61 72 20 63 6c 61 73 73 2c  gned char class,
9410: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 69   unsigned char i
9420: 6e 73 74 72 75 63 74 69 6f 6e 2c 20 75 6e 73 69  nstruction, unsi
9430: 67 6e 65 64 20 63 68 61 72 20 70 31 2c 20 75 6e  gned char p1, un
9440: 73 69 67 6e 65 64 20 63 68 61 72 20 70 32 2c 20  signed char p2, 
9450: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6c 63  unsigned char lc
9460: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
9470: 2a 64 61 74 61 2c 20 75 6e 73 69 67 6e 65 64 20  *data, unsigned 
9480: 63 68 61 72 20 6c 65 2c 20 75 69 6e 74 31 36 5f  char le, uint16_
9490: 74 20 2a 72 65 73 70 63 6f 64 65 2c 20 75 6e 73  t *respcode, uns
94a0: 69 67 6e 65 64 20 63 68 61 72 20 2a 72 65 73 70  igned char *resp
94b0: 64 61 74 61 2c 20 73 69 7a 65 5f 74 20 2a 72 65  data, size_t *re
94c0: 73 70 64 61 74 61 5f 6c 65 6e 29 3b 0a 20 2a 0a  spdata_len);. *.
94d0: 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20   * ARGUMENTS. * 
94e0: 20 20 20 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20      cackey_slot 
94f0: 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20 20  *slot. *        
9500: 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f   Slot to send co
9510: 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20  mmands to. *. * 
9520: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
9530: 72 20 63 6c 61 73 73 0a 20 2a 20 20 20 20 20 20  r class. *      
9540: 20 20 20 41 50 44 55 20 43 6c 61 73 73 20 28 47     APDU Class (G
9550: 53 43 49 53 5f 43 4c 41 53 53 5f 49 53 4f 37 38  SCIS_CLASS_ISO78
9560: 31 36 20 6f 72 20 47 53 43 49 53 5f 43 4c 41 53  16 or GSCIS_CLAS
9570: 53 5f 47 4c 4f 42 41 4c 5f 50 4c 41 54 46 4f 52  S_GLOBAL_PLATFOR
9580: 4d 0a 20 2a 20 20 20 20 20 20 20 20 20 75 73 75  M. *         usu
9590: 61 6c 6c 79 29 2c 20 28 43 4c 41 29 0a 20 2a 0a  ally), (CLA). *.
95a0: 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20   *     unsigned 
95b0: 63 68 61 72 20 69 6e 73 74 72 75 63 74 69 6f 6e  char instruction
95c0: 0a 20 2a 20 20 20 20 20 20 20 20 20 41 50 44 55  . *         APDU
95d0: 20 49 6e 73 74 72 75 63 74 69 6f 6e 20 28 49 4e   Instruction (IN
95e0: 53 29 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73  S). *. *     uns
95f0: 69 67 6e 65 64 20 63 68 61 72 20 70 31 0a 20 2a  igned char p1. *
9600: 20 20 20 20 20 20 20 20 20 41 50 44 55 20 50 61           APDU Pa
9610: 72 61 6d 65 74 65 72 20 31 20 28 50 31 29 0a 20  rameter 1 (P1). 
9620: 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65  *. *     unsigne
9630: 64 20 63 68 61 72 20 70 32 0a 20 2a 20 20 20 20  d char p2. *    
9640: 20 20 20 20 20 41 50 44 55 20 50 61 72 61 6d 65       APDU Parame
9650: 74 65 72 20 32 20 28 50 32 29 0a 20 2a 0a 20 2a  ter 2 (P2). *. *
9660: 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68       unsigned ch
9670: 61 72 20 6c 63 0a 20 2a 20 20 20 20 20 20 20 20  ar lc. *        
9680: 20 41 50 44 55 20 4c 65 6e 67 74 68 20 6f 66 20   APDU Length of 
9690: 43 6f 6e 74 65 6e 74 20 28 4c 63 29 20 2d 2d 20  Content (Lc) -- 
96a0: 74 68 69 73 20 69 73 20 74 68 65 20 6c 65 6e 67  this is the leng
96b0: 74 68 20 6f 66 20 22 64 61 74 61 22 0a 20 2a 20  th of "data". * 
96c0: 20 20 20 20 20 20 20 20 70 61 72 61 6d 65 74 65          paramete
96d0: 72 2e 20 20 49 66 20 22 64 61 74 61 22 20 69 73  r.  If "data" is
96e0: 20 73 70 65 63 69 66 69 65 64 20 61 73 20 4e 55   specified as NU
96f0: 4c 4c 2c 20 74 68 69 73 20 70 61 72 61 6d 65 74  LL, this paramet
9700: 65 72 20 77 69 6c 6c 0a 20 2a 20 20 20 20 20 20  er will. *      
9710: 20 20 20 62 65 20 69 67 6e 6f 72 65 64 2e 0a 20     be ignored.. 
9720: 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65  *. *     unsigne
9730: 64 20 63 68 61 72 20 2a 64 61 74 61 0a 20 2a 20  d char *data. * 
9740: 20 20 20 20 20 20 20 20 50 6f 69 6e 74 65 72 20          Pointer 
9750: 74 6f 20 62 75 66 66 65 72 20 74 6f 20 73 65 6e  to buffer to sen
9760: 64 2e 20 20 49 74 20 73 68 6f 75 6c 64 20 62 65  d.  It should be
9770: 20 22 4c 63 22 20 62 79 74 65 73 20 6c 6f 6e 67   "Lc" bytes long
9780: 2e 20 20 49 66 0a 20 2a 20 20 20 20 20 20 20 20  .  If. *        
9790: 20 73 70 65 63 69 66 69 65 64 20 61 73 20 4e 55   specified as NU
97a0: 4c 4c 2c 20 22 4c 63 22 20 77 69 6c 6c 20 6e 6f  LL, "Lc" will no
97b0: 74 20 62 65 20 73 65 6e 74 2c 20 61 6e 64 20 74  t be sent, and t
97c0: 68 69 73 20 62 75 66 66 65 72 20 77 69 6c 6c 20  his buffer will 
97d0: 62 65 0a 20 2a 20 20 20 20 20 20 20 20 20 69 67  be. *         ig
97e0: 6e 6f 72 65 64 2e 0a 20 2a 0a 20 2a 20 20 20 20  nored.. *. *    
97f0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6c   unsigned char l
9800: 65 0a 20 2a 20 20 20 20 20 20 20 20 20 41 50 44  e. *         APD
9810: 55 20 4c 65 6e 67 74 68 20 6f 66 20 45 78 70 65  U Length of Expe
9820: 63 74 61 74 69 6f 6e 20 28 4c 65 29 20 2d 2d 20  ctation (Le) -- 
9830: 74 68 69 73 20 69 73 20 74 68 65 20 6c 65 6e 67  this is the leng
9840: 74 68 20 6f 66 20 74 68 65 0a 20 2a 20 20 20 20  th of the. *    
9850: 20 20 20 20 20 65 78 70 65 63 74 65 64 20 72 65       expected re
9860: 70 6c 79 2e 20 20 49 66 20 74 68 69 73 20 69 73  ply.  If this is
9870: 20 73 70 65 63 69 66 69 65 64 20 61 73 20 30 20   specified as 0 
9880: 74 68 65 6e 20 69 74 20 77 69 6c 6c 20 6e 6f 74  then it will not
9890: 0a 20 2a 20 20 20 20 20 20 20 20 20 62 65 20 73  . *         be s
98a0: 65 6e 74 2e 0a 20 2a 0a 20 2a 20 20 20 20 20 75  ent.. *. *     u
98b0: 69 6e 74 31 36 5f 74 20 2a 72 65 73 70 63 6f 64  int16_t *respcod
98c0: 65 0a 20 2a 20 20 20 20 20 20 20 20 20 5b 4f 55  e. *         [OU
98d0: 54 5d 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 74  T] Pointer to st
98e0: 6f 72 61 67 65 20 6f 66 20 41 50 44 55 20 72 65  orage of APDU re
98f0: 73 70 6f 6e 73 65 20 63 6f 64 65 2e 20 20 49 66  sponse code.  If
9900: 20 74 68 69 73 20 69 73 0a 20 2a 20 20 20 20 20   this is. *     
9910: 20 20 20 20 73 70 65 63 69 66 69 65 64 20 61 73      specified as
9920: 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65 73 70 6f   NULL, the respo
9930: 6e 73 65 20 63 6f 64 65 20 77 69 6c 6c 20 62 65  nse code will be
9940: 20 64 69 73 63 61 72 64 65 64 2e 0a 20 2a 0a 20   discarded.. *. 
9950: 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63  *     unsigned c
9960: 68 61 72 20 2a 72 65 73 70 64 61 74 61 0a 20 2a  har *respdata. *
9970: 20 20 20 20 20 20 20 20 20 5b 4f 55 54 5d 20 50           [OUT] P
9980: 6f 69 6e 74 65 72 20 74 6f 20 73 74 6f 72 61 67  ointer to storag
9990: 65 20 6f 66 20 41 50 44 55 20 72 65 73 70 6f 6e  e of APDU respon
99a0: 73 65 20 64 61 74 61 2e 20 20 49 66 20 74 68 69  se data.  If thi
99b0: 73 20 69 73 0a 20 2a 20 20 20 20 20 20 20 20 20  s is. *         
99c0: 73 70 65 63 69 66 69 65 64 20 61 73 20 4e 55 4c  specified as NUL
99d0: 4c 2c 20 74 68 65 20 72 65 73 70 6f 6e 73 65 20  L, the response 
99e0: 64 61 74 61 20 77 69 6c 6c 20 62 65 20 64 69 73  data will be dis
99f0: 63 61 72 64 65 64 2e 20 20 49 66 0a 20 2a 20 20  carded.  If. *  
9a00: 20 20 20 20 20 20 20 74 68 65 20 22 72 65 73 70         the "resp
9a10: 64 61 74 61 5f 6c 65 6e 22 20 70 61 72 61 6d 65  data_len" parame
9a20: 74 65 72 20 69 73 20 73 70 65 63 69 66 69 65 64  ter is specified
9a30: 20 61 73 20 4e 55 4c 4c 2c 20 74 68 69 73 20 62   as NULL, this b
9a40: 75 66 66 65 72 0a 20 2a 20 20 20 20 20 20 20 20  uffer. *        
9a50: 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75 70 64   will not be upd
9a60: 61 74 65 64 2e 0a 20 2a 0a 20 2a 20 20 20 20 20  ated.. *. *     
9a70: 73 69 7a 65 5f 74 20 2a 72 65 73 70 64 61 74 61  size_t *respdata
9a80: 5f 6c 65 6e 0a 20 2a 20 20 20 20 20 20 20 20 20  _len. *         
9a90: 5b 49 4e 2c 20 4f 55 54 5d 20 50 6f 69 6e 74 65  [IN, OUT] Pointe
9aa0: 72 20 69 6e 69 74 69 61 6c 69 6e 67 20 63 6f 6e  r initialing con
9ab0: 74 61 69 6e 69 6e 67 20 74 68 65 20 73 69 7a 65  taining the size
9ac0: 20 6f 66 20 74 68 65 20 22 72 65 73 70 64 61 74   of the "respdat
9ad0: 61 22 0a 20 2a 20 20 20 20 20 20 20 20 20 62 75  a". *         bu
9ae0: 66 66 65 72 2e 20 20 42 65 66 6f 72 65 20 72 65  ffer.  Before re
9af0: 74 75 72 6e 69 6e 67 2c 20 74 68 65 20 70 6f 69  turning, the poi
9b00: 6e 74 65 64 20 74 6f 20 76 61 6c 75 65 20 69 73  nted to value is
9b10: 20 75 70 64 61 74 65 64 20 74 6f 20 74 68 65 0a   updated to the.
9b20: 20 2a 20 20 20 20 20 20 20 20 20 6e 75 6d 62 65   *         numbe
9b30: 72 20 6f 66 20 62 79 74 65 73 20 77 72 69 74 74  r of bytes writt
9b40: 65 6e 20 74 6f 20 74 68 65 20 62 75 66 66 65 72  en to the buffer
9b50: 2e 20 20 49 66 20 74 68 69 73 20 69 73 20 73 70  .  If this is sp
9b60: 65 63 69 66 69 65 64 20 61 73 0a 20 2a 20 20 20  ecified as. *   
9b70: 20 20 20 20 20 20 4e 55 4c 4c 2c 20 69 74 20 77        NULL, it w
9b80: 69 6c 6c 20 6e 6f 74 20 62 65 20 75 70 64 61 74  ill not be updat
9b90: 65 64 2c 20 61 6e 64 20 22 72 65 73 70 64 61 74  ed, and "respdat
9ba0: 61 22 20 77 69 6c 6c 20 62 65 20 69 67 6e 6f 72  a" will be ignor
9bb0: 65 64 20 63 61 75 73 69 6e 67 0a 20 2a 20 20 20  ed causing. *   
9bc0: 20 20 20 20 20 20 74 68 65 20 72 65 73 70 6f 6e        the respon
9bd0: 73 65 20 64 61 74 61 20 74 6f 20 62 65 20 64 69  se data to be di
9be0: 73 63 61 72 64 65 64 2e 0a 20 2a 0a 20 2a 20 52  scarded.. *. * R
9bf0: 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20  ETURN VALUE. *  
9c00: 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53     CACKEY_PCSC_S
9c10: 5f 4f 4b 20 20 20 20 20 20 20 20 20 20 20 4f 6e  _OK           On
9c20: 20 73 75 63 63 65 73 73 0a 20 2a 20 20 20 20 20   success. *     
9c30: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45  CACKEY_PCSC_E_GE
9c40: 4e 45 52 49 43 20 20 20 20 20 20 4f 6e 20 65 72  NERIC      On er
9c50: 72 6f 72 0a 20 2a 20 20 20 20 20 43 41 43 4b 45  ror. *     CACKE
9c60: 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42  Y_PCSC_E_TOKENAB
9c70: 53 45 4e 54 20 20 49 66 20 74 68 65 20 73 65 6e  SENT  If the sen
9c80: 64 69 6e 67 20 66 61 69 6c 65 64 20 62 65 63 61  ding failed beca
9c90: 75 73 65 20 74 68 65 20 74 6f 6b 65 6e 20 69 73  use the token is
9ca0: 0a 20 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  . *             
9cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9cc0: 20 20 20 61 62 73 65 6e 74 0a 20 2a 20 20 20 20     absent. *    
9cd0: 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 52   CACKEY_PCSC_E_R
9ce0: 45 54 52 59 20 20 20 20 20 20 20 20 49 66 20 73  ETRY        If s
9cf0: 6f 6d 65 74 68 69 6e 67 20 74 68 61 74 20 6c 6f  omething that lo
9d00: 6f 6b 73 20 72 65 74 72 79 27 61 62 6c 65 20 77  oks retry'able w
9d10: 65 6e 74 0a 20 2a 20 20 20 20 20 20 20 20 20 20  ent. *          
9d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d30: 20 20 20 20 20 20 77 72 6f 6e 67 20 2d 2d 20 74        wrong -- t
9d40: 72 79 20 74 68 65 20 77 68 6f 6c 65 20 74 72 61  ry the whole tra
9d50: 6e 73 61 63 74 69 6f 6e 20 6f 76 65 72 0a 20 2a  nsaction over. *
9d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d80: 61 67 61 69 6e 0a 20 2a 0a 20 2a 20 4e 4f 54 45  again. *. * NOTE
9d90: 53 0a 20 2a 20 20 20 20 20 54 68 69 73 20 66 75  S. *     This fu
9da0: 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 63 6f 6e 6e  nction will conn
9db0: 65 63 74 20 74 6f 20 74 68 65 20 50 43 2f 53 43  ect to the PC/SC
9dc0: 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 4d 61 6e 61   Connection Mana
9dd0: 67 65 72 20 76 69 61 0a 20 2a 20 20 20 20 20 63  ger via. *     c
9de0: 61 63 6b 65 79 5f 70 63 73 63 5f 63 6f 6e 6e 65  ackey_pcsc_conne
9df0: 63 74 28 29 20 69 66 20 6e 65 65 64 65 64 2e 0a  ct() if needed..
9e00: 20 2a 0a 20 2a 20 20 20 20 20 49 74 20 77 69 6c   *. *     It wil
9e10: 6c 20 63 6f 6e 6e 65 63 74 20 74 6f 20 74 68 65  l connect to the
9e20: 20 63 61 72 64 20 69 6e 20 74 68 65 20 72 65 61   card in the rea
9e30: 64 65 72 20 61 74 74 61 63 68 65 64 20 74 6f 20  der attached to 
9e40: 74 68 65 20 73 6c 6f 74 0a 20 2a 20 20 20 20 20  the slot. *     
9e50: 73 70 65 63 69 66 69 65 64 2e 20 20 49 74 20 77  specified.  It w
9e60: 69 6c 6c 20 72 65 63 6f 6e 6e 65 63 74 20 74 6f  ill reconnect to
9e70: 20 74 68 65 20 63 61 72 64 20 69 66 20 74 68 65   the card if the
9e80: 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 2a 20 20   connection. *  
9e90: 20 20 20 67 6f 65 73 20 61 77 61 79 2e 0a 20 2a     goes away.. *
9ea0: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 61 63 6b  . */.static cack
9eb0: 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 73 65  ey_ret cackey_se
9ec0: 6e 64 5f 61 70 64 75 28 73 74 72 75 63 74 20 63  nd_apdu(struct c
9ed0: 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74  ackey_slot *slot
9ee0: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
9ef0: 63 6c 61 73 73 2c 20 75 6e 73 69 67 6e 65 64 20  class, unsigned 
9f00: 63 68 61 72 20 69 6e 73 74 72 75 63 74 69 6f 6e  char instruction
9f10: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
9f20: 70 31 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  p1, unsigned cha
9f30: 72 20 70 32 2c 20 75 6e 73 69 67 6e 65 64 20 69  r p2, unsigned i
9f40: 6e 74 20 6c 63 2c 20 75 6e 73 69 67 6e 65 64 20  nt lc, unsigned 
9f50: 63 68 61 72 20 2a 64 61 74 61 2c 20 75 6e 73 69  char *data, unsi
9f60: 67 6e 65 64 20 69 6e 74 20 6c 65 2c 20 75 69 6e  gned int le, uin
9f70: 74 31 36 5f 74 20 2a 72 65 73 70 63 6f 64 65 2c  t16_t *respcode,
9f80: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
9f90: 72 65 73 70 64 61 74 61 2c 20 73 69 7a 65 5f 74  respdata, size_t
9fa0: 20 2a 72 65 73 70 64 61 74 61 5f 6c 65 6e 29 20   *respdata_len) 
9fb0: 7b 0a 09 75 69 6e 74 38 5f 74 20 6d 61 6a 6f 72  {..uint8_t major
9fc0: 5f 72 63 2c 20 6d 69 6e 6f 72 5f 72 63 3b 0a 09  _rc, minor_rc;..
9fd0: 73 69 7a 65 5f 74 20 62 79 74 65 73 5f 74 6f 5f  size_t bytes_to_
9fe0: 63 6f 70 79 2c 20 74 6d 70 5f 72 65 73 70 64 61  copy, tmp_respda
9ff0: 74 61 5f 6c 65 6e 3b 0a 09 4c 50 43 53 43 41 52  ta_len;..LPCSCAR
a000: 44 5f 49 4f 5f 52 45 51 55 45 53 54 20 70 69 6f  D_IO_REQUEST pio
a010: 53 65 6e 64 50 63 69 3b 0a 09 44 57 4f 52 44 20  SendPci;..DWORD 
a020: 78 6d 69 74 5f 6c 65 6e 2c 20 72 65 63 76 5f 6c  xmit_len, recv_l
a030: 65 6e 3b 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f  en;..LONG scard_
a040: 78 6d 69 74 5f 72 65 74 2c 20 73 63 61 72 64 5f  xmit_ret, scard_
a050: 72 65 63 6f 6e 6e 5f 72 65 74 3b 0a 09 42 59 54  reconn_ret;..BYT
a060: 45 20 78 6d 69 74 5f 62 75 66 5b 31 30 32 34 5d  E xmit_buf[1024]
a070: 2c 20 72 65 63 76 5f 62 75 66 5b 31 30 32 34 5d  , recv_buf[1024]
a080: 3b 0a 09 69 6e 74 20 70 63 73 63 5f 63 6f 6e 6e  ;..int pcsc_conn
a090: 65 63 74 5f 72 65 74 2c 20 70 63 73 63 5f 67 65  ect_ret, pcsc_ge
a0a0: 74 72 65 73 70 5f 72 65 74 3b 0a 09 69 6e 74 20  tresp_ret;..int 
a0b0: 69 64 78 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  idx;...CACKEY_DE
a0c0: 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
a0d0: 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 73 6c  ed.");...if (!sl
a0e0: 6f 74 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ot) {...CACKEY_D
a0f0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 49 6e 76  EBUG_PRINTF("Inv
a100: 61 6c 69 64 20 73 6c 6f 74 20 73 70 65 63 69 66  alid slot specif
a110: 69 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  ied.");....retur
a120: 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  n(CACKEY_PCSC_E_
a130: 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 70  GENERIC);..}...p
a140: 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 20  csc_connect_ret 
a150: 3d 20 63 61 63 6b 65 79 5f 63 6f 6e 6e 65 63 74  = cackey_connect
a160: 5f 63 61 72 64 28 73 6c 6f 74 29 3b 0a 09 69 66  _card(slot);..if
a170: 20 28 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72   (pcsc_connect_r
a180: 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53  et != CACKEY_PCS
a190: 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b  C_S_OK) {...CACK
a1a0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
a1b0: 22 55 6e 61 62 6c 65 20 74 6f 20 63 6f 6e 6e 65  "Unable to conne
a1c0: 63 74 20 74 6f 20 63 61 72 64 2c 20 72 65 74 75  ct to card, retu
a1d0: 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65  rning in failure
a1e0: 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41  ");....return(CA
a1f0: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45  CKEY_PCSC_E_GENE
a200: 52 49 43 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65  RIC);..}.../* De
a210: 74 65 72 6d 69 6e 65 20 77 68 69 63 68 20 70 72  termine which pr
a220: 6f 74 6f 63 6f 6c 20 74 6f 20 73 65 6e 64 20 75  otocol to send u
a230: 73 69 6e 67 20 2a 2f 0a 09 73 77 69 74 63 68 20  sing */..switch 
a240: 28 73 6c 6f 74 2d 3e 70 72 6f 74 6f 63 6f 6c 29  (slot->protocol)
a250: 20 7b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f   {...case SCARD_
a260: 50 52 4f 54 4f 43 4f 4c 5f 54 30 3a 0a 09 09 09  PROTOCOL_T0:....
a270: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
a280: 4e 54 46 28 22 50 72 6f 74 6f 63 6f 6c 20 74 6f  NTF("Protocol to
a290: 20 73 65 6e 64 20 64 61 74 61 67 72 61 6d 20 69   send datagram i
a2a0: 73 20 54 3d 30 22 29 3b 0a 0a 09 09 09 70 69 6f  s T=0");.....pio
a2b0: 53 65 6e 64 50 63 69 20 3d 20 53 43 41 52 44 5f  SendPci = SCARD_
a2c0: 50 43 49 5f 54 30 3b 0a 0a 09 09 09 62 72 65 61  PCI_T0;.....brea
a2d0: 6b 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  k;...case SCARD_
a2e0: 50 52 4f 54 4f 43 4f 4c 5f 54 31 3a 0a 09 09 09  PROTOCOL_T1:....
a2f0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
a300: 4e 54 46 28 22 50 72 6f 74 6f 63 6f 6c 20 74 6f  NTF("Protocol to
a310: 20 73 65 6e 64 20 64 61 74 61 67 72 61 6d 20 69   send datagram i
a320: 73 20 54 3d 31 22 29 3b 0a 0a 09 09 09 70 69 6f  s T=1");.....pio
a330: 53 65 6e 64 50 63 69 20 3d 20 53 43 41 52 44 5f  SendPci = SCARD_
a340: 50 43 49 5f 54 31 3b 0a 0a 09 09 09 62 72 65 61  PCI_T1;.....brea
a350: 6b 3b 0a 09 09 64 65 66 61 75 6c 74 3a 0a 09 09  k;...default:...
a360: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
a370: 49 4e 54 46 28 22 49 6e 76 61 6c 69 64 20 70 72  INTF("Invalid pr
a380: 6f 74 6f 63 6f 6c 20 66 6f 75 6e 64 2c 20 61 62  otocol found, ab
a390: 6f 72 74 69 6e 67 2e 22 29 3b 0a 0a 09 09 09 72  orting.");.....r
a3a0: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
a3b0: 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d  C_E_GENERIC);..}
a3c0: 0a 0a 09 2f 2a 20 54 72 61 6e 73 6d 69 74 20 2a  .../* Transmit *
a3d0: 2f 0a 09 78 6d 69 74 5f 6c 65 6e 20 3d 20 30 3b  /..xmit_len = 0;
a3e0: 0a 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f  ..xmit_buf[xmit_
a3f0: 6c 65 6e 2b 2b 5d 20 3d 20 63 6c 61 73 73 3b 0a  len++] = class;.
a400: 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c  .xmit_buf[xmit_l
a410: 65 6e 2b 2b 5d 20 3d 20 69 6e 73 74 72 75 63 74  en++] = instruct
a420: 69 6f 6e 3b 0a 09 78 6d 69 74 5f 62 75 66 5b 78  ion;..xmit_buf[x
a430: 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 70 31 3b  mit_len++] = p1;
a440: 0a 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f  ..xmit_buf[xmit_
a450: 6c 65 6e 2b 2b 5d 20 3d 20 70 32 3b 0a 09 69 66  len++] = p2;..if
a460: 20 28 64 61 74 61 29 20 7b 0a 09 09 69 66 20 28   (data) {...if (
a470: 6c 63 20 3e 20 32 35 35 29 20 7b 0a 09 09 09 43  lc > 255) {....C
a480: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
a490: 54 46 28 22 43 41 55 54 49 4f 4e 21 20 20 55 73  TF("CAUTION!  Us
a4a0: 69 6e 67 20 61 6e 20 4c 63 20 67 72 65 61 74 65  ing an Lc greate
a4b0: 72 20 74 68 61 6e 20 32 35 35 20 69 73 20 75 6e  r than 255 is un
a4c0: 74 65 73 74 65 64 2e 20 20 4c 63 20 3d 20 25 75  tested.  Lc = %u
a4d0: 22 2c 20 6c 63 29 3b 0a 0a 09 09 09 78 6d 69 74  ", lc);.....xmit
a4e0: 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d  _buf[xmit_len++]
a4f0: 20 3d 20 30 78 38 32 3b 20 2f 2a 20 58 58 58 20   = 0x82; /* XXX 
a500: 55 4e 54 45 53 54 45 44 20 2a 2f 0a 09 09 09 78  UNTESTED */....x
a510: 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 6e  mit_buf[xmit_len
a520: 2b 2b 5d 20 3d 20 28 6c 63 20 26 20 30 78 66 66  ++] = (lc & 0xff
a530: 30 30 29 20 3e 3e 20 38 3b 0a 09 09 09 78 6d 69  00) >> 8;....xmi
a540: 74 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b  t_buf[xmit_len++
a550: 5d 20 3d 20 6c 63 20 26 20 30 78 66 66 3b 0a 09  ] = lc & 0xff;..
a560: 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 78 6d 69  .} else {....xmi
a570: 74 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b  t_buf[xmit_len++
a580: 5d 20 3d 20 6c 63 3b 0a 09 09 7d 0a 09 09 66 6f  ] = lc;...}...fo
a590: 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20  r (idx = 0; idx 
a5a0: 3c 20 6c 63 3b 20 69 64 78 2b 2b 29 20 7b 0a 09  < lc; idx++) {..
a5b0: 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f  ..xmit_buf[xmit_
a5c0: 6c 65 6e 2b 2b 5d 20 3d 20 64 61 74 61 5b 69 64  len++] = data[id
a5d0: 78 5d 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20  x];...}..}...if 
a5e0: 28 6c 65 20 21 3d 20 30 78 30 30 29 20 7b 0a 09  (le != 0x00) {..
a5f0: 09 69 66 20 28 6c 65 20 3e 20 32 35 36 29 20 7b  .if (le > 256) {
a600: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
a610: 5f 50 52 49 4e 54 46 28 22 43 41 55 54 49 4f 4e  _PRINTF("CAUTION
a620: 21 20 20 55 73 69 6e 67 20 61 6e 20 4c 65 20 67  !  Using an Le g
a630: 72 65 61 74 65 72 20 74 68 61 6e 20 32 35 36 20  reater than 256 
a640: 69 73 20 75 6e 74 65 73 74 65 64 2e 20 20 4c 65  is untested.  Le
a650: 20 3d 20 25 75 22 2c 20 6c 65 29 3b 0a 0a 09 09   = %u", le);....
a660: 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c  .xmit_buf[xmit_l
a670: 65 6e 2b 2b 5d 20 3d 20 30 78 38 32 3b 20 2f 2a  en++] = 0x82; /*
a680: 20 58 58 58 20 55 4e 54 45 53 54 45 44 20 2a 2f   XXX UNTESTED */
a690: 0a 09 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69  ....xmit_buf[xmi
a6a0: 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 28 6c 65 20 26  t_len++] = (le &
a6b0: 20 30 78 66 66 30 30 29 20 3e 3e 20 38 3b 0a 09   0xff00) >> 8;..
a6c0: 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f  ..xmit_buf[xmit_
a6d0: 6c 65 6e 2b 2b 5d 20 3d 20 6c 65 20 26 20 30 78  len++] = le & 0x
a6e0: 66 66 3b 0a 09 09 7d 20 65 6c 73 65 20 69 66 20  ff;...} else if 
a6f0: 28 6c 65 20 3d 3d 20 32 35 36 29 20 7b 0a 09 09  (le == 256) {...
a700: 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c  .xmit_buf[xmit_l
a710: 65 6e 2b 2b 5d 20 3d 20 30 78 30 30 3b 0a 09 09  en++] = 0x00;...
a720: 7d 20 65 6c 73 65 20 7b 0a 09 09 09 78 6d 69 74  } else {....xmit
a730: 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d  _buf[xmit_len++]
a740: 20 3d 20 6c 65 3b 0a 09 09 7d 0a 09 7d 0a 0a 09   = le;...}..}...
a750: 2f 2a 20 42 65 67 69 6e 20 53 6d 61 72 74 63 61  /* Begin Smartca
a760: 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a  rd Transaction *
a770: 2f 0a 09 63 61 63 6b 65 79 5f 62 65 67 69 6e 5f  /..cackey_begin_
a780: 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74  transaction(slot
a790: 29 3b 0a 0a 09 69 66 20 28 63 6c 61 73 73 20 3d  );...if (class =
a7a0: 3d 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 49 53  = GSCIS_CLASS_IS
a7b0: 4f 37 38 31 36 20 26 26 20 28 69 6e 73 74 72 75  O7816 && (instru
a7c0: 63 74 69 6f 6e 20 3d 3d 20 47 53 43 49 53 5f 49  ction == GSCIS_I
a7d0: 4e 53 54 52 5f 56 45 52 49 46 59 20 7c 7c 20 69  NSTR_VERIFY || i
a7e0: 6e 73 74 72 75 63 74 69 6f 6e 20 3d 3d 20 47 53  nstruction == GS
a7f0: 43 49 53 5f 49 4e 53 54 52 5f 43 48 41 4e 47 45  CIS_INSTR_CHANGE
a800: 5f 52 45 46 45 52 45 4e 43 45 29 20 26 26 20 70  _REFERENCE) && p
a810: 31 20 3d 3d 20 30 78 30 30 29 20 7b 0a 09 09 43  1 == 0x00) {...C
a820: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
a830: 54 46 28 22 53 65 6e 64 69 6e 67 20 41 50 44 55  TF("Sending APDU
a840: 3a 20 3c 3c 63 65 6e 73 6f 72 65 64 3e 3e 22 29  : <<censored>>")
a850: 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 43 41  ;..} else {...CA
a860: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
a870: 42 55 46 28 22 53 65 6e 64 69 6e 67 20 41 50 44  BUF("Sending APD
a880: 55 3a 22 2c 20 78 6d 69 74 5f 62 75 66 2c 20 78  U:", xmit_buf, x
a890: 6d 69 74 5f 6c 65 6e 29 3b 0a 09 7d 0a 0a 09 72  mit_len);..}...r
a8a0: 65 63 76 5f 6c 65 6e 20 3d 20 73 69 7a 65 6f 66  ecv_len = sizeof
a8b0: 28 72 65 63 76 5f 62 75 66 29 3b 0a 09 73 63 61  (recv_buf);..sca
a8c0: 72 64 5f 78 6d 69 74 5f 72 65 74 20 3d 20 53 43  rd_xmit_ret = SC
a8d0: 61 72 64 54 72 61 6e 73 6d 69 74 28 73 6c 6f 74  ardTransmit(slot
a8e0: 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 70 69 6f  ->pcsc_card, pio
a8f0: 53 65 6e 64 50 63 69 2c 20 78 6d 69 74 5f 62 75  SendPci, xmit_bu
a900: 66 2c 20 78 6d 69 74 5f 6c 65 6e 2c 20 4e 55 4c  f, xmit_len, NUL
a910: 4c 2c 20 72 65 63 76 5f 62 75 66 2c 20 26 72 65  L, recv_buf, &re
a920: 63 76 5f 6c 65 6e 29 3b 0a 0a 09 69 66 20 28 73  cv_len);...if (s
a930: 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 20 3d 3d  card_xmit_ret ==
a940: 20 53 43 41 52 44 5f 45 5f 4e 4f 54 5f 54 52 41   SCARD_E_NOT_TRA
a950: 4e 53 41 43 54 45 44 29 20 7b 0a 09 09 43 41 43  NSACTED) {...CAC
a960: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
a970: 28 22 46 61 69 6c 65 64 20 74 6f 20 73 65 6e 64  ("Failed to send
a980: 20 41 50 44 55 20 74 6f 20 63 61 72 64 20 28 53   APDU to card (S
a990: 43 61 72 64 54 72 61 6e 73 6d 69 74 28 29 20 3d  CardTransmit() =
a9a0: 20 25 73 2f 25 6c 78 29 2c 20 77 69 6c 6c 20 61   %s/%lx), will a
a9b0: 73 6b 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  sk calling funct
a9c0: 69 6f 6e 20 74 6f 20 72 65 74 72 79 20 28 6e 6f  ion to retry (no
a9d0: 74 20 72 65 73 65 74 74 69 6e 67 20 63 61 72 64  t resetting card
a9e0: 29 2e 2e 2e 22 2c 20 43 41 43 4b 45 59 5f 44 45  )...", CACKEY_DE
a9f0: 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52  BUG_FUNC_SCARDER
aa00: 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 5f 78  R_TO_STR(scard_x
aa10: 6d 69 74 5f 72 65 74 29 2c 20 28 75 6e 73 69 67  mit_ret), (unsig
aa20: 6e 65 64 20 6c 6f 6e 67 29 20 73 63 61 72 64 5f  ned long) scard_
aa30: 78 6d 69 74 5f 72 65 74 29 3b 0a 0a 09 09 2f 2a  xmit_ret);..../*
aa40: 20 42 65 67 69 6e 20 53 6d 61 72 74 63 61 72 64   Begin Smartcard
aa50: 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a   Transaction */.
aa60: 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61  ..cackey_end_tra
aa70: 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a  nsaction(slot);.
aa80: 0a 09 09 63 61 63 6b 65 79 5f 72 65 63 6f 6e 6e  ...cackey_reconn
aa90: 65 63 74 5f 63 61 72 64 28 73 6c 6f 74 2c 20 73  ect_card(slot, s
aaa0: 6c 6f 74 2d 3e 70 72 6f 74 6f 63 6f 6c 29 3b 0a  lot->protocol);.
aab0: 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
aac0: 5f 50 43 53 43 5f 45 5f 52 45 54 52 59 29 3b 0a  _PCSC_E_RETRY);.
aad0: 09 7d 0a 0a 09 69 66 20 28 73 63 61 72 64 5f 78  .}...if (scard_x
aae0: 6d 69 74 5f 72 65 74 20 21 3d 20 53 43 41 52 44  mit_ret != SCARD
aaf0: 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09  _S_SUCCESS) {...
ab00: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
ab10: 4e 54 46 28 22 46 61 69 6c 65 64 20 74 6f 20 73  NTF("Failed to s
ab20: 65 6e 64 20 41 50 44 55 20 74 6f 20 63 61 72 64  end APDU to card
ab30: 20 28 53 43 61 72 64 54 72 61 6e 73 6d 69 74 28   (SCardTransmit(
ab40: 29 20 3d 20 25 73 2f 25 6c 78 29 22 2c 20 43 41  ) = %s/%lx)", CA
ab50: 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
ab60: 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28  SCARDERR_TO_STR(
ab70: 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 29 2c  scard_xmit_ret),
ab80: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
ab90: 20 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 29   scard_xmit_ret)
aba0: 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  ;....CACKEY_DEBU
abb0: 47 5f 50 52 49 4e 54 46 28 22 4d 61 72 6b 69 6e  G_PRINTF("Markin
abc0: 67 20 73 6c 6f 74 20 61 73 20 68 61 76 69 6e 67  g slot as having
abd0: 20 62 65 65 6e 20 72 65 73 65 74 22 29 3b 0a 09   been reset");..
abe0: 09 63 61 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f  .cackey_mark_slo
abf0: 74 5f 72 65 73 65 74 28 73 6c 6f 74 29 3b 0a 0a  t_reset(slot);..
ac00: 09 09 69 66 20 28 73 63 61 72 64 5f 78 6d 69 74  ..if (scard_xmit
ac10: 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 57 5f  _ret == SCARD_W_
ac20: 52 45 53 45 54 5f 43 41 52 44 29 20 7b 0a 09 09  RESET_CARD) {...
ac30: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
ac40: 49 4e 54 46 28 22 52 65 73 65 74 20 72 65 71 75  INTF("Reset requ
ac50: 69 72 65 64 2c 20 70 6c 65 61 73 65 20 68 6f 6c  ired, please hol
ac60: 64 2e 2e 2e 22 29 3b 0a 0a 09 09 09 73 63 61 72  d...");.....scar
ac70: 64 5f 72 65 63 6f 6e 6e 5f 72 65 74 20 3d 20 63  d_reconn_ret = c
ac80: 61 63 6b 65 79 5f 72 65 63 6f 6e 6e 65 63 74 5f  ackey_reconnect_
ac90: 63 61 72 64 28 73 6c 6f 74 2c 20 53 43 41 52 44  card(slot, SCARD
aca0: 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 20 7c 20 53  _PROTOCOL_T0 | S
acb0: 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31  CARD_PROTOCOL_T1
acc0: 29 3b 0a 0a 09 09 09 69 66 20 28 73 63 61 72 64  );.....if (scard
acd0: 5f 72 65 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53  _reconn_ret == S
ace0: 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20  CARD_S_SUCCESS) 
acf0: 7b 0a 09 09 09 09 73 77 69 74 63 68 20 28 73 6c  {.....switch (sl
ad00: 6f 74 2d 3e 70 72 6f 74 6f 63 6f 6c 29 20 7b 0a  ot->protocol) {.
ad10: 09 09 09 09 09 63 61 73 65 20 53 43 41 52 44 5f  .....case SCARD_
ad20: 50 52 4f 54 4f 43 4f 4c 5f 54 30 3a 0a 09 09 09  PROTOCOL_T0:....
ad30: 09 09 09 70 69 6f 53 65 6e 64 50 63 69 20 3d 20  ...pioSendPci = 
ad40: 53 43 41 52 44 5f 50 43 49 5f 54 30 3b 0a 0a 09  SCARD_PCI_T0;...
ad50: 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09  .....break;.....
ad60: 09 63 61 73 65 20 53 43 41 52 44 5f 50 52 4f 54  .case SCARD_PROT
ad70: 4f 43 4f 4c 5f 54 31 3a 0a 09 09 09 09 09 09 70  OCOL_T1:.......p
ad80: 69 6f 53 65 6e 64 50 63 69 20 3d 20 53 43 41 52  ioSendPci = SCAR
ad90: 44 5f 50 43 49 5f 54 31 3b 0a 0a 09 09 09 09 09  D_PCI_T1;.......
ada0: 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 64 65 66  .break;......def
adb0: 61 75 6c 74 3a 0a 09 09 09 09 09 09 43 41 43 4b  ault:.......CACK
adc0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
add0: 22 49 6e 76 61 6c 69 64 20 70 72 6f 74 6f 63 6f  "Invalid protoco
ade0: 6c 20 66 6f 75 6e 64 2c 20 62 75 74 20 74 6f 6f  l found, but too
adf0: 20 6c 61 74 65 20 74 6f 20 64 6f 20 61 6e 79 74   late to do anyt
ae00: 68 69 6e 67 20 61 62 6f 75 74 20 69 74 20 6e 6f  hing about it no
ae10: 77 20 2d 2d 20 74 72 79 69 6e 67 20 61 6e 79 77  w -- trying anyw
ae20: 61 79 2e 22 29 3b 0a 0a 09 09 09 09 09 09 62 72  ay.");........br
ae30: 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09  eak;.....}......
ae40: 2f 2a 20 52 65 2d 65 73 74 61 62 6c 69 73 68 20  /* Re-establish 
ae50: 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 66 20  transaction, if 
ae60: 69 74 20 77 61 73 20 70 72 65 73 65 6e 74 20 2a  it was present *
ae70: 2f 0a 09 09 09 09 69 66 20 28 73 6c 6f 74 2d 3e  /.....if (slot->
ae80: 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74  transaction_dept
ae90: 68 20 3e 20 30 29 20 7b 0a 09 09 09 09 09 73 6c  h > 0) {......sl
aea0: 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f  ot->transaction_
aeb0: 64 65 70 74 68 2d 2d 3b 0a 09 09 09 09 09 73 6c  depth--;......sl
aec0: 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f  ot->transaction_
aed0: 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b 20 3d 20 31  need_hw_lock = 1
aee0: 3b 0a 09 09 09 09 09 63 61 63 6b 65 79 5f 62 65  ;......cackey_be
aef0: 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  gin_transaction(
af00: 73 6c 6f 74 29 3b 0a 09 09 09 09 7d 0a 0a 09 09  slot);.....}....
af10: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
af20: 52 49 4e 54 46 28 22 52 65 73 65 74 20 73 75 63  RINTF("Reset suc
af30: 63 65 73 73 66 75 6c 2c 20 72 65 74 72 61 6e 73  cessful, retrans
af40: 6d 69 74 74 69 6e 67 22 29 3b 0a 0a 09 09 09 09  mitting");......
af50: 72 65 63 76 5f 6c 65 6e 20 3d 20 73 69 7a 65 6f  recv_len = sizeo
af60: 66 28 72 65 63 76 5f 62 75 66 29 3b 0a 09 09 09  f(recv_buf);....
af70: 09 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 20  .scard_xmit_ret 
af80: 3d 20 53 43 61 72 64 54 72 61 6e 73 6d 69 74 28  = SCardTransmit(
af90: 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c  slot->pcsc_card,
afa0: 20 70 69 6f 53 65 6e 64 50 63 69 2c 20 78 6d 69   pioSendPci, xmi
afb0: 74 5f 62 75 66 2c 20 78 6d 69 74 5f 6c 65 6e 2c  t_buf, xmit_len,
afc0: 20 4e 55 4c 4c 2c 20 72 65 63 76 5f 62 75 66 2c   NULL, recv_buf,
afd0: 20 26 72 65 63 76 5f 6c 65 6e 29 3b 0a 0a 09 09   &recv_len);....
afe0: 09 09 69 66 20 28 73 63 61 72 64 5f 78 6d 69 74  ..if (scard_xmit
aff0: 5f 72 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f  _ret != SCARD_S_
b000: 53 55 43 43 45 53 53 29 20 7b 0a 09 09 09 09 09  SUCCESS) {......
b010: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
b020: 4e 54 46 28 22 52 65 74 72 61 6e 73 6d 69 74 20  NTF("Retransmit 
b030: 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 69 6e  failed, returnin
b040: 67 20 69 6e 20 66 61 69 6c 75 72 65 20 61 66 74  g in failure aft
b050: 65 72 20 64 69 73 63 6f 6e 6e 65 63 74 69 6e 67  er disconnecting
b060: 20 74 68 65 20 63 61 72 64 20 28 53 43 61 72 64   the card (SCard
b070: 54 72 61 6e 73 6d 69 74 20 3d 20 25 73 2f 25 6c  Transmit = %s/%l
b080: 69 29 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55  i)", CACKEY_DEBU
b090: 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f  G_FUNC_SCARDERR_
b0a0: 54 4f 5f 53 54 52 28 73 63 61 72 64 5f 78 6d 69  TO_STR(scard_xmi
b0b0: 74 5f 72 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73  t_ret), (long) s
b0c0: 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 29 3b 0a  card_xmit_ret);.
b0d0: 0a 09 09 09 09 09 53 43 61 72 64 44 69 73 63 6f  ......SCardDisco
b0e0: 6e 6e 65 63 74 28 73 6c 6f 74 2d 3e 70 63 73 63  nnect(slot->pcsc
b0f0: 5f 63 61 72 64 2c 20 53 43 41 52 44 5f 4c 45 41  _card, SCARD_LEA
b100: 56 45 5f 43 41 52 44 29 3b 0a 09 09 09 09 09 73  VE_CARD);......s
b110: 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63  lot->pcsc_card_c
b120: 6f 6e 6e 65 63 74 65 64 20 3d 20 30 3b 0a 0a 09  onnected = 0;...
b130: 09 09 09 09 2f 2a 20 45 6e 64 20 53 6d 61 72 74  ..../* End Smart
b140: 63 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e  card Transaction
b150: 20 2a 2f 0a 09 09 09 09 09 73 6c 6f 74 2d 3e 74   */......slot->t
b160: 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68  ransaction_depth
b170: 20 3d 20 31 3b 0a 09 09 09 09 09 63 61 63 6b 65   = 1;......cacke
b180: 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  y_end_transactio
b190: 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 09 09 09 72  n(slot);.......r
b1a0: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
b1b0: 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29  C_E_TOKENABSENT)
b1c0: 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 20 65 6c 73  ;.....}....} els
b1d0: 65 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  e {.....CACKEY_D
b1e0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 44 69 73  EBUG_PRINTF("Dis
b1f0: 63 6f 6e 6e 65 63 74 69 6e 67 20 63 61 72 64 22  connecting card"
b200: 29 3b 0a 0a 09 09 09 09 53 43 61 72 64 44 69 73  );......SCardDis
b210: 63 6f 6e 6e 65 63 74 28 73 6c 6f 74 2d 3e 70 63  connect(slot->pc
b220: 73 63 5f 63 61 72 64 2c 20 53 43 41 52 44 5f 4c  sc_card, SCARD_L
b230: 45 41 56 45 5f 43 41 52 44 29 3b 0a 09 09 09 09  EAVE_CARD);.....
b240: 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 5f  slot->pcsc_card_
b250: 63 6f 6e 6e 65 63 74 65 64 20 3d 20 30 3b 0a 0a  connected = 0;..
b260: 09 09 09 09 2f 2a 20 45 6e 64 20 53 6d 61 72 74  ..../* End Smart
b270: 63 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e  card Transaction
b280: 20 2a 2f 0a 09 09 09 09 73 6c 6f 74 2d 3e 74 72   */.....slot->tr
b290: 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20  ansaction_depth 
b2a0: 3d 20 31 3b 0a 09 09 09 09 63 61 63 6b 65 79 5f  = 1;.....cackey_
b2b0: 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
b2c0: 73 6c 6f 74 29 3b 0a 0a 09 09 09 09 43 41 43 4b  slot);......CACK
b2d0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
b2e0: 22 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61  "Returning in fa
b2f0: 69 6c 75 72 65 22 29 3b 0a 09 09 09 09 72 65 74  ilure");.....ret
b300: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
b310: 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b 0a  E_TOKENABSENT);.
b320: 09 09 09 7d 0a 09 09 7d 20 65 6c 73 65 20 7b 0a  ...}...} else {.
b330: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
b340: 50 52 49 4e 54 46 28 22 44 69 73 63 6f 6e 6e 65  PRINTF("Disconne
b350: 63 74 69 6e 67 20 63 61 72 64 22 29 3b 0a 0a 09  cting card");...
b360: 09 09 53 43 61 72 64 44 69 73 63 6f 6e 6e 65 63  ..SCardDisconnec
b370: 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72  t(slot->pcsc_car
b380: 64 2c 20 53 43 41 52 44 5f 4c 45 41 56 45 5f 43  d, SCARD_LEAVE_C
b390: 41 52 44 29 3b 0a 09 09 09 73 6c 6f 74 2d 3e 70  ARD);....slot->p
b3a0: 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74  csc_card_connect
b3b0: 65 64 20 3d 20 30 3b 0a 0a 09 09 09 2f 2a 20 45  ed = 0;...../* E
b3c0: 6e 64 20 53 6d 61 72 74 63 61 72 64 20 54 72 61  nd Smartcard Tra
b3d0: 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 09 09 73  nsaction */....s
b3e0: 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e  lot->transaction
b3f0: 5f 64 65 70 74 68 20 3d 20 31 3b 0a 09 09 09 63  _depth = 1;....c
b400: 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61  ackey_end_transa
b410: 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09  ction(slot);....
b420: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
b430: 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
b440: 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 09 09  in failure");...
b450: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
b460: 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e  CSC_E_TOKENABSEN
b470: 54 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 43 41 43  T);...}..}...CAC
b480: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42  KEY_DEBUG_PRINTB
b490: 55 46 28 22 52 65 74 75 72 6e 65 64 20 56 61 6c  UF("Returned Val
b4a0: 75 65 3a 22 2c 20 72 65 63 76 5f 62 75 66 2c 20  ue:", recv_buf, 
b4b0: 72 65 63 76 5f 6c 65 6e 29 3b 0a 0a 09 69 66 20  recv_len);...if 
b4c0: 28 72 65 63 76 5f 6c 65 6e 20 3c 20 32 29 20 7b  (recv_len < 2) {
b4d0: 0a 09 09 2f 2a 20 4d 69 6e 69 6d 61 6c 20 72 65  .../* Minimal re
b4e0: 73 70 6f 6e 73 65 20 6c 65 6e 67 74 68 20 69 73  sponse length is
b4f0: 20 32 20 62 79 74 65 73 2c 20 72 65 74 75 72 6e   2 bytes, return
b500: 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 20 2a  ing in failure *
b510: 2f 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  /...CACKEY_DEBUG
b520: 5f 50 52 49 4e 54 46 28 22 52 65 73 70 6f 6e 73  _PRINTF("Respons
b530: 65 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20 72 65 74  e too small, ret
b540: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
b550: 65 20 28 72 65 63 76 5f 6c 65 6e 20 3d 20 25 6c  e (recv_len = %l
b560: 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  u)", (unsigned l
b570: 6f 6e 67 29 20 72 65 63 76 5f 6c 65 6e 29 3b 0a  ong) recv_len);.
b580: 0a 09 09 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63  .../* End Smartc
b590: 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20  ard Transaction 
b5a0: 2a 2f 0a 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f  */...cackey_end_
b5b0: 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74  transaction(slot
b5c0: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43  );....return(CAC
b5d0: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52  KEY_PCSC_E_GENER
b5e0: 49 43 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74  IC);..}.../* Det
b5f0: 65 72 6d 69 6e 65 20 72 65 73 75 6c 74 20 63 6f  ermine result co
b600: 64 65 20 2a 2f 0a 09 6d 61 6a 6f 72 5f 72 63 20  de */..major_rc 
b610: 3d 20 72 65 63 76 5f 62 75 66 5b 72 65 63 76 5f  = recv_buf[recv_
b620: 6c 65 6e 20 2d 20 32 5d 3b 0a 09 6d 69 6e 6f 72  len - 2];..minor
b630: 5f 72 63 20 3d 20 72 65 63 76 5f 62 75 66 5b 72  _rc = recv_buf[r
b640: 65 63 76 5f 6c 65 6e 20 2d 20 31 5d 3b 0a 09 69  ecv_len - 1];..i
b650: 66 20 28 72 65 73 70 63 6f 64 65 29 20 7b 0a 09  f (respcode) {..
b660: 09 2a 72 65 73 70 63 6f 64 65 20 3d 20 28 6d 61  .*respcode = (ma
b670: 6a 6f 72 5f 72 63 20 3c 3c 20 38 29 20 7c 20 6d  jor_rc << 8) | m
b680: 69 6e 6f 72 5f 72 63 3b 0a 09 7d 0a 0a 09 2f 2a  inor_rc;..}.../*
b690: 20 41 64 6a 75 73 74 20 6d 65 73 73 61 67 65 20   Adjust message 
b6a0: 62 75 66 66 65 72 20 2a 2f 0a 09 72 65 63 76 5f  buffer */..recv_
b6b0: 6c 65 6e 20 2d 3d 20 32 3b 0a 0a 09 2f 2a 20 41  len -= 2;.../* A
b6c0: 64 64 20 62 79 74 65 73 20 74 6f 20 72 65 74 75  dd bytes to retu
b6d0: 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 09 74 6d 70  rn value */..tmp
b6e0: 5f 72 65 73 70 64 61 74 61 5f 6c 65 6e 20 3d 20  _respdata_len = 
b6f0: 30 3b 0a 09 69 66 20 28 72 65 73 70 64 61 74 61  0;..if (respdata
b700: 20 26 26 20 72 65 73 70 64 61 74 61 5f 6c 65 6e   && respdata_len
b710: 29 20 7b 0a 09 09 74 6d 70 5f 72 65 73 70 64 61  ) {...tmp_respda
b720: 74 61 5f 6c 65 6e 20 3d 20 2a 72 65 73 70 64 61  ta_len = *respda
b730: 74 61 5f 6c 65 6e 3b 0a 0a 09 09 62 79 74 65 73  ta_len;....bytes
b740: 5f 74 6f 5f 63 6f 70 79 20 3d 20 2a 72 65 73 70  _to_copy = *resp
b750: 64 61 74 61 5f 6c 65 6e 3b 0a 0a 09 09 69 66 20  data_len;....if 
b760: 28 72 65 63 76 5f 6c 65 6e 20 3c 20 62 79 74 65  (recv_len < byte
b770: 73 5f 74 6f 5f 63 6f 70 79 29 20 7b 0a 09 09 09  s_to_copy) {....
b780: 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 20 3d 20  bytes_to_copy = 
b790: 72 65 63 76 5f 6c 65 6e 3b 0a 09 09 7d 0a 0a 09  recv_len;...}...
b7a0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
b7b0: 49 4e 54 46 28 22 43 6f 70 79 69 6e 67 20 25 6c  INTF("Copying %l
b7c0: 75 20 62 79 74 65 73 20 74 6f 20 74 68 65 20 62  u bytes to the b
b7d0: 75 66 66 65 72 20 28 72 65 63 76 27 64 20 25 6c  uffer (recv'd %l
b7e0: 75 20 62 79 74 65 73 2c 20 62 75 74 20 6f 6e 6c  u bytes, but onl
b7f0: 79 20 25 6c 75 20 62 79 74 65 73 20 6c 65 66 74  y %lu bytes left
b800: 20 69 6e 20 6f 75 72 20 62 75 66 66 65 72 29 22   in our buffer)"
b810: 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
b820: 29 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 2c  ) bytes_to_copy,
b830: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
b840: 20 72 65 63 76 5f 6c 65 6e 2c 20 28 75 6e 73 69   recv_len, (unsi
b850: 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 72 65 73 70  gned long) *resp
b860: 64 61 74 61 5f 6c 65 6e 29 3b 0a 0a 09 09 6d 65  data_len);....me
b870: 6d 63 70 79 28 72 65 73 70 64 61 74 61 2c 20 72  mcpy(respdata, r
b880: 65 63 76 5f 62 75 66 2c 20 62 79 74 65 73 5f 74  ecv_buf, bytes_t
b890: 6f 5f 63 6f 70 79 29 3b 0a 09 09 72 65 73 70 64  o_copy);...respd
b8a0: 61 74 61 20 2b 3d 20 62 79 74 65 73 5f 74 6f 5f  ata += bytes_to_
b8b0: 63 6f 70 79 3b 0a 0a 09 09 2a 72 65 73 70 64 61  copy;....*respda
b8c0: 74 61 5f 6c 65 6e 20 3d 20 62 79 74 65 73 5f 74  ta_len = bytes_t
b8d0: 6f 5f 63 6f 70 79 3b 0a 09 09 74 6d 70 5f 72 65  o_copy;...tmp_re
b8e0: 73 70 64 61 74 61 5f 6c 65 6e 20 2d 3d 20 62 79  spdata_len -= by
b8f0: 74 65 73 5f 74 6f 5f 63 6f 70 79 3b 0a 09 7d 20  tes_to_copy;..} 
b900: 65 6c 73 65 20 7b 0a 09 09 69 66 20 28 72 65 63  else {...if (rec
b910: 76 5f 6c 65 6e 20 21 3d 20 30 29 20 7b 0a 09 09  v_len != 0) {...
b920: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
b930: 49 4e 54 46 28 22 54 68 72 6f 77 69 6e 67 20 61  INTF("Throwing a
b940: 77 61 79 20 25 6c 75 20 62 79 74 65 73 2c 20 6e  way %lu bytes, n
b950: 6f 77 68 65 72 65 20 74 6f 20 70 75 74 20 74 68  owhere to put th
b960: 65 6d 21 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  em!", (unsigned 
b970: 6c 6f 6e 67 29 20 72 65 63 76 5f 6c 65 6e 29 3b  long) recv_len);
b980: 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28 6d 61  ...}..}...if (ma
b990: 6a 6f 72 5f 72 63 20 3d 3d 20 30 78 36 31 29 20  jor_rc == 0x61) 
b9a0: 7b 0a 09 09 2f 2a 20 57 65 20 6e 65 65 64 20 74  {.../* We need t
b9b0: 6f 20 52 45 41 44 20 2a 2f 0a 09 09 43 41 43 4b  o READ */...CACK
b9c0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
b9d0: 22 42 75 66 66 65 72 20 72 65 61 64 20 72 65 71  "Buffer read req
b9e0: 75 69 72 65 64 22 29 3b 0a 0a 09 09 69 66 20 28  uired");....if (
b9f0: 6d 69 6e 6f 72 5f 72 63 20 3d 3d 20 30 78 30 30  minor_rc == 0x00
ba00: 29 20 7b 0a 09 09 09 6d 69 6e 6f 72 5f 72 63 20  ) {....minor_rc 
ba10: 3d 20 43 41 43 4b 45 59 5f 41 50 44 55 5f 4d 54  = CACKEY_APDU_MT
ba20: 55 3b 0a 09 09 7d 0a 0a 09 09 70 63 73 63 5f 67  U;...}....pcsc_g
ba30: 65 74 72 65 73 70 5f 72 65 74 20 3d 20 63 61 63  etresp_ret = cac
ba40: 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c  key_send_apdu(sl
ba50: 6f 74 2c 20 47 53 43 49 53 5f 43 4c 41 53 53 5f  ot, GSCIS_CLASS_
ba60: 49 53 4f 37 38 31 36 2c 20 47 53 43 49 53 5f 49  ISO7816, GSCIS_I
ba70: 4e 53 54 52 5f 47 45 54 5f 52 45 53 50 4f 4e 53  NSTR_GET_RESPONS
ba80: 45 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30  E, 0x00, 0x00, 0
ba90: 2c 20 4e 55 4c 4c 2c 20 6d 69 6e 6f 72 5f 72 63  , NULL, minor_rc
baa0: 2c 20 72 65 73 70 63 6f 64 65 2c 20 72 65 73 70  , respcode, resp
bab0: 64 61 74 61 2c 20 26 74 6d 70 5f 72 65 73 70 64  data, &tmp_respd
bac0: 61 74 61 5f 6c 65 6e 29 3b 0a 0a 09 09 69 66 20  ata_len);....if 
bad0: 28 70 63 73 63 5f 67 65 74 72 65 73 70 5f 72 65  (pcsc_getresp_re
bae0: 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43  t != CACKEY_PCSC
baf0: 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 43 41 43 4b  _S_OK) {....CACK
bb00: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
bb10: 22 42 75 66 66 65 72 20 72 65 61 64 20 66 61 69  "Buffer read fai
bb20: 6c 65 64 21 20 20 52 65 74 75 72 6e 69 6e 67 20  led!  Returning 
bb30: 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09  in failure");...
bb40: 09 09 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63 61  ../* End Smartca
bb50: 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a  rd Transaction *
bb60: 2f 0a 09 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f  /....cackey_end_
bb70: 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74  transaction(slot
bb80: 29 3b 0a 0a 09 09 09 69 66 20 28 70 63 73 63 5f  );.....if (pcsc_
bb90: 67 65 74 72 65 73 70 5f 72 65 74 20 3d 3d 20 43  getresp_ret == C
bba0: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 52 45 54  ACKEY_PCSC_E_RET
bbb0: 52 59 29 20 7b 0a 09 09 09 09 72 65 74 75 72 6e  RY) {.....return
bbc0: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 52  (CACKEY_PCSC_E_R
bbd0: 45 54 52 59 29 3b 0a 09 09 09 7d 0a 0a 09 09 09  ETRY);....}.....
bbe0: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
bbf0: 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09  SC_E_GENERIC);..
bc00: 09 7d 0a 0a 09 09 69 66 20 28 72 65 73 70 64 61  .}....if (respda
bc10: 74 61 5f 6c 65 6e 29 20 7b 0a 09 09 09 2a 72 65  ta_len) {....*re
bc20: 73 70 64 61 74 61 5f 6c 65 6e 20 2b 3d 20 74 6d  spdata_len += tm
bc30: 70 5f 72 65 73 70 64 61 74 61 5f 6c 65 6e 3b 0a  p_respdata_len;.
bc40: 09 09 7d 0a 0a 09 09 2f 2a 20 45 6e 64 20 53 6d  ..}..../* End Sm
bc50: 61 72 74 63 61 72 64 20 54 72 61 6e 73 61 63 74  artcard Transact
bc60: 69 6f 6e 20 2a 2f 0a 09 09 63 61 63 6b 65 79 5f  ion */...cackey_
bc70: 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
bc80: 73 6c 6f 74 29 3b 0a 0a 09 09 43 41 43 4b 45 59  slot);....CACKEY
bc90: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
bca0: 65 74 75 72 6e 69 6e 67 20 69 6e 20 73 75 63 63  eturning in succ
bcb0: 65 73 73 20 28 62 75 66 66 65 72 20 72 65 61 64  ess (buffer read
bcc0: 20 63 6f 6d 70 6c 65 74 65 29 22 29 3b 0a 09 09   complete)");...
bcd0: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
bce0: 53 43 5f 53 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 2f  SC_S_OK);..}.../
bcf0: 2a 20 45 6e 64 20 53 6d 61 72 74 63 61 72 64 20  * End Smartcard 
bd00: 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09  Transaction */..
bd10: 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73  cackey_end_trans
bd20: 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09  action(slot);...
bd30: 69 66 20 28 6d 61 6a 6f 72 5f 72 63 20 3d 3d 20  if (major_rc == 
bd40: 30 78 39 30 29 20 7b 0a 09 09 2f 2a 20 53 75 63  0x90) {.../* Suc
bd50: 63 65 73 73 20 2a 2f 0a 09 09 43 41 43 4b 45 59  cess */...CACKEY
bd60: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
bd70: 65 74 75 72 6e 69 6e 67 20 69 6e 20 73 75 63 63  eturning in succ
bd80: 65 73 73 20 28 6d 61 6a 6f 72 5f 72 63 20 3d 20  ess (major_rc = 
bd90: 30 78 39 30 29 22 29 3b 0a 0a 09 09 72 65 74 75  0x90)");....retu
bda0: 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  rn(CACKEY_PCSC_S
bdb0: 5f 4f 4b 29 3b 0a 09 7d 0a 0a 0a 09 43 41 43 4b  _OK);..}....CACK
bdc0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
bdd0: 22 41 50 44 55 20 52 65 74 75 72 6e 65 64 20 61  "APDU Returned a
bde0: 6e 20 65 72 72 6f 72 2c 20 72 65 74 75 72 6e 69  n error, returni
bdf0: 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b  ng in failure");
be00: 0a 0a 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
be10: 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29  _PCSC_E_GENERIC)
be20: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 75 6e 73 69  ;.}..static unsi
be30: 67 6e 65 64 20 63 68 61 72 20 2a 63 61 63 6b 65  gned char *cacke
be40: 79 5f 72 65 61 64 5f 62 65 72 74 6c 76 5f 74 61  y_read_bertlv_ta
be50: 67 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  g(unsigned char 
be60: 2a 62 75 66 66 65 72 2c 20 73 69 7a 65 5f 74 20  *buffer, size_t 
be70: 2a 62 75 66 66 65 72 5f 6c 65 6e 5f 70 2c 20 75  *buffer_len_p, u
be80: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 74 61 67  nsigned char tag
be90: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
bea0: 2a 6f 75 74 62 75 66 66 65 72 2c 20 73 69 7a 65  *outbuffer, size
beb0: 5f 74 20 2a 6f 75 74 62 75 66 66 65 72 5f 6c 65  _t *outbuffer_le
bec0: 6e 5f 70 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64  n_p) {..unsigned
bed0: 20 63 68 61 72 20 2a 62 75 66 66 65 72 5f 70 3b   char *buffer_p;
bee0: 0a 09 73 69 7a 65 5f 74 20 6f 75 74 62 75 66 66  ..size_t outbuff
bef0: 65 72 5f 6c 65 6e 2c 20 62 75 66 66 65 72 5f 6c  er_len, buffer_l
bf00: 65 6e 3b 0a 09 73 69 7a 65 5f 74 20 73 69 7a 65  en;..size_t size
bf10: 3b 0a 09 69 6e 74 20 69 64 78 3b 0a 0a 09 43 41  ;..int idx;...CA
bf20: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
bf30: 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
bf40: 69 66 20 28 62 75 66 66 65 72 5f 6c 65 6e 5f 70  if (buffer_len_p
bf50: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
bf60: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
bf70: 46 28 22 62 75 66 66 65 72 5f 6c 65 6e 5f 70 20  F("buffer_len_p 
bf80: 69 73 20 4e 55 4c 4c 2e 20 20 52 65 74 75 72 6e  is NULL.  Return
bf90: 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 2e 22  ing in failure."
bfa0: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c  );....return(NUL
bfb0: 4c 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 6f 75 74  L);..}...if (out
bfc0: 62 75 66 66 65 72 5f 6c 65 6e 5f 70 20 3d 3d 20  buffer_len_p == 
bfd0: 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
bfe0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 6f  _DEBUG_PRINTF("o
bff0: 75 74 62 75 66 66 65 72 5f 6c 65 6e 5f 70 20 69  utbuffer_len_p i
c000: 73 20 4e 55 4c 4c 2e 20 20 52 65 74 75 72 6e 69  s NULL.  Returni
c010: 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 2e 22 29  ng in failure.")
c020: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c  ;....return(NULL
c030: 29 3b 0a 09 7d 0a 0a 09 62 75 66 66 65 72 5f 6c  );..}...buffer_l
c040: 65 6e 20 3d 20 2a 6f 75 74 62 75 66 66 65 72 5f  en = *outbuffer_
c050: 6c 65 6e 5f 70 3b 0a 09 6f 75 74 62 75 66 66 65  len_p;..outbuffe
c060: 72 5f 6c 65 6e 20 3d 20 2a 6f 75 74 62 75 66 66  r_len = *outbuff
c070: 65 72 5f 6c 65 6e 5f 70 3b 0a 0a 09 69 66 20 28  er_len_p;...if (
c080: 62 75 66 66 65 72 5f 6c 65 6e 20 3c 20 32 29 20  buffer_len < 2) 
c090: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
c0a0: 5f 50 52 49 4e 54 46 28 22 62 75 66 66 65 72 5f  _PRINTF("buffer_
c0b0: 6c 65 6e 20 69 73 20 6c 65 73 73 20 74 68 61 6e  len is less than
c0c0: 20 32 2c 20 73 6f 20 77 65 20 63 61 6e 27 74 20   2, so we can't 
c0d0: 72 65 61 64 20 61 6e 79 20 74 61 67 2e 20 20 52  read any tag.  R
c0e0: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
c0f0: 75 72 65 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  ure.");....retur
c100: 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 62 75  n(NULL);..}...bu
c110: 66 66 65 72 5f 70 20 3d 20 62 75 66 66 65 72 3b  ffer_p = buffer;
c120: 0a 09 69 66 20 28 62 75 66 66 65 72 5f 70 5b 30  ..if (buffer_p[0
c130: 5d 20 21 3d 20 74 61 67 29 20 7b 0a 09 09 43 41  ] != tag) {...CA
c140: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
c150: 46 28 22 54 61 67 20 66 6f 75 6e 64 20 77 61 73  F("Tag found was
c160: 20 6e 6f 74 20 74 61 67 20 65 78 70 65 63 74 65   not tag expecte
c170: 64 2e 20 20 54 61 67 20 3d 20 25 30 32 78 2c 20  d.  Tag = %02x, 
c180: 45 78 70 65 63 74 65 64 20 3d 20 25 30 32 78 2e  Expected = %02x.
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 2c 20 28 75 6e 73 69 67  ailure.", (unsig
c1b0: 6e 65 64 20 69 6e 74 29 20 62 75 66 66 65 72 5f  ned int) buffer_
c1c0: 70 5b 30 5d 2c 20 74 61 67 29 3b 0a 0a 09 09 72  p[0], tag);....r
c1d0: 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a  eturn(NULL);..}.
c1e0: 0a 09 62 75 66 66 65 72 5f 70 2b 2b 3b 0a 09 62  ..buffer_p++;..b
c1f0: 75 66 66 65 72 5f 6c 65 6e 2d 2d 3b 0a 0a 09 69  uffer_len--;...i
c200: 66 20 28 28 62 75 66 66 65 72 5f 70 5b 30 5d 20  f ((buffer_p[0] 
c210: 26 20 30 78 38 30 29 20 3d 3d 20 30 78 38 30 29  & 0x80) == 0x80)
c220: 20 7b 0a 09 09 73 69 7a 65 20 3d 20 30 3b 0a 09   {...size = 0;..
c230: 09 69 64 78 20 3d 20 28 62 75 66 66 65 72 5f 70  .idx = (buffer_p
c240: 5b 30 5d 20 26 20 30 78 37 66 29 3b 0a 0a 09 09  [0] & 0x7f);....
c250: 69 66 20 28 69 64 78 20 3e 20 62 75 66 66 65 72  if (idx > buffer
c260: 5f 6c 65 6e 29 20 7b 0a 09 09 09 43 41 43 4b 45  _len) {....CACKE
c270: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
c280: 4d 61 6c 66 6f 72 6d 65 64 20 42 45 52 20 76 61  Malformed BER va
c290: 6c 75 65 20 2d 2d 20 6e 6f 74 20 65 6e 6f 75 67  lue -- not enoug
c2a0: 68 20 62 79 74 65 73 20 61 76 61 69 6c 61 62 6c  h bytes availabl
c2b0: 65 20 74 6f 20 72 65 61 64 20 6c 65 6e 67 74 68  e to read length
c2c0: 20 28 69 64 78 20 3d 20 25 69 2c 20 62 75 66 66   (idx = %i, buff
c2d0: 65 72 5f 6c 65 6e 20 3d 20 25 6c 75 29 22 2c 20  er_len = %lu)", 
c2e0: 69 64 78 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  idx, (unsigned l
c2f0: 6f 6e 67 29 20 62 75 66 66 65 72 5f 6c 65 6e 29  ong) buffer_len)
c300: 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 4e 55 4c  ;.....return(NUL
c310: 4c 29 3b 0a 09 09 7d 0a 0a 09 09 66 6f 72 20 28  L);...}....for (
c320: 3b 20 69 64 78 20 3e 20 30 3b 20 69 64 78 2d 2d  ; idx > 0; idx--
c330: 29 20 7b 0a 09 09 09 62 75 66 66 65 72 5f 70 2b  ) {....buffer_p+
c340: 2b 3b 0a 09 09 09 62 75 66 66 65 72 5f 6c 65 6e  +;....buffer_len
c350: 2d 2d 3b 0a 0a 09 09 09 73 69 7a 65 20 3c 3c 3d  --;.....size <<=
c360: 20 38 3b 0a 09 09 09 73 69 7a 65 20 7c 3d 20 62   8;....size |= b
c370: 75 66 66 65 72 5f 70 5b 30 5d 3b 0a 09 09 7d 0a  uffer_p[0];...}.
c380: 09 7d 20 65 6c 73 65 20 7b 0a 09 09 73 69 7a 65  .} else {...size
c390: 20 3d 20 62 75 66 66 65 72 5f 70 5b 30 5d 3b 0a   = buffer_p[0];.
c3a0: 09 7d 0a 0a 09 62 75 66 66 65 72 5f 70 2b 2b 3b  .}...buffer_p++;
c3b0: 0a 09 62 75 66 66 65 72 5f 6c 65 6e 2d 2d 3b 0a  ..buffer_len--;.
c3c0: 0a 09 69 66 20 28 73 69 7a 65 20 3e 20 6f 75 74  ..if (size > out
c3d0: 62 75 66 66 65 72 5f 6c 65 6e 29 20 7b 0a 09 09  buffer_len) {...
c3e0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
c3f0: 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 63  NTF("Unable to c
c400: 6f 70 79 20 76 61 6c 75 65 20 62 75 66 66 65 72  opy value buffer
c410: 20 74 6f 20 6f 75 74 62 75 66 66 65 72 2c 20 6e   to outbuffer, n
c420: 6f 74 20 65 6e 6f 75 67 68 20 72 6f 6f 6d 2e 20  ot enough room. 
c430: 20 56 61 6c 75 65 20 62 75 66 66 65 72 20 6c 65   Value buffer le
c440: 6e 67 74 68 20 3d 20 25 6c 75 2c 20 6f 75 74 20  ngth = %lu, out 
c450: 62 75 66 66 65 72 20 6c 65 6e 67 74 68 20 3d 20  buffer length = 
c460: 25 6c 75 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  %lu", (unsigned 
c470: 6c 6f 6e 67 29 20 73 69 7a 65 2c 20 28 75 6e 73  long) size, (uns
c480: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 6f 75 74 62  igned long) outb
c490: 75 66 66 65 72 5f 6c 65 6e 29 3b 0a 0a 09 09 72  uffer_len);....r
c4a0: 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a  eturn(NULL);..}.
c4b0: 0a 09 2a 6f 75 74 62 75 66 66 65 72 5f 6c 65 6e  ..*outbuffer_len
c4c0: 5f 70 20 3d 20 73 69 7a 65 3b 0a 09 69 66 20 28  _p = size;..if (
c4d0: 6f 75 74 62 75 66 66 65 72 29 20 7b 0a 09 09 6d  outbuffer) {...m
c4e0: 65 6d 63 70 79 28 6f 75 74 62 75 66 66 65 72 2c  emcpy(outbuffer,
c4f0: 20 62 75 66 66 65 72 5f 70 2c 20 73 69 7a 65 29   buffer_p, size)
c500: 3b 0a 09 09 62 75 66 66 65 72 5f 70 20 2b 3d 20  ;...buffer_p += 
c510: 73 69 7a 65 3b 0a 09 09 62 75 66 66 65 72 5f 6c  size;...buffer_l
c520: 65 6e 20 2d 3d 20 73 69 7a 65 3b 0a 0a 09 09 2a  en -= size;....*
c530: 62 75 66 66 65 72 5f 6c 65 6e 5f 70 20 3d 20 62  buffer_len_p = b
c540: 75 66 66 65 72 5f 6c 65 6e 3b 0a 0a 09 09 43 41  uffer_len;....CA
c550: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
c560: 42 55 46 28 22 42 45 52 2d 54 4c 56 20 72 65 73  BUF("BER-TLV res
c570: 75 6c 74 73 3a 22 2c 20 6f 75 74 62 75 66 66 65  ults:", outbuffe
c580: 72 2c 20 73 69 7a 65 29 3b 0a 09 7d 20 65 6c 73  r, size);..} els
c590: 65 20 7b 0a 09 09 6d 65 6d 6d 6f 76 65 28 62 75  e {...memmove(bu
c5a0: 66 66 65 72 2c 20 62 75 66 66 65 72 5f 70 2c 20  ffer, buffer_p, 
c5b0: 73 69 7a 65 29 3b 0a 09 09 62 75 66 66 65 72 5f  size);...buffer_
c5c0: 70 20 3d 20 62 75 66 66 65 72 3b 0a 0a 09 09 43  p = buffer;....C
c5d0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
c5e0: 54 42 55 46 28 22 42 45 52 2d 54 4c 56 20 72 65  TBUF("BER-TLV re
c5f0: 73 75 6c 74 73 3a 22 2c 20 62 75 66 66 65 72 2c  sults:", buffer,
c600: 20 73 69 7a 65 29 3b 0a 09 7d 0a 0a 09 43 41 43   size);..}...CAC
c610: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
c620: 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 73  ("Returning in s
c630: 75 63 63 65 73 73 2e 20 20 53 69 7a 65 20 6f 66  uccess.  Size of
c640: 20 63 6f 6e 74 65 6e 74 73 20 66 6f 72 20 74 61   contents for ta
c650: 67 20 25 30 32 78 20 69 73 20 25 6c 75 22 2c 20  g %02x is %lu", 
c660: 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 74  (unsigned int) t
c670: 61 67 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  ag, (unsigned lo
c680: 6e 67 29 20 73 69 7a 65 29 3b 0a 0a 09 72 65 74  ng) size);...ret
c690: 75 72 6e 28 62 75 66 66 65 72 5f 70 29 3b 0a 7d  urn(buffer_p);.}
c6a0: 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53  ../*. * SYNPOSIS
c6b0: 0a 20 2a 20 20 20 20 20 73 73 69 7a 65 5f 74 20  . *     ssize_t 
c6c0: 63 61 63 6b 65 79 5f 67 65 74 5f 64 61 74 61 28  cackey_get_data(
c6d0: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c  struct cackey_sl
c6e0: 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e  ot *slot, unsign
c6f0: 65 64 20 63 68 61 72 20 2a 62 75 66 66 65 72 2c  ed char *buffer,
c700: 20 73 69 7a 65 5f 74 20 62 75 66 66 65 72 5f 6c   size_t buffer_l
c710: 65 6e 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  en, unsigned cha
c720: 72 20 6f 69 64 5b 33 5d 29 3b 0a 20 2a 0a 20 2a  r oid[3]);. *. *
c730: 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20   ARGUMENTS. *   
c740: 20 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f    struct cackey_
c750: 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20  slot *slot. *   
c760: 20 20 20 20 20 20 53 6c 6f 74 20 74 6f 20 73 65        Slot to se
c770: 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20  nd commands to. 
c780: 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65  *. *     unsigne
c790: 64 20 63 68 61 72 20 2a 62 75 66 66 65 72 0a 20  d char *buffer. 
c7a0: 2a 20 20 20 20 20 20 20 20 20 5b 4f 55 54 5d 20  *         [OUT] 
c7b0: 42 75 66 66 65 72 0a 20 2a 0a 20 2a 20 20 20 20  Buffer. *. *    
c7c0: 20 73 69 7a 65 5f 74 20 62 75 66 66 65 72 5f 6c   size_t buffer_l
c7d0: 65 6e 0a 20 2a 20 20 20 20 20 20 20 20 20 4e 75  en. *         Nu
c7e0: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f  mber of bytes to
c7f0: 20 61 74 74 65 6d 70 74 20 74 6f 20 72 65 61 64   attempt to read
c800: 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67  . *. *     unsig
c810: 6e 65 64 20 63 68 61 72 20 6f 69 64 5b 33 5d 0a  ned char oid[3].
c820: 20 2a 20 20 20 20 20 20 20 20 20 33 2d 62 79 74   *         3-byt
c830: 65 20 4f 49 44 20 74 6f 20 72 65 61 64 0a 20 2a  e OID to read. *
c840: 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41  . *. * RETURN VA
c850: 4c 55 45 0a 20 2a 20 20 20 20 20 54 68 69 73 20  LUE. *     This 
c860: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
c870: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
c880: 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20 72 65  ytes actually re
c890: 61 64 2c 20 6f 72 20 2d 31 20 6f 6e 20 65 72 72  ad, or -1 on err
c8a0: 6f 72 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a  or.. *. * NOTES.
c8b0: 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20   *     None. *. 
c8c0: 2a 2f 0a 73 74 61 74 69 63 20 73 73 69 7a 65 5f  */.static ssize_
c8d0: 74 20 63 61 63 6b 65 79 5f 67 65 74 5f 64 61 74  t cackey_get_dat
c8e0: 61 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  a(struct cackey_
c8f0: 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69  slot *slot, unsi
c900: 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 66 65  gned char *buffe
c910: 72 2c 20 73 69 7a 65 5f 74 20 62 75 66 66 65 72  r, size_t buffer
c920: 5f 6c 65 6e 2c 20 75 6e 73 69 67 6e 65 64 20 63  _len, unsigned c
c930: 68 61 72 20 6f 69 64 5b 33 5d 29 20 7b 0a 09 75  har oid[3]) {..u
c940: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63 6d 64  nsigned char cmd
c950: 5b 5d 20 3d 20 7b 30 78 35 43 2c 20 30 78 30 33  [] = {0x5C, 0x03
c960: 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78  , 0x00, 0x00, 0x
c970: 30 30 7d 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63  00};..unsigned c
c980: 68 61 72 20 2a 62 75 66 66 65 72 5f 70 3b 0a 09  har *buffer_p;..
c990: 73 69 7a 65 5f 74 20 69 6e 69 74 5f 62 75 66 66  size_t init_buff
c9a0: 65 72 5f 6c 65 6e 2c 20 73 69 7a 65 3b 0a 09 75  er_len, size;..u
c9b0: 69 6e 74 31 36 5f 74 20 72 65 73 70 63 6f 64 65  int16_t respcode
c9c0: 3b 0a 09 69 6e 74 20 73 65 6e 64 5f 72 65 74 3b  ;..int send_ret;
c9d0: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
c9e0: 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
c9f0: 29 3b 0a 0a 09 69 6e 69 74 5f 62 75 66 66 65 72  );...init_buffer
ca00: 5f 6c 65 6e 20 3d 20 62 75 66 66 65 72 5f 6c 65  _len = buffer_le
ca10: 6e 3b 0a 0a 09 63 6d 64 5b 32 5d 20 3d 20 6f 69  n;...cmd[2] = oi
ca20: 64 5b 30 5d 3b 0a 09 63 6d 64 5b 33 5d 20 3d 20  d[0];..cmd[3] = 
ca30: 6f 69 64 5b 31 5d 3b 0a 09 63 6d 64 5b 34 5d 20  oid[1];..cmd[4] 
ca40: 3d 20 6f 69 64 5b 32 5d 3b 0a 0a 09 2f 2a 20 32  = oid[2];.../* 2
ca50: 35 36 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74  56 to indicate t
ca60: 68 65 20 6c 61 72 67 65 73 74 20 6d 65 73 73 61  he largest messa
ca70: 67 65 20 73 69 7a 65 20 2d 2d 20 6e 6f 74 20 63  ge size -- not c
ca80: 6c 65 61 72 20 69 66 20 74 68 69 73 20 77 69 6c  lear if this wil
ca90: 6c 20 77 6f 72 6b 20 77 69 74 68 20 61 6c 6c 20  l work with all 
caa0: 6d 65 73 73 61 67 65 73 20 2a 2f 0a 09 73 65 6e  messages */..sen
cab0: 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73  d_ret = cackey_s
cac0: 65 6e 64 5f 61 70 64 75 28 73 6c 6f 74 2c 20 47  end_apdu(slot, G
cad0: 53 43 49 53 5f 43 4c 41 53 53 5f 49 53 4f 37 38  SCIS_CLASS_ISO78
cae0: 31 36 2c 20 4e 49 53 54 53 50 38 30 30 5f 37 33  16, NISTSP800_73
caf0: 5f 33 5f 49 4e 53 54 52 5f 47 45 54 5f 44 41 54  _3_INSTR_GET_DAT
cb00: 41 2c 20 30 78 33 46 2c 20 30 78 46 46 2c 20 73  A, 0x3F, 0xFF, s
cb10: 69 7a 65 6f 66 28 63 6d 64 29 2c 20 63 6d 64 2c  izeof(cmd), cmd,
cb20: 20 32 35 36 2c 20 26 72 65 73 70 63 6f 64 65 2c   256, &respcode,
cb30: 20 62 75 66 66 65 72 2c 20 26 62 75 66 66 65 72   buffer, &buffer
cb40: 5f 6c 65 6e 29 3b 0a 0a 09 69 66 20 28 73 65 6e  _len);...if (sen
cb50: 64 5f 72 65 74 20 3d 3d 20 43 41 43 4b 45 59 5f  d_ret == CACKEY_
cb60: 50 43 53 43 5f 45 5f 52 45 54 52 59 29 20 7b 0a  PCSC_E_RETRY) {.
cb70: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
cb80: 52 49 4e 54 46 28 22 41 44 50 55 20 53 65 6e 64  RINTF("ADPU Send
cb90: 69 6e 67 20 66 61 69 6c 65 64 2c 20 72 65 74 72  ing failed, retr
cba0: 79 69 6e 67 20 72 65 61 64 20 62 75 66 66 65 72  ying read buffer
cbb0: 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 63 61  ");....return(ca
cbc0: 63 6b 65 79 5f 67 65 74 5f 64 61 74 61 28 73 6c  ckey_get_data(sl
cbd0: 6f 74 2c 20 62 75 66 66 65 72 2c 20 69 6e 69 74  ot, buffer, init
cbe0: 5f 62 75 66 66 65 72 5f 6c 65 6e 2c 20 6f 69 64  _buffer_len, oid
cbf0: 29 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 65 6e  ));..}...if (sen
cc00: 64 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f  d_ret != CACKEY_
cc10: 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43  PCSC_S_OK) {...C
cc20: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
cc30: 54 46 28 22 63 61 63 6b 65 79 5f 73 65 6e 64 5f  TF("cackey_send_
cc40: 61 70 64 75 28 29 20 66 61 69 6c 65 64 2c 20 72  apdu() failed, r
cc50: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
cc60: 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ure");....return
cc70: 28 2d 31 29 3b 0a 09 7d 0a 0a 23 69 66 64 65 66  (-1);..}..#ifdef
cc80: 20 43 41 43 4b 45 59 5f 50 41 52 41 4e 4f 49 44   CACKEY_PARANOID
cc90: 0a 23 20 20 69 66 64 65 66 20 5f 50 4f 53 49 58  .#  ifdef _POSIX
cca0: 5f 53 53 49 5a 45 5f 4d 41 58 0a 09 69 66 20 28  _SSIZE_MAX..if (
ccb0: 62 75 66 66 65 72 5f 6c 65 6e 20 3e 20 5f 50 4f  buffer_len > _PO
ccc0: 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58 29 20 7b  SIX_SSIZE_MAX) {
ccd0: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
cce0: 50 52 49 4e 54 46 28 22 52 65 61 64 20 62 79 74  PRINTF("Read byt
ccf0: 65 73 20 28 62 75 66 66 65 72 5f 6c 65 6e 29 20  es (buffer_len) 
cd00: 65 78 63 65 65 64 73 20 6d 61 78 69 6d 75 6d 20  exceeds maximum 
cd10: 76 61 6c 75 65 2c 20 72 65 74 75 72 6e 69 6e 67  value, returning
cd20: 20 69 6e 20 66 61 69 6c 75 72 65 2e 20 28 6d 61   in failure. (ma
cd30: 78 20 3d 20 25 6c 69 2c 20 62 75 66 66 65 72 5f  x = %li, buffer_
cd40: 6c 65 6e 20 3d 20 25 6c 75 29 22 2c 20 28 6c 6f  len = %lu)", (lo
cd50: 6e 67 29 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45  ng) _POSIX_SSIZE
cd60: 5f 4d 41 58 2c 20 28 75 6e 73 69 67 6e 65 64 20  _MAX, (unsigned 
cd70: 6c 6f 6e 67 29 20 62 75 66 66 65 72 5f 6c 65 6e  long) buffer_len
cd80: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29  );....return(-1)
cd90: 3b 0a 09 7d 0a 23 20 20 65 6e 64 69 66 0a 23 65  ;..}.#  endif.#e
cda0: 6e 64 69 66 0a 0a 09 69 66 20 28 62 75 66 66 65  ndif...if (buffe
cdb0: 72 5f 6c 65 6e 20 3c 20 32 29 20 7b 0a 09 09 43  r_len < 2) {...C
cdc0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
cdd0: 54 46 28 22 41 50 44 55 20 47 45 54 20 44 41 54  TF("APDU GET DAT
cde0: 41 20 72 65 74 75 72 6e 65 64 20 25 6c 75 20 62  A returned %lu b
cdf0: 79 74 65 73 2c 20 77 68 69 63 68 20 69 73 20 74  ytes, which is t
ce00: 6f 6f 20 73 68 6f 72 74 20 66 6f 72 20 61 20 42  oo short for a B
ce10: 45 52 2d 54 4c 56 20 72 65 73 70 6f 6e 73 65 22  ER-TLV response"
ce20: 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
ce30: 29 20 62 75 66 66 65 72 5f 6c 65 6e 29 3b 0a 0a  ) buffer_len);..
ce40: 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d  ..return(-1);..}
ce50: 0a 0a 09 73 69 7a 65 20 3d 20 62 75 66 66 65 72  ...size = buffer
ce60: 5f 6c 65 6e 3b 0a 09 62 75 66 66 65 72 5f 70 20  _len;..buffer_p 
ce70: 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 62 65  = cackey_read_be
ce80: 72 74 6c 76 5f 74 61 67 28 62 75 66 66 65 72 2c  rtlv_tag(buffer,
ce90: 20 26 62 75 66 66 65 72 5f 6c 65 6e 2c 20 30 78   &buffer_len, 0x
cea0: 35 33 2c 20 4e 55 4c 4c 2c 20 26 73 69 7a 65 29  53, NULL, &size)
ceb0: 3b 0a 0a 09 69 66 20 28 62 75 66 66 65 72 5f 70  ;...if (buffer_p
cec0: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
ced0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
cee0: 46 28 22 54 61 67 20 64 65 63 6f 64 69 6e 67 20  F("Tag decoding 
cef0: 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 69 6e  failed, returnin
cf00: 67 20 69 6e 20 65 72 72 6f 72 2e 22 29 3b 0a 0a  g in error.");..
cf10: 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d  ..return(-1);..}
cf20: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
cf30: 50 52 49 4e 54 42 55 46 28 22 47 45 54 20 44 41  PRINTBUF("GET DA
cf40: 54 41 20 72 65 73 75 6c 74 22 2c 20 62 75 66 66  TA result", buff
cf50: 65 72 2c 20 73 69 7a 65 29 3b 0a 0a 09 43 41 43  er, size);...CAC
cf60: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
cf70: 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 73  ("Returning in s
cf80: 75 63 63 65 73 73 2c 20 72 65 61 64 20 25 6c 75  uccess, read %lu
cf90: 20 62 79 74 65 73 22 2c 20 28 75 6e 73 69 67 6e   bytes", (unsign
cfa0: 65 64 20 6c 6f 6e 67 29 20 73 69 7a 65 29 3b 0a  ed long) size);.
cfb0: 0a 09 72 65 74 75 72 6e 28 73 69 7a 65 29 3b 0a  ..return(size);.
cfc0: 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49  }../*. * SYNPOSI
cfd0: 53 0a 20 2a 20 20 20 20 20 73 73 69 7a 65 5f 74  S. *     ssize_t
cfe0: 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 62 75 66   cackey_read_buf
cff0: 66 65 72 28 73 74 72 75 63 74 20 63 61 63 6b 65  fer(struct cacke
d000: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e  y_slot *slot, un
d010: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66  signed char *buf
d020: 66 65 72 2c 20 73 69 7a 65 5f 74 20 63 6f 75 6e  fer, size_t coun
d030: 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  t, unsigned char
d040: 20 74 5f 6f 72 5f 76 2c 20 73 69 7a 65 5f 74 20   t_or_v, size_t 
d050: 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65 74 29 3b  initial_offset);
d060: 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53  . *. * ARGUMENTS
d070: 0a 20 2a 20 20 20 20 20 73 74 72 75 63 74 20 63  . *     struct c
d080: 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74  ackey_slot *slot
d090: 0a 20 2a 20 20 20 20 20 20 20 20 20 53 6c 6f 74  . *         Slot
d0a0: 20 74 6f 20 73 65 6e 64 20 63 6f 6d 6d 61 6e 64   to send command
d0b0: 73 20 74 6f 0a 20 2a 0a 20 2a 20 20 20 20 20 75  s to. *. *     u
d0c0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75  nsigned char *bu
d0d0: 66 66 65 72 0a 20 2a 20 20 20 20 20 20 20 20 20  ffer. *         
d0e0: 5b 4f 55 54 5d 20 42 75 66 66 65 72 0a 20 2a 0a  [OUT] Buffer. *.
d0f0: 20 2a 20 20 20 20 20 73 69 7a 65 5f 74 20 63 6f   *     size_t co
d100: 75 6e 74 0a 20 2a 20 20 20 20 20 20 20 20 20 4e  unt. *         N
d110: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74  umber of bytes t
d120: 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 72 65 61  o attempt to rea
d130: 64 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69  d. *. *     unsi
d140: 67 6e 65 64 20 63 68 61 72 20 74 5f 6f 72 5f 76  gned char t_or_v
d150: 0a 20 2a 20 20 20 20 20 20 20 20 20 53 65 6c 65  . *         Sele
d160: 63 74 20 74 68 65 20 54 2d 62 75 66 66 65 72 20  ct the T-buffer 
d170: 28 30 31 29 20 6f 72 20 56 2d 62 75 66 66 65 72  (01) or V-buffer
d180: 20 28 30 32 29 20 74 6f 20 72 65 61 64 20 66 72   (02) to read fr
d190: 6f 6d 2e 20 20 0a 20 2a 0a 20 2a 20 20 20 20 20  om.  . *. *     
d1a0: 73 69 7a 65 5f 74 20 69 6e 69 74 69 61 6c 5f 6f  size_t initial_o
d1b0: 66 66 73 65 74 0a 20 2a 20 20 20 20 20 20 20 20  ffset. *        
d1c0: 20 53 70 65 63 69 66 79 20 74 68 65 20 6f 66 66   Specify the off
d1d0: 73 65 74 20 74 6f 20 62 65 67 69 6e 20 74 68 65  set to begin the
d1e0: 20 72 65 61 64 20 66 72 6f 6d 0a 20 2a 0a 20 2a   read from. *. *
d1f0: 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45  . * RETURN VALUE
d200: 0a 20 2a 20 20 20 20 20 54 68 69 73 20 66 75 6e  . *     This fun
d210: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68  ction returns th
d220: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
d230: 73 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64 2c  s actually read,
d240: 20 6f 72 20 2d 31 20 6f 6e 20 65 72 72 6f 72 2e   or -1 on error.
d250: 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20  . *. * NOTES. * 
d260: 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 2f 0a      None. *. */.
d270: 73 74 61 74 69 63 20 73 73 69 7a 65 5f 74 20 63  static ssize_t c
d280: 61 63 6b 65 79 5f 72 65 61 64 5f 62 75 66 66 65  ackey_read_buffe
d290: 72 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  r(struct cackey_
d2a0: 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69  slot *slot, unsi
d2b0: 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 66 65  gned char *buffe
d2c0: 72 2c 20 73 69 7a 65 5f 74 20 63 6f 75 6e 74 2c  r, size_t count,
d2d0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 74   unsigned char t
d2e0: 5f 6f 72 5f 76 2c 20 73 69 7a 65 5f 74 20 69 6e  _or_v, size_t in
d2f0: 69 74 69 61 6c 5f 6f 66 66 73 65 74 29 20 7b 0a  itial_offset) {.
d300: 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  .unsigned char *
d310: 69 6e 69 74 5f 62 75 66 66 65 72 3b 0a 09 73 69  init_buffer;..si
d320: 7a 65 5f 74 20 69 6e 69 74 5f 63 6f 75 6e 74 3b  ze_t init_count;
d330: 0a 09 73 69 7a 65 5f 74 20 69 6e 69 74 5f 69 6e  ..size_t init_in
d340: 69 74 69 61 6c 5f 6f 66 66 73 65 74 3b 0a 0a 09  itial_offset;...
d350: 73 69 7a 65 5f 74 20 6f 66 66 73 65 74 20 3d 20  size_t offset = 
d360: 30 2c 20 6d 61 78 5f 6f 66 66 73 65 74 2c 20 6d  0, max_offset, m
d370: 61 78 5f 63 6f 75 6e 74 3b 0a 09 75 6e 73 69 67  ax_count;..unsig
d380: 6e 65 64 20 63 68 61 72 20 63 6d 64 5b 32 5d 3b  ned char cmd[2];
d390: 0a 09 75 69 6e 74 31 36 5f 74 20 72 65 73 70 63  ..uint16_t respc
d3a0: 6f 64 65 3b 0a 09 69 6e 74 20 73 65 6e 64 5f 72  ode;..int send_r
d3b0: 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  et;...CACKEY_DEB
d3c0: 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
d3d0: 64 2e 22 29 3b 0a 0a 09 69 6e 69 74 5f 62 75 66  d.");...init_buf
d3e0: 66 65 72 20 3d 20 62 75 66 66 65 72 3b 0a 09 69  fer = buffer;..i
d3f0: 6e 69 74 5f 63 6f 75 6e 74 20 3d 20 63 6f 75 6e  nit_count = coun
d400: 74 3b 0a 09 69 6e 69 74 5f 69 6e 69 74 69 61 6c  t;..init_initial
d410: 5f 6f 66 66 73 65 74 20 3d 20 69 6e 69 74 69 61  _offset = initia
d420: 6c 5f 6f 66 66 73 65 74 3b 0a 0a 09 6d 61 78 5f  l_offset;...max_
d430: 6f 66 66 73 65 74 20 3d 20 63 6f 75 6e 74 3b 0a  offset = count;.
d440: 09 6d 61 78 5f 63 6f 75 6e 74 20 3d 20 43 41 43  .max_count = CAC
d450: 4b 45 59 5f 41 50 44 55 5f 4d 54 55 3b 0a 0a 09  KEY_APDU_MTU;...
d460: 69 66 20 28 74 5f 6f 72 5f 76 20 21 3d 20 31 20  if (t_or_v != 1 
d470: 26 26 20 74 5f 6f 72 5f 76 20 21 3d 20 32 29 20  && t_or_v != 2) 
d480: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
d490: 5f 50 52 49 4e 54 46 28 22 49 6e 76 61 6c 69 64  _PRINTF("Invalid
d4a0: 20 54 20 6f 72 20 56 20 70 61 72 61 6d 65 74 65   T or V paramete
d4b0: 72 20 73 70 65 63 69 66 69 65 64 2c 20 72 65 74  r specified, ret
d4c0: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
d4d0: 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d  e");....return(-
d4e0: 31 29 3b 0a 09 7d 0a 0a 09 63 6d 64 5b 30 5d 20  1);..}...cmd[0] 
d4f0: 3d 20 74 5f 6f 72 5f 76 3b 0a 0a 09 77 68 69 6c  = t_or_v;...whil
d500: 65 20 28 31 29 20 7b 0a 09 09 69 66 20 28 6f 66  e (1) {...if (of
d510: 66 73 65 74 20 3e 3d 20 6d 61 78 5f 6f 66 66 73  fset >= max_offs
d520: 65 74 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  et) {....CACKEY_
d530: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 42 75  DEBUG_PRINTF("Bu
d540: 66 66 65 72 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20  ffer too small, 
d550: 72 65 74 75 72 6e 69 6e 67 20 77 68 61 74 20 77  returning what w
d560: 65 20 67 6f 74 2e 2e 2e 22 29 3b 0a 0a 09 09 09  e got...");.....
d570: 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09 63 6f  break;...}....co
d580: 75 6e 74 20 3d 20 6d 61 78 5f 6f 66 66 73 65 74  unt = max_offset
d590: 20 2d 20 6f 66 66 73 65 74 3b 0a 09 09 69 66 20   - offset;...if 
d5a0: 28 63 6f 75 6e 74 20 3e 20 6d 61 78 5f 63 6f 75  (count > max_cou
d5b0: 6e 74 29 20 7b 0a 09 09 09 63 6f 75 6e 74 20 3d  nt) {....count =
d5c0: 20 6d 61 78 5f 63 6f 75 6e 74 3b 0a 09 09 7d 0a   max_count;...}.
d5d0: 0a 09 09 63 6d 64 5b 31 5d 20 3d 20 63 6f 75 6e  ...cmd[1] = coun
d5e0: 74 3b 0a 0a 09 09 73 65 6e 64 5f 72 65 74 20 3d  t;....send_ret =
d5f0: 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64   cackey_send_apd
d600: 75 28 73 6c 6f 74 2c 20 47 53 43 49 53 5f 43 4c  u(slot, GSCIS_CL
d610: 41 53 53 5f 47 4c 4f 42 41 4c 5f 50 4c 41 54 46  ASS_GLOBAL_PLATF
d620: 4f 52 4d 2c 20 47 53 43 49 53 5f 49 4e 53 54 52  ORM, GSCIS_INSTR
d630: 5f 52 45 41 44 5f 42 55 46 46 45 52 2c 20 28 28  _READ_BUFFER, ((
d640: 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65 74 20 2b  initial_offset +
d650: 20 6f 66 66 73 65 74 29 20 3e 3e 20 38 29 20 26   offset) >> 8) &
d660: 20 30 78 66 66 2c 20 28 69 6e 69 74 69 61 6c 5f   0xff, (initial_
d670: 6f 66 66 73 65 74 20 2b 20 6f 66 66 73 65 74 29  offset + offset)
d680: 20 26 20 30 78 66 66 2c 20 73 69 7a 65 6f 66 28   & 0xff, sizeof(
d690: 63 6d 64 29 2c 20 63 6d 64 2c 20 30 78 30 30 2c  cmd), cmd, 0x00,
d6a0: 20 26 72 65 73 70 63 6f 64 65 2c 20 62 75 66 66   &respcode, buff
d6b0: 65 72 20 2b 20 6f 66 66 73 65 74 2c 20 26 63 6f  er + offset, &co
d6c0: 75 6e 74 29 3b 0a 0a 09 09 69 66 20 28 73 65 6e  unt);....if (sen
d6d0: 64 5f 72 65 74 20 3d 3d 20 43 41 43 4b 45 59 5f  d_ret == CACKEY_
d6e0: 50 43 53 43 5f 45 5f 52 45 54 52 59 29 20 7b 0a  PCSC_E_RETRY) {.
d6f0: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
d700: 50 52 49 4e 54 46 28 22 41 44 50 55 20 53 65 6e  PRINTF("ADPU Sen
d710: 64 69 6e 67 20 66 61 69 6c 65 64 2c 20 72 65 74  ding failed, ret
d720: 72 79 69 6e 67 20 72 65 61 64 20 62 75 66 66 65  rying read buffe
d730: 72 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28  r");.....return(
d740: 63 61 63 6b 65 79 5f 72 65 61 64 5f 62 75 66 66  cackey_read_buff
d750: 65 72 28 73 6c 6f 74 2c 20 69 6e 69 74 5f 62 75  er(slot, init_bu
d760: 66 66 65 72 2c 20 69 6e 69 74 5f 63 6f 75 6e 74  ffer, init_count
d770: 2c 20 74 5f 6f 72 5f 76 2c 20 69 6e 69 74 5f 69  , t_or_v, init_i
d780: 6e 69 74 69 61 6c 5f 6f 66 66 73 65 74 29 29 3b  nitial_offset));
d790: 0a 09 09 7d 0a 0a 09 09 69 66 20 28 73 65 6e 64  ...}....if (send
d7a0: 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50  _ret != CACKEY_P
d7b0: 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 69  CSC_S_OK) {....i
d7c0: 66 20 28 72 65 73 70 63 6f 64 65 20 3d 3d 20 30  f (respcode == 0
d7d0: 78 36 41 38 36 29 20 7b 0a 09 09 09 09 69 66 20  x6A86) {.....if 
d7e0: 28 6d 61 78 5f 63 6f 75 6e 74 20 3d 3d 20 31 29  (max_count == 1)
d7f0: 20 7b 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09   {......break;..
d800: 09 09 09 7d 0a 0a 09 09 09 09 6d 61 78 5f 63 6f  ...}......max_co
d810: 75 6e 74 20 3d 20 6d 61 78 5f 63 6f 75 6e 74 20  unt = max_count 
d820: 2f 20 32 3b 0a 0a 09 09 09 09 63 6f 6e 74 69 6e  / 2;......contin
d830: 75 65 3b 0a 09 09 09 7d 0a 0a 09 09 09 43 41 43  ue;....}.....CAC
d840: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
d850: 28 22 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70  ("cackey_send_ap
d860: 64 75 28 29 20 66 61 69 6c 65 64 2c 20 72 65 74  du() failed, ret
d870: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
d880: 65 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28  e");.....return(
d890: 2d 31 29 3b 0a 09 09 7d 0a 0a 09 09 6f 66 66 73  -1);...}....offs
d8a0: 65 74 20 2b 3d 20 63 6f 75 6e 74 3b 0a 0a 09 09  et += count;....
d8b0: 69 66 20 28 63 6f 75 6e 74 20 3c 20 6d 61 78 5f  if (count < max_
d8c0: 63 6f 75 6e 74 29 20 7b 0a 09 09 09 43 41 43 4b  count) {....CACK
d8d0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
d8e0: 22 53 68 6f 72 74 20 72 65 61 64 20 2d 2d 20 63  "Short read -- c
d8f0: 6f 75 6e 74 20 3d 20 25 69 2c 20 63 6d 64 5b 31  ount = %i, cmd[1
d900: 5d 20 3d 20 25 69 22 2c 20 28 69 6e 74 29 20 63  ] = %i", (int) c
d910: 6f 75 6e 74 2c 20 28 69 6e 74 29 20 63 6d 64 5b  ount, (int) cmd[
d920: 31 5d 29 3b 0a 0a 09 09 09 62 72 65 61 6b 3b 0a  1]);.....break;.
d930: 09 09 7d 0a 09 7d 0a 0a 23 69 66 64 65 66 20 43  ..}..}..#ifdef C
d940: 41 43 4b 45 59 5f 50 41 52 41 4e 4f 49 44 0a 23  ACKEY_PARANOID.#
d950: 20 20 69 66 64 65 66 20 5f 50 4f 53 49 58 5f 53    ifdef _POSIX_S
d960: 53 49 5a 45 5f 4d 41 58 0a 09 69 66 20 28 6f 66  SIZE_MAX..if (of
d970: 66 73 65 74 20 3e 20 5f 50 4f 53 49 58 5f 53 53  fset > _POSIX_SS
d980: 49 5a 45 5f 4d 41 58 29 20 7b 0a 09 09 43 41 43  IZE_MAX) {...CAC
d990: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
d9a0: 28 22 4f 66 66 73 65 74 20 65 78 63 65 65 64 73  ("Offset exceeds
d9b0: 20 6d 61 78 69 6d 75 6d 20 76 61 6c 75 65 2c 20   maximum value, 
d9c0: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  returning in fai
d9d0: 6c 75 72 65 2e 20 28 6d 61 78 20 3d 20 25 6c 69  lure. (max = %li
d9e0: 2c 20 6f 66 66 73 65 74 20 3d 20 25 6c 75 29 22  , offset = %lu)"
d9f0: 2c 20 28 6c 6f 6e 67 29 20 5f 50 4f 53 49 58 5f  , (long) _POSIX_
da00: 53 53 49 5a 45 5f 4d 41 58 2c 20 28 75 6e 73 69  SSIZE_MAX, (unsi
da10: 67 6e 65 64 20 6c 6f 6e 67 29 20 6f 66 66 73 65  gned long) offse
da20: 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31  t);....return(-1
da30: 29 3b 0a 09 7d 0a 23 20 20 65 6e 64 69 66 0a 23  );..}.#  endif.#
da40: 65 6e 64 69 66 0a 0a 09 43 41 43 4b 45 59 5f 44  endif...CACKEY_D
da50: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
da60: 75 72 6e 69 6e 67 20 69 6e 20 73 75 63 63 65 73  urning in succes
da70: 73 2c 20 72 65 61 64 20 25 6c 75 20 62 79 74 65  s, read %lu byte
da80: 73 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  s", (unsigned lo
da90: 6e 67 29 20 6f 66 66 73 65 74 29 3b 0a 0a 09 72  ng) offset);...r
daa0: 65 74 75 72 6e 28 6f 66 66 73 65 74 29 3b 0a 7d  eturn(offset);.}
dab0: 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53  ../*. * SYNPOSIS
dac0: 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 72  . *     cackey_r
dad0: 65 74 20 63 61 63 6b 65 79 5f 73 65 6c 65 63 74  et cackey_select
dae0: 5f 61 70 70 6c 65 74 28 73 74 72 75 63 74 20 63  _applet(struct c
daf0: 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74  ackey_slot *slot
db00: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
db10: 2a 61 69 64 2c 20 73 69 7a 65 5f 74 20 61 69 64  *aid, size_t aid
db20: 5f 6c 65 6e 29 3b 0a 20 2a 0a 20 2a 20 41 52 47  _len);. *. * ARG
db30: 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 73 74  UMENTS. *     st
db40: 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74  ruct cackey_slot
db50: 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20   *slot. *       
db60: 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63    Slot to send c
db70: 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a  ommands to. *. *
db80: 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68       unsigned ch
db90: 61 72 20 2a 61 69 64 0a 20 2a 20 20 20 20 20 20  ar *aid. *      
dba0: 20 20 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69     Buffer contai
dbb0: 6e 69 6e 67 20 41 70 70 6c 65 74 20 49 44 20 74  ning Applet ID t
dbc0: 6f 20 73 65 6c 65 63 74 0a 20 2a 0a 20 2a 20 20  o select. *. *  
dbd0: 20 20 20 73 69 7a 65 5f 74 20 61 69 64 5f 6c 65     size_t aid_le
dbe0: 6e 0a 20 2a 20 20 20 20 20 20 20 20 20 4e 75 6d  n. *         Num
dbf0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
dc00: 74 68 65 20 22 61 69 64 22 20 28 41 70 70 6c 65  the "aid" (Apple
dc10: 74 20 49 44 29 20 70 61 72 61 6d 65 74 65 72 0a  t ID) parameter.
dc20: 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c   *. * RETURN VAL
dc30: 55 45 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59  UE. *     CACKEY
dc40: 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20 20 20 20  _PCSC_S_OK      
dc50: 20 20 20 4f 6e 20 73 75 63 63 65 73 73 0a 20 2a     On success. *
dc60: 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43       CACKEY_PCSC
dc70: 5f 45 5f 47 45 4e 45 52 49 43 20 20 20 20 4f 6e  _E_GENERIC    On
dc80: 20 65 72 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54   error. *. * NOT
dc90: 45 53 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20  ES. *     None. 
dca0: 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 61 63  *. */.static cac
dcb0: 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 73  key_ret cackey_s
dcc0: 65 6c 65 63 74 5f 61 70 70 6c 65 74 28 73 74 72  elect_applet(str
dcd0: 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20  uct cackey_slot 
dce0: 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20  *slot, unsigned 
dcf0: 63 68 61 72 20 2a 61 69 64 2c 20 73 69 7a 65 5f  char *aid, size_
dd00: 74 20 61 69 64 5f 6c 65 6e 29 20 7b 0a 09 69 6e  t aid_len) {..in
dd10: 74 20 73 65 6e 64 5f 72 65 74 3b 0a 0a 09 43 41  t send_ret;...CA
dd20: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
dd30: 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
dd40: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
dd50: 4e 54 42 55 46 28 22 53 65 6c 65 63 74 69 6e 67  NTBUF("Selecting
dd60: 20 61 70 70 6c 65 74 3a 22 2c 20 61 69 64 2c 20   applet:", aid, 
dd70: 61 69 64 5f 6c 65 6e 29 3b 0a 0a 09 73 65 6e 64  aid_len);...send
dd80: 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65  _ret = cackey_se
dd90: 6e 64 5f 61 70 64 75 28 73 6c 6f 74 2c 20 47 53  nd_apdu(slot, GS
dda0: 43 49 53 5f 43 4c 41 53 53 5f 49 53 4f 37 38 31  CIS_CLASS_ISO781
ddb0: 36 2c 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 53  6, GSCIS_INSTR_S
ddc0: 45 4c 45 43 54 2c 20 47 53 43 49 53 5f 50 41 52  ELECT, GSCIS_PAR
ddd0: 41 4d 5f 53 45 4c 45 43 54 5f 41 50 50 4c 45 54  AM_SELECT_APPLET
dde0: 2c 20 30 78 30 30 2c 20 61 69 64 5f 6c 65 6e 2c  , 0x00, aid_len,
ddf0: 20 61 69 64 2c 20 30 78 30 30 2c 20 4e 55 4c 4c   aid, 0x00, NULL
de00: 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 0a  , NULL, NULL);..
de10: 09 69 66 20 28 73 65 6e 64 5f 72 65 74 20 3d 3d  .if (send_ret ==
de20: 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 52   CACKEY_PCSC_E_R
de30: 45 54 52 59 29 20 7b 0a 09 09 43 41 43 4b 45 59  ETRY) {...CACKEY
de40: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 41  _DEBUG_PRINTF("A
de50: 44 50 55 20 53 65 6e 64 69 6e 67 20 66 61 69 6c  DPU Sending fail
de60: 65 64 2c 20 72 65 74 72 79 69 6e 67 20 73 65 6c  ed, retrying sel
de70: 65 63 74 20 61 70 70 6c 65 74 22 29 3b 0a 0a 09  ect applet");...
de80: 09 72 65 74 75 72 6e 28 63 61 63 6b 65 79 5f 73  .return(cackey_s
de90: 65 6c 65 63 74 5f 61 70 70 6c 65 74 28 73 6c 6f  elect_applet(slo
dea0: 74 2c 20 61 69 64 2c 20 61 69 64 5f 6c 65 6e 29  t, aid, aid_len)
deb0: 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 65 6e 64  );..}...if (send
dec0: 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50  _ret != CACKEY_P
ded0: 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41  CSC_S_OK) {...CA
dee0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
def0: 46 28 22 46 61 69 6c 65 64 20 74 6f 20 6f 70 65  F("Failed to ope
df00: 6e 20 61 70 70 6c 65 74 2c 20 72 65 74 75 72 6e  n applet, return
df10: 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29  ing in failure")
df20: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b  ;....return(CACK
df30: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49  EY_PCSC_E_GENERI
df40: 43 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  C);..}...CACKEY_
df50: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 75  DEBUG_PRINTF("Su
df60: 63 63 65 73 73 66 75 6c 6c 79 20 73 65 6c 65 63  ccessfully selec
df70: 74 65 64 20 66 69 6c 65 22 29 3b 0a 0a 09 72 65  ted file");...re
df80: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
df90: 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a  _S_OK);.}../*. *
dfa0: 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20   SYNPOSIS. *    
dfb0: 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b   cackey_ret cack
dfc0: 65 79 5f 73 65 6c 65 63 74 5f 66 69 6c 65 28 73  ey_select_file(s
dfd0: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f  truct cackey_slo
dfe0: 74 20 2a 73 6c 6f 74 2c 20 75 69 6e 74 31 36 5f  t *slot, uint16_
dff0: 74 20 65 66 29 3b 0a 20 2a 0a 20 2a 20 41 52 47  t ef);. *. * ARG
e000: 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 73 74  UMENTS. *     st
e010: 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74  ruct cackey_slot
e020: 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20   *slot. *       
e030: 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63    Slot to send c
e040: 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a  ommands to. *. *
e050: 20 20 20 20 20 75 69 6e 74 31 36 5f 74 20 65 66       uint16_t ef
e060: 0a 20 2a 20 20 20 20 20 20 20 20 20 45 6c 65 6d  . *         Elem
e070: 65 6e 74 61 6c 20 46 69 6c 65 20 74 6f 20 73 65  ental File to se
e080: 6c 65 63 74 0a 20 2a 0a 20 2a 20 52 45 54 55 52  lect. *. * RETUR
e090: 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 43  N VALUE. *     C
e0a0: 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20  ACKEY_PCSC_S_OK 
e0b0: 20 20 20 20 20 20 20 20 4f 6e 20 73 75 63 63 65          On succe
e0c0: 73 73 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59  ss. *     CACKEY
e0d0: 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 20  _PCSC_E_GENERIC 
e0e0: 20 20 20 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a 20     On error. *. 
e0f0: 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 54  * NOTES. *     T
e100: 68 69 73 20 73 65 6c 65 63 74 73 20 61 6e 20 45  his selects an E
e110: 6c 65 6d 65 6e 74 61 72 79 20 46 69 6c 65 20 28  lementary File (
e120: 45 46 29 20 75 6e 64 65 72 20 74 68 65 20 63 75  EF) under the cu
e130: 72 72 65 6e 74 6c 79 20 73 65 6c 65 63 74 65 64  rrently selected
e140: 0a 20 2a 20 20 20 20 20 44 65 64 69 63 61 74 65  . *     Dedicate
e150: 64 20 46 69 6c 65 20 28 44 46 29 0a 20 2a 0a 20  d File (DF). *. 
e160: 2a 20 20 20 20 20 54 79 70 69 63 61 6c 6c 79 20  *     Typically 
e170: 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 61  this is called a
e180: 66 74 65 72 20 73 65 6c 65 63 74 69 6e 67 20 74  fter selecting t
e190: 68 65 20 63 6f 72 72 65 63 74 20 41 70 70 6c 65  he correct Apple
e1a0: 74 20 28 75 73 69 6e 67 0a 20 2a 20 20 20 20 20  t (using. *     
e1b0: 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 61 70  cackey_select_ap
e1c0: 70 6c 65 74 29 20 66 6f 72 20 56 4d 20 63 61 72  plet) for VM car
e1d0: 64 73 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63  ds. *. */.static
e1e0: 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b   cackey_ret cack
e1f0: 65 79 5f 73 65 6c 65 63 74 5f 66 69 6c 65 28 73  ey_select_file(s
e200: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f  truct cackey_slo
e210: 74 20 2a 73 6c 6f 74 2c 20 75 69 6e 74 31 36 5f  t *slot, uint16_
e220: 74 20 65 66 29 20 7b 0a 09 75 6e 73 69 67 6e 65  t ef) {..unsigne
e230: 64 20 63 68 61 72 20 66 69 64 5f 62 75 66 5b 32  d char fid_buf[2
e240: 5d 3b 0a 09 69 6e 74 20 73 65 6e 64 5f 72 65 74  ];..int send_ret
e250: 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
e260: 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
e270: 22 29 3b 0a 0a 09 2f 2a 20 4f 70 65 6e 20 74 68  ");.../* Open th
e280: 65 20 65 6c 65 6d 65 6e 74 61 72 79 20 66 69 6c  e elementary fil
e290: 65 20 2a 2f 0a 09 66 69 64 5f 62 75 66 5b 30 5d  e */..fid_buf[0]
e2a0: 20 3d 20 28 65 66 20 3e 3e 20 38 29 20 26 20 30   = (ef >> 8) & 0
e2b0: 78 66 66 3b 0a 09 66 69 64 5f 62 75 66 5b 31 5d  xff;..fid_buf[1]
e2c0: 20 3d 20 65 66 20 26 20 30 78 66 66 3b 0a 0a 09   = ef & 0xff;...
e2d0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
e2e0: 4e 54 46 28 22 53 65 6c 65 63 74 69 6e 67 20 66  NTF("Selecting f
e2f0: 69 6c 65 3a 20 25 30 34 6c 78 22 2c 20 28 75 6e  ile: %04lx", (un
e300: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 65 66 29  signed long) ef)
e310: 3b 0a 0a 09 73 65 6e 64 5f 72 65 74 20 3d 20 63  ;...send_ret = c
e320: 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28  ackey_send_apdu(
e330: 73 6c 6f 74 2c 20 47 53 43 49 53 5f 43 4c 41 53  slot, GSCIS_CLAS
e340: 53 5f 49 53 4f 37 38 31 36 2c 20 47 53 43 49 53  S_ISO7816, GSCIS
e350: 5f 49 4e 53 54 52 5f 53 45 4c 45 43 54 2c 20 30  _INSTR_SELECT, 0
e360: 78 30 32 2c 20 30 78 30 43 2c 20 73 69 7a 65 6f  x02, 0x0C, sizeo
e370: 66 28 66 69 64 5f 62 75 66 29 2c 20 66 69 64 5f  f(fid_buf), fid_
e380: 62 75 66 2c 20 30 78 30 30 2c 20 4e 55 4c 4c 2c  buf, 0x00, NULL,
e390: 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 69   NULL, NULL);..i
e3a0: 66 20 28 73 65 6e 64 5f 72 65 74 20 21 3d 20 43  f (send_ret != C
e3b0: 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29  ACKEY_PCSC_S_OK)
e3c0: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
e3d0: 47 5f 50 52 49 4e 54 46 28 22 46 61 69 6c 65 64  G_PRINTF("Failed
e3e0: 20 74 6f 20 6f 70 65 6e 20 66 69 6c 65 2c 20 72   to open file, r
e3f0: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
e400: 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ure");....return
e410: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47  (CACKEY_PCSC_E_G
e420: 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 43 41  ENERIC);..}...CA
e430: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
e440: 46 28 22 53 75 63 63 65 73 73 66 75 6c 6c 79 20  F("Successfully 
e450: 73 65 6c 65 63 74 65 64 20 66 69 6c 65 22 29 3b  selected file");
e460: 0a 0a 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
e470: 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a  _PCSC_S_OK);.}..
e480: 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20  /*. * SYNPOSIS. 
e490: 2a 20 20 20 20 20 76 6f 69 64 20 63 61 63 6b 65  *     void cacke
e4a0: 79 5f 66 72 65 65 5f 74 6c 76 28 73 74 72 75 63  y_free_tlv(struc
e4b0: 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74  t cackey_tlv_ent
e4c0: 69 74 79 20 2a 72 6f 6f 74 29 3b 0a 20 2a 0a 20  ity *root);. *. 
e4d0: 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20  * ARGUMENTS. *  
e4e0: 20 20 20 73 74 72 75 63 74 20 63 61 63 6b 65 79     struct cackey
e4f0: 5f 74 6c 76 5f 65 6e 74 69 74 79 20 2a 72 6f 6f  _tlv_entity *roo
e500: 74 0a 20 2a 20 20 20 20 20 20 20 20 20 52 6f 6f  t. *         Roo
e510: 74 20 6f 66 20 74 68 65 20 54 4c 56 20 6c 69 73  t of the TLV lis
e520: 74 20 74 6f 20 73 74 61 72 74 20 66 72 65 65 69  t to start freei
e530: 6e 67 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20  ng. *. * RETURN 
e540: 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 4e 6f 6e  VALUE. *     Non
e550: 65 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a  e. *. * NOTES. *
e560: 20 20 20 20 20 54 68 69 73 20 66 75 6e 63 74 69       This functi
e570: 6f 6e 20 66 72 65 65 73 20 74 68 65 20 54 4c 56  on frees the TLV
e580: 20 6c 69 6e 6b 65 64 20 6c 69 73 74 65 64 20 72   linked listed r
e590: 65 74 75 72 6e 65 64 20 66 72 6f 6d 0a 20 2a 20  eturned from. * 
e5a0: 20 20 20 20 22 63 61 63 6b 65 79 5f 72 65 61 64      "cackey_read
e5b0: 5f 74 6c 76 22 0a 20 2a 0a 20 2a 2f 0a 73 74 61  _tlv". *. */.sta
e5c0: 74 69 63 20 76 6f 69 64 20 63 61 63 6b 65 79 5f  tic void cackey_
e5d0: 66 72 65 65 5f 74 6c 76 28 73 74 72 75 63 74 20  free_tlv(struct 
e5e0: 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74  cackey_tlv_entit
e5f0: 79 20 2a 72 6f 6f 74 29 20 7b 0a 09 73 74 72 75  y *root) {..stru
e600: 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e  ct cackey_tlv_en
e610: 74 69 74 79 20 2a 63 75 72 72 2c 20 2a 6e 65 78  tity *curr, *nex
e620: 74 3b 0a 0a 09 69 66 20 28 72 6f 6f 74 20 3d 3d  t;...if (root ==
e630: 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72   NULL) {...retur
e640: 6e 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 63 75 72  n;..}...for (cur
e650: 72 20 3d 20 72 6f 6f 74 3b 20 63 75 72 72 3b 20  r = root; curr; 
e660: 63 75 72 72 20 3d 20 6e 65 78 74 29 20 7b 0a 09  curr = next) {..
e670: 09 6e 65 78 74 20 3d 20 63 75 72 72 2d 3e 5f 6e  .next = curr->_n
e680: 65 78 74 3b 0a 0a 09 09 73 77 69 74 63 68 20 28  ext;....switch (
e690: 63 75 72 72 2d 3e 74 61 67 29 20 7b 0a 09 09 09  curr->tag) {....
e6a0: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 41  case GSCIS_TAG_A
e6b0: 43 52 5f 54 41 42 4c 45 3a 0a 09 09 09 63 61 73  CR_TABLE:....cas
e6c0: 65 20 47 53 43 49 53 5f 54 41 47 5f 43 45 52 54  e GSCIS_TAG_CERT
e6d0: 49 46 49 43 41 54 45 3a 0a 09 09 09 09 69 66 20  IFICATE:.....if 
e6e0: 28 63 75 72 72 2d 3e 76 61 6c 75 65 29 20 7b 0a  (curr->value) {.
e6f0: 09 09 09 09 09 66 72 65 65 28 63 75 72 72 2d 3e  .....free(curr->
e700: 76 61 6c 75 65 29 3b 0a 09 09 09 09 7d 0a 09 09  value);.....}...
e710: 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
e720: 20 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44 55   GSCIS_TAG_CARDU
e730: 52 4c 3a 0a 09 09 09 09 69 66 20 28 63 75 72 72  RL:.....if (curr
e740: 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 29  ->value_cardurl)
e750: 20 7b 0a 09 09 09 09 09 66 72 65 65 28 63 75 72   {......free(cur
e760: 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c  r->value_cardurl
e770: 29 3b 0a 09 09 09 09 7d 0a 09 09 09 09 62 72 65  );.....}.....bre
e780: 61 6b 3b 0a 09 09 7d 0a 0a 09 09 66 72 65 65 28  ak;...}....free(
e790: 63 75 72 72 29 3b 0a 09 7d 0a 0a 09 72 65 74 75  curr);..}...retu
e7a0: 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e  rn;.}../*. * SYN
e7b0: 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 2e 2e 2e  POSIS. *     ...
e7c0: 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53  . *. * ARGUMENTS
e7d0: 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20  . *     .... *. 
e7e0: 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20  * RETURN VALUE. 
e7f0: 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20  *     .... *. * 
e800: 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 2e 2e 2e  NOTES. *     ...
e810: 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 73  . *. */.static s
e820: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76  truct cackey_tlv
e830: 5f 65 6e 74 69 74 79 20 2a 63 61 63 6b 65 79 5f  _entity *cackey_
e840: 72 65 61 64 5f 74 6c 76 28 73 74 72 75 63 74 20  read_tlv(struct 
e850: 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f  cackey_slot *slo
e860: 74 29 20 7b 0a 09 73 74 72 75 63 74 20 63 61 63  t) {..struct cac
e870: 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20 2a  key_tlv_entity *
e880: 63 75 72 72 5f 65 6e 74 69 74 79 2c 20 2a 72 6f  curr_entity, *ro
e890: 6f 74 20 3d 20 4e 55 4c 4c 2c 20 2a 6c 61 73 74  ot = NULL, *last
e8a0: 20 3d 20 4e 55 4c 4c 3b 0a 09 75 6e 73 69 67 6e   = NULL;..unsign
e8b0: 65 64 20 63 68 61 72 20 74 6c 65 6e 5f 62 75 66  ed char tlen_buf
e8c0: 5b 32 5d 2c 20 74 76 61 6c 5f 62 75 66 5b 31 30  [2], tval_buf[10
e8d0: 32 34 5d 2c 20 2a 74 76 61 6c 3b 0a 09 75 6e 73  24], *tval;..uns
e8e0: 69 67 6e 65 64 20 63 68 61 72 20 76 6c 65 6e 5f  igned char vlen_
e8f0: 62 75 66 5b 32 5d 2c 20 76 76 61 6c 5f 62 75 66  buf[2], vval_buf
e900: 5b 38 31 39 32 5d 2c 20 2a 76 76 61 6c 3b 0a 09  [8192], *vval;..
e910: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74  unsigned char *t
e920: 6d 70 62 75 66 3b 0a 09 75 6e 73 69 67 6e 65 64  mpbuf;..unsigned
e930: 20 6c 6f 6e 67 20 74 6d 70 62 75 66 6c 65 6e 3b   long tmpbuflen;
e940: 0a 09 73 73 69 7a 65 5f 74 20 74 6c 65 6e 2c 20  ..ssize_t tlen, 
e950: 76 6c 65 6e 3b 0a 09 73 73 69 7a 65 5f 74 20 72  vlen;..ssize_t r
e960: 65 61 64 5f 72 65 74 3b 0a 09 73 69 7a 65 5f 74  ead_ret;..size_t
e970: 20 6f 66 66 73 65 74 5f 74 20 3d 20 30 2c 20 6f   offset_t = 0, o
e980: 66 66 73 65 74 5f 76 20 3d 20 30 3b 0a 09 75 6e  ffset_v = 0;..un
e990: 73 69 67 6e 65 64 20 63 68 61 72 20 74 61 67 3b  signed char tag;
e9a0: 0a 09 73 69 7a 65 5f 74 20 6c 65 6e 67 74 68 3b  ..size_t length;
e9b0: 0a 23 69 66 64 65 66 20 48 41 56 45 5f 4c 49 42  .#ifdef HAVE_LIB
e9c0: 5a 0a 09 69 6e 74 20 75 6e 63 6f 6d 70 72 65 73  Z..int uncompres
e9d0: 73 5f 72 65 74 3b 0a 23 65 6e 64 69 66 0a 0a 09  s_ret;.#endif...
e9e0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
e9f0: 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
ea00: 0a 09 72 65 61 64 5f 72 65 74 20 3d 20 63 61 63  ..read_ret = cac
ea10: 6b 65 79 5f 72 65 61 64 5f 62 75 66 66 65 72 28  key_read_buffer(
ea20: 73 6c 6f 74 2c 20 74 6c 65 6e 5f 62 75 66 2c 20  slot, tlen_buf, 
ea30: 73 69 7a 65 6f 66 28 74 6c 65 6e 5f 62 75 66 29  sizeof(tlen_buf)
ea40: 2c 20 31 2c 20 6f 66 66 73 65 74 5f 74 29 3b 0a  , 1, offset_t);.
ea50: 09 69 66 20 28 72 65 61 64 5f 72 65 74 20 21 3d  .if (read_ret !=
ea60: 20 73 69 7a 65 6f 66 28 74 6c 65 6e 5f 62 75 66   sizeof(tlen_buf
ea70: 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  )) {...CACKEY_DE
ea80: 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 61 64  BUG_PRINTF("Read
ea90: 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 69   failed, returni
eaa0: 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b  ng in failure");
eab0: 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29  ....return(NULL)
eac0: 3b 0a 09 7d 0a 0a 09 74 6c 65 6e 20 3d 20 28 74  ;..}...tlen = (t
ead0: 6c 65 6e 5f 62 75 66 5b 31 5d 20 3c 3c 20 38 29  len_buf[1] << 8)
eae0: 20 7c 20 74 6c 65 6e 5f 62 75 66 5b 30 5d 3b 0a   | tlen_buf[0];.
eaf0: 0a 09 72 65 61 64 5f 72 65 74 20 3d 20 63 61 63  ..read_ret = cac
eb00: 6b 65 79 5f 72 65 61 64 5f 62 75 66 66 65 72 28  key_read_buffer(
eb10: 73 6c 6f 74 2c 20 76 6c 65 6e 5f 62 75 66 2c 20  slot, vlen_buf, 
eb20: 73 69 7a 65 6f 66 28 76 6c 65 6e 5f 62 75 66 29  sizeof(vlen_buf)
eb30: 2c 20 32 2c 20 6f 66 66 73 65 74 5f 76 29 3b 0a  , 2, offset_v);.
eb40: 09 69 66 20 28 72 65 61 64 5f 72 65 74 20 21 3d  .if (read_ret !=
eb50: 20 73 69 7a 65 6f 66 28 76 6c 65 6e 5f 62 75 66   sizeof(vlen_buf
eb60: 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  )) {...CACKEY_DE
eb70: 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 61 64  BUG_PRINTF("Read
eb80: 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 69   failed, returni
eb90: 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b  ng in failure");
eba0: 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29  ....return(NULL)
ebb0: 3b 0a 09 7d 0a 0a 09 76 6c 65 6e 20 3d 20 28 76  ;..}...vlen = (v
ebc0: 6c 65 6e 5f 62 75 66 5b 31 5d 20 3c 3c 20 38 29  len_buf[1] << 8)
ebd0: 20 7c 20 76 6c 65 6e 5f 62 75 66 5b 30 5d 3b 0a   | vlen_buf[0];.
ebe0: 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
ebf0: 52 49 4e 54 46 28 22 54 61 67 20 4c 65 6e 67 74  RINTF("Tag Lengt
ec00: 68 20 3d 20 25 6c 75 2c 20 56 61 6c 75 65 20 4c  h = %lu, Value L
ec10: 65 6e 67 74 68 20 3d 20 25 6c 75 22 2c 20 28 75  ength = %lu", (u
ec20: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 74 6c  nsigned long) tl
ec30: 65 6e 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  en, (unsigned lo
ec40: 6e 67 29 20 76 6c 65 6e 29 3b 0a 0a 09 6f 66 66  ng) vlen);...off
ec50: 73 65 74 5f 74 20 2b 3d 20 32 3b 0a 09 6f 66 66  set_t += 2;..off
ec60: 73 65 74 5f 76 20 2b 3d 20 32 3b 0a 0a 09 69 66  set_v += 2;...if
ec70: 20 28 74 6c 65 6e 20 3e 20 73 69 7a 65 6f 66 28   (tlen > sizeof(
ec80: 74 76 61 6c 5f 62 75 66 29 29 20 7b 0a 09 09 43  tval_buf)) {...C
ec90: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
eca0: 54 46 28 22 54 61 67 20 6c 65 6e 67 74 68 20 69  TF("Tag length i
ecb0: 73 20 74 6f 6f 20 6c 61 72 67 65 2c 20 72 65 74  s too large, ret
ecc0: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
ecd0: 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e  e");....return(N
ece0: 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 76  ULL);..}...if (v
ecf0: 6c 65 6e 20 3e 20 73 69 7a 65 6f 66 28 76 76 61  len > sizeof(vva
ed00: 6c 5f 62 75 66 29 29 20 7b 0a 09 09 43 41 43 4b  l_buf)) {...CACK
ed10: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
ed20: 22 56 61 6c 75 65 20 6c 65 6e 67 74 68 20 69 73  "Value length is
ed30: 20 74 6f 6f 20 6c 61 72 67 65 2c 20 72 65 74 75   too large, retu
ed40: 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65  rning in failure
ed50: 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55  ");....return(NU
ed60: 4c 4c 29 3b 0a 09 7d 0a 0a 09 72 65 61 64 5f 72  LL);..}...read_r
ed70: 65 74 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64  et = cackey_read
ed80: 5f 62 75 66 66 65 72 28 73 6c 6f 74 2c 20 74 76  _buffer(slot, tv
ed90: 61 6c 5f 62 75 66 2c 20 74 6c 65 6e 2c 20 31 2c  al_buf, tlen, 1,
eda0: 20 6f 66 66 73 65 74 5f 74 29 3b 0a 09 69 66 20   offset_t);..if 
edb0: 28 72 65 61 64 5f 72 65 74 20 21 3d 20 74 6c 65  (read_ret != tle
edc0: 6e 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  n) {...CACKEY_DE
edd0: 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62  BUG_PRINTF("Unab
ede0: 6c 65 20 74 6f 20 72 65 61 64 20 65 6e 74 69 72  le to read entir
edf0: 65 20 54 2d 62 75 66 66 65 72 2c 20 72 65 74 75  e T-buffer, retu
ee00: 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65  rning in failure
ee10: 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55  ");....return(NU
ee20: 4c 4c 29 3b 0a 09 7d 0a 0a 09 72 65 61 64 5f 72  LL);..}...read_r
ee30: 65 74 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64  et = cackey_read
ee40: 5f 62 75 66 66 65 72 28 73 6c 6f 74 2c 20 76 76  _buffer(slot, vv
ee50: 61 6c 5f 62 75 66 2c 20 76 6c 65 6e 2c 20 32 2c  al_buf, vlen, 2,
ee60: 20 6f 66 66 73 65 74 5f 76 29 3b 0a 09 69 66 20   offset_v);..if 
ee70: 28 72 65 61 64 5f 72 65 74 20 21 3d 20 76 6c 65  (read_ret != vle
ee80: 6e 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  n) {...CACKEY_DE
ee90: 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62  BUG_PRINTF("Unab
eea0: 6c 65 20 74 6f 20 72 65 61 64 20 65 6e 74 69 72  le to read entir
eeb0: 65 20 56 2d 62 75 66 66 65 72 2c 20 72 65 74 75  e V-buffer, retu
eec0: 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65  rning in failure
eed0: 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55  ");....return(NU
eee0: 4c 4c 29 3b 0a 09 7d 0a 0a 09 74 76 61 6c 20 3d  LL);..}...tval =
eef0: 20 74 76 61 6c 5f 62 75 66 3b 0a 09 76 76 61 6c   tval_buf;..vval
ef00: 20 3d 20 76 76 61 6c 5f 62 75 66 3b 0a 09 77 68   = vval_buf;..wh
ef10: 69 6c 65 20 28 74 6c 65 6e 20 3e 20 30 20 26 26  ile (tlen > 0 &&
ef20: 20 76 6c 65 6e 20 3e 20 30 29 20 7b 0a 09 09 74   vlen > 0) {...t
ef30: 61 67 20 3d 20 2a 74 76 61 6c 3b 0a 09 09 74 76  ag = *tval;...tv
ef40: 61 6c 2b 2b 3b 0a 09 09 74 6c 65 6e 2d 2d 3b 0a  al++;...tlen--;.
ef50: 0a 09 09 69 66 20 28 2a 74 76 61 6c 20 3d 3d 20  ...if (*tval == 
ef60: 30 78 66 66 29 20 7b 0a 09 09 09 6c 65 6e 67 74  0xff) {....lengt
ef70: 68 20 3d 20 28 74 76 61 6c 5b 32 5d 20 3c 3c 20  h = (tval[2] << 
ef80: 38 29 20 7c 20 74 76 61 6c 5b 31 5d 3b 0a 09 09  8) | tval[1];...
ef90: 09 74 76 61 6c 20 2b 3d 20 33 3b 0a 09 09 09 74  .tval += 3;....t
efa0: 6c 65 6e 20 2d 3d 20 33 3b 0a 09 09 7d 20 65 6c  len -= 3;...} el
efb0: 73 65 20 7b 0a 09 09 09 6c 65 6e 67 74 68 20 3d  se {....length =
efc0: 20 2a 74 76 61 6c 3b 0a 09 09 09 74 76 61 6c 2b   *tval;....tval+
efd0: 2b 3b 0a 09 09 09 74 6c 65 6e 2d 2d 3b 0a 09 09  +;....tlen--;...
efe0: 7d 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  }....CACKEY_DEBU
eff0: 47 5f 50 52 49 4e 54 46 28 22 54 61 67 3a 20 25  G_PRINTF("Tag: %
f000: 73 20 28 25 30 32 78 29 22 2c 20 43 41 43 4b 45  s (%02x)", CACKE
f010: 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 54 41 47  Y_DEBUG_FUNC_TAG
f020: 5f 54 4f 5f 53 54 52 28 74 61 67 29 2c 20 28 75  _TO_STR(tag), (u
f030: 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 74 61 67  nsigned int) tag
f040: 29 3b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  );...CACKEY_DEBU
f050: 47 5f 50 52 49 4e 54 42 55 46 28 22 56 61 6c 75  G_PRINTBUF("Valu
f060: 65 3a 22 2c 20 76 76 61 6c 2c 20 6c 65 6e 67 74  e:", vval, lengt
f070: 68 29 3b 0a 0a 09 09 63 75 72 72 5f 65 6e 74 69  h);....curr_enti
f080: 74 79 20 3d 20 4e 55 4c 4c 3b 0a 09 09 73 77 69  ty = NULL;...swi
f090: 74 63 68 20 28 74 61 67 29 20 7b 0a 09 09 09 63  tch (tag) {....c
f0a0: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43 41  ase GSCIS_TAG_CA
f0b0: 52 44 55 52 4c 3a 0a 09 09 09 09 63 75 72 72 5f  RDURL:.....curr_
f0c0: 65 6e 74 69 74 79 20 3d 20 6d 61 6c 6c 6f 63 28  entity = malloc(
f0d0: 73 69 7a 65 6f 66 28 2a 63 75 72 72 5f 65 6e 74  sizeof(*curr_ent
f0e0: 69 74 79 29 29 3b 0a 09 09 09 09 63 75 72 72 5f  ity));.....curr_
f0f0: 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65 5f 63 61  entity->value_ca
f100: 72 64 75 72 6c 20 3d 20 6d 61 6c 6c 6f 63 28 73  rdurl = malloc(s
f110: 69 7a 65 6f 66 28 2a 63 75 72 72 5f 65 6e 74 69  izeof(*curr_enti
f120: 74 79 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72  ty->value_cardur
f130: 6c 29 29 3b 0a 0a 09 09 09 09 6d 65 6d 63 70 79  l));......memcpy
f140: 28 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61  (curr_entity->va
f150: 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 72 69 64  lue_cardurl->rid
f160: 2c 20 76 76 61 6c 2c 20 35 29 3b 0a 09 09 09 09  , vval, 5);.....
f170: 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c  curr_entity->val
f180: 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70 74  ue_cardurl->appt
f190: 79 70 65 20 3d 20 76 76 61 6c 5b 35 5d 3b 0a 09  ype = vval[5];..
f1a0: 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e  ...curr_entity->
f1b0: 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 6f  value_cardurl->o
f1c0: 62 6a 65 63 74 69 64 20 3d 20 28 76 76 61 6c 5b  bjectid = (vval[
f1d0: 36 5d 20 3c 3c 20 38 29 20 7c 20 76 76 61 6c 5b  6] << 8) | vval[
f1e0: 37 5d 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74  7];.....curr_ent
f1f0: 69 74 79 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75  ity->value_cardu
f200: 72 6c 2d 3e 61 70 70 69 64 20 3d 20 28 76 76 61  rl->appid = (vva
f210: 6c 5b 38 5d 20 3c 3c 20 38 29 20 7c 20 76 76 61  l[8] << 8) | vva
f220: 6c 5b 39 5d 3b 0a 0a 09 09 09 09 63 75 72 72 5f  l[9];......curr_
f230: 65 6e 74 69 74 79 2d 3e 74 61 67 20 3d 20 74 61  entity->tag = ta
f240: 67 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69  g;.....curr_enti
f250: 74 79 2d 3e 5f 6e 65 78 74 20 3d 20 4e 55 4c 4c  ty->_next = NULL
f260: 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  ;......break;...
f270: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
f280: 41 43 52 5f 54 41 42 4c 45 3a 0a 09 09 09 09 63  ACR_TABLE:.....c
f290: 75 72 72 5f 65 6e 74 69 74 79 20 3d 20 6d 61 6c  urr_entity = mal
f2a0: 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63 75 72 72  loc(sizeof(*curr
f2b0: 5f 65 6e 74 69 74 79 29 29 3b 0a 09 09 09 09 74  _entity));.....t
f2c0: 6d 70 62 75 66 20 3d 20 6d 61 6c 6c 6f 63 28 6c  mpbuf = malloc(l
f2d0: 65 6e 67 74 68 29 3b 0a 0a 09 09 09 09 6d 65 6d  ength);......mem
f2e0: 63 70 79 28 74 6d 70 62 75 66 2c 20 76 76 61 6c  cpy(tmpbuf, vval
f2f0: 2c 20 6c 65 6e 67 74 68 29 3b 0a 0a 09 09 09 09  , length);......
f300: 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 74 61 67  curr_entity->tag
f310: 20 3d 20 74 61 67 3b 0a 09 09 09 09 63 75 72 72   = tag;.....curr
f320: 5f 65 6e 74 69 74 79 2d 3e 6c 65 6e 67 74 68 20  _entity->length 
f330: 3d 20 6c 65 6e 67 74 68 3b 0a 09 09 09 09 63 75  = length;.....cu
f340: 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65  rr_entity->value
f350: 20 3d 20 74 6d 70 62 75 66 3b 0a 09 09 09 09 63   = tmpbuf;.....c
f360: 75 72 72 5f 65 6e 74 69 74 79 2d 3e 5f 6e 65 78  urr_entity->_nex
f370: 74 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09 62  t = NULL;......b
f380: 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 47 53  reak;....case GS
f390: 43 49 53 5f 54 41 47 5f 43 45 52 54 49 46 49 43  CIS_TAG_CERTIFIC
f3a0: 41 54 45 3a 0a 09 09 09 09 63 75 72 72 5f 65 6e  ATE:.....curr_en
f3b0: 74 69 74 79 20 3d 20 6d 61 6c 6c 6f 63 28 73 69  tity = malloc(si
f3c0: 7a 65 6f 66 28 2a 63 75 72 72 5f 65 6e 74 69 74  zeof(*curr_entit
f3d0: 79 29 29 3b 0a 0a 23 69 66 64 65 66 20 48 41 56  y));..#ifdef HAV
f3e0: 45 5f 4c 49 42 5a 0a 09 09 09 09 74 6d 70 62 75  E_LIBZ.....tmpbu
f3f0: 66 6c 65 6e 20 3d 20 6c 65 6e 67 74 68 20 2a 20  flen = length * 
f400: 32 3b 0a 09 09 09 09 74 6d 70 62 75 66 20 3d 20  2;.....tmpbuf = 
f410: 6d 61 6c 6c 6f 63 28 74 6d 70 62 75 66 6c 65 6e  malloc(tmpbuflen
f420: 29 3b 0a 0a 09 09 09 09 75 6e 63 6f 6d 70 72 65  );......uncompre
f430: 73 73 5f 72 65 74 20 3d 20 75 6e 63 6f 6d 70 72  ss_ret = uncompr
f440: 65 73 73 28 74 6d 70 62 75 66 2c 20 26 74 6d 70  ess(tmpbuf, &tmp
f450: 62 75 66 6c 65 6e 2c 20 76 76 61 6c 2c 20 6c 65  buflen, vval, le
f460: 6e 67 74 68 29 3b 0a 09 09 09 09 69 66 20 28 75  ngth);.....if (u
f470: 6e 63 6f 6d 70 72 65 73 73 5f 72 65 74 20 21 3d  ncompress_ret !=
f480: 20 5a 5f 4f 4b 29 20 7b 0a 09 09 09 09 09 43 41   Z_OK) {......CA
f490: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
f4a0: 46 28 22 46 61 69 6c 65 64 20 74 6f 20 64 65 63  F("Failed to dec
f4b0: 6f 6d 70 72 65 73 73 2c 20 75 6e 63 6f 6d 70 72  ompress, uncompr
f4c0: 65 73 73 28 29 20 72 65 74 75 72 6e 65 64 20 25  ess() returned %
f4d0: 69 20 2d 2d 20 72 65 73 6f 72 74 69 6e 67 20 74  i -- resorting t
f4e0: 6f 20 64 69 72 65 63 74 20 63 6f 70 79 22 2c 20  o direct copy", 
f4f0: 75 6e 63 6f 6d 70 72 65 73 73 5f 72 65 74 29 3b  uncompress_ret);
f500: 0a 0a 09 09 09 09 09 74 6d 70 62 75 66 6c 65 6e  .......tmpbuflen
f510: 20 3d 20 6c 65 6e 67 74 68 3b 0a 09 09 09 09 09   = length;......
f520: 6d 65 6d 63 70 79 28 74 6d 70 62 75 66 2c 20 76  memcpy(tmpbuf, v
f530: 76 61 6c 2c 20 6c 65 6e 67 74 68 29 3b 0a 09 09  val, length);...
f540: 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f  ..}......CACKEY_
f550: 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22  DEBUG_PRINTBUF("
f560: 44 65 63 6f 6d 70 72 65 73 73 65 64 20 74 6f 3a  Decompressed to:
f570: 22 2c 20 74 6d 70 62 75 66 2c 20 74 6d 70 62 75  ", tmpbuf, tmpbu
f580: 66 6c 65 6e 29 3b 0a 23 65 6c 73 65 0a 09 09 09  flen);.#else....
f590: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
f5a0: 49 4e 54 46 28 22 4d 69 73 73 69 6e 67 20 5a 4c  INTF("Missing ZL
f5b0: 49 42 20 53 75 70 70 6f 72 74 2c 20 74 68 69 73  IB Support, this
f5c0: 20 63 65 72 74 69 66 69 63 61 74 65 20 69 73 20   certificate is 
f5d0: 6c 69 6b 65 6c 79 20 75 73 65 6c 65 73 73 2e 2e  likely useless..
f5e0: 2e 22 29 3b 0a 0a 09 09 09 09 74 6d 70 62 75 66  .");......tmpbuf
f5f0: 6c 65 6e 20 3d 20 6c 65 6e 67 74 68 3b 0a 09 09  len = length;...
f600: 09 09 6d 65 6d 63 70 79 28 74 6d 70 62 75 66 2c  ..memcpy(tmpbuf,
f610: 20 76 76 61 6c 2c 20 6c 65 6e 67 74 68 29 3b 0a   vval, length);.
f620: 23 65 6e 64 69 66 0a 0a 09 09 09 09 63 75 72 72  #endif......curr
f630: 5f 65 6e 74 69 74 79 2d 3e 74 61 67 20 3d 20 74  _entity->tag = t
f640: 61 67 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74  ag;.....curr_ent
f650: 69 74 79 2d 3e 6c 65 6e 67 74 68 20 3d 20 74 6d  ity->length = tm
f660: 70 62 75 66 6c 65 6e 3b 0a 09 09 09 09 63 75 72  pbuflen;.....cur
f670: 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65 20  r_entity->value 
f680: 3d 20 74 6d 70 62 75 66 3b 0a 09 09 09 09 63 75  = tmpbuf;.....cu
f690: 72 72 5f 65 6e 74 69 74 79 2d 3e 5f 6e 65 78 74  rr_entity->_next
f6a0: 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09 62 72   = NULL;......br
f6b0: 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 47 53 43  eak;....case GSC
f6c0: 49 53 5f 54 41 47 5f 50 4b 43 53 31 35 3a 0a 09  IS_TAG_PKCS15:..
f6d0: 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 20 3d  ...curr_entity =
f6e0: 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a   malloc(sizeof(*
f6f0: 63 75 72 72 5f 65 6e 74 69 74 79 29 29 3b 0a 0a  curr_entity));..
f700: 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d  ....curr_entity-
f710: 3e 74 61 67 20 3d 20 74 61 67 3b 0a 09 09 09 09  >tag = tag;.....
f720: 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c  curr_entity->val
f730: 75 65 5f 62 79 74 65 20 3d 20 76 76 61 6c 5b 30  ue_byte = vval[0
f740: 5d 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69  ];.....curr_enti
f750: 74 79 2d 3e 5f 6e 65 78 74 20 3d 20 4e 55 4c 4c  ty->_next = NULL
f760: 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  ;......break;...
f770: 7d 0a 0a 09 09 76 76 61 6c 20 2b 3d 20 6c 65 6e  }....vval += len
f780: 67 74 68 3b 0a 09 09 76 6c 65 6e 20 2d 3d 20 6c  gth;...vlen -= l
f790: 65 6e 67 74 68 3b 0a 0a 09 09 69 66 20 28 63 75  ength;....if (cu
f7a0: 72 72 5f 65 6e 74 69 74 79 20 21 3d 20 4e 55 4c  rr_entity != NUL
f7b0: 4c 29 20 7b 0a 09 09 09 69 66 20 28 72 6f 6f 74  L) {....if (root
f7c0: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09   == NULL) {.....
f7d0: 72 6f 6f 74 20 3d 20 63 75 72 72 5f 65 6e 74 69  root = curr_enti
f7e0: 74 79 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20  ty;....}.....if 
f7f0: 28 6c 61 73 74 20 21 3d 20 4e 55 4c 4c 29 20 7b  (last != NULL) {
f800: 0a 09 09 09 09 6c 61 73 74 2d 3e 5f 6e 65 78 74  .....last->_next
f810: 20 3d 20 63 75 72 72 5f 65 6e 74 69 74 79 3b 0a   = curr_entity;.
f820: 09 09 09 7d 0a 0a 09 09 09 6c 61 73 74 20 3d 20  ...}.....last = 
f830: 63 75 72 72 5f 65 6e 74 69 74 79 3b 0a 09 09 7d  curr_entity;...}
f840: 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 72 6f 6f  ..}...return(roo
f850: 74 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e  t);.}../*. * SYN
f860: 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 2e 2e 2e  POSIS. *     ...
f870: 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53  . *. * ARGUMENTS
f880: 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20  . *     .... *. 
f890: 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20  * RETURN VALUE. 
f8a0: 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20  *     .... *. * 
f8b0: 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 2e 2e 2e  NOTES. *     ...
f8c0: 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76  . *. */.static v
f8d0: 6f 69 64 20 63 61 63 6b 65 79 5f 66 72 65 65 5f  oid cackey_free_
f8e0: 63 65 72 74 73 28 73 74 72 75 63 74 20 63 61 63  certs(struct cac
f8f0: 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74  key_pcsc_identit
f900: 79 20 2a 73 74 61 72 74 2c 20 73 69 7a 65 5f 74  y *start, size_t
f910: 20 63 6f 75 6e 74 2c 20 69 6e 74 20 66 72 65 65   count, int free
f920: 5f 73 74 61 72 74 29 20 7b 0a 09 73 69 7a 65 5f  _start) {..size_
f930: 74 20 69 64 78 3b 0a 0a 09 69 66 20 28 73 74 61  t idx;...if (sta
f940: 72 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  rt == NULL) {...
f950: 72 65 74 75 72 6e 3b 0a 09 7d 0a 0a 09 66 6f 72  return;..}...for
f960: 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c   (idx = 0; idx <
f970: 20 63 6f 75 6e 74 3b 20 69 64 78 2b 2b 29 20 7b   count; idx++) {
f980: 0a 09 09 69 66 20 28 73 74 61 72 74 5b 69 64 78  ...if (start[idx
f990: 5d 2e 63 65 72 74 69 66 69 63 61 74 65 29 20 7b  ].certificate) {
f9a0: 0a 09 09 09 66 72 65 65 28 73 74 61 72 74 5b 69  ....free(start[i
f9b0: 64 78 5d 2e 63 65 72 74 69 66 69 63 61 74 65 29  dx].certificate)
f9c0: 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28 66  ;...}..}...if (f
f9d0: 72 65 65 5f 73 74 61 72 74 29 20 7b 0a 09 09 66  ree_start) {...f
f9e0: 72 65 65 28 73 74 61 72 74 29 3b 0a 09 7d 0a 0a  ree(start);..}..
f9f0: 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a 73 74 61 74  .return;.}..stat
fa00: 69 63 20 73 74 72 75 63 74 20 63 61 63 6b 65 79  ic struct cackey
fa10: 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a  _pcsc_identity *
fa20: 63 61 63 6b 65 79 5f 63 6f 70 79 5f 63 65 72 74  cackey_copy_cert
fa30: 73 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  s(struct cackey_
fa40: 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 64  pcsc_identity *d
fa50: 65 73 74 2c 20 73 74 72 75 63 74 20 63 61 63 6b  est, struct cack
fa60: 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79  ey_pcsc_identity
fa70: 20 2a 73 74 61 72 74 2c 20 73 69 7a 65 5f 74 20   *start, size_t 
fa80: 63 6f 75 6e 74 29 20 7b 0a 09 73 69 7a 65 5f 74  count) {..size_t
fa90: 20 69 64 78 3b 0a 0a 09 69 66 20 28 73 74 61 72   idx;...if (star
faa0: 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72  t == NULL) {...r
fab0: 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a  eturn(NULL);..}.
fac0: 0a 09 69 66 20 28 64 65 73 74 20 3d 3d 20 4e 55  ..if (dest == NU
fad0: 4c 4c 29 20 7b 0a 09 09 64 65 73 74 20 3d 20 6d  LL) {...dest = m
fae0: 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 64 65  alloc(sizeof(*de
faf0: 73 74 29 20 2a 20 63 6f 75 6e 74 29 3b 0a 09 7d  st) * count);..}
fb00: 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b  ...for (idx = 0;
fb10: 20 69 64 78 20 3c 20 63 6f 75 6e 74 3b 20 69 64   idx < count; id
fb20: 78 2b 2b 29 20 7b 0a 09 09 64 65 73 74 5b 69 64  x++) {...dest[id
fb30: 78 5d 2e 69 64 5f 74 79 70 65 20 3d 20 73 74 61  x].id_type = sta
fb40: 72 74 5b 69 64 78 5d 2e 69 64 5f 74 79 70 65 3b  rt[idx].id_type;
fb50: 0a 0a 09 09 73 77 69 74 63 68 20 28 64 65 73 74  ....switch (dest
fb60: 5b 69 64 78 5d 2e 69 64 5f 74 79 70 65 29 20 7b  [idx].id_type) {
fb70: 0a 09 09 09 63 61 73 65 20 43 41 43 4b 45 59 5f  ....case CACKEY_
fb80: 49 44 5f 54 59 50 45 5f 43 41 43 3a 0a 09 09 09  ID_TYPE_CAC:....
fb90: 09 6d 65 6d 63 70 79 28 64 65 73 74 5b 69 64 78  .memcpy(dest[idx
fba0: 5d 2e 63 61 72 64 2e 63 61 63 2e 61 70 70 6c 65  ].card.cac.apple
fbb0: 74 2c 20 73 74 61 72 74 5b 69 64 78 5d 2e 63 61  t, start[idx].ca
fbc0: 72 64 2e 63 61 63 2e 61 70 70 6c 65 74 2c 20 73  rd.cac.applet, s
fbd0: 69 7a 65 6f 66 28 64 65 73 74 5b 69 64 78 5d 2e  izeof(dest[idx].
fbe0: 63 61 72 64 2e 63 61 63 2e 61 70 70 6c 65 74 29  card.cac.applet)
fbf0: 29 3b 0a 09 09 09 09 64 65 73 74 5b 69 64 78 5d  );.....dest[idx]
fc00: 2e 63 61 72 64 2e 63 61 63 2e 66 69 6c 65 20 3d  .card.cac.file =
fc10: 20 73 74 61 72 74 5b 69 64 78 5d 2e 63 61 72 64   start[idx].card
fc20: 2e 63 61 63 2e 66 69 6c 65 3b 0a 09 09 09 09 62  .cac.file;.....b
fc30: 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 41  reak;....case CA
fc40: 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 50 49 56  CKEY_ID_TYPE_PIV
fc50: 3a 0a 09 09 09 09 64 65 73 74 5b 69 64 78 5d 2e  :.....dest[idx].
fc60: 63 61 72 64 2e 70 69 76 2e 6b 65 79 5f 69 64 20  card.piv.key_id 
fc70: 3d 20 73 74 61 72 74 5b 69 64 78 5d 2e 63 61 72  = start[idx].car
fc80: 64 2e 70 69 76 2e 6b 65 79 5f 69 64 3b 0a 09 09  d.piv.key_id;...
fc90: 09 09 6d 65 6d 63 70 79 28 64 65 73 74 5b 69 64  ..memcpy(dest[id
fca0: 78 5d 2e 63 61 72 64 2e 70 69 76 2e 6c 61 62 65  x].card.piv.labe
fcb0: 6c 2c 20 73 74 61 72 74 5b 69 64 78 5d 2e 63 61  l, start[idx].ca
fcc0: 72 64 2e 70 69 76 2e 6c 61 62 65 6c 2c 20 73 69  rd.piv.label, si
fcd0: 7a 65 6f 66 28 64 65 73 74 5b 69 64 78 5d 2e 63  zeof(dest[idx].c
fce0: 61 72 64 2e 70 69 76 2e 6c 61 62 65 6c 29 29 3b  ard.piv.label));
fcf0: 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
fd00: 61 73 65 20 43 41 43 4b 45 59 5f 49 44 5f 54 59  ase CACKEY_ID_TY
fd10: 50 45 5f 43 45 52 54 5f 4f 4e 4c 59 3a 0a 09 09  PE_CERT_ONLY:...
fd20: 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 09 09 64  ..break;...}...d
fd30: 65 73 74 5b 69 64 78 5d 2e 63 65 72 74 69 66 69  est[idx].certifi
fd40: 63 61 74 65 5f 6c 65 6e 20 3d 20 73 74 61 72 74  cate_len = start
fd50: 5b 69 64 78 5d 2e 63 65 72 74 69 66 69 63 61 74  [idx].certificat
fd60: 65 5f 6c 65 6e 3b 0a 09 09 64 65 73 74 5b 69 64  e_len;...dest[id
fd70: 78 5d 2e 6b 65 79 73 69 7a 65 20 3d 20 73 74 61  x].keysize = sta
fd80: 72 74 5b 69 64 78 5d 2e 6b 65 79 73 69 7a 65 3b  rt[idx].keysize;
fd90: 0a 0a 09 09 64 65 73 74 5b 69 64 78 5d 2e 63 65  ....dest[idx].ce
fda0: 72 74 69 66 69 63 61 74 65 20 3d 20 6d 61 6c 6c  rtificate = mall
fdb0: 6f 63 28 64 65 73 74 5b 69 64 78 5d 2e 63 65 72  oc(dest[idx].cer
fdc0: 74 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a 09  tificate_len);..
fdd0: 09 6d 65 6d 63 70 79 28 64 65 73 74 5b 69 64 78  .memcpy(dest[idx
fde0: 5d 2e 63 65 72 74 69 66 69 63 61 74 65 2c 20 73  ].certificate, s
fdf0: 74 61 72 74 5b 69 64 78 5d 2e 63 65 72 74 69 66  tart[idx].certif
fe00: 69 63 61 74 65 2c 20 64 65 73 74 5b 69 64 78 5d  icate, dest[idx]
fe10: 2e 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e  .certificate_len
fe20: 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 64  );..}...return(d
fe30: 65 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53  est);.}../*. * S
fe40: 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 2e  YNPOSIS. *     .
fe50: 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e  ... *. * ARGUMEN
fe60: 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a  TS. *     .... *
fe70: 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45  . * RETURN VALUE
fe80: 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20  . *     .... *. 
fe90: 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 2e  * NOTES. *     .
fea0: 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63  ... *. */.static
feb0: 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70   struct cackey_p
fec0: 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 63 61  csc_identity *ca
fed0: 63 6b 65 79 5f 72 65 61 64 5f 63 65 72 74 73 28  ckey_read_certs(
fee0: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c  struct cackey_sl
fef0: 6f 74 20 2a 73 6c 6f 74 2c 20 73 74 72 75 63 74  ot *slot, struct
ff00: 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65   cackey_pcsc_ide
ff10: 6e 74 69 74 79 20 2a 63 65 72 74 73 2c 20 75 6e  ntity *certs, un
ff20: 73 69 67 6e 65 64 20 6c 6f 6e 67 20 2a 63 6f 75  signed long *cou
ff30: 6e 74 29 20 7b 0a 09 73 74 72 75 63 74 20 63 61  nt) {..struct ca
ff40: 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69  ckey_pcsc_identi
ff50: 74 79 20 2a 63 75 72 72 5f 69 64 3b 0a 09 73 74  ty *curr_id;..st
ff60: 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f  ruct cackey_tlv_
ff70: 65 6e 74 69 74 79 20 2a 63 63 63 5f 74 6c 76 2c  entity *ccc_tlv,
ff80: 20 2a 63 63 63 5f 63 75 72 72 2c 20 2a 61 70 70   *ccc_curr, *app
ff90: 5f 74 6c 76 2c 20 2a 61 70 70 5f 63 75 72 72 3b  _tlv, *app_curr;
ffa0: 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  ..unsigned char 
ffb0: 63 63 63 5f 61 69 64 5b 5d 20 3d 20 7b 47 53 43  ccc_aid[] = {GSC
ffc0: 49 53 5f 41 49 44 5f 43 43 43 7d 2c 20 70 69 76  IS_AID_CCC}, piv
ffd0: 5f 61 69 64 5b 5d 20 3d 20 7b 4e 49 53 54 53 50  _aid[] = {NISTSP
ffe0: 38 30 30 5f 37 33 5f 33 5f 50 49 56 5f 41 49 44  800_73_3_PIV_AID
fff0: 7d 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61  };..unsigned cha
10000 72 20 2a 70 69 76 5f 6f 69 64 2c 20 70 69 76 5f  r *piv_oid, piv_
10010 6f 69 64 5f 70 69 76 61 75 74 68 5b 5d 20 3d 20  oid_pivauth[] = 
10020 7b 4e 49 53 54 53 50 38 30 30 5f 37 33 5f 33 5f  {NISTSP800_73_3_
10030 4f 49 44 5f 50 49 56 41 55 54 48 7d 2c 20 70 69  OID_PIVAUTH}, pi
10040 76 5f 6f 69 64 5f 73 69 67 6e 61 74 75 72 65 5b  v_oid_signature[
10050 5d 20 3d 20 7b 4e 49 53 54 53 50 38 30 30 5f 37  ] = {NISTSP800_7
10060 33 5f 33 5f 4f 49 44 5f 53 49 47 4e 41 54 55 52  3_3_OID_SIGNATUR
10070 45 7d 2c 20 70 69 76 5f 6f 69 64 5f 6b 65 79 6d  E}, piv_oid_keym
10080 67 74 5b 5d 20 3d 20 7b 4e 49 53 54 53 50 38 30  gt[] = {NISTSP80
10090 30 5f 37 33 5f 33 5f 4f 49 44 5f 4b 45 59 4d 47  0_73_3_OID_KEYMG
100a0 54 7d 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68  T};..unsigned ch
100b0 61 72 20 63 75 72 72 5f 61 69 64 5b 37 5d 3b 0a  ar curr_aid[7];.
100c0 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 62  .unsigned char b
100d0 75 66 66 65 72 5b 38 31 39 32 5d 2c 20 2a 62 75  uffer[8192], *bu
100e0 66 66 65 72 5f 70 2c 20 2a 74 6d 70 62 75 66 3b  ffer_p, *tmpbuf;
100f0 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  ..unsigned long 
10100 6f 75 74 69 64 78 20 3d 20 30 3b 0a 09 63 68 61  outidx = 0;..cha
10110 72 20 2a 70 69 76 5f 6c 61 62 65 6c 3b 0a 09 63  r *piv_label;..c
10120 61 63 6b 65 79 5f 72 65 74 20 74 72 61 6e 73 61  ackey_ret transa
10130 63 74 69 6f 6e 5f 72 65 74 3b 0a 09 73 73 69 7a  ction_ret;..ssiz
10140 65 5f 74 20 72 65 61 64 5f 72 65 74 3b 0a 09 73  e_t read_ret;..s
10150 69 7a 65 5f 74 20 62 75 66 66 65 72 5f 6c 65 6e  ize_t buffer_len
10160 2c 20 74 6d 70 62 75 66 6c 65 6e 3b 0a 09 69 6e  , tmpbuflen;..in
10170 74 20 63 65 72 74 73 5f 72 65 73 69 7a 61 62 6c  t certs_resizabl
10180 65 3b 0a 09 69 6e 74 20 73 65 6e 64 5f 72 65 74  e;..int send_ret
10190 2c 20 73 65 6c 65 63 74 5f 72 65 74 3b 0a 09 69  , select_ret;..i
101a0 6e 74 20 70 69 76 5f 6b 65 79 2c 20 70 69 76 20  nt piv_key, piv 
101b0 3d 20 30 3b 0a 09 69 6e 74 20 69 64 78 3b 0a 23  = 0;..int idx;.#
101c0 69 66 64 65 66 20 48 41 56 45 5f 4c 49 42 5a 0a  ifdef HAVE_LIBZ.
101d0 09 69 6e 74 20 75 6e 63 6f 6d 70 72 65 73 73 5f  .int uncompress_
101e0 72 65 74 3b 0a 09 7a 5f 73 74 72 65 61 6d 20 67  ret;..z_stream g
101f0 7a 69 70 5f 73 74 72 65 61 6d 3b 0a 23 65 6e 64  zip_stream;.#end
10200 69 66 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  if...CACKEY_DEBU
10210 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
10220 2e 22 29 3b 0a 0a 09 69 66 20 28 63 6f 75 6e 74  .");...if (count
10230 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
10240 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
10250 46 28 22 63 6f 75 6e 74 20 69 73 20 4e 55 4c 4c  F("count is NULL
10260 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66  , returning in f
10270 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74  ailure");....ret
10280 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09  urn(NULL);..}...
10290 69 66 20 28 63 65 72 74 73 20 21 3d 20 4e 55 4c  if (certs != NUL
102a0 4c 29 20 7b 0a 09 09 69 66 20 28 2a 63 6f 75 6e  L) {...if (*coun
102b0 74 20 3d 3d 20 30 29 20 7b 0a 09 09 09 43 41 43  t == 0) {....CAC
102c0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
102d0 28 22 52 65 71 75 65 73 74 65 64 20 77 65 20 72  ("Requested we r
102e0 65 74 75 72 6e 20 30 20 6f 62 6a 65 63 74 73 2c  eturn 0 objects,
102f0 20 73 68 6f 72 74 2d 63 69 72 63 75 69 74 22 29   short-circuit")
10300 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 63 65 72  ;.....return(cer
10310 74 73 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66  ts);...}..}...if
10320 20 28 21 73 6c 6f 74 2d 3e 73 6c 6f 74 5f 72 65   (!slot->slot_re
10330 73 65 74 29 20 7b 0a 09 09 69 66 20 28 73 6c 6f  set) {...if (slo
10340 74 2d 3e 63 61 63 68 65 64 5f 63 65 72 74 73 29  t->cached_certs)
10350 20 7b 0a 09 09 09 69 66 20 28 63 65 72 74 73 20   {....if (certs 
10360 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 63  == NULL) {.....c
10370 65 72 74 73 20 3d 20 6d 61 6c 6c 6f 63 28 73 69  erts = malloc(si
10380 7a 65 6f 66 28 2a 63 65 72 74 73 29 20 2a 20 73  zeof(*certs) * s
10390 6c 6f 74 2d 3e 63 61 63 68 65 64 5f 63 65 72 74  lot->cached_cert
103a0 73 5f 63 6f 75 6e 74 29 3b 0a 09 09 09 09 2a 63  s_count);.....*c
103b0 6f 75 6e 74 20 3d 20 73 6c 6f 74 2d 3e 63 61 63  ount = slot->cac
103c0 68 65 64 5f 63 65 72 74 73 5f 63 6f 75 6e 74 3b  hed_certs_count;
103d0 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ....} else {....
103e0 09 69 66 20 28 2a 63 6f 75 6e 74 20 3e 20 73 6c  .if (*count > sl
103f0 6f 74 2d 3e 63 61 63 68 65 64 5f 63 65 72 74 73  ot->cached_certs
10400 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 09 09 09 2a  _count) {......*
10410 63 6f 75 6e 74 20 3d 20 73 6c 6f 74 2d 3e 63 61  count = slot->ca
10420 63 68 65 64 5f 63 65 72 74 73 5f 63 6f 75 6e 74  ched_certs_count
10430 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09  ;.....}....}....
10440 09 63 61 63 6b 65 79 5f 63 6f 70 79 5f 63 65 72  .cackey_copy_cer
10450 74 73 28 63 65 72 74 73 2c 20 73 6c 6f 74 2d 3e  ts(certs, slot->
10460 63 61 63 68 65 64 5f 63 65 72 74 73 2c 20 2a 63  cached_certs, *c
10470 6f 75 6e 74 29 3b 0a 0a 09 09 09 72 65 74 75 72  ount);.....retur
10480 6e 28 63 65 72 74 73 29 3b 0a 09 09 7d 0a 09 7d  n(certs);...}..}
10490 0a 0a 09 69 66 20 28 73 6c 6f 74 2d 3e 63 61 63  ...if (slot->cac
104a0 68 65 64 5f 63 65 72 74 73 29 20 7b 0a 09 09 63  hed_certs) {...c
104b0 61 63 6b 65 79 5f 66 72 65 65 5f 63 65 72 74 73  ackey_free_certs
104c0 28 73 6c 6f 74 2d 3e 63 61 63 68 65 64 5f 63 65  (slot->cached_ce
104d0 72 74 73 2c 20 73 6c 6f 74 2d 3e 63 61 63 68 65  rts, slot->cache
104e0 64 5f 63 65 72 74 73 5f 63 6f 75 6e 74 2c 20 31  d_certs_count, 1
104f0 29 3b 0a 0a 09 09 73 6c 6f 74 2d 3e 63 61 63 68  );....slot->cach
10500 65 64 5f 63 65 72 74 73 20 3d 20 4e 55 4c 4c 3b  ed_certs = NULL;
10510 0a 09 7d 0a 0a 09 2f 2a 20 42 65 67 69 6e 20 61  ..}.../* Begin a
10520 20 53 6d 61 72 74 43 61 72 64 20 74 72 61 6e 73   SmartCard trans
10530 61 63 74 69 6f 6e 20 2a 2f 0a 09 74 72 61 6e 73  action */..trans
10540 61 63 74 69 6f 6e 5f 72 65 74 20 3d 20 63 61 63  action_ret = cac
10550 6b 65 79 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61  key_begin_transa
10560 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 09 69 66  ction(slot);..if
10570 20 28 74 72 61 6e 73 61 63 74 69 6f 6e 5f 72 65   (transaction_re
10580 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43  t != CACKEY_PCSC
10590 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45  _S_OK) {...CACKE
105a0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
105b0 55 6e 61 62 6c 65 20 62 65 67 69 6e 20 74 72 61  Unable begin tra
105c0 6e 73 61 63 74 69 6f 6e 2c 20 72 65 74 75 72 6e  nsaction, return
105d0 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29  ing in failure")
105e0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c  ;....return(NULL
105f0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 65 72 74  );..}...if (cert
10600 73 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 63  s == NULL) {...c
10610 65 72 74 73 20 3d 20 6d 61 6c 6c 6f 63 28 73 69  erts = malloc(si
10620 7a 65 6f 66 28 2a 63 65 72 74 73 29 20 2a 20 35  zeof(*certs) * 5
10630 29 3b 0a 09 09 2a 63 6f 75 6e 74 20 3d 20 35 3b  );...*count = 5;
10640 0a 09 09 63 65 72 74 73 5f 72 65 73 69 7a 61 62  ...certs_resizab
10650 6c 65 20 3d 20 31 3b 0a 09 7d 20 65 6c 73 65 20  le = 1;..} else 
10660 7b 0a 09 09 63 65 72 74 73 5f 72 65 73 69 7a 61  {...certs_resiza
10670 62 6c 65 20 3d 20 30 3b 0a 09 7d 0a 0a 09 2f 2a  ble = 0;..}.../*
10680 20 53 65 6c 65 63 74 20 74 68 65 20 43 43 43 20   Select the CCC 
10690 41 70 70 6c 65 74 20 2a 2f 0a 09 73 65 6e 64 5f  Applet */..send_
106a0 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6c  ret = cackey_sel
106b0 65 63 74 5f 61 70 70 6c 65 74 28 73 6c 6f 74 2c  ect_applet(slot,
106c0 20 63 63 63 5f 61 69 64 2c 20 73 69 7a 65 6f 66   ccc_aid, sizeof
106d0 28 63 63 63 5f 61 69 64 29 29 3b 0a 09 69 66 20  (ccc_aid));..if 
106e0 28 73 65 6e 64 5f 72 65 74 20 21 3d 20 43 41 43  (send_ret != CAC
106f0 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b  KEY_PCSC_S_OK) {
10700 0a 09 09 2f 2a 20 54 72 79 20 50 49 56 20 61 70  .../* Try PIV ap
10710 70 6c 69 63 61 74 69 6f 6e 20 2a 2f 0a 09 09 73  plication */...s
10720 65 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79  end_ret = cackey
10730 5f 73 65 6c 65 63 74 5f 61 70 70 6c 65 74 28 73  _select_applet(s
10740 6c 6f 74 2c 20 70 69 76 5f 61 69 64 2c 20 73 69  lot, piv_aid, si
10750 7a 65 6f 66 28 70 69 76 5f 61 69 64 29 29 3b 0a  zeof(piv_aid));.
10760 09 09 69 66 20 28 73 65 6e 64 5f 72 65 74 20 3d  ..if (send_ret =
10770 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  = CACKEY_PCSC_S_
10780 4f 4b 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  OK) {....CACKEY_
10790 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 57 65  DEBUG_PRINTF("We
107a0 20 68 61 76 65 20 61 20 50 49 56 20 63 61 72 64   have a PIV card
107b0 20 2d 2d 20 6e 6f 74 20 75 73 69 6e 67 20 74 68   -- not using th
107c0 65 20 43 43 43 2c 20 70 75 6c 6c 69 6e 67 20 70  e CCC, pulling p
107d0 72 65 2d 73 65 6c 65 63 74 65 64 20 6b 65 79 73  re-selected keys
107e0 22 29 3b 0a 0a 09 09 09 70 69 76 20 3d 20 31 3b  ");.....piv = 1;
107f0 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 43  ...} else {....C
10800 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
10810 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 73 65  TF("Unable to se
10820 6c 65 63 74 20 43 43 43 20 41 70 70 6c 65 74 2c  lect CCC Applet,
10830 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61   returning in fa
10840 69 6c 75 72 65 22 29 3b 0a 0a 09 09 09 2f 2a 20  ilure");...../* 
10850 54 65 72 6d 69 6e 61 74 65 20 53 6d 61 72 74 43  Terminate SmartC
10860 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20  ard Transaction 
10870 2a 2f 0a 09 09 09 63 61 63 6b 65 79 5f 65 6e 64  */....cackey_end
10880 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f  _transaction(slo
10890 74 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 4e  t);.....return(N
108a0 55 4c 4c 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69  ULL);...}..}...i
108b0 66 20 28 70 69 76 29 20 7b 0a 09 09 66 6f 72 20  f (piv) {...for 
108c0 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20  (idx = 0; idx < 
108d0 33 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 09 73  3; idx++) {....s
108e0 77 69 74 63 68 20 28 69 64 78 29 20 7b 0a 09 09  witch (idx) {...
108f0 09 09 63 61 73 65 20 30 3a 0a 09 09 09 09 09 70  ..case 0:......p
10900 69 76 5f 6f 69 64 20 3d 20 70 69 76 5f 6f 69 64  iv_oid = piv_oid
10910 5f 70 69 76 61 75 74 68 3b 0a 09 09 09 09 09 70  _pivauth;......p
10920 69 76 5f 6b 65 79 20 3d 20 4e 49 53 54 53 50 38  iv_key = NISTSP8
10930 30 30 5f 37 38 5f 33 5f 4b 45 59 5f 50 49 56 41  00_78_3_KEY_PIVA
10940 55 54 48 3b 0a 09 09 09 09 09 70 69 76 5f 6c 61  UTH;......piv_la
10950 62 65 6c 20 3d 20 22 41 75 74 68 65 6e 74 69 63  bel = "Authentic
10960 61 74 69 6f 6e 22 3b 0a 09 09 09 09 09 62 72 65  ation";......bre
10970 61 6b 3b 0a 09 09 09 09 63 61 73 65 20 31 3a 0a  ak;.....case 1:.
10980 09 09 09 09 09 70 69 76 5f 6f 69 64 20 3d 20 70  .....piv_oid = p
10990 69 76 5f 6f 69 64 5f 73 69 67 6e 61 74 75 72 65  iv_oid_signature
109a0 3b 0a 09 09 09 09 09 70 69 76 5f 6b 65 79 20 3d  ;......piv_key =
109b0 20 4e 49 53 54 53 50 38 30 30 5f 37 38 5f 33 5f   NISTSP800_78_3_
109c0 4b 45 59 5f 53 49 47 4e 41 54 55 52 45 3b 0a 09  KEY_SIGNATURE;..
109d0 09 09 09 09 70 69 76 5f 6c 61 62 65 6c 20 3d 20  ....piv_label = 
109e0 22 53 69 67 6e 61 74 75 72 65 22 3b 0a 09 09 09  "Signature";....
109f0 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 63 61 73  ..break;.....cas
10a00 65 20 32 3a 0a 09 09 09 09 09 70 69 76 5f 6f 69  e 2:......piv_oi
10a10 64 20 3d 20 70 69 76 5f 6f 69 64 5f 6b 65 79 6d  d = piv_oid_keym
10a20 67 74 3b 0a 09 09 09 09 09 70 69 76 5f 6b 65 79  gt;......piv_key
10a30 20 3d 20 4e 49 53 54 53 50 38 30 30 5f 37 38 5f   = NISTSP800_78_
10a40 33 5f 4b 45 59 5f 4b 45 59 4d 47 54 3b 0a 09 09  3_KEY_KEYMGT;...
10a50 09 09 09 70 69 76 5f 6c 61 62 65 6c 20 3d 20 22  ...piv_label = "
10a60 4b 65 79 20 4d 61 6e 61 67 65 6d 65 6e 74 22 3b  Key Management";
10a70 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
10a80 7d 0a 0a 09 09 09 72 65 61 64 5f 72 65 74 20 3d  }.....read_ret =
10a90 20 63 61 63 6b 65 79 5f 67 65 74 5f 64 61 74 61   cackey_get_data
10aa0 28 73 6c 6f 74 2c 20 62 75 66 66 65 72 2c 20 73  (slot, buffer, s
10ab0 69 7a 65 6f 66 28 62 75 66 66 65 72 29 2c 20 70  izeof(buffer), p
10ac0 69 76 5f 6f 69 64 29 3b 0a 0a 09 09 09 69 66 20  iv_oid);.....if 
10ad0 28 72 65 61 64 5f 72 65 74 20 3c 3d 20 30 29 20  (read_ret <= 0) 
10ae0 7b 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a  {.....continue;.
10af0 09 09 09 7d 0a 0a 09 09 09 63 75 72 72 5f 69 64  ...}.....curr_id
10b00 20 3d 20 26 63 65 72 74 73 5b 6f 75 74 69 64 78   = &certs[outidx
10b10 5d 3b 0a 09 09 09 6f 75 74 69 64 78 2b 2b 3b 0a  ];....outidx++;.
10b20 0a 09 09 09 63 75 72 72 5f 69 64 2d 3e 6b 65 79  ....curr_id->key
10b30 73 69 7a 65 20 3d 20 2d 31 3b 0a 09 09 09 63 75  size = -1;....cu
10b40 72 72 5f 69 64 2d 3e 69 64 5f 74 79 70 65 20 3d  rr_id->id_type =
10b50 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f   CACKEY_ID_TYPE_
10b60 50 49 56 3b 0a 09 09 09 63 75 72 72 5f 69 64 2d  PIV;....curr_id-
10b70 3e 63 61 72 64 2e 70 69 76 2e 6b 65 79 5f 69 64  >card.piv.key_id
10b80 20 3d 20 70 69 76 5f 6b 65 79 3b 0a 09 09 09 6d   = piv_key;....m
10b90 65 6d 63 70 79 28 63 75 72 72 5f 69 64 2d 3e 63  emcpy(curr_id->c
10ba0 61 72 64 2e 70 69 76 2e 6c 61 62 65 6c 2c 20 70  ard.piv.label, p
10bb0 69 76 5f 6c 61 62 65 6c 2c 20 73 74 72 6c 65 6e  iv_label, strlen
10bc0 28 70 69 76 5f 6c 61 62 65 6c 29 20 2b 20 31 29  (piv_label) + 1)
10bd0 3b 0a 0a 09 09 09 63 75 72 72 5f 69 64 2d 3e 63  ;.....curr_id->c
10be0 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3d  ertificate_len =
10bf0 20 72 65 61 64 5f 72 65 74 3b 0a 09 09 09 63 75   read_ret;....cu
10c00 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61  rr_id->certifica
10c10 74 65 20 3d 20 6d 61 6c 6c 6f 63 28 63 75 72 72  te = malloc(curr
10c20 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65  _id->certificate
10c30 5f 6c 65 6e 29 3b 0a 0a 09 09 09 62 75 66 66 65  _len);.....buffe
10c40 72 5f 6c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 62  r_len = sizeof(b
10c50 75 66 66 65 72 29 3b 0a 09 09 09 62 75 66 66 65  uffer);....buffe
10c60 72 5f 70 20 3d 20 63 61 63 6b 65 79 5f 72 65 61  r_p = cackey_rea
10c70 64 5f 62 65 72 74 6c 76 5f 74 61 67 28 62 75 66  d_bertlv_tag(buf
10c80 66 65 72 2c 20 26 62 75 66 66 65 72 5f 6c 65 6e  fer, &buffer_len
10c90 2c 20 30 78 37 30 2c 20 63 75 72 72 5f 69 64 2d  , 0x70, curr_id-
10ca0 3e 63 65 72 74 69 66 69 63 61 74 65 2c 20 26 63  >certificate, &c
10cb0 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63  urr_id->certific
10cc0 61 74 65 5f 6c 65 6e 29 3b 0a 0a 09 09 09 69 66  ate_len);.....if
10cd0 20 28 62 75 66 66 65 72 5f 70 20 3d 3d 20 4e 55   (buffer_p == NU
10ce0 4c 4c 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59  LL) {.....CACKEY
10cf0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
10d00 65 61 64 69 6e 67 20 63 65 72 74 69 66 69 63 61  eading certifica
10d10 74 65 20 66 72 6f 6d 20 42 45 52 2d 54 4c 56 20  te from BER-TLV 
10d20 72 65 73 70 6f 6e 73 65 20 66 61 69 6c 65 64 2c  response failed,
10d30 20 73 6b 69 70 70 69 6e 67 20 6b 65 79 20 25 69   skipping key %i
10d40 22 2c 20 69 64 78 29 3b 0a 0a 09 09 09 09 66 72  ", idx);......fr
10d50 65 65 28 63 75 72 72 5f 69 64 2d 3e 63 65 72 74  ee(curr_id->cert
10d60 69 66 69 63 61 74 65 29 3b 0a 0a 09 09 09 09 63  ificate);......c
10d70 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63  urr_id->certific
10d80 61 74 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09  ate = NULL;.....
10d90 09 6f 75 74 69 64 78 2d 2d 3b 0a 0a 09 09 09 09  .outidx--;......
10da0 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a  continue;....}..
10db0 23 69 66 64 65 66 20 48 41 56 45 5f 4c 49 42 5a  #ifdef HAVE_LIBZ
10dc0 0a 09 09 09 69 66 20 28 63 75 72 72 5f 69 64 2d  ....if (curr_id-
10dd0 3e 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e  >certificate_len
10de0 20 3e 20 34 29 20 7b 0a 09 09 09 09 69 66 20 28   > 4) {.....if (
10df0 6d 65 6d 63 6d 70 28 63 75 72 72 5f 69 64 2d 3e  memcmp(curr_id->
10e00 63 65 72 74 69 66 69 63 61 74 65 2c 20 22 5c 78  certificate, "\x
10e10 31 66 5c 78 38 62 5c 78 30 38 5c 78 30 30 22 2c  1f\x8b\x08\x00",
10e20 20 34 29 20 3d 3d 20 30 29 20 7b 0a 09 09 09 09   4) == 0) {.....
10e30 09 74 6d 70 62 75 66 6c 65 6e 20 3d 20 63 75 72  .tmpbuflen = cur
10e40 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74  r_id->certificat
10e50 65 5f 6c 65 6e 20 2a 20 32 3b 0a 09 09 09 09 09  e_len * 2;......
10e60 74 6d 70 62 75 66 20 3d 20 6d 61 6c 6c 6f 63 28  tmpbuf = malloc(
10e70 74 6d 70 62 75 66 6c 65 6e 29 3b 0a 0a 09 09 09  tmpbuflen);.....
10e80 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
10e90 52 49 4e 54 42 55 46 28 22 41 74 74 65 6d 70 74  RINTBUF("Attempt
10ea0 69 6e 67 20 74 6f 20 64 65 63 6f 6d 70 72 65 73  ing to decompres
10eb0 73 3a 22 2c 20 63 75 72 72 5f 69 64 2d 3e 63 65  s:", curr_id->ce
10ec0 72 74 69 66 69 63 61 74 65 2c 20 63 75 72 72 5f  rtificate, curr_
10ed0 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65 5f  id->certificate_
10ee0 6c 65 6e 29 3b 0a 0a 09 09 09 09 09 67 7a 69 70  len);.......gzip
10ef0 5f 73 74 72 65 61 6d 2e 7a 61 6c 6c 6f 63 20 3d  _stream.zalloc =
10f00 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 67 7a 69 70   NULL;......gzip
10f10 5f 73 74 72 65 61 6d 2e 7a 66 72 65 65 20 3d 20  _stream.zfree = 
10f20 4e 55 4c 4c 3b 0a 09 09 09 09 09 67 7a 69 70 5f  NULL;......gzip_
10f30 73 74 72 65 61 6d 2e 6f 70 61 71 75 65 20 3d 20  stream.opaque = 
10f40 4e 55 4c 4c 3b 0a 0a 09 09 09 09 09 67 7a 69 70  NULL;.......gzip
10f50 5f 73 74 72 65 61 6d 2e 6e 65 78 74 5f 69 6e 20  _stream.next_in 
10f60 20 3d 20 63 75 72 72 5f 69 64 2d 3e 63 65 72 74   = curr_id->cert
10f70 69 66 69 63 61 74 65 3b 0a 09 09 09 09 09 67 7a  ificate;......gz
10f80 69 70 5f 73 74 72 65 61 6d 2e 61 76 61 69 6c 5f  ip_stream.avail_
10f90 69 6e 20 3d 20 63 75 72 72 5f 69 64 2d 3e 63 65  in = curr_id->ce
10fa0 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 3b 0a 09  rtificate_len;..
10fb0 09 09 09 09 67 7a 69 70 5f 73 74 72 65 61 6d 2e  ....gzip_stream.
10fc0 6e 65 78 74 5f 6f 75 74 20 3d 20 74 6d 70 62 75  next_out = tmpbu
10fd0 66 3b 0a 09 09 09 09 09 67 7a 69 70 5f 73 74 72  f;......gzip_str
10fe0 65 61 6d 2e 61 76 61 69 6c 5f 6f 75 74 20 3d 20  eam.avail_out = 
10ff0 74 6d 70 62 75 66 6c 65 6e 3b 0a 0a 09 09 09 09  tmpbuflen;......
11000 09 75 6e 63 6f 6d 70 72 65 73 73 5f 72 65 74 20  .uncompress_ret 
11010 3d 20 69 6e 66 6c 61 74 65 49 6e 69 74 28 26 67  = inflateInit(&g
11020 7a 69 70 5f 73 74 72 65 61 6d 29 3b 0a 09 09 09  zip_stream);....
11030 09 09 69 66 20 28 75 6e 63 6f 6d 70 72 65 73 73  ..if (uncompress
11040 5f 72 65 74 20 3d 3d 20 5a 5f 4f 4b 29 20 7b 0a  _ret == Z_OK) {.
11050 09 09 09 09 09 09 75 6e 63 6f 6d 70 72 65 73 73  ......uncompress
11060 5f 72 65 74 20 3d 20 69 6e 66 6c 61 74 65 52 65  _ret = inflateRe
11070 73 65 74 32 28 26 67 7a 69 70 5f 73 74 72 65 61  set2(&gzip_strea
11080 6d 2c 20 33 31 29 3b 0a 09 09 09 09 09 7d 0a 09  m, 31);......}..
11090 09 09 09 09 69 66 20 28 75 6e 63 6f 6d 70 72 65  ....if (uncompre
110a0 73 73 5f 72 65 74 20 3d 3d 20 5a 5f 4f 4b 29 20  ss_ret == Z_OK) 
110b0 7b 0a 09 09 09 09 09 09 75 6e 63 6f 6d 70 72 65  {.......uncompre
110c0 73 73 5f 72 65 74 20 3d 20 69 6e 66 6c 61 74 65  ss_ret = inflate
110d0 28 26 67 7a 69 70 5f 73 74 72 65 61 6d 2c 20 30  (&gzip_stream, 0
110e0 29 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 09 69  );......}......i
110f0 66 20 28 75 6e 63 6f 6d 70 72 65 73 73 5f 72 65  f (uncompress_re
11100 74 20 3d 3d 20 5a 5f 53 54 52 45 41 4d 5f 45 4e  t == Z_STREAM_EN
11110 44 29 20 7b 0a 09 09 09 09 09 09 75 6e 63 6f 6d  D) {.......uncom
11120 70 72 65 73 73 5f 72 65 74 20 3d 20 69 6e 66 6c  press_ret = infl
11130 61 74 65 45 6e 64 28 26 67 7a 69 70 5f 73 74 72  ateEnd(&gzip_str
11140 65 61 6d 29 3b 0a 09 09 09 09 09 7d 20 65 6c 73  eam);......} els
11150 65 20 7b 0a 09 09 09 09 09 09 75 6e 63 6f 6d 70  e {.......uncomp
11160 72 65 73 73 5f 72 65 74 20 3d 20 5a 5f 44 41 54  ress_ret = Z_DAT
11170 41 5f 45 52 52 4f 52 3b 0a 09 09 09 09 09 7d 0a  A_ERROR;......}.
11180 09 09 09 09 09 69 66 20 28 75 6e 63 6f 6d 70 72  .....if (uncompr
11190 65 73 73 5f 72 65 74 20 3d 3d 20 5a 5f 4f 4b 29  ess_ret == Z_OK)
111a0 20 7b 0a 09 09 09 09 09 09 74 6d 70 62 75 66 6c   {.......tmpbufl
111b0 65 6e 20 3d 20 67 7a 69 70 5f 73 74 72 65 61 6d  en = gzip_stream
111c0 2e 74 6f 74 61 6c 5f 6f 75 74 3b 0a 0a 09 09 09  .total_out;.....
111d0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
111e0 50 52 49 4e 54 42 55 46 28 22 44 65 63 6f 6d 70  PRINTBUF("Decomp
111f0 72 65 73 73 65 64 20 74 6f 3a 22 2c 20 74 6d 70  ressed to:", tmp
11200 62 75 66 2c 20 74 6d 70 62 75 66 6c 65 6e 29 3b  buf, tmpbuflen);
11210 0a 0a 09 09 09 09 09 09 66 72 65 65 28 63 75 72  ........free(cur
11220 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74  r_id->certificat
11230 65 29 3b 0a 0a 09 09 09 09 09 09 63 75 72 72 5f  e);........curr_
11240 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65 20  id->certificate 
11250 3d 20 74 6d 70 62 75 66 3b 0a 09 09 09 09 09 09  = tmpbuf;.......
11260 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69  curr_id->certifi
11270 63 61 74 65 5f 6c 65 6e 20 3d 20 74 6d 70 62 75  cate_len = tmpbu
11280 66 6c 65 6e 3b 0a 09 09 09 09 09 7d 20 65 6c 73  flen;......} els
11290 65 20 7b 0a 09 09 09 09 09 09 43 41 43 4b 45 59  e {.......CACKEY
112a0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 44  _DEBUG_PRINTF("D
112b0 65 63 6f 6d 70 72 65 73 73 69 6e 67 20 66 61 69  ecompressing fai
112c0 6c 65 64 21 20 75 6e 63 6f 6d 70 72 65 73 73 28  led! uncompress(
112d0 29 20 72 65 74 75 72 6e 65 64 20 25 69 22 2c 20  ) returned %i", 
112e0 75 6e 63 6f 6d 70 72 65 73 73 5f 72 65 74 29 3b  uncompress_ret);
112f0 0a 0a 09 09 09 09 09 09 66 72 65 65 28 74 6d 70  ........free(tmp
11300 62 75 66 29 3b 0a 09 09 09 09 09 7d 0a 09 09 09  buf);......}....
11310 09 7d 0a 09 09 09 7d 0a 23 65 6e 64 69 66 0a 09  .}....}.#endif..
11320 09 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 2f  .}..} else {.../
11330 2a 20 52 65 61 64 20 61 6c 6c 20 74 68 65 20 61  * Read all the a
11340 70 70 6c 65 74 73 20 66 72 6f 6d 20 74 68 65 20  pplets from the 
11350 43 43 43 27 73 20 54 4c 56 20 2a 2f 0a 09 09 63  CCC's TLV */...c
11360 63 63 5f 74 6c 76 20 3d 20 63 61 63 6b 65 79 5f  cc_tlv = cackey_
11370 72 65 61 64 5f 74 6c 76 28 73 6c 6f 74 29 3b 0a  read_tlv(slot);.
11380 0a 09 09 2f 2a 20 4c 6f 6f 6b 20 66 6f 72 20 43  .../* Look for C
11390 41 52 44 55 52 4c 73 20 74 68 61 74 20 63 6f 6f  ARDURLs that coo
113a0 72 65 73 70 6f 6e 64 20 74 6f 20 50 4b 49 20 61  respond to PKI a
113b0 70 70 6c 65 74 73 20 2a 2f 0a 09 09 66 6f 72 20  pplets */...for 
113c0 28 63 63 63 5f 63 75 72 72 20 3d 20 63 63 63 5f  (ccc_curr = ccc_
113d0 74 6c 76 3b 20 63 63 63 5f 63 75 72 72 3b 20 63  tlv; ccc_curr; c
113e0 63 63 5f 63 75 72 72 20 3d 20 63 63 63 5f 63 75  cc_curr = ccc_cu
113f0 72 72 2d 3e 5f 6e 65 78 74 29 20 7b 0a 09 09 09  rr->_next) {....
11400 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
11410 4e 54 46 28 22 46 6f 75 6e 64 20 74 61 67 3a 20  NTF("Found tag: 
11420 25 73 20 2e 2e 2e 20 22 2c 20 43 41 43 4b 45 59  %s ... ", CACKEY
11430 5f 44 45 42 55 47 5f 46 55 4e 43 5f 54 41 47 5f  _DEBUG_FUNC_TAG_
11440 54 4f 5f 53 54 52 28 63 63 63 5f 63 75 72 72 2d  TO_STR(ccc_curr-
11450 3e 74 61 67 29 29 3b 0a 0a 09 09 09 69 66 20 28  >tag));.....if (
11460 63 63 63 5f 63 75 72 72 2d 3e 74 61 67 20 21 3d  ccc_curr->tag !=
11470 20 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44 55   GSCIS_TAG_CARDU
11480 52 4c 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59  RL) {.....CACKEY
11490 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
114a0 20 2e 2e 2e 20 73 6b 69 70 70 69 6e 67 20 69 74   ... skipping it
114b0 20 28 77 65 20 6f 6e 6c 79 20 63 61 72 65 20 61   (we only care a
114c0 62 6f 75 74 20 43 41 52 44 55 52 4c 73 29 22 29  bout CARDURLs)")
114d0 3b 0a 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b  ;......continue;
114e0 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 28 63  ....}.....if ((c
114f0 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63  cc_curr->value_c
11500 61 72 64 75 72 6c 2d 3e 61 70 70 74 79 70 65 20  ardurl->apptype 
11510 26 20 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50  & CACKEY_TLV_APP
11520 5f 50 4b 49 29 20 21 3d 20 43 41 43 4b 45 59 5f  _PKI) != CACKEY_
11530 54 4c 56 5f 41 50 50 5f 50 4b 49 29 20 7b 0a 09  TLV_APP_PKI) {..
11540 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
11550 50 52 49 4e 54 46 28 22 20 20 2e 2e 2e 20 73 6b  PRINTF("  ... sk
11560 69 70 70 69 6e 67 20 69 74 20 28 77 65 20 6f 6e  ipping it (we on
11570 6c 79 20 63 61 72 65 20 61 62 6f 75 74 20 50 4b  ly care about PK
11580 49 20 61 70 70 6c 65 74 73 2c 20 74 68 69 73 20  I applets, this 
11590 61 70 70 6c 65 74 20 73 75 70 70 6f 72 74 73 3a  applet supports:
115a0 20 25 73 2f 25 30 32 78 29 22 2c 20 43 41 43 4b   %s/%02x)", CACK
115b0 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 41 50  EY_DEBUG_FUNC_AP
115c0 50 54 59 50 45 5f 54 4f 5f 53 54 52 28 63 63 63  PTYPE_TO_STR(ccc
115d0 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72  _curr->value_car
115e0 64 75 72 6c 2d 3e 61 70 70 74 79 70 65 29 2c 20  durl->apptype), 
115f0 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 63  (unsigned int) c
11600 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63  cc_curr->value_c
11610 61 72 64 75 72 6c 2d 3e 61 70 70 74 79 70 65 29  ardurl->apptype)
11620 3b 0a 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b  ;......continue;
11630 0a 09 09 09 7d 0a 0a 09 09 09 43 41 43 4b 45 59  ....}.....CACKEY
11640 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28  _DEBUG_PRINTBUF(
11650 22 52 49 44 3a 22 2c 20 63 63 63 5f 63 75 72 72  "RID:", ccc_curr
11660 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d  ->value_cardurl-
11670 3e 72 69 64 2c 20 73 69 7a 65 6f 66 28 63 63 63  >rid, sizeof(ccc
11680 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72  _curr->value_car
11690 64 75 72 6c 2d 3e 72 69 64 29 29 3b 0a 09 09 09  durl->rid));....
116a0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
116b0 4e 54 46 28 22 41 70 70 49 44 20 3d 20 25 73 2f  NTF("AppID = %s/
116c0 25 30 34 6c 78 22 2c 20 43 41 43 4b 45 59 5f 44  %04lx", CACKEY_D
116d0 45 42 55 47 5f 46 55 4e 43 5f 4f 42 4a 49 44 5f  EBUG_FUNC_OBJID_
116e0 54 4f 5f 53 54 52 28 63 63 63 5f 63 75 72 72 2d  TO_STR(ccc_curr-
116f0 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e  >value_cardurl->
11700 61 70 70 69 64 29 2c 20 28 75 6e 73 69 67 6e 65  appid), (unsigne
11710 64 20 6c 6f 6e 67 29 20 63 63 63 5f 63 75 72 72  d long) ccc_curr
11720 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d  ->value_cardurl-
11730 3e 61 70 70 69 64 29 3b 0a 09 09 09 43 41 43 4b  >appid);....CACK
11740 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
11750 22 4f 62 6a 65 63 74 49 44 20 3d 20 25 73 2f 25  "ObjectID = %s/%
11760 30 34 6c 78 22 2c 20 43 41 43 4b 45 59 5f 44 45  04lx", CACKEY_DE
11770 42 55 47 5f 46 55 4e 43 5f 4f 42 4a 49 44 5f 54  BUG_FUNC_OBJID_T
11780 4f 5f 53 54 52 28 63 63 63 5f 63 75 72 72 2d 3e  O_STR(ccc_curr->
11790 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 6f  value_cardurl->o
117a0 62 6a 65 63 74 69 64 29 2c 20 28 75 6e 73 69 67  bjectid), (unsig
117b0 6e 65 64 20 6c 6f 6e 67 29 20 63 63 63 5f 63 75  ned long) ccc_cu
117c0 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72  rr->value_cardur
117d0 6c 2d 3e 6f 62 6a 65 63 74 69 64 29 3b 0a 0a 09  l->objectid);...
117e0 09 09 6d 65 6d 63 70 79 28 63 75 72 72 5f 61 69  ..memcpy(curr_ai
117f0 64 2c 20 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c  d, ccc_curr->val
11800 75 65 5f 63 61 72 64 75 72 6c 2d 3e 72 69 64 2c  ue_cardurl->rid,
11810 20 73 69 7a 65 6f 66 28 63 63 63 5f 63 75 72 72   sizeof(ccc_curr
11820 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d  ->value_cardurl-
11830 3e 72 69 64 29 29 3b 0a 09 09 09 63 75 72 72 5f  >rid));....curr_
11840 61 69 64 5b 73 69 7a 65 6f 66 28 63 75 72 72 5f  aid[sizeof(curr_
11850 61 69 64 29 20 2d 20 32 5d 20 3d 20 28 63 63 63  aid) - 2] = (ccc
11860 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72  _curr->value_car
11870 64 75 72 6c 2d 3e 61 70 70 69 64 20 3e 3e 20 38  durl->appid >> 8
11880 29 20 26 20 30 78 66 66 3b 0a 09 09 09 63 75 72  ) & 0xff;....cur
11890 72 5f 61 69 64 5b 73 69 7a 65 6f 66 28 63 75 72  r_aid[sizeof(cur
118a0 72 5f 61 69 64 29 20 2d 20 31 5d 20 3d 20 63 63  r_aid) - 1] = cc
118b0 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61  c_curr->value_ca
118c0 72 64 75 72 6c 2d 3e 61 70 70 69 64 20 26 20 30  rdurl->appid & 0
118d0 78 66 66 3b 0a 0a 09 09 09 2f 2a 20 53 65 6c 65  xff;...../* Sele
118e0 63 74 20 66 6f 75 6e 64 20 61 70 70 6c 65 74 20  ct found applet 
118f0 2e 2e 2e 20 2a 2f 0a 09 09 09 73 65 6c 65 63 74  ... */....select
11900 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65  _ret = cackey_se
11910 6c 65 63 74 5f 61 70 70 6c 65 74 28 73 6c 6f 74  lect_applet(slot
11920 2c 20 63 75 72 72 5f 61 69 64 2c 20 73 69 7a 65  , curr_aid, size
11930 6f 66 28 63 75 72 72 5f 61 69 64 29 29 3b 0a 09  of(curr_aid));..
11940 09 09 69 66 20 28 73 65 6c 65 63 74 5f 72 65 74  ..if (select_ret
11950 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f   != CACKEY_PCSC_
11960 53 5f 4f 4b 29 20 7b 0a 09 09 09 09 43 41 43 4b  S_OK) {.....CACK
11970 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
11980 22 46 61 69 6c 65 64 20 74 6f 20 73 65 6c 65 63  "Failed to selec
11990 74 20 61 70 70 6c 65 74 2c 20 73 6b 69 70 70 69  t applet, skippi
119a0 6e 67 20 70 72 6f 63 65 73 73 69 6e 67 20 6f 66  ng processing of
119b0 20 74 68 69 73 20 6f 62 6a 65 63 74 22 29 3b 0a   this object");.
119c0 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09  .....continue;..
119d0 09 09 7d 0a 0a 09 09 09 2f 2a 20 2e 2e 2e 20 61  ..}...../* ... a
119e0 6e 64 20 6f 62 6a 65 63 74 20 28 66 69 6c 65 29  nd object (file)
119f0 20 2a 2f 0a 09 09 09 73 65 6c 65 63 74 5f 72 65   */....select_re
11a00 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6c 65 63  t = cackey_selec
11a10 74 5f 66 69 6c 65 28 73 6c 6f 74 2c 20 63 63 63  t_file(slot, ccc
11a20 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72  _curr->value_car
11a30 64 75 72 6c 2d 3e 6f 62 6a 65 63 74 69 64 29 3b  durl->objectid);
11a40 0a 09 09 09 69 66 20 28 73 65 6c 65 63 74 5f 72  ....if (select_r
11a50 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53  et != CACKEY_PCS
11a60 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 09 43 41  C_S_OK) {.....CA
11a70 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
11a80 46 28 22 46 61 69 6c 65 64 20 74 6f 20 73 65 6c  F("Failed to sel
11a90 65 63 74 20 66 69 6c 65 2c 20 73 6b 69 70 70 69  ect file, skippi
11aa0 6e 67 20 70 72 6f 63 65 73 73 69 6e 67 20 6f 66  ng processing of
11ab0 20 74 68 69 73 20 6f 62 6a 65 63 74 22 29 3b 0a   this object");.
11ac0 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09  .....continue;..
11ad0 09 09 7d 0a 0a 09 09 09 2f 2a 20 50 72 6f 63 65  ..}...../* Proce
11ae0 73 73 20 74 68 69 73 20 66 69 6c 65 27 73 20 54  ss this file's T
11af0 4c 56 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 63  LV looking for c
11b00 65 72 74 69 66 69 63 61 74 65 73 20 2a 2f 0a 09  ertificates */..
11b10 09 09 61 70 70 5f 74 6c 76 20 3d 20 63 61 63 6b  ..app_tlv = cack
11b20 65 79 5f 72 65 61 64 5f 74 6c 76 28 73 6c 6f 74  ey_read_tlv(slot
11b30 29 3b 0a 09 0a 09 09 09 66 6f 72 20 28 61 70 70  );......for (app
11b40 5f 63 75 72 72 20 3d 20 61 70 70 5f 74 6c 76 3b  _curr = app_tlv;
11b50 20 61 70 70 5f 63 75 72 72 3b 20 61 70 70 5f 63   app_curr; app_c
11b60 75 72 72 20 3d 20 61 70 70 5f 63 75 72 72 2d 3e  urr = app_curr->
11b70 5f 6e 65 78 74 29 20 7b 0a 09 09 09 09 43 41 43  _next) {.....CAC
11b80 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
11b90 28 22 46 6f 75 6e 64 20 74 61 67 3a 20 25 73 22  ("Found tag: %s"
11ba0 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46  , CACKEY_DEBUG_F
11bb0 55 4e 43 5f 54 41 47 5f 54 4f 5f 53 54 52 28 61  UNC_TAG_TO_STR(a
11bc0 70 70 5f 63 75 72 72 2d 3e 74 61 67 29 29 3b 0a  pp_curr->tag));.
11bd0 09 09 09 09 69 66 20 28 61 70 70 5f 63 75 72 72  ....if (app_curr
11be0 2d 3e 74 61 67 20 21 3d 20 47 53 43 49 53 5f 54  ->tag != GSCIS_T
11bf0 41 47 5f 43 45 52 54 49 46 49 43 41 54 45 29 20  AG_CERTIFICATE) 
11c00 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45  {......CACKEY_DE
11c10 42 55 47 5f 50 52 49 4e 54 46 28 22 20 20 2e 2e  BUG_PRINTF("  ..
11c20 2e 20 73 6b 69 70 70 69 6e 67 20 69 74 20 28 77  . skipping it (w
11c30 65 20 6f 6e 6c 79 20 63 61 72 65 20 61 62 6f 75  e only care abou
11c40 74 20 43 45 52 54 49 46 49 43 41 54 45 73 29 22  t CERTIFICATEs)"
11c50 29 3b 0a 0a 09 09 09 09 09 63 6f 6e 74 69 6e 75  );.......continu
11c60 65 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 63 75  e;.....}......cu
11c70 72 72 5f 69 64 20 3d 20 26 63 65 72 74 73 5b 6f  rr_id = &certs[o
11c80 75 74 69 64 78 5d 3b 0a 09 09 09 09 6f 75 74 69  utidx];.....outi
11c90 64 78 2b 2b 3b 0a 0a 09 09 09 09 63 75 72 72 5f  dx++;......curr_
11ca0 69 64 2d 3e 69 64 5f 74 79 70 65 20 3d 20 43 41  id->id_type = CA
11cb0 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43 41 43  CKEY_ID_TYPE_CAC
11cc0 3b 0a 09 09 09 09 6d 65 6d 63 70 79 28 63 75 72  ;.....memcpy(cur
11cd0 72 5f 69 64 2d 3e 63 61 72 64 2e 63 61 63 2e 61  r_id->card.cac.a
11ce0 70 70 6c 65 74 2c 20 63 75 72 72 5f 61 69 64 2c  pplet, curr_aid,
11cf0 20 73 69 7a 65 6f 66 28 63 75 72 72 5f 69 64 2d   sizeof(curr_id-
11d00 3e 63 61 72 64 2e 63 61 63 2e 61 70 70 6c 65 74  >card.cac.applet
11d10 29 29 3b 0a 09 09 09 09 63 75 72 72 5f 69 64 2d  ));.....curr_id-
11d20 3e 63 61 72 64 2e 63 61 63 2e 66 69 6c 65 20 3d  >card.cac.file =
11d30 20 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65   ccc_curr->value
11d40 5f 63 61 72 64 75 72 6c 2d 3e 6f 62 6a 65 63 74  _cardurl->object
11d50 69 64 3b 0a 09 09 09 09 63 75 72 72 5f 69 64 2d  id;.....curr_id-
11d60 3e 6b 65 79 73 69 7a 65 20 3d 20 2d 31 3b 0a 0a  >keysize = -1;..
11d70 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
11d80 5f 50 52 49 4e 54 46 28 22 46 69 6c 6c 69 6e 67  _PRINTF("Filling
11d90 20 63 75 72 72 5f 69 64 2d 3e 63 61 72 64 2e 63   curr_id->card.c
11da0 61 63 2e 61 70 70 6c 65 74 20 28 25 70 29 20 77  ac.applet (%p) w
11db0 69 74 68 20 25 6c 75 20 62 79 74 65 73 3a 22 2c  ith %lu bytes:",
11dc0 20 63 75 72 72 5f 69 64 2d 3e 63 61 72 64 2e 63   curr_id->card.c
11dd0 61 63 2e 61 70 70 6c 65 74 2c 20 28 75 6e 73 69  ac.applet, (unsi
11de0 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69 7a 65 6f  gned long) sizeo
11df0 66 28 63 75 72 72 5f 69 64 2d 3e 63 61 72 64 2e  f(curr_id->card.
11e00 63 61 63 2e 61 70 70 6c 65 74 29 29 3b 0a 09 09  cac.applet));...
11e10 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
11e20 52 49 4e 54 42 55 46 28 22 56 41 4c 3a 22 2c 20  RINTBUF("VAL:", 
11e30 63 75 72 72 5f 69 64 2d 3e 63 61 72 64 2e 63 61  curr_id->card.ca
11e40 63 2e 61 70 70 6c 65 74 2c 20 73 69 7a 65 6f 66  c.applet, sizeof
11e50 28 63 75 72 72 5f 69 64 2d 3e 63 61 72 64 2e 63  (curr_id->card.c
11e60 61 63 2e 61 70 70 6c 65 74 29 29 3b 0a 0a 09 09  ac.applet));....
11e70 09 09 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69  ..curr_id->certi
11e80 66 69 63 61 74 65 5f 6c 65 6e 20 3d 20 61 70 70  ficate_len = app
11e90 5f 63 75 72 72 2d 3e 6c 65 6e 67 74 68 3b 0a 0a  _curr->length;..
11ea0 09 09 09 09 63 75 72 72 5f 69 64 2d 3e 63 65 72  ....curr_id->cer
11eb0 74 69 66 69 63 61 74 65 20 3d 20 6d 61 6c 6c 6f  tificate = mallo
11ec0 63 28 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69  c(curr_id->certi
11ed0 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a 09 09 09  ficate_len);....
11ee0 09 6d 65 6d 63 70 79 28 63 75 72 72 5f 69 64 2d  .memcpy(curr_id-
11ef0 3e 63 65 72 74 69 66 69 63 61 74 65 2c 20 61 70  >certificate, ap
11f00 70 5f 63 75 72 72 2d 3e 76 61 6c 75 65 2c 20 63  p_curr->value, c
11f10 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63  urr_id->certific
11f20 61 74 65 5f 6c 65 6e 29 3b 0a 0a 09 09 09 09 69  ate_len);......i
11f30 66 20 28 6f 75 74 69 64 78 20 3e 3d 20 2a 63 6f  f (outidx >= *co
11f40 75 6e 74 29 20 7b 0a 09 09 09 09 09 69 66 20 28  unt) {......if (
11f50 63 65 72 74 73 5f 72 65 73 69 7a 61 62 6c 65 29  certs_resizable)
11f60 20 7b 0a 09 09 09 09 09 09 2a 63 6f 75 6e 74 20   {.......*count 
11f70 2a 3d 20 32 3b 0a 09 09 09 09 09 09 69 66 20 28  *= 2;.......if (
11f80 2a 63 6f 75 6e 74 20 21 3d 20 30 29 20 7b 0a 09  *count != 0) {..
11f90 09 09 09 09 09 09 63 65 72 74 73 20 3d 20 72 65  ......certs = re
11fa0 61 6c 6c 6f 63 28 63 65 72 74 73 2c 20 73 69 7a  alloc(certs, siz
11fb0 65 6f 66 28 2a 63 65 72 74 73 29 20 2a 20 28 2a  eof(*certs) * (*
11fc0 63 6f 75 6e 74 29 29 3b 0a 09 09 09 09 09 09 7d  count));.......}
11fd0 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09 09 63   else {........c
11fe0 65 72 74 73 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09  erts = NULL;....
11ff0 09 09 09 7d 0a 09 09 09 09 09 7d 20 65 6c 73 65  ...}......} else
12000 20 7b 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a   {.......break;.
12010 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 09 09 09  .....}.....}....
12020 7d 0a 0a 09 09 09 63 61 63 6b 65 79 5f 66 72 65  }.....cackey_fre
12030 65 5f 74 6c 76 28 61 70 70 5f 74 6c 76 29 3b 0a  e_tlv(app_tlv);.
12040 0a 09 09 09 69 66 20 28 6f 75 74 69 64 78 20 3e  ....if (outidx >
12050 3d 20 2a 63 6f 75 6e 74 29 20 7b 0a 09 09 09 09  = *count) {.....
12060 62 72 65 61 6b 3b 0a 09 09 09 7d 0a 09 09 7d 0a  break;....}...}.
12070 0a 09 09 63 61 63 6b 65 79 5f 66 72 65 65 5f 74  ...cackey_free_t
12080 6c 76 28 63 63 63 5f 74 6c 76 29 3b 0a 09 7d 0a  lv(ccc_tlv);..}.
12090 0a 09 2a 63 6f 75 6e 74 20 3d 20 6f 75 74 69 64  ..*count = outid
120a0 78 3b 0a 0a 09 69 66 20 28 63 65 72 74 73 5f 72  x;...if (certs_r
120b0 65 73 69 7a 61 62 6c 65 29 20 7b 0a 09 09 69 66  esizable) {...if
120c0 20 28 2a 63 6f 75 6e 74 20 21 3d 20 30 29 20 7b   (*count != 0) {
120d0 0a 09 09 09 63 65 72 74 73 20 3d 20 72 65 61 6c  ....certs = real
120e0 6c 6f 63 28 63 65 72 74 73 2c 20 73 69 7a 65 6f  loc(certs, sizeo
120f0 66 28 2a 63 65 72 74 73 29 20 2a 20 28 2a 63 6f  f(*certs) * (*co
12100 75 6e 74 29 29 3b 0a 09 09 7d 20 65 6c 73 65 20  unt));...} else 
12110 7b 0a 09 09 09 63 65 72 74 73 20 3d 20 4e 55 4c  {....certs = NUL
12120 4c 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 73 6c 6f 74  L;...}..}...slot
12130 2d 3e 63 61 63 68 65 64 5f 63 65 72 74 73 20 3d  ->cached_certs =
12140 20 63 61 63 6b 65 79 5f 63 6f 70 79 5f 63 65 72   cackey_copy_cer
12150 74 73 28 4e 55 4c 4c 2c 20 63 65 72 74 73 2c 20  ts(NULL, certs, 
12160 2a 63 6f 75 6e 74 29 3b 0a 09 73 6c 6f 74 2d 3e  *count);..slot->
12170 63 61 63 68 65 64 5f 63 65 72 74 73 5f 63 6f 75  cached_certs_cou
12180 6e 74 20 3d 20 2a 63 6f 75 6e 74 3b 0a 0a 09 2f  nt = *count;.../
12190 2a 20 54 65 72 6d 69 6e 61 74 65 20 53 6d 61 72  * Terminate Smar
121a0 74 43 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f  tCard Transactio
121b0 6e 20 2a 2f 0a 09 63 61 63 6b 65 79 5f 65 6e 64  n */..cackey_end
121c0 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f  _transaction(slo
121d0 74 29 3b 0a 0a 09 72 65 74 75 72 6e 28 63 65 72  t);...return(cer
121e0 74 73 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59  ts);.}../*. * SY
121f0 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 2e 2e  NPOSIS. *     ..
12200 2e 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54  .. *. * ARGUMENT
12210 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a  S. *     .... *.
12220 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a   * RETURN VALUE.
12230 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a   *     .... *. *
12240 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 2e 2e   NOTES. *     ..
12250 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20  .. *. */.static 
12260 73 73 69 7a 65 5f 74 20 63 61 63 6b 65 79 5f 73  ssize_t cackey_s
12270 69 67 6e 64 65 63 72 79 70 74 28 73 74 72 75 63  igndecrypt(struc
12280 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73  t cackey_slot *s
12290 6c 6f 74 2c 20 73 74 72 75 63 74 20 63 61 63 6b  lot, struct cack
122a0 65 79 5f 69 64 65 6e 74 69 74 79 20 2a 69 64 65  ey_identity *ide
122b0 6e 74 69 74 79 2c 20 75 6e 73 69 67 6e 65 64 20  ntity, unsigned 
122c0 63 68 61 72 20 2a 62 75 66 2c 20 73 69 7a 65 5f  char *buf, size_
122d0 74 20 62 75 66 6c 65 6e 2c 20 75 6e 73 69 67 6e  t buflen, unsign
122e0 65 64 20 63 68 61 72 20 2a 6f 75 74 62 75 66 2c  ed char *outbuf,
122f0 20 73 69 7a 65 5f 74 20 6f 75 74 62 75 66 6c 65   size_t outbufle
12300 6e 2c 20 69 6e 74 20 70 61 64 49 6e 70 75 74 2c  n, int padInput,
12310 20 69 6e 74 20 75 6e 70 61 64 4f 75 74 70 75 74   int unpadOutput
12320 29 20 7b 0a 09 63 61 63 6b 65 79 5f 70 63 73 63  ) {..cackey_pcsc
12330 5f 69 64 5f 74 79 70 65 20 69 64 5f 74 79 70 65  _id_type id_type
12340 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72  ;..unsigned char
12350 20 64 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61   dyn_auth_templa
12360 74 65 5b 31 30 5d 2c 20 2a 64 79 6e 5f 61 75 74  te[10], *dyn_aut
12370 68 5f 74 6d 70 62 75 66 3b 0a 09 75 6e 73 69 67  h_tmpbuf;..unsig
12380 6e 65 64 20 63 68 61 72 20 2a 74 6d 70 62 75 66  ned char *tmpbuf
12390 2c 20 2a 74 6d 70 62 75 66 5f 73 2c 20 2a 6f 75  , *tmpbuf_s, *ou
123a0 74 62 75 66 5f 73 2c 20 2a 6f 75 74 62 75 66 5f  tbuf_s, *outbuf_
123b0 70 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61  p;..unsigned cha
123c0 72 20 62 79 74 65 73 5f 74 6f 5f 73 65 6e 64 2c  r bytes_to_send,
123d0 20 70 31 2c 20 63 6c 61 73 73 3b 0a 09 75 6e 73   p1, class;..uns
123e0 69 67 6e 65 64 20 63 68 61 72 20 62 6c 6f 63 6b  igned char block
123f0 74 79 70 65 3b 0a 09 63 61 63 6b 65 79 5f 72 65  type;..cackey_re
12400 74 20 73 65 6e 64 5f 72 65 74 3b 0a 09 75 69 6e  t send_ret;..uin
12410 74 31 36 5f 74 20 72 65 73 70 63 6f 64 65 3b 0a  t16_t respcode;.
12420 09 73 73 69 7a 65 5f 74 20 72 65 74 76 61 6c 20  .ssize_t retval 
12430 3d 20 30 2c 20 75 6e 70 61 64 6f 66 66 73 65 74  = 0, unpadoffset
12440 3b 0a 09 73 69 7a 65 5f 74 20 74 6d 70 62 75 66  ;..size_t tmpbuf
12450 6c 65 6e 2c 20 70 61 64 6c 65 6e 2c 20 74 6d 70  len, padlen, tmp
12460 6f 75 74 62 75 66 6c 65 6e 2c 20 6f 75 74 62 75  outbuflen, outbu
12470 66 5f 6c 65 6e 3b 0a 09 69 6e 74 20 66 72 65 65  f_len;..int free
12480 5f 74 6d 70 62 75 66 20 3d 20 30 3b 0a 09 69 6e  _tmpbuf = 0;..in
12490 74 20 6c 65 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  t le;...CACKEY_D
124a0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
124b0 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 73 6c  led.");...if (sl
124c0 6f 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  ot == NULL) {...
124d0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
124e0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 73 6c 6f  NTF("Error.  slo
124f0 74 20 69 73 20 4e 55 4c 4c 22 29 3b 0a 0a 09 09  t is NULL");....
12500 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a  return(-1);..}..
12510 09 69 66 20 28 62 75 66 20 3d 3d 20 4e 55 4c 4c  .if (buf == NULL
12520 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
12530 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
12540 2e 20 20 62 75 66 20 69 73 20 4e 55 4c 4c 22 29  .  buf is NULL")
12550 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b  ;....return(-1);
12560 0a 09 7d 0a 0a 09 69 66 20 28 6f 75 74 62 75 66  ..}...if (outbuf
12570 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
12580 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
12590 46 28 22 45 72 72 6f 72 2e 20 20 6f 75 74 62 75  F("Error.  outbu
125a0 66 20 69 73 20 4e 55 4c 4c 22 29 3b 0a 0a 09 09  f is NULL");....
125b0 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a  return(-1);..}..
125c0 09 69 66 20 28 69 64 65 6e 74 69 74 79 20 3d 3d  .if (identity ==
125d0 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
125e0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
125f0 45 72 72 6f 72 2e 20 20 69 64 65 6e 74 69 74 79  Error.  identity
12600 20 69 73 20 4e 55 4c 4c 22 29 3b 0a 0a 09 09 72   is NULL");....r
12610 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09  eturn(-1);..}...
12620 69 66 20 28 69 64 65 6e 74 69 74 79 2d 3e 70 63  if (identity->pc
12630 73 63 5f 69 64 65 6e 74 69 74 79 20 3d 3d 20 4e  sc_identity == N
12640 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
12650 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
12660 72 6f 72 2e 20 20 69 64 65 6e 74 69 74 79 2d 3e  ror.  identity->
12670 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 69 73  pcsc_identity is
12680 20 4e 55 4c 4c 22 29 3b 0a 0a 09 09 72 65 74 75   NULL");....retu
12690 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 69 64 5f  rn(-1);..}...id_
126a0 74 79 70 65 20 3d 20 69 64 65 6e 74 69 74 79 2d  type = identity-
126b0 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e  >pcsc_identity->
126c0 69 64 5f 74 79 70 65 3b 0a 09 69 66 20 28 69 64  id_type;..if (id
126d0 5f 74 79 70 65 20 3d 3d 20 43 41 43 4b 45 59 5f  _type == CACKEY_
126e0 49 44 5f 54 59 50 45 5f 43 45 52 54 5f 4f 4e 4c  ID_TYPE_CERT_ONL
126f0 59 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  Y) {...CACKEY_DE
12700 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
12710 72 2e 20 20 69 64 65 6e 74 69 74 79 2d 3e 70 63  r.  identity->pc
12720 73 63 5f 69 64 65 6e 74 69 74 79 20 69 73 20 43  sc_identity is C
12730 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43 45  ACKEY_ID_TYPE_CE
12740 52 54 5f 4f 4e 4c 59 2c 20 77 68 69 63 68 20 63  RT_ONLY, which c
12750 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 20 66 6f  annot be used fo
12760 72 20 73 69 67 6e 2f 64 65 63 72 79 70 74 22 29  r sign/decrypt")
12770 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b  ;....return(-1);
12780 0a 09 7d 0a 0a 09 73 77 69 74 63 68 20 28 69 64  ..}...switch (id
12790 5f 74 79 70 65 29 20 7b 0a 09 09 63 61 73 65 20  _type) {...case 
127a0 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 50  CACKEY_ID_TYPE_P
127b0 49 56 3a 0a 09 09 63 61 73 65 20 43 41 43 4b 45  IV:...case CACKE
127c0 59 5f 49 44 5f 54 59 50 45 5f 43 41 43 3a 0a 09  Y_ID_TYPE_CAC:..
127d0 09 09 62 72 65 61 6b 3b 0a 09 09 64 65 66 61 75  ..break;...defau
127e0 6c 74 3a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  lt:....CACKEY_DE
127f0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
12800 72 2e 20 20 69 64 65 6e 74 69 74 79 2d 3e 70 63  r.  identity->pc
12810 73 63 5f 69 64 65 6e 74 69 74 79 20 69 73 20 6e  sc_identity is n
12820 6f 74 20 61 20 73 75 70 70 6f 72 74 65 64 20 76  ot a supported v
12830 61 6c 75 65 2e 20 54 79 70 65 20 69 73 3a 20 30  alue. Type is: 0
12840 78 25 6c 78 20 28 50 49 56 20 3d 20 30 78 25 6c  x%lx (PIV = 0x%l
12850 78 2c 20 43 41 43 20 3d 20 30 78 25 6c 78 29 22  x, CAC = 0x%lx)"
12860 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
12870 29 20 69 64 5f 74 79 70 65 2c 20 28 75 6e 73 69  ) id_type, (unsi
12880 67 6e 65 64 20 6c 6f 6e 67 29 20 43 41 43 4b 45  gned long) CACKE
12890 59 5f 49 44 5f 54 59 50 45 5f 50 49 56 2c 20 28  Y_ID_TYPE_PIV, (
128a0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 43  unsigned long) C
128b0 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43 41  ACKEY_ID_TYPE_CA
128c0 43 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 2d  C);.....return(-
128d0 31 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74 65  1);..}.../* Dete
128e0 72 6d 69 6e 65 20 69 64 65 6e 74 69 74 79 20 4b  rmine identity K
128f0 65 79 20 73 69 7a 65 20 2a 2f 0a 09 69 66 20 28  ey size */..if (
12900 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69  identity->pcsc_i
12910 64 65 6e 74 69 74 79 2d 3e 6b 65 79 73 69 7a 65  dentity->keysize
12920 20 3c 20 30 29 20 7b 0a 09 09 69 64 65 6e 74 69   < 0) {...identi
12930 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74  ty->pcsc_identit
12940 79 2d 3e 6b 65 79 73 69 7a 65 20 3d 20 78 35 30  y->keysize = x50
12950 39 5f 74 6f 5f 6b 65 79 73 69 7a 65 28 69 64 65  9_to_keysize(ide
12960 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e  ntity->pcsc_iden
12970 74 69 74 79 2d 3e 63 65 72 74 69 66 69 63 61 74  tity->certificat
12980 65 2c 20 69 64 65 6e 74 69 74 79 2d 3e 70 63 73  e, identity->pcs
12990 63 5f 69 64 65 6e 74 69 74 79 2d 3e 63 65 72 74  c_identity->cert
129a0 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a 09 7d  ificate_len);..}
129b0 0a 0a 09 2f 2a 20 50 61 64 20 6d 65 73 73 61 67  .../* Pad messag
129c0 65 20 74 6f 20 6b 65 79 20 73 69 7a 65 20 2a 2f  e to key size */
129d0 0a 09 69 66 20 28 70 61 64 49 6e 70 75 74 29 20  ..if (padInput) 
129e0 7b 0a 09 09 69 66 20 28 69 64 65 6e 74 69 74 79  {...if (identity
129f0 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d  ->pcsc_identity-
12a00 3e 6b 65 79 73 69 7a 65 20 3e 20 30 29 20 7b 0a  >keysize > 0) {.
12a10 09 09 09 69 66 20 28 62 75 66 6c 65 6e 20 21 3d  ...if (buflen !=
12a20 20 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f   identity->pcsc_
12a30 69 64 65 6e 74 69 74 79 2d 3e 6b 65 79 73 69 7a  identity->keysiz
12a40 65 29 20 7b 0a 09 09 09 09 69 66 20 28 62 75 66  e) {.....if (buf
12a50 6c 65 6e 20 3e 20 28 69 64 65 6e 74 69 74 79 2d  len > (identity-
12a60 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e  >pcsc_identity->
12a70 6b 65 79 73 69 7a 65 20 2b 20 33 29 29 20 7b 0a  keysize + 3)) {.
12a80 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
12a90 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
12aa0 20 20 4d 65 73 73 61 67 65 20 69 73 20 74 6f 6f    Message is too
12ab0 20 6c 61 72 67 65 20 74 6f 20 73 69 67 6e 2f 64   large to sign/d
12ac0 65 63 72 79 70 74 22 29 3b 0a 0a 09 09 09 09 09  ecrypt");.......
12ad0 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 09 09  return(-1);.....
12ae0 7d 0a 0a 09 09 09 09 74 6d 70 62 75 66 6c 65 6e  }......tmpbuflen
12af0 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e 70 63 73   = identity->pcs
12b00 63 5f 69 64 65 6e 74 69 74 79 2d 3e 6b 65 79 73  c_identity->keys
12b10 69 7a 65 3b 0a 09 09 09 09 74 6d 70 62 75 66 20  ize;.....tmpbuf 
12b20 3d 20 6d 61 6c 6c 6f 63 28 74 6d 70 62 75 66 6c  = malloc(tmpbufl
12b30 65 6e 29 3b 0a 09 09 09 09 66 72 65 65 5f 74 6d  en);.....free_tm
12b40 70 62 75 66 20 3d 20 31 3b 0a 0a 09 09 09 09 70  pbuf = 1;......p
12b50 61 64 6c 65 6e 20 3d 20 74 6d 70 62 75 66 6c 65  adlen = tmpbufle
12b60 6e 20 2d 20 62 75 66 6c 65 6e 20 2d 20 33 3b 0a  n - buflen - 3;.
12b70 0a 09 09 09 09 2f 2a 20 52 53 41 20 50 4b 43 53  ...../* RSA PKCS
12b80 23 31 20 45 4d 53 41 2d 50 4b 43 53 31 2d 76 31  #1 EMSA-PKCS1-v1
12b90 5f 35 20 50 61 64 64 69 6e 67 20 2a 2f 0a 09 09  _5 Padding */...
12ba0 09 09 74 6d 70 62 75 66 5b 30 5d 20 3d 20 30 78  ..tmpbuf[0] = 0x
12bb0 30 30 3b 0a 09 09 09 09 74 6d 70 62 75 66 5b 31  00;.....tmpbuf[1
12bc0 5d 20 3d 20 30 78 30 31 3b 0a 09 09 09 09 6d 65  ] = 0x01;.....me
12bd0 6d 73 65 74 28 26 74 6d 70 62 75 66 5b 32 5d 2c  mset(&tmpbuf[2],
12be0 20 30 78 46 46 2c 20 70 61 64 6c 65 6e 29 3b 0a   0xFF, padlen);.
12bf0 09 09 09 09 74 6d 70 62 75 66 5b 70 61 64 6c 65  ....tmpbuf[padle
12c00 6e 20 2b 20 32 5d 3d 20 30 78 30 30 3b 0a 09 09  n + 2]= 0x00;...
12c10 09 09 6d 65 6d 63 70 79 28 26 74 6d 70 62 75 66  ..memcpy(&tmpbuf
12c20 5b 70 61 64 6c 65 6e 20 2b 20 33 5d 2c 20 62 75  [padlen + 3], bu
12c30 66 2c 20 62 75 66 6c 65 6e 29 3b 0a 0a 09 09 09  f, buflen);.....
12c40 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
12c50 49 4e 54 42 55 46 28 22 55 6e 70 61 64 64 65 64  INTBUF("Unpadded
12c60 3a 22 2c 20 62 75 66 2c 20 62 75 66 6c 65 6e 29  :", buf, buflen)
12c70 3b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ;.....CACKEY_DEB
12c80 55 47 5f 50 52 49 4e 54 42 55 46 28 22 50 61 64  UG_PRINTBUF("Pad
12c90 64 65 64 3a 22 2c 20 74 6d 70 62 75 66 2c 20 74  ded:", tmpbuf, t
12ca0 6d 70 62 75 66 6c 65 6e 29 3b 0a 09 09 09 7d 20  mpbuflen);....} 
12cb0 65 6c 73 65 20 7b 0a 09 09 09 09 74 6d 70 62 75  else {.....tmpbu
12cc0 66 20 3d 20 62 75 66 3b 0a 09 09 09 09 74 6d 70  f = buf;.....tmp
12cd0 62 75 66 6c 65 6e 20 3d 20 62 75 66 6c 65 6e 3b  buflen = buflen;
12ce0 0a 09 09 09 09 66 72 65 65 5f 74 6d 70 62 75 66  .....free_tmpbuf
12cf0 20 3d 20 30 3b 0a 09 09 09 09 70 61 64 6c 65 6e   = 0;.....padlen
12d00 20 3d 20 30 3b 0a 09 09 09 7d 0a 09 09 7d 20 65   = 0;....}...} e
12d10 6c 73 65 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  lse {....CACKEY_
12d20 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e  DEBUG_PRINTF("Un
12d30 61 62 6c 65 20 74 6f 20 64 65 74 65 72 6d 69 6e  able to determin
12d40 65 20 6b 65 79 20 73 69 7a 65 2c 20 68 6f 70 69  e key size, hopi
12d50 6e 67 20 74 68 65 20 6d 65 73 73 61 67 65 20 69  ng the message i
12d60 73 20 70 72 6f 70 65 72 6c 79 20 70 61 64 64 65  s properly padde
12d70 64 21 22 29 3b 0a 0a 09 09 09 74 6d 70 62 75 66  d!");.....tmpbuf
12d80 20 3d 20 62 75 66 3b 0a 09 09 09 74 6d 70 62 75   = buf;....tmpbu
12d90 66 6c 65 6e 20 3d 20 62 75 66 6c 65 6e 3b 0a 09  flen = buflen;..
12da0 09 09 66 72 65 65 5f 74 6d 70 62 75 66 20 3d 20  ..free_tmpbuf = 
12db0 30 3b 0a 09 09 09 70 61 64 6c 65 6e 20 3d 20 30  0;....padlen = 0
12dc0 3b 0a 09 09 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a  ;...}..} else {.
12dd0 09 09 74 6d 70 62 75 66 20 3d 20 62 75 66 3b 0a  ..tmpbuf = buf;.
12de0 09 09 74 6d 70 62 75 66 6c 65 6e 20 3d 20 62 75  ..tmpbuflen = bu
12df0 66 6c 65 6e 3b 0a 09 09 66 72 65 65 5f 74 6d 70  flen;...free_tmp
12e00 62 75 66 20 3d 20 30 3b 0a 09 09 70 61 64 6c 65  buf = 0;...padle
12e10 6e 20 3d 20 30 3b 0a 09 7d 0a 0a 09 2f 2a 20 42  n = 0;..}.../* B
12e20 65 67 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e  egin transaction
12e30 20 2a 2f 0a 09 63 61 63 6b 65 79 5f 62 65 67 69   */..cackey_begi
12e40 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c  n_transaction(sl
12e50 6f 74 29 3b 0a 0a 09 2f 2a 20 53 65 6c 65 63 74  ot);.../* Select
12e60 20 63 6f 72 72 65 63 74 20 61 70 70 6c 65 74 20   correct applet 
12e70 2a 2f 0a 09 73 77 69 74 63 68 20 28 69 64 5f 74  */..switch (id_t
12e80 79 70 65 29 20 7b 0a 09 09 63 61 73 65 20 43 41  ype) {...case CA
12e90 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43 41 43  CKEY_ID_TYPE_CAC
12ea0 3a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  :....CACKEY_DEBU
12eb0 47 5f 50 52 49 4e 54 46 28 22 53 65 6c 65 63 74  G_PRINTF("Select
12ec0 69 6e 67 20 61 70 70 6c 65 74 20 66 6f 75 6e 64  ing applet found
12ed0 20 61 74 20 25 70 20 2e 2e 2e 22 2c 20 69 64 65   at %p ...", ide
12ee0 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e  ntity->pcsc_iden
12ef0 74 69 74 79 2d 3e 63 61 72 64 2e 63 61 63 2e 61  tity->card.cac.a
12f00 70 70 6c 65 74 29 3b 0a 09 09 09 63 61 63 6b 65  pplet);....cacke
12f10 79 5f 73 65 6c 65 63 74 5f 61 70 70 6c 65 74 28  y_select_applet(
12f20 73 6c 6f 74 2c 20 69 64 65 6e 74 69 74 79 2d 3e  slot, identity->
12f30 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 63  pcsc_identity->c
12f40 61 72 64 2e 63 61 63 2e 61 70 70 6c 65 74 2c 20  ard.cac.applet, 
12f50 73 69 7a 65 6f 66 28 69 64 65 6e 74 69 74 79 2d  sizeof(identity-
12f60 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e  >pcsc_identity->
12f70 63 61 72 64 2e 63 61 63 2e 61 70 70 6c 65 74 29  card.cac.applet)
12f80 29 3b 0a 0a 09 09 09 2f 2a 20 53 65 6c 65 63 74  );...../* Select
12f90 20 63 6f 72 72 65 63 74 20 66 69 6c 65 20 2a 2f   correct file */
12fa0 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 6c 65 63  ....cackey_selec
12fb0 74 5f 66 69 6c 65 28 73 6c 6f 74 2c 20 69 64 65  t_file(slot, ide
12fc0 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e  ntity->pcsc_iden
12fd0 74 69 74 79 2d 3e 63 61 72 64 2e 63 61 63 2e 66  tity->card.cac.f
12fe0 69 6c 65 29 3b 0a 09 09 09 62 72 65 61 6b 3b 0a  ile);....break;.
12ff0 09 09 63 61 73 65 20 43 41 43 4b 45 59 5f 49 44  ..case CACKEY_ID
13000 5f 54 59 50 45 5f 50 49 56 3a 0a 09 09 09 64 79  _TYPE_PIV:....dy
13010 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74 65 5b  n_auth_template[
13020 30 5d 20 3d 20 30 78 37 43 3b 0a 09 09 09 64 79  0] = 0x7C;....dy
13030 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74 65 5b  n_auth_template[
13040 31 5d 20 3d 20 30 78 38 32 3b 0a 09 09 09 64 79  1] = 0x82;....dy
13050 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74 65 5b  n_auth_template[
13060 32 5d 20 3d 20 28 28 74 6d 70 62 75 66 6c 65 6e  2] = ((tmpbuflen
13070 20 2b 20 36 29 20 26 20 30 78 66 66 30 30 29 20   + 6) & 0xff00) 
13080 3e 3e 20 38 3b 0a 09 09 09 64 79 6e 5f 61 75 74  >> 8;....dyn_aut
13090 68 5f 74 65 6d 70 6c 61 74 65 5b 33 5d 20 3d 20  h_template[3] = 
130a0 28 74 6d 70 62 75 66 6c 65 6e 20 2b 20 36 29 20  (tmpbuflen + 6) 
130b0 26 20 30 78 30 30 66 66 3b 0a 09 09 09 64 79 6e  & 0x00ff;....dyn
130c0 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74 65 5b 34  _auth_template[4
130d0 5d 20 3d 20 30 78 38 32 3b 0a 09 09 09 64 79 6e  ] = 0x82;....dyn
130e0 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74 65 5b 35  _auth_template[5
130f0 5d 20 3d 20 30 78 30 30 3b 0a 09 09 09 64 79 6e  ] = 0x00;....dyn
13100 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74 65 5b 36  _auth_template[6
13110 5d 20 3d 20 30 78 38 31 3b 0a 09 09 09 64 79 6e  ] = 0x81;....dyn
13120 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74 65 5b 37  _auth_template[7
13130 5d 20 3d 20 30 78 38 32 3b 0a 09 09 09 64 79 6e  ] = 0x82;....dyn
13140 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74 65 5b 38  _auth_template[8
13150 5d 20 3d 20 28 74 6d 70 62 75 66 6c 65 6e 20 26  ] = (tmpbuflen &
13160 20 30 78 66 66 30 30 29 20 3e 3e 20 38 3b 0a 09   0xff00) >> 8;..
13170 09 09 64 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c  ..dyn_auth_templ
13180 61 74 65 5b 39 5d 20 3d 20 74 6d 70 62 75 66 6c  ate[9] = tmpbufl
13190 65 6e 20 26 20 30 78 30 30 66 66 3b 0a 0a 09 09  en & 0x00ff;....
131a0 09 64 79 6e 5f 61 75 74 68 5f 74 6d 70 62 75 66  .dyn_auth_tmpbuf
131b0 20 3d 20 6d 61 6c 6c 6f 63 28 74 6d 70 62 75 66   = malloc(tmpbuf
131c0 6c 65 6e 20 2b 20 73 69 7a 65 6f 66 28 64 79 6e  len + sizeof(dyn
131d0 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74 65 29 29  _auth_template))
131e0 3b 0a 09 09 09 6d 65 6d 63 70 79 28 64 79 6e 5f  ;....memcpy(dyn_
131f0 61 75 74 68 5f 74 6d 70 62 75 66 2c 20 64 79 6e  auth_tmpbuf, dyn
13200 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74 65 2c 20  _auth_template, 
13210 73 69 7a 65 6f 66 28 64 79 6e 5f 61 75 74 68 5f  sizeof(dyn_auth_
13220 74 65 6d 70 6c 61 74 65 29 29 3b 0a 09 09 09 6d  template));....m
13230 65 6d 63 70 79 28 64 79 6e 5f 61 75 74 68 5f 74  emcpy(dyn_auth_t
13240 6d 70 62 75 66 20 2b 20 73 69 7a 65 6f 66 28 64  mpbuf + sizeof(d
13250 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74 65  yn_auth_template
13260 29 2c 20 74 6d 70 62 75 66 2c 20 74 6d 70 62 75  ), tmpbuf, tmpbu
13270 66 6c 65 6e 29 3b 0a 0a 09 09 09 69 66 20 28 66  flen);.....if (f
13280 72 65 65 5f 74 6d 70 62 75 66 29 20 7b 0a 09 09  ree_tmpbuf) {...
13290 09 09 66 72 65 65 28 74 6d 70 62 75 66 29 3b 0a  ..free(tmpbuf);.
132a0 09 09 09 7d 0a 0a 09 09 09 74 6d 70 62 75 66 6c  ...}.....tmpbufl
132b0 65 6e 20 2b 3d 20 73 69 7a 65 6f 66 28 64 79 6e  en += sizeof(dyn
132c0 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74 65 29 3b  _auth_template);
132d0 0a 09 09 09 74 6d 70 62 75 66 20 3d 20 64 79 6e  ....tmpbuf = dyn
132e0 5f 61 75 74 68 5f 74 6d 70 62 75 66 3b 0a 09 09  _auth_tmpbuf;...
132f0 09 66 72 65 65 5f 74 6d 70 62 75 66 20 3d 20 31  .free_tmpbuf = 1
13300 3b 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 63  ;.....break;...c
13310 61 73 65 20 43 41 43 4b 45 59 5f 49 44 5f 54 59  ase CACKEY_ID_TY
13320 50 45 5f 43 45 52 54 5f 4f 4e 4c 59 3a 0a 09 09  PE_CERT_ONLY:...
13330 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 74 6d 70  .break;..}...tmp
13340 62 75 66 5f 73 20 3d 20 74 6d 70 62 75 66 3b 0a  buf_s = tmpbuf;.
13350 09 6f 75 74 62 75 66 5f 73 20 3d 20 6f 75 74 62  .outbuf_s = outb
13360 75 66 3b 0a 09 77 68 69 6c 65 20 28 74 6d 70 62  uf;..while (tmpb
13370 75 66 6c 65 6e 29 20 7b 0a 09 09 74 6d 70 6f 75  uflen) {...tmpou
13380 74 62 75 66 6c 65 6e 20 3d 20 6f 75 74 62 75 66  tbuflen = outbuf
13390 6c 65 6e 3b 0a 0a 09 09 69 66 20 28 74 6d 70 62  len;....if (tmpb
133a0 75 66 6c 65 6e 20 3e 20 43 41 43 4b 45 59 5f 41  uflen > CACKEY_A
133b0 50 44 55 5f 4d 54 55 29 20 7b 0a 09 09 09 62 79  PDU_MTU) {....by
133c0 74 65 73 5f 74 6f 5f 73 65 6e 64 20 3d 20 43 41  tes_to_send = CA
133d0 43 4b 45 59 5f 41 50 44 55 5f 4d 54 55 3b 0a 09  CKEY_APDU_MTU;..
133e0 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 62 79 74  .} else {....byt
133f0 65 73 5f 74 6f 5f 73 65 6e 64 20 3d 20 74 6d 70  es_to_send = tmp
13400 62 75 66 6c 65 6e 3b 0a 09 09 7d 0a 0a 09 09 73  buflen;...}....s
13410 65 6e 64 5f 72 65 74 20 3d 20 43 41 43 4b 45 59  end_ret = CACKEY
13420 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 3b  _PCSC_E_GENERIC;
13430 0a 09 09 73 77 69 74 63 68 20 28 69 64 5f 74 79  ...switch (id_ty
13440 70 65 29 20 7b 0a 09 09 09 63 61 73 65 20 43 41  pe) {....case CA
13450 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43 41 43  CKEY_ID_TYPE_CAC
13460 3a 0a 09 09 09 09 69 66 20 28 74 6d 70 62 75 66  :.....if (tmpbuf
13470 6c 65 6e 20 3e 20 43 41 43 4b 45 59 5f 41 50 44  len > CACKEY_APD
13480 55 5f 4d 54 55 29 20 7b 0a 09 09 09 09 09 70 31  U_MTU) {......p1
13490 20 3d 20 30 78 38 30 3b 0a 09 09 09 09 09 6c 65   = 0x80;......le
134a0 20 3d 20 30 78 30 30 3b 0a 09 09 09 09 7d 20 65   = 0x00;.....} e
134b0 6c 73 65 20 7b 0a 09 09 09 09 09 70 31 20 3d 20  lse {......p1 = 
134c0 30 78 30 30 3b 0a 09 09 09 09 09 6c 65 20 3d 20  0x00;......le = 
134d0 30 78 30 30 3b 0a 09 09 09 09 7d 0a 0a 09 09 09  0x00;.....}.....
134e0 09 73 65 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b  .send_ret = cack
134f0 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f  ey_send_apdu(slo
13500 74 2c 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 47  t, GSCIS_CLASS_G
13510 4c 4f 42 41 4c 5f 50 4c 41 54 46 4f 52 4d 2c 20  LOBAL_PLATFORM, 
13520 47 53 43 49 53 5f 49 4e 53 54 52 5f 53 49 47 4e  GSCIS_INSTR_SIGN
13530 44 45 43 52 59 50 54 2c 20 70 31 2c 20 30 78 30  DECRYPT, p1, 0x0
13540 30 2c 20 62 79 74 65 73 5f 74 6f 5f 73 65 6e 64  0, bytes_to_send
13550 2c 20 74 6d 70 62 75 66 2c 20 6c 65 2c 20 26 72  , tmpbuf, le, &r
13560 65 73 70 63 6f 64 65 2c 20 6f 75 74 62 75 66 2c  espcode, outbuf,
13570 20 26 74 6d 70 6f 75 74 62 75 66 6c 65 6e 29 3b   &tmpoutbuflen);
13580 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
13590 61 73 65 20 43 41 43 4b 45 59 5f 49 44 5f 54 59  ase CACKEY_ID_TY
135a0 50 45 5f 50 49 56 3a 0a 09 09 09 09 69 66 20 28  PE_PIV:.....if (
135b0 74 6d 70 62 75 66 6c 65 6e 20 3e 20 43 41 43 4b  tmpbuflen > CACK
135c0 45 59 5f 41 50 44 55 5f 4d 54 55 29 20 7b 0a 09  EY_APDU_MTU) {..
135d0 09 09 09 09 63 6c 61 73 73 20 3d 20 30 78 31 30  ....class = 0x10
135e0 3b 0a 09 09 09 09 09 6c 65 20 3d 20 30 78 30 30  ;......le = 0x00
135f0 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09  ;.....} else {..
13600 09 09 09 09 63 6c 61 73 73 20 3d 20 47 53 43 49  ....class = GSCI
13610 53 5f 43 4c 41 53 53 5f 49 53 4f 37 38 31 36 3b  S_CLASS_ISO7816;
13620 0a 09 09 09 09 09 6c 65 20 3d 20 32 35 36 3b 0a  ......le = 256;.
13630 09 09 09 09 7d 0a 0a 09 09 09 09 73 65 6e 64 5f  ....}......send_
13640 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e  ret = cackey_sen
13650 64 5f 61 70 64 75 28 73 6c 6f 74 2c 20 63 6c 61  d_apdu(slot, cla
13660 73 73 2c 20 4e 49 53 54 53 50 38 30 30 5f 37 33  ss, NISTSP800_73
13670 5f 33 5f 49 4e 53 54 52 5f 47 45 4e 41 55 54 48  _3_INSTR_GENAUTH
13680 2c 20 4e 49 53 54 53 50 38 30 30 5f 37 38 5f 33  , NISTSP800_78_3
13690 5f 41 4c 47 4f 5f 52 53 41 32 30 34 38 2c 20 69  _ALGO_RSA2048, i
136a0 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64  dentity->pcsc_id
136b0 65 6e 74 69 74 79 2d 3e 63 61 72 64 2e 70 69 76  entity->card.piv
136c0 2e 6b 65 79 5f 69 64 2c 20 62 79 74 65 73 5f 74  .key_id, bytes_t
136d0 6f 5f 73 65 6e 64 2c 20 74 6d 70 62 75 66 2c 20  o_send, tmpbuf, 
136e0 6c 65 2c 20 26 72 65 73 70 63 6f 64 65 2c 20 6f  le, &respcode, o
136f0 75 74 62 75 66 2c 20 26 74 6d 70 6f 75 74 62 75  utbuf, &tmpoutbu
13700 66 6c 65 6e 29 3b 0a 09 09 09 09 62 72 65 61 6b  flen);.....break
13710 3b 0a 09 09 09 63 61 73 65 20 43 41 43 4b 45 59  ;....case CACKEY
13720 5f 49 44 5f 54 59 50 45 5f 43 45 52 54 5f 4f 4e  _ID_TYPE_CERT_ON
13730 4c 59 3a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  LY:.....break;..
13740 09 7d 0a 0a 09 09 69 66 20 28 73 65 6e 64 5f 72  .}....if (send_r
13750 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53  et != CACKEY_PCS
13760 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 69 66 20  C_S_OK) {....if 
13770 28 66 72 65 65 5f 74 6d 70 62 75 66 29 20 7b 0a  (free_tmpbuf) {.
13780 09 09 09 09 69 66 20 28 74 6d 70 62 75 66 5f 73  ....if (tmpbuf_s
13790 29 20 7b 0a 09 09 09 09 09 66 72 65 65 28 74 6d  ) {......free(tm
137a0 70 62 75 66 5f 73 29 3b 0a 09 09 09 09 7d 0a 09  pbuf_s);.....}..
137b0 09 09 7d 0a 0a 09 09 09 2f 2a 20 45 6e 64 20 74  ..}...../* End t
137c0 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 09  ransaction */...
137d0 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e  .cackey_end_tran
137e0 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a  saction(slot);..
137f0 09 09 09 69 66 20 28 73 65 6e 64 5f 72 65 74 20  ...if (send_ret 
13800 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  == CACKEY_PCSC_E
13810 5f 52 45 54 52 59 29 20 7b 0a 09 09 09 09 43 41  _RETRY) {.....CA
13820 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
13830 46 28 22 41 44 50 55 20 53 65 6e 64 69 6e 67 20  F("ADPU Sending 
13840 46 61 69 6c 65 64 20 2d 2d 20 72 65 74 72 79 69  Failed -- retryi
13850 6e 67 2e 22 29 3b 0a 0a 09 09 09 09 72 65 74 75  ng.");......retu
13860 72 6e 28 63 61 63 6b 65 79 5f 73 69 67 6e 64 65  rn(cackey_signde
13870 63 72 79 70 74 28 73 6c 6f 74 2c 20 69 64 65 6e  crypt(slot, iden
13880 74 69 74 79 2c 20 62 75 66 2c 20 62 75 66 6c 65  tity, buf, bufle
13890 6e 2c 20 6f 75 74 62 75 66 2c 20 6f 75 74 62 75  n, outbuf, outbu
138a0 66 6c 65 6e 2c 20 70 61 64 49 6e 70 75 74 2c 20  flen, padInput, 
138b0 75 6e 70 61 64 4f 75 74 70 75 74 29 29 3b 0a 09  unpadOutput));..
138c0 09 09 7d 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44  ..}.....CACKEY_D
138d0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 41 44 50  EBUG_PRINTF("ADP
138e0 55 20 53 65 6e 64 69 6e 67 20 46 61 69 6c 65 64  U Sending Failed
138f0 20 2d 2d 20 72 65 74 75 72 6e 69 6e 67 20 69 6e   -- returning in
13900 20 65 72 72 6f 72 2e 22 29 3b 0a 0a 09 09 09 69   error.");.....i
13910 66 20 28 72 65 73 70 63 6f 64 65 20 3d 3d 20 30  f (respcode == 0
13920 78 36 39 38 32 20 7c 7c 20 72 65 73 70 63 6f 64  x6982 || respcod
13930 65 20 3d 3d 20 30 78 36 65 30 30 29 20 7b 0a 09  e == 0x6e00) {..
13940 09 09 09 69 66 20 28 72 65 73 70 63 6f 64 65 20  ...if (respcode 
13950 3d 3d 20 30 78 36 45 30 30 29 20 7b 0a 09 09 09  == 0x6E00) {....
13960 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
13970 52 49 4e 54 46 28 22 47 6f 74 20 5c 22 57 52 4f  RINTF("Got \"WRO
13980 4e 47 20 43 4c 41 53 53 5c 22 2c 20 74 68 69 73  NG CLASS\", this
13990 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 74 61   means we are ta
139a0 6c 6b 69 6e 67 20 74 6f 20 74 68 65 20 77 72 6f  lking to the wro
139b0 6e 67 20 6f 62 6a 65 63 74 20 28 6c 69 6b 65 6c  ng object (likel
139c0 79 20 62 65 63 61 75 73 65 20 74 68 65 20 63 61  y because the ca
139d0 72 64 20 77 65 6e 74 20 61 77 61 79 29 20 2d 2d  rd went away) --
139e0 20 72 65 73 65 74 74 69 6e 67 22 29 3b 0a 09 09   resetting");...
139f0 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09  ..} else {......
13a00 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
13a10 4e 54 46 28 22 53 65 63 75 72 69 74 79 20 73 74  NTF("Security st
13a20 61 74 75 73 20 6e 6f 74 20 73 61 74 69 73 69 66  atus not satisif
13a30 69 65 64 20 28 72 65 73 70 63 6f 64 65 20 3d 20  ied (respcode = 
13a40 30 78 25 30 34 78 29 2e 20 20 52 65 74 75 72 6e  0x%04x).  Return
13a50 69 6e 67 20 4e 45 45 44 4c 4f 47 49 4e 22 2c 20  ing NEEDLOGIN", 
13a60 28 69 6e 74 29 20 72 65 73 70 63 6f 64 65 29 3b  (int) respcode);
13a70 0a 09 09 09 09 7d 0a 0a 09 09 09 09 63 61 63 6b  .....}......cack
13a80 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65 73  ey_mark_slot_res
13a90 65 74 28 73 6c 6f 74 29 3b 0a 0a 09 09 09 09 73  et(slot);......s
13aa0 6c 6f 74 2d 3e 74 6f 6b 65 6e 5f 66 6c 61 67 73  lot->token_flags
13ab0 20 3d 20 43 4b 46 5f 4c 4f 47 49 4e 5f 52 45 51   = CKF_LOGIN_REQ
13ac0 55 49 52 45 44 3b 0a 0a 09 09 09 09 72 65 74 75  UIRED;......retu
13ad0 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  rn(CACKEY_PCSC_E
13ae0 5f 4e 45 45 44 4c 4f 47 49 4e 29 3b 0a 09 09 09  _NEEDLOGIN);....
13af0 7d 0a 0a 09 09 09 69 66 20 28 73 65 6e 64 5f 72  }.....if (send_r
13b00 65 74 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53  et == CACKEY_PCS
13b10 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29  C_E_TOKENABSENT)
13b20 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45   {.....CACKEY_DE
13b30 42 55 47 5f 50 52 49 4e 54 46 28 22 54 6f 6b 65  BUG_PRINTF("Toke
13b40 6e 20 61 62 73 65 6e 74 2e 20 20 52 65 74 75 72  n absent.  Retur
13b50 6e 69 6e 67 20 54 4f 4b 45 4e 41 42 53 45 4e 54  ning TOKENABSENT
13b60 22 29 3b 0a 0a 09 09 09 09 63 61 63 6b 65 79 5f  ");......cackey_
13b70 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74 28  mark_slot_reset(
13b80 73 6c 6f 74 29 3b 0a 0a 09 09 09 09 72 65 74 75  slot);......retu
13b90 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  rn(CACKEY_PCSC_E
13ba0 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b 0a 09  _TOKENABSENT);..
13bb0 09 09 7d 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44  ..}.....CACKEY_D
13bc0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 6f 6d  EBUG_PRINTF("Som
13bd0 65 74 68 69 6e 67 20 77 65 6e 74 20 77 72 6f 6e  ething went wron
13be0 67 20 64 75 72 69 6e 67 20 73 69 67 6e 69 6e 67  g during signing
13bf0 2c 20 72 65 73 65 74 74 69 6e 67 20 74 68 65 20  , resetting the 
13c00 73 6c 6f 74 20 61 6e 64 20 68 6f 70 69 6e 67 20  slot and hoping 
13c10 66 6f 72 20 74 68 65 20 62 65 73 74 2e 22 29 3b  for the best.");
13c20 0a 0a 09 09 09 63 61 63 6b 65 79 5f 6d 61 72 6b  .....cackey_mark
13c30 5f 73 6c 6f 74 5f 72 65 73 65 74 28 73 6c 6f 74  _slot_reset(slot
13c40 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 41  );.....return(CA
13c50 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45  CKEY_PCSC_E_GENE
13c60 52 49 43 29 3b 0a 09 09 7d 0a 0a 09 09 74 6d 70  RIC);...}....tmp
13c70 62 75 66 20 2b 3d 20 62 79 74 65 73 5f 74 6f 5f  buf += bytes_to_
13c80 73 65 6e 64 3b 0a 09 09 74 6d 70 62 75 66 6c 65  send;...tmpbufle
13c90 6e 20 2d 3d 20 62 79 74 65 73 5f 74 6f 5f 73 65  n -= bytes_to_se
13ca0 6e 64 3b 0a 0a 09 09 6f 75 74 62 75 66 20 2b 3d  nd;....outbuf +=
13cb0 20 74 6d 70 6f 75 74 62 75 66 6c 65 6e 3b 0a 09   tmpoutbuflen;..
13cc0 09 6f 75 74 62 75 66 6c 65 6e 20 2d 3d 20 74 6d  .outbuflen -= tm
13cd0 70 6f 75 74 62 75 66 6c 65 6e 3b 0a 09 09 72 65  poutbuflen;...re
13ce0 74 76 61 6c 20 2b 3d 20 74 6d 70 6f 75 74 62 75  tval += tmpoutbu
13cf0 66 6c 65 6e 3b 0a 09 7d 0a 0a 09 69 66 20 28 66  flen;..}...if (f
13d00 72 65 65 5f 74 6d 70 62 75 66 29 20 7b 0a 09 09  ree_tmpbuf) {...
13d10 69 66 20 28 74 6d 70 62 75 66 5f 73 29 20 7b 0a  if (tmpbuf_s) {.
13d20 09 09 09 66 72 65 65 28 74 6d 70 62 75 66 5f 73  ...free(tmpbuf_s
13d30 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 6f 75 74 62  );...}..}...outb
13d40 75 66 20 3d 20 6f 75 74 62 75 66 5f 73 3b 0a 0a  uf = outbuf_s;..
13d50 09 2f 2a 20 45 6e 64 20 74 72 61 6e 73 61 63 74  ./* End transact
13d60 69 6f 6e 20 2a 2f 0a 09 63 61 63 6b 65 79 5f 65  ion */..cackey_e
13d70 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73  nd_transaction(s
13d80 6c 6f 74 29 3b 0a 0a 23 69 66 64 65 66 20 43 41  lot);..#ifdef CA
13d90 43 4b 45 59 5f 50 41 52 41 4e 4f 49 44 0a 23 20  CKEY_PARANOID.# 
13da0 20 69 66 64 65 66 20 5f 50 4f 53 49 58 5f 53 53   ifdef _POSIX_SS
13db0 49 5a 45 5f 4d 41 58 0a 09 69 66 20 28 6f 75 74  IZE_MAX..if (out
13dc0 62 75 66 6c 65 6e 20 3e 20 5f 50 4f 53 49 58 5f  buflen > _POSIX_
13dd0 53 53 49 5a 45 5f 4d 41 58 29 20 7b 0a 09 09 43  SSIZE_MAX) {...C
13de0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
13df0 54 46 28 22 4f 75 74 62 75 66 6c 65 6e 20 65 78  TF("Outbuflen ex
13e00 63 65 65 64 73 20 6d 61 78 69 6d 75 6d 20 76 61  ceeds maximum va
13e10 6c 75 65 2c 20 72 65 74 75 72 6e 69 6e 67 20 69  lue, returning i
13e20 6e 20 66 61 69 6c 75 72 65 2e 20 28 6d 61 78 20  n failure. (max 
13e30 3d 20 25 6c 69 2c 20 6f 75 74 62 75 66 6c 65 6e  = %li, outbuflen
13e40 20 3d 20 25 6c 75 29 22 2c 20 28 6c 6f 6e 67 29   = %lu)", (long)
13e50 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41   _POSIX_SSIZE_MA
13e60 58 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  X, (unsigned lon
13e70 67 29 20 6f 75 74 62 75 66 6c 65 6e 29 3b 0a 0a  g) outbuflen);..
13e80 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d  ..return(-1);..}
13e90 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69 66  .#  endif.#endif
13ea0 0a 0a 09 2f 2a 20 57 65 20 6d 75 73 74 20 72 65  .../* We must re
13eb0 6d 6f 76 65 20 74 68 65 20 22 37 43 22 20 74 61  move the "7C" ta
13ec0 67 20 74 6f 20 67 65 74 20 74 6f 20 74 68 65 20  g to get to the 
13ed0 73 69 67 6e 61 74 75 72 65 20 2a 2f 0a 09 73 77  signature */..sw
13ee0 69 74 63 68 20 28 69 64 5f 74 79 70 65 29 20 7b  itch (id_type) {
13ef0 0a 09 09 63 61 73 65 20 43 41 43 4b 45 59 5f 49  ...case CACKEY_I
13f00 44 5f 54 59 50 45 5f 50 49 56 3a 0a 09 09 09 6f  D_TYPE_PIV:....o
13f10 75 74 62 75 66 5f 6c 65 6e 20 3d 20 72 65 74 76  utbuf_len = retv
13f20 61 6c 3b 0a 09 09 09 6f 75 74 62 75 66 5f 70 20  al;....outbuf_p 
13f30 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 62 65  = cackey_read_be
13f40 72 74 6c 76 5f 74 61 67 28 6f 75 74 62 75 66 2c  rtlv_tag(outbuf,
13f50 20 26 6f 75 74 62 75 66 5f 6c 65 6e 2c 20 30 78   &outbuf_len, 0x
13f60 37 43 2c 20 4e 55 4c 4c 2c 20 20 26 6f 75 74 62  7C, NULL,  &outb
13f70 75 66 5f 6c 65 6e 29 3b 0a 09 09 09 69 66 20 28  uf_len);....if (
13f80 6f 75 74 62 75 66 5f 70 20 3d 3d 20 4e 55 4c 4c  outbuf_p == NULL
13f90 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  ) {.....CACKEY_D
13fa0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 73  EBUG_PRINTF("Res
13fb0 70 6f 6e 73 65 20 66 72 6f 6d 20 50 49 56 20 66  ponse from PIV f
13fc0 6f 72 20 47 45 4e 45 52 41 54 45 20 41 55 54 48  or GENERATE AUTH
13fd0 45 4e 54 49 43 41 54 49 4f 4e 20 77 61 73 20 6e  ENTICATION was n
13fe0 6f 74 20 61 20 30 78 37 43 20 74 61 67 2c 20 72  ot a 0x7C tag, r
13ff0 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
14000 75 72 65 22 29 3b 0a 0a 09 09 09 09 72 65 74 75  ure");......retu
14010 72 6e 28 2d 31 29 3b 0a 09 09 09 7d 0a 0a 09 09  rn(-1);....}....
14020 09 72 65 74 76 61 6c 20 3d 20 6f 75 74 62 75 66  .retval = outbuf
14030 5f 6c 65 6e 3b 0a 0a 09 09 09 6f 75 74 62 75 66  _len;.....outbuf
14040 5f 6c 65 6e 20 3d 20 72 65 74 76 61 6c 3b 0a 09  _len = retval;..
14050 09 09 6f 75 74 62 75 66 5f 70 20 3d 20 63 61 63  ..outbuf_p = cac
14060 6b 65 79 5f 72 65 61 64 5f 62 65 72 74 6c 76 5f  key_read_bertlv_
14070 74 61 67 28 6f 75 74 62 75 66 2c 20 26 6f 75 74  tag(outbuf, &out
14080 62 75 66 5f 6c 65 6e 2c 20 30 78 38 32 2c 20 4e  buf_len, 0x82, N
14090 55 4c 4c 2c 20 20 26 6f 75 74 62 75 66 5f 6c 65  ULL,  &outbuf_le
140a0 6e 29 3b 0a 09 09 09 69 66 20 28 6f 75 74 62 75  n);....if (outbu
140b0 66 5f 70 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  f_p == NULL) {..
140c0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
140d0 50 52 49 4e 54 46 28 22 52 65 73 70 6f 6e 73 65  PRINTF("Response
140e0 20 66 72 6f 6d 20 50 49 56 20 66 6f 72 20 47 45   from PIV for GE
140f0 4e 45 52 41 54 45 20 41 55 54 48 45 4e 54 49 43  NERATE AUTHENTIC
14100 41 54 49 4f 4e 20 77 61 73 20 6e 6f 74 20 61 20  ATION was not a 
14110 30 78 38 32 20 77 69 74 68 69 6e 20 61 20 30 78  0x82 within a 0x
14120 37 43 20 74 61 67 2c 20 72 65 74 75 72 6e 69 6e  7C tag, returnin
14130 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a  g in failure");.
14140 0a 09 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b  .....return(-1);
14150 0a 09 09 09 7d 0a 0a 09 09 09 72 65 74 76 61 6c  ....}.....retval
14160 20 3d 20 6f 75 74 62 75 66 5f 6c 65 6e 3b 0a 0a   = outbuf_len;..
14170 09 09 09 62 72 65 61 6b 3b 0a 09 09 63 61 73 65  ...break;...case
14180 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f   CACKEY_ID_TYPE_
14190 43 41 43 3a 0a 09 09 63 61 73 65 20 43 41 43 4b  CAC:...case CACK
141a0 45 59 5f 49 44 5f 54 59 50 45 5f 43 45 52 54 5f  EY_ID_TYPE_CERT_
141b0 4f 4e 4c 59 3a 0a 09 09 09 62 72 65 61 6b 3b 0a  ONLY:....break;.
141c0 09 7d 0a 0a 09 2f 2a 20 55 6e 70 61 64 20 72 65  .}.../* Unpad re
141d0 70 6c 79 20 2a 2f 0a 09 69 66 20 28 75 6e 70 61  ply */..if (unpa
141e0 64 4f 75 74 70 75 74 29 20 7b 0a 09 09 69 66 20  dOutput) {...if 
141f0 28 72 65 74 76 61 6c 20 3c 20 33 29 20 7b 0a 09  (retval < 3) {..
14200 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
14210 52 49 4e 54 46 28 22 52 65 70 6c 79 20 69 73 20  RINTF("Reply is 
14220 74 6f 6f 20 73 6d 61 6c 6c 2c 20 77 65 20 61 72  too small, we ar
14230 65 20 6e 6f 74 20 61 62 6c 65 20 74 6f 20 75 6e  e not able to un
14240 70 61 64 20 2d 2d 20 70 61 73 73 69 6e 67 20 62  pad -- passing b
14250 61 63 6b 20 61 6e 64 20 68 6f 70 69 6e 67 20 66  ack and hoping f
14260 6f 72 20 74 68 65 20 62 65 73 74 21 22 29 3b 0a  or the best!");.
14270 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
14280 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
14290 6e 67 20 69 6e 20 73 75 63 63 65 73 73 2c 20 72  ng in success, r
142a0 65 74 76 61 6c 20 3d 20 25 6c 69 20 28 62 79 74  etval = %li (byt
142b0 65 73 29 22 2c 20 28 6c 6f 6e 67 29 20 72 65 74  es)", (long) ret
142c0 76 61 6c 29 3b 0a 09 09 09 72 65 74 75 72 6e 28  val);....return(
142d0 72 65 74 76 61 6c 29 3b 0a 09 09 7d 0a 0a 09 09  retval);...}....
142e0 69 66 20 28 6f 75 74 62 75 66 5b 30 5d 20 21 3d  if (outbuf[0] !=
142f0 20 30 78 30 30 29 20 7b 0a 09 09 09 43 41 43 4b   0x00) {....CACK
14300 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
14310 22 55 6e 72 65 63 6f 67 6e 69 7a 65 64 20 70 61  "Unrecognized pa
14320 64 64 69 6e 67 20 73 63 68 65 6d 65 20 2d 2d 20  dding scheme -- 
14330 70 61 73 73 69 6e 67 20 62 61 63 6b 20 61 6e 64  passing back and
14340 20 68 6f 70 69 6e 67 20 66 6f 72 20 74 68 65 20   hoping for the 
14350 62 65 73 74 21 22 29 3b 0a 0a 09 09 09 43 41 43  best!");.....CAC
14360 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
14370 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 73  ("Returning in s
14380 75 63 63 65 73 73 2c 20 72 65 74 76 61 6c 20 3d  uccess, retval =
14390 20 25 6c 69 20 28 62 79 74 65 73 29 22 2c 20 28   %li (bytes)", (
143a0 6c 6f 6e 67 29 20 72 65 74 76 61 6c 29 3b 0a 09  long) retval);..
143b0 09 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29  ..return(retval)
143c0 3b 0a 09 09 7d 0a 0a 09 09 62 6c 6f 63 6b 74 79  ;...}....blockty
143d0 70 65 20 3d 20 6f 75 74 62 75 66 5b 31 5d 3b 0a  pe = outbuf[1];.
143e0 09 09 75 6e 70 61 64 6f 66 66 73 65 74 20 3d 20  ..unpadoffset = 
143f0 30 3b 0a 0a 09 09 73 77 69 74 63 68 20 28 62 6c  0;....switch (bl
14400 6f 63 6b 74 79 70 65 29 20 7b 0a 09 09 09 63 61  ocktype) {....ca
14410 73 65 20 30 78 30 30 3a 0a 09 09 09 09 2f 2a 20  se 0x00:...../* 
14420 50 61 64 64 69 6e 67 20 53 63 68 65 6d 65 20 31  Padding Scheme 1
14430 2c 20 74 68 65 20 66 69 72 73 74 20 6e 6f 6e 2d  , the first non-
14440 7a 65 72 6f 20 62 79 74 65 20 69 73 20 74 68 65  zero byte is the
14450 20 73 74 61 72 74 20 6f 66 20 64 61 74 61 20 2a   start of data *
14460 2f 0a 09 09 09 09 66 6f 72 20 28 75 6e 70 61 64  /.....for (unpad
14470 6f 66 66 73 65 74 20 3d 20 32 3b 20 75 6e 70 61  offset = 2; unpa
14480 64 6f 66 66 73 65 74 20 3c 20 72 65 74 76 61 6c  doffset < retval
14490 3b 20 75 6e 70 61 64 6f 66 66 73 65 74 2b 2b 29  ; unpadoffset++)
144a0 20 7b 0a 09 09 09 09 09 69 66 20 28 6f 75 74 62   {......if (outb
144b0 75 66 5b 75 6e 70 61 64 6f 66 66 73 65 74 5d 20  uf[unpadoffset] 
144c0 21 3d 20 30 78 30 30 29 20 7b 0a 09 09 09 09 09  != 0x00) {......
144d0 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 7d 0a 09  .break;......}..
144e0 09 09 09 7d 0a 09 09 09 09 62 72 65 61 6b 3b 0a  ...}.....break;.
144f0 09 09 09 63 61 73 65 20 30 78 30 31 3a 0a 09 09  ...case 0x01:...
14500 09 09 2f 2a 20 50 61 64 64 69 6e 67 20 53 63 68  ../* Padding Sch
14510 65 6d 65 20 32 2c 20 70 61 64 20 62 79 74 65 73  eme 2, pad bytes
14520 20 61 72 65 20 30 78 46 46 20 66 6f 6c 6c 6f 77   are 0xFF follow
14530 65 64 20 62 79 20 30 78 30 30 20 2a 2f 0a 09 09  ed by 0x00 */...
14540 09 09 66 6f 72 20 28 75 6e 70 61 64 6f 66 66 73  ..for (unpadoffs
14550 65 74 20 3d 20 32 3b 20 75 6e 70 61 64 6f 66 66  et = 2; unpadoff
14560 73 65 74 20 3c 20 72 65 74 76 61 6c 3b 20 75 6e  set < retval; un
14570 70 61 64 6f 66 66 73 65 74 2b 2b 29 20 7b 0a 09  padoffset++) {..
14580 09 09 09 09 69 66 20 28 6f 75 74 62 75 66 5b 75  ....if (outbuf[u
14590 6e 70 61 64 6f 66 66 73 65 74 5d 20 21 3d 20 30  npadoffset] != 0
145a0 78 46 46 29 20 7b 0a 09 09 09 09 09 09 69 66 20  xFF) {.......if 
145b0 28 6f 75 74 62 75 66 5b 75 6e 70 61 64 6f 66 66  (outbuf[unpadoff
145c0 73 65 74 5d 20 3d 3d 20 30 78 30 30 29 20 7b 0a  set] == 0x00) {.
145d0 09 09 09 09 09 09 09 75 6e 70 61 64 6f 66 66 73  .......unpadoffs
145e0 65 74 2b 2b 3b 0a 0a 09 09 09 09 09 09 09 62 72  et++;.........br
145f0 65 61 6b 3b 0a 09 09 09 09 09 09 7d 20 65 6c 73  eak;.......} els
14600 65 20 7b 0a 09 09 09 09 09 09 09 43 41 43 4b 45  e {........CACKE
14610 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
14620 49 6e 76 61 6c 69 64 20 70 61 64 64 69 6e 67 20  Invalid padding 
14630 64 61 74 61 20 66 6f 75 6e 64 2c 20 72 65 74 75  data found, retu
14640 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65  rning in failure
14650 2c 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65  , should have be
14660 65 6e 20 30 78 30 30 20 66 6f 75 6e 64 20 30 78  en 0x00 found 0x
14670 25 30 32 78 22 2c 20 28 75 6e 73 69 67 6e 65 64  %02x", (unsigned
14680 20 69 6e 74 29 20 6f 75 74 62 75 66 5b 75 6e 70   int) outbuf[unp
14690 61 64 6f 66 66 73 65 74 5d 29 3b 0a 0a 09 09 09  adoffset]);.....
146a0 09 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a  ....return(-1);.
146b0 09 09 09 09 09 09 7d 0a 09 09 09 09 09 7d 20 65  ......}......} e
146c0 6c 73 65 20 7b 0a 09 09 09 09 09 09 43 41 43 4b  lse {.......CACK
146d0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
146e0 22 49 6e 76 61 6c 69 64 20 70 61 64 64 69 6e 67  "Invalid padding
146f0 20 64 61 74 61 20 66 6f 75 6e 64 2c 20 72 65 74   data found, ret
14700 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
14710 65 2c 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62  e, should have b
14720 65 65 6e 20 30 78 46 46 20 66 6f 75 6e 64 20 30  een 0xFF found 0
14730 78 25 30 32 78 22 2c 20 28 75 6e 73 69 67 6e 65  x%02x", (unsigne
14740 64 20 69 6e 74 29 20 6f 75 74 62 75 66 5b 75 6e  d int) outbuf[un
14750 70 61 64 6f 66 66 73 65 74 5d 29 3b 0a 0a 09 09  padoffset]);....
14760 09 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a  ....return(-1);.
14770 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 09 09 09  .....}.....}....
14780 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
14790 30 78 30 32 3a 0a 09 09 09 09 2f 2a 20 50 61 64  0x02:...../* Pad
147a0 64 69 6e 67 20 53 63 68 65 6d 65 20 33 2c 20 70  ding Scheme 3, p
147b0 61 64 20 62 79 74 65 73 20 61 72 65 20 6e 6f 6e  ad bytes are non
147c0 2d 7a 65 72 6f 20 66 69 72 73 74 20 7a 65 72 6f  -zero first zero
147d0 20 62 79 74 65 20 66 6f 75 6e 64 20 69 73 20 74   byte found is t
147e0 68 65 20 73 65 70 65 72 61 74 6f 72 20 62 79 74  he seperator byt
147f0 65 20 2a 2f 0a 09 09 09 09 66 6f 72 20 28 75 6e  e */.....for (un
14800 70 61 64 6f 66 66 73 65 74 20 3d 20 32 3b 20 75  padoffset = 2; u
14810 6e 70 61 64 6f 66 66 73 65 74 20 3c 20 72 65 74  npadoffset < ret
14820 76 61 6c 3b 20 75 6e 70 61 64 6f 66 66 73 65 74  val; unpadoffset
14830 2b 2b 29 20 7b 0a 09 09 09 09 09 69 66 20 28 6f  ++) {......if (o
14840 75 74 62 75 66 5b 75 6e 70 61 64 6f 66 66 73 65  utbuf[unpadoffse
14850 74 5d 20 3d 3d 20 30 78 30 30 29 20 7b 0a 09 09  t] == 0x00) {...
14860 09 09 09 09 75 6e 70 61 64 6f 66 66 73 65 74 2b  ....unpadoffset+
14870 2b 3b 0a 0a 09 09 09 09 09 09 62 72 65 61 6b 3b  +;........break;
14880 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 09 09  ......}.....}...
14890 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09  ..break;...}....
148a0 69 66 20 28 75 6e 70 61 64 6f 66 66 73 65 74 20  if (unpadoffset 
148b0 3e 20 72 65 74 76 61 6c 29 20 7b 0a 09 09 09 43  > retval) {....C
148c0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
148d0 54 46 28 22 4f 66 66 73 65 74 20 67 72 65 61 74  TF("Offset great
148e0 65 72 20 74 68 61 6e 20 72 65 70 6c 79 20 73 69  er than reply si
148f0 7a 65 2c 20 61 62 6f 72 74 69 6e 67 2e 20 20 28  ze, aborting.  (
14900 75 6e 70 61 64 6f 66 66 73 65 74 20 3d 20 25 6c  unpadoffset = %l
14910 75 2c 20 72 65 74 76 61 6c 20 3d 20 25 6c 75 29  u, retval = %lu)
14920 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
14930 67 29 20 75 6e 70 61 64 6f 66 66 73 65 74 2c 20  g) unpadoffset, 
14940 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
14950 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09 72 65 74  retval);.....ret
14960 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09 09  urn(-1);...}....
14970 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
14980 4e 54 42 55 46 28 22 50 61 64 64 65 64 3a 22 2c  NTBUF("Padded:",
14990 20 6f 75 74 62 75 66 2c 20 72 65 74 76 61 6c 29   outbuf, retval)
149a0 3b 0a 0a 09 09 72 65 74 76 61 6c 20 2d 3d 20 75  ;....retval -= u
149b0 6e 70 61 64 6f 66 66 73 65 74 3b 0a 09 09 6d 65  npadoffset;...me
149c0 6d 6d 6f 76 65 28 6f 75 74 62 75 66 2c 20 6f 75  mmove(outbuf, ou
149d0 74 62 75 66 20 2b 20 75 6e 70 61 64 6f 66 66 73  tbuf + unpadoffs
149e0 65 74 2c 20 72 65 74 76 61 6c 29 3b 0a 0a 09 09  et, retval);....
149f0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
14a00 4e 54 42 55 46 28 22 55 6e 70 61 64 64 65 64 3a  NTBUF("Unpadded:
14a10 22 2c 20 6f 75 74 62 75 66 2c 20 72 65 74 76 61  ", outbuf, retva
14a20 6c 29 3b 0a 09 7d 0a 0a 0a 09 43 41 43 4b 45 59  l);..}....CACKEY
14a30 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
14a40 65 74 75 72 6e 69 6e 67 20 69 6e 20 73 75 63 63  eturning in succ
14a50 65 73 73 2c 20 72 65 74 76 61 6c 20 3d 20 25 6c  ess, retval = %l
14a60 69 20 28 62 79 74 65 73 29 22 2c 20 28 6c 6f 6e  i (bytes)", (lon
14a70 67 29 20 72 65 74 76 61 6c 29 3b 0a 0a 09 72 65  g) retval);...re
14a80 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a  turn(retval);.}.
14a90 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a  ./*. * SYNPOSIS.
14aa0 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a   *     .... *. *
14ab0 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20   ARGUMENTS. *   
14ac0 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54 55    .... *. * RETU
14ad0 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20  RN VALUE. *     
14ae0 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a  .... *. * NOTES.
14af0 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a   *     .... *. *
14b00 2f 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f  /.static cackey_
14b10 72 65 74 20 63 61 63 6b 65 79 5f 74 6f 6b 65 6e  ret cackey_token
14b20 5f 70 72 65 73 65 6e 74 28 73 74 72 75 63 74 20  _present(struct 
14b30 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f  cackey_slot *slo
14b40 74 29 20 7b 0a 09 63 61 63 6b 65 79 5f 72 65 74  t) {..cackey_ret
14b50 20 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65   pcsc_connect_re
14b60 74 3b 0a 09 44 57 4f 52 44 20 72 65 61 64 65 72  t;..DWORD reader
14b70 5f 6c 65 6e 20 3d 20 30 2c 20 73 74 61 74 65 20  _len = 0, state 
14b80 3d 20 30 2c 20 70 72 6f 74 6f 63 6f 6c 20 3d 20  = 0, protocol = 
14b90 30 2c 20 61 74 72 5f 6c 65 6e 3b 0a 09 42 59 54  0, atr_len;..BYT
14ba0 45 20 61 74 72 5b 4d 41 58 5f 41 54 52 5f 53 49  E atr[MAX_ATR_SI
14bb0 5a 45 5d 3b 0a 09 4c 4f 4e 47 20 73 74 61 74 75  ZE];..LONG statu
14bc0 73 5f 72 65 74 2c 20 73 63 61 72 64 5f 72 65 63  s_ret, scard_rec
14bd0 6f 6e 6e 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45  onn_ret;...CACKE
14be0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
14bf0 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
14c00 28 73 6c 6f 74 2d 3e 69 6e 74 65 72 6e 61 6c 29  (slot->internal)
14c10 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
14c20 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
14c30 69 6e 67 20 74 6f 6b 65 6e 20 70 72 65 73 65 6e  ing token presen
14c40 74 20 28 69 6e 74 65 72 6e 61 6c 20 74 6f 6b 65  t (internal toke
14c50 6e 29 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  n)");....return(
14c60 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 54 4f  CACKEY_PCSC_S_TO
14c70 4b 45 4e 50 52 45 53 45 4e 54 29 3b 0a 09 7d 0a  KENPRESENT);..}.
14c80 0a 09 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72  ..pcsc_connect_r
14c90 65 74 20 3d 20 63 61 63 6b 65 79 5f 63 6f 6e 6e  et = cackey_conn
14ca0 65 63 74 5f 63 61 72 64 28 73 6c 6f 74 29 3b 0a  ect_card(slot);.
14cb0 09 69 66 20 28 70 63 73 63 5f 63 6f 6e 6e 65 63  .if (pcsc_connec
14cc0 74 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f  t_ret != CACKEY_
14cd0 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43  PCSC_S_OK) {...C
14ce0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
14cf0 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 63 6f  TF("Unable to co
14d00 6e 6e 65 63 74 20 74 6f 20 63 61 72 64 2c 20 72  nnect to card, r
14d10 65 74 75 72 6e 69 6e 67 20 74 6f 6b 65 6e 20 61  eturning token a
14d20 62 73 65 6e 74 22 29 3b 0a 0a 09 09 72 65 74 75  bsent");....retu
14d30 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  rn(CACKEY_PCSC_E
14d40 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b 0a 09  _TOKENABSENT);..
14d50 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
14d60 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 69 6e 67  _PRINTF("Calling
14d70 20 53 43 61 72 64 53 74 61 74 75 73 28 29 20 74   SCardStatus() t
14d80 6f 20 64 65 74 65 72 6d 69 6e 65 20 63 61 72 64  o determine card
14d90 20 73 74 61 74 75 73 22 29 3b 0a 0a 09 61 74 72   status");...atr
14da0 5f 6c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 61 74  _len = sizeof(at
14db0 72 29 3b 0a 09 73 74 61 74 75 73 5f 72 65 74 20  r);..status_ret 
14dc0 3d 20 53 43 61 72 64 53 74 61 74 75 73 28 73 6c  = SCardStatus(sl
14dd0 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 4e  ot->pcsc_card, N
14de0 55 4c 4c 2c 20 26 72 65 61 64 65 72 5f 6c 65 6e  ULL, &reader_len
14df0 2c 20 26 73 74 61 74 65 2c 20 26 70 72 6f 74 6f  , &state, &proto
14e00 63 6f 6c 2c 20 61 74 72 2c 20 26 61 74 72 5f 6c  col, atr, &atr_l
14e10 65 6e 29 3b 0a 0a 09 69 66 20 28 73 74 61 74 75  en);...if (statu
14e20 73 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 45  s_ret == SCARD_E
14e30 5f 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 29  _INVALID_HANDLE)
14e40 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
14e50 47 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64 53  G_PRINTF("SCardS
14e60 74 61 74 75 73 28 29 20 72 65 74 75 72 6e 65 64  tatus() returned
14e70 20 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44   SCARD_E_INVALID
14e80 5f 48 41 4e 44 4c 45 2c 20 6d 61 72 6b 69 6e 67  _HANDLE, marking
14e90 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
14ea0 63 6f 6e 6e 65 63 74 65 64 20 61 6e 64 20 74 72  connected and tr
14eb0 79 69 6e 67 20 61 67 61 69 6e 22 29 3b 0a 09 09  ying again");...
14ec0 63 61 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74  cackey_mark_slot
14ed0 5f 72 65 73 65 74 28 73 6c 6f 74 29 3b 0a 0a 09  _reset(slot);...
14ee0 09 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65  .pcsc_connect_re
14ef0 74 20 3d 20 63 61 63 6b 65 79 5f 63 6f 6e 6e 65  t = cackey_conne
14f00 63 74 5f 63 61 72 64 28 73 6c 6f 74 29 3b 0a 09  ct_card(slot);..
14f10 09 69 66 20 28 70 63 73 63 5f 63 6f 6e 6e 65 63  .if (pcsc_connec
14f20 74 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f  t_ret != CACKEY_
14f30 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09  PCSC_S_OK) {....
14f40 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
14f50 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 63  NTF("Unable to c
14f60 6f 6e 6e 65 63 74 20 74 6f 20 63 61 72 64 2c 20  onnect to card, 
14f70 72 65 74 75 72 6e 69 6e 67 20 74 6f 6b 65 6e 20  returning token 
14f80 61 62 73 65 6e 74 22 29 3b 0a 0a 09 09 09 72 65  absent");.....re
14f90 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
14fa0 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b  _E_TOKENABSENT);
14fb0 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ...}....CACKEY_D
14fc0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
14fd0 6c 69 6e 67 20 53 43 61 72 64 53 74 61 74 75 73  ling SCardStatus
14fe0 28 29 20 61 67 61 69 6e 22 29 3b 0a 0a 09 09 61  () again");....a
14ff0 74 72 5f 6c 65 6e 20 3d 20 73 69 7a 65 6f 66 28  tr_len = sizeof(
15000 61 74 72 29 3b 0a 09 09 73 74 61 74 75 73 5f 72  atr);...status_r
15010 65 74 20 3d 20 53 43 61 72 64 53 74 61 74 75 73  et = SCardStatus
15020 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64  (slot->pcsc_card
15030 2c 20 4e 55 4c 4c 2c 20 26 72 65 61 64 65 72 5f  , NULL, &reader_
15040 6c 65 6e 2c 20 26 73 74 61 74 65 2c 20 26 70 72  len, &state, &pr
15050 6f 74 6f 63 6f 6c 2c 20 61 74 72 2c 20 26 61 74  otocol, atr, &at
15060 72 5f 6c 65 6e 29 3b 0a 09 7d 0a 0a 09 69 66 20  r_len);..}...if 
15070 28 73 74 61 74 75 73 5f 72 65 74 20 21 3d 20 53  (status_ret != S
15080 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20  CARD_S_SUCCESS) 
15090 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 61 72 6b 5f  {...cackey_mark_
150a0 73 6c 6f 74 5f 72 65 73 65 74 28 73 6c 6f 74 29  slot_reset(slot)
150b0 3b 0a 0a 09 09 69 66 20 28 73 74 61 74 75 73 5f  ;....if (status_
150c0 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 57 5f 52  ret == SCARD_W_R
150d0 45 53 45 54 5f 43 41 52 44 29 20 7b 0a 09 09 09  ESET_CARD) {....
150e0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
150f0 4e 54 46 28 22 52 65 73 65 74 20 72 65 71 75 69  NTF("Reset requi
15100 72 65 64 2c 20 70 6c 65 61 73 65 20 68 6f 6c 64  red, please hold
15110 2e 2e 2e 22 29 3b 0a 0a 09 09 09 73 63 61 72 64  ...");.....scard
15120 5f 72 65 63 6f 6e 6e 5f 72 65 74 20 3d 20 63 61  _reconn_ret = ca
15130 63 6b 65 79 5f 72 65 63 6f 6e 6e 65 63 74 5f 63  ckey_reconnect_c
15140 61 72 64 28 73 6c 6f 74 2c 20 53 43 41 52 44 5f  ard(slot, SCARD_
15150 50 52 4f 54 4f 43 4f 4c 5f 54 30 20 7c 20 53 43  PROTOCOL_T0 | SC
15160 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31 29  ARD_PROTOCOL_T1)
15170 3b 0a 09 09 09 69 66 20 28 73 63 61 72 64 5f 72  ;....if (scard_r
15180 65 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53 43 41  econn_ret == SCA
15190 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a  RD_S_SUCCESS) {.
151a0 09 09 09 09 2f 2a 20 52 65 2d 65 73 74 61 62 6c  ..../* Re-establ
151b0 69 73 68 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ish transaction,
151c0 20 69 66 20 69 74 20 77 61 73 20 70 72 65 73 65   if it was prese
151d0 6e 74 20 2a 2f 0a 09 09 09 09 69 66 20 28 73 6c  nt */.....if (sl
151e0 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f  ot->transaction_
151f0 64 65 70 74 68 20 3e 20 30 29 20 7b 0a 09 09 09  depth > 0) {....
15200 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74  ..slot->transact
15210 69 6f 6e 5f 64 65 70 74 68 2d 2d 3b 0a 09 09 09  ion_depth--;....
15220 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74  ..slot->transact
15230 69 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b  ion_need_hw_lock
15240 20 3d 20 31 3b 0a 09 09 09 09 09 63 61 63 6b 65   = 1;......cacke
15250 79 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74  y_begin_transact
15260 69 6f 6e 28 73 6c 6f 74 29 3b 0a 09 09 09 09 7d  ion(slot);.....}
15270 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
15280 55 47 5f 50 52 49 4e 54 46 28 22 52 65 73 65 74  UG_PRINTF("Reset
15290 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65 71   successful, req
152a0 75 65 72 79 69 6e 67 22 29 3b 0a 09 09 09 09 73  uerying");.....s
152b0 74 61 74 75 73 5f 72 65 74 20 3d 20 53 43 61 72  tatus_ret = SCar
152c0 64 53 74 61 74 75 73 28 73 6c 6f 74 2d 3e 70 63  dStatus(slot->pc
152d0 73 63 5f 63 61 72 64 2c 20 4e 55 4c 4c 2c 20 26  sc_card, NULL, &
152e0 72 65 61 64 65 72 5f 6c 65 6e 2c 20 26 73 74 61  reader_len, &sta
152f0 74 65 2c 20 26 70 72 6f 74 6f 63 6f 6c 2c 20 61  te, &protocol, a
15300 74 72 2c 20 26 61 74 72 5f 6c 65 6e 29 3b 0a 09  tr, &atr_len);..
15310 09 09 09 69 66 20 28 73 74 61 74 75 73 5f 72 65  ...if (status_re
15320 74 20 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 43  t != SCARD_S_SUC
15330 43 45 53 53 29 20 7b 0a 09 09 09 09 09 43 41 43  CESS) {......CAC
15340 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
15350 28 22 53 74 69 6c 6c 20 75 6e 61 62 6c 65 20 74  ("Still unable t
15360 6f 20 71 75 65 72 79 20 63 61 72 64 20 73 74 61  o query card sta
15370 74 75 73 2c 20 72 65 74 75 72 6e 69 6e 67 20 74  tus, returning t
15380 6f 6b 65 6e 20 61 62 73 65 6e 74 2e 20 20 53 43  oken absent.  SC
15390 61 72 64 53 74 61 74 75 73 28 29 20 3d 20 25 73  ardStatus() = %s
153a0 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ", CACKEY_DEBUG_
153b0 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f  FUNC_SCARDERR_TO
153c0 5f 53 54 52 28 73 74 61 74 75 73 5f 72 65 74 29  _STR(status_ret)
153d0 29 3b 0a 0a 09 09 09 09 09 72 65 74 75 72 6e 28  );.......return(
153e0 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f  CACKEY_PCSC_E_TO
153f0 4b 45 4e 41 42 53 45 4e 54 29 3b 0a 09 09 09 09  KENABSENT);.....
15400 7d 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  }....} else {...
15410 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
15420 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f  RINTF("Unable to
15430 20 72 65 63 6f 6e 6e 65 63 74 20 74 6f 20 63 61   reconnect to ca
15440 72 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 74 6f  rd, returning to
15450 6b 65 6e 20 61 62 73 65 6e 74 2e 20 20 53 43 61  ken absent.  SCa
15460 72 64 52 65 63 6f 6e 6e 65 63 74 28 29 20 3d 20  rdReconnect() = 
15470 25 73 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55  %s", CACKEY_DEBU
15480 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f  G_FUNC_SCARDERR_
15490 54 4f 5f 53 54 52 28 73 63 61 72 64 5f 72 65 63  TO_STR(scard_rec
154a0 6f 6e 6e 5f 72 65 74 29 29 3b 0a 0a 09 09 09 09  onn_ret));......
154b0 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
154c0 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54  SC_E_TOKENABSENT
154d0 29 3b 0a 09 09 09 7d 0a 09 09 7d 20 65 6c 73 65  );....}...} else
154e0 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
154f0 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c  UG_PRINTF("Unabl
15500 65 20 74 6f 20 71 75 65 72 79 20 63 61 72 64 20  e to query card 
15510 73 74 61 74 75 73 2c 20 72 65 74 75 72 6e 69 6e  status, returnin
15520 67 20 74 6f 6b 65 6e 20 61 62 73 65 6e 74 2e 20  g token absent. 
15530 20 53 43 61 72 64 53 74 61 74 75 73 28 29 20 3d   SCardStatus() =
15540 20 25 73 22 2c 20 43 41 43 4b 45 59 5f 44 45 42   %s", CACKEY_DEB
15550 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52  UG_FUNC_SCARDERR
15560 5f 54 4f 5f 53 54 52 28 73 74 61 74 75 73 5f 72  _TO_STR(status_r
15570 65 74 29 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e  et));.....return
15580 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54  (CACKEY_PCSC_E_T
15590 4f 4b 45 4e 41 42 53 45 4e 54 29 3b 0a 09 09 7d  OKENABSENT);...}
155a0 0a 09 7d 0a 0a 09 69 66 20 28 28 73 74 61 74 65  ..}...if ((state
155b0 20 26 20 53 43 41 52 44 5f 41 42 53 45 4e 54 29   & SCARD_ABSENT)
155c0 20 3d 3d 20 53 43 41 52 44 5f 41 42 53 45 4e 54   == SCARD_ABSENT
155d0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
155e0 55 47 5f 50 52 49 4e 54 46 28 22 43 61 72 64 20  UG_PRINTF("Card 
155f0 69 73 20 61 62 73 65 6e 74 2c 20 72 65 74 75 72  is absent, retur
15600 6e 69 6e 67 20 74 6f 6b 65 6e 20 61 62 73 65 6e  ning token absen
15610 74 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  t");....return(C
15620 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b  ACKEY_PCSC_E_TOK
15630 45 4e 41 42 53 45 4e 54 29 3b 0a 09 7d 0a 0a 09  ENABSENT);..}...
15640 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
15650 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 74  NTF("Returning t
15660 6f 6b 65 6e 20 70 72 65 73 65 6e 74 2e 22 29 3b  oken present.");
15670 0a 0a 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
15680 5f 50 43 53 43 5f 53 5f 54 4f 4b 45 4e 50 52 45  _PCSC_S_TOKENPRE
15690 53 45 4e 54 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20  SENT);.}../*. * 
156a0 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20  SYNPOSIS. *     
156b0 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45  .... *. * ARGUME
156c0 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20  NTS. *     .... 
156d0 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55  *. * RETURN VALU
156e0 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a  E. *     .... *.
156f0 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20   * NOTES. *     
15700 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69  .... *. */.stati
15710 63 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63  c cackey_ret cac
15720 6b 65 79 5f 73 65 74 5f 70 69 6e 28 73 74 72 75  key_set_pin(stru
15730 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a  ct cackey_slot *
15740 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20 63  slot, unsigned c
15750 68 61 72 20 2a 6f 6c 64 5f 70 69 6e 2c 20 75 6e  har *old_pin, un
15760 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6f 6c 64 5f  signed long old_
15770 70 69 6e 5f 6c 65 6e 2c 20 75 6e 73 69 67 6e 65  pin_len, unsigne
15780 64 20 63 68 61 72 20 2a 70 69 6e 2c 20 75 6e 73  d char *pin, uns
15790 69 67 6e 65 64 20 6c 6f 6e 67 20 70 69 6e 5f 6c  igned long pin_l
157a0 65 6e 29 20 7b 0a 09 73 74 72 75 63 74 20 63 61  en) {..struct ca
157b0 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69  ckey_pcsc_identi
157c0 74 79 20 2a 70 63 73 63 5f 69 64 65 6e 74 69 74  ty *pcsc_identit
157d0 69 65 73 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63  ies;..unsigned c
157e0 68 61 72 20 63 61 63 5f 70 69 6e 5b 38 5d 20 3d  har cac_pin[8] =
157f0 20 7b 30 78 46 46 2c 20 30 78 46 46 2c 20 30 78   {0xFF, 0xFF, 0x
15800 46 46 2c 20 30 78 46 46 2c 20 30 78 46 46 2c 20  FF, 0xFF, 0xFF, 
15810 30 78 46 46 2c 20 30 78 46 46 2c 20 30 78 46 46  0xFF, 0xFF, 0xFF
15820 7d 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61  };..unsigned cha
15830 72 20 6f 6c 64 5f 63 61 63 5f 70 69 6e 5b 38 5d  r old_cac_pin[8]
15840 20 3d 20 7b 30 78 46 46 2c 20 30 78 46 46 2c 20   = {0xFF, 0xFF, 
15850 30 78 46 46 2c 20 30 78 46 46 2c 20 30 78 46 46  0xFF, 0xFF, 0xFF
15860 2c 20 30 78 46 46 2c 20 30 78 46 46 2c 20 30 78  , 0xFF, 0xFF, 0x
15870 46 46 7d 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63  FF};..unsigned c
15880 68 61 72 20 70 69 6e 5f 75 70 64 61 74 65 5b 73  har pin_update[s
15890 69 7a 65 6f 66 28 63 61 63 5f 70 69 6e 29 20 2b  izeof(cac_pin) +
158a0 20 73 69 7a 65 6f 66 28 6f 6c 64 5f 63 61 63 5f   sizeof(old_cac_
158b0 70 69 6e 29 5d 3b 0a 09 75 6e 73 69 67 6e 65 64  pin)];..unsigned
158c0 20 6c 6f 6e 67 20 6e 75 6d 5f 63 65 72 74 73 3b   long num_certs;
158d0 0a 09 75 69 6e 74 31 36 5f 74 20 72 65 73 70 6f  ..uint16_t respo
158e0 6e 73 65 5f 63 6f 64 65 3b 0a 09 69 6e 74 20 74  nse_code;..int t
158f0 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 3b 0a  ries_remaining;.
15900 09 69 6e 74 20 73 65 6e 64 5f 72 65 74 3b 0a 09  .int send_ret;..
15910 69 6e 74 20 6b 65 79 5f 72 65 66 65 72 65 6e 63  int key_referenc
15920 65 20 3d 20 30 78 30 30 3b 0a 0a 09 2f 2a 20 41  e = 0x00;.../* A
15930 70 70 61 72 65 6e 74 6c 79 2c 20 43 41 43 20 50  pparently, CAC P
15940 49 4e 73 20 61 72 65 20 2a 45 58 41 43 54 4c 59  INs are *EXACTLY
15950 2a 20 38 20 62 79 74 65 73 20 6c 6f 6e 67 20 2d  * 8 bytes long -
15960 2d 20 70 61 64 20 77 69 74 68 20 30 78 46 46 20  - pad with 0xFF 
15970 69 66 20 74 6f 6f 20 73 68 6f 72 74 20 2a 2f 0a  if too short */.
15980 09 69 66 20 28 70 69 6e 5f 6c 65 6e 20 3e 3d 20  .if (pin_len >= 
15990 38 29 20 7b 0a 09 09 6d 65 6d 63 70 79 28 63 61  8) {...memcpy(ca
159a0 63 5f 70 69 6e 2c 20 70 69 6e 2c 20 38 29 3b 0a  c_pin, pin, 8);.
159b0 09 7d 20 65 6c 73 65 20 7b 0a 09 09 6d 65 6d 63  .} else {...memc
159c0 70 79 28 63 61 63 5f 70 69 6e 2c 20 70 69 6e 2c  py(cac_pin, pin,
159d0 20 70 69 6e 5f 6c 65 6e 29 3b 0a 09 7d 0a 0a 09   pin_len);..}...
159e0 69 66 20 28 6f 6c 64 5f 70 69 6e 5f 6c 65 6e 20  if (old_pin_len 
159f0 3e 3d 20 38 29 20 7b 0a 09 09 6d 65 6d 63 70 79  >= 8) {...memcpy
15a00 28 6f 6c 64 5f 63 61 63 5f 70 69 6e 2c 20 6f 6c  (old_cac_pin, ol
15a10 64 5f 70 69 6e 2c 20 38 29 3b 0a 09 7d 20 65 6c  d_pin, 8);..} el
15a20 73 65 20 7b 0a 09 09 6d 65 6d 63 70 79 28 6f 6c  se {...memcpy(ol
15a30 64 5f 63 61 63 5f 70 69 6e 2c 20 6f 6c 64 5f 70  d_cac_pin, old_p
15a40 69 6e 2c 20 6f 6c 64 5f 70 69 6e 5f 6c 65 6e 29  in, old_pin_len)
15a50 3b 0a 09 7d 0a 0a 09 2f 2a 20 43 6f 6e 63 61 74  ;..}.../* Concat
15a60 65 6e 61 74 65 20 62 6f 74 68 20 50 49 4e 73 20  enate both PINs 
15a70 74 6f 67 65 74 68 65 72 20 74 6f 20 73 65 6e 64  together to send
15a80 20 61 73 20 61 20 73 69 6e 67 6c 65 20 69 6e 73   as a single ins
15a90 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 09 6d 65 6d  truction */..mem
15aa0 63 70 79 28 70 69 6e 5f 75 70 64 61 74 65 2c 20  cpy(pin_update, 
15ab0 6f 6c 64 5f 63 61 63 5f 70 69 6e 2c 20 73 69 7a  old_cac_pin, siz
15ac0 65 6f 66 28 6f 6c 64 5f 63 61 63 5f 70 69 6e 29  eof(old_cac_pin)
15ad0 29 3b 0a 09 6d 65 6d 63 70 79 28 70 69 6e 5f 75  );..memcpy(pin_u
15ae0 70 64 61 74 65 20 2b 20 73 69 7a 65 6f 66 28 6f  pdate + sizeof(o
15af0 6c 64 5f 63 61 63 5f 70 69 6e 29 2c 20 63 61 63  ld_cac_pin), cac
15b00 5f 70 69 6e 2c 20 73 69 7a 65 6f 66 28 63 61 63  _pin, sizeof(cac
15b10 5f 70 69 6e 29 29 3b 0a 0a 09 2f 2a 20 52 65 6a  _pin));.../* Rej
15b20 65 63 74 20 50 49 4e 73 20 77 68 69 63 68 20 61  ect PINs which a
15b30 72 65 20 74 6f 6f 20 73 68 6f 72 74 20 2a 2f 0a  re too short */.
15b40 09 69 66 20 28 70 69 6e 5f 6c 65 6e 20 3c 20 35  .if (pin_len < 5
15b50 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
15b60 55 47 5f 50 52 49 4e 54 46 28 22 52 65 6a 65 63  UG_PRINTF("Rejec
15b70 74 69 6e 67 20 4e 65 77 20 50 49 4e 20 77 68 69  ting New PIN whi
15b80 63 68 20 69 73 20 74 6f 6f 20 73 68 6f 72 74 20  ch is too short 
15b90 28 6c 65 6e 67 74 68 20 3d 20 25 6c 75 2c 20 6d  (length = %lu, m
15ba0 75 73 74 20 62 65 20 61 74 6c 65 61 73 74 20 35  ust be atleast 5
15bb0 29 22 2c 20 70 69 6e 5f 6c 65 6e 29 3b 0a 0a 09  )", pin_len);...
15bc0 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
15bd0 43 53 43 5f 45 5f 42 41 44 50 49 4e 29 3b 0a 09  CSC_E_BADPIN);..
15be0 7d 0a 0a 09 69 66 20 28 6f 6c 64 5f 70 69 6e 5f  }...if (old_pin_
15bf0 6c 65 6e 20 3c 20 35 29 20 7b 0a 09 09 43 41 43  len < 5) {...CAC
15c00 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
15c10 28 22 52 65 6a 65 63 74 69 6e 67 20 4f 6c 64 20  ("Rejecting Old 
15c20 50 49 4e 20 77 68 69 63 68 20 69 73 20 74 6f 6f  PIN which is too
15c30 20 73 68 6f 72 74 20 28 6c 65 6e 67 74 68 20 3d   short (length =
15c40 20 25 6c 75 2c 20 6d 75 73 74 20 62 65 20 61 74   %lu, must be at
15c50 6c 65 61 73 74 20 35 29 22 2c 20 6f 6c 64 5f 70  least 5)", old_p
15c60 69 6e 5f 6c 65 6e 29 3b 0a 0a 09 09 72 65 74 75  in_len);....retu
15c70 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  rn(CACKEY_PCSC_E
15c80 5f 42 41 44 50 49 4e 29 3b 0a 09 7d 0a 0a 09 2f  _BADPIN);..}.../
15c90 2a 20 50 49 56 20 61 75 74 68 65 6e 74 69 63 61  * PIV authentica
15ca0 74 69 6f 6e 20 75 73 65 73 20 61 20 22 6b 65 79  tion uses a "key
15cb0 5f 72 65 66 65 72 65 6e 63 65 22 20 6f 66 20 30  _reference" of 0
15cc0 78 38 30 20 2a 2f 0a 09 70 63 73 63 5f 69 64 65  x80 */..pcsc_ide
15cd0 6e 74 69 74 69 65 73 20 3d 20 63 61 63 6b 65 79  ntities = cackey
15ce0 5f 72 65 61 64 5f 63 65 72 74 73 28 73 6c 6f 74  _read_certs(slot
15cf0 2c 20 4e 55 4c 4c 2c 20 26 6e 75 6d 5f 63 65 72  , NULL, &num_cer
15d00 74 73 29 3b 0a 09 69 66 20 28 6e 75 6d 5f 63 65  ts);..if (num_ce
15d10 72 74 73 20 3e 20 30 20 26 26 20 70 63 73 63 5f  rts > 0 && pcsc_
15d20 69 64 65 6e 74 69 74 69 65 73 20 21 3d 20 4e 55  identities != NU
15d30 4c 4c 29 20 7b 0a 09 09 73 77 69 74 63 68 20 28  LL) {...switch (
15d40 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 5b  pcsc_identities[
15d50 30 5d 2e 69 64 5f 74 79 70 65 29 20 7b 0a 09 09  0].id_type) {...
15d60 09 63 61 73 65 20 43 41 43 4b 45 59 5f 49 44 5f  .case CACKEY_ID_
15d70 54 59 50 45 5f 50 49 56 3a 0a 09 09 09 09 43 41  TYPE_PIV:.....CA
15d80 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
15d90 46 28 22 57 65 20 68 61 76 65 20 50 49 56 20 63  F("We have PIV c
15da0 61 72 64 2c 20 73 6f 20 77 65 20 77 69 6c 6c 20  ard, so we will 
15db0 61 74 74 65 6d 70 74 20 74 6f 20 61 75 74 68 65  attempt to authe
15dc0 6e 74 69 63 61 74 65 20 75 73 69 6e 67 20 74 68  nticate using th
15dd0 65 20 50 49 56 20 41 70 70 6c 69 63 61 74 69 6f  e PIV Applicatio
15de0 6e 20 6b 65 79 20 72 65 66 65 72 65 6e 63 65 22  n key reference"
15df0 29 3b 0a 0a 09 09 09 09 6b 65 79 5f 72 65 66 65  );......key_refe
15e00 72 65 6e 63 65 20 3d 20 30 78 38 30 3b 0a 09 09  rence = 0x80;...
15e10 09 09 62 72 65 61 6b 3b 0a 09 09 09 64 65 66 61  ..break;....defa
15e20 75 6c 74 3a 0a 09 09 09 09 62 72 65 61 6b 3b 0a  ult:.....break;.
15e30 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 66 72  ..}....cackey_fr
15e40 65 65 5f 63 65 72 74 73 28 70 63 73 63 5f 69 64  ee_certs(pcsc_id
15e50 65 6e 74 69 74 69 65 73 2c 20 6e 75 6d 5f 63 65  entities, num_ce
15e60 72 74 73 2c 20 31 29 3b 0a 09 7d 0a 0a 09 2f 2a  rts, 1);..}.../*
15e70 20 49 73 73 75 65 20 61 20 53 65 74 20 50 49 4e   Issue a Set PIN
15e80 20 28 43 48 41 4e 47 45 20 52 45 46 45 52 45 4e   (CHANGE REFEREN
15e90 43 45 29 20 2a 2f 0a 09 73 65 6e 64 5f 72 65 74  CE) */..send_ret
15ea0 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61   = cackey_send_a
15eb0 70 64 75 28 73 6c 6f 74 2c 20 47 53 43 49 53 5f  pdu(slot, GSCIS_
15ec0 43 4c 41 53 53 5f 49 53 4f 37 38 31 36 2c 20 47  CLASS_ISO7816, G
15ed0 53 43 49 53 5f 49 4e 53 54 52 5f 43 48 41 4e 47  SCIS_INSTR_CHANG
15ee0 45 5f 52 45 46 45 52 45 4e 43 45 2c 20 30 78 30  E_REFERENCE, 0x0
15ef0 30 2c 20 6b 65 79 5f 72 65 66 65 72 65 6e 63 65  0, key_reference
15f00 2c 20 73 69 7a 65 6f 66 28 70 69 6e 5f 75 70 64  , sizeof(pin_upd
15f10 61 74 65 29 2c 20 70 69 6e 5f 75 70 64 61 74 65  ate), pin_update
15f20 2c 20 30 78 30 30 2c 20 26 72 65 73 70 6f 6e 73  , 0x00, &respons
15f30 65 5f 63 6f 64 65 2c 20 4e 55 4c 4c 2c 20 4e 55  e_code, NULL, NU
15f40 4c 4c 29 3b 0a 0a 09 69 66 20 28 73 65 6e 64 5f  LL);...if (send_
15f50 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43  ret != CACKEY_PC
15f60 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 69 66 20  SC_S_OK) {...if 
15f70 28 28 72 65 73 70 6f 6e 73 65 5f 63 6f 64 65 20  ((response_code 
15f80 26 20 30 78 36 33 43 30 29 20 3d 3d 20 30 78 36  & 0x63C0) == 0x6
15f90 33 43 30 29 20 7b 0a 09 09 09 74 72 69 65 73 5f  3C0) {....tries_
15fa0 72 65 6d 61 69 6e 69 6e 67 20 3d 20 28 72 65 73  remaining = (res
15fb0 70 6f 6e 73 65 5f 63 6f 64 65 20 26 20 30 78 46  ponse_code & 0xF
15fc0 29 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  );.....CACKEY_DE
15fd0 42 55 47 5f 50 52 49 4e 54 46 28 22 50 49 4e 20  BUG_PRINTF("PIN 
15fe0 56 65 72 69 66 69 63 61 74 69 6f 6e 20 66 61 69  Verification fai
15ff0 6c 65 64 2c 20 25 69 20 74 72 69 65 73 20 72 65  led, %i tries re
16000 6d 61 69 6e 69 6e 67 22 2c 20 74 72 69 65 73 5f  maining", tries_
16010 72 65 6d 61 69 6e 69 6e 67 29 3b 0a 0a 09 09 09  remaining);.....
16020 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
16030 53 43 5f 45 5f 42 41 44 50 49 4e 29 3b 0a 09 09  SC_E_BADPIN);...
16040 7d 0a 0a 09 09 69 66 20 28 72 65 73 70 6f 6e 73  }....if (respons
16050 65 5f 63 6f 64 65 20 3d 3d 20 30 78 36 39 38 33  e_code == 0x6983
16060 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
16070 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62  BUG_PRINTF("Unab
16080 6c 65 20 74 6f 20 73 65 74 20 50 49 4e 2c 20 64  le to set PIN, d
16090 65 76 69 63 65 20 69 73 20 6c 6f 63 6b 65 64 20  evice is locked 
160a0 6f 72 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20  or changing the 
160b0 50 49 4e 20 69 73 20 64 69 73 61 62 6c 65 64 22  PIN is disabled"
160c0 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 41  );.....return(CA
160d0 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4c 4f 43 4b  CKEY_PCSC_E_LOCK
160e0 45 44 29 3b 0a 09 09 7d 0a 0a 09 09 72 65 74 75  ED);...}....retu
160f0 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  rn(CACKEY_PCSC_E
16100 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09  _GENERIC);..}...
16110 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
16120 4e 54 46 28 22 50 49 4e 20 43 68 61 6e 67 65 20  NTF("PIN Change 
16130 73 75 63 63 65 65 64 65 64 22 29 3b 0a 0a 09 72  succeeded");...r
16140 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
16150 43 5f 53 5f 4f 4b 29 3b 0a 0a 09 2f 2a 20 44 69  C_S_OK);.../* Di
16160 73 61 62 6c 65 20 61 20 77 61 72 6e 69 6e 67 2c  sable a warning,
16170 20 73 69 6e 63 65 20 74 68 69 73 20 69 73 20 6f   since this is o
16180 6e 6c 79 20 75 73 65 64 20 69 6e 20 64 65 62 75  nly used in debu
16190 67 20 6d 6f 64 65 20 2a 2f 0a 09 74 72 69 65 73  g mode */..tries
161a0 5f 72 65 6d 61 69 6e 69 6e 67 20 3d 20 74 72 69  _remaining = tri
161b0 65 73 5f 72 65 6d 61 69 6e 69 6e 67 3b 0a 7d 0a  es_remaining;.}.
161c0 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a  ./*. * SYNPOSIS.
161d0 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a   *     .... *. *
161e0 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20   ARGUMENTS. *   
161f0 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54 55    .... *. * RETU
16200 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20  RN VALUE. *     
16210 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a  .... *. * NOTES.
16220 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a   *     .... *. *
16230 2f 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f  /.static cackey_
16240 72 65 74 20 63 61 63 6b 65 79 5f 6c 6f 67 69 6e  ret cackey_login
16250 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73  (struct cackey_s
16260 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67  lot *slot, unsig
16270 6e 65 64 20 63 68 61 72 20 2a 70 69 6e 2c 20 75  ned char *pin, u
16280 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 70 69 6e  nsigned long pin
16290 5f 6c 65 6e 2c 20 69 6e 74 20 2a 74 72 69 65 73  _len, int *tries
162a0 5f 72 65 6d 61 69 6e 69 6e 67 5f 70 2c 20 69 6e  _remaining_p, in
162b0 74 20 72 65 74 72 69 65 73 29 20 7b 0a 09 73 74  t retries) {..st
162c0 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63  ruct cackey_pcsc
162d0 5f 69 64 65 6e 74 69 74 79 20 2a 70 63 73 63 5f  _identity *pcsc_
162e0 69 64 65 6e 74 69 74 69 65 73 3b 0a 09 75 6e 73  identities;..uns
162f0 69 67 6e 65 64 20 63 68 61 72 20 63 61 63 5f 70  igned char cac_p
16300 69 6e 5b 38 5d 20 3d 20 7b 30 78 46 46 2c 20 30  in[8] = {0xFF, 0
16310 78 46 46 2c 20 30 78 46 46 2c 20 30 78 46 46 2c  xFF, 0xFF, 0xFF,
16320 20 30 78 46 46 2c 20 30 78 46 46 2c 20 30 78 46   0xFF, 0xFF, 0xF
16330 46 2c 20 30 78 46 46 7d 3b 0a 09 75 6e 73 69 67  F, 0xFF};..unsig
16340 6e 65 64 20 6c 6f 6e 67 20 6e 75 6d 5f 63 65 72  ned long num_cer
16350 74 73 3b 0a 09 75 69 6e 74 31 36 5f 74 20 72 65  ts;..uint16_t re
16360 73 70 6f 6e 73 65 5f 63 6f 64 65 3b 0a 09 69 6e  sponse_code;..in
16370 74 20 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e  t tries_remainin
16380 67 3b 0a 09 69 6e 74 20 73 65 6e 64 5f 72 65 74  g;..int send_ret
16390 3b 0a 09 69 6e 74 20 6b 65 79 5f 72 65 66 65 72  ;..int key_refer
163a0 65 6e 63 65 20 3d 20 30 78 30 30 2c 20 68 61 76  ence = 0x00, hav
163b0 65 5f 70 69 76 20 3d 20 30 3b 0a 09 63 61 63 6b  e_piv = 0;..cack
163c0 65 79 5f 72 65 74 20 63 6f 6e 6e 65 63 74 5f 72  ey_ret connect_r
163d0 65 74 2c 20 74 6f 6b 65 6e 5f 72 65 74 3b 0a 0a  et, token_ret;..
163e0 09 2f 2a 20 49 6e 64 69 63 61 74 65 20 74 68 61  ./* Indicate tha
163f0 74 20 77 65 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77  t we do not know
16400 20 61 62 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20   about how many 
16410 74 72 69 65 73 20 61 72 65 20 72 65 6d 61 69 6e  tries are remain
16420 69 6e 67 20 2a 2f 0a 09 69 66 20 28 74 72 69 65  ing */..if (trie
16430 73 5f 72 65 6d 61 69 6e 69 6e 67 5f 70 29 20 7b  s_remaining_p) {
16440 0a 09 09 2a 74 72 69 65 73 5f 72 65 6d 61 69 6e  ...*tries_remain
16450 69 6e 67 5f 70 20 3d 20 2d 31 3b 0a 09 7d 0a 0a  ing_p = -1;..}..
16460 09 2f 2a 20 41 70 70 61 72 65 6e 74 6c 79 2c 20  ./* Apparently, 
16470 43 41 43 20 50 49 4e 73 20 61 72 65 20 2a 45 58  CAC PINs are *EX
16480 41 43 54 4c 59 2a 20 38 20 62 79 74 65 73 20 6c  ACTLY* 8 bytes l
16490 6f 6e 67 20 2d 2d 20 70 61 64 20 77 69 74 68 20  ong -- pad with 
164a0 30 78 46 46 20 69 66 20 74 6f 6f 20 73 68 6f 72  0xFF if too shor
164b0 74 20 2a 2f 0a 09 69 66 20 28 70 69 6e 5f 6c 65  t */..if (pin_le
164c0 6e 20 3e 3d 20 38 29 20 7b 0a 09 09 6d 65 6d 63  n >= 8) {...memc
164d0 70 79 28 63 61 63 5f 70 69 6e 2c 20 70 69 6e 2c  py(cac_pin, pin,
164e0 20 38 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09   8);..} else {..
164f0 09 6d 65 6d 63 70 79 28 63 61 63 5f 70 69 6e 2c  .memcpy(cac_pin,
16500 20 70 69 6e 2c 20 70 69 6e 5f 6c 65 6e 29 3b 0a   pin, pin_len);.
16510 09 7d 0a 0a 09 2f 2a 20 52 65 6a 65 63 74 20 50  .}.../* Reject P
16520 49 4e 73 20 77 68 69 63 68 20 61 72 65 20 74 6f  INs which are to
16530 6f 20 73 68 6f 72 74 20 2a 2f 0a 09 69 66 20 28  o short */..if (
16540 70 69 6e 5f 6c 65 6e 20 3c 20 35 29 20 7b 0a 09  pin_len < 5) {..
16550 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
16560 49 4e 54 46 28 22 52 65 6a 65 63 74 69 6e 67 20  INTF("Rejecting 
16570 50 49 4e 20 77 68 69 63 68 20 69 73 20 74 6f 6f  PIN which is too
16580 20 73 68 6f 72 74 20 28 6c 65 6e 67 74 68 20 3d   short (length =
16590 20 25 6c 75 2c 20 6d 75 73 74 20 62 65 20 61 74   %lu, must be at
165a0 6c 65 61 73 74 20 35 29 22 2c 20 70 69 6e 5f 6c  least 5)", pin_l
165b0 65 6e 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  en);....return(C
165c0 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 42 41 44  ACKEY_PCSC_E_BAD
165d0 50 49 4e 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 50 49  PIN);..}.../* PI
165e0 56 20 61 75 74 68 65 6e 74 69 63 61 74 69 6f 6e  V authentication
165f0 20 75 73 65 73 20 61 20 22 6b 65 79 5f 72 65 66   uses a "key_ref
16600 65 72 65 6e 63 65 22 20 6f 66 20 30 78 38 30 20  erence" of 0x80 
16610 2a 2f 0a 09 70 63 73 63 5f 69 64 65 6e 74 69 74  */..pcsc_identit
16620 69 65 73 20 3d 20 63 61 63 6b 65 79 5f 72 65 61  ies = cackey_rea
16630 64 5f 63 65 72 74 73 28 73 6c 6f 74 2c 20 4e 55  d_certs(slot, NU
16640 4c 4c 2c 20 26 6e 75 6d 5f 63 65 72 74 73 29 3b  LL, &num_certs);
16650 0a 09 69 66 20 28 6e 75 6d 5f 63 65 72 74 73 20  ..if (num_certs 
16660 3e 20 30 20 26 26 20 70 63 73 63 5f 69 64 65 6e  > 0 && pcsc_iden
16670 74 69 74 69 65 73 20 21 3d 20 4e 55 4c 4c 29 20  tities != NULL) 
16680 7b 0a 09 09 73 77 69 74 63 68 20 28 70 63 73 63  {...switch (pcsc
16690 5f 69 64 65 6e 74 69 74 69 65 73 5b 30 5d 2e 69  _identities[0].i
166a0 64 5f 74 79 70 65 29 20 7b 0a 09 09 09 63 61 73  d_type) {....cas
166b0 65 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45  e CACKEY_ID_TYPE
166c0 5f 50 49 56 3a 0a 09 09 09 09 43 41 43 4b 45 59  _PIV:.....CACKEY
166d0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 57  _DEBUG_PRINTF("W
166e0 65 20 68 61 76 65 20 50 49 56 20 63 61 72 64 2c  e have PIV card,
166f0 20 73 6f 20 77 65 20 77 69 6c 6c 20 61 74 74 65   so we will atte
16700 6d 70 74 20 74 6f 20 61 75 74 68 65 6e 74 69 63  mpt to authentic
16710 61 74 65 20 75 73 69 6e 67 20 74 68 65 20 50 49  ate using the PI
16720 56 20 41 70 70 6c 69 63 61 74 69 6f 6e 20 6b 65  V Application ke
16730 79 20 72 65 66 65 72 65 6e 63 65 22 29 3b 0a 0a  y reference");..
16740 09 09 09 09 68 61 76 65 5f 70 69 76 20 3d 20 31  ....have_piv = 1
16750 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ;.....break;....
16760 64 65 66 61 75 6c 74 3a 0a 09 09 09 09 62 72 65  default:.....bre
16770 61 6b 3b 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65  ak;...}....cacke
16780 79 5f 66 72 65 65 5f 63 65 72 74 73 28 70 63 73  y_free_certs(pcs
16790 63 5f 69 64 65 6e 74 69 74 69 65 73 2c 20 6e 75  c_identities, nu
167a0 6d 5f 63 65 72 74 73 2c 20 31 29 3b 0a 09 7d 0a  m_certs, 1);..}.
167b0 0a 09 69 66 20 28 68 61 76 65 5f 70 69 76 20 3d  ..if (have_piv =
167c0 3d 20 31 29 20 7b 0a 09 09 6b 65 79 5f 72 65 66  = 1) {...key_ref
167d0 65 72 65 6e 63 65 20 3d 20 30 78 38 30 3b 0a 09  erence = 0x80;..
167e0 7d 0a 0a 09 2f 2a 20 49 73 73 75 65 20 50 49 4e  }.../* Issue PIN
167f0 20 56 65 72 69 66 79 20 2a 2f 0a 09 73 65 6e 64   Verify */..send
16800 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65  _ret = cackey_se
16810 6e 64 5f 61 70 64 75 28 73 6c 6f 74 2c 20 47 53  nd_apdu(slot, GS
16820 43 49 53 5f 43 4c 41 53 53 5f 49 53 4f 37 38 31  CIS_CLASS_ISO781
16830 36 2c 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 56  6, GSCIS_INSTR_V
16840 45 52 49 46 59 2c 20 30 78 30 30 2c 20 6b 65 79  ERIFY, 0x00, key
16850 5f 72 65 66 65 72 65 6e 63 65 2c 20 73 69 7a 65  _reference, size
16860 6f 66 28 63 61 63 5f 70 69 6e 29 2c 20 63 61 63  of(cac_pin), cac
16870 5f 70 69 6e 2c 20 30 78 30 30 2c 20 26 72 65 73  _pin, 0x00, &res
16880 70 6f 6e 73 65 5f 63 6f 64 65 2c 20 4e 55 4c 4c  ponse_code, NULL
16890 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 69 66 20 28 73  , NULL);...if (s
168a0 65 6e 64 5f 72 65 74 20 21 3d 20 43 41 43 4b 45  end_ret != CACKE
168b0 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09  Y_PCSC_S_OK) {..
168c0 09 69 66 20 28 28 72 65 73 70 6f 6e 73 65 5f 63  .if ((response_c
168d0 6f 64 65 20 26 20 30 78 36 33 43 30 29 20 3d 3d  ode & 0x63C0) ==
168e0 20 30 78 36 33 43 30 29 20 7b 0a 09 09 09 74 72   0x63C0) {....tr
168f0 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 20 3d 20  ies_remaining = 
16900 28 72 65 73 70 6f 6e 73 65 5f 63 6f 64 65 20 26  (response_code &
16910 20 30 78 46 29 3b 0a 0a 09 09 09 43 41 43 4b 45   0xF);.....CACKE
16920 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
16930 50 49 4e 20 56 65 72 69 66 69 63 61 74 69 6f 6e  PIN Verification
16940 20 66 61 69 6c 65 64 2c 20 25 69 20 74 72 69 65   failed, %i trie
16950 73 20 72 65 6d 61 69 6e 69 6e 67 22 2c 20 74 72  s remaining", tr
16960 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 29 3b 0a  ies_remaining);.
16970 0a 09 09 09 69 66 20 28 74 72 69 65 73 5f 72 65  ....if (tries_re
16980 6d 61 69 6e 69 6e 67 5f 70 29 20 7b 0a 09 09 09  maining_p) {....
16990 09 2a 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e  .*tries_remainin
169a0 67 5f 70 20 3d 20 74 72 69 65 73 5f 72 65 6d 61  g_p = tries_rema
169b0 69 6e 69 6e 67 3b 0a 09 09 09 7d 0a 0a 09 09 09  ining;....}.....
169c0 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
169d0 53 43 5f 45 5f 42 41 44 50 49 4e 29 3b 0a 09 09  SC_E_BADPIN);...
169e0 7d 0a 0a 09 09 69 66 20 28 72 65 73 70 6f 6e 73  }....if (respons
169f0 65 5f 63 6f 64 65 20 3d 3d 20 30 78 36 39 38 33  e_code == 0x6983
16a00 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
16a10 42 55 47 5f 50 52 49 4e 54 46 28 22 50 49 4e 20  BUG_PRINTF("PIN 
16a20 56 65 72 69 66 69 63 61 74 69 6f 6e 20 66 61 69  Verification fai
16a30 6c 65 64 2c 20 64 65 76 69 63 65 20 69 73 20 6c  led, device is l
16a40 6f 63 6b 65 64 22 29 3b 0a 0a 09 09 09 72 65 74  ocked");.....ret
16a50 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
16a60 45 5f 4c 4f 43 4b 45 44 29 3b 0a 09 09 7d 0a 0a  E_LOCKED);...}..
16a70 09 09 69 66 20 28 72 65 73 70 6f 6e 73 65 5f 63  ..if (response_c
16a80 6f 64 65 20 3d 3d 20 30 78 36 64 30 30 29 20 7b  ode == 0x6d00) {
16a90 0a 09 09 09 69 66 20 28 72 65 74 72 69 65 73 20  ....if (retries 
16aa0 3e 20 30 29 20 7b 0a 09 09 09 09 43 41 43 4b 45  > 0) {.....CACKE
16ab0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
16ac0 47 6f 74 20 49 53 4f 20 37 38 31 36 20 52 65 73  Got ISO 7816 Res
16ad0 70 6f 6e 73 65 20 5c 22 36 44 20 30 30 5c 22 20  ponse \"6D 00\" 
16ae0 69 6e 20 72 65 73 70 6f 6e 73 65 20 74 6f 20 61  in response to a
16af0 20 56 45 52 49 46 59 20 72 65 71 75 65 73 74 2e   VERIFY request.
16b00 22 29 3b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  ");.....CACKEY_D
16b10 45 42 55 47 5f 50 52 49 4e 54 46 28 22 57 65 20  EBUG_PRINTF("We 
16b20 64 69 64 20 6e 6f 74 20 65 78 70 65 63 74 20 74  did not expect t
16b30 68 69 73 20 62 65 63 61 75 73 65 20 69 74 20 69  his because it i
16b40 73 20 6e 6f 74 20 6d 65 6e 74 69 6f 6e 65 64 20  s not mentioned 
16b50 69 6e 20 4e 49 53 54 20 53 50 20 38 30 30 2d 37  in NIST SP 800-7
16b60 33 2d 33 20 50 61 72 74 20 32 20 53 65 63 74 69  3-3 Part 2 Secti
16b70 6f 6e 20 33 2e 32 2e 31 20 6f 72 20 47 53 43 2d  on 3.2.1 or GSC-
16b80 49 53 20 76 32 2e 31 22 29 3b 0a 09 09 09 09 43  IS v2.1");.....C
16b90 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
16ba0 54 46 28 22 57 65 20 61 72 65 20 67 6f 69 6e 67  TF("We are going
16bb0 20 74 6f 20 74 72 79 20 74 6f 20 72 65 73 65 74   to try to reset
16bc0 20 74 68 65 20 63 61 72 64 20 61 6e 64 20 73 65   the card and se
16bd0 6c 65 63 74 20 74 68 65 20 61 70 70 6c 65 74 20  lect the applet 
16be0 61 67 61 69 6e 2e 22 29 3b 0a 0a 09 09 09 09 63  again.");......c
16bf0 61 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f  ackey_mark_slot_
16c00 72 65 73 65 74 28 73 6c 6f 74 29 3b 0a 0a 09 09  reset(slot);....
16c10 09 09 63 6f 6e 6e 65 63 74 5f 72 65 74 20 3d 20  ..connect_ret = 
16c20 63 61 63 6b 65 79 5f 63 6f 6e 6e 65 63 74 5f 63  cackey_connect_c
16c30 61 72 64 28 73 6c 6f 74 29 3b 0a 09 09 09 09 69  ard(slot);.....i
16c40 66 20 28 63 6f 6e 6e 65 63 74 5f 72 65 74 20 21  f (connect_ret !
16c50 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  = CACKEY_PCSC_S_
16c60 4f 4b 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45  OK) {......CACKE
16c70 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
16c80 55 6e 61 62 6c 65 20 74 6f 20 72 65 63 6f 6e 6e  Unable to reconn
16c90 65 63 74 20 61 66 74 65 72 20 72 65 73 65 74 74  ect after resett
16ca0 69 6e 67 20 74 68 65 20 63 61 72 64 2c 20 72 65  ing the card, re
16cb0 74 75 72 6e 69 6e 67 20 69 6e 20 65 72 72 6f 72  turning in error
16cc0 2e 22 29 3b 0a 0a 09 09 09 09 09 72 65 74 75 72  .");.......retur
16cd0 6e 28 63 6f 6e 6e 65 63 74 5f 72 65 74 29 3b 0a  n(connect_ret);.
16ce0 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45  ....}......CACKE
16cf0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
16d00 56 65 72 69 66 79 69 6e 67 20 77 65 20 73 74 69  Verifying we sti
16d10 6c 6c 20 68 61 76 65 20 61 20 74 6f 6b 65 6e 2e  ll have a token.
16d20 22 29 3b 0a 09 09 09 09 74 6f 6b 65 6e 5f 72 65  ");.....token_re
16d30 74 20 3d 20 63 61 63 6b 65 79 5f 74 6f 6b 65 6e  t = cackey_token
16d40 5f 70 72 65 73 65 6e 74 28 73 6c 6f 74 29 3b 0a  _present(slot);.
16d50 09 09 09 09 69 66 20 28 74 6f 6b 65 6e 5f 72 65  ....if (token_re
16d60 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43  t != CACKEY_PCSC
16d70 5f 53 5f 54 4f 4b 45 4e 50 52 45 53 45 4e 54 29  _S_TOKENPRESENT)
16d80 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44   {......CACKEY_D
16d90 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54 6f 6b  EBUG_PRINTF("Tok
16da0 65 6e 20 6e 6f 74 20 70 72 65 73 65 6e 74 2c 20  en not present, 
16db0 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 65 72 72  returning in err
16dc0 6f 72 2e 22 29 3b 0a 0a 09 09 09 09 09 72 65 74  or.");.......ret
16dd0 75 72 6e 28 74 6f 6b 65 6e 5f 72 65 74 29 3b 0a  urn(token_ret);.
16de0 09 09 09 09 7d 0a 0a 0a 09 09 09 09 43 41 43 4b  ....}.......CACK
16df0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
16e00 22 54 72 79 69 6e 67 20 74 6f 20 6c 6f 67 69 6e  "Trying to login
16e10 20 61 67 61 69 6e 22 29 3b 0a 09 09 09 09 72 65   again");.....re
16e20 74 75 72 6e 28 63 61 63 6b 65 79 5f 6c 6f 67 69  turn(cackey_logi
16e30 6e 28 73 6c 6f 74 2c 20 70 69 6e 2c 20 70 69 6e  n(slot, pin, pin
16e40 5f 6c 65 6e 2c 20 74 72 69 65 73 5f 72 65 6d 61  _len, tries_rema
16e50 69 6e 69 6e 67 5f 70 2c 20 72 65 74 72 69 65 73  ining_p, retries
16e60 20 2d 20 31 29 29 3b 0a 09 09 09 7d 0a 09 09 7d   - 1));....}...}
16e70 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ....return(CACKE
16e80 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43  Y_PCSC_E_GENERIC
16e90 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
16ea0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 50 49 4e  EBUG_PRINTF("PIN
16eb0 20 56 65 72 69 66 69 63 61 74 69 6f 6e 20 73 75   Verification su
16ec0 63 63 65 65 64 65 64 22 29 3b 0a 0a 09 72 65 74  cceeded");...ret
16ed0 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
16ee0 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20  S_OK);.}../*. * 
16ef0 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20  SYNPOSIS. *     
16f00 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45  .... *. * ARGUME
16f10 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20  NTS. *     .... 
16f20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55  *. * RETURN VALU
16f30 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a  E. *     .... *.
16f40 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20   * NOTES. *     
16f50 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69  .... *. */.stati
16f60 63 20 73 73 69 7a 65 5f 74 20 63 61 63 6b 65 79  c ssize_t cackey
16f70 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79 5f 74  _pcsc_identity_t
16f80 6f 5f 6c 61 62 65 6c 28 73 74 72 75 63 74 20 63  o_label(struct c
16f90 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74  ackey_pcsc_ident
16fa0 69 74 79 20 2a 69 64 65 6e 74 69 74 79 2c 20 75  ity *identity, u
16fb0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6c 61  nsigned char *la
16fc0 62 65 6c 5f 62 75 66 2c 20 75 6e 73 69 67 6e 65  bel_buf, unsigne
16fd0 64 20 6c 6f 6e 67 20 6c 61 62 65 6c 5f 62 75 66  d long label_buf
16fe0 5f 6c 65 6e 29 20 7b 0a 09 75 6e 73 69 67 6e 65  _len) {..unsigne
16ff0 64 20 6c 6f 6e 67 20 63 65 72 74 69 66 69 63 61  d long certifica
17000 74 65 5f 6c 65 6e 3b 0a 09 76 6f 69 64 20 2a 6c  te_len;..void *l
17010 61 62 65 6c 5f 61 73 6e 31 3b 0a 09 76 6f 69 64  abel_asn1;..void
17020 20 2a 63 65 72 74 69 66 69 63 61 74 65 3b 0a 09   *certificate;..
17030 69 6e 74 20 78 35 30 39 5f 72 65 61 64 5f 72 65  int x509_read_re
17040 74 3b 0a 0a 09 63 65 72 74 69 66 69 63 61 74 65  t;...certificate
17050 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e 63 65 72   = identity->cer
17060 74 69 66 69 63 61 74 65 3b 0a 09 63 65 72 74 69  tificate;..certi
17070 66 69 63 61 74 65 5f 6c 65 6e 20 3d 20 69 64 65  ficate_len = ide
17080 6e 74 69 74 79 2d 3e 63 65 72 74 69 66 69 63 61  ntity->certifica
17090 74 65 5f 6c 65 6e 3b 0a 0a 09 69 66 20 28 63 65  te_len;...if (ce
170a0 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3c 20  rtificate_len < 
170b0 30 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 2d 31  0) {...return(-1
170c0 29 3b 0a 09 7d 0a 0a 09 78 35 30 39 5f 72 65 61  );..}...x509_rea
170d0 64 5f 72 65 74 20 3d 20 78 35 30 39 5f 74 6f 5f  d_ret = x509_to_
170e0 73 75 62 6a 65 63 74 28 63 65 72 74 69 66 69 63  subject(certific
170f0 61 74 65 2c 20 63 65 72 74 69 66 69 63 61 74 65  ate, certificate
17100 5f 6c 65 6e 2c 20 28 76 6f 69 64 20 2a 2a 29 20  _len, (void **) 
17110 26 6c 61 62 65 6c 5f 61 73 6e 31 29 3b 0a 09 69  &label_asn1);..i
17120 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74  f (x509_read_ret
17130 20 3c 20 30 29 20 7b 0a 09 09 72 65 74 75 72 6e   < 0) {...return
17140 28 2d 31 29 3b 0a 09 7d 0a 0a 09 78 35 30 39 5f  (-1);..}...x509_
17150 72 65 61 64 5f 72 65 74 20 3d 20 78 35 30 39 5f  read_ret = x509_
17160 64 6e 5f 74 6f 5f 73 74 72 69 6e 67 28 6c 61 62  dn_to_string(lab
17170 65 6c 5f 61 73 6e 31 2c 20 78 35 30 39 5f 72 65  el_asn1, x509_re
17180 61 64 5f 72 65 74 2c 20 28 63 68 61 72 20 2a 29  ad_ret, (char *)
17190 20 6c 61 62 65 6c 5f 62 75 66 2c 20 6c 61 62 65   label_buf, labe
171a0 6c 5f 62 75 66 5f 6c 65 6e 2c 20 22 43 4e 22 29  l_buf_len, "CN")
171b0 3b 0a 09 69 66 20 28 78 35 30 39 5f 72 65 61 64  ;..if (x509_read
171c0 5f 72 65 74 20 3c 3d 20 30 29 20 7b 0a 09 09 78  _ret <= 0) {...x
171d0 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3d 20 78  509_read_ret = x
171e0 35 30 39 5f 64 6e 5f 74 6f 5f 73 74 72 69 6e 67  509_dn_to_string
171f0 28 6c 61 62 65 6c 5f 61 73 6e 31 2c 20 78 35 30  (label_asn1, x50
17200 39 5f 72 65 61 64 5f 72 65 74 2c 20 28 63 68 61  9_read_ret, (cha
17210 72 20 2a 29 20 6c 61 62 65 6c 5f 62 75 66 2c 20  r *) label_buf, 
17220 6c 61 62 65 6c 5f 62 75 66 5f 6c 65 6e 2c 20 4e  label_buf_len, N
17230 55 4c 4c 29 3b 0a 0a 09 09 69 66 20 28 78 35 30  ULL);....if (x50
17240 39 5f 72 65 61 64 5f 72 65 74 20 3c 3d 20 30 29  9_read_ret <= 0)
17250 20 7b 0a 09 09 09 72 65 74 75 72 6e 28 2d 31 29   {....return(-1)
17260 3b 0a 09 09 7d 0a 09 7d 0a 0a 23 69 66 64 65 66  ;...}..}..#ifdef
17270 20 43 41 43 4b 45 59 5f 50 41 52 41 4e 4f 49 44   CACKEY_PARANOID
17280 0a 23 20 20 69 66 64 65 66 20 5f 50 4f 53 49 58  .#  ifdef _POSIX
17290 5f 53 53 49 5a 45 5f 4d 41 58 0a 09 69 66 20 28  _SSIZE_MAX..if (
172a0 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3e 20  x509_read_ret > 
172b0 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58  _POSIX_SSIZE_MAX
172c0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
172d0 55 47 5f 50 52 49 4e 54 46 28 22 78 35 30 39 5f  UG_PRINTF("x509_
172e0 72 65 61 64 5f 72 65 74 20 65 78 63 65 65 64 73  read_ret exceeds
172f0 20 6d 61 78 69 6d 75 6d 20 76 61 6c 75 65 2c 20   maximum value, 
17300 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  returning in fai
17310 6c 75 72 65 2e 20 28 6d 61 78 20 3d 20 25 6c 69  lure. (max = %li
17320 2c 20 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20  , x509_read_ret 
17330 3d 20 25 6c 75 29 22 2c 20 28 6c 6f 6e 67 29 20  = %lu)", (long) 
17340 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58  _POSIX_SSIZE_MAX
17350 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
17360 29 20 78 35 30 39 5f 72 65 61 64 5f 72 65 74 29  ) x509_read_ret)
17370 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b  ;....return(-1);
17380 0a 09 7d 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e  ..}.#  endif.#en
17390 64 69 66 0a 0a 09 72 65 74 75 72 6e 28 78 35 30  dif...return(x50
173a0 39 5f 72 65 61 64 5f 72 65 74 29 3b 0a 7d 0a 0a  9_read_ret);.}..
173b0 2f 2a 20 52 65 74 75 72 6e 73 20 30 20 6f 6e 20  /* Returns 0 on 
173c0 73 75 63 63 65 73 73 20 2a 2f 0a 73 74 61 74 69  success */.stati
173d0 63 20 69 6e 74 20 63 61 63 6b 65 79 5f 6d 75 74  c int cackey_mut
173e0 65 78 5f 63 72 65 61 74 65 28 76 6f 69 64 20 2a  ex_create(void *
173f0 2a 6d 75 74 65 78 29 20 7b 0a 09 70 74 68 72 65  *mutex) {..pthre
17400 61 64 5f 6d 75 74 65 78 5f 74 20 2a 70 74 68 72  ad_mutex_t *pthr
17410 65 61 64 5f 6d 75 74 65 78 3b 0a 09 69 6e 74 20  ead_mutex;..int 
17420 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c 3b 0a  pthread_retval;.
17430 09 43 4b 5f 52 56 20 63 75 73 74 6f 6d 5f 72 65  .CK_RV custom_re
17440 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  tval;...CACKEY_D
17450 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
17460 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 28 63  led.");...if ((c
17470 61 63 6b 65 79 5f 61 72 67 73 2e 66 6c 61 67 73  ackey_args.flags
17480 20 26 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e   & CKF_OS_LOCKIN
17490 47 5f 4f 4b 29 20 3d 3d 20 43 4b 46 5f 4f 53 5f  G_OK) == CKF_OS_
174a0 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20 7b 0a 09 09  LOCKING_OK) {...
174b0 70 74 68 72 65 61 64 5f 6d 75 74 65 78 20 3d 20  pthread_mutex = 
174c0 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70  malloc(sizeof(*p
174d0 74 68 72 65 61 64 5f 6d 75 74 65 78 29 29 3b 0a  thread_mutex));.
174e0 09 09 69 66 20 28 21 70 74 68 72 65 61 64 5f 6d  ..if (!pthread_m
174f0 75 74 65 78 29 20 7b 0a 09 09 09 43 41 43 4b 45  utex) {....CACKE
17500 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
17510 46 61 69 6c 65 64 20 74 6f 20 61 6c 6c 6f 63 61  Failed to alloca
17520 74 65 20 6d 65 6d 6f 72 79 2e 22 29 3b 0a 0a 09  te memory.");...
17530 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09  ..return(-1);...
17540 7d 0a 0a 09 09 70 74 68 72 65 61 64 5f 72 65 74  }....pthread_ret
17550 76 61 6c 20 3d 20 70 74 68 72 65 61 64 5f 6d 75  val = pthread_mu
17560 74 65 78 5f 69 6e 69 74 28 70 74 68 72 65 61 64  tex_init(pthread
17570 5f 6d 75 74 65 78 2c 20 4e 55 4c 4c 29 3b 0a 09  _mutex, NULL);..
17580 09 69 66 20 28 70 74 68 72 65 61 64 5f 72 65 74  .if (pthread_ret
17590 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 09 43  val != 0) {....C
175a0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
175b0 54 46 28 22 70 74 68 72 65 61 64 5f 6d 75 74 65  TF("pthread_mute
175c0 78 5f 69 6e 69 74 28 29 20 72 65 74 75 72 6e 65  x_init() returne
175d0 64 20 65 72 72 6f 72 20 28 25 69 29 2e 22 2c 20  d error (%i).", 
175e0 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c 29 3b  pthread_retval);
175f0 0a 0a 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b  .....return(-1);
17600 0a 09 09 7d 0a 0a 09 09 2a 6d 75 74 65 78 20 3d  ...}....*mutex =
17610 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78 3b 0a   pthread_mutex;.
17620 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69 66 20 28  .} else {...if (
17630 63 61 63 6b 65 79 5f 61 72 67 73 2e 43 72 65 61  cackey_args.Crea
17640 74 65 4d 75 74 65 78 29 20 7b 0a 09 09 09 63 75  teMutex) {....cu
17650 73 74 6f 6d 5f 72 65 74 76 61 6c 20 3d 20 63 61  stom_retval = ca
17660 63 6b 65 79 5f 61 72 67 73 2e 43 72 65 61 74 65  ckey_args.Create
17670 4d 75 74 65 78 28 6d 75 74 65 78 29 3b 0a 0a 09  Mutex(mutex);...
17680 09 09 69 66 20 28 63 75 73 74 6f 6d 5f 72 65 74  ..if (custom_ret
17690 76 61 6c 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b  val != CKR_OK) {
176a0 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
176b0 47 5f 50 52 49 4e 54 46 28 22 63 61 63 6b 65 79  G_PRINTF("cackey
176c0 5f 61 72 67 73 2e 43 72 65 61 74 65 4d 75 74 65  _args.CreateMute
176d0 78 28 29 20 72 65 74 75 72 6e 65 64 20 65 72 72  x() returned err
176e0 6f 72 20 28 25 6c 69 29 2e 22 2c 20 28 6c 6f 6e  or (%li).", (lon
176f0 67 29 20 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c  g) custom_retval
17700 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 2d  );......return(-
17710 31 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a 09 7d 0a  1);....}...}..}.
17720 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
17730 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
17740 20 73 75 63 65 73 73 66 75 6c 6c 79 20 28 30 29   sucessfully (0)
17750 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 30 29 3b  ");...return(0);
17760 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 73 20 30  .}../* Returns 0
17770 20 6f 6e 20 73 75 63 63 65 73 73 20 2a 2f 0a 73   on success */.s
17780 74 61 74 69 63 20 69 6e 74 20 63 61 63 6b 65 79  tatic int cackey
17790 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 76 6f 69 64  _mutex_lock(void
177a0 20 2a 6d 75 74 65 78 29 20 7b 0a 09 70 74 68 72   *mutex) {..pthr
177b0 65 61 64 5f 6d 75 74 65 78 5f 74 20 2a 70 74 68  ead_mutex_t *pth
177c0 72 65 61 64 5f 6d 75 74 65 78 3b 0a 09 69 6e 74  read_mutex;..int
177d0 20 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c 3b   pthread_retval;
177e0 0a 09 43 4b 5f 52 56 20 63 75 73 74 6f 6d 5f 72  ..CK_RV custom_r
177f0 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f  etval;...CACKEY_
17800 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
17810 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 28  lled.");...if ((
17820 63 61 63 6b 65 79 5f 61 72 67 73 2e 66 6c 61 67  cackey_args.flag
17830 73 20 26 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49  s & CKF_OS_LOCKI
17840 4e 47 5f 4f 4b 29 20 3d 3d 20 43 4b 46 5f 4f 53  NG_OK) == CKF_OS
17850 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20 7b 0a 09  _LOCKING_OK) {..
17860 09 70 74 68 72 65 61 64 5f 6d 75 74 65 78 20 3d  .pthread_mutex =
17870 20 6d 75 74 65 78 3b 0a 0a 09 09 70 74 68 72 65   mutex;....pthre
17880 61 64 5f 72 65 74 76 61 6c 20 3d 20 70 74 68 72  ad_retval = pthr
17890 65 61 64 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 70  ead_mutex_lock(p
178a0 74 68 72 65 61 64 5f 6d 75 74 65 78 29 3b 0a 09  thread_mutex);..
178b0 09 69 66 20 28 70 74 68 72 65 61 64 5f 72 65 74  .if (pthread_ret
178c0 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 09 43  val != 0) {....C
178d0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
178e0 54 46 28 22 70 74 68 72 65 61 64 5f 6d 75 74 65  TF("pthread_mute
178f0 78 5f 6c 6f 63 6b 28 29 20 72 65 74 75 72 6e 65  x_lock() returne
17900 64 20 65 72 72 6f 72 20 28 25 69 29 2e 22 2c 20  d error (%i).", 
17910 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c 29 3b  pthread_retval);
17920 0a 0a 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b  .....return(-1);
17930 0a 09 09 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09  ...}..} else {..
17940 09 69 66 20 28 63 61 63 6b 65 79 5f 61 72 67 73  .if (cackey_args
17950 2e 4c 6f 63 6b 4d 75 74 65 78 29 20 7b 0a 09 09  .LockMutex) {...
17960 09 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 20 3d  .custom_retval =
17970 20 63 61 63 6b 65 79 5f 61 72 67 73 2e 4c 6f 63   cackey_args.Loc
17980 6b 4d 75 74 65 78 28 6d 75 74 65 78 29 3b 0a 0a  kMutex(mutex);..
17990 09 09 09 69 66 20 28 63 75 73 74 6f 6d 5f 72 65  ...if (custom_re
179a0 74 76 61 6c 20 21 3d 20 43 4b 52 5f 4f 4b 29 20  tval != CKR_OK) 
179b0 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  {.....CACKEY_DEB
179c0 55 47 5f 50 52 49 4e 54 46 28 22 63 61 63 6b 65  UG_PRINTF("cacke
179d0 79 5f 61 72 67 73 2e 4c 6f 63 6b 4d 75 74 65 78  y_args.LockMutex
179e0 28 29 20 72 65 74 75 72 6e 65 64 20 65 72 72 6f  () returned erro
179f0 72 20 28 25 6c 69 29 2e 22 2c 20 28 6c 6f 6e 67  r (%li).", (long
17a00 29 20 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 29  ) custom_retval)
17a10 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 2d 31  ;......return(-1
17a20 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a 09 7d 0a 0a  );....}...}..}..
17a30 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
17a40 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
17a50 73 75 63 65 73 73 66 75 6c 6c 79 20 28 30 29 22  sucessfully (0)"
17a60 29 3b 0a 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a  );...return(0);.
17a70 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 73 20 30 20  }../* Returns 0 
17a80 6f 6e 20 73 75 63 63 65 73 73 20 2a 2f 0a 73 74  on success */.st
17a90 61 74 69 63 20 69 6e 74 20 63 61 63 6b 65 79 5f  atic int cackey_
17aa0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 76 6f 69  mutex_unlock(voi
17ab0 64 20 2a 6d 75 74 65 78 29 20 7b 0a 09 70 74 68  d *mutex) {..pth
17ac0 72 65 61 64 5f 6d 75 74 65 78 5f 74 20 2a 70 74  read_mutex_t *pt
17ad0 68 72 65 61 64 5f 6d 75 74 65 78 3b 0a 09 69 6e  hread_mutex;..in
17ae0 74 20 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c  t pthread_retval
17af0 3b 0a 09 43 4b 5f 52 56 20 63 75 73 74 6f 6d 5f  ;..CK_RV custom_
17b00 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59  retval;...CACKEY
17b10 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
17b20 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
17b30 28 63 61 63 6b 65 79 5f 61 72 67 73 2e 66 6c 61  (cackey_args.fla
17b40 67 73 20 26 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b  gs & CKF_OS_LOCK
17b50 49 4e 47 5f 4f 4b 29 20 3d 3d 20 43 4b 46 5f 4f  ING_OK) == CKF_O
17b60 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20 7b 0a  S_LOCKING_OK) {.
17b70 09 09 70 74 68 72 65 61 64 5f 6d 75 74 65 78 20  ..pthread_mutex 
17b80 3d 20 6d 75 74 65 78 3b 0a 0a 09 09 70 74 68 72  = mutex;....pthr
17b90 65 61 64 5f 72 65 74 76 61 6c 20 3d 20 70 74 68  ead_retval = pth
17ba0 72 65 61 64 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  read_mutex_unloc
17bb0 6b 28 70 74 68 72 65 61 64 5f 6d 75 74 65 78 29  k(pthread_mutex)
17bc0 3b 0a 09 09 69 66 20 28 70 74 68 72 65 61 64 5f  ;...if (pthread_
17bd0 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
17be0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
17bf0 52 49 4e 54 46 28 22 70 74 68 72 65 61 64 5f 6d  RINTF("pthread_m
17c00 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 29 20 72 65  utex_unlock() re
17c10 74 75 72 6e 65 64 20 65 72 72 6f 72 20 28 25 69  turned error (%i
17c20 29 2e 22 2c 20 70 74 68 72 65 61 64 5f 72 65 74  ).", pthread_ret
17c30 76 61 6c 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e  val);.....return
17c40 28 2d 31 29 3b 0a 09 09 7d 0a 09 7d 20 65 6c 73  (-1);...}..} els
17c50 65 20 7b 0a 09 09 69 66 20 28 63 61 63 6b 65 79  e {...if (cackey
17c60 5f 61 72 67 73 2e 55 6e 6c 6f 63 6b 4d 75 74 65  _args.UnlockMute
17c70 78 29 20 7b 0a 09 09 09 63 75 73 74 6f 6d 5f 72  x) {....custom_r
17c80 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 61  etval = cackey_a
17c90 72 67 73 2e 55 6e 6c 6f 63 6b 4d 75 74 65 78 28  rgs.UnlockMutex(
17ca0 6d 75 74 65 78 29 3b 0a 0a 09 09 09 69 66 20 28  mutex);.....if (
17cb0 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 20 21 3d  custom_retval !=
17cc0 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 09 09 43   CKR_OK) {.....C
17cd0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
17ce0 54 46 28 22 63 61 63 6b 65 79 5f 61 72 67 73 2e  TF("cackey_args.
17cf0 55 6e 6c 6f 63 6b 4d 75 74 65 78 28 29 20 72 65  UnlockMutex() re
17d00 74 75 72 6e 65 64 20 65 72 72 6f 72 20 28 25 6c  turned error (%l
17d10 69 29 2e 22 2c 20 28 6c 6f 6e 67 29 20 63 75 73  i).", (long) cus
17d20 74 6f 6d 5f 72 65 74 76 61 6c 29 3b 0a 0a 09 09  tom_retval);....
17d30 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09  ..return(-1);...
17d40 09 7d 0a 09 09 7d 0a 09 7d 0a 0a 09 43 41 43 4b  .}...}..}...CACK
17d50 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
17d60 22 52 65 74 75 72 6e 69 6e 67 20 73 75 63 65 73  "Returning suces
17d70 73 66 75 6c 6c 79 20 28 30 29 22 29 3b 0a 0a 09  sfully (0)");...
17d80 72 65 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a 73 74  return(0);.}..st
17d90 61 74 69 63 20 43 4b 5f 41 54 54 52 49 42 55 54  atic CK_ATTRIBUT
17da0 45 5f 50 54 52 20 63 61 63 6b 65 79 5f 67 65 74  E_PTR cackey_get
17db0 5f 61 74 74 72 69 62 75 74 65 73 28 43 4b 5f 4f  _attributes(CK_O
17dc0 42 4a 45 43 54 5f 43 4c 41 53 53 20 6f 62 6a 65  BJECT_CLASS obje
17dd0 63 74 63 6c 61 73 73 2c 20 73 74 72 75 63 74 20  ctclass, struct 
17de0 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e  cackey_pcsc_iden
17df0 74 69 74 79 20 2a 69 64 65 6e 74 69 74 79 2c 20  tity *identity, 
17e00 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 69 64  unsigned long id
17e10 65 6e 74 69 74 79 5f 6e 75 6d 2c 20 43 4b 5f 55  entity_num, CK_U
17e20 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 43 6f 75 6e  LONG_PTR pulCoun
17e30 74 29 20 7b 0a 09 73 74 61 74 69 63 20 43 4b 5f  t) {..static CK_
17e40 42 42 4f 4f 4c 20 63 6b 5f 74 72 75 65 20 3d 20  BBOOL ck_true = 
17e50 31 3b 0a 09 73 74 61 74 69 63 20 43 4b 5f 42 42  1;..static CK_BB
17e60 4f 4f 4c 20 63 6b 5f 66 61 6c 73 65 20 3d 20 30  OOL ck_false = 0
17e70 3b 0a 09 73 74 61 74 69 63 20 43 4b 5f 54 52 55  ;..static CK_TRU
17e80 53 54 20 63 6b 5f 74 72 75 73 74 65 64 20 3d 20  ST ck_trusted = 
17e90 43 4b 5f 54 52 55 53 54 45 44 5f 44 45 4c 45 47  CK_TRUSTED_DELEG
17ea0 41 54 4f 52 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20  ATOR;..CK_ULONG 
17eb0 6e 75 6d 61 74 74 72 73 20 3d 20 30 2c 20 72 65  numattrs = 0, re
17ec0 74 76 61 6c 5f 63 6f 75 6e 74 3b 0a 09 43 4b 5f  tval_count;..CK_
17ed0 41 54 54 52 49 42 55 54 45 5f 54 59 50 45 20 63  ATTRIBUTE_TYPE c
17ee0 75 72 72 5f 61 74 74 72 5f 74 79 70 65 3b 0a 09  urr_attr_type;..
17ef0 43 4b 5f 41 54 54 52 49 42 55 54 45 20 63 75 72  CK_ATTRIBUTE cur
17f00 72 5f 61 74 74 72 2c 20 2a 72 65 74 76 61 6c 3b  r_attr, *retval;
17f10 0a 09 43 4b 5f 56 4f 49 44 5f 50 54 52 20 70 56  ..CK_VOID_PTR pV
17f20 61 6c 75 65 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20  alue;..CK_ULONG 
17f30 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 09 43 4b 5f  ulValueLen;..CK_
17f40 4f 42 4a 45 43 54 5f 43 4c 41 53 53 20 63 6b 5f  OBJECT_CLASS ck_
17f50 6f 62 6a 65 63 74 5f 63 6c 61 73 73 3b 0a 09 43  object_class;..C
17f60 4b 5f 43 45 52 54 49 46 49 43 41 54 45 5f 54 59  K_CERTIFICATE_TY
17f70 50 45 20 63 6b 5f 63 65 72 74 69 66 69 63 61 74  PE ck_certificat
17f80 65 5f 74 79 70 65 3b 0a 09 43 4b 5f 4b 45 59 5f  e_type;..CK_KEY_
17f90 54 59 50 45 20 63 6b 5f 6b 65 79 5f 74 79 70 65  TYPE ck_key_type
17fa0 3b 0a 09 43 4b 5f 55 54 46 38 43 48 41 52 20 75  ;..CK_UTF8CHAR u
17fb0 63 54 6d 70 42 75 66 5b 31 30 32 34 5d 3b 0a 09  cTmpBuf[1024];..
17fc0 53 48 41 31 43 6f 6e 74 65 78 74 20 73 68 61 31  SHA1Context sha1
17fd0 5f 63 74 78 3b 0a 09 4d 44 35 5f 43 54 58 20 6d  _ctx;..MD5_CTX m
17fe0 64 35 5f 63 74 78 3b 0a 09 75 69 6e 74 38 5f 74  d5_ctx;..uint8_t
17ff0 20 73 68 61 31 5f 68 61 73 68 5b 53 48 41 31 48   sha1_hash[SHA1H
18000 61 73 68 53 69 7a 65 5d 3b 0a 09 75 69 6e 74 38  ashSize];..uint8
18010 5f 74 20 6d 64 35 5f 68 61 73 68 5b 4d 44 35 48  _t md5_hash[MD5H
18020 61 73 68 53 69 7a 65 5d 3b 0a 09 75 6e 73 69 67  ashSize];..unsig
18030 6e 65 64 20 63 68 61 72 20 2a 63 65 72 74 69 66  ned char *certif
18040 69 63 61 74 65 3b 0a 09 73 73 69 7a 65 5f 74 20  icate;..ssize_t 
18050 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20  certificate_len 
18060 3d 20 2d 31 2c 20 78 35 30 39 5f 72 65 61 64 5f  = -1, x509_read_
18070 72 65 74 3b 0a 09 69 6e 74 20 70 56 61 6c 75 65  ret;..int pValue
18080 5f 66 72 65 65 3b 0a 0a 09 43 41 43 4b 45 59 5f  _free;...CACKEY_
18090 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
180a0 6c 6c 65 64 20 28 6f 62 6a 65 63 74 43 6c 61 73  lled (objectClas
180b0 73 20 3d 20 25 6c 75 2c 20 69 64 65 6e 74 69 74  s = %lu, identit
180c0 79 5f 6e 75 6d 20 3d 20 25 6c 75 29 2e 22 2c 20  y_num = %lu).", 
180d0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
180e0 6f 62 6a 65 63 74 63 6c 61 73 73 2c 20 69 64 65  objectclass, ide
180f0 6e 74 69 74 79 5f 6e 75 6d 29 3b 0a 0a 09 2a 70  ntity_num);...*p
18100 75 6c 43 6f 75 6e 74 20 3d 20 30 3b 0a 0a 09 69  ulCount = 0;...i
18110 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 21  f (objectclass !
18120 3d 20 43 4b 4f 5f 43 45 52 54 49 46 49 43 41 54  = CKO_CERTIFICAT
18130 45 20 26 26 20 6f 62 6a 65 63 74 63 6c 61 73 73  E && objectclass
18140 20 21 3d 20 43 4b 4f 5f 50 55 42 4c 49 43 5f 4b   != CKO_PUBLIC_K
18150 45 59 20 26 26 20 6f 62 6a 65 63 74 63 6c 61 73  EY && objectclas
18160 73 20 21 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45  s != CKO_PRIVATE
18170 5f 4b 45 59 20 26 26 20 6f 62 6a 65 63 74 63 6c  _KEY && objectcl
18180 61 73 73 20 21 3d 20 43 4b 4f 5f 4e 45 54 53 43  ass != CKO_NETSC
18190 41 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 43  APE_TRUST) {...C
181a0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
181b0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 30 20  TF("Returning 0 
181c0 6f 62 6a 65 63 74 73 20 28 4e 55 4c 4c 29 2c 20  objects (NULL), 
181d0 69 6e 76 61 6c 69 64 20 6f 62 6a 65 63 74 20 63  invalid object c
181e0 6c 61 73 73 22 29 3b 0a 0a 09 09 72 65 74 75 72  lass");....retur
181f0 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 2f 2a  n(NULL);..}.../*
18200 20 47 65 74 20 43 65 72 74 20 2a 2f 0a 09 69 66   Get Cert */..if
18210 20 28 69 64 65 6e 74 69 74 79 20 3d 3d 20 4e 55   (identity == NU
18220 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
18230 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
18240 75 72 6e 69 6e 67 20 30 20 6f 62 6a 65 63 74 73  urning 0 objects
18250 20 28 4e 55 4c 4c 29 2c 20 69 6e 76 61 6c 69 64   (NULL), invalid
18260 20 69 64 65 6e 74 69 79 20 70 72 6f 76 69 64 65   identiy provide
18270 64 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e  d");....return(N
18280 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 63 65 72 74 69  ULL);..}...certi
18290 66 69 63 61 74 65 20 3d 20 69 64 65 6e 74 69 74  ficate = identit
182a0 79 2d 3e 63 65 72 74 69 66 69 63 61 74 65 3b 0a  y->certificate;.
182b0 09 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e  .certificate_len
182c0 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e 63 65 72   = identity->cer
182d0 74 69 66 69 63 61 74 65 5f 6c 65 6e 3b 0a 0a 09  tificate_len;...
182e0 69 66 20 28 63 65 72 74 69 66 69 63 61 74 65 5f  if (certificate_
182f0 6c 65 6e 20 3d 3d 20 2d 31 20 7c 7c 20 63 65 72  len == -1 || cer
18300 74 69 66 69 63 61 74 65 20 3d 3d 20 4e 55 4c 4c  tificate == NULL
18310 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
18320 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
18330 6e 69 6e 67 20 30 20 6f 62 6a 65 63 74 73 20 28  ning 0 objects (
18340 4e 55 4c 4c 29 2c 20 74 68 69 73 20 69 64 65 6e  NULL), this iden
18350 74 69 74 79 20 64 6f 65 73 20 6e 6f 74 20 68 61  tity does not ha
18360 76 65 20 61 6e 20 58 2e 35 30 39 20 63 65 72 74  ve an X.509 cert
18370 69 66 69 63 61 74 65 20 61 73 73 6f 63 69 61 74  ificate associat
18380 65 64 20 77 69 74 68 20 69 74 20 61 6e 64 20 77  ed with it and w
18390 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 22 29 3b 0a  ill not work");.
183a0 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b  ...return(NULL);
183b0 0a 09 7d 0a 0a 09 2f 2a 20 56 65 72 69 66 79 20  ..}.../* Verify 
183c0 74 68 61 74 20 63 65 72 74 69 66 69 63 61 74 65  that certificate
183d0 20 69 73 20 41 53 4e 2e 31 20 65 6e 63 6f 64 65   is ASN.1 encode
183e0 64 20 58 2e 35 30 39 20 63 65 72 74 69 66 69 63  d X.509 certific
183f0 61 74 65 20 2a 2f 0a 09 69 66 20 28 78 35 30 39  ate */..if (x509
18400 5f 74 6f 5f 73 65 72 69 61 6c 28 63 65 72 74 69  _to_serial(certi
18410 66 69 63 61 74 65 2c 20 63 65 72 74 69 66 69 63  ficate, certific
18420 61 74 65 5f 6c 65 6e 2c 20 4e 55 4c 4c 29 20 3c  ate_len, NULL) <
18430 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
18440 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
18450 75 72 6e 69 6e 67 20 30 20 6f 62 6a 65 63 74 73  urning 0 objects
18460 20 28 4e 55 4c 4c 29 2c 20 74 68 65 20 58 2e 35   (NULL), the X.5
18470 30 39 20 63 65 72 74 69 66 69 63 61 74 65 20 61  09 certificate a
18480 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
18490 68 69 73 20 69 64 65 6e 74 69 74 79 20 69 73 20  his identity is 
184a0 6e 6f 74 20 76 61 6c 69 64 22 29 3b 0a 0a 09 09  not valid");....
184b0 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d  return(NULL);..}
184c0 0a 0a 09 72 65 74 76 61 6c 5f 63 6f 75 6e 74 20  ...retval_count 
184d0 3d 20 36 34 3b 0a 09 72 65 74 76 61 6c 20 3d 20  = 64;..retval = 
184e0 6d 61 6c 6c 6f 63 28 72 65 74 76 61 6c 5f 63 6f  malloc(retval_co
184f0 75 6e 74 20 2a 20 73 69 7a 65 6f 66 28 2a 72 65  unt * sizeof(*re
18500 74 76 61 6c 29 29 3b 0a 0a 09 66 6f 72 20 28 63  tval));...for (c
18510 75 72 72 5f 61 74 74 72 5f 74 79 70 65 20 3d 20  urr_attr_type = 
18520 30 3b 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70  0; curr_attr_typ
18530 65 20 3c 20 30 78 63 65 35 33 36 33 62 66 3b 20  e < 0xce5363bf; 
18540 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 2b 2b  curr_attr_type++
18550 29 20 7b 0a 09 09 69 66 20 28 63 75 72 72 5f 61  ) {...if (curr_a
18560 74 74 72 5f 74 79 70 65 20 3d 3d 20 30 78 38 30  ttr_type == 0x80
18570 30 29 20 7b 0a 09 09 09 63 75 72 72 5f 61 74 74  0) {....curr_att
18580 72 5f 74 79 70 65 20 3d 20 30 78 63 65 35 33 36  r_type = 0xce536
18590 33 30 30 3b 0a 09 09 7d 0a 0a 09 09 70 56 61 6c  300;...}....pVal
185a0 75 65 5f 66 72 65 65 20 3d 20 30 3b 0a 09 09 70  ue_free = 0;...p
185b0 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09  Value = NULL;...
185c0 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 28 43 4b  ulValueLen = (CK
185d0 5f 4c 4f 4e 47 29 20 2d 31 3b 0a 0a 09 09 73 77  _LONG) -1;....sw
185e0 69 74 63 68 20 28 63 75 72 72 5f 61 74 74 72 5f  itch (curr_attr_
185f0 74 79 70 65 29 20 7b 0a 09 09 09 63 61 73 65 20  type) {....case 
18600 43 4b 41 5f 43 4c 41 53 53 3a 0a 09 09 09 09 43  CKA_CLASS:.....C
18610 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
18620 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61  TF("Requesting a
18630 74 74 72 69 62 75 74 65 20 43 4b 41 5f 43 4c 41  ttribute CKA_CLA
18640 53 53 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e  SS (0x%08lx) ...
18650 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
18660 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70  g) curr_attr_typ
18670 65 29 3b 0a 0a 09 09 09 09 63 6b 5f 6f 62 6a 65  e);......ck_obje
18680 63 74 5f 63 6c 61 73 73 20 3d 20 6f 62 6a 65 63  ct_class = objec
18690 74 63 6c 61 73 73 3b 0a 0a 09 09 09 09 70 56 61  tclass;......pVa
186a0 6c 75 65 20 3d 20 26 63 6b 5f 6f 62 6a 65 63 74  lue = &ck_object
186b0 5f 63 6c 61 73 73 3b 0a 09 09 09 09 75 6c 56 61  _class;.....ulVa
186c0 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28  lueLen = sizeof(
186d0 63 6b 5f 6f 62 6a 65 63 74 5f 63 6c 61 73 73 29  ck_object_class)
186e0 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  ;......CACKEY_DE
186f0 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
18700 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28   returning %lu (
18710 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67  %p/%lu)", (unsig
18720 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f  ned long) *((CK_
18730 4f 42 4a 45 43 54 5f 43 4c 41 53 53 20 2a 29 20  OBJECT_CLASS *) 
18740 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c  pValue), pValue,
18750 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
18760 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09   ulValueLen);...
18770 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
18780 65 20 43 4b 41 5f 54 4f 4b 45 4e 3a 0a 09 09 09  e CKA_TOKEN:....
18790 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
187a0 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67  INTF("Requesting
187b0 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 54   attribute CKA_T
187c0 4f 4b 45 4e 20 28 30 78 25 30 38 6c 78 29 20 2e  OKEN (0x%08lx) .
187d0 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ..", (unsigned l
187e0 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74  ong) curr_attr_t
187f0 79 70 65 29 3b 0a 0a 09 09 09 09 70 56 61 6c 75  ype);......pValu
18800 65 20 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09 09  e = &ck_true;...
18810 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73  ..ulValueLen = s
18820 69 7a 65 6f 66 28 63 6b 5f 74 72 75 65 29 3b 0a  izeof(ck_true);.
18830 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
18840 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72  G_PRINTF(" ... r
18850 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70  eturning %lu (%p
18860 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65  /%lu)", (unsigne
18870 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42  d long) *((CK_BB
18880 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c 20  OOL *) pValue), 
18890 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65  pValue, (unsigne
188a0 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c  d long) ulValueL
188b0 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b  en);......break;
188c0 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 50 52 49  ....case CKA_PRI
188d0 56 41 54 45 3a 0a 09 09 09 09 43 41 43 4b 45 59  VATE:.....CACKEY
188e0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
188f0 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62  equesting attrib
18900 75 74 65 20 43 4b 41 5f 50 52 49 56 41 54 45 20  ute CKA_PRIVATE 
18910 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20  (0x%08lx) ...", 
18920 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
18930 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b  curr_attr_type);
18940 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74  ......if (object
18950 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 4e 45 54  class != CKO_NET
18960 53 43 41 50 45 5f 54 52 55 53 54 29 20 7b 0a 09  SCAPE_TRUST) {..
18970 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
18980 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75  _PRINTF(" ... bu
18990 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74  t not getting it
189a0 20 62 65 63 61 75 73 65 20 77 65 20 61 72 65 20   because we are 
189b0 6e 6f 74 20 61 20 4e 65 74 73 63 61 70 65 20 74  not a Netscape t
189c0 72 75 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a  rust object");..
189d0 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09  .....break;.....
189e0 7d 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20  }......pValue = 
189f0 26 63 6b 5f 66 61 6c 73 65 3b 0a 09 09 09 09 75  &ck_false;.....u
18a00 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65  lValueLen = size
18a10 6f 66 28 63 6b 5f 66 61 6c 73 65 29 3b 0a 0a 09  of(ck_false);...
18a20 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
18a30 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74  PRINTF(" ... ret
18a40 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25  urning %lu (%p/%
18a50 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  lu)", (unsigned 
18a60 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f  long) *((CK_BBOO
18a70 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56  L *) pValue), pV
18a80 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20  alue, (unsigned 
18a90 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e  long) ulValueLen
18aa0 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  );......break;..
18ab0 09 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54  ..case CKA_TRUST
18ac0 45 44 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  ED:.....CACKEY_D
18ad0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71  EBUG_PRINTF("Req
18ae0 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74  uesting attribut
18af0 65 20 43 4b 41 5f 54 52 55 53 54 45 44 20 28 30  e CKA_TRUSTED (0
18b00 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75  x%08lx) ...", (u
18b10 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75  nsigned long) cu
18b20 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a  rr_attr_type);..
18b30 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c  ....if (objectcl
18b40 61 73 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43  ass == CKO_NETSC
18b50 41 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09  APE_TRUST) {....
18b60 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
18b70 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20  RINTF(" ... but 
18b80 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 62  not getting it b
18b90 65 63 61 75 73 65 20 77 65 20 61 72 65 20 61 20  ecause we are a 
18ba0 4e 65 74 73 63 61 70 65 20 74 72 75 73 74 20 6f  Netscape trust o
18bb0 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62  bject");.......b
18bc0 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09  reak;.....}.....
18bd0 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 74 72  .pValue = &ck_tr
18be0 75 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c  ue;.....ulValueL
18bf0 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 74  en = sizeof(ck_t
18c00 72 75 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45  rue);......CACKE
18c10 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
18c20 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25   ... returning %
18c30 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75  lu (%p/%lu)", (u
18c40 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28  nsigned long) *(
18c50 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61  (CK_BBOOL *) pVa
18c60 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75  lue), pValue, (u
18c70 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c  nsigned long) ul
18c80 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09  ValueLen);......
18c90 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43  break;....case C
18ca0 4b 41 5f 4d 4f 44 49 46 49 41 42 4c 45 3a 0a 09  KA_MODIFIABLE:..
18cb0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
18cc0 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69  PRINTF("Requesti
18cd0 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41  ng attribute CKA
18ce0 5f 4d 4f 44 49 46 49 41 42 4c 45 20 28 30 78 25  _MODIFIABLE (0x%
18cf0 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73  08lx) ...", (uns
18d00 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72  igned long) curr
18d10 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09  _attr_type);....
18d20 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 66  ..pValue = &ck_f
18d30 61 6c 73 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75  alse;.....ulValu
18d40 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b  eLen = sizeof(ck
18d50 5f 66 61 6c 73 65 29 3b 0a 0a 09 09 09 09 43 41  _false);......CA
18d60 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
18d70 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e  F(" ... returnin
18d80 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c  g %lu (%p/%lu)",
18d90 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
18da0 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20   *((CK_BBOOL *) 
18db0 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c  pValue), pValue,
18dc0 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
18dd0 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09   ulValueLen);...
18de0 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
18df0 65 20 43 4b 41 5f 4c 41 42 45 4c 3a 0a 09 09 09  e CKA_LABEL:....
18e00 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
18e10 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67  INTF("Requesting
18e20 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 4c   attribute CKA_L
18e30 41 42 45 4c 20 28 30 78 25 30 38 6c 78 29 20 2e  ABEL (0x%08lx) .
18e40 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ..", (unsigned l
18e50 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74  ong) curr_attr_t
18e60 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 69  ype);......if (i
18e70 64 65 6e 74 69 74 79 2d 3e 69 64 5f 74 79 70 65  dentity->id_type
18e80 20 3d 3d 20 43 41 43 4b 45 59 5f 49 44 5f 54 59   == CACKEY_ID_TY
18e90 50 45 5f 50 49 56 29 20 7b 0a 09 09 09 09 09 70  PE_PIV) {......p
18ea0 56 61 6c 75 65 20 3d 20 69 64 65 6e 74 69 74 79  Value = identity
18eb0 2d 3e 63 61 72 64 2e 70 69 76 2e 6c 61 62 65 6c  ->card.piv.label
18ec0 3b 0a 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65  ;......ulValueLe
18ed0 6e 20 3d 20 73 74 72 6c 65 6e 28 70 56 61 6c 75  n = strlen(pValu
18ee0 65 29 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b  e);.....} else {
18ef0 0a 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e  ......ulValueLen
18f00 20 3d 20 73 6e 70 72 69 6e 74 66 28 28 63 68 61   = snprintf((cha
18f10 72 20 2a 29 20 75 63 54 6d 70 42 75 66 2c 20 73  r *) ucTmpBuf, s
18f20 69 7a 65 6f 66 28 75 63 54 6d 70 42 75 66 29 2c  izeof(ucTmpBuf),
18f30 20 22 49 64 65 6e 74 69 74 79 20 23 25 6c 75 22   "Identity #%lu"
18f40 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
18f50 29 20 69 64 65 6e 74 69 74 79 5f 6e 75 6d 29 3b  ) identity_num);
18f60 0a 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 75  ......pValue = u
18f70 63 54 6d 70 42 75 66 3b 0a 0a 09 09 09 09 09 69  cTmpBuf;.......i
18f80 66 20 28 75 6c 56 61 6c 75 65 4c 65 6e 20 3e 3d  f (ulValueLen >=
18f90 20 73 69 7a 65 6f 66 28 75 63 54 6d 70 42 75 66   sizeof(ucTmpBuf
18fa0 29 29 20 7b 0a 09 09 09 09 09 09 75 6c 56 61 6c  )) {.......ulVal
18fb0 75 65 4c 65 6e 20 3d 20 30 3b 0a 09 09 09 09 09  ueLen = 0;......
18fc0 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a  .pValue = NULL;.
18fd0 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 0a 09 09  .....}.....}....
18fe0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
18ff0 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75  RINTF(" ... retu
19000 72 6e 69 6e 67 20 28 25 70 2f 25 6c 75 29 22 2c  rning (%p/%lu)",
19010 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e   pValue, (unsign
19020 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65  ed long) ulValue
19030 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b  Len);......break
19040 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 56 41  ;....case CKA_VA
19050 4c 55 45 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f  LUE:.....CACKEY_
19060 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
19070 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75  questing attribu
19080 74 65 20 43 4b 41 5f 56 41 4c 55 45 20 28 30 78  te CKA_VALUE (0x
19090 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e  %08lx) ...", (un
190a0 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72  signed long) cur
190b0 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09  r_attr_type);...
190c0 09 09 09 73 77 69 74 63 68 20 28 6f 62 6a 65 63  ...switch (objec
190d0 74 63 6c 61 73 73 29 20 7b 0a 09 09 09 09 09 63  tclass) {......c
190e0 61 73 65 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f  ase CKO_PRIVATE_
190f0 4b 45 59 3a 0a 09 09 09 09 09 09 43 41 43 4b 45  KEY:.......CACKE
19100 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
19110 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74   ... but not get
19120 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20  ting it because 
19130 77 65 20 61 72 65 20 61 20 70 72 69 76 61 74 65  we are a private
19140 20 6b 65 79 2e 22 29 3b 0a 0a 09 09 09 09 09 09   key.");........
19150 62 72 65 61 6b 3b 0a 09 09 09 09 09 63 61 73 65  break;......case
19160 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52   CKO_NETSCAPE_TR
19170 55 53 54 3a 0a 09 09 09 09 09 09 43 41 43 4b 45  UST:.......CACKE
19180 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
19190 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74   ... but not get
191a0 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20  ting it because 
191b0 77 65 20 61 72 65 20 61 20 4e 65 74 73 63 61 70  we are a Netscap
191c0 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29  e trust object")
191d0 3b 0a 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a  ;........break;.
191e0 09 09 09 09 09 63 61 73 65 20 43 4b 4f 5f 50 55  .....case CKO_PU
191f0 42 4c 49 43 5f 4b 45 59 3a 0a 09 09 09 09 09 09  BLIC_KEY:.......
19200 69 66 20 28 63 65 72 74 69 66 69 63 61 74 65 5f  if (certificate_
19210 6c 65 6e 20 3e 3d 20 30 29 20 7b 0a 09 09 09 09  len >= 0) {.....
19220 09 09 09 78 35 30 39 5f 72 65 61 64 5f 72 65 74  ...x509_read_ret
19230 20 3d 20 78 35 30 39 5f 74 6f 5f 70 75 62 6b 65   = x509_to_pubke
19240 79 28 63 65 72 74 69 66 69 63 61 74 65 2c 20 63  y(certificate, c
19250 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c 20  ertificate_len, 
19260 26 70 56 61 6c 75 65 29 3b 0a 09 09 09 09 09 09  &pValue);.......
19270 09 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72  .if (x509_read_r
19280 65 74 20 3c 20 30 29 20 7b 20 0a 09 09 09 09 09  et < 0) { ......
19290 09 09 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c  ...pValue = NULL
192a0 3b 0a 09 09 09 09 09 09 09 7d 20 65 6c 73 65 20  ;........} else 
192b0 7b 0a 09 09 09 09 09 09 09 09 75 6c 56 61 6c 75  {.........ulValu
192c0 65 4c 65 6e 20 3d 20 78 35 30 39 5f 72 65 61 64  eLen = x509_read
192d0 5f 72 65 74 3b 0a 09 09 09 09 09 09 09 7d 0a 09  _ret;........}..
192e0 09 09 09 09 09 7d 0a 0a 09 09 09 09 09 09 62 72  .....}........br
192f0 65 61 6b 3b 0a 09 09 09 09 09 63 61 73 65 20 43  eak;......case C
19300 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 45 3a 0a  KO_CERTIFICATE:.
19310 09 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 63  ......pValue = c
19320 65 72 74 69 66 69 63 61 74 65 3b 0a 09 09 09 09  ertificate;.....
19330 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 63  ..ulValueLen = c
19340 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 3b 0a  ertificate_len;.
19350 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .......break;...
19360 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f  ..}......CACKEY_
19370 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
19380 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 70 2f  .. returning %p/
19390 25 6c 75 22 2c 20 70 56 61 6c 75 65 2c 20 28 75  %lu", pValue, (u
193a0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c  nsigned long) ul
193b0 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09  ValueLen);......
193c0 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43  break;....case C
193d0 4b 41 5f 49 53 53 55 45 52 3a 0a 09 09 09 09 43  KA_ISSUER:.....C
193e0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
193f0 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61  TF("Requesting a
19400 74 74 72 69 62 75 74 65 20 43 4b 41 5f 49 53 53  ttribute CKA_ISS
19410 55 45 52 20 28 30 78 25 30 38 6c 78 29 20 2e 2e  UER (0x%08lx) ..
19420 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  .", (unsigned lo
19430 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79  ng) curr_attr_ty
19440 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62  pe);......if (ob
19450 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f  jectclass != CKO
19460 5f 43 45 52 54 49 46 49 43 41 54 45 20 26 26 20  _CERTIFICATE && 
19470 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43  objectclass != C
19480 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53  KO_NETSCAPE_TRUS
19490 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59  T) {......CACKEY
194a0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
194b0 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74  ... but not gett
194c0 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77  ing it because w
194d0 65 20 61 72 65 20 6e 6f 74 20 61 20 63 65 72 74  e are not a cert
194e0 69 66 69 63 61 74 65 20 6f 72 20 4e 65 74 73 63  ificate or Netsc
194f0 61 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74  ape trust object
19500 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b  ");.......break;
19510 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69 66 20 28  .....}......if (
19520 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20  certificate_len 
19530 3e 3d 20 30 29 20 7b 0a 09 09 09 09 09 78 35 30  >= 0) {......x50
19540 39 5f 72 65 61 64 5f 72 65 74 20 3d 20 78 35 30  9_read_ret = x50
19550 39 5f 74 6f 5f 69 73 73 75 65 72 28 63 65 72 74  9_to_issuer(cert
19560 69 66 69 63 61 74 65 2c 20 63 65 72 74 69 66 69  ificate, certifi
19570 63 61 74 65 5f 6c 65 6e 2c 20 26 70 56 61 6c 75  cate_len, &pValu
19580 65 29 3b 0a 09 09 09 09 09 69 66 20 28 78 35 30  e);......if (x50
19590 39 5f 72 65 61 64 5f 72 65 74 20 3c 20 30 29 20  9_read_ret < 0) 
195a0 7b 0a 09 09 09 09 09 09 70 56 61 6c 75 65 20 3d  {.......pValue =
195b0 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 7d 20 65 6c   NULL;......} el
195c0 73 65 20 7b 0a 09 09 09 09 09 09 75 6c 56 61 6c  se {.......ulVal
195d0 75 65 4c 65 6e 20 3d 20 78 35 30 39 5f 72 65 61  ueLen = x509_rea
195e0 64 5f 72 65 74 3b 0a 09 09 09 09 09 7d 0a 09 09  d_ret;......}...
195f0 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f  ..}......CACKEY_
19600 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
19610 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 70 2f  .. returning %p/
19620 25 6c 75 22 2c 20 70 56 61 6c 75 65 2c 20 28 75  %lu", pValue, (u
19630 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c  nsigned long) ul
19640 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09  ValueLen);......
19650 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43  break;....case C
19660 4b 41 5f 53 45 52 49 41 4c 5f 4e 55 4d 42 45 52  KA_SERIAL_NUMBER
19670 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  :.....CACKEY_DEB
19680 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65  UG_PRINTF("Reque
19690 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20  sting attribute 
196a0 43 4b 41 5f 53 45 52 49 41 4c 5f 4e 55 4d 42 45  CKA_SERIAL_NUMBE
196b0 52 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22  R (0x%08lx) ..."
196c0 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
196d0 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65  ) curr_attr_type
196e0 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65  );......if (obje
196f0 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 43  ctclass != CKO_C
19700 45 52 54 49 46 49 43 41 54 45 20 26 26 20 6f 62  ERTIFICATE && ob
19710 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f  jectclass != CKO
19720 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54 29  _NETSCAPE_TRUST)
19730 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44   {......CACKEY_D
19740 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
19750 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e  . but not gettin
19760 67 20 69 74 20 62 65 63 61 75 73 65 20 77 65 20  g it because we 
19770 61 72 65 20 6e 6f 74 20 61 20 63 65 72 74 69 66  are not a certif
19780 69 63 61 74 65 20 6f 72 20 4e 65 74 73 63 61 70  icate or Netscap
19790 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29  e trust object")
197a0 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09  ;.......break;..
197b0 09 09 09 7d 0a 0a 09 09 09 09 69 66 20 28 63 65  ...}......if (ce
197c0 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3e 3d  rtificate_len >=
197d0 20 30 29 20 7b 0a 09 09 09 09 09 78 35 30 39 5f   0) {......x509_
197e0 72 65 61 64 5f 72 65 74 20 3d 20 78 35 30 39 5f  read_ret = x509_
197f0 74 6f 5f 73 65 72 69 61 6c 28 63 65 72 74 69 66  to_serial(certif
19800 69 63 61 74 65 2c 20 63 65 72 74 69 66 69 63 61  icate, certifica
19810 74 65 5f 6c 65 6e 2c 20 26 70 56 61 6c 75 65 29  te_len, &pValue)
19820 3b 0a 09 09 09 09 09 69 66 20 28 78 35 30 39 5f  ;......if (x509_
19830 72 65 61 64 5f 72 65 74 20 3c 20 30 29 20 7b 0a  read_ret < 0) {.
19840 09 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 4e  ......pValue = N
19850 55 4c 4c 3b 0a 09 09 09 09 09 7d 20 65 6c 73 65  ULL;......} else
19860 20 7b 0a 09 09 09 09 09 09 75 6c 56 61 6c 75 65   {.......ulValue
19870 4c 65 6e 20 3d 20 78 35 30 39 5f 72 65 61 64 5f  Len = x509_read_
19880 72 65 74 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09  ret;......}.....
19890 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  }......CACKEY_DE
198a0 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
198b0 20 72 65 74 75 72 6e 69 6e 67 20 28 25 70 2f 25   returning (%p/%
198c0 6c 75 29 22 2c 20 70 56 61 6c 75 65 2c 20 28 75  lu)", pValue, (u
198d0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c  nsigned long) ul
198e0 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09  ValueLen);......
198f0 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43  break;....case C
19900 4b 41 5f 53 55 42 4a 45 43 54 3a 0a 09 09 09 09  KA_SUBJECT:.....
19910 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
19920 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20  NTF("Requesting 
19930 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 53 55  attribute CKA_SU
19940 42 4a 45 43 54 20 28 30 78 25 30 38 6c 78 29 20  BJECT (0x%08lx) 
19950 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  ...", (unsigned 
19960 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f  long) curr_attr_
19970 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28  type);......if (
19980 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43  objectclass != C
19990 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 45 29 20  KO_CERTIFICATE) 
199a0 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45  {......CACKEY_DE
199b0 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
199c0 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67   but not getting
199d0 20 69 74 20 62 65 63 61 75 73 65 20 77 65 20 61   it because we a
199e0 72 65 20 6e 6f 74 20 61 20 63 65 72 74 69 66 69  re not a certifi
199f0 63 61 74 65 22 29 3b 0a 0a 09 09 09 09 09 62 72  cate");.......br
19a00 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09  eak;.....}......
19a10 69 66 20 28 63 65 72 74 69 66 69 63 61 74 65 5f  if (certificate_
19a20 6c 65 6e 20 3e 3d 20 30 29 20 7b 0a 09 09 09 09  len >= 0) {.....
19a30 09 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3d  .x509_read_ret =
19a40 20 78 35 30 39 5f 74 6f 5f 73 75 62 6a 65 63 74   x509_to_subject
19a50 28 63 65 72 74 69 66 69 63 61 74 65 2c 20 63 65  (certificate, ce
19a60 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c 20 26  rtificate_len, &
19a70 70 56 61 6c 75 65 29 3b 0a 09 09 09 09 09 69 66  pValue);......if
19a80 20 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20   (x509_read_ret 
19a90 3c 20 30 29 20 7b 0a 09 09 09 09 09 09 70 56 61  < 0) {.......pVa
19aa0 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09  lue = NULL;.....
19ab0 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09  .} else {.......
19ac0 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 78 35 30  ulValueLen = x50
19ad0 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09 09 09 09  9_read_ret;.....
19ae0 09 7d 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41  .}.....}......CA
19af0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
19b00 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e  F(" ... returnin
19b10 67 20 25 70 2f 25 6c 75 22 2c 20 70 56 61 6c 75  g %p/%lu", pValu
19b20 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  e, (unsigned lon
19b30 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a  g) ulValueLen);.
19b40 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
19b50 61 73 65 20 43 4b 41 5f 49 44 3a 0a 09 09 09 09  ase CKA_ID:.....
19b60 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
19b70 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20  NTF("Requesting 
19b80 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 49 44  attribute CKA_ID
19b90 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c   (0x%08lx) ...",
19ba0 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
19bb0 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29   curr_attr_type)
19bc0 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63  ;......if (objec
19bd0 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 4e 45  tclass == CKO_NE
19be0 54 53 43 41 50 45 5f 54 52 55 53 54 29 20 7b 0a  TSCAPE_TRUST) {.
19bf0 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
19c00 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62  G_PRINTF(" ... b
19c10 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69  ut not getting i
19c20 74 20 62 65 63 61 75 73 65 20 77 65 20 61 72 65  t because we are
19c30 20 61 20 4e 65 74 73 63 61 70 65 20 74 72 75 73   a Netscape trus
19c40 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09  t object");.....
19c50 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a  ..break;.....}..
19c60 09 09 09 09 75 63 54 6d 70 42 75 66 5b 30 5d 20  ....ucTmpBuf[0] 
19c70 3d 20 28 28 69 64 65 6e 74 69 74 79 5f 6e 75 6d  = ((identity_num
19c80 20 2b 20 31 29 20 3e 3e 20 38 29 20 26 20 30 78   + 1) >> 8) & 0x
19c90 66 66 3b 0a 09 09 09 09 75 63 54 6d 70 42 75 66  ff;.....ucTmpBuf
19ca0 5b 31 5d 20 3d 20 20 28 69 64 65 6e 74 69 74 79  [1] =  (identity
19cb0 5f 6e 75 6d 20 2b 20 31 29 20 26 20 30 78 66 66  _num + 1) & 0xff
19cc0 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20  ;......pValue = 
19cd0 26 75 63 54 6d 70 42 75 66 3b 0a 09 09 09 09 75  &ucTmpBuf;.....u
19ce0 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 32 3b 0a 0a  lValueLen = 2;..
19cf0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
19d00 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65  _PRINTF(" ... re
19d10 74 75 72 6e 69 6e 67 20 25 70 2f 25 6c 75 22 2c  turning %p/%lu",
19d20 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e   pValue, (unsign
19d30 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65  ed long) ulValue
19d40 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b  Len);......break
19d50 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 43 45  ;....case CKA_CE
19d60 52 54 49 46 49 43 41 54 45 5f 54 59 50 45 3a 0a  RTIFICATE_TYPE:.
19d70 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
19d80 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74  _PRINTF("Request
19d90 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b  ing attribute CK
19da0 41 5f 43 45 52 54 49 46 49 43 41 54 45 5f 54 59  A_CERTIFICATE_TY
19db0 50 45 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e  PE (0x%08lx) ...
19dc0 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
19dd0 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70  g) curr_attr_typ
19de0 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a  e);......if (obj
19df0 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f  ectclass != CKO_
19e00 43 45 52 54 49 46 49 43 41 54 45 29 20 7b 0a 09  CERTIFICATE) {..
19e10 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
19e20 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75  _PRINTF(" ... bu
19e30 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74  t not getting it
19e40 20 62 65 63 61 75 73 65 20 77 65 20 61 72 65 20   because we are 
19e50 6e 6f 74 20 61 20 63 65 72 74 69 66 69 63 61 74  not a certificat
19e60 65 2e 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61  e.");.......brea
19e70 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 2f 2a  k;.....}....../*
19e80 20 57 65 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74   We only support
19e90 20 6f 6e 65 20 63 65 72 74 69 66 69 63 61 74 65   one certificate
19ea0 20 74 79 70 65 20 2a 2f 0a 09 09 09 09 63 6b 5f   type */.....ck_
19eb0 63 65 72 74 69 66 69 63 61 74 65 5f 74 79 70 65  certificate_type
19ec0 20 3d 20 43 4b 43 5f 58 5f 35 30 39 3b 0a 0a 09   = CKC_X_509;...
19ed0 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f  ...pValue = &ck_
19ee0 63 65 72 74 69 66 69 63 61 74 65 5f 74 79 70 65  certificate_type
19ef0 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e  ;.....ulValueLen
19f00 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 63 65 72   = sizeof(ck_cer
19f10 74 69 66 69 63 61 74 65 5f 74 79 70 65 29 3b 0a  tificate_type);.
19f20 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
19f30 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72  G_PRINTF(" ... r
19f40 65 74 75 72 6e 69 6e 67 20 43 4b 43 5f 58 5f 35  eturning CKC_X_5
19f50 30 39 20 28 25 6c 75 29 20 28 25 70 2f 25 6c 75  09 (%lu) (%p/%lu
19f60 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  )", (unsigned lo
19f70 6e 67 29 20 2a 28 28 43 4b 5f 43 45 52 54 49 46  ng) *((CK_CERTIF
19f80 49 43 41 54 45 5f 54 59 50 45 20 2a 29 20 70 56  ICATE_TYPE *) pV
19f90 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28  alue), pValue, (
19fa0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75  unsigned long) u
19fb0 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09  lValueLen);.....
19fc0 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
19fd0 43 4b 41 5f 4b 45 59 5f 54 59 50 45 3a 0a 09 09  CKA_KEY_TYPE:...
19fe0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
19ff0 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e  RINTF("Requestin
1a000 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f  g attribute CKA_
1a010 4b 45 59 5f 54 59 50 45 20 28 30 78 25 30 38 6c  KEY_TYPE (0x%08l
1a020 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e  x) ...", (unsign
1a030 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74  ed long) curr_at
1a040 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69  tr_type);......i
1a050 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 21  f (objectclass !
1a060 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b 45  = CKO_PRIVATE_KE
1a070 59 20 26 26 20 6f 62 6a 65 63 74 63 6c 61 73 73  Y && objectclass
1a080 20 21 3d 20 43 4b 4f 5f 50 55 42 4c 49 43 5f 4b   != CKO_PUBLIC_K
1a090 45 59 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45  EY) {......CACKE
1a0a0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1a0b0 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74   ... but not get
1a0c0 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20  ting it because 
1a0d0 77 65 20 61 72 65 20 6e 6f 74 20 61 20 6b 65 79  we are not a key
1a0e0 2e 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b  .");.......break
1a0f0 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 2f 2a 20  ;.....}....../* 
1a100 57 65 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 20  We only support 
1a110 6f 6e 65 20 6b 65 79 20 74 79 70 65 20 2a 2f 0a  one key type */.
1a120 09 09 09 09 63 6b 5f 6b 65 79 5f 74 79 70 65 20  ....ck_key_type 
1a130 3d 20 43 4b 4b 5f 52 53 41 3b 0a 0a 09 09 09 09  = CKK_RSA;......
1a140 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 6b 65 79  pValue = &ck_key
1a150 5f 74 79 70 65 3b 0a 09 09 09 09 75 6c 56 61 6c  _type;.....ulVal
1a160 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63  ueLen = sizeof(c
1a170 6b 5f 6b 65 79 5f 74 79 70 65 29 3b 0a 0a 09 09  k_key_type);....
1a180 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1a190 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75  RINTF(" ... retu
1a1a0 72 6e 69 6e 67 20 43 4b 4b 5f 52 53 41 20 28 25  rning CKK_RSA (%
1a1b0 6c 75 29 20 28 25 70 2f 25 6c 75 29 22 2c 20 28  lu) (%p/%lu)", (
1a1c0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a  unsigned long) *
1a1d0 28 28 43 4b 5f 43 45 52 54 49 46 49 43 41 54 45  ((CK_CERTIFICATE
1a1e0 5f 54 59 50 45 20 2a 29 20 70 56 61 6c 75 65 29  _TYPE *) pValue)
1a1f0 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67  , pValue, (unsig
1a200 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75  ned long) ulValu
1a210 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61  eLen);......brea
1a220 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 53  k;....case CKA_S
1a230 49 47 4e 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f  IGN:.....CACKEY_
1a240 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
1a250 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75  questing attribu
1a260 74 65 20 43 4b 41 5f 53 49 47 4e 20 28 30 78 25  te CKA_SIGN (0x%
1a270 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73  08lx) ...", (uns
1a280 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72  igned long) curr
1a290 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09  _attr_type);....
1a2a0 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73  ..if (objectclas
1a2b0 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50  s == CKO_NETSCAP
1a2c0 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 09 09  E_TRUST) {......
1a2d0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1a2e0 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f  NTF(" ... but no
1a2f0 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63  t getting it bec
1a300 61 75 73 65 20 77 65 20 61 72 65 20 61 20 4e 65  ause we are a Ne
1a310 74 73 63 61 70 65 20 74 72 75 73 74 20 6f 62 6a  tscape trust obj
1a320 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62 72 65  ect");.......bre
1a330 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69  ak;.....}......i
1a340 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d  f (objectclass =
1a350 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b 45  = CKO_PRIVATE_KE
1a360 59 29 20 7b 0a 09 09 09 09 09 70 56 61 6c 75 65  Y) {......pValue
1a370 20 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09 09 09   = &ck_true;....
1a380 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73  ..ulValueLen = s
1a390 69 7a 65 6f 66 28 63 6b 5f 74 72 75 65 29 3b 0a  izeof(ck_true);.
1a3a0 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ....} else {....
1a3b0 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 66  ..pValue = &ck_f
1a3c0 61 6c 73 65 3b 0a 09 09 09 09 09 75 6c 56 61 6c  alse;......ulVal
1a3d0 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63  ueLen = sizeof(c
1a3e0 6b 5f 66 61 6c 73 65 29 3b 0a 09 09 09 09 7d 0a  k_false);.....}.
1a3f0 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
1a400 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72  G_PRINTF(" ... r
1a410 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70  eturning %lu (%p
1a420 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65  /%lu)", (unsigne
1a430 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42  d long) *((CK_BB
1a440 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c 20  OOL *) pValue), 
1a450 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65  pValue, (unsigne
1a460 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c  d long) ulValueL
1a470 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b  en);......break;
1a480 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 53 49 47  ....case CKA_SIG
1a490 4e 5f 52 45 43 4f 56 45 52 3a 0a 09 09 09 09 43  N_RECOVER:.....C
1a4a0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1a4b0 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61  TF("Requesting a
1a4c0 74 74 72 69 62 75 74 65 20 43 4b 41 5f 53 49 47  ttribute CKA_SIG
1a4d0 4e 5f 52 45 43 4f 56 45 52 20 28 30 78 25 30 38  N_RECOVER (0x%08
1a4e0 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67  lx) ...", (unsig
1a4f0 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61  ned long) curr_a
1a500 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09  ttr_type);......
1a510 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20  if (objectclass 
1a520 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f  == CKO_NETSCAPE_
1a530 54 52 55 53 54 29 20 7b 0a 09 09 09 09 09 43 41  TRUST) {......CA
1a540 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1a550 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20  F(" ... but not 
1a560 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 75  getting it becau
1a570 73 65 20 77 65 20 61 72 65 20 61 20 4e 65 74 73  se we are a Nets
1a580 63 61 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63  cape trust objec
1a590 74 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b  t");.......break
1a5a0 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 2f 2a 20  ;.....}....../* 
1a5b0 57 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 6e 6c  We currently onl
1a5c0 79 20 73 75 70 70 6f 72 74 20 22 53 69 67 6e 20  y support "Sign 
1a5d0 77 69 74 68 20 41 70 70 65 6e 64 69 78 22 20 2a  with Appendix" *
1a5e0 2f 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26  /.....pValue = &
1a5f0 63 6b 5f 66 61 6c 73 65 3b 0a 09 09 09 09 75 6c  ck_false;.....ul
1a600 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f  ValueLen = sizeo
1a610 66 28 63 6b 5f 66 61 6c 73 65 29 3b 0a 0a 09 09  f(ck_false);....
1a620 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1a630 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75  RINTF(" ... retu
1a640 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c  rning %lu (%p/%l
1a650 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  u)", (unsigned l
1a660 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c  ong) *((CK_BBOOL
1a670 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61   *) pValue), pVa
1a680 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  lue, (unsigned l
1a690 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29  ong) ulValueLen)
1a6a0 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  ;......break;...
1a6b0 09 63 61 73 65 20 43 4b 41 5f 44 45 43 52 59 50  .case CKA_DECRYP
1a6c0 54 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  T:.....CACKEY_DE
1a6d0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75  BUG_PRINTF("Requ
1a6e0 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65  esting attribute
1a6f0 20 43 4b 41 5f 44 45 43 52 59 50 54 20 28 30 78   CKA_DECRYPT (0x
1a700 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e  %08lx) ...", (un
1a710 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72  signed long) cur
1a720 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09  r_attr_type);...
1a730 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61  ...if (objectcla
1a740 73 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43 41  ss == CKO_NETSCA
1a750 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 09  PE_TRUST) {.....
1a760 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1a770 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e  INTF(" ... but n
1a780 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65  ot getting it be
1a790 63 61 75 73 65 20 77 65 20 61 72 65 20 61 20 4e  cause we are a N
1a7a0 65 74 73 63 61 70 65 20 74 72 75 73 74 20 6f 62  etscape trust ob
1a7b0 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62 72  ject");.......br
1a7c0 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09  eak;.....}......
1a7d0 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20  if (objectclass 
1a7e0 3d 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b  == CKO_PRIVATE_K
1a7f0 45 59 20 7c 7c 20 6f 62 6a 65 63 74 63 6c 61 73  EY || objectclas
1a800 73 20 3d 3d 20 43 4b 4f 5f 50 55 42 4c 49 43 5f  s == CKO_PUBLIC_
1a810 4b 45 59 29 20 7b 0a 09 09 09 09 09 70 56 61 6c  KEY) {......pVal
1a820 75 65 20 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09  ue = &ck_true;..
1a830 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ....ulValueLen =
1a840 20 73 69 7a 65 6f 66 28 63 6b 5f 74 72 75 65 29   sizeof(ck_true)
1a850 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09  ;.....} else {..
1a860 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b  ....pValue = &ck
1a870 5f 66 61 6c 73 65 3b 0a 09 09 09 09 09 75 6c 56  _false;......ulV
1a880 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66  alueLen = sizeof
1a890 28 63 6b 5f 66 61 6c 73 65 29 3b 0a 09 09 09 09  (ck_false);.....
1a8a0 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  }......CACKEY_DE
1a8b0 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
1a8c0 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28   returning %lu (
1a8d0 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67  %p/%lu)", (unsig
1a8e0 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f  ned long) *((CK_
1a8f0 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29  BBOOL *) pValue)
1a900 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67  , pValue, (unsig
1a910 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75  ned long) ulValu
1a920 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61  eLen);......brea
1a930 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 53  k;....case CKA_S
1a940 45 4e 53 49 54 49 56 45 3a 0a 09 09 09 09 43 41  ENSITIVE:.....CA
1a950 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1a960 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74  F("Requesting at
1a970 74 72 69 62 75 74 65 20 43 4b 41 5f 53 45 4e 53  tribute CKA_SENS
1a980 49 54 49 56 45 20 28 30 78 25 30 38 6c 78 29 20  ITIVE (0x%08lx) 
1a990 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  ...", (unsigned 
1a9a0 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f  long) curr_attr_
1a9b0 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28  type);......if (
1a9c0 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43  objectclass == C
1a9d0 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53  KO_NETSCAPE_TRUS
1a9e0 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59  T) {......CACKEY
1a9f0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
1aa00 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74  ... but not gett
1aa10 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77  ing it because w
1aa20 65 20 61 72 65 20 61 20 4e 65 74 73 63 61 70 65  e are a Netscape
1aa30 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29 3b   trust object");
1aa40 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .......break;...
1aa50 09 09 7d 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a  ..}......if (obj
1aa60 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f  ectclass == CKO_
1aa70 50 52 49 56 41 54 45 5f 4b 45 59 29 20 7b 0a 09  PRIVATE_KEY) {..
1aa80 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b  ....pValue = &ck
1aa90 5f 74 72 75 65 3b 0a 09 09 09 09 09 75 6c 56 61  _true;......ulVa
1aaa0 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28  lueLen = sizeof(
1aab0 63 6b 5f 74 72 75 65 29 3b 0a 09 09 09 09 7d 20  ck_true);.....} 
1aac0 65 6c 73 65 20 7b 0a 09 09 09 09 09 70 56 61 6c  else {......pVal
1aad0 75 65 20 3d 20 26 63 6b 5f 66 61 6c 73 65 3b 0a  ue = &ck_false;.
1aae0 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20  .....ulValueLen 
1aaf0 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 66 61 6c 73  = sizeof(ck_fals
1ab00 65 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43  e);.....}......C
1ab10 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1ab20 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69  TF(" ... returni
1ab30 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22  ng %lu (%p/%lu)"
1ab40 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
1ab50 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29  ) *((CK_BBOOL *)
1ab60 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65   pValue), pValue
1ab70 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
1ab80 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a  ) ulValueLen);..
1ab90 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61  ....break;....ca
1aba0 73 65 20 43 4b 41 5f 45 58 54 52 41 43 54 41 42  se CKA_EXTRACTAB
1abb0 4c 45 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  LE:.....CACKEY_D
1abc0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71  EBUG_PRINTF("Req
1abd0 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74  uesting attribut
1abe0 65 20 43 4b 41 5f 45 58 54 52 41 43 54 41 42 4c  e CKA_EXTRACTABL
1abf0 45 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22  E (0x%08lx) ..."
1ac00 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
1ac10 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65  ) curr_attr_type
1ac20 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65  );......if (obje
1ac30 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 4e  ctclass == CKO_N
1ac40 45 54 53 43 41 50 45 5f 54 52 55 53 54 29 20 7b  ETSCAPE_TRUST) {
1ac50 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
1ac60 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
1ac70 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20  but not getting 
1ac80 69 74 20 62 65 63 61 75 73 65 20 77 65 20 61 72  it because we ar
1ac90 65 20 61 20 4e 65 74 73 63 61 70 65 20 74 72 75  e a Netscape tru
1aca0 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09  st object");....
1acb0 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a  ...break;.....}.
1acc0 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63  .....if (objectc
1acd0 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 50 52 49 56  lass == CKO_PRIV
1ace0 41 54 45 5f 4b 45 59 29 20 7b 0a 09 09 09 09 09  ATE_KEY) {......
1acf0 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 66 61 6c  pValue = &ck_fal
1ad00 73 65 3b 0a 09 09 09 09 09 75 6c 56 61 6c 75 65  se;......ulValue
1ad10 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f  Len = sizeof(ck_
1ad20 74 72 75 65 29 3b 0a 09 09 09 09 7d 20 65 6c 73  true);.....} els
1ad30 65 20 7b 0a 09 09 09 09 09 70 56 61 6c 75 65 20  e {......pValue 
1ad40 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09 09 09 09  = &ck_true;.....
1ad50 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69  .ulValueLen = si
1ad60 7a 65 6f 66 28 63 6b 5f 66 61 6c 73 65 29 3b 0a  zeof(ck_false);.
1ad70 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45  ....}......CACKE
1ad80 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1ad90 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25   ... returning %
1ada0 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75  lu (%p/%lu)", (u
1adb0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28  nsigned long) *(
1adc0 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61  (CK_BBOOL *) pVa
1add0 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75  lue), pValue, (u
1ade0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c  nsigned long) ul
1adf0 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09  ValueLen);......
1ae00 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43  break;....case C
1ae10 4b 41 5f 4d 4f 44 55 4c 55 53 3a 0a 09 09 09 09  KA_MODULUS:.....
1ae20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1ae30 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20  NTF("Requesting 
1ae40 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 4d 4f  attribute CKA_MO
1ae50 44 55 4c 55 53 20 28 30 78 25 30 38 6c 78 29 20  DULUS (0x%08lx) 
1ae60 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  ...", (unsigned 
1ae70 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f  long) curr_attr_
1ae80 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28  type);......if (
1ae90 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43  objectclass == C
1aea0 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53  KO_NETSCAPE_TRUS
1aeb0 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59  T) {......CACKEY
1aec0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
1aed0 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74  ... but not gett
1aee0 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77  ing it because w
1aef0 65 20 61 72 65 20 61 20 4e 65 74 73 63 61 70 65  e are a Netscape
1af00 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29 3b   trust object");
1af10 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .......break;...
1af20 09 09 7d 0a 0a 09 09 09 09 69 66 20 28 63 65 72  ..}......if (cer
1af30 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3e 3d 20  tificate_len >= 
1af40 30 29 20 7b 0a 09 09 09 09 09 78 35 30 39 5f 72  0) {......x509_r
1af50 65 61 64 5f 72 65 74 20 3d 20 78 35 30 39 5f 74  ead_ret = x509_t
1af60 6f 5f 6d 6f 64 75 6c 75 73 28 63 65 72 74 69 66  o_modulus(certif
1af70 69 63 61 74 65 2c 20 63 65 72 74 69 66 69 63 61  icate, certifica
1af80 74 65 5f 6c 65 6e 2c 20 26 70 56 61 6c 75 65 29  te_len, &pValue)
1af90 3b 0a 09 09 09 09 09 69 66 20 28 78 35 30 39 5f  ;......if (x509_
1afa0 72 65 61 64 5f 72 65 74 20 3c 20 30 29 20 7b 0a  read_ret < 0) {.
1afb0 09 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 4e  ......pValue = N
1afc0 55 4c 4c 3b 0a 09 09 09 09 09 7d 20 65 6c 73 65  ULL;......} else
1afd0 20 7b 0a 09 09 09 09 09 09 75 6c 56 61 6c 75 65   {.......ulValue
1afe0 4c 65 6e 20 3d 20 78 35 30 39 5f 72 65 61 64 5f  Len = x509_read_
1aff0 72 65 74 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09  ret;......}.....
1b000 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  }......CACKEY_DE
1b010 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
1b020 20 72 65 74 75 72 6e 69 6e 67 20 28 25 70 2f 25   returning (%p/%
1b030 6c 75 29 22 2c 20 70 56 61 6c 75 65 2c 20 28 75  lu)", pValue, (u
1b040 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c  nsigned long) ul
1b050 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09  ValueLen);......
1b060 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43  break;....case C
1b070 4b 41 5f 50 55 42 4c 49 43 5f 45 58 50 4f 4e 45  KA_PUBLIC_EXPONE
1b080 4e 54 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  NT:.....CACKEY_D
1b090 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71  EBUG_PRINTF("Req
1b0a0 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74  uesting attribut
1b0b0 65 20 43 4b 41 5f 50 55 42 4c 49 43 5f 45 58 50  e CKA_PUBLIC_EXP
1b0c0 4f 4e 45 4e 54 20 28 30 78 25 30 38 6c 78 29 20  ONENT (0x%08lx) 
1b0d0 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  ...", (unsigned 
1b0e0 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f  long) curr_attr_
1b0f0 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28  type);......if (
1b100 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43  objectclass == C
1b110 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53  KO_NETSCAPE_TRUS
1b120 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59  T) {......CACKEY
1b130 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
1b140 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74  ... but not gett
1b150 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77  ing it because w
1b160 65 20 61 72 65 20 61 20 4e 65 74 73 63 61 70 65  e are a Netscape
1b170 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29 3b   trust object");
1b180 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .......break;...
1b190 09 09 7d 0a 0a 09 09 09 09 69 66 20 28 63 65 72  ..}......if (cer
1b1a0 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3e 3d 20  tificate_len >= 
1b1b0 30 29 20 7b 0a 09 09 09 09 09 78 35 30 39 5f 72  0) {......x509_r
1b1c0 65 61 64 5f 72 65 74 20 3d 20 78 35 30 39 5f 74  ead_ret = x509_t
1b1d0 6f 5f 65 78 70 6f 6e 65 6e 74 28 63 65 72 74 69  o_exponent(certi
1b1e0 66 69 63 61 74 65 2c 20 63 65 72 74 69 66 69 63  ficate, certific
1b1f0 61 74 65 5f 6c 65 6e 2c 20 26 70 56 61 6c 75 65  ate_len, &pValue
1b200 29 3b 0a 09 09 09 09 09 69 66 20 28 78 35 30 39  );......if (x509
1b210 5f 72 65 61 64 5f 72 65 74 20 3c 20 30 29 20 7b  _read_ret < 0) {
1b220 0a 09 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20  .......pValue = 
1b230 4e 55 4c 4c 3b 0a 09 09 09 09 09 7d 20 65 6c 73  NULL;......} els
1b240 65 20 7b 0a 09 09 09 09 09 09 75 6c 56 61 6c 75  e {.......ulValu
1b250 65 4c 65 6e 20 3d 20 78 35 30 39 5f 72 65 61 64  eLen = x509_read
1b260 5f 72 65 74 3b 0a 09 09 09 09 09 7d 0a 09 09 09  _ret;......}....
1b270 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  .}......CACKEY_D
1b280 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
1b290 2e 20 72 65 74 75 72 6e 69 6e 67 20 28 25 70 2f  . returning (%p/
1b2a0 25 6c 75 29 22 2c 20 70 56 61 6c 75 65 2c 20 28  %lu)", pValue, (
1b2b0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75  unsigned long) u
1b2c0 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09  lValueLen);.....
1b2d0 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
1b2e0 43 4b 41 5f 54 52 55 53 54 5f 44 49 47 49 54 41  CKA_TRUST_DIGITA
1b2f0 4c 5f 53 49 47 4e 41 54 55 52 45 3a 0a 09 09 09  L_SIGNATURE:....
1b300 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54 5f 4e  case CKA_TRUST_N
1b310 4f 4e 5f 52 45 50 55 44 49 41 54 49 4f 4e 3a 0a  ON_REPUDIATION:.
1b320 09 09 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53  ...case CKA_TRUS
1b330 54 5f 4b 45 59 5f 45 4e 43 49 50 48 45 52 4d 45  T_KEY_ENCIPHERME
1b340 4e 54 3a 0a 09 09 09 63 61 73 65 20 43 4b 41 5f  NT:....case CKA_
1b350 54 52 55 53 54 5f 44 41 54 41 5f 45 4e 43 49 50  TRUST_DATA_ENCIP
1b360 48 45 52 4d 45 4e 54 3a 0a 09 09 09 63 61 73 65  HERMENT:....case
1b370 20 43 4b 41 5f 54 52 55 53 54 5f 4b 45 59 5f 41   CKA_TRUST_KEY_A
1b380 47 52 45 45 4d 45 4e 54 3a 0a 09 09 09 63 61 73  GREEMENT:....cas
1b390 65 20 43 4b 41 5f 54 52 55 53 54 5f 4b 45 59 5f  e CKA_TRUST_KEY_
1b3a0 43 45 52 54 5f 53 49 47 4e 3a 0a 09 09 09 63 61  CERT_SIGN:....ca
1b3b0 73 65 20 43 4b 41 5f 54 52 55 53 54 5f 43 52 4c  se CKA_TRUST_CRL
1b3c0 5f 53 49 47 4e 3a 0a 09 09 09 63 61 73 65 20 43  _SIGN:....case C
1b3d0 4b 41 5f 54 52 55 53 54 5f 53 45 52 56 45 52 5f  KA_TRUST_SERVER_
1b3e0 41 55 54 48 3a 0a 09 09 09 63 61 73 65 20 43 4b  AUTH:....case CK
1b3f0 41 5f 54 52 55 53 54 5f 43 4c 49 45 4e 54 5f 41  A_TRUST_CLIENT_A
1b400 55 54 48 3a 0a 09 09 09 63 61 73 65 20 43 4b 41  UTH:....case CKA
1b410 5f 54 52 55 53 54 5f 43 4f 44 45 5f 53 49 47 4e  _TRUST_CODE_SIGN
1b420 49 4e 47 3a 0a 09 09 09 63 61 73 65 20 43 4b 41  ING:....case CKA
1b430 5f 54 52 55 53 54 5f 45 4d 41 49 4c 5f 50 52 4f  _TRUST_EMAIL_PRO
1b440 54 45 43 54 49 4f 4e 3a 0a 09 09 09 09 43 41 43  TECTION:.....CAC
1b450 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1b460 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74  ("Requesting att
1b470 72 69 62 75 74 65 20 43 4b 41 5f 54 52 55 53 54  ribute CKA_TRUST
1b480 5f 2e 2e 2e 20 28 30 78 25 30 38 6c 78 29 20 2e  _... (0x%08lx) .
1b490 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ..", (unsigned l
1b4a0 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74  ong) curr_attr_t
1b4b0 79 70 65 29 3b 0a 0a 09 09 09 09 70 56 61 6c 75  ype);......pValu
1b4c0 65 20 3d 20 26 63 6b 5f 74 72 75 73 74 65 64 3b  e = &ck_trusted;
1b4d0 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20  .....ulValueLen 
1b4e0 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 74 72 75 73  = sizeof(ck_trus
1b4f0 74 65 64 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45  ted);......CACKE
1b500 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1b510 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25   ... returning %
1b520 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75  lu (%p/%lu)", (u
1b530 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28  nsigned long) *(
1b540 28 43 4b 5f 54 52 55 53 54 20 2a 29 20 70 56 61  (CK_TRUST *) pVa
1b550 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75  lue), pValue, (u
1b560 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c  nsigned long) ul
1b570 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09  ValueLen);......
1b580 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43  break;....case C
1b590 4b 41 5f 43 45 52 54 5f 53 48 41 31 5f 48 41 53  KA_CERT_SHA1_HAS
1b5a0 48 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  H:.....CACKEY_DE
1b5b0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75  BUG_PRINTF("Requ
1b5c0 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65  esting attribute
1b5d0 20 43 4b 41 5f 43 45 52 54 5f 53 48 41 31 5f 48   CKA_CERT_SHA1_H
1b5e0 41 53 48 20 28 30 78 25 30 38 6c 78 29 20 2e 2e  ASH (0x%08lx) ..
1b5f0 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  .", (unsigned lo
1b600 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79  ng) curr_attr_ty
1b610 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62  pe);......if (ob
1b620 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f  jectclass != CKO
1b630 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54 29  _NETSCAPE_TRUST)
1b640 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44   {......CACKEY_D
1b650 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
1b660 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e  . but not gettin
1b670 67 20 69 74 20 62 65 63 61 75 73 65 20 77 65 20  g it because we 
1b680 61 72 65 20 6e 6f 74 20 61 20 4e 65 74 73 63 61  are not a Netsca
1b690 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22  pe trust object"
1b6a0 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a  );.......break;.
1b6b0 09 09 09 09 7d 0a 0a 09 09 09 09 53 48 41 31 52  ....}......SHA1R
1b6c0 65 73 65 74 28 26 73 68 61 31 5f 63 74 78 29 3b  eset(&sha1_ctx);
1b6d0 0a 09 09 09 09 53 48 41 31 49 6e 70 75 74 28 26  .....SHA1Input(&
1b6e0 73 68 61 31 5f 63 74 78 2c 20 63 65 72 74 69 66  sha1_ctx, certif
1b6f0 69 63 61 74 65 2c 20 63 65 72 74 69 66 69 63 61  icate, certifica
1b700 74 65 5f 6c 65 6e 29 3b 0a 09 09 09 09 53 48 41  te_len);.....SHA
1b710 31 52 65 73 75 6c 74 28 26 73 68 61 31 5f 63 74  1Result(&sha1_ct
1b720 78 2c 20 73 68 61 31 5f 68 61 73 68 29 3b 0a 0a  x, sha1_hash);..
1b730 09 09 09 09 70 56 61 6c 75 65 20 3d 20 73 68 61  ....pValue = sha
1b740 31 5f 68 61 73 68 3b 0a 09 09 09 09 75 6c 56 61  1_hash;.....ulVa
1b750 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28  lueLen = sizeof(
1b760 73 68 61 31 5f 68 61 73 68 29 3b 0a 0a 09 09 09  sha1_hash);.....
1b770 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1b780 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72  INTF(" ... retur
1b790 6e 69 6e 67 20 25 70 2f 25 6c 75 22 2c 20 70 56  ning %p/%lu", pV
1b7a0 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20  alue, (unsigned 
1b7b0 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e  long) ulValueLen
1b7c0 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  );......break;..
1b7d0 09 09 63 61 73 65 20 43 4b 41 5f 43 45 52 54 5f  ..case CKA_CERT_
1b7e0 4d 44 35 5f 48 41 53 48 3a 0a 09 09 09 09 43 41  MD5_HASH:.....CA
1b7f0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1b800 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74  F("Requesting at
1b810 74 72 69 62 75 74 65 20 43 4b 41 5f 43 45 52 54  tribute CKA_CERT
1b820 5f 4d 44 35 5f 48 41 53 48 20 28 30 78 25 30 38  _MD5_HASH (0x%08
1b830 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67  lx) ...", (unsig
1b840 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61  ned long) curr_a
1b850 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09  ttr_type);......
1b860 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20  if (objectclass 
1b870 21 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f  != CKO_NETSCAPE_
1b880 54 52 55 53 54 29 20 7b 0a 09 09 09 09 09 43 41  TRUST) {......CA
1b890 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1b8a0 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20  F(" ... but not 
1b8b0 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 75  getting it becau
1b8c0 73 65 20 77 65 20 61 72 65 20 6e 6f 74 20 61 20  se we are not a 
1b8d0 4e 65 74 73 63 61 70 65 20 74 72 75 73 74 20 6f  Netscape trust o
1b8e0 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62  bject");.......b
1b8f0 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09  reak;.....}.....
1b900 09 4d 44 35 49 6e 69 74 28 26 6d 64 35 5f 63 74  .MD5Init(&md5_ct
1b910 78 29 3b 0a 09 09 09 09 4d 44 35 55 70 64 61 74  x);.....MD5Updat
1b920 65 28 26 6d 64 35 5f 63 74 78 2c 20 63 65 72 74  e(&md5_ctx, cert
1b930 69 66 69 63 61 74 65 2c 20 63 65 72 74 69 66 69  ificate, certifi
1b940 63 61 74 65 5f 6c 65 6e 29 3b 0a 09 09 09 09 4d  cate_len);.....M
1b950 44 35 46 69 6e 61 6c 28 6d 64 35 5f 68 61 73 68  D5Final(md5_hash
1b960 2c 20 26 6d 64 35 5f 63 74 78 29 3b 0a 0a 09 09  , &md5_ctx);....
1b970 09 09 70 56 61 6c 75 65 20 3d 20 6d 64 35 5f 68  ..pValue = md5_h
1b980 61 73 68 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65  ash;.....ulValue
1b990 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 6d 64 35  Len = sizeof(md5
1b9a0 5f 68 61 73 68 29 3b 0a 0a 09 09 09 09 43 41 43  _hash);......CAC
1b9b0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1b9c0 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67  (" ... returning
1b9d0 20 25 70 2f 25 6c 75 22 2c 20 70 56 61 6c 75 65   %p/%lu", pValue
1b9e0 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
1b9f0 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a  ) ulValueLen);..
1ba00 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 64 65  ....break;....de
1ba10 66 61 75 6c 74 3a 0a 09 09 09 09 70 56 61 6c 75  fault:.....pValu
1ba20 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 75 6c  e = NULL;.....ul
1ba30 56 61 6c 75 65 4c 65 6e 20 3d 20 28 43 4b 5f 4c  ValueLen = (CK_L
1ba40 4f 4e 47 29 20 2d 31 3b 0a 09 09 09 09 62 72 65  ONG) -1;.....bre
1ba50 61 6b 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 28  ak;...}....if ((
1ba60 28 43 4b 5f 4c 4f 4e 47 29 20 75 6c 56 61 6c 75  (CK_LONG) ulValu
1ba70 65 4c 65 6e 29 20 21 3d 20 28 28 43 4b 5f 4c 4f  eLen) != ((CK_LO
1ba80 4e 47 29 20 2d 31 29 29 20 7b 0a 09 09 09 2f 2a  NG) -1)) {..../*
1ba90 20 50 75 73 68 20 63 75 72 72 5f 61 74 74 72 20   Push curr_attr 
1baa0 6f 6e 74 6f 20 74 68 65 20 73 74 61 63 6b 20 2a  onto the stack *
1bab0 2f 0a 09 09 09 63 75 72 72 5f 61 74 74 72 2e 74  /....curr_attr.t
1bac0 79 70 65 20 3d 20 63 75 72 72 5f 61 74 74 72 5f  ype = curr_attr_
1bad0 74 79 70 65 3b 0a 09 09 09 63 75 72 72 5f 61 74  type;....curr_at
1bae0 74 72 2e 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  tr.ulValueLen = 
1baf0 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 0a 09 09 09  ulValueLen;.....
1bb00 63 75 72 72 5f 61 74 74 72 2e 70 56 61 6c 75 65  curr_attr.pValue
1bb10 20 3d 20 6d 61 6c 6c 6f 63 28 63 75 72 72 5f 61   = malloc(curr_a
1bb20 74 74 72 2e 75 6c 56 61 6c 75 65 4c 65 6e 29 3b  ttr.ulValueLen);
1bb30 0a 09 09 09 6d 65 6d 63 70 79 28 63 75 72 72 5f  ....memcpy(curr_
1bb40 61 74 74 72 2e 70 56 61 6c 75 65 2c 20 70 56 61  attr.pValue, pVa
1bb50 6c 75 65 2c 20 63 75 72 72 5f 61 74 74 72 2e 75  lue, curr_attr.u
1bb60 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09  lValueLen);.....
1bb70 69 66 20 28 70 56 61 6c 75 65 5f 66 72 65 65 20  if (pValue_free 
1bb80 26 26 20 70 56 61 6c 75 65 29 20 7b 0a 09 09 09  && pValue) {....
1bb90 09 66 72 65 65 28 70 56 61 6c 75 65 29 3b 0a 09  .free(pValue);..
1bba0 09 09 7d 0a 0a 09 09 09 69 66 20 28 6e 75 6d 61  ..}.....if (numa
1bbb0 74 74 72 73 20 3e 3d 20 72 65 74 76 61 6c 5f 63  ttrs >= retval_c
1bbc0 6f 75 6e 74 29 20 7b 0a 09 09 09 09 72 65 74 76  ount) {.....retv
1bbd0 61 6c 20 3d 20 72 65 61 6c 6c 6f 63 28 72 65 74  al = realloc(ret
1bbe0 76 61 6c 2c 20 72 65 74 76 61 6c 5f 63 6f 75 6e  val, retval_coun
1bbf0 74 20 2a 20 73 69 7a 65 6f 66 28 2a 72 65 74 76  t * sizeof(*retv
1bc00 61 6c 29 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 6d  al));....}.....m
1bc10 65 6d 63 70 79 28 26 72 65 74 76 61 6c 5b 6e 75  emcpy(&retval[nu
1bc20 6d 61 74 74 72 73 5d 2c 20 26 63 75 72 72 5f 61  mattrs], &curr_a
1bc30 74 74 72 2c 20 73 69 7a 65 6f 66 28 63 75 72 72  ttr, sizeof(curr
1bc40 5f 61 74 74 72 29 29 3b 0a 09 09 09 6e 75 6d 61  _attr));....numa
1bc50 74 74 72 73 2b 2b 3b 0a 09 09 7d 0a 09 7d 0a 0a  ttrs++;...}..}..
1bc60 09 69 66 20 28 6e 75 6d 61 74 74 72 73 20 21 3d  .if (numattrs !=
1bc70 20 30 29 20 7b 0a 09 09 72 65 74 76 61 6c 5f 63   0) {...retval_c
1bc80 6f 75 6e 74 20 3d 20 6e 75 6d 61 74 74 72 73 3b  ount = numattrs;
1bc90 0a 09 09 72 65 74 76 61 6c 20 3d 20 72 65 61 6c  ...retval = real
1bca0 6c 6f 63 28 72 65 74 76 61 6c 2c 20 72 65 74 76  loc(retval, retv
1bcb0 61 6c 5f 63 6f 75 6e 74 20 2a 20 73 69 7a 65 6f  al_count * sizeo
1bcc0 66 28 2a 72 65 74 76 61 6c 29 29 3b 0a 09 7d 20  f(*retval));..} 
1bcd0 65 6c 73 65 20 7b 0a 09 09 66 72 65 65 28 72 65  else {...free(re
1bce0 74 76 61 6c 29 3b 0a 0a 09 09 72 65 74 76 61 6c  tval);....retval
1bcf0 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 0a 09 2a 70   = NULL;..}...*p
1bd00 75 6c 43 6f 75 6e 74 20 3d 20 6e 75 6d 61 74 74  ulCount = numatt
1bd10 72 73 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  rs;...CACKEY_DEB
1bd20 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
1bd30 6e 69 6e 67 20 25 6c 75 20 6f 62 6a 65 63 74 73  ning %lu objects
1bd40 20 28 25 70 29 2e 22 2c 20 6e 75 6d 61 74 74 72   (%p).", numattr
1bd50 73 2c 20 28 76 6f 69 64 20 2a 29 20 72 65 74 76  s, (void *) retv
1bd60 61 6c 29 3b 0a 0a 09 72 65 74 75 72 6e 28 72 65  al);...return(re
1bd70 74 76 61 6c 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  tval);.}..static
1bd80 20 76 6f 69 64 20 63 61 63 6b 65 79 5f 66 72 65   void cackey_fre
1bd90 65 5f 69 64 65 6e 74 69 74 69 65 73 28 73 74 72  e_identities(str
1bda0 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e 74  uct cackey_ident
1bdb0 69 74 79 20 2a 69 64 65 6e 74 69 74 69 65 73 2c  ity *identities,
1bdc0 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 69   unsigned long i
1bdd0 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 29  dentities_count)
1bde0 20 7b 0a 09 43 4b 5f 41 54 54 52 49 42 55 54 45   {..CK_ATTRIBUTE
1bdf0 20 2a 63 75 72 72 5f 61 74 74 72 3b 0a 09 75 6e   *curr_attr;..un
1be00 73 69 67 6e 65 64 20 6c 6f 6e 67 20 69 64 5f 69  signed long id_i
1be10 64 78 2c 20 61 74 74 72 5f 69 64 78 3b 0a 0a 09  dx, attr_idx;...
1be20 69 66 20 28 69 64 65 6e 74 69 74 69 65 73 20 3d  if (identities =
1be30 3d 20 4e 55 4c 4c 20 7c 7c 20 69 64 65 6e 74 69  = NULL || identi
1be40 74 69 65 73 5f 63 6f 75 6e 74 20 3d 3d 20 30 29  ties_count == 0)
1be50 20 7b 0a 09 09 72 65 74 75 72 6e 3b 0a 09 7d 0a   {...return;..}.
1be60 0a 09 66 6f 72 20 28 69 64 5f 69 64 78 20 3d 20  ..for (id_idx = 
1be70 30 3b 20 69 64 5f 69 64 78 20 3c 20 69 64 65 6e  0; id_idx < iden
1be80 74 69 74 69 65 73 5f 63 6f 75 6e 74 3b 20 69 64  tities_count; id
1be90 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28  _idx++) {...if (
1bea0 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64  identities[id_id
1beb0 78 5d 2e 61 74 74 72 69 62 75 74 65 73 29 20 7b  x].attributes) {
1bec0 0a 09 09 09 66 6f 72 20 28 61 74 74 72 5f 69 64  ....for (attr_id
1bed0 78 20 3d 20 30 3b 20 61 74 74 72 5f 69 64 78 20  x = 0; attr_idx 
1bee0 3c 20 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f  < identities[id_
1bef0 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73 5f  idx].attributes_
1bf00 63 6f 75 6e 74 3b 20 61 74 74 72 5f 69 64 78 2b  count; attr_idx+
1bf10 2b 29 20 7b 0a 09 09 09 09 63 75 72 72 5f 61 74  +) {.....curr_at
1bf20 74 72 20 3d 20 26 69 64 65 6e 74 69 74 69 65 73  tr = &identities
1bf30 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75  [id_idx].attribu
1bf40 74 65 73 5b 61 74 74 72 5f 69 64 78 5d 3b 0a 0a  tes[attr_idx];..
1bf50 09 09 09 09 69 66 20 28 63 75 72 72 5f 61 74 74  ....if (curr_att
1bf60 72 2d 3e 70 56 61 6c 75 65 29 20 7b 0a 09 09 09  r->pValue) {....
1bf70 09 09 66 72 65 65 28 63 75 72 72 5f 61 74 74 72  ..free(curr_attr
1bf80 2d 3e 70 56 61 6c 75 65 29 3b 0a 09 09 09 09 7d  ->pValue);.....}
1bf90 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 69 64  ....}.....if (id
1bfa0 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d  entities[id_idx]
1bfb0 2e 61 74 74 72 69 62 75 74 65 73 29 20 7b 0a 09  .attributes) {..
1bfc0 09 09 09 66 72 65 65 28 69 64 65 6e 74 69 74 69  ...free(identiti
1bfd0 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69  es[id_idx].attri
1bfe0 62 75 74 65 73 29 3b 0a 09 09 09 7d 0a 0a 09 09  butes);....}....
1bff0 09 63 61 63 6b 65 79 5f 66 72 65 65 5f 63 65 72  .cackey_free_cer
1c000 74 73 28 69 64 65 6e 74 69 74 69 65 73 5b 69 64  ts(identities[id
1c010 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e 74  _idx].pcsc_ident
1c020 69 74 79 2c 20 31 2c 20 31 29 3b 0a 09 09 7d 0a  ity, 1, 1);...}.
1c030 09 7d 0a 0a 09 66 72 65 65 28 69 64 65 6e 74 69  .}...free(identi
1c040 74 69 65 73 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  ties);.}..static
1c050 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 63   unsigned long c
1c060 61 63 6b 65 79 5f 72 65 61 64 5f 64 6f 64 5f 69  ackey_read_dod_i
1c070 64 65 6e 74 69 74 69 65 73 28 73 74 72 75 63 74  dentities(struct
1c080 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79   cackey_identity
1c090 20 2a 69 64 65 6e 74 69 74 69 65 73 2c 20 75 6e   *identities, un
1c0a0 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6e 75 6d 5f  signed long num_
1c0b0 64 6f 64 5f 63 65 72 74 73 29 20 7b 0a 09 75 6e  dod_certs) {..un
1c0c0 73 69 67 6e 65 64 20 6c 6f 6e 67 20 63 65 72 74  signed long cert
1c0d0 5f 69 64 78 2c 20 69 64 5f 69 64 78 20 3d 20 30  _idx, id_idx = 0
1c0e0 3b 0a 0a 09 69 66 20 28 69 64 65 6e 74 69 74 69  ;...if (identiti
1c0f0 65 73 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  es == NULL) {...
1c100 72 65 74 75 72 6e 28 6e 75 6d 5f 64 6f 64 5f 63  return(num_dod_c
1c110 65 72 74 73 20 2a 20 33 29 3b 0a 09 7d 0a 0a 09  erts * 3);..}...
1c120 66 6f 72 20 28 63 65 72 74 5f 69 64 78 20 3d 20  for (cert_idx = 
1c130 30 3b 20 63 65 72 74 5f 69 64 78 20 3c 20 6e 75  0; cert_idx < nu
1c140 6d 5f 64 6f 64 5f 63 65 72 74 73 3b 20 63 65 72  m_dod_certs; cer
1c150 74 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 69 64 65  t_idx++) {...ide
1c160 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e  ntities[id_idx].
1c170 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 3d 20  pcsc_identity = 
1c180 4e 55 4c 4c 3b 0a 09 09 69 64 65 6e 74 69 74 69  NULL;...identiti
1c190 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69  es[id_idx].attri
1c1a0 62 75 74 65 73 20 3d 20 63 61 63 6b 65 79 5f 67  butes = cackey_g
1c1b0 65 74 5f 61 74 74 72 69 62 75 74 65 73 28 43 4b  et_attributes(CK
1c1c0 4f 5f 43 45 52 54 49 46 49 43 41 54 45 2c 20 26  O_CERTIFICATE, &
1c1d0 65 78 74 72 61 5f 63 65 72 74 73 5b 63 65 72 74  extra_certs[cert
1c1e0 5f 69 64 78 5d 2c 20 30 78 66 30 30 30 20 7c 20  _idx], 0xf000 | 
1c1f0 63 65 72 74 5f 69 64 78 2c 20 26 69 64 65 6e 74  cert_idx, &ident
1c200 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74  ities[id_idx].at
1c210 74 72 69 62 75 74 65 73 5f 63 6f 75 6e 74 29 3b  tributes_count);
1c220 0a 09 09 69 64 5f 69 64 78 2b 2b 3b 0a 0a 09 09  ...id_idx++;....
1c230 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64  identities[id_id
1c240 78 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69 74 79  x].pcsc_identity
1c250 20 3d 20 4e 55 4c 4c 3b 0a 09 09 69 64 65 6e 74   = NULL;...ident
1c260 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74  ities[id_idx].at
1c270 74 72 69 62 75 74 65 73 20 3d 20 63 61 63 6b 65  tributes = cacke
1c280 79 5f 67 65 74 5f 61 74 74 72 69 62 75 74 65 73  y_get_attributes
1c290 28 43 4b 4f 5f 50 55 42 4c 49 43 5f 4b 45 59 2c  (CKO_PUBLIC_KEY,
1c2a0 20 26 65 78 74 72 61 5f 63 65 72 74 73 5b 63 65   &extra_certs[ce
1c2b0 72 74 5f 69 64 78 5d 2c 20 30 78 66 30 30 30 20  rt_idx], 0xf000 
1c2c0 7c 20 63 65 72 74 5f 69 64 78 2c 20 26 69 64 65  | cert_idx, &ide
1c2d0 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e  ntities[id_idx].
1c2e0 61 74 74 72 69 62 75 74 65 73 5f 63 6f 75 6e 74  attributes_count
1c2f0 29 3b 0a 09 09 69 64 5f 69 64 78 2b 2b 3b 0a 0a  );...id_idx++;..
1c300 09 09 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f  ..identities[id_
1c310 69 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69  idx].pcsc_identi
1c320 74 79 20 3d 20 4e 55 4c 4c 3b 0a 09 09 69 64 65  ty = NULL;...ide
1c330 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e  ntities[id_idx].
1c340 61 74 74 72 69 62 75 74 65 73 20 3d 20 63 61 63  attributes = cac
1c350 6b 65 79 5f 67 65 74 5f 61 74 74 72 69 62 75 74  key_get_attribut
1c360 65 73 28 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f  es(CKO_NETSCAPE_
1c370 54 52 55 53 54 2c 20 26 65 78 74 72 61 5f 63 65  TRUST, &extra_ce
1c380 72 74 73 5b 63 65 72 74 5f 69 64 78 5d 2c 20 30  rts[cert_idx], 0
1c390 78 66 30 30 30 20 7c 20 63 65 72 74 5f 69 64 78  xf000 | cert_idx
1c3a0 2c 20 26 69 64 65 6e 74 69 74 69 65 73 5b 69 64  , &identities[id
1c3b0 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73  _idx].attributes
1c3c0 5f 63 6f 75 6e 74 29 3b 0a 09 09 69 64 5f 69 64  _count);...id_id
1c3d0 78 2b 2b 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e  x++;..}...return
1c3e0 28 69 64 5f 69 64 78 29 3b 0a 7d 0a 0a 73 74 61  (id_idx);.}..sta
1c3f0 74 69 63 20 73 74 72 75 63 74 20 63 61 63 6b 65  tic struct cacke
1c400 79 5f 69 64 65 6e 74 69 74 79 20 2a 63 61 63 6b  y_identity *cack
1c410 65 79 5f 72 65 61 64 5f 69 64 65 6e 74 69 74 69  ey_read_identiti
1c420 65 73 28 73 74 72 75 63 74 20 63 61 63 6b 65 79  es(struct cackey
1c430 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73  _slot *slot, uns
1c440 69 67 6e 65 64 20 6c 6f 6e 67 20 2a 69 64 73 5f  igned long *ids_
1c450 66 6f 75 6e 64 29 20 7b 0a 09 73 74 72 75 63 74  found) {..struct
1c460 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65   cackey_pcsc_ide
1c470 6e 74 69 74 79 20 2a 70 63 73 63 5f 69 64 65 6e  ntity *pcsc_iden
1c480 74 69 74 69 65 73 3b 0a 09 73 74 72 75 63 74 20  tities;..struct 
1c490 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79 20  cackey_identity 
1c4a0 2a 69 64 65 6e 74 69 74 69 65 73 3b 0a 09 75 6e  *identities;..un
1c4b0 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6e 75 6d 5f  signed long num_
1c4c0 69 64 73 2c 20 69 64 5f 69 64 78 2c 20 63 75 72  ids, id_idx, cur
1c4d0 72 5f 69 64 5f 74 79 70 65 3b 0a 09 75 6e 73 69  r_id_type;..unsi
1c4e0 67 6e 65 64 20 6c 6f 6e 67 20 6e 75 6d 5f 63 65  gned long num_ce
1c4f0 72 74 73 2c 20 6e 75 6d 5f 64 6f 64 5f 63 65 72  rts, num_dod_cer
1c500 74 73 2c 20 63 65 72 74 5f 69 64 78 3b 0a 09 69  ts, cert_idx;..i
1c510 6e 74 20 69 6e 63 6c 75 64 65 5f 65 78 74 72 61  nt include_extra
1c520 5f 63 65 72 74 73 20 3d 20 30 2c 20 69 6e 63 6c  _certs = 0, incl
1c530 75 64 65 5f 64 6f 64 5f 63 65 72 74 73 3b 0a 0a  ude_dod_certs;..
1c540 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1c550 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
1c560 0a 0a 09 69 66 20 28 69 64 73 5f 66 6f 75 6e 64  ...if (ids_found
1c570 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
1c580 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1c590 46 28 22 45 72 72 6f 72 2e 20 20 69 64 73 5f 66  F("Error.  ids_f
1c5a0 6f 75 6e 64 20 69 73 20 4e 55 4c 4c 22 29 3b 0a  ound is NULL");.
1c5b0 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b  ...return(NULL);
1c5c0 0a 09 7d 0a 0a 23 69 66 64 65 66 20 43 41 43 4b  ..}..#ifdef CACK
1c5d0 45 59 5f 43 41 52 44 5f 53 4c 4f 54 5f 49 4e 43  EY_CARD_SLOT_INC
1c5e0 4c 55 44 45 5f 45 58 54 52 41 5f 43 45 52 54 53  LUDE_EXTRA_CERTS
1c5f0 0a 09 69 6e 63 6c 75 64 65 5f 65 78 74 72 61 5f  ..include_extra_
1c600 63 65 72 74 73 20 3d 20 31 3b 0a 23 65 6e 64 69  certs = 1;.#endi
1c610 66 0a 0a 09 69 66 20 28 67 65 74 65 6e 76 28 22  f...if (getenv("
1c620 43 41 43 4b 45 59 5f 44 4f 44 5f 43 45 52 54 53  CACKEY_DOD_CERTS
1c630 5f 4f 4e 5f 48 57 5f 53 4c 4f 54 53 22 29 20 21  _ON_HW_SLOTS") !
1c640 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 69 6e 63 6c  = NULL) {...incl
1c650 75 64 65 5f 65 78 74 72 61 5f 63 65 72 74 73 20  ude_extra_certs 
1c660 3d 20 31 3b 0a 09 7d 0a 0a 09 69 66 20 28 67 65  = 1;..}...if (ge
1c670 74 65 6e 76 28 22 43 41 43 4b 45 59 5f 4e 4f 5f  tenv("CACKEY_NO_
1c680 44 4f 44 5f 43 45 52 54 53 5f 4f 4e 5f 48 57 5f  DOD_CERTS_ON_HW_
1c690 53 4c 4f 54 53 22 29 20 21 3d 20 4e 55 4c 4c 29  SLOTS") != NULL)
1c6a0 20 7b 0a 09 09 69 6e 63 6c 75 64 65 5f 65 78 74   {...include_ext
1c6b0 72 61 5f 63 65 72 74 73 20 3d 20 30 3b 0a 09 7d  ra_certs = 0;..}
1c6c0 0a 0a 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f  ..#ifdef CACKEY_
1c6d0 4e 4f 5f 45 58 54 52 41 5f 43 45 52 54 53 0a 09  NO_EXTRA_CERTS..
1c6e0 69 66 20 28 67 65 74 65 6e 76 28 22 43 41 43 4b  if (getenv("CACK
1c6f0 45 59 5f 45 58 54 52 41 5f 43 45 52 54 53 22 29  EY_EXTRA_CERTS")
1c700 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 69 6e   != NULL) {...in
1c710 63 6c 75 64 65 5f 64 6f 64 5f 63 65 72 74 73 20  clude_dod_certs 
1c720 3d 20 31 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09  = 1;..} else {..
1c730 09 69 6e 63 6c 75 64 65 5f 64 6f 64 5f 63 65 72  .include_dod_cer
1c740 74 73 20 3d 20 30 3b 0a 09 7d 0a 23 65 6c 73 65  ts = 0;..}.#else
1c750 0a 09 69 66 20 28 67 65 74 65 6e 76 28 22 43 41  ..if (getenv("CA
1c760 43 4b 45 59 5f 4e 4f 5f 45 58 54 52 41 5f 43 45  CKEY_NO_EXTRA_CE
1c770 52 54 53 22 29 20 21 3d 20 4e 55 4c 4c 29 20 7b  RTS") != NULL) {
1c780 0a 09 09 69 6e 63 6c 75 64 65 5f 64 6f 64 5f 63  ...include_dod_c
1c790 65 72 74 73 20 3d 20 30 3b 0a 09 7d 20 65 6c 73  erts = 0;..} els
1c7a0 65 20 7b 0a 09 09 69 6e 63 6c 75 64 65 5f 64 6f  e {...include_do
1c7b0 64 5f 63 65 72 74 73 20 3d 20 31 3b 0a 09 7d 0a  d_certs = 1;..}.
1c7c0 23 65 6e 64 69 66 0a 0a 09 69 66 20 28 69 6e 63  #endif...if (inc
1c7d0 6c 75 64 65 5f 64 6f 64 5f 63 65 72 74 73 29 20  lude_dod_certs) 
1c7e0 7b 0a 09 09 6e 75 6d 5f 64 6f 64 5f 63 65 72 74  {...num_dod_cert
1c7f0 73 20 3d 20 73 69 7a 65 6f 66 28 65 78 74 72 61  s = sizeof(extra
1c800 5f 63 65 72 74 73 29 20 2f 20 73 69 7a 65 6f 66  _certs) / sizeof
1c810 28 65 78 74 72 61 5f 63 65 72 74 73 5b 30 5d 29  (extra_certs[0])
1c820 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 6e 75  ;..} else {...nu
1c830 6d 5f 64 6f 64 5f 63 65 72 74 73 20 3d 20 30 3b  m_dod_certs = 0;
1c840 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 2d 3e  ..}...if (slot->
1c850 69 6e 74 65 72 6e 61 6c 29 20 7b 0a 09 09 6e 75  internal) {...nu
1c860 6d 5f 69 64 73 20 3d 20 63 61 63 6b 65 79 5f 72  m_ids = cackey_r
1c870 65 61 64 5f 64 6f 64 5f 69 64 65 6e 74 69 74 69  ead_dod_identiti
1c880 65 73 28 4e 55 4c 4c 2c 20 6e 75 6d 5f 64 6f 64  es(NULL, num_dod
1c890 5f 63 65 72 74 73 29 3b 0a 0a 09 09 69 66 20 28  _certs);....if (
1c8a0 6e 75 6d 5f 69 64 73 20 21 3d 20 30 29 20 7b 0a  num_ids != 0) {.
1c8b0 09 09 09 69 64 65 6e 74 69 74 69 65 73 20 3d 20  ...identities = 
1c8c0 6d 61 6c 6c 6f 63 28 6e 75 6d 5f 69 64 73 20 2a  malloc(num_ids *
1c8d0 20 73 69 7a 65 6f 66 28 2a 69 64 65 6e 74 69 74   sizeof(*identit
1c8e0 69 65 73 29 29 3b 0a 0a 09 09 09 63 61 63 6b 65  ies));.....cacke
1c8f0 79 5f 72 65 61 64 5f 64 6f 64 5f 69 64 65 6e 74  y_read_dod_ident
1c900 69 74 69 65 73 28 69 64 65 6e 74 69 74 69 65 73  ities(identities
1c910 2c 20 6e 75 6d 5f 64 6f 64 5f 63 65 72 74 73 29  , num_dod_certs)
1c920 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ;...} else {....
1c930 69 64 65 6e 74 69 74 69 65 73 20 3d 20 4e 55 4c  identities = NUL
1c940 4c 3b 0a 09 09 7d 0a 0a 09 09 2a 69 64 73 5f 66  L;...}....*ids_f
1c950 6f 75 6e 64 20 3d 20 6e 75 6d 5f 69 64 73 3b 0a  ound = num_ids;.
1c960 0a 09 09 72 65 74 75 72 6e 28 69 64 65 6e 74 69  ...return(identi
1c970 74 69 65 73 29 3b 0a 09 7d 0a 0a 09 70 63 73 63  ties);..}...pcsc
1c980 5f 69 64 65 6e 74 69 74 69 65 73 20 3d 20 63 61  _identities = ca
1c990 63 6b 65 79 5f 72 65 61 64 5f 63 65 72 74 73 28  ckey_read_certs(
1c9a0 73 6c 6f 74 2c 20 4e 55 4c 4c 2c 20 26 6e 75 6d  slot, NULL, &num
1c9b0 5f 63 65 72 74 73 29 3b 0a 09 69 66 20 28 70 63  _certs);..if (pc
1c9c0 73 63 5f 69 64 65 6e 74 69 74 69 65 73 20 21 3d  sc_identities !=
1c9d0 20 4e 55 4c 4c 29 20 7b 0a 09 09 2f 2a 20 43 6f   NULL) {.../* Co
1c9e0 6e 76 65 72 74 20 6e 75 6d 62 65 72 20 6f 66 20  nvert number of 
1c9f0 43 65 72 74 73 20 74 6f 20 6e 75 6d 62 65 72 20  Certs to number 
1ca00 6f 66 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 09 09  of objects */...
1ca10 6e 75 6d 5f 69 64 73 20 3d 20 28 43 4b 4f 5f 50  num_ids = (CKO_P
1ca20 52 49 56 41 54 45 5f 4b 45 59 20 2d 20 43 4b 4f  RIVATE_KEY - CKO
1ca30 5f 43 45 52 54 49 46 49 43 41 54 45 20 2b 20 31  _CERTIFICATE + 1
1ca40 29 20 2a 20 6e 75 6d 5f 63 65 72 74 73 3b 0a 0a  ) * num_certs;..
1ca50 09 09 69 66 20 28 69 6e 63 6c 75 64 65 5f 65 78  ..if (include_ex
1ca60 74 72 61 5f 63 65 72 74 73 29 20 7b 0a 09 09 09  tra_certs) {....
1ca70 6e 75 6d 5f 69 64 73 20 2b 3d 20 63 61 63 6b 65  num_ids += cacke
1ca80 79 5f 72 65 61 64 5f 64 6f 64 5f 69 64 65 6e 74  y_read_dod_ident
1ca90 69 74 69 65 73 28 4e 55 4c 4c 2c 20 6e 75 6d 5f  ities(NULL, num_
1caa0 64 6f 64 5f 63 65 72 74 73 29 3b 0a 09 09 7d 0a  dod_certs);...}.
1cab0 0a 09 09 69 64 65 6e 74 69 74 69 65 73 20 3d 20  ...identities = 
1cac0 6d 61 6c 6c 6f 63 28 6e 75 6d 5f 69 64 73 20 2a  malloc(num_ids *
1cad0 20 73 69 7a 65 6f 66 28 2a 69 64 65 6e 74 69 74   sizeof(*identit
1cae0 69 65 73 29 29 3b 0a 0a 09 09 2f 2a 20 41 64 64  ies));..../* Add
1caf0 20 63 65 72 74 69 66 69 63 61 74 65 73 2c 20 70   certificates, p
1cb00 75 62 6c 69 63 20 6b 65 79 73 2c 20 61 6e 64 20  ublic keys, and 
1cb10 70 72 69 76 61 74 65 20 6b 65 79 73 20 66 72 6f  private keys fro
1cb20 6d 20 74 68 65 20 73 6d 61 72 74 63 61 72 64 20  m the smartcard 
1cb30 2a 2f 0a 09 09 69 64 5f 69 64 78 20 3d 20 30 3b  */...id_idx = 0;
1cb40 0a 09 09 66 6f 72 20 28 63 65 72 74 5f 69 64 78  ...for (cert_idx
1cb50 20 3d 20 30 3b 20 63 65 72 74 5f 69 64 78 20 3c   = 0; cert_idx <
1cb60 20 6e 75 6d 5f 63 65 72 74 73 3b 20 63 65 72 74   num_certs; cert
1cb70 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 09 66 6f 72  _idx++) {....for
1cb80 20 28 63 75 72 72 5f 69 64 5f 74 79 70 65 20 3d   (curr_id_type =
1cb90 20 43 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 45   CKO_CERTIFICATE
1cba0 3b 20 63 75 72 72 5f 69 64 5f 74 79 70 65 20 3c  ; curr_id_type <
1cbb0 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b 45  = CKO_PRIVATE_KE
1cbc0 59 3b 20 63 75 72 72 5f 69 64 5f 74 79 70 65 2b  Y; curr_id_type+
1cbd0 2b 29 20 7b 0a 09 09 09 09 69 64 65 6e 74 69 74  +) {.....identit
1cbe0 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72  ies[id_idx].attr
1cbf0 69 62 75 74 65 73 20 3d 20 63 61 63 6b 65 79 5f  ibutes = cackey_
1cc00 67 65 74 5f 61 74 74 72 69 62 75 74 65 73 28 63  get_attributes(c
1cc10 75 72 72 5f 69 64 5f 74 79 70 65 2c 20 26 70 63  urr_id_type, &pc
1cc20 73 63 5f 69 64 65 6e 74 69 74 69 65 73 5b 63 65  sc_identities[ce
1cc30 72 74 5f 69 64 78 5d 2c 20 63 65 72 74 5f 69 64  rt_idx], cert_id
1cc40 78 2c 20 26 69 64 65 6e 74 69 74 69 65 73 5b 69  x, &identities[i
1cc50 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65  d_idx].attribute
1cc60 73 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09 09 09 69  s_count);......i
1cc70 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78  dentities[id_idx
1cc80 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20  ].pcsc_identity 
1cc90 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28  = malloc(sizeof(
1cca0 2a 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69  *identities[id_i
1ccb0 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69 74  dx].pcsc_identit
1ccc0 79 29 29 3b 0a 09 09 09 09 6d 65 6d 63 70 79 28  y));.....memcpy(
1ccd0 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64  identities[id_id
1cce0 78 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69 74 79  x].pcsc_identity
1ccf0 2c 20 26 70 63 73 63 5f 69 64 65 6e 74 69 74 69  , &pcsc_identiti
1cd00 65 73 5b 63 65 72 74 5f 69 64 78 5d 2c 20 73 69  es[cert_idx], si
1cd10 7a 65 6f 66 28 2a 69 64 65 6e 74 69 74 69 65 73  zeof(*identities
1cd20 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64  [id_idx].pcsc_id
1cd30 65 6e 74 69 74 79 29 29 3b 0a 0a 09 09 09 09 69  entity));......i
1cd40 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78  dentities[id_idx
1cd50 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d  ].pcsc_identity-
1cd60 3e 63 65 72 74 69 66 69 63 61 74 65 20 3d 20 6d  >certificate = m
1cd70 61 6c 6c 6f 63 28 70 63 73 63 5f 69 64 65 6e 74  alloc(pcsc_ident
1cd80 69 74 69 65 73 5b 63 65 72 74 5f 69 64 78 5d 2e  ities[cert_idx].
1cd90 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 29  certificate_len)
1cda0 3b 0a 09 09 09 09 6d 65 6d 63 70 79 28 69 64 65  ;.....memcpy(ide
1cdb0 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e  ntities[id_idx].
1cdc0 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 63  pcsc_identity->c
1cdd0 65 72 74 69 66 69 63 61 74 65 2c 20 70 63 73 63  ertificate, pcsc
1cde0 5f 69 64 65 6e 74 69 74 69 65 73 5b 63 65 72 74  _identities[cert
1cdf0 5f 69 64 78 5d 2e 63 65 72 74 69 66 69 63 61 74  _idx].certificat
1ce00 65 2c 20 70 63 73 63 5f 69 64 65 6e 74 69 74 69  e, pcsc_identiti
1ce10 65 73 5b 63 65 72 74 5f 69 64 78 5d 2e 63 65 72  es[cert_idx].cer
1ce20 74 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a 0a  tificate_len);..
1ce30 09 09 09 09 69 64 5f 69 64 78 2b 2b 3b 0a 09 09  ....id_idx++;...
1ce40 09 7d 0a 09 09 7d 0a 0a 09 09 69 66 20 28 69 6e  .}...}....if (in
1ce50 63 6c 75 64 65 5f 65 78 74 72 61 5f 63 65 72 74  clude_extra_cert
1ce60 73 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  s) {....CACKEY_D
1ce70 45 42 55 47 5f 50 52 49 4e 54 46 28 22 49 6e 63  EBUG_PRINTF("Inc
1ce80 6c 75 64 69 6e 67 20 55 53 20 47 6f 76 65 72 6e  luding US Govern
1ce90 6d 65 6e 74 20 43 65 72 74 69 66 69 63 61 74 65  ment Certificate
1cea0 73 20 6f 6e 20 68 61 72 64 77 61 72 65 20 73 6c  s on hardware sl
1ceb0 6f 74 22 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79  ot");.....cackey
1cec0 5f 72 65 61 64 5f 64 6f 64 5f 69 64 65 6e 74 69  _read_dod_identi
1ced0 74 69 65 73 28 69 64 65 6e 74 69 74 69 65 73 20  ties(identities 
1cee0 2b 20 69 64 5f 69 64 78 2c 20 6e 75 6d 5f 64 6f  + id_idx, num_do
1cef0 64 5f 63 65 72 74 73 29 3b 0a 09 09 7d 0a 0a 09  d_certs);...}...
1cf00 09 63 61 63 6b 65 79 5f 66 72 65 65 5f 63 65 72  .cackey_free_cer
1cf10 74 73 28 70 63 73 63 5f 69 64 65 6e 74 69 74 69  ts(pcsc_identiti
1cf20 65 73 2c 20 6e 75 6d 5f 63 65 72 74 73 2c 20 31  es, num_certs, 1
1cf30 29 3b 0a 0a 09 09 2a 69 64 73 5f 66 6f 75 6e 64  );....*ids_found
1cf40 20 3d 20 6e 75 6d 5f 69 64 73 3b 0a 0a 09 09 72   = num_ids;....r
1cf50 65 74 75 72 6e 28 69 64 65 6e 74 69 74 69 65 73  eturn(identities
1cf60 29 3b 0a 09 7d 0a 0a 0a 09 2a 69 64 73 5f 66 6f  );..}....*ids_fo
1cf70 75 6e 64 20 3d 20 30 3b 0a 09 72 65 74 75 72 6e  und = 0;..return
1cf80 28 4e 55 4c 4c 29 3b 0a 7d 0a 0a 73 74 61 74 69  (NULL);.}..stati
1cf90 63 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63  c cackey_ret cac
1cfa0 6b 65 79 5f 67 65 74 5f 70 69 6e 28 63 68 61 72  key_get_pin(char
1cfb0 20 2a 70 69 6e 62 75 66 29 20 7b 0a 09 46 49 4c   *pinbuf) {..FIL
1cfc0 45 20 2a 70 69 6e 66 64 3b 0a 09 63 68 61 72 20  E *pinfd;..char 
1cfd0 2a 66 67 65 74 73 5f 72 65 74 3b 0a 09 69 6e 74  *fgets_ret;..int
1cfe0 20 70 63 6c 6f 73 65 5f 72 65 74 3b 0a 0a 09 69   pclose_ret;...i
1cff0 66 20 28 63 61 63 6b 65 79 5f 70 69 6e 5f 63 6f  f (cackey_pin_co
1d000 6d 6d 61 6e 64 20 3d 3d 20 4e 55 4c 4c 29 20 7b  mmand == NULL) {
1d010 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
1d020 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29  _PCSC_E_GENERIC)
1d030 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 69 6e 62 75  ;..}...if (pinbu
1d040 66 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72  f == NULL) {...r
1d050 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
1d060 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d  C_E_GENERIC);..}
1d070 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1d080 50 52 49 4e 54 46 28 22 43 41 43 4b 45 59 5f 50  PRINTF("CACKEY_P
1d090 49 4e 5f 43 4f 4d 4d 41 4e 44 20 3d 20 25 73 22  IN_COMMAND = %s"
1d0a0 2c 20 63 61 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d  , cackey_pin_com
1d0b0 6d 61 6e 64 29 3b 0a 0a 09 70 69 6e 66 64 20 3d  mand);...pinfd =
1d0c0 20 70 6f 70 65 6e 28 63 61 63 6b 65 79 5f 70 69   popen(cackey_pi
1d0d0 6e 5f 63 6f 6d 6d 61 6e 64 2c 20 22 72 22 29 3b  n_command, "r");
1d0e0 0a 09 69 66 20 28 70 69 6e 66 64 20 3d 3d 20 4e  ..if (pinfd == N
1d0f0 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
1d100 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1d110 72 6f 72 2e 20 20 25 73 3a 20 55 6e 61 62 6c 65  ror.  %s: Unable
1d120 20 74 6f 20 72 75 6e 22 2c 20 63 61 63 6b 65 79   to run", cackey
1d130 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 29 3b 0a 0a  _pin_command);..
1d140 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
1d150 50 43 53 43 5f 45 5f 42 41 44 50 49 4e 29 3b 0a  PCSC_E_BADPIN);.
1d160 09 7d 0a 0a 09 66 67 65 74 73 5f 72 65 74 20 3d  .}...fgets_ret =
1d170 20 66 67 65 74 73 28 70 69 6e 62 75 66 2c 20 33   fgets(pinbuf, 3
1d180 32 2c 20 70 69 6e 66 64 29 3b 0a 09 69 66 20 28  2, pinfd);..if (
1d190 66 67 65 74 73 5f 72 65 74 20 3d 3d 20 4e 55 4c  fgets_ret == NUL
1d1a0 4c 29 20 7b 0a 09 09 70 69 6e 62 75 66 5b 30 5d  L) {...pinbuf[0]
1d1b0 20 3d 20 27 5c 30 27 3b 0a 09 7d 0a 0a 09 70 63   = '\0';..}...pc
1d1c0 6c 6f 73 65 5f 72 65 74 20 3d 20 70 63 6c 6f 73  lose_ret = pclos
1d1d0 65 28 70 69 6e 66 64 29 3b 0a 09 69 66 20 28 70  e(pinfd);..if (p
1d1e0 63 6c 6f 73 65 5f 72 65 74 20 3d 3d 20 2d 31 20  close_ret == -1 
1d1f0 26 26 20 65 72 72 6e 6f 20 3d 3d 20 45 43 48 49  && errno == ECHI
1d200 4c 44 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LD) {...CACKEY_D
1d210 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4e 6f 74  EBUG_PRINTF("Not
1d220 69 63 65 2e 20 20 70 63 6c 6f 73 65 28 29 20 69  ice.  pclose() i
1d230 6e 64 69 63 61 74 65 64 20 69 74 20 63 6f 75 6c  ndicated it coul
1d240 64 20 6e 6f 74 20 67 65 74 20 74 68 65 20 73 74  d not get the st
1d250 61 74 75 73 20 6f 66 20 74 68 65 20 63 68 69 6c  atus of the chil
1d260 64 2c 20 61 73 73 75 6d 69 6e 67 20 69 74 20 73  d, assuming it s
1d270 75 63 63 65 65 65 64 65 64 20 21 22 29 3b 0a 0a  ucceeeded !");..
1d280 09 09 70 63 6c 6f 73 65 5f 72 65 74 20 3d 20 30  ..pclose_ret = 0
1d290 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 63 6c 6f 73  ;..}...if (pclos
1d2a0 65 5f 72 65 74 20 21 3d 20 30 29 20 7b 0a 09 09  e_ret != 0) {...
1d2b0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1d2c0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 25 73 3a  NTF("Error.  %s:
1d2d0 20 65 78 69 74 65 64 20 77 69 74 68 20 6e 6f 6e   exited with non
1d2e0 2d 7a 65 72 6f 20 73 74 61 74 75 73 20 6f 66 20  -zero status of 
1d2f0 25 69 22 2c 20 63 61 63 6b 65 79 5f 70 69 6e 5f  %i", cackey_pin_
1d300 63 6f 6d 6d 61 6e 64 2c 20 70 63 6c 6f 73 65 5f  command, pclose_
1d310 72 65 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  ret);....return(
1d320 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 42 41  CACKEY_PCSC_E_BA
1d330 44 50 49 4e 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  DPIN);..}...if (
1d340 73 74 72 6c 65 6e 28 70 69 6e 62 75 66 29 20 3c  strlen(pinbuf) <
1d350 20 31 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   1) {...CACKEY_D
1d360 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1d370 6f 72 2e 20 20 25 73 3a 20 72 65 74 75 72 6e 65  or.  %s: returne
1d380 64 20 6e 6f 20 64 61 74 61 22 2c 20 63 61 63 6b  d no data", cack
1d390 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 29 3b  ey_pin_command);
1d3a0 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ....return(CACKE
1d3b0 59 5f 50 43 53 43 5f 45 5f 42 41 44 50 49 4e 29  Y_PCSC_E_BADPIN)
1d3c0 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 69 6e 62 75  ;..}...if (pinbu
1d3d0 66 5b 73 74 72 6c 65 6e 28 70 69 6e 62 75 66 29  f[strlen(pinbuf)
1d3e0 20 2d 20 31 5d 20 3d 3d 20 27 5c 6e 27 29 20 7b   - 1] == '\n') {
1d3f0 0a 09 09 70 69 6e 62 75 66 5b 73 74 72 6c 65 6e  ...pinbuf[strlen
1d400 28 70 69 6e 62 75 66 29 20 2d 20 31 5d 20 3d 20  (pinbuf) - 1] = 
1d410 27 5c 30 27 3b 0a 09 7d 0a 0a 09 72 65 74 75 72  '\0';..}...retur
1d420 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  n(CACKEY_PCSC_S_
1d430 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  OK);.}..CK_DEFIN
1d440 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
1d450 2c 20 43 5f 49 6e 69 74 69 61 6c 69 7a 65 29 28  , C_Initialize)(
1d460 43 4b 5f 56 4f 49 44 5f 50 54 52 20 70 49 6e 69  CK_VOID_PTR pIni
1d470 74 41 72 67 73 29 20 7b 0a 09 43 4b 5f 43 5f 49  tArgs) {..CK_C_I
1d480 4e 49 54 49 41 4c 49 5a 45 5f 41 52 47 53 20 43  NITIALIZE_ARGS C
1d490 4b 5f 50 54 52 20 61 72 67 73 3b 0a 09 75 69 6e  K_PTR args;..uin
1d4a0 74 33 32 5f 74 20 69 64 78 2c 20 68 69 67 68 65  t32_t idx, highe
1d4b0 73 74 5f 73 6c 6f 74 3b 0a 09 69 6e 74 20 6d 75  st_slot;..int mu
1d4c0 74 65 78 5f 69 6e 69 74 5f 72 65 74 3b 0a 09 69  tex_init_ret;..i
1d4d0 6e 74 20 69 6e 63 6c 75 64 65 5f 64 6f 64 5f 63  nt include_dod_c
1d4e0 65 72 74 73 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  erts;...CACKEY_D
1d4f0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
1d500 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 63 61  led.");...if (ca
1d510 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
1d520 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1d530 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1d540 2e 20 20 41 6c 72 65 61 64 79 20 69 6e 69 74 69  .  Already initi
1d550 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
1d560 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
1d570 49 5f 41 4c 52 45 41 44 59 5f 49 4e 49 54 49 41  I_ALREADY_INITIA
1d580 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  LIZED);..}...if 
1d590 28 70 49 6e 69 74 41 72 67 73 20 21 3d 20 4e 55  (pInitArgs != NU
1d5a0 4c 4c 29 20 7b 0a 09 09 61 72 67 73 20 3d 20 70  LL) {...args = p
1d5b0 49 6e 69 74 41 72 67 73 3b 0a 09 09 6d 65 6d 63  InitArgs;...memc
1d5c0 70 79 28 26 63 61 63 6b 65 79 5f 61 72 67 73 2c  py(&cackey_args,
1d5d0 20 61 72 67 73 2c 20 73 69 7a 65 6f 66 28 63 61   args, sizeof(ca
1d5e0 63 6b 65 79 5f 61 72 67 73 29 29 3b 0a 0a 09 09  ckey_args));....
1d5f0 69 66 20 28 61 72 67 73 2d 3e 43 72 65 61 74 65  if (args->Create
1d600 4d 75 74 65 78 20 3d 3d 20 4e 55 4c 4c 20 7c 7c  Mutex == NULL ||
1d610 20 61 72 67 73 2d 3e 44 65 73 74 72 6f 79 4d 75   args->DestroyMu
1d620 74 65 78 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61  tex == NULL || a
1d630 72 67 73 2d 3e 4c 6f 63 6b 4d 75 74 65 78 20 3d  rgs->LockMutex =
1d640 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 73 2d 3e  = NULL || args->
1d650 55 6e 6c 6f 63 6b 4d 75 74 65 78 20 3d 3d 20 4e  UnlockMutex == N
1d660 55 4c 4c 29 20 7b 0a 09 09 09 69 66 20 28 61 72  ULL) {....if (ar
1d670 67 73 2d 3e 43 72 65 61 74 65 4d 75 74 65 78 20  gs->CreateMutex 
1d680 21 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 73 2d  != NULL || args-
1d690 3e 44 65 73 74 72 6f 79 4d 75 74 65 78 20 21 3d  >DestroyMutex !=
1d6a0 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 73 2d 3e 4c   NULL || args->L
1d6b0 6f 63 6b 4d 75 74 65 78 20 21 3d 20 4e 55 4c 4c  ockMutex != NULL
1d6c0 20 7c 7c 20 61 72 67 73 2d 3e 55 6e 6c 6f 63 6b   || args->Unlock
1d6d0 4d 75 74 65 78 20 21 3d 20 4e 55 4c 4c 29 20 7b  Mutex != NULL) {
1d6e0 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
1d6f0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1d700 20 53 6f 6d 65 2c 20 62 75 74 20 6e 6f 74 20 41   Some, but not A
1d710 6c 6c 20 74 68 72 65 61 64 69 6e 67 20 70 72 69  ll threading pri
1d720 6d 69 74 69 76 65 73 20 70 72 6f 76 69 64 65 64  mitives provided
1d730 2e 22 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e  .");......return
1d740 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42  (CKR_ARGUMENTS_B
1d750 41 44 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a 09 7d  AD);....}...}..}
1d760 20 65 6c 73 65 20 7b 0a 09 09 63 61 63 6b 65 79   else {...cackey
1d770 5f 61 72 67 73 2e 43 72 65 61 74 65 4d 75 74 65  _args.CreateMute
1d780 78 20 3d 20 4e 55 4c 4c 3b 0a 09 09 63 61 63 6b  x = NULL;...cack
1d790 65 79 5f 61 72 67 73 2e 44 65 73 74 72 6f 79 4d  ey_args.DestroyM
1d7a0 75 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 09 09 63  utex = NULL;...c
1d7b0 61 63 6b 65 79 5f 61 72 67 73 2e 4c 6f 63 6b 4d  ackey_args.LockM
1d7c0 75 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 09 09 63  utex = NULL;...c
1d7d0 61 63 6b 65 79 5f 61 72 67 73 2e 55 6e 6c 6f 63  ackey_args.Unloc
1d7e0 6b 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 09  kMutex = NULL;..
1d7f0 09 63 61 63 6b 65 79 5f 61 72 67 73 2e 66 6c 61  .cackey_args.fla
1d800 67 73 20 3d 20 30 3b 0a 09 7d 0a 0a 09 66 6f 72  gs = 0;..}...for
1d810 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c   (idx = 0; idx <
1d820 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
1d830 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65  sessions) / size
1d840 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
1d850 6e 73 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29 20  ns[0])); idx++) 
1d860 7b 0a 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69  {...cackey_sessi
1d870 6f 6e 73 5b 69 64 78 5d 2e 61 63 74 69 76 65 20  ons[idx].active 
1d880 3d 20 30 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 69  = 0;..}...for (i
1d890 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 28 73  dx = 0; idx < (s
1d8a0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f  izeof(cackey_slo
1d8b0 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63  ts) / sizeof(cac
1d8c0 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b 20  key_slots[0])); 
1d8d0 69 64 78 2b 2b 29 20 7b 0a 09 09 63 61 63 6b 65  idx++) {...cacke
1d8e0 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 61 63 74  y_slots[idx].act
1d8f0 69 76 65 20 3d 20 30 3b 0a 09 09 63 61 63 6b 65  ive = 0;...cacke
1d900 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 70 63 73  y_slots[idx].pcs
1d910 63 5f 72 65 61 64 65 72 20 3d 20 4e 55 4c 4c 3b  c_reader = NULL;
1d920 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ...cackey_slots[
1d930 69 64 78 5d 2e 74 72 61 6e 73 61 63 74 69 6f 6e  idx].transaction
1d940 5f 64 65 70 74 68 20 3d 20 30 3b 0a 09 09 63 61  _depth = 0;...ca
1d950 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e  ckey_slots[idx].
1d960 74 72 61 6e 73 61 63 74 69 6f 6e 5f 6e 65 65 64  transaction_need
1d970 5f 68 77 5f 6c 6f 63 6b 20 3d 20 30 3b 0a 09 09  _hw_lock = 0;...
1d980 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78  cackey_slots[idx
1d990 5d 2e 73 6c 6f 74 5f 72 65 73 65 74 20 3d 20 30  ].slot_reset = 0
1d9a0 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ;...cackey_slots
1d9b0 5b 69 64 78 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67  [idx].token_flag
1d9c0 73 20 3d 20 30 3b 0a 09 09 63 61 63 6b 65 79 5f  s = 0;...cackey_
1d9d0 73 6c 6f 74 73 5b 69 64 78 5d 2e 6c 61 62 65 6c  slots[idx].label
1d9e0 20 3d 20 4e 55 4c 4c 3b 0a 09 09 63 61 63 6b 65   = NULL;...cacke
1d9f0 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 69 6e 74  y_slots[idx].int
1da00 65 72 6e 61 6c 20 3d 20 30 3b 0a 09 7d 0a 0a 23  ernal = 0;..}..#
1da10 69 66 64 65 66 20 43 41 43 4b 45 59 5f 4e 4f 5f  ifdef CACKEY_NO_
1da20 45 58 54 52 41 5f 43 45 52 54 53 0a 09 69 66 20  EXTRA_CERTS..if 
1da30 28 67 65 74 65 6e 76 28 22 43 41 43 4b 45 59 5f  (getenv("CACKEY_
1da40 45 58 54 52 41 5f 43 45 52 54 53 22 29 20 21 3d  EXTRA_CERTS") !=
1da50 20 4e 55 4c 4c 29 20 7b 0a 09 09 69 6e 63 6c 75   NULL) {...inclu
1da60 64 65 5f 64 6f 64 5f 63 65 72 74 73 20 3d 20 31  de_dod_certs = 1
1da70 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69 6e  ;..} else {...in
1da80 63 6c 75 64 65 5f 64 6f 64 5f 63 65 72 74 73 20  clude_dod_certs 
1da90 3d 20 30 3b 0a 09 7d 0a 23 65 6c 73 65 0a 09 69  = 0;..}.#else..i
1daa0 66 20 28 67 65 74 65 6e 76 28 22 43 41 43 4b 45  f (getenv("CACKE
1dab0 59 5f 4e 4f 5f 45 58 54 52 41 5f 43 45 52 54 53  Y_NO_EXTRA_CERTS
1dac0 22 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  ") != NULL) {...
1dad0 69 6e 63 6c 75 64 65 5f 64 6f 64 5f 63 65 72 74  include_dod_cert
1dae0 73 20 3d 20 30 3b 0a 09 7d 20 65 6c 73 65 20 7b  s = 0;..} else {
1daf0 0a 09 09 69 6e 63 6c 75 64 65 5f 64 6f 64 5f 63  ...include_dod_c
1db00 65 72 74 73 20 3d 20 31 3b 0a 09 7d 0a 23 65 6e  erts = 1;..}.#en
1db10 64 69 66 0a 0a 09 69 66 20 28 69 6e 63 6c 75 64  dif...if (includ
1db20 65 5f 64 6f 64 5f 63 65 72 74 73 20 3d 3d 20 30  e_dod_certs == 0
1db30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1db40 55 47 5f 50 52 49 4e 54 46 28 22 41 73 6b 65 64  UG_PRINTF("Asked
1db50 20 6e 6f 74 20 74 6f 20 69 6e 63 6c 75 64 65 20   not to include 
1db60 44 6f 44 20 63 65 72 74 69 66 69 63 61 74 65 73  DoD certificates
1db70 22 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09  ");..} else {...
1db80 68 69 67 68 65 73 74 5f 73 6c 6f 74 20 3d 20 28  highest_slot = (
1db90 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
1dba0 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ots) / sizeof(ca
1dbb0 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 20  ckey_slots[0])) 
1dbc0 2d 20 31 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  - 1;....CACKEY_D
1dbd0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 49 6e 63  EBUG_PRINTF("Inc
1dbe0 6c 75 64 69 6e 67 20 44 6f 44 20 63 65 72 74 73  luding DoD certs
1dbf0 20 69 6e 20 73 6c 6f 74 20 25 6c 75 22 2c 20 28   in slot %lu", (
1dc00 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 68  unsigned long) h
1dc10 69 67 68 65 73 74 5f 73 6c 6f 74 29 3b 0a 0a 09  ighest_slot);...
1dc20 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 68 69  .cackey_slots[hi
1dc30 67 68 65 73 74 5f 73 6c 6f 74 5d 2e 61 63 74 69  ghest_slot].acti
1dc40 76 65 20 3d 20 31 3b 0a 09 09 63 61 63 6b 65 79  ve = 1;...cackey
1dc50 5f 73 6c 6f 74 73 5b 68 69 67 68 65 73 74 5f 73  _slots[highest_s
1dc60 6c 6f 74 5d 2e 69 6e 74 65 72 6e 61 6c 20 3d 20  lot].internal = 
1dc70 31 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  1;...cackey_slot
1dc80 73 5b 68 69 67 68 65 73 74 5f 73 6c 6f 74 5d 2e  s[highest_slot].
1dc90 6c 61 62 65 6c 20 3d 20 28 75 6e 73 69 67 6e 65  label = (unsigne
1dca0 64 20 63 68 61 72 20 2a 29 20 22 55 53 20 47 6f  d char *) "US Go
1dcb0 76 65 72 6e 6d 65 6e 74 20 43 65 72 74 69 66 69  vernment Certifi
1dcc0 63 61 74 65 73 22 3b 0a 09 09 63 61 63 6b 65 79  cates";...cackey
1dcd0 5f 73 6c 6f 74 73 5b 68 69 67 68 65 73 74 5f 73  _slots[highest_s
1dce0 6c 6f 74 5d 2e 70 63 73 63 5f 72 65 61 64 65 72  lot].pcsc_reader
1dcf0 20 3d 20 22 43 41 43 4b 65 79 22 3b 0a 09 09 63   = "CACKey";...c
1dd00 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 68 69 67 68  ackey_slots[high
1dd10 65 73 74 5f 73 6c 6f 74 5d 2e 74 6f 6b 65 6e 5f  est_slot].token_
1dd20 66 6c 61 67 73 20 3d 20 30 3b 0a 09 7d 0a 0a 09  flags = 0;..}...
1dd30 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
1dd40 65 64 20 3d 20 31 3b 0a 0a 09 69 66 20 28 21 63  ed = 1;...if (!c
1dd50 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 5f 69 6e  ackey_biglock_in
1dd60 69 74 29 20 7b 0a 09 09 6d 75 74 65 78 5f 69 6e  it) {...mutex_in
1dd70 69 74 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f  it_ret = cackey_
1dd80 6d 75 74 65 78 5f 63 72 65 61 74 65 28 26 63 61  mutex_create(&ca
1dd90 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
1dda0 09 09 69 66 20 28 6d 75 74 65 78 5f 69 6e 69 74  ..if (mutex_init
1ddb0 5f 72 65 74 20 21 3d 20 30 29 20 7b 0a 09 09 09  _ret != 0) {....
1ddc0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1ddd0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4d 75 74  NTF("Error.  Mut
1dde0 65 78 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  ex initializatio
1ddf0 6e 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  n failed.");....
1de00 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 41 4e 54  .return(CKR_CANT
1de10 5f 4c 4f 43 4b 29 3b 0a 09 09 7d 0a 0a 09 09 63  _LOCK);...}....c
1de20 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 5f 69 6e  ackey_biglock_in
1de30 69 74 20 3d 20 31 3b 0a 09 7d 0a 0a 09 2f 2a 20  it = 1;..}.../* 
1de40 44 65 66 69 6e 65 20 61 20 63 6f 6d 6d 61 6e 64  Define a command
1de50 20 74 6f 20 70 72 6f 6d 70 74 20 75 73 65 72 20   to prompt user 
1de60 66 6f 72 20 61 20 50 49 4e 20 2a 2f 0a 23 69 66  for a PIN */.#if
1de70 64 65 66 20 43 41 43 4b 45 59 5f 50 49 4e 5f 43  def CACKEY_PIN_C
1de80 4f 4d 4d 41 4e 44 5f 44 45 46 41 55 4c 54 0a 09  OMMAND_DEFAULT..
1de90 63 61 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61  cackey_pin_comma
1dea0 6e 64 20 3d 20 73 74 72 64 75 70 28 43 41 43 4b  nd = strdup(CACK
1deb0 45 59 5f 4d 41 43 52 4f 5f 44 45 46 41 55 4c 54  EY_MACRO_DEFAULT
1dec0 5f 58 53 54 52 28 43 41 43 4b 45 59 5f 50 49 4e  _XSTR(CACKEY_PIN
1ded0 5f 43 4f 4d 4d 41 4e 44 5f 44 45 46 41 55 4c 54  _COMMAND_DEFAULT
1dee0 29 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64  ));.#endif..#ifd
1def0 65 66 20 43 41 43 4b 45 59 5f 50 49 4e 5f 43 4f  ef CACKEY_PIN_CO
1df00 4d 4d 41 4e 44 5f 58 4f 4e 4c 59 5f 44 45 46 41  MMAND_XONLY_DEFA
1df10 55 4c 54 0a 09 69 66 20 28 67 65 74 65 6e 76 28  ULT..if (getenv(
1df20 22 44 49 53 50 4c 41 59 22 29 20 21 3d 20 4e 55  "DISPLAY") != NU
1df30 4c 4c 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 70  LL) {...cackey_p
1df40 69 6e 5f 63 6f 6d 6d 61 6e 64 20 3d 20 73 74 72  in_command = str
1df50 64 75 70 28 43 41 43 4b 45 59 5f 4d 41 43 52 4f  dup(CACKEY_MACRO
1df60 5f 44 45 46 41 55 4c 54 5f 58 53 54 52 28 43 41  _DEFAULT_XSTR(CA
1df70 43 4b 45 59 5f 50 49 4e 5f 43 4f 4d 4d 41 4e 44  CKEY_PIN_COMMAND
1df80 5f 58 4f 4e 4c 59 5f 44 45 46 41 55 4c 54 29 29  _XONLY_DEFAULT))
1df90 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a 0a 09 69 66  ;..}.#endif...if
1dfa0 20 28 67 65 74 65 6e 76 28 22 43 41 43 4b 45 59   (getenv("CACKEY
1dfb0 5f 50 49 4e 5f 43 4f 4d 4d 41 4e 44 22 29 20 21  _PIN_COMMAND") !
1dfc0 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 63 61 63 6b  = NULL) {...cack
1dfd0 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20 3d  ey_pin_command =
1dfe0 20 73 74 72 64 75 70 28 67 65 74 65 6e 76 28 22   strdup(getenv("
1dff0 43 41 43 4b 45 59 5f 50 49 4e 5f 43 4f 4d 4d 41  CACKEY_PIN_COMMA
1e000 4e 44 22 29 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  ND"));..}...if (
1e010 67 65 74 65 6e 76 28 22 43 41 43 4b 45 59 5f 50  getenv("CACKEY_P
1e020 49 4e 5f 43 4f 4d 4d 41 4e 44 5f 58 4f 4e 4c 59  IN_COMMAND_XONLY
1e030 22 29 20 21 3d 20 4e 55 4c 4c 20 26 26 20 67 65  ") != NULL && ge
1e040 74 65 6e 76 28 22 44 49 53 50 4c 41 59 22 29 20  tenv("DISPLAY") 
1e050 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 63 61 63  != NULL) {...cac
1e060 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20  key_pin_command 
1e070 3d 20 73 74 72 64 75 70 28 67 65 74 65 6e 76 28  = strdup(getenv(
1e080 22 43 41 43 4b 45 59 5f 50 49 4e 5f 43 4f 4d 4d  "CACKEY_PIN_COMM
1e090 41 4e 44 5f 58 4f 4e 4c 59 22 29 29 3b 0a 09 7d  AND_XONLY"));..}
1e0a0 0a 0a 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f  ..#ifdef CACKEY_
1e0b0 52 45 41 44 45 52 53 5f 49 4e 43 4c 55 44 45 5f  READERS_INCLUDE_
1e0c0 4f 4e 4c 59 5f 44 45 46 41 55 4c 54 0a 09 63 61  ONLY_DEFAULT..ca
1e0d0 63 6b 65 79 5f 72 65 61 64 65 72 73 5f 69 6e 63  ckey_readers_inc
1e0e0 6c 75 64 65 5f 6f 6e 6c 79 20 3d 20 73 74 72 64  lude_only = strd
1e0f0 75 70 28 43 41 43 4b 45 59 5f 4d 41 43 52 4f 5f  up(CACKEY_MACRO_
1e100 44 45 46 41 55 4c 54 5f 58 53 54 52 28 43 41 43  DEFAULT_XSTR(CAC
1e110 4b 45 59 5f 52 45 41 44 45 52 53 5f 49 4e 43 4c  KEY_READERS_INCL
1e120 55 44 45 5f 4f 4e 4c 59 5f 44 45 46 41 55 4c 54  UDE_ONLY_DEFAULT
1e130 29 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64  ));.#endif..#ifd
1e140 65 66 20 43 41 43 4b 45 59 5f 52 45 41 44 45 52  ef CACKEY_READER
1e150 53 5f 45 58 43 4c 55 44 45 5f 44 45 46 41 55 4c  S_EXCLUDE_DEFAUL
1e160 54 0a 09 63 61 63 6b 65 79 5f 72 65 61 64 65 72  T..cackey_reader
1e170 73 5f 65 78 63 6c 75 64 65 20 3d 20 73 74 72 64  s_exclude = strd
1e180 75 70 28 43 41 43 4b 45 59 5f 4d 41 43 52 4f 5f  up(CACKEY_MACRO_
1e190 44 45 46 41 55 4c 54 5f 58 53 54 52 28 43 41 43  DEFAULT_XSTR(CAC
1e1a0 4b 45 59 5f 52 45 41 44 45 52 53 5f 45 58 43 4c  KEY_READERS_EXCL
1e1b0 55 44 45 5f 44 45 46 41 55 4c 54 29 29 3b 0a 23  UDE_DEFAULT));.#
1e1c0 65 6e 64 69 66 0a 0a 09 69 66 20 28 67 65 74 65  endif...if (gete
1e1d0 6e 76 28 22 43 41 43 4b 45 59 5f 52 45 41 44 45  nv("CACKEY_READE
1e1e0 52 53 5f 49 4e 43 4c 55 44 45 5f 4f 4e 4c 59 22  RS_INCLUDE_ONLY"
1e1f0 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 63  ) != NULL) {...c
1e200 61 63 6b 65 79 5f 72 65 61 64 65 72 73 5f 69 6e  ackey_readers_in
1e210 63 6c 75 64 65 5f 6f 6e 6c 79 20 3d 20 73 74 72  clude_only = str
1e220 64 75 70 28 67 65 74 65 6e 76 28 22 43 41 43 4b  dup(getenv("CACK
1e230 45 59 5f 52 45 41 44 45 52 53 5f 49 4e 43 4c 55  EY_READERS_INCLU
1e240 44 45 5f 4f 4e 4c 59 22 29 29 3b 0a 0a 09 09 69  DE_ONLY"));....i
1e250 66 20 28 63 61 63 6b 65 79 5f 72 65 61 64 65 72  f (cackey_reader
1e260 73 5f 69 6e 63 6c 75 64 65 5f 6f 6e 6c 79 5b 30  s_include_only[0
1e270 5d 20 3d 3d 20 27 5c 30 27 29 20 7b 0a 09 09 09  ] == '\0') {....
1e280 66 72 65 65 28 63 61 63 6b 65 79 5f 72 65 61 64  free(cackey_read
1e290 65 72 73 5f 69 6e 63 6c 75 64 65 5f 6f 6e 6c 79  ers_include_only
1e2a0 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 72 65  );.....cackey_re
1e2b0 61 64 65 72 73 5f 69 6e 63 6c 75 64 65 5f 6f 6e  aders_include_on
1e2c0 6c 79 20 3d 20 4e 55 4c 4c 3b 0a 09 09 7d 0a 09  ly = NULL;...}..
1e2d0 7d 0a 0a 09 69 66 20 28 67 65 74 65 6e 76 28 22  }...if (getenv("
1e2e0 43 41 43 4b 45 59 5f 52 45 41 44 45 52 53 5f 45  CACKEY_READERS_E
1e2f0 58 43 4c 55 44 45 22 29 20 21 3d 20 4e 55 4c 4c  XCLUDE") != NULL
1e300 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 72 65 61  ) {...cackey_rea
1e310 64 65 72 73 5f 65 78 63 6c 75 64 65 20 3d 20 73  ders_exclude = s
1e320 74 72 64 75 70 28 67 65 74 65 6e 76 28 22 43 41  trdup(getenv("CA
1e330 43 4b 45 59 5f 52 45 41 44 45 52 53 5f 45 58 43  CKEY_READERS_EXC
1e340 4c 55 44 45 22 29 29 3b 0a 0a 09 09 69 66 20 28  LUDE"));....if (
1e350 63 61 63 6b 65 79 5f 72 65 61 64 65 72 73 5f 65  cackey_readers_e
1e360 78 63 6c 75 64 65 5b 30 5d 20 3d 3d 20 27 5c 30  xclude[0] == '\0
1e370 27 29 20 7b 0a 09 09 09 66 72 65 65 28 63 61 63  ') {....free(cac
1e380 6b 65 79 5f 72 65 61 64 65 72 73 5f 65 78 63 6c  key_readers_excl
1e390 75 64 65 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79  ude);.....cackey
1e3a0 5f 72 65 61 64 65 72 73 5f 65 78 63 6c 75 64 65  _readers_exclude
1e3b0 20 3d 20 4e 55 4c 4c 3b 0a 09 09 7d 0a 09 7d 0a   = NULL;...}..}.
1e3c0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1e3d0 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
1e3e0 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43   CKR_OK (%i)", C
1e3f0 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e  KR_OK);...return
1e400 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f  (CKR_OK);.}..CK_
1e410 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
1e420 43 4b 5f 52 56 2c 20 43 5f 46 69 6e 61 6c 69 7a  CK_RV, C_Finaliz
1e430 65 29 28 43 4b 5f 56 4f 49 44 5f 50 54 52 20 70  e)(CK_VOID_PTR p
1e440 52 65 73 65 72 76 65 64 29 20 7b 0a 09 75 69 6e  Reserved) {..uin
1e450 74 33 32 5f 74 20 69 64 78 3b 0a 0a 09 43 41 43  t32_t idx;...CAC
1e460 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1e470 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
1e480 66 20 28 70 52 65 73 65 72 76 65 64 20 21 3d 20  f (pReserved != 
1e490 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
1e4a0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1e4b0 72 72 6f 72 2e 20 70 52 65 73 65 72 76 65 64 20  rror. pReserved 
1e4c0 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 22 29 3b 0a  is not NULL.");.
1e4d0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52  ...return(CKR_AR
1e4e0 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d  GUMENTS_BAD);..}
1e4f0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
1e500 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
1e510 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1e520 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
1e530 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
1e540 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
1e550 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
1e560 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 66  IALIZED);..}...f
1e570 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78  or (idx = 0; idx
1e580 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65   < (sizeof(cacke
1e590 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69  y_sessions) / si
1e5a0 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
1e5b0 69 6f 6e 73 5b 30 5d 29 29 3b 20 69 64 78 2b 2b  ions[0])); idx++
1e5c0 29 20 7b 0a 09 09 69 66 20 28 63 61 63 6b 65 79  ) {...if (cackey
1e5d0 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 61  _sessions[idx].a
1e5e0 63 74 69 76 65 29 20 7b 0a 09 09 09 43 5f 43 6c  ctive) {....C_Cl
1e5f0 6f 73 65 53 65 73 73 69 6f 6e 28 69 64 78 29 3b  oseSession(idx);
1e600 0a 09 09 7d 0a 09 7d 0a 0a 09 63 61 63 6b 65 79  ...}..}...cackey
1e610 5f 73 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e 65 63  _slots_disconnec
1e620 74 5f 61 6c 6c 28 29 3b 0a 0a 09 66 6f 72 20 28  t_all();...for (
1e630 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 28  idx = 0; idx < (
1e640 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
1e650 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ots) / sizeof(ca
1e660 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b  ckey_slots[0]));
1e670 20 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28   idx++) {...if (
1e680 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78  cackey_slots[idx
1e690 5d 2e 69 6e 74 65 72 6e 61 6c 29 20 7b 0a 09 09  ].internal) {...
1e6a0 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 7d 0a 0a  .continue;...}..
1e6b0 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f  ..if (cackey_slo
1e6c0 74 73 5b 69 64 78 5d 2e 70 63 73 63 5f 72 65 61  ts[idx].pcsc_rea
1e6d0 64 65 72 29 20 7b 0a 09 09 09 66 72 65 65 28 63  der) {....free(c
1e6e0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d  ackey_slots[idx]
1e6f0 2e 70 63 73 63 5f 72 65 61 64 65 72 29 3b 0a 09  .pcsc_reader);..
1e700 09 7d 0a 0a 09 09 69 66 20 28 63 61 63 6b 65 79  .}....if (cackey
1e710 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 63 61 63 68  _slots[idx].cach
1e720 65 64 5f 63 65 72 74 73 29 20 7b 0a 09 09 09 63  ed_certs) {....c
1e730 61 63 6b 65 79 5f 66 72 65 65 5f 63 65 72 74 73  ackey_free_certs
1e740 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64  (cackey_slots[id
1e750 78 5d 2e 63 61 63 68 65 64 5f 63 65 72 74 73 2c  x].cached_certs,
1e760 20 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64   cackey_slots[id
1e770 78 5d 2e 63 61 63 68 65 64 5f 63 65 72 74 73 5f  x].cached_certs_
1e780 63 6f 75 6e 74 2c 20 31 29 3b 0a 0a 09 09 09 63  count, 1);.....c
1e790 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d  ackey_slots[idx]
1e7a0 2e 63 61 63 68 65 64 5f 63 65 72 74 73 20 3d 20  .cached_certs = 
1e7b0 4e 55 4c 4c 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 63  NULL;...}..}...c
1e7c0 61 63 6b 65 79 5f 70 63 73 63 5f 64 69 73 63 6f  ackey_pcsc_disco
1e7d0 6e 6e 65 63 74 28 29 3b 0a 0a 09 69 66 20 28 63  nnect();...if (c
1e7e0 61 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e  ackey_pin_comman
1e7f0 64 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 66  d != NULL) {...f
1e800 72 65 65 28 63 61 63 6b 65 79 5f 70 69 6e 5f 63  ree(cackey_pin_c
1e810 6f 6d 6d 61 6e 64 29 3b 0a 0a 09 09 63 61 63 6b  ommand);....cack
1e820 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20 3d  ey_pin_command =
1e830 20 4e 55 4c 4c 3b 0a 09 7d 0a 0a 09 69 66 20 28   NULL;..}...if (
1e840 63 61 63 6b 65 79 5f 72 65 61 64 65 72 73 5f 69  cackey_readers_i
1e850 6e 63 6c 75 64 65 5f 6f 6e 6c 79 20 21 3d 20 4e  nclude_only != N
1e860 55 4c 4c 29 20 7b 0a 09 09 66 72 65 65 28 63 61  ULL) {...free(ca
1e870 63 6b 65 79 5f 72 65 61 64 65 72 73 5f 69 6e 63  ckey_readers_inc
1e880 6c 75 64 65 5f 6f 6e 6c 79 29 3b 0a 0a 09 09 63  lude_only);....c
1e890 61 63 6b 65 79 5f 72 65 61 64 65 72 73 5f 69 6e  ackey_readers_in
1e8a0 63 6c 75 64 65 5f 6f 6e 6c 79 20 3d 20 4e 55 4c  clude_only = NUL
1e8b0 4c 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b  L;..}...if (cack
1e8c0 65 79 5f 72 65 61 64 65 72 73 5f 65 78 63 6c 75  ey_readers_exclu
1e8d0 64 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  de != NULL) {...
1e8e0 66 72 65 65 28 63 61 63 6b 65 79 5f 72 65 61 64  free(cackey_read
1e8f0 65 72 73 5f 65 78 63 6c 75 64 65 29 3b 0a 0a 09  ers_exclude);...
1e900 09 63 61 63 6b 65 79 5f 72 65 61 64 65 72 73 5f  .cackey_readers_
1e910 65 78 63 6c 75 64 65 20 3d 20 4e 55 4c 4c 3b 0a  exclude = NULL;.
1e920 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 69 6e 69 74  .}...cackey_init
1e930 69 61 6c 69 7a 65 64 20 3d 20 30 3b 0a 0a 09 43  ialized = 0;...C
1e940 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1e950 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
1e960 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f  R_OK (%i)", CKR_
1e970 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  OK);...return(CK
1e980 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  R_OK);.}..CK_DEF
1e990 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
1e9a0 52 56 2c 20 43 5f 47 65 74 49 6e 66 6f 29 28 43  RV, C_GetInfo)(C
1e9b0 4b 5f 49 4e 46 4f 5f 50 54 52 20 70 49 6e 66 6f  K_INFO_PTR pInfo
1e9c0 29 20 7b 0a 09 73 74 61 74 69 63 20 43 4b 5f 55  ) {..static CK_U
1e9d0 54 46 38 43 48 41 52 20 6d 61 6e 75 66 61 63 74  TF8CHAR manufact
1e9e0 75 72 65 72 49 44 5b 5d 20 3d 20 22 55 2e 53 2e  urerID[] = "U.S.
1e9f0 20 47 6f 76 65 72 6e 6d 65 6e 74 22 3b 0a 09 73   Government";..s
1ea00 74 61 74 69 63 20 43 4b 5f 55 54 46 38 43 48 41  tatic CK_UTF8CHA
1ea10 52 20 6c 69 62 72 61 72 79 44 65 73 63 72 69 70  R libraryDescrip
1ea20 74 69 6f 6e 5b 5d 20 3d 20 22 43 41 43 4b 65 79  tion[] = "CACKey
1ea30 22 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ";...CACKEY_DEBU
1ea40 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
1ea50 2e 22 29 3b 0a 0a 09 69 66 20 28 70 49 6e 66 6f  .");...if (pInfo
1ea60 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
1ea70 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1ea80 46 28 22 45 72 72 6f 72 2e 20 70 49 6e 66 6f 20  F("Error. pInfo 
1ea90 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72  is NULL.");....r
1eaa0 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45  eturn(CKR_ARGUME
1eab0 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69  NTS_BAD);..}...i
1eac0 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
1ead0 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
1eae0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1eaf0 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
1eb00 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
1eb10 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
1eb20 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
1eb30 5a 45 44 29 3b 0a 09 7d 0a 0a 09 70 49 6e 66 6f  ZED);..}...pInfo
1eb40 2d 3e 63 72 79 70 74 6f 6b 69 56 65 72 73 69 6f  ->cryptokiVersio
1eb50 6e 2e 6d 61 6a 6f 72 20 3d 20 28 28 43 41 43 4b  n.major = ((CACK
1eb60 45 59 5f 43 52 59 50 54 4f 4b 49 5f 56 45 52 53  EY_CRYPTOKI_VERS
1eb70 49 4f 4e 5f 43 4f 44 45 29 20 3e 3e 20 31 36 29  ION_CODE) >> 16)
1eb80 20 26 20 30 78 66 66 3b 0a 09 70 49 6e 66 6f 2d   & 0xff;..pInfo-
1eb90 3e 63 72 79 70 74 6f 6b 69 56 65 72 73 69 6f 6e  >cryptokiVersion
1eba0 2e 6d 69 6e 6f 72 20 3d 20 28 28 43 41 43 4b 45  .minor = ((CACKE
1ebb0 59 5f 43 52 59 50 54 4f 4b 49 5f 56 45 52 53 49  Y_CRYPTOKI_VERSI
1ebc0 4f 4e 5f 43 4f 44 45 29 20 3e 3e 20 38 29 20 26  ON_CODE) >> 8) &
1ebd0 20 30 78 66 66 3b 0a 0a 09 6d 65 6d 73 65 74 28   0xff;...memset(
1ebe0 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75  pInfo->manufactu
1ebf0 72 65 72 49 44 2c 20 27 20 27 2c 20 73 69 7a 65  rerID, ' ', size
1ec00 6f 66 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61  of(pInfo->manufa
1ec10 63 74 75 72 65 72 49 44 29 29 3b 0a 09 6d 65 6d  cturerID));..mem
1ec20 63 70 79 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66  cpy(pInfo->manuf
1ec30 61 63 74 75 72 65 72 49 44 2c 20 6d 61 6e 75 66  acturerID, manuf
1ec40 61 63 74 75 72 65 72 49 44 2c 20 73 69 7a 65 6f  acturerID, sizeo
1ec50 66 28 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44  f(manufacturerID
1ec60 29 20 2d 20 31 29 3b 0a 0a 09 70 49 6e 66 6f 2d  ) - 1);...pInfo-
1ec70 3e 66 6c 61 67 73 20 3d 20 30 78 30 30 3b 0a 0a  >flags = 0x00;..
1ec80 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 6c  .memset(pInfo->l
1ec90 69 62 72 61 72 79 44 65 73 63 72 69 70 74 69 6f  ibraryDescriptio
1eca0 6e 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 28 70  n, ' ', sizeof(p
1ecb0 49 6e 66 6f 2d 3e 6c 69 62 72 61 72 79 44 65 73  Info->libraryDes
1ecc0 63 72 69 70 74 69 6f 6e 29 29 3b 0a 09 6d 65 6d  cription));..mem
1ecd0 63 70 79 28 70 49 6e 66 6f 2d 3e 6c 69 62 72 61  cpy(pInfo->libra
1ece0 72 79 44 65 73 63 72 69 70 74 69 6f 6e 2c 20 6c  ryDescription, l
1ecf0 69 62 72 61 72 79 44 65 73 63 72 69 70 74 69 6f  ibraryDescriptio
1ed00 6e 2c 20 73 69 7a 65 6f 66 28 6c 69 62 72 61 72  n, sizeof(librar
1ed10 79 44 65 73 63 72 69 70 74 69 6f 6e 29 20 2d 20  yDescription) - 
1ed20 31 29 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 6c 69 62  1);...pInfo->lib
1ed30 72 61 72 79 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f  raryVersion.majo
1ed40 72 20 3d 20 28 63 61 63 6b 65 79 5f 67 65 74 76  r = (cackey_getv
1ed50 65 72 73 69 6f 6e 28 29 20 3e 3e 20 31 36 29 20  ersion() >> 16) 
1ed60 26 20 30 78 66 66 3b 0a 09 70 49 6e 66 6f 2d 3e  & 0xff;..pInfo->
1ed70 6c 69 62 72 61 72 79 56 65 72 73 69 6f 6e 2e 6d  libraryVersion.m
1ed80 69 6e 6f 72 20 3d 20 28 63 61 63 6b 65 79 5f 67  inor = (cackey_g
1ed90 65 74 76 65 72 73 69 6f 6e 28 29 20 3e 3e 20 38  etversion() >> 8
1eda0 29 20 26 20 30 78 66 66 3b 0a 0a 09 43 41 43 4b  ) & 0xff;...CACK
1edb0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1edc0 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
1edd0 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29  K (%i)", CKR_OK)
1ede0 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ;...return(CKR_O
1edf0 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 50 72 6f  K);.}../*. * Pro
1ee00 63 65 73 73 20 6c 69 73 74 20 6f 66 20 72 65 61  cess list of rea
1ee10 64 65 72 73 2c 20 61 6e 64 20 63 72 65 61 74 65  ders, and create
1ee20 20 6d 61 70 70 69 6e 67 20 62 65 74 77 65 65 6e   mapping between
1ee30 20 72 65 61 64 65 72 20 6e 61 6d 65 20 61 6e 64   reader name and
1ee40 20 73 6c 6f 74 20 49 44 0a 20 2a 2f 0a 43 4b 5f   slot ID. */.CK_
1ee50 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
1ee60 43 4b 5f 52 56 2c 20 43 5f 47 65 74 53 6c 6f 74  CK_RV, C_GetSlot
1ee70 4c 69 73 74 29 28 43 4b 5f 42 42 4f 4f 4c 20 74  List)(CK_BBOOL t
1ee80 6f 6b 65 6e 50 72 65 73 65 6e 74 2c 20 43 4b 5f  okenPresent, CK_
1ee90 53 4c 4f 54 5f 49 44 5f 50 54 52 20 70 53 6c 6f  SLOT_ID_PTR pSlo
1eea0 74 4c 69 73 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f  tList, CK_ULONG_
1eeb0 50 54 52 20 70 75 6c 43 6f 75 6e 74 29 20 7b 0a  PTR pulCount) {.
1eec0 09 73 74 61 74 69 63 20 69 6e 74 20 66 69 72 73  .static int firs
1eed0 74 5f 63 61 6c 6c 20 3d 20 31 3b 0a 09 69 6e 74  t_call = 1;..int
1eee0 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09   mutex_retval;..
1eef0 69 6e 74 20 70 63 73 63 5f 63 6f 6e 6e 65 63 74  int pcsc_connect
1ef00 5f 72 65 74 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20  _ret;..CK_ULONG 
1ef10 63 6f 75 6e 74 2c 20 73 6c 6f 74 5f 63 6f 75 6e  count, slot_coun
1ef20 74 20 3d 20 30 2c 20 63 75 72 72 73 6c 6f 74 2c  t = 0, currslot,
1ef30 20 73 6c 6f 74 5f 69 64 78 3b 0a 09 63 68 61 72   slot_idx;..char
1ef40 20 2a 70 63 73 63 5f 72 65 61 64 65 72 73 2c 20   *pcsc_readers, 
1ef50 2a 70 63 73 63 5f 72 65 61 64 65 72 73 5f 73 2c  *pcsc_readers_s,
1ef60 20 2a 70 63 73 63 5f 72 65 61 64 65 72 73 5f 65   *pcsc_readers_e
1ef70 3b 0a 09 63 68 61 72 20 2a 72 65 61 64 65 72 5f  ;..char *reader_
1ef80 63 68 65 63 6b 5f 70 61 74 74 65 72 6e 3b 0a 09  check_pattern;..
1ef90 44 57 4f 52 44 20 70 63 73 63 5f 72 65 61 64 65  DWORD pcsc_reade
1efa0 72 73 5f 6c 65 6e 3b 0a 09 4c 4f 4e 47 20 73 63  rs_len;..LONG sc
1efb0 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f  ard_listreaders_
1efc0 72 65 74 3b 0a 09 73 69 7a 65 5f 74 20 63 75 72  ret;..size_t cur
1efd0 72 5f 72 65 61 64 65 72 5f 6c 65 6e 3b 0a 09 69  r_reader_len;..i
1efe0 6e 74 20 73 6c 6f 74 5f 72 65 73 65 74 3b 0a 09  nt slot_reset;..
1eff0 69 6e 74 20 69 6e 63 6c 75 64 65 5f 72 65 61 64  int include_read
1f000 65 72 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  er;...CACKEY_DEB
1f010 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
1f020 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70 75 6c 43  d.");...if (pulC
1f030 6f 75 6e 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  ount == NULL) {.
1f040 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1f050 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 75  RINTF("Error. pu
1f060 6c 43 6f 75 6e 74 20 69 73 20 4e 55 4c 4c 2e 22  lCount is NULL."
1f070 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1f080 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b  _ARGUMENTS_BAD);
1f090 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ..}...if (!cacke
1f0a0 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
1f0b0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1f0c0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
1f0d0 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
1f0e0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
1f0f0 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
1f100 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
1f110 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
1f120 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f   cackey_mutex_lo
1f130 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
1f140 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
1f150 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
1f160 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1f170 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63  NTF("Error.  Loc
1f180 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
1f190 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
1f1a0 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
1f1b0 0a 0a 09 2f 2a 20 43 6c 65 61 72 20 6c 69 73 74  .../* Clear list
1f1c0 20 6f 66 20 73 6c 6f 74 73 20 2a 2f 0a 09 73 6c   of slots */..sl
1f1d0 6f 74 5f 72 65 73 65 74 20 3d 20 30 3b 0a 09 69  ot_reset = 0;..i
1f1e0 66 20 28 70 53 6c 6f 74 4c 69 73 74 29 20 7b 0a  f (pSlotList) {.
1f1f0 09 09 69 66 20 28 66 69 72 73 74 5f 63 61 6c 6c  ..if (first_call
1f200 29 20 7b 0a 09 09 09 66 69 72 73 74 5f 63 61 6c  ) {....first_cal
1f210 6c 20 3d 20 30 3b 0a 0a 09 09 09 73 6c 6f 74 5f  l = 0;.....slot_
1f220 72 65 73 65 74 20 3d 20 31 3b 0a 09 09 7d 0a 0a  reset = 1;...}..
1f230 09 09 2f 2a 20 49 66 20 61 6e 79 20 6f 66 20 74  ../* If any of t
1f240 68 65 20 73 6c 6f 74 73 20 68 61 76 65 20 62 65  he slots have be
1f250 65 6e 20 72 65 73 65 74 20 74 68 65 6e 20 70 75  en reset then pu
1f260 72 67 65 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74  rge all informat
1f270 69 6f 6e 20 61 6e 64 20 63 68 65 63 6b 20 61 67  ion and check ag
1f280 61 69 6e 20 2a 2f 0a 09 09 66 6f 72 20 28 63 75  ain */...for (cu
1f290 72 72 73 6c 6f 74 20 3d 20 30 3b 20 63 75 72 72  rrslot = 0; curr
1f2a0 73 6c 6f 74 20 3c 20 28 73 69 7a 65 6f 66 28 63  slot < (sizeof(c
1f2b0 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73  ackey_slots) / s
1f2c0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f  izeof(cackey_slo
1f2d0 74 73 5b 30 5d 29 29 3b 20 63 75 72 72 73 6c 6f  ts[0])); currslo
1f2e0 74 2b 2b 29 20 7b 0a 09 09 09 69 66 20 28 63 61  t++) {....if (ca
1f2f0 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73  ckey_slots[currs
1f300 6c 6f 74 5d 2e 69 6e 74 65 72 6e 61 6c 29 20 7b  lot].internal) {
1f310 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09  .....continue;..
1f320 09 09 7d 0a 0a 09 09 09 69 66 20 28 21 63 61 63  ..}.....if (!cac
1f330 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c  key_slots[currsl
1f340 6f 74 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09  ot].active) {...
1f350 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 7d  ..continue;....}
1f360 0a 0a 09 09 09 69 66 20 28 63 61 63 6b 65 79 5f  .....if (cackey_
1f370 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e  slots[currslot].
1f380 73 6c 6f 74 5f 72 65 73 65 74 29 20 7b 0a 09 09  slot_reset) {...
1f390 09 09 73 6c 6f 74 5f 72 65 73 65 74 20 3d 20 31  ..slot_reset = 1
1f3a0 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  ;......break;...
1f3b0 09 7d 0a 09 09 7d 0a 0a 09 09 69 66 20 28 73 6c  .}...}....if (sl
1f3c0 6f 74 5f 72 65 73 65 74 29 20 7b 0a 09 09 09 43  ot_reset) {....C
1f3d0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1f3e0 54 46 28 22 50 75 72 67 69 6e 67 20 61 6c 6c 20  TF("Purging all 
1f3f0 73 6c 6f 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  slot information
1f400 2e 22 29 3b 0a 0a 09 09 09 2f 2a 20 4f 6e 6c 79  .");...../* Only
1f410 20 75 70 64 61 74 65 20 74 68 65 20 6c 69 73 74   update the list
1f420 20 6f 66 20 73 6c 6f 74 73 20 69 66 20 77 65 20   of slots if we 
1f430 61 72 65 20 61 63 74 75 61 6c 6c 79 20 62 65 69  are actually bei
1f440 6e 67 20 73 75 70 70 6c 79 20 74 68 65 20 73 6c  ng supply the sl
1f450 6f 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a  ot information *
1f460 2f 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  /....cackey_slot
1f470 73 5f 64 69 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c  s_disconnect_all
1f480 28 29 3b 0a 0a 09 09 09 66 6f 72 20 28 63 75 72  ();.....for (cur
1f490 72 73 6c 6f 74 20 3d 20 30 3b 20 63 75 72 72 73  rslot = 0; currs
1f4a0 6c 6f 74 20 3c 20 28 73 69 7a 65 6f 66 28 63 61  lot < (sizeof(ca
1f4b0 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69  ckey_slots) / si
1f4c0 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
1f4d0 73 5b 30 5d 29 29 3b 20 63 75 72 72 73 6c 6f 74  s[0])); currslot
1f4e0 2b 2b 29 20 7b 0a 09 09 09 09 69 66 20 28 63 61  ++) {.....if (ca
1f4f0 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73  ckey_slots[currs
1f500 6c 6f 74 5d 2e 69 6e 74 65 72 6e 61 6c 29 20 7b  lot].internal) {
1f510 0a 09 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a  ......continue;.
1f520 09 09 09 09 7d 0a 0a 09 09 09 09 69 66 20 28 63  ....}......if (c
1f530 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72  ackey_slots[curr
1f540 73 6c 6f 74 5d 2e 70 63 73 63 5f 72 65 61 64 65  slot].pcsc_reade
1f550 72 29 20 7b 0a 09 09 09 09 09 66 72 65 65 28 63  r) {......free(c
1f560 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72  ackey_slots[curr
1f570 73 6c 6f 74 5d 2e 70 63 73 63 5f 72 65 61 64 65  slot].pcsc_reade
1f580 72 29 3b 0a 0a 09 09 09 09 09 63 61 63 6b 65 79  r);.......cackey
1f590 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d  _slots[currslot]
1f5a0 2e 70 63 73 63 5f 72 65 61 64 65 72 20 3d 20 4e  .pcsc_reader = N
1f5b0 55 4c 4c 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09  ULL;.....}......
1f5c0 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  if (cackey_slots
1f5d0 5b 63 75 72 72 73 6c 6f 74 5d 2e 6c 61 62 65 6c  [currslot].label
1f5e0 29 20 7b 0a 09 09 09 09 09 66 72 65 65 28 63 61  ) {......free(ca
1f5f0 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73  ckey_slots[currs
1f600 6c 6f 74 5d 2e 6c 61 62 65 6c 29 3b 0a 0a 09 09  lot].label);....
1f610 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ...cackey_slots[
1f620 63 75 72 72 73 6c 6f 74 5d 2e 6c 61 62 65 6c 20  currslot].label 
1f630 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 7d 0a 0a 09  = NULL;.....}...
1f640 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ...cackey_slots[
1f650 63 75 72 72 73 6c 6f 74 5d 2e 61 63 74 69 76 65  currslot].active
1f660 20 3d 20 30 3b 0a 09 09 09 7d 0a 09 09 7d 20 65   = 0;....}...} e
1f670 6c 73 65 20 7b 0a 09 09 09 0a 09 09 7d 0a 09 7d  lse {.......}..}
1f680 0a 0a 09 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20  .../* Determine 
1f690 6c 69 73 74 20 6f 66 20 72 65 61 64 65 72 73 20  list of readers 
1f6a0 2a 2f 0a 09 70 63 73 63 5f 63 6f 6e 6e 65 63 74  */..pcsc_connect
1f6b0 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 70 63  _ret = cackey_pc
1f6c0 73 63 5f 63 6f 6e 6e 65 63 74 28 29 3b 0a 2f 2a  sc_connect();./*
1f6d0 20 58 58 58 3a 20 43 41 4e 20 48 41 4e 47 20 48   XXX: CAN HANG H
1f6e0 45 52 45 20 21 20 2a 2f 0a 09 69 66 20 28 70 63  ERE ! */..if (pc
1f6f0 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 20 21  sc_connect_ret !
1f700 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  = CACKEY_PCSC_S_
1f710 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  OK) {...CACKEY_D
1f720 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 6f 6e  EBUG_PRINTF("Con
1f730 6e 65 63 74 69 6f 6e 20 74 6f 20 50 43 2f 53 43  nection to PC/SC
1f740 20 66 61 69 6c 65 64 2c 20 61 73 73 75 6d 69 6e   failed, assumin
1f750 67 20 6e 6f 20 73 6c 6f 74 73 22 29 3b 0a 0a 09  g no slots");...
1f760 09 73 6c 6f 74 5f 63 6f 75 6e 74 20 3d 20 30 3b  .slot_count = 0;
1f770 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 70 63 73  ..} else {...pcs
1f780 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e 20 3d 20  c_readers_len = 
1f790 30 3b 0a 0a 09 09 73 63 61 72 64 5f 6c 69 73 74  0;....scard_list
1f7a0 72 65 61 64 65 72 73 5f 72 65 74 20 3d 20 53 43  readers_ret = SC
1f7b0 61 72 64 4c 69 73 74 52 65 61 64 65 72 73 28 2a  ardListReaders(*
1f7c0 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64  cackey_pcsc_hand
1f7d0 6c 65 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20  le, NULL, NULL, 
1f7e0 26 70 63 73 63 5f 72 65 61 64 65 72 73 5f 6c 65  &pcsc_readers_le
1f7f0 6e 29 3b 0a 0a 09 09 69 66 20 28 73 63 61 72 64  n);....if (scard
1f800 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65 74  _listreaders_ret
1f810 20 3d 3d 20 53 43 41 52 44 5f 46 5f 43 4f 4d 4d   == SCARD_F_COMM
1f820 5f 45 52 52 4f 52 29 20 7b 0a 09 09 09 43 41 43  _ERROR) {....CAC
1f830 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1f840 28 22 45 72 72 6f 72 2e 20 53 43 61 72 64 4c 69  ("Error. SCardLi
1f850 73 74 52 65 61 64 65 72 73 28 29 20 72 65 74 75  stReaders() retu
1f860 72 6e 65 64 20 53 43 41 52 44 5f 46 5f 43 4f 4d  rned SCARD_F_COM
1f870 4d 5f 45 52 52 4f 52 2c 20 61 73 73 75 6d 69 6e  M_ERROR, assumin
1f880 67 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  g Connection to 
1f890 50 43 2f 53 43 20 77 65 6e 74 20 61 77 61 79 2e  PC/SC went away.
1f8a0 20 52 65 63 6f 6e 6e 65 63 74 69 6e 67 2e 22 29   Reconnecting.")
1f8b0 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 70 63 73  ;.....cackey_pcs
1f8c0 63 5f 64 69 73 63 6f 6e 6e 65 63 74 28 29 3b 0a  c_disconnect();.
1f8d0 09 09 09 63 61 63 6b 65 79 5f 70 63 73 63 5f 63  ...cackey_pcsc_c
1f8e0 6f 6e 6e 65 63 74 28 29 3b 0a 0a 09 09 09 43 41  onnect();.....CA
1f8f0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1f900 46 28 22 54 72 79 69 6e 67 20 53 43 61 72 64 4c  F("Trying SCardL
1f910 69 73 74 52 65 61 64 65 72 73 28 29 20 61 67 61  istReaders() aga
1f920 69 6e 22 29 3b 0a 09 09 09 73 63 61 72 64 5f 6c  in");....scard_l
1f930 69 73 74 72 65 61 64 65 72 73 5f 72 65 74 20 3d  istreaders_ret =
1f940 20 53 43 61 72 64 4c 69 73 74 52 65 61 64 65 72   SCardListReader
1f950 73 28 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f 68  s(*cackey_pcsc_h
1f960 61 6e 64 6c 65 2c 20 4e 55 4c 4c 2c 20 4e 55 4c  andle, NULL, NUL
1f970 4c 2c 20 26 70 63 73 63 5f 72 65 61 64 65 72 73  L, &pcsc_readers
1f980 5f 6c 65 6e 29 3b 0a 09 09 7d 0a 0a 09 09 69 66  _len);...}....if
1f990 20 28 73 63 61 72 64 5f 6c 69 73 74 72 65 61 64   (scard_listread
1f9a0 65 72 73 5f 72 65 74 20 3d 3d 20 53 43 41 52 44  ers_ret == SCARD
1f9b0 5f 53 5f 53 55 43 43 45 53 53 20 26 26 20 70 63  _S_SUCCESS && pc
1f9c0 73 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e 20 21  sc_readers_len !
1f9d0 3d 20 30 29 20 7b 0a 09 09 09 70 63 73 63 5f 72  = 0) {....pcsc_r
1f9e0 65 61 64 65 72 73 20 3d 20 6d 61 6c 6c 6f 63 28  eaders = malloc(
1f9f0 70 63 73 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e  pcsc_readers_len
1fa00 29 3b 0a 09 09 09 70 63 73 63 5f 72 65 61 64 65  );....pcsc_reade
1fa10 72 73 5f 73 20 3d 20 70 63 73 63 5f 72 65 61 64  rs_s = pcsc_read
1fa20 65 72 73 3b 0a 0a 09 09 09 73 63 61 72 64 5f 6c  ers;.....scard_l
1fa30 69 73 74 72 65 61 64 65 72 73 5f 72 65 74 20 3d  istreaders_ret =
1fa40 20 53 43 61 72 64 4c 69 73 74 52 65 61 64 65 72   SCardListReader
1fa50 73 28 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f 68  s(*cackey_pcsc_h
1fa60 61 6e 64 6c 65 2c 20 4e 55 4c 4c 2c 20 70 63 73  andle, NULL, pcs
1fa70 63 5f 72 65 61 64 65 72 73 2c 20 26 70 63 73 63  c_readers, &pcsc
1fa80 5f 72 65 61 64 65 72 73 5f 6c 65 6e 29 3b 0a 09  _readers_len);..
1fa90 09 09 69 66 20 28 73 63 61 72 64 5f 6c 69 73 74  ..if (scard_list
1faa0 72 65 61 64 65 72 73 5f 72 65 74 20 3d 3d 20 53  readers_ret == S
1fab0 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20  CARD_S_SUCCESS) 
1fac0 7b 0a 09 09 09 09 70 63 73 63 5f 72 65 61 64 65  {.....pcsc_reade
1fad0 72 73 5f 65 20 3d 20 70 63 73 63 5f 72 65 61 64  rs_e = pcsc_read
1fae0 65 72 73 20 2b 20 70 63 73 63 5f 72 65 61 64 65  ers + pcsc_reade
1faf0 72 73 5f 6c 65 6e 3b 0a 0a 09 09 09 09 2f 2a 20  rs_len;....../* 
1fb00 53 74 61 72 74 20 77 69 74 68 20 53 6c 6f 74 20  Start with Slot 
1fb10 49 44 20 31 2c 20 74 6f 20 61 76 6f 69 64 20 61  ID 1, to avoid a
1fb20 20 62 75 67 20 69 6e 20 47 44 4d 20 6f 6e 20 52   bug in GDM on R
1fb30 48 45 4c 20 2a 2f 0a 09 09 09 09 2f 2a 20 42 75  HEL */...../* Bu
1fb40 67 20 35 39 34 39 31 31 3a 20 68 74 74 70 73 3a  g 594911: https:
1fb50 2f 2f 62 75 67 7a 69 6c 6c 61 2e 72 65 64 68 61  //bugzilla.redha
1fb60 74 2e 63 6f 6d 2f 73 68 6f 77 5f 62 75 67 2e 63  t.com/show_bug.c
1fb70 67 69 3f 69 64 3d 35 39 34 39 31 31 20 2a 2f 0a  gi?id=594911 */.
1fb80 09 09 09 09 63 75 72 72 73 6c 6f 74 20 3d 20 31  ....currslot = 1
1fb90 3b 0a 09 09 09 09 73 6c 6f 74 5f 63 6f 75 6e 74  ;.....slot_count
1fba0 20 3d 20 30 3b 0a 09 09 09 09 77 68 69 6c 65 20   = 0;.....while 
1fbb0 28 70 63 73 63 5f 72 65 61 64 65 72 73 20 3c 20  (pcsc_readers < 
1fbc0 70 63 73 63 5f 72 65 61 64 65 72 73 5f 65 29 20  pcsc_readers_e) 
1fbd0 7b 0a 09 09 09 09 09 2f 2a 20 46 69 6e 64 20 6e  {....../* Find n
1fbe0 65 78 74 20 61 76 61 69 6c 61 62 6c 65 20 73 6c  ext available sl
1fbf0 6f 74 20 2a 2f 0a 09 09 09 09 09 66 6f 72 20 28  ot */......for (
1fc00 3b 20 63 75 72 72 73 6c 6f 74 20 3c 20 28 73 69  ; currslot < (si
1fc10 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
1fc20 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
1fc30 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b 20 63  ey_slots[0])); c
1fc40 75 72 72 73 6c 6f 74 2b 2b 29 20 7b 0a 09 09 09  urrslot++) {....
1fc50 09 09 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73  ...if (!cackey_s
1fc60 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 61  lots[currslot].a
1fc70 63 74 69 76 65 29 20 7b 0a 09 09 09 09 09 09 09  ctive) {........
1fc80 62 72 65 61 6b 3b 0a 09 09 09 09 09 09 7d 0a 09  break;.......}..
1fc90 09 09 09 09 7d 0a 0a 09 09 09 09 09 63 75 72 72  ....}.......curr
1fca0 5f 72 65 61 64 65 72 5f 6c 65 6e 20 3d 20 73 74  _reader_len = st
1fcb0 72 6c 65 6e 28 70 63 73 63 5f 72 65 61 64 65 72  rlen(pcsc_reader
1fcc0 73 29 3b 0a 0a 09 09 09 09 09 69 66 20 28 28 70  s);.......if ((p
1fcd0 63 73 63 5f 72 65 61 64 65 72 73 20 2b 20 63 75  csc_readers + cu
1fce0 72 72 5f 72 65 61 64 65 72 5f 6c 65 6e 29 20 3e  rr_reader_len) >
1fcf0 20 70 63 73 63 5f 72 65 61 64 65 72 73 5f 65 29   pcsc_readers_e)
1fd00 20 7b 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a   {.......break;.
1fd10 09 09 09 09 09 7d 0a 0a 09 09 09 09 09 69 66 20  .....}.......if 
1fd20 28 63 75 72 72 5f 72 65 61 64 65 72 5f 6c 65 6e  (curr_reader_len
1fd30 20 3d 3d 20 30 29 20 7b 0a 09 09 09 09 09 09 62   == 0) {.......b
1fd40 72 65 61 6b 3b 0a 09 09 09 09 09 7d 0a 0a 09 09  reak;......}....
1fd50 09 09 09 69 66 20 28 63 75 72 72 73 6c 6f 74 20  ...if (currslot 
1fd60 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65  >= (sizeof(cacke
1fd70 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f  y_slots) / sizeo
1fd80 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30  f(cackey_slots[0
1fd90 5d 29 29 29 20 7b 0a 09 09 09 09 09 09 43 41 43  ]))) {.......CAC
1fda0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1fdb0 28 22 46 6f 75 6e 64 20 6d 6f 72 65 20 72 65 61  ("Found more rea
1fdc0 64 65 72 73 20 74 68 61 6e 20 73 6c 6f 74 73 20  ders than slots 
1fdd0 61 72 65 20 61 76 61 69 6c 61 62 6c 65 21 22 29  are available!")
1fde0 3b 0a 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a  ;........break;.
1fdf0 09 09 09 09 09 7d 0a 0a 09 09 09 09 09 43 41 43  .....}.......CAC
1fe00 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1fe10 28 22 46 6f 75 6e 64 20 72 65 61 64 65 72 3a 20  ("Found reader: 
1fe20 25 73 20 28 63 75 72 72 73 6c 6f 74 20 3d 20 25  %s (currslot = %
1fe30 6c 75 29 22 2c 20 70 63 73 63 5f 72 65 61 64 65  lu)", pcsc_reade
1fe40 72 73 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  rs, (unsigned lo
1fe50 6e 67 29 20 63 75 72 72 73 6c 6f 74 29 3b 0a 0a  ng) currslot);..
1fe60 09 09 09 09 09 69 66 20 28 63 61 63 6b 65 79 5f  .....if (cackey_
1fe70 72 65 61 64 65 72 73 5f 69 6e 63 6c 75 64 65 5f  readers_include_
1fe80 6f 6e 6c 79 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  only != NULL) {.
1fe90 09 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
1fea0 55 47 5f 50 52 49 4e 54 46 28 22 41 73 6b 65 64  UG_PRINTF("Asked
1feb0 20 74 6f 20 69 6e 63 6c 75 64 65 20 6f 6e 6c 79   to include only
1fec0 20 72 65 61 64 65 72 73 20 6d 61 74 63 68 69 6e   readers matchin
1fed0 67 3a 20 25 73 22 2c 20 63 61 63 6b 65 79 5f 72  g: %s", cackey_r
1fee0 65 61 64 65 72 73 5f 69 6e 63 6c 75 64 65 5f 6f  eaders_include_o
1fef0 6e 6c 79 29 3b 0a 0a 09 09 09 09 09 09 69 6e 63  nly);........inc
1ff00 6c 75 64 65 5f 72 65 61 64 65 72 20 3d 20 30 3b  lude_reader = 0;
1ff10 0a 09 09 09 09 09 09 72 65 61 64 65 72 5f 63 68  .......reader_ch
1ff20 65 63 6b 5f 70 61 74 74 65 72 6e 20 3d 20 63 61  eck_pattern = ca
1ff30 63 6b 65 79 5f 72 65 61 64 65 72 73 5f 69 6e 63  ckey_readers_inc
1ff40 6c 75 64 65 5f 6f 6e 6c 79 3b 0a 09 09 09 09 09  lude_only;......
1ff50 7d 20 65 6c 73 65 20 69 66 20 28 63 61 63 6b 65  } else if (cacke
1ff60 79 5f 72 65 61 64 65 72 73 5f 65 78 63 6c 75 64  y_readers_exclud
1ff70 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09  e != NULL) {....
1ff80 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1ff90 50 52 49 4e 54 46 28 22 41 73 6b 65 64 20 74 6f  PRINTF("Asked to
1ffa0 20 65 78 63 6c 75 64 65 20 72 65 61 64 65 72 73   exclude readers
1ffb0 20 6d 61 74 63 68 69 6e 67 3a 20 25 73 22 2c 20   matching: %s", 
1ffc0 63 61 63 6b 65 79 5f 72 65 61 64 65 72 73 5f 65  cackey_readers_e
1ffd0 78 63 6c 75 64 65 29 3b 0a 0a 09 09 09 09 09 09  xclude);........
1ffe0 69 6e 63 6c 75 64 65 5f 72 65 61 64 65 72 20 3d  include_reader =
1fff0 20 31 3b 0a 09 09 09 09 09 09 72 65 61 64 65 72   1;.......reader
20000 5f 63 68 65 63 6b 5f 70 61 74 74 65 72 6e 20 3d  _check_pattern =
20010 20 63 61 63 6b 65 79 5f 72 65 61 64 65 72 73 5f   cackey_readers_
20020 65 78 63 6c 75 64 65 3b 0a 09 09 09 09 09 7d 20  exclude;......} 
20030 65 6c 73 65 20 7b 0a 09 09 09 09 09 09 69 6e 63  else {.......inc
20040 6c 75 64 65 5f 72 65 61 64 65 72 20 3d 20 31 3b  lude_reader = 1;
20050 0a 09 09 09 09 09 09 72 65 61 64 65 72 5f 63 68  .......reader_ch
20060 65 63 6b 5f 70 61 74 74 65 72 6e 20 3d 20 4e 55  eck_pattern = NU
20070 4c 4c 3b 0a 09 09 09 09 09 7d 0a 0a 09 09 09 09  LL;......}......
20080 09 69 66 20 28 72 65 61 64 65 72 5f 63 68 65 63  .if (reader_chec
20090 6b 5f 70 61 74 74 65 72 6e 20 21 3d 20 4e 55 4c  k_pattern != NUL
200a0 4c 29 20 7b 0a 09 09 09 09 09 09 69 66 20 28 73  L) {.......if (s
200b0 74 72 73 74 72 28 70 63 73 63 5f 72 65 61 64 65  trstr(pcsc_reade
200c0 72 73 2c 20 72 65 61 64 65 72 5f 63 68 65 63 6b  rs, reader_check
200d0 5f 70 61 74 74 65 72 6e 29 20 21 3d 20 4e 55 4c  _pattern) != NUL
200e0 4c 29 20 7b 0a 09 09 09 09 09 09 09 43 41 43 4b  L) {........CACK
200f0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
20100 22 54 68 69 73 20 72 65 61 64 65 72 20 6d 61 74  "This reader mat
20110 63 68 65 64 20 74 68 65 20 70 61 74 74 65 72 6e  ched the pattern
20120 2e 22 29 3b 0a 09 09 09 09 09 09 0a 09 09 09 09  .");............
20130 09 09 09 69 6e 63 6c 75 64 65 5f 72 65 61 64 65  ...include_reade
20140 72 20 3d 20 21 69 6e 63 6c 75 64 65 5f 72 65 61  r = !include_rea
20150 64 65 72 3b 0a 09 09 09 09 09 09 7d 0a 09 09 09  der;.......}....
20160 09 09 7d 0a 0a 09 09 09 09 09 69 66 20 28 69 6e  ..}.......if (in
20170 63 6c 75 64 65 5f 72 65 61 64 65 72 20 21 3d 20  clude_reader != 
20180 31 29 20 7b 0a 09 09 09 09 09 09 43 41 43 4b 45  1) {.......CACKE
20190 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
201a0 53 6b 69 70 70 69 6e 67 20 74 68 69 73 20 72 65  Skipping this re
201b0 61 64 65 72 2e 22 29 3b 0a 0a 09 09 09 09 09 09  ader.");........
201c0 70 63 73 63 5f 72 65 61 64 65 72 73 20 2b 3d 20  pcsc_readers += 
201d0 63 75 72 72 5f 72 65 61 64 65 72 5f 6c 65 6e 20  curr_reader_len 
201e0 2b 20 31 3b 0a 0a 09 09 09 09 09 09 63 6f 6e 74  + 1;........cont
201f0 69 6e 75 65 3b 0a 09 09 09 09 09 7d 0a 0a 09 09  inue;......}....
20200 09 09 09 2f 2a 20 4f 6e 6c 79 20 75 70 64 61 74  .../* Only updat
20210 65 20 74 68 65 20 6c 69 73 74 20 6f 66 20 73 6c  e the list of sl
20220 6f 74 73 20 69 66 20 77 65 20 61 72 65 20 61 63  ots if we are ac
20230 74 75 61 6c 6c 79 20 62 65 69 6e 67 20 61 73 6b  tually being ask
20240 65 64 20 73 75 70 70 6c 79 20 74 68 65 20 73 6c  ed supply the sl
20250 6f 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a  ot information *
20260 2f 0a 09 09 09 09 09 69 66 20 28 70 53 6c 6f 74  /......if (pSlot
20270 4c 69 73 74 29 20 7b 0a 09 09 09 09 09 09 69 66  List) {.......if
20280 20 28 73 6c 6f 74 5f 72 65 73 65 74 29 20 7b 0a   (slot_reset) {.
20290 09 09 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c  .......cackey_sl
202a0 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 61 63  ots[currslot].ac
202b0 74 69 76 65 20 3d 20 31 3b 0a 09 09 09 09 09 09  tive = 1;.......
202c0 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75  .cackey_slots[cu
202d0 72 72 73 6c 6f 74 5d 2e 69 6e 74 65 72 6e 61 6c  rrslot].internal
202e0 20 3d 20 30 3b 0a 09 09 09 09 09 09 09 63 61 63   = 0;........cac
202f0 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c  key_slots[currsl
20300 6f 74 5d 2e 70 63 73 63 5f 72 65 61 64 65 72 20  ot].pcsc_reader 
20310 3d 20 73 74 72 64 75 70 28 70 63 73 63 5f 72 65  = strdup(pcsc_re
20320 61 64 65 72 73 29 3b 0a 09 09 09 09 09 09 09 63  aders);........c
20330 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72  ackey_slots[curr
20340 73 6c 6f 74 5d 2e 70 63 73 63 5f 63 61 72 64 5f  slot].pcsc_card_
20350 63 6f 6e 6e 65 63 74 65 64 20 3d 20 30 3b 0a 09  connected = 0;..
20360 09 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f  ......cackey_slo
20370 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 74 72 61  ts[currslot].tra
20380 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d  nsaction_depth =
20390 20 30 3b 0a 09 09 09 09 09 09 09 63 61 63 6b 65   0;........cacke
203a0 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74  y_slots[currslot
203b0 5d 2e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 6e 65  ].transaction_ne
203c0 65 64 5f 68 77 5f 6c 6f 63 6b 20 3d 20 30 3b 0a  ed_hw_lock = 0;.
203d0 09 09 09 09 09 09 09 69 66 20 28 63 61 63 6b 65  .......if (cacke
203e0 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20 3d 3d  y_pin_command ==
203f0 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 09 09 09   NULL) {........
20400 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75  .cackey_slots[cu
20410 72 72 73 6c 6f 74 5d 2e 74 6f 6b 65 6e 5f 66 6c  rrslot].token_fl
20420 61 67 73 20 3d 20 43 4b 46 5f 4c 4f 47 49 4e 5f  ags = CKF_LOGIN_
20430 52 45 51 55 49 52 45 44 3b 0a 09 09 09 09 09 09  REQUIRED;.......
20440 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09  .} else {.......
20450 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63  ..cackey_slots[c
20460 75 72 72 73 6c 6f 74 5d 2e 74 6f 6b 65 6e 5f 66  urrslot].token_f
20470 6c 61 67 73 20 3d 20 30 3b 0a 09 09 09 09 09 09  lags = 0;.......
20480 09 7d 0a 09 09 09 09 09 09 09 63 61 63 6b 65 79  .}........cackey
20490 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d  _slots[currslot]
204a0 2e 6c 61 62 65 6c 20 3d 20 4e 55 4c 4c 3b 0a 0a  .label = NULL;..
204b0 09 09 09 09 09 09 09 63 61 63 6b 65 79 5f 6d 61  .......cackey_ma
204c0 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74 28 26 63  rk_slot_reset(&c
204d0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72  ackey_slots[curr
204e0 73 6c 6f 74 5d 29 3b 0a 09 09 09 09 09 09 7d 0a  slot]);.......}.
204f0 09 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  .....} else {...
20500 09 09 09 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ....if (!cackey_
20510 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e  slots[currslot].
20520 61 63 74 69 76 65 29 20 7b 0a 09 09 09 09 09 09  active) {.......
20530 09 2f 2a 20 41 72 74 69 66 69 63 69 61 6c 6c 79  ./* Artificially
20540 20 69 6e 63 72 65 61 73 65 20 74 68 65 20 6e 75   increase the nu
20550 6d 62 65 72 20 6f 66 20 61 63 74 69 76 65 20 73  mber of active s
20560 6c 6f 74 73 20 62 79 20 77 68 61 74 20 77 69 6c  lots by what wil
20570 6c 20 62 65 63 6f 6d 65 20 61 63 74 69 76 65 20  l become active 
20580 2a 2f 0a 09 09 09 09 09 09 09 43 41 43 4b 45 59  */........CACKEY
20590 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46  _DEBUG_PRINTF("F
205a0 6f 75 6e 64 20 69 6e 2d 61 63 74 69 76 65 20 73  ound in-active s
205b0 6c 6f 74 20 25 6c 75 2c 20 62 75 74 20 69 74 20  lot %lu, but it 
205c0 77 69 6c 6c 20 62 65 20 61 63 74 69 76 65 20 61  will be active a
205d0 66 74 65 72 20 61 20 72 65 73 65 74 20 2d 2d 20  fter a reset -- 
205e0 6d 61 72 6b 69 6e 67 20 61 73 20 61 63 74 69 76  marking as activ
205f0 65 20 66 6f 72 20 61 63 63 6f 75 6e 74 69 6e 67  e for accounting
20600 20 70 75 72 70 6f 73 65 73 22 2c 20 28 75 6e 73   purposes", (uns
20610 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72  igned long) curr
20620 73 6c 6f 74 29 3b 0a 0a 09 09 09 09 09 09 09 73  slot);.........s
20630 6c 6f 74 5f 63 6f 75 6e 74 2b 2b 3b 0a 09 09 09  lot_count++;....
20640 09 09 09 7d 0a 09 09 09 09 09 7d 0a 09 09 09 09  ...}......}.....
20650 09 63 75 72 72 73 6c 6f 74 2b 2b 3b 0a 0a 09 09  .currslot++;....
20660 09 09 09 70 63 73 63 5f 72 65 61 64 65 72 73 20  ...pcsc_readers 
20670 2b 3d 20 63 75 72 72 5f 72 65 61 64 65 72 5f 6c  += curr_reader_l
20680 65 6e 20 2b 20 31 3b 0a 09 09 09 09 7d 0a 0a 09  en + 1;.....}...
20690 09 09 09 66 6f 72 20 28 63 75 72 72 73 6c 6f 74  ...for (currslot
206a0 20 3d 20 30 3b 20 63 75 72 72 73 6c 6f 74 20 3c   = 0; currslot <
206b0 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
206c0 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28  slots) / sizeof(
206d0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29  cackey_slots[0])
206e0 29 3b 20 63 75 72 72 73 6c 6f 74 2b 2b 29 20 7b  ); currslot++) {
206f0 0a 09 09 09 09 09 69 66 20 28 63 61 63 6b 65 79  ......if (cackey
20700 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d  _slots[currslot]
20710 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 09 09 09  .active) {......
20720 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
20730 49 4e 54 46 28 22 46 6f 75 6e 64 20 61 63 74 69  INTF("Found acti
20740 76 65 20 73 6c 6f 74 20 25 6c 75 2c 20 72 65 61  ve slot %lu, rea
20750 64 65 72 20 3d 20 25 73 22 2c 20 28 75 6e 73 69  der = %s", (unsi
20760 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 73  gned long) currs
20770 6c 6f 74 2c 20 63 61 63 6b 65 79 5f 73 6c 6f 74  lot, cackey_slot
20780 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 70 63 73 63  s[currslot].pcsc
20790 5f 72 65 61 64 65 72 29 3b 0a 0a 09 09 09 09 09  _reader);.......
207a0 09 73 6c 6f 74 5f 63 6f 75 6e 74 2b 2b 3b 0a 09  .slot_count++;..
207b0 09 09 09 09 7d 0a 09 09 09 09 7d 0a 09 09 09 7d  ....}.....}....}
207c0 20 65 6c 73 65 20 7b 0a 09 09 09 09 43 41 43 4b   else {.....CACK
207d0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
207e0 22 53 65 63 6f 6e 64 20 63 61 6c 6c 20 74 6f 20  "Second call to 
207f0 53 43 61 72 64 4c 69 73 74 52 65 61 64 65 72 73  SCardListReaders
20800 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 20   failed, return 
20810 25 73 2f 25 6c 69 22 2c 20 43 41 43 4b 45 59 5f  %s/%li", CACKEY_
20820 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44  DEBUG_FUNC_SCARD
20830 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64  ERR_TO_STR(scard
20840 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65 74  _listreaders_ret
20850 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72 64 5f  ), (long) scard_
20860 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65 74 29  listreaders_ret)
20870 3b 0a 09 09 09 7d 0a 0a 09 09 09 66 72 65 65 28  ;....}.....free(
20880 70 63 73 63 5f 72 65 61 64 65 72 73 5f 73 29 3b  pcsc_readers_s);
20890 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 43  ...} else {....C
208a0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
208b0 54 46 28 22 46 69 72 73 74 20 63 61 6c 6c 20 74  TF("First call t
208c0 6f 20 53 43 61 72 64 4c 69 73 74 52 65 61 64 65  o SCardListReade
208d0 72 73 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72  rs failed, retur
208e0 6e 20 25 73 2f 25 6c 69 22 2c 20 43 41 43 4b 45  n %s/%li", CACKE
208f0 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41  Y_DEBUG_FUNC_SCA
20900 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61  RDERR_TO_STR(sca
20910 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72  rd_listreaders_r
20920 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72  et), (long) scar
20930 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65  d_listreaders_re
20940 74 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 6d 75 74  t);...}..}...mut
20950 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
20960 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
20970 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
20980 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
20990 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
209a0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
209b0 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b  ("Error.  Unlock
209c0 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
209d0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
209e0 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
209f0 0a 09 69 66 20 28 70 53 6c 6f 74 4c 69 73 74 20  ..if (pSlotList 
20a00 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 2a 70 75  == NULL) {...*pu
20a10 6c 43 6f 75 6e 74 20 3d 20 73 6c 6f 74 5f 63 6f  lCount = slot_co
20a20 75 6e 74 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  unt;....CACKEY_D
20a30 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
20a40 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25  urning CKR_OK (%
20a50 69 29 2e 20 20 46 6f 75 6e 64 20 25 6c 75 20 72  i).  Found %lu r
20a60 65 61 64 65 72 73 2c 20 62 75 74 20 6e 6f 74 20  eaders, but not 
20a70 73 74 6f 72 69 6e 67 20 49 44 73 20 28 70 53 6c  storing IDs (pSl
20a80 6f 74 4c 69 73 74 20 3d 3d 20 4e 55 4c 4c 29 22  otList == NULL)"
20a90 2c 20 43 4b 52 5f 4f 4b 2c 20 28 75 6e 73 69 67  , CKR_OK, (unsig
20aa0 6e 65 64 20 6c 6f 6e 67 29 20 73 6c 6f 74 5f 63  ned long) slot_c
20ab0 6f 75 6e 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ount);....return
20ac0 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 63  (CKR_OK);..}...c
20ad0 6f 75 6e 74 20 3d 20 2a 70 75 6c 43 6f 75 6e 74  ount = *pulCount
20ae0 3b 0a 09 69 66 20 28 63 6f 75 6e 74 20 3c 20 73  ;..if (count < s
20af0 6c 6f 74 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 43  lot_count) {...C
20b00 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
20b10 54 46 28 22 45 72 72 6f 72 2e 20 55 73 65 72 20  TF("Error. User 
20b20 61 6c 6c 6f 63 61 74 65 64 20 25 6c 75 20 65 6e  allocated %lu en
20b30 74 72 69 65 73 2c 20 62 75 74 20 77 65 20 68 61  tries, but we ha
20b40 76 65 20 25 6c 75 20 65 6e 74 72 69 65 73 2e 22  ve %lu entries."
20b50 2c 20 63 6f 75 6e 74 2c 20 73 6c 6f 74 5f 63 6f  , count, slot_co
20b60 75 6e 74 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f  unt);....CACKEY_
20b70 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
20b80 74 75 72 6e 69 6e 67 20 43 4b 52 5f 42 55 46 46  turning CKR_BUFF
20b90 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 22 29 3b 0a  ER_TOO_SMALL");.
20ba0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 42 55  ...return(CKR_BU
20bb0 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 3b  FFER_TOO_SMALL);
20bc0 09 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74  ...}...mutex_ret
20bd0 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
20be0 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  ex_lock(cackey_b
20bf0 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
20c00 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
20c10 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
20c20 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
20c30 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64    Locking failed
20c40 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
20c50 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
20c60 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 5f 69 64 78  );..}...slot_idx
20c70 20 3d 20 30 3b 0a 09 66 6f 72 20 28 63 75 72 72   = 0;..for (curr
20c80 73 6c 6f 74 20 3d 20 30 3b 20 28 63 75 72 72 73  slot = 0; (currs
20c90 6c 6f 74 20 3c 20 28 73 69 7a 65 6f 66 28 63 61  lot < (sizeof(ca
20ca0 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69  ckey_slots) / si
20cb0 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
20cc0 73 5b 30 5d 29 29 29 3b 20 63 75 72 72 73 6c 6f  s[0]))); currslo
20cd0 74 2b 2b 29 20 7b 0a 09 09 69 66 20 28 21 63 61  t++) {...if (!ca
20ce0 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73  ckey_slots[currs
20cf0 6c 6f 74 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09  lot].active) {..
20d00 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 7d 0a  ..continue;...}.
20d10 0a 09 09 69 66 20 28 73 6c 6f 74 5f 69 64 78 20  ...if (slot_idx 
20d20 3e 3d 20 63 6f 75 6e 74 29 20 7b 0a 09 09 09 43  >= count) {....C
20d30 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
20d40 54 46 28 22 45 72 72 6f 72 2e 20 55 73 65 72 20  TF("Error. User 
20d50 61 6c 6c 6f 63 61 74 65 64 20 25 6c 75 20 65 6e  allocated %lu en
20d60 74 72 69 65 73 2c 20 62 75 74 20 77 65 20 6a 75  tries, but we ju
20d70 73 74 20 74 72 69 65 64 20 74 6f 20 77 72 69 74  st tried to writ
20d80 65 20 74 6f 20 74 68 65 20 25 6c 75 20 69 6e 64  e to the %lu ind
20d90 65 78 20 2d 2d 20 69 67 6e 6f 72 69 6e 67 22 2c  ex -- ignoring",
20da0 20 63 6f 75 6e 74 2c 20 73 6c 6f 74 5f 69 64 78   count, slot_idx
20db0 29 3b 0a 0a 09 09 09 63 6f 6e 74 69 6e 75 65 3b  );.....continue;
20dc0 0a 09 09 7d 0a 0a 09 09 70 53 6c 6f 74 4c 69 73  ...}....pSlotLis
20dd0 74 5b 73 6c 6f 74 5f 69 64 78 5d 20 3d 20 63 75  t[slot_idx] = cu
20de0 72 72 73 6c 6f 74 3b 0a 09 09 73 6c 6f 74 5f 69  rrslot;...slot_i
20df0 64 78 2b 2b 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78  dx++;..}...mutex
20e00 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
20e10 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
20e20 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
20e30 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
20e40 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
20e50 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
20e60 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e  Error.  Unlockin
20e70 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
20e80 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
20e90 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
20ea0 2a 70 75 6c 43 6f 75 6e 74 20 3d 20 73 6c 6f 74  *pulCount = slot
20eb0 5f 63 6f 75 6e 74 3b 0a 0a 09 43 41 43 4b 45 59  _count;...CACKEY
20ec0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
20ed0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20  eturning CKR_OK 
20ee0 28 25 69 29 2e 20 20 46 6f 75 6e 64 20 25 6c 75  (%i).  Found %lu
20ef0 20 72 65 61 64 65 72 73 2e 22 2c 20 43 4b 52 5f   readers.", CKR_
20f00 4f 4b 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  OK, (unsigned lo
20f10 6e 67 29 20 73 6c 6f 74 5f 63 6f 75 6e 74 29 3b  ng) slot_count);
20f20 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b  ...return(CKR_OK
20f30 29 3b 0a 0a 09 74 6f 6b 65 6e 50 72 65 73 65 6e  );...tokenPresen
20f40 74 20 3d 20 74 6f 6b 65 6e 50 72 65 73 65 6e 74  t = tokenPresent
20f50 3b 20 2f 2a 20 53 75 70 72 65 73 73 20 75 6e 75  ; /* Supress unu
20f60 73 65 64 20 76 61 72 69 61 62 6c 65 20 77 61 72  sed variable war
20f70 6e 69 6e 67 20 2a 2f 0a 7d 0a 0a 43 4b 5f 44 45  ning */.}..CK_DE
20f80 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
20f90 5f 52 56 2c 20 43 5f 47 65 74 53 6c 6f 74 49 6e  _RV, C_GetSlotIn
20fa0 66 6f 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20 73  fo)(CK_SLOT_ID s
20fb0 6c 6f 74 49 44 2c 20 43 4b 5f 53 4c 4f 54 5f 49  lotID, CK_SLOT_I
20fc0 4e 46 4f 5f 50 54 52 20 70 49 6e 66 6f 29 20 7b  NFO_PTR pInfo) {
20fd0 0a 09 73 74 61 74 69 63 20 43 4b 5f 55 54 46 38  ..static CK_UTF8
20fe0 43 48 41 52 20 73 6c 6f 74 44 65 73 63 72 69 70  CHAR slotDescrip
20ff0 74 69 6f 6e 5b 5d 20 3d 20 22 43 41 43 4b 65 79  tion[] = "CACKey
21000 20 53 6c 6f 74 22 3b 0a 09 69 6e 74 20 6d 75 74   Slot";..int mut
21010 65 78 5f 72 65 74 76 61 6c 3b 0a 09 69 6e 74 20  ex_retval;..int 
21020 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 3b 0a 0a  bytes_to_copy;..
21030 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
21040 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
21050 0a 0a 09 69 66 20 28 70 49 6e 66 6f 20 3d 3d 20  ...if (pInfo == 
21060 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
21070 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
21080 72 72 6f 72 2e 20 70 49 6e 66 6f 20 69 73 20 4e  rror. pInfo is N
21090 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  ULL.");....retur
210a0 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f  n(CKR_ARGUMENTS_
210b0 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21  BAD);..}...if (!
210c0 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
210d0 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
210e0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
210f0 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
21100 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
21110 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
21120 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
21130 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 49  ;..}...if (slotI
21140 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20  D < 0 || slotID 
21150 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65  >= (sizeof(cacke
21160 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f  y_slots) / sizeo
21170 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30  f(cackey_slots[0
21180 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ]))) {...CACKEY_
21190 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
211a0 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f  ror. Invalid slo
211b0 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75  t requested (%lu
211c0 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 76 61  ), outside of va
211d0 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74  lid range", slot
211e0 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  ID);....return(C
211f0 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c  KR_SLOT_ID_INVAL
21200 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f  ID);..}...mutex_
21210 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
21220 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65  mutex_lock(cacke
21230 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
21240 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
21250 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
21260 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
21270 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69  or.  Locking fai
21280 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
21290 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
212a0 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63  ROR);..}...if (c
212b0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
212c0 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 29  ID].active == 0)
212d0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
212e0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
212f0 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65   Invalid slot re
21300 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 73  quested (%lu), s
21310 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c  lot not currentl
21320 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 49  y active", slotI
21330 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75  D);....cackey_mu
21340 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
21350 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72  y_biglock);....r
21360 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49  eturn(CKR_SLOT_I
21370 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  D_INVALID);..}..
21380 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20 3d 20  .pInfo->flags = 
21390 43 4b 46 5f 48 57 5f 53 4c 4f 54 3b 0a 0a 09 69  CKF_HW_SLOT;...i
213a0 66 20 28 21 63 61 63 6b 65 79 5f 73 6c 6f 74 73  f (!cackey_slots
213b0 5b 73 6c 6f 74 49 44 5d 2e 69 6e 74 65 72 6e 61  [slotID].interna
213c0 6c 29 20 7b 0a 09 09 70 49 6e 66 6f 2d 3e 66 6c  l) {...pInfo->fl
213d0 61 67 73 20 7c 3d 20 43 4b 46 5f 52 45 4d 4f 56  ags |= CKF_REMOV
213e0 41 42 4c 45 5f 44 45 56 49 43 45 3b 0a 09 7d 0a  ABLE_DEVICE;..}.
213f0 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 74 6f 6b  ..if (cackey_tok
21400 65 6e 5f 70 72 65 73 65 6e 74 28 26 63 61 63 6b  en_present(&cack
21410 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
21420 29 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43  ) == CACKEY_PCSC
21430 5f 53 5f 54 4f 4b 45 4e 50 52 45 53 45 4e 54 29  _S_TOKENPRESENT)
21440 20 7b 0a 09 09 70 49 6e 66 6f 2d 3e 66 6c 61 67   {...pInfo->flag
21450 73 20 7c 3d 20 43 4b 46 5f 54 4f 4b 45 4e 5f 50  s |= CKF_TOKEN_P
21460 52 45 53 45 4e 54 3b 0a 09 7d 0a 0a 09 62 79 74  RESENT;..}...byt
21470 65 73 5f 74 6f 5f 63 6f 70 79 20 3d 20 73 74 72  es_to_copy = str
21480 6c 65 6e 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  len(cackey_slots
21490 5b 73 6c 6f 74 49 44 5d 2e 70 63 73 63 5f 72 65  [slotID].pcsc_re
214a0 61 64 65 72 29 3b 0a 09 69 66 20 28 73 69 7a 65  ader);..if (size
214b0 6f 66 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61  of(pInfo->manufa
214c0 63 74 75 72 65 72 49 44 29 20 3c 20 62 79 74 65  cturerID) < byte
214d0 73 5f 74 6f 5f 63 6f 70 79 29 20 7b 0a 09 09 62  s_to_copy) {...b
214e0 79 74 65 73 5f 74 6f 5f 63 6f 70 79 20 3d 20 73  ytes_to_copy = s
214f0 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d 61 6e  izeof(pInfo->man
21500 75 66 61 63 74 75 72 65 72 49 44 29 3b 0a 09 7d  ufacturerID);..}
21510 0a 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e  ..memcpy(pInfo->
21520 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 2c 20  manufacturerID, 
21530 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f  cackey_slots[slo
21540 74 49 44 5d 2e 70 63 73 63 5f 72 65 61 64 65 72  tID].pcsc_reader
21550 2c 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 29  , bytes_to_copy)
21560 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  ;...mutex_retval
21570 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
21580 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
21590 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
215a0 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
215b0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
215c0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
215d0 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65   Unlocking faile
215e0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
215f0 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
21600 52 29 3b 0a 09 7d 0a 0a 09 6d 65 6d 73 65 74 28  R);..}...memset(
21610 70 49 6e 66 6f 2d 3e 73 6c 6f 74 44 65 73 63 72  pInfo->slotDescr
21620 69 70 74 69 6f 6e 2c 20 27 20 27 2c 20 73 69 7a  iption, ' ', siz
21630 65 6f 66 28 70 49 6e 66 6f 2d 3e 73 6c 6f 74 44  eof(pInfo->slotD
21640 65 73 63 72 69 70 74 69 6f 6e 29 29 3b 0a 09 6d  escription));..m
21650 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 73 6c 6f  emcpy(pInfo->slo
21660 74 44 65 73 63 72 69 70 74 69 6f 6e 2c 20 73 6c  tDescription, sl
21670 6f 74 44 65 73 63 72 69 70 74 69 6f 6e 2c 20 73  otDescription, s
21680 69 7a 65 6f 66 28 73 6c 6f 74 44 65 73 63 72 69  izeof(slotDescri
21690 70 74 69 6f 6e 29 20 2d 20 31 29 3b 0a 0a 09 6d  ption) - 1);...m
216a0 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 6d 61 6e  emset(pInfo->man
216b0 75 66 61 63 74 75 72 65 72 49 44 2c 20 27 20 27  ufacturerID, ' '
216c0 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e  , sizeof(pInfo->
216d0 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 29 29  manufacturerID))
216e0 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 68 61 72 64 77  ;...pInfo->hardw
216f0 61 72 65 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72  areVersion.major
21700 20 3d 20 28 63 61 63 6b 65 79 5f 67 65 74 76 65   = (cackey_getve
21710 72 73 69 6f 6e 28 29 20 3e 3e 20 31 36 29 20 26  rsion() >> 16) &
21720 20 30 78 66 66 3b 0a 09 70 49 6e 66 6f 2d 3e 68   0xff;..pInfo->h
21730 61 72 64 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d  ardwareVersion.m
21740 69 6e 6f 72 20 3d 20 28 63 61 63 6b 65 79 5f 67  inor = (cackey_g
21750 65 74 76 65 72 73 69 6f 6e 28 29 20 3e 3e 20 38  etversion() >> 8
21760 29 20 26 20 30 78 66 66 3b 0a 0a 09 70 49 6e 66  ) & 0xff;...pInf
21770 6f 2d 3e 66 69 72 6d 77 61 72 65 56 65 72 73 69  o->firmwareVersi
21780 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 30 78 30 30 3b  on.major = 0x00;
21790 0a 09 70 49 6e 66 6f 2d 3e 66 69 72 6d 77 61 72  ..pInfo->firmwar
217a0 65 56 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d  eVersion.minor =
217b0 20 30 78 30 30 3b 0a 0a 09 43 41 43 4b 45 59 5f   0x00;...CACKEY_
217c0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
217d0 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28  turning CKR_OK (
217e0 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a  %i)", CKR_OK);..
217f0 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b  .return(CKR_OK);
21800 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
21810 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
21820 47 65 74 54 6f 6b 65 6e 49 6e 66 6f 29 28 43 4b  GetTokenInfo)(CK
21830 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 2c  _SLOT_ID slotID,
21840 20 43 4b 5f 54 4f 4b 45 4e 5f 49 4e 46 4f 5f 50   CK_TOKEN_INFO_P
21850 54 52 20 70 49 6e 66 6f 29 20 7b 0a 09 73 74 61  TR pInfo) {..sta
21860 74 69 63 20 43 4b 5f 55 54 46 38 43 48 41 52 20  tic CK_UTF8CHAR 
21870 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 5b 5d  manufacturerID[]
21880 20 3d 20 22 55 2e 53 2e 20 47 6f 76 65 72 6e 6d   = "U.S. Governm
21890 65 6e 74 22 3b 0a 09 73 74 61 74 69 63 20 43 4b  ent";..static CK
218a0 5f 55 54 46 38 43 48 41 52 20 64 65 66 61 75 6c  _UTF8CHAR defaul
218b0 74 4c 61 62 65 6c 5b 5d 20 3d 20 22 55 6e 6b 6e  tLabel[] = "Unkn
218c0 6f 77 6e 20 54 6f 6b 65 6e 22 3b 0a 09 73 74 61  own Token";..sta
218d0 74 69 63 20 43 4b 5f 55 54 46 38 43 48 41 52 20  tic CK_UTF8CHAR 
218e0 6d 6f 64 65 6c 5b 5d 20 3d 20 22 43 41 43 20 54  model[] = "CAC T
218f0 6f 6b 65 6e 22 3b 0a 09 73 74 72 75 63 74 20 63  oken";..struct c
21900 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74  ackey_pcsc_ident
21910 69 74 79 20 2a 70 63 73 63 5f 69 64 65 6e 74 69  ity *pcsc_identi
21920 74 69 65 73 3b 0a 09 75 6e 73 69 67 6e 65 64 20  ties;..unsigned 
21930 6c 6f 6e 67 20 6e 75 6d 5f 63 65 72 74 73 3b 0a  long num_certs;.
21940 09 73 73 69 7a 65 5f 74 20 6c 61 62 65 6c 5f 72  .ssize_t label_r
21950 65 74 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72  et;..int mutex_r
21960 65 74 76 61 6c 3b 0a 09 69 6e 74 20 75 73 65 5f  etval;..int use_
21970 64 65 66 61 75 6c 74 5f 6c 61 62 65 6c 3b 0a 0a  default_label;..
21980 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
21990 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
219a0 0a 0a 09 69 66 20 28 70 49 6e 66 6f 20 3d 3d 20  ...if (pInfo == 
219b0 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
219c0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
219d0 72 72 6f 72 2e 20 70 49 6e 66 6f 20 69 73 20 4e  rror. pInfo is N
219e0 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  ULL.");....retur
219f0 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f  n(CKR_ARGUMENTS_
21a00 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21  BAD);..}...if (!
21a10 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
21a20 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
21a30 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
21a40 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
21a50 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
21a60 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
21a70 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
21a80 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 49  ;..}...if (slotI
21a90 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20  D < 0 || slotID 
21aa0 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65  >= (sizeof(cacke
21ab0 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f  y_slots) / sizeo
21ac0 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30  f(cackey_slots[0
21ad0 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ]))) {...CACKEY_
21ae0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
21af0 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f  ror. Invalid slo
21b00 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75  t requested (%lu
21b10 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 76 61  ), outside of va
21b20 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74  lid range", slot
21b30 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  ID);....return(C
21b40 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c  KR_SLOT_ID_INVAL
21b50 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f  ID);..}...mutex_
21b60 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
21b70 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65  mutex_lock(cacke
21b80 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
21b90 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
21ba0 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
21bb0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
21bc0 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69  or.  Locking fai
21bd0 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
21be0 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
21bf0 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63  ROR);..}...if (c
21c00 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
21c10 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 29  ID].active == 0)
21c20 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
21c30 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
21c40 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65   Invalid slot re
21c50 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 73  quested (%lu), s
21c60 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c  lot not currentl
21c70 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 49  y active", slotI
21c80 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75  D);....cackey_mu
21c90 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
21ca0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72  y_biglock);....r
21cb0 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49  eturn(CKR_SLOT_I
21cc0 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  D_INVALID);..}..
21cd0 09 69 66 20 28 63 61 63 6b 65 79 5f 74 6f 6b 65  .if (cackey_toke
21ce0 6e 5f 70 72 65 73 65 6e 74 28 26 63 61 63 6b 65  n_present(&cacke
21cf0 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 29  y_slots[slotID])
21d00 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f   != CACKEY_PCSC_
21d10 53 5f 54 4f 4b 45 4e 50 52 45 53 45 4e 54 29 20  S_TOKENPRESENT) 
21d20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
21d30 5f 50 52 49 4e 54 46 28 22 4e 6f 20 74 6f 6b 65  _PRINTF("No toke
21d40 6e 20 69 73 20 70 72 65 73 65 6e 74 20 69 6e 20  n is present in 
21d50 73 6c 6f 74 49 44 20 3d 20 25 6c 75 22 2c 20 73  slotID = %lu", s
21d60 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65  lotID);....cacke
21d70 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
21d80 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
21d90 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 54 4f  ...return(CKR_TO
21da0 4b 45 4e 5f 4e 4f 54 5f 50 52 45 53 45 4e 54 29  KEN_NOT_PRESENT)
21db0 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74  ;..}...mutex_ret
21dc0 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
21dd0 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
21de0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
21df0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
21e00 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
21e10 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
21e20 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61  r.  Unlocking fa
21e30 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
21e40 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
21e50 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 44  RROR);..}.../* D
21e60 65 74 65 72 6d 69 6e 65 20 74 6f 6b 65 6e 20 6c  etermine token l
21e70 61 62 65 6c 20 66 72 6f 6d 20 63 65 72 74 69 66  abel from certif
21e80 69 63 61 74 65 73 20 2a 2f 0a 09 6d 65 6d 73 65  icates */..memse
21e90 74 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 2c 20  t(pInfo->label, 
21ea0 27 20 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66  ' ', sizeof(pInf
21eb0 6f 2d 3e 6c 61 62 65 6c 29 29 3b 0a 09 75 73 65  o->label));..use
21ec0 5f 64 65 66 61 75 6c 74 5f 6c 61 62 65 6c 20 3d  _default_label =
21ed0 20 31 3b 0a 0a 09 69 66 20 28 63 61 63 6b 65 79   1;...if (cackey
21ee0 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c  _slots[slotID].l
21ef0 61 62 65 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  abel == NULL) {.
21f00 09 09 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65  ..pcsc_identitie
21f10 73 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f  s = cackey_read_
21f20 63 65 72 74 73 28 26 63 61 63 6b 65 79 5f 73 6c  certs(&cackey_sl
21f30 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c 20 4e 55 4c  ots[slotID], NUL
21f40 4c 2c 20 26 6e 75 6d 5f 63 65 72 74 73 29 3b 0a  L, &num_certs);.
21f50 09 09 69 66 20 28 70 63 73 63 5f 69 64 65 6e 74  ..if (pcsc_ident
21f60 69 74 69 65 73 20 21 3d 20 4e 55 4c 4c 29 20 7b  ities != NULL) {
21f70 0a 09 09 09 69 66 20 28 6e 75 6d 5f 63 65 72 74  ....if (num_cert
21f80 73 20 3e 20 30 29 20 7b 0a 09 09 09 09 6c 61 62  s > 0) {.....lab
21f90 65 6c 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f  el_ret = cackey_
21fa0 70 63 73 63 5f 69 64 65 6e 74 69 74 79 5f 74 6f  pcsc_identity_to
21fb0 5f 6c 61 62 65 6c 28 70 63 73 63 5f 69 64 65 6e  _label(pcsc_iden
21fc0 74 69 74 69 65 73 2c 20 70 49 6e 66 6f 2d 3e 6c  tities, pInfo->l
21fd0 61 62 65 6c 2c 20 73 69 7a 65 6f 66 28 70 49 6e  abel, sizeof(pIn
21fe0 66 6f 2d 3e 6c 61 62 65 6c 29 29 3b 0a 09 09 09  fo->label));....
21ff0 09 69 66 20 28 6c 61 62 65 6c 5f 72 65 74 20 3e  .if (label_ret >
22000 20 30 29 20 7b 0a 09 09 09 09 09 75 73 65 5f 64   0) {......use_d
22010 65 66 61 75 6c 74 5f 6c 61 62 65 6c 20 3d 20 30  efault_label = 0
22020 3b 0a 0a 09 09 09 09 09 63 61 63 6b 65 79 5f 73  ;.......cackey_s
22030 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61 62  lots[slotID].lab
22040 65 6c 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65  el = malloc(size
22050 6f 66 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 29  of(pInfo->label)
22060 29 3b 0a 0a 09 09 09 09 09 6d 65 6d 63 70 79 28  );.......memcpy(
22070 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f  cackey_slots[slo
22080 74 49 44 5d 2e 6c 61 62 65 6c 2c 20 70 49 6e 66  tID].label, pInf
22090 6f 2d 3e 6c 61 62 65 6c 2c 20 73 69 7a 65 6f 66  o->label, sizeof
220a0 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 29 29 3b  (pInfo->label));
220b0 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 09  .....}....}.....
220c0 63 61 63 6b 65 79 5f 66 72 65 65 5f 63 65 72 74  cackey_free_cert
220d0 73 28 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65  s(pcsc_identitie
220e0 73 2c 20 6e 75 6d 5f 63 65 72 74 73 2c 20 31 29  s, num_certs, 1)
220f0 3b 0a 09 09 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a  ;...}..} else {.
22100 09 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e  ..memcpy(pInfo->
22110 6c 61 62 65 6c 2c 20 63 61 63 6b 65 79 5f 73 6c  label, cackey_sl
22120 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61 62 65  ots[slotID].labe
22130 6c 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d  l, sizeof(pInfo-
22140 3e 6c 61 62 65 6c 29 29 3b 0a 0a 09 09 75 73 65  >label));....use
22150 5f 64 65 66 61 75 6c 74 5f 6c 61 62 65 6c 20 3d  _default_label =
22160 20 30 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 73 65   0;..}...if (use
22170 5f 64 65 66 61 75 6c 74 5f 6c 61 62 65 6c 29 20  _default_label) 
22180 7b 0a 09 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f  {...memcpy(pInfo
22190 2d 3e 6c 61 62 65 6c 2c 20 64 65 66 61 75 6c 74  ->label, default
221a0 4c 61 62 65 6c 2c 20 73 69 7a 65 6f 66 28 64 65  Label, sizeof(de
221b0 66 61 75 6c 74 4c 61 62 65 6c 29 20 2d 20 31 29  faultLabel) - 1)
221c0 3b 0a 09 7d 0a 0a 09 6d 65 6d 73 65 74 28 70 49  ;..}...memset(pI
221d0 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65  nfo->manufacture
221e0 72 49 44 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66  rID, ' ', sizeof
221f0 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74  (pInfo->manufact
22200 75 72 65 72 49 44 29 29 3b 0a 09 6d 65 6d 63 70  urerID));..memcp
22210 79 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63  y(pInfo->manufac
22220 74 75 72 65 72 49 44 2c 20 6d 61 6e 75 66 61 63  turerID, manufac
22230 74 75 72 65 72 49 44 2c 20 73 69 7a 65 6f 66 28  turerID, sizeof(
22240 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 29 20  manufacturerID) 
22250 2d 20 31 29 3b 0a 0a 09 6d 65 6d 73 65 74 28 70  - 1);...memset(p
22260 49 6e 66 6f 2d 3e 6d 6f 64 65 6c 2c 20 27 20 27  Info->model, ' '
22270 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e  , sizeof(pInfo->
22280 6d 6f 64 65 6c 29 29 3b 0a 09 6d 65 6d 63 70 79  model));..memcpy
22290 28 70 49 6e 66 6f 2d 3e 6d 6f 64 65 6c 2c 20 6d  (pInfo->model, m
222a0 6f 64 65 6c 2c 20 73 69 7a 65 6f 66 28 6d 6f 64  odel, sizeof(mod
222b0 65 6c 29 20 2d 20 31 29 3b 0a 0a 09 6d 65 6d 73  el) - 1);...mems
222c0 65 74 28 70 49 6e 66 6f 2d 3e 73 65 72 69 61 6c  et(pInfo->serial
222d0 4e 75 6d 62 65 72 2c 20 27 20 27 2c 20 73 69 7a  Number, ' ', siz
222e0 65 6f 66 28 70 49 6e 66 6f 2d 3e 73 65 72 69 61  eof(pInfo->seria
222f0 6c 4e 75 6d 62 65 72 29 29 3b 0a 0a 09 6d 65 6d  lNumber));...mem
22300 73 65 74 28 70 49 6e 66 6f 2d 3e 75 74 63 54 69  set(pInfo->utcTi
22310 6d 65 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 28  me, ' ', sizeof(
22320 70 49 6e 66 6f 2d 3e 75 74 63 54 69 6d 65 29 29  pInfo->utcTime))
22330 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 68 61 72 64 77  ;...pInfo->hardw
22340 61 72 65 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72  areVersion.major
22350 20 3d 20 28 63 61 63 6b 65 79 5f 67 65 74 76 65   = (cackey_getve
22360 72 73 69 6f 6e 28 29 20 3e 3e 20 31 36 29 20 26  rsion() >> 16) &
22370 20 30 78 66 66 3b 0a 09 70 49 6e 66 6f 2d 3e 68   0xff;..pInfo->h
22380 61 72 64 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d  ardwareVersion.m
22390 69 6e 6f 72 20 3d 20 28 63 61 63 6b 65 79 5f 67  inor = (cackey_g
223a0 65 74 76 65 72 73 69 6f 6e 28 29 20 3e 3e 20 38  etversion() >> 8
223b0 29 20 26 20 30 78 66 66 3b 0a 0a 09 70 49 6e 66  ) & 0xff;...pInf
223c0 6f 2d 3e 66 69 72 6d 77 61 72 65 56 65 72 73 69  o->firmwareVersi
223d0 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 30 78 30 30 3b  on.major = 0x00;
223e0 0a 09 70 49 6e 66 6f 2d 3e 66 69 72 6d 77 61 72  ..pInfo->firmwar
223f0 65 56 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d  eVersion.minor =
22400 20 30 78 30 30 3b 0a 0a 09 70 49 6e 66 6f 2d 3e   0x00;...pInfo->
22410 66 6c 61 67 73 20 3d 20 43 4b 46 5f 57 52 49 54  flags = CKF_WRIT
22420 45 5f 50 52 4f 54 45 43 54 45 44 20 7c 20 43 4b  E_PROTECTED | CK
22430 46 5f 55 53 45 52 5f 50 49 4e 5f 49 4e 49 54 49  F_USER_PIN_INITI
22440 41 4c 49 5a 45 44 20 7c 20 43 4b 46 5f 54 4f 4b  ALIZED | CKF_TOK
22450 45 4e 5f 49 4e 49 54 49 41 4c 49 5a 45 44 20 7c  EN_INITIALIZED |
22460 20 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c   cackey_slots[sl
22470 6f 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67  otID].token_flag
22480 73 3b 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f  s;...if (cackey_
22490 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20 21 3d 20 4e  pin_command != N
224a0 55 4c 4c 29 20 7b 0a 09 09 70 49 6e 66 6f 2d 3e  ULL) {...pInfo->
224b0 66 6c 61 67 73 20 7c 3d 20 43 4b 46 5f 50 52 4f  flags |= CKF_PRO
224c0 54 45 43 54 45 44 5f 41 55 54 48 45 4e 54 49 43  TECTED_AUTHENTIC
224d0 41 54 49 4f 4e 5f 50 41 54 48 3b 0a 09 7d 0a 0a  ATION_PATH;..}..
224e0 09 70 49 6e 66 6f 2d 3e 75 6c 4d 61 78 53 65 73  .pInfo->ulMaxSes
224f0 73 69 6f 6e 43 6f 75 6e 74 20 3d 20 28 73 69 7a  sionCount = (siz
22500 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
22510 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ons) / sizeof(ca
22520 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d  ckey_sessions[0]
22530 29 29 20 2d 20 31 3b 0a 09 70 49 6e 66 6f 2d 3e  )) - 1;..pInfo->
22540 75 6c 53 65 73 73 69 6f 6e 43 6f 75 6e 74 20 3d  ulSessionCount =
22550 20 43 4b 5f 55 4e 41 56 41 49 4c 41 42 4c 45 5f   CK_UNAVAILABLE_
22560 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a 09 70 49  INFORMATION;..pI
22570 6e 66 6f 2d 3e 75 6c 4d 61 78 52 77 53 65 73 73  nfo->ulMaxRwSess
22580 69 6f 6e 43 6f 75 6e 74 20 3d 20 30 3b 0a 09 70  ionCount = 0;..p
22590 49 6e 66 6f 2d 3e 75 6c 52 77 53 65 73 73 69 6f  Info->ulRwSessio
225a0 6e 43 6f 75 6e 74 20 3d 20 43 4b 5f 55 4e 41 56  nCount = CK_UNAV
225b0 41 49 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d 41 54  AILABLE_INFORMAT
225c0 49 4f 4e 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 4d  ION;..pInfo->ulM
225d0 61 78 50 69 6e 4c 65 6e 20 3d 20 31 32 38 3b 0a  axPinLen = 128;.
225e0 09 70 49 6e 66 6f 2d 3e 75 6c 4d 69 6e 50 69 6e  .pInfo->ulMinPin
225f0 4c 65 6e 20 3d 20 30 3b 0a 09 70 49 6e 66 6f 2d  Len = 0;..pInfo-
22600 3e 75 6c 54 6f 74 61 6c 50 75 62 6c 69 63 4d 65  >ulTotalPublicMe
22610 6d 6f 72 79 20 3d 20 43 4b 5f 55 4e 41 56 41 49  mory = CK_UNAVAI
22620 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d 41 54 49 4f  LABLE_INFORMATIO
22630 4e 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 46 72 65  N;..pInfo->ulFre
22640 65 50 75 62 6c 69 63 4d 65 6d 6f 72 79 20 3d 20  ePublicMemory = 
22650 43 4b 5f 55 4e 41 56 41 49 4c 41 42 4c 45 5f 49  CK_UNAVAILABLE_I
22660 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a 09 70 49 6e  NFORMATION;..pIn
22670 66 6f 2d 3e 75 6c 54 6f 74 61 6c 50 72 69 76 61  fo->ulTotalPriva
22680 74 65 4d 65 6d 6f 72 79 20 3d 20 43 4b 5f 55 4e  teMemory = CK_UN
22690 41 56 41 49 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d  AVAILABLE_INFORM
226a0 41 54 49 4f 4e 3b 0a 09 70 49 6e 66 6f 2d 3e 75  ATION;..pInfo->u
226b0 6c 46 72 65 65 50 72 69 76 61 74 65 4d 65 6d 6f  lFreePrivateMemo
226c0 72 79 20 3d 20 43 4b 5f 55 4e 41 56 41 49 4c 41  ry = CK_UNAVAILA
226d0 42 4c 45 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b  BLE_INFORMATION;
226e0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
226f0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
22700 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20  g CKR_OK (%i)", 
22710 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72  CKR_OK);...retur
22720 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b  n(CKR_OK);.}..CK
22730 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
22740 28 43 4b 5f 52 56 2c 20 43 5f 57 61 69 74 46 6f  (CK_RV, C_WaitFo
22750 72 53 6c 6f 74 45 76 65 6e 74 29 28 43 4b 5f 46  rSlotEvent)(CK_F
22760 4c 41 47 53 20 66 6c 61 67 73 2c 20 43 4b 5f 53  LAGS flags, CK_S
22770 4c 4f 54 5f 49 44 5f 50 54 52 20 70 53 6c 6f 74  LOT_ID_PTR pSlot
22780 49 44 2c 20 43 4b 5f 56 4f 49 44 5f 50 54 52 20  ID, CK_VOID_PTR 
22790 70 52 65 73 65 72 76 65 64 29 20 7b 0a 09 43 41  pReserved) {..CA
227a0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
227b0 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
227c0 69 66 20 28 70 52 65 73 65 72 76 65 64 20 21 3d  if (pReserved !=
227d0 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
227e0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
227f0 45 72 72 6f 72 2e 20 70 52 65 73 65 72 76 65 64  Error. pReserved
22800 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 22 29 3b   is not NULL.");
22810 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41  ....return(CKR_A
22820 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09  RGUMENTS_BAD);..
22830 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  }...if (!cackey_
22840 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
22850 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
22860 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
22870 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
22880 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
22890 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
228a0 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
228b0 2f 2a 20 58 58 58 3a 20 54 4f 44 4f 3a 20 49 6d  /* XXX: TODO: Im
228c0 70 6c 65 6d 65 6e 74 20 74 68 69 73 2e 2e 2e 20  plement this... 
228d0 2a 2f 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  */..CACKEY_DEBUG
228e0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
228f0 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
22900 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
22910 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
22920 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
22930 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
22940 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
22950 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  ORTED);.}..CK_DE
22960 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
22970 5f 52 56 2c 20 43 5f 47 65 74 4d 65 63 68 61 6e  _RV, C_GetMechan
22980 69 73 6d 4c 69 73 74 29 28 43 4b 5f 53 4c 4f 54  ismList)(CK_SLOT
22990 5f 49 44 20 73 6c 6f 74 49 44 2c 20 43 4b 5f 4d  _ID slotID, CK_M
229a0 45 43 48 41 4e 49 53 4d 5f 54 59 50 45 5f 50 54  ECHANISM_TYPE_PT
229b0 52 20 70 4d 65 63 68 61 6e 69 73 6d 4c 69 73 74  R pMechanismList
229c0 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70  , CK_ULONG_PTR p
229d0 75 6c 43 6f 75 6e 74 29 20 7b 0a 09 43 41 43 4b  ulCount) {..CACK
229e0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
229f0 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
22a00 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
22a10 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
22a20 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
22a30 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
22a40 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
22a50 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
22a60 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
22a70 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 75  ED);..}...if (pu
22a80 6c 43 6f 75 6e 74 20 3d 3d 20 4e 55 4c 4c 29 20  lCount == NULL) 
22a90 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
22aa0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
22ab0 20 70 75 6c 43 6f 75 6e 74 20 69 73 20 4e 55 4c   pulCount is NUL
22ac0 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  L.");....return(
22ad0 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41  CKR_ARGUMENTS_BA
22ae0 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 4d 65  D);..}...if (pMe
22af0 63 68 61 6e 69 73 6d 4c 69 73 74 20 3d 3d 20 4e  chanismList == N
22b00 55 4c 4c 29 20 7b 0a 09 09 2a 70 75 6c 43 6f 75  ULL) {...*pulCou
22b10 6e 74 20 3d 20 31 3b 0a 0a 09 09 43 41 43 4b 45  nt = 1;....CACKE
22b20 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
22b30 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b  Returning CKR_OK
22b40 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b   (%i)", CKR_OK);
22b50 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ....return(CKR_O
22b60 4b 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 2a 70 75  K);..}...if (*pu
22b70 6c 43 6f 75 6e 74 20 3c 20 31 29 20 7b 0a 09 09  lCount < 1) {...
22b80 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
22b90 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 42 75 66  NTF("Error.  Buf
22ba0 66 65 72 20 74 6f 6f 20 73 6d 61 6c 6c 2e 22 29  fer too small.")
22bb0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
22bc0 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c  BUFFER_TOO_SMALL
22bd0 29 3b 0a 09 7d 0a 0a 09 70 4d 65 63 68 61 6e 69  );..}...pMechani
22be0 73 6d 4c 69 73 74 5b 30 5d 20 3d 20 43 4b 4d 5f  smList[0] = CKM_
22bf0 52 53 41 5f 50 4b 43 53 3b 0a 09 2a 70 75 6c 43  RSA_PKCS;..*pulC
22c00 6f 75 6e 74 20 3d 20 31 3b 0a 0a 09 43 41 43 4b  ount = 1;...CACK
22c10 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
22c20 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
22c30 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29  K (%i)", CKR_OK)
22c40 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ;...return(CKR_O
22c50 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  K);.}..CK_DEFINE
22c60 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
22c70 20 43 5f 47 65 74 4d 65 63 68 61 6e 69 73 6d 49   C_GetMechanismI
22c80 6e 66 6f 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20  nfo)(CK_SLOT_ID 
22c90 73 6c 6f 74 49 44 2c 20 43 4b 5f 4d 45 43 48 41  slotID, CK_MECHA
22ca0 4e 49 53 4d 5f 54 59 50 45 20 74 79 70 65 2c 20  NISM_TYPE type, 
22cb0 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 49 4e 46  CK_MECHANISM_INF
22cc0 4f 5f 50 54 52 20 70 49 6e 66 6f 29 20 7b 0a 09  O_PTR pInfo) {..
22cd0 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c  int mutex_retval
22ce0 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
22cf0 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
22d00 22 29 3b 0a 0a 09 69 66 20 28 70 49 6e 66 6f 20  ");...if (pInfo 
22d10 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43  == NULL) {...CAC
22d20 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
22d30 28 22 45 72 72 6f 72 2e 20 70 49 6e 66 6f 20 69  ("Error. pInfo i
22d40 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65  s NULL.");....re
22d50 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e  turn(CKR_ARGUMEN
22d60 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66  TS_BAD);..}...if
22d70 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
22d80 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
22d90 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
22da0 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
22db0 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
22dc0 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
22dd0 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
22de0 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c  ED);..}...if (sl
22df0 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74  otID < 0 || slot
22e00 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61  ID >= (sizeof(ca
22e10 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69  ckey_slots) / si
22e20 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
22e30 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b  s[0]))) {...CACK
22e40 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
22e50 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20  "Error. Invalid 
22e60 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28  slot requested (
22e70 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66  %lu), outside of
22e80 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73   valid range", s
22e90 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72  lotID);....retur
22ea0 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e  n(CKR_SLOT_ID_IN
22eb0 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74  VALID);..}...mut
22ec0 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
22ed0 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61  ey_mutex_lock(ca
22ee0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
22ef0 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
22f00 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
22f10 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
22f20 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20  Error.  Locking 
22f30 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
22f40 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
22f50 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66  _ERROR);..}...if
22f60 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73   (cackey_slots[s
22f70 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d  lotID].active ==
22f80 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
22f90 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
22fa0 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74  or. Invalid slot
22fb0 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29   requested (%lu)
22fc0 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65  , slot not curre
22fd0 6e 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c  ntly active", sl
22fe0 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79  otID);....cackey
22ff0 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
23000 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
23010 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f  ..return(CKR_SLO
23020 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  T_ID_INVALID);..
23030 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  }...mutex_retval
23040 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
23050 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
23060 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
23070 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
23080 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
23090 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
230a0 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65   Unlocking faile
230b0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
230c0 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
230d0 52 29 3b 0a 09 7d 0a 0a 09 73 77 69 74 63 68 20  R);..}...switch 
230e0 28 74 79 70 65 29 20 7b 0a 09 09 63 61 73 65 20  (type) {...case 
230f0 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 3a 0a 09 09  CKM_RSA_PKCS:...
23100 09 70 49 6e 66 6f 2d 3e 75 6c 4d 69 6e 4b 65 79  .pInfo->ulMinKey
23110 53 69 7a 65 20 3d 20 35 31 32 3b 0a 09 09 09 70  Size = 512;....p
23120 49 6e 66 6f 2d 3e 75 6c 4d 61 78 4b 65 79 53 69  Info->ulMaxKeySi
23130 7a 65 20 3d 20 38 31 39 32 3b 0a 09 09 09 70 49  ze = 8192;....pI
23140 6e 66 6f 2d 3e 66 6c 61 67 73 20 3d 20 43 4b 46  nfo->flags = CKF
23150 5f 48 57 20 7c 20 43 4b 46 5f 45 4e 43 52 59 50  _HW | CKF_ENCRYP
23160 54 20 7c 20 43 4b 46 5f 44 45 43 52 59 50 54 20  T | CKF_DECRYPT 
23170 7c 20 43 4b 46 5f 53 49 47 4e 20 7c 20 43 4b 46  | CKF_SIGN | CKF
23180 5f 56 45 52 49 46 59 3b 0a 09 09 09 62 72 65 61  _VERIFY;....brea
23190 6b 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  k;..}...CACKEY_D
231a0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
231b0 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25  urning CKR_OK (%
231c0 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09  i)", CKR_OK);...
231d0 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a  return(CKR_OK);.
231e0 7d 0a 0a 2f 2a 20 57 65 20 64 6f 6e 27 74 20 73  }../* We don't s
231f0 75 70 70 6f 72 74 20 74 68 69 73 20 6d 65 74 68  upport this meth
23200 6f 64 2e 20 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45  od. */.CK_DEFINE
23210 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
23220 20 43 5f 49 6e 69 74 54 6f 6b 65 6e 29 28 43 4b   C_InitToken)(CK
23230 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 2c  _SLOT_ID slotID,
23240 20 43 4b 5f 55 54 46 38 43 48 41 52 5f 50 54 52   CK_UTF8CHAR_PTR
23250 20 70 50 69 6e 2c 20 43 4b 5f 55 4c 4f 4e 47 20   pPin, CK_ULONG 
23260 75 6c 50 69 6e 4c 65 6e 2c 20 43 4b 5f 55 54 46  ulPinLen, CK_UTF
23270 38 43 48 41 52 5f 50 54 52 20 70 4c 61 62 65 6c  8CHAR_PTR pLabel
23280 29 20 7b 0a 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 43 61 6c 6c 65 64  G_PRINTF("Called
232a0 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
232b0 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
232c0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
232d0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
232e0 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
232f0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
23300 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
23310 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
23320 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
23330 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
23340 67 20 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49 54  g CKR_TOKEN_WRIT
23350 45 5f 50 52 4f 54 45 43 54 45 44 20 28 25 69 29  E_PROTECTED (%i)
23360 22 2c 20 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49  ", CKR_TOKEN_WRI
23370 54 45 5f 50 52 4f 54 45 43 54 45 44 29 3b 0a 0a  TE_PROTECTED);..
23380 09 72 65 74 75 72 6e 28 43 4b 52 5f 54 4f 4b 45  .return(CKR_TOKE
23390 4e 5f 57 52 49 54 45 5f 50 52 4f 54 45 43 54 45  N_WRITE_PROTECTE
233a0 44 29 3b 0a 7d 0a 0a 2f 2a 20 57 65 20 64 6f 6e  D);.}../* We don
233b0 27 74 20 73 75 70 70 6f 72 74 20 74 68 69 73 20  't support this 
233c0 6d 65 74 68 6f 64 2e 20 2a 2f 0a 43 4b 5f 44 45  method. */.CK_DE
233d0 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
233e0 5f 52 56 2c 20 43 5f 49 6e 69 74 50 49 4e 29 28  _RV, C_InitPIN)(
233f0 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
23400 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 55  E hSession, CK_U
23410 54 46 38 43 48 41 52 5f 50 54 52 20 70 50 69 6e  TF8CHAR_PTR pPin
23420 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 69 6e  , CK_ULONG ulPin
23430 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  Len) {..CACKEY_D
23440 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
23450 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
23460 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
23470 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
23480 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
23490 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
234a0 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
234b0 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
234c0 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
234d0 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
234e0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
234f0 6e 69 6e 67 20 43 4b 52 5f 54 4f 4b 45 4e 5f 57  ning CKR_TOKEN_W
23500 52 49 54 45 5f 50 52 4f 54 45 43 54 45 44 20 28  RITE_PROTECTED (
23510 25 69 29 22 2c 20 43 4b 52 5f 54 4f 4b 45 4e 5f  %i)", CKR_TOKEN_
23520 57 52 49 54 45 5f 50 52 4f 54 45 43 54 45 44 29  WRITE_PROTECTED)
23530 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 54  ;...return(CKR_T
23540 4f 4b 45 4e 5f 57 52 49 54 45 5f 50 52 4f 54 45  OKEN_WRITE_PROTE
23550 43 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  CTED);.}..CK_DEF
23560 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
23570 52 56 2c 20 43 5f 53 65 74 50 49 4e 29 28 43 4b  RV, C_SetPIN)(CK
23580 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
23590 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 55 54 46  hSession, CK_UTF
235a0 38 43 48 41 52 5f 50 54 52 20 70 4f 6c 64 50 69  8CHAR_PTR pOldPi
235b0 6e 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 4f 6c  n, CK_ULONG ulOl
235c0 64 50 69 6e 4c 65 6e 2c 20 43 4b 5f 55 54 46 38  dPinLen, CK_UTF8
235d0 43 48 41 52 5f 50 54 52 20 70 4e 65 77 50 69 6e  CHAR_PTR pNewPin
235e0 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 4e 65 77  , CK_ULONG ulNew
235f0 50 69 6e 4c 65 6e 29 20 7b 0a 09 63 68 61 72 20  PinLen) {..char 
23600 6f 6c 64 70 69 6e 62 75 66 5b 36 34 5d 2c 20 6e  oldpinbuf[64], n
23610 65 77 70 69 6e 62 75 66 5b 36 34 5d 3b 0a 09 63  ewpinbuf[64];..c
23620 61 63 6b 65 79 5f 72 65 74 20 73 65 74 5f 70 69  ackey_ret set_pi
23630 6e 5f 72 65 74 2c 20 67 65 74 5f 70 69 6e 5f 72  n_ret, get_pin_r
23640 65 74 3b 0a 09 43 4b 5f 53 4c 4f 54 5f 49 44 20  et;..CK_SLOT_ID 
23650 73 6c 6f 74 49 44 3b 0a 09 69 6e 74 20 6d 75 74  slotID;..int mut
23660 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43  ex_retval;...CAC
23670 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
23680 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
23690 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
236a0 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
236b0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
236c0 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
236d0 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
236e0 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
236f0 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
23700 5a 45 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78  ZED);..}...mutex
23710 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
23720 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b  _mutex_lock(cack
23730 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
23740 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
23750 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
23760 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
23770 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61  ror.  Locking fa
23780 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
23790 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
237a0 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  RROR);..}...if (
237b0 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  !cackey_sessions
237c0 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76  [hSession].activ
237d0 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75  e) {...cackey_mu
237e0 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
237f0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43  y_biglock);....C
23800 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
23810 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73  TF("Error.  Sess
23820 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22  ion not active."
23830 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
23840 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  KR_SESSION_HANDL
23850 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
23860 09 73 6c 6f 74 49 44 20 3d 20 63 61 63 6b 65 79  .slotID = cackey
23870 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
23880 6f 6e 5d 2e 73 6c 6f 74 49 44 3b 0a 0a 09 69 66  on].slotID;...if
23890 20 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20   (slotID < 0 || 
238a0 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f  slotID >= (sizeo
238b0 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20  f(cackey_slots) 
238c0 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f  / sizeof(cackey_
238d0 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09  slots[0]))) {...
238e0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
238f0 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61  NTF("Error. Inva
23900 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74  lid slot request
23910 65 64 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 64  ed (%lu), outsid
23920 65 20 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 65  e of valid range
23930 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63  ", slotID);....c
23940 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
23950 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
23960 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  k);....return(CK
23970 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
23980 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65  ;..}...if (cacke
23990 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e  y_slots[slotID].
239a0 61 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09  active == 0) {..
239b0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
239c0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76  INTF("Error. Inv
239d0 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73  alid slot reques
239e0 74 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20  ted (%lu), slot 
239f0 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61 63  not currently ac
23a00 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a  tive", slotID);.
23a10 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
23a20 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
23a30 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72  glock);....retur
23a40 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
23a50 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63  ROR);..}...if (c
23a60 61 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e  ackey_pin_comman
23a70 64 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 2f  d != NULL) {.../
23a80 2a 20 47 65 74 20 6f 6c 64 20 50 49 4e 20 2a 2f  * Get old PIN */
23a90 0a 09 09 67 65 74 5f 70 69 6e 5f 72 65 74 20 3d  ...get_pin_ret =
23aa0 20 63 61 63 6b 65 79 5f 67 65 74 5f 70 69 6e 28   cackey_get_pin(
23ab0 6f 6c 64 70 69 6e 62 75 66 29 3b 0a 0a 09 09 69  oldpinbuf);....i
23ac0 66 20 28 67 65 74 5f 70 69 6e 5f 72 65 74 20 21  f (get_pin_ret !
23ad0 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  = CACKEY_PCSC_S_
23ae0 4f 4b 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  OK) {....CACKEY_
23af0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
23b00 72 6f 72 20 77 68 69 6c 65 20 67 65 74 74 69 6e  ror while gettin
23b10 67 20 4f 6c 64 20 50 49 4e 2c 20 72 65 74 75 72  g Old PIN, retur
23b20 6e 69 6e 67 20 43 4b 52 5f 50 49 4e 5f 49 4e 43  ning CKR_PIN_INC
23b30 4f 52 52 45 43 54 2e 22 29 3b 0a 0a 09 09 09 63  ORRECT.");.....c
23b40 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
23b50 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
23b60 6b 29 3b 0a 09 09 09 0a 09 09 09 72 65 74 75 72  k);........retur
23b70 6e 28 43 4b 52 5f 50 49 4e 5f 49 4e 43 4f 52 52  n(CKR_PIN_INCORR
23b80 45 43 54 29 3b 0a 09 09 7d 0a 0a 09 09 70 4f 6c  ECT);...}....pOl
23b90 64 50 69 6e 20 3d 20 28 43 4b 5f 55 54 46 38 43  dPin = (CK_UTF8C
23ba0 48 41 52 5f 50 54 52 29 20 6f 6c 64 70 69 6e 62  HAR_PTR) oldpinb
23bb0 75 66 3b 0a 09 09 75 6c 4f 6c 64 50 69 6e 4c 65  uf;...ulOldPinLe
23bc0 6e 20 3d 20 73 74 72 6c 65 6e 28 6f 6c 64 70 69  n = strlen(oldpi
23bd0 6e 62 75 66 29 3b 0a 0a 09 09 2f 2a 20 47 65 74  nbuf);..../* Get
23be0 20 6e 65 77 20 50 49 4e 20 2a 2f 0a 09 09 67 65   new PIN */...ge
23bf0 74 5f 70 69 6e 5f 72 65 74 20 3d 20 63 61 63 6b  t_pin_ret = cack
23c00 65 79 5f 67 65 74 5f 70 69 6e 28 6e 65 77 70 69  ey_get_pin(newpi
23c10 6e 62 75 66 29 3b 0a 0a 09 09 69 66 20 28 67 65  nbuf);....if (ge
23c20 74 5f 70 69 6e 5f 72 65 74 20 21 3d 20 43 41 43  t_pin_ret != CAC
23c30 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b  KEY_PCSC_S_OK) {
23c40 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
23c50 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 20 77  _PRINTF("Error w
23c60 68 69 6c 65 20 67 65 74 74 69 6e 67 20 4e 65 77  hile getting New
23c70 20 50 49 4e 2c 20 72 65 74 75 72 6e 69 6e 67 20   PIN, returning 
23c80 43 4b 52 5f 50 49 4e 5f 49 4e 56 41 4c 49 44 2e  CKR_PIN_INVALID.
23c90 22 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 6d  ");.....cackey_m
23ca0 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
23cb0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 09  ey_biglock);....
23cc0 0a 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 50  ....return(CKR_P
23cd0 49 4e 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 09 7d  IN_INVALID);...}
23ce0 0a 0a 09 09 70 4e 65 77 50 69 6e 20 3d 20 28 43  ....pNewPin = (C
23cf0 4b 5f 55 54 46 38 43 48 41 52 5f 50 54 52 29 20  K_UTF8CHAR_PTR) 
23d00 6e 65 77 70 69 6e 62 75 66 3b 0a 09 09 75 6c 4e  newpinbuf;...ulN
23d10 65 77 50 69 6e 4c 65 6e 20 3d 20 73 74 72 6c 65  ewPinLen = strle
23d20 6e 28 6e 65 77 70 69 6e 62 75 66 29 3b 0a 09 7d  n(newpinbuf);..}
23d30 0a 0a 09 69 66 20 28 70 4f 6c 64 50 69 6e 20 3d  ...if (pOldPin =
23d40 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
23d50 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
23d60 22 4f 6c 64 20 50 49 4e 20 76 61 6c 75 65 20 69  "Old PIN value i
23d70 73 20 77 72 6f 6e 67 20 28 6e 75 6c 6c 29 2e 22  s wrong (null)."
23d80 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  );....cackey_mut
23d90 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
23da0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65  _biglock);....re
23db0 74 75 72 6e 28 43 4b 52 5f 50 49 4e 5f 49 4e 43  turn(CKR_PIN_INC
23dc0 4f 52 52 45 43 54 29 3b 0a 09 7d 0a 0a 09 69 66  ORRECT);..}...if
23dd0 20 28 75 6c 4f 6c 64 50 69 6e 4c 65 6e 20 3d 3d   (ulOldPinLen ==
23de0 20 30 20 7c 7c 20 75 6c 4f 6c 64 50 69 6e 4c 65   0 || ulOldPinLe
23df0 6e 20 3e 20 38 29 20 7b 0a 09 09 43 41 43 4b 45  n > 8) {...CACKE
23e00 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
23e10 4f 6c 64 20 50 49 4e 20 6c 65 6e 67 74 68 20 69  Old PIN length i
23e20 73 20 77 72 6f 6e 67 3a 20 25 6c 75 2e 22 2c 20  s wrong: %lu.", 
23e30 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
23e40 75 6c 4f 6c 64 50 69 6e 4c 65 6e 29 3b 0a 0a 09  ulOldPinLen);...
23e50 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
23e60 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
23e70 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  ock);....return(
23e80 43 4b 52 5f 50 49 4e 5f 49 4e 43 4f 52 52 45 43  CKR_PIN_INCORREC
23e90 54 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 4e 65  T);..}...if (pNe
23ea0 77 50 69 6e 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  wPin == NULL) {.
23eb0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
23ec0 52 49 4e 54 46 28 22 4e 65 77 20 50 49 4e 20 76  RINTF("New PIN v
23ed0 61 6c 75 65 20 69 73 20 77 72 6f 6e 67 20 28 65  alue is wrong (e
23ee0 69 74 68 65 72 20 4e 55 4c 4c 2c 20 6f 72 20 74  ither NULL, or t
23ef0 6f 6f 20 6c 6f 6e 67 2f 73 68 6f 72 74 29 2e 22  oo long/short)."
23f00 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  );....cackey_mut
23f10 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
23f20 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65  _biglock);....re
23f30 74 75 72 6e 28 43 4b 52 5f 50 49 4e 5f 49 4e 56  turn(CKR_PIN_INV
23f40 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  ALID);..}...if (
23f50 75 6c 4e 65 77 50 69 6e 4c 65 6e 20 3c 20 35 20  ulNewPinLen < 5 
23f60 7c 7c 20 75 6c 4e 65 77 50 69 6e 4c 65 6e 20 3e  || ulNewPinLen >
23f70 20 38 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   8) {...CACKEY_D
23f80 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4e 65 77  EBUG_PRINTF("New
23f90 20 50 49 4e 20 6c 65 6e 67 74 68 20 69 73 20 77   PIN length is w
23fa0 72 6f 6e 67 3a 20 25 6c 75 2c 20 6d 75 73 74 20  rong: %lu, must 
23fb0 62 65 20 61 74 6c 65 61 73 74 20 35 20 61 6e 64  be atleast 5 and
23fc0 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 38 2e   no more than 8.
23fd0 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
23fe0 67 29 20 75 6c 4e 65 77 50 69 6e 4c 65 6e 29 3b  g) ulNewPinLen);
23ff0 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  ....cackey_mutex
24000 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
24010 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75  iglock);....retu
24020 72 6e 28 43 4b 52 5f 50 49 4e 5f 4c 45 4e 5f 52  rn(CKR_PIN_LEN_R
24030 41 4e 47 45 29 3b 0a 09 7d 0a 0a 09 73 65 74 5f  ANGE);..}...set_
24040 70 69 6e 5f 72 65 74 20 3d 20 63 61 63 6b 65 79  pin_ret = cackey
24050 5f 73 65 74 5f 70 69 6e 28 26 63 61 63 6b 65 79  _set_pin(&cackey
24060 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c 20  _slots[slotID], 
24070 70 4f 6c 64 50 69 6e 2c 20 75 6c 4f 6c 64 50 69  pOldPin, ulOldPi
24080 6e 4c 65 6e 2c 20 70 4e 65 77 50 69 6e 2c 20 75  nLen, pNewPin, u
24090 6c 4e 65 77 50 69 6e 4c 65 6e 29 3b 0a 0a 09 69  lNewPinLen);...i
240a0 66 20 28 73 65 74 5f 70 69 6e 5f 72 65 74 20 21  f (set_pin_ret !
240b0 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  = CACKEY_PCSC_S_
240c0 4f 4b 29 20 7b 0a 09 09 69 66 20 28 63 61 63 6b  OK) {...if (cack
240d0 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20 3d  ey_pin_command =
240e0 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 63 61 63  = NULL) {....cac
240f0 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44  key_slots[slotID
24100 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 7c 3d  ].token_flags |=
24110 20 43 4b 46 5f 4c 4f 47 49 4e 5f 52 45 51 55 49   CKF_LOGIN_REQUI
24120 52 45 44 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28  RED;...}....if (
24130 73 65 74 5f 70 69 6e 5f 72 65 74 20 3d 3d 20 43  set_pin_ret == C
24140 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4c 4f 43  ACKEY_PCSC_E_LOC
24150 4b 45 44 29 20 7b 0a 09 09 09 63 61 63 6b 65 79  KED) {....cackey
24160 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 74  _slots[slotID].t
24170 6f 6b 65 6e 5f 66 6c 61 67 73 20 7c 3d 20 43 4b  oken_flags |= CK
24180 46 5f 55 53 45 52 5f 50 49 4e 5f 4c 4f 43 4b 45  F_USER_PIN_LOCKE
24190 44 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 6d 75 74 65  D;...}..}...mute
241a0 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
241b0 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
241c0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
241d0 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
241e0 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
241f0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
24200 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69  "Error.  Unlocki
24210 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
24220 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
24230 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
24240 09 73 77 69 74 63 68 20 28 73 65 74 5f 70 69 6e  .switch (set_pin
24250 5f 72 65 74 29 20 7b 0a 09 09 63 61 73 65 20 43  _ret) {...case C
24260 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 3a  ACKEY_PCSC_S_OK:
24270 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
24280 5f 50 52 49 4e 54 46 28 22 53 75 63 63 65 73 73  _PRINTF("Success
24290 66 75 6c 6c 79 20 73 65 74 20 50 49 4e 2e 22 29  fully set PIN.")
242a0 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 4b 52  ;.....return(CKR
242b0 5f 4f 4b 29 3b 0a 09 09 63 61 73 65 20 43 41 43  _OK);...case CAC
242c0 4b 45 59 5f 50 43 53 43 5f 45 5f 42 41 44 50 49  KEY_PCSC_E_BADPI
242d0 4e 3a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42  N:....CACKEY_DEB
242e0 55 47 5f 50 52 49 4e 54 46 28 22 50 49 4e 20 77  UG_PRINTF("PIN w
242f0 61 73 20 69 6e 76 61 6c 69 64 2e 22 29 3b 0a 0a  as invalid.");..
24300 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 50 49  ...return(CKR_PI
24310 4e 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 09 63 61  N_INVALID);...ca
24320 73 65 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  se CACKEY_PCSC_E
24330 5f 4c 4f 43 4b 45 44 3a 0a 09 09 09 43 41 43 4b  _LOCKED:....CACK
24340 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
24350 22 54 6f 6b 65 6e 20 69 73 20 6c 6f 63 6b 65 64  "Token is locked
24360 20 6f 72 20 74 68 69 73 20 63 68 61 6e 67 65 20   or this change 
24370 69 73 20 6e 6f 74 20 70 65 72 6d 69 74 74 65 64  is not permitted
24380 2e 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28  .");.....return(
24390 43 4b 52 5f 50 49 4e 5f 4c 4f 43 4b 45 44 29 3b  CKR_PIN_LOCKED);
243a0 0a 09 09 64 65 66 61 75 6c 74 3a 0a 09 09 09 43  ...default:....C
243b0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
243c0 54 46 28 22 53 6f 6d 65 74 68 69 6e 67 20 65 6c  TF("Something el
243d0 73 65 20 77 65 6e 74 20 77 72 6f 6e 67 20 63 68  se went wrong ch
243e0 61 6e 67 69 6e 67 20 74 68 65 20 50 49 4e 3a 20  anging the PIN: 
243f0 25 69 22 2c 20 73 65 74 5f 70 69 6e 5f 72 65 74  %i", set_pin_ret
24400 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 4b  );.....return(CK
24410 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
24420 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ;..}...return(CK
24430 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
24440 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
24450 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
24460 5f 4f 70 65 6e 53 65 73 73 69 6f 6e 29 28 43 4b  _OpenSession)(CK
24470 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 2c  _SLOT_ID slotID,
24480 20 43 4b 5f 46 4c 41 47 53 20 66 6c 61 67 73 2c   CK_FLAGS flags,
24490 20 43 4b 5f 56 4f 49 44 5f 50 54 52 20 70 41 70   CK_VOID_PTR pAp
244a0 70 6c 69 63 61 74 69 6f 6e 2c 20 43 4b 5f 4e 4f  plication, CK_NO
244b0 54 49 46 59 20 6e 6f 74 69 66 79 2c 20 43 4b 5f  TIFY notify, CK_
244c0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 50  SESSION_HANDLE_P
244d0 54 52 20 70 68 53 65 73 73 69 6f 6e 29 20 7b 0a  TR phSession) {.
244e0 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 69  .unsigned long i
244f0 64 78 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72  dx;..int mutex_r
24500 65 74 76 61 6c 3b 0a 09 69 6e 74 20 66 6f 75 6e  etval;..int foun
24510 64 5f 73 65 73 73 69 6f 6e 20 3d 20 30 3b 0a 0a  d_session = 0;..
24520 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
24530 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
24540 0a 0a 09 69 66 20 28 28 66 6c 61 67 73 20 26 20  ...if ((flags & 
24550 43 4b 46 5f 53 45 52 49 41 4c 5f 53 45 53 53 49  CKF_SERIAL_SESSI
24560 4f 4e 29 20 21 3d 20 43 4b 46 5f 53 45 52 49 41  ON) != CKF_SERIA
24570 4c 5f 53 45 53 53 49 4f 4e 29 20 7b 0a 09 09 72  L_SESSION) {...r
24580 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f  eturn(CKR_SESSIO
24590 4e 5f 50 41 52 41 4c 4c 45 4c 5f 4e 4f 54 5f 53  N_PARALLEL_NOT_S
245a0 55 50 50 4f 52 54 45 44 29 3b 0a 09 7d 0a 0a 09  UPPORTED);..}...
245b0 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
245c0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
245d0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
245e0 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
245f0 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
24600 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
24610 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
24620 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  IZED);..}...if (
24630 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c  slotID < 0 || sl
24640 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28  otID >= (sizeof(
24650 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20  cackey_slots) / 
24660 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
24670 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41  ots[0]))) {...CA
24680 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
24690 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69  F("Error. Invali
246a0 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64  d slot requested
246b0 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20   (%lu), outside 
246c0 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c  of valid range",
246d0 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74   slotID);....ret
246e0 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f  urn(CKR_SLOT_ID_
246f0 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d  INVALID);..}...m
24700 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
24710 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28  ckey_mutex_lock(
24720 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
24730 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
24740 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
24750 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
24760 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e  ("Error.  Lockin
24770 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
24780 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
24790 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
247a0 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  if (cackey_slots
247b0 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65 20  [slotID].active 
247c0 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  == 0) {...CACKEY
247d0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
247e0 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c  rror. Invalid sl
247f0 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c  ot requested (%l
24800 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72  u), slot not cur
24810 72 65 6e 74 6c 79 20 61 63 74 69 76 65 22 2c 20  rently active", 
24820 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b  slotID);....cack
24830 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
24840 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
24850 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
24860 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b  LOT_ID_INVALID);
24870 0a 09 7d 0a 0a 09 2f 2a 20 56 65 72 69 66 79 20  ..}.../* Verify 
24880 74 68 61 74 20 74 68 65 20 63 61 72 64 20 69 73  that the card is
24890 20 61 63 74 75 61 6c 6c 79 20 69 6e 20 74 68 65   actually in the
248a0 20 73 6c 6f 74 2e 20 2a 2f 0a 09 2f 2a 20 58 58   slot. */../* XX
248b0 58 3a 20 43 68 65 63 6b 20 74 6f 20 6d 61 6b 65  X: Check to make
248c0 20 73 75 72 65 20 74 68 69 73 20 69 73 20 69 6e   sure this is in
248d0 20 74 68 65 20 50 4b 43 53 23 31 31 20 73 70 65   the PKCS#11 spe
248e0 63 69 66 69 63 61 74 69 6f 6e 20 2a 2f 0a 09 69  cification */..i
248f0 66 20 28 63 61 63 6b 65 79 5f 74 6f 6b 65 6e 5f  f (cackey_token_
24900 70 72 65 73 65 6e 74 28 26 63 61 63 6b 65 79 5f  present(&cackey_
24910 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 29 20 21  slots[slotID]) !
24920 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  = CACKEY_PCSC_S_
24930 54 4f 4b 45 4e 50 52 45 53 45 4e 54 29 20 7b 0a  TOKENPRESENT) {.
24940 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
24950 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 43  RINTF("Error.  C
24960 61 72 64 20 6e 6f 74 20 70 72 65 73 65 6e 74 2e  ard not present.
24970 20 20 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f    Returning CKR_
24980 44 45 56 49 43 45 5f 52 45 4d 4f 56 45 44 22 29  DEVICE_REMOVED")
24990 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65  ;....cackey_mute
249a0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
249b0 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74  biglock);....ret
249c0 75 72 6e 28 43 4b 52 5f 44 45 56 49 43 45 5f 52  urn(CKR_DEVICE_R
249d0 45 4d 4f 56 45 44 29 3b 0a 09 7d 0a 0a 09 66 6f  EMOVED);..}...fo
249e0 72 20 28 69 64 78 20 3d 20 31 3b 20 69 64 78 20  r (idx = 1; idx 
249f0 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  < (sizeof(cackey
24a00 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a  _sessions) / siz
24a10 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
24a20 6f 6e 73 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29  ons[0])); idx++)
24a30 20 7b 0a 09 09 69 66 20 28 21 63 61 63 6b 65 79   {...if (!cackey
24a40 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 61  _sessions[idx].a
24a50 63 74 69 76 65 29 20 7b 0a 09 09 09 66 6f 75 6e  ctive) {....foun
24a60 64 5f 73 65 73 73 69 6f 6e 20 3d 20 31 3b 0a 0a  d_session = 1;..
24a70 09 09 09 2a 70 68 53 65 73 73 69 6f 6e 20 3d 20  ...*phSession = 
24a80 69 64 78 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f  idx;.....cackey_
24a90 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 61 63  sessions[idx].ac
24aa0 74 69 76 65 20 3d 20 31 3b 0a 09 09 09 63 61 63  tive = 1;....cac
24ab0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78  key_sessions[idx
24ac0 5d 2e 73 6c 6f 74 49 44 20 3d 20 73 6c 6f 74 49  ].slotID = slotI
24ad0 44 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73  D;....cackey_ses
24ae0 73 69 6f 6e 73 5b 69 64 78 5d 2e 73 74 61 74 65  sions[idx].state
24af0 20 3d 20 43 4b 53 5f 52 4f 5f 50 55 42 4c 49 43   = CKS_RO_PUBLIC
24b00 5f 53 45 53 53 49 4f 4e 3b 0a 09 09 09 63 61 63  _SESSION;....cac
24b10 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78  key_sessions[idx
24b20 5d 2e 66 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b  ].flags = flags;
24b30 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ....cackey_sessi
24b40 6f 6e 73 5b 69 64 78 5d 2e 75 6c 44 65 76 69 63  ons[idx].ulDevic
24b50 65 45 72 72 6f 72 20 3d 20 30 3b 0a 09 09 09 63  eError = 0;....c
24b60 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69  ackey_sessions[i
24b70 64 78 5d 2e 70 41 70 70 6c 69 63 61 74 69 6f 6e  dx].pApplication
24b80 20 3d 20 70 41 70 70 6c 69 63 61 74 69 6f 6e 3b   = pApplication;
24b90 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ....cackey_sessi
24ba0 6f 6e 73 5b 69 64 78 5d 2e 4e 6f 74 69 66 79 20  ons[idx].Notify 
24bb0 3d 20 6e 6f 74 69 66 79 3b 0a 0a 09 09 09 63 61  = notify;.....ca
24bc0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64  ckey_sessions[id
24bd0 78 5d 2e 69 64 65 6e 74 69 74 69 65 73 20 3d 20  x].identities = 
24be0 4e 55 4c 4c 3b 0a 09 09 09 63 61 63 6b 65 79 5f  NULL;....cackey_
24bf0 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 69 64  sessions[idx].id
24c00 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 20 3d  entities_count =
24c10 20 30 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73   0;.....cackey_s
24c20 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 73 65 61  essions[idx].sea
24c30 72 63 68 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a  rch_active = 0;.
24c40 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ....cackey_sessi
24c50 6f 6e 73 5b 69 64 78 5d 2e 73 69 67 6e 5f 61 63  ons[idx].sign_ac
24c60 74 69 76 65 20 3d 20 30 3b 0a 0a 09 09 09 63 61  tive = 0;.....ca
24c70 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64  ckey_sessions[id
24c80 78 5d 2e 64 65 63 72 79 70 74 5f 61 63 74 69 76  x].decrypt_activ
24c90 65 20 3d 20 30 3b 0a 0a 09 09 09 63 61 63 6b 65  e = 0;.....cacke
24ca0 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e  y_sessions[idx].
24cb0 69 64 65 6e 74 69 74 69 65 73 20 3d 20 63 61 63  identities = cac
24cc0 6b 65 79 5f 72 65 61 64 5f 69 64 65 6e 74 69 74  key_read_identit
24cd0 69 65 73 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74  ies(&cackey_slot
24ce0 73 5b 73 6c 6f 74 49 44 5d 2c 20 26 63 61 63 6b  s[slotID], &cack
24cf0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d  ey_sessions[idx]
24d00 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e  .identities_coun
24d10 74 29 3b 0a 0a 0a 09 09 09 62 72 65 61 6b 3b 0a  t);......break;.
24d20 09 09 7d 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  ..}..}...mutex_r
24d30 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
24d40 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
24d50 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
24d60 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
24d70 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
24d80 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
24d90 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20  ror.  Unlocking 
24da0 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
24db0 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
24dc0 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66  _ERROR);..}...if
24dd0 20 28 21 66 6f 75 6e 64 5f 73 65 73 73 69 6f 6e   (!found_session
24de0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
24df0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
24e00 6e 69 6e 67 20 43 4b 52 5f 53 45 53 53 49 4f 4e  ning CKR_SESSION
24e10 5f 43 4f 55 4e 54 20 28 25 69 29 22 2c 20 43 4b  _COUNT (%i)", CK
24e20 52 5f 53 45 53 53 49 4f 4e 5f 43 4f 55 4e 54 29  R_SESSION_COUNT)
24e30 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
24e40 53 45 53 53 49 4f 4e 5f 43 4f 55 4e 54 29 3b 0a  SESSION_COUNT);.
24e50 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
24e60 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
24e70 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22  ing CKR_OK (%i)"
24e80 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74  , CKR_OK);...ret
24e90 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a  urn(CKR_OK);.}..
24ea0 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
24eb0 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 43 6c 6f 73  ON(CK_RV, C_Clos
24ec0 65 53 65 73 73 69 6f 6e 29 28 43 4b 5f 53 45 53  eSession)(CK_SES
24ed0 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
24ee0 73 69 6f 6e 29 20 7b 0a 09 69 6e 74 20 6d 75 74  sion) {..int mut
24ef0 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43  ex_retval;...CAC
24f00 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
24f10 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
24f20 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
24f30 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
24f40 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
24f50 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
24f60 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
24f70 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
24f80 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
24f90 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68  ZED);..}...if (h
24fa0 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20  Session == 0 || 
24fb0 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a  hSession >= (siz
24fc0 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
24fd0 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ons) / sizeof(ca
24fe0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d  ckey_sessions[0]
24ff0 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ))) {...CACKEY_D
25000 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
25010 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74  or.  Session out
25020 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09   of range.");...
25030 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
25040 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56  SSION_HANDLE_INV
25050 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65  ALID);..}...mute
25060 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
25070 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63  y_mutex_lock(cac
25080 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
25090 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
250a0 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
250b0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
250c0 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66  rror.  Locking f
250d0 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
250e0 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
250f0 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20  ERROR);..}...if 
25100 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  (!cackey_session
25110 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69  s[hSession].acti
25120 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d  ve) {...cackey_m
25130 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
25140 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
25150 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
25160 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73  NTF("Error.  Ses
25170 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e  sion not active.
25180 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
25190 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  CKR_SESSION_HAND
251a0 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  LE_INVALID);..}.
251b0 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
251c0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69  s[hSession].acti
251d0 76 65 20 3d 20 30 3b 0a 09 63 61 63 6b 65 79 5f  ve = 0;..cackey_
251e0 66 72 65 65 5f 69 64 65 6e 74 69 74 69 65 73 28  free_identities(
251f0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
25200 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69  hSession].identi
25210 74 69 65 73 2c 20 63 61 63 6b 65 79 5f 73 65 73  ties, cackey_ses
25220 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
25230 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74  identities_count
25240 29 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  );...mutex_retva
25250 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
25260 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
25270 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
25280 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
25290 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
252a0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
252b0 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c    Unlocking fail
252c0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
252d0 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
252e0 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  OR);..}...CACKEY
252f0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
25300 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20  eturning CKR_OK 
25310 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a  (%i)", CKR_OK);.
25320 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29  ..return(CKR_OK)
25330 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
25340 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
25350 5f 43 6c 6f 73 65 41 6c 6c 53 65 73 73 69 6f 6e  _CloseAllSession
25360 73 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c  s)(CK_SLOT_ID sl
25370 6f 74 49 44 29 20 7b 0a 09 75 69 6e 74 33 32 5f  otID) {..uint32_
25380 74 20 69 64 78 3b 0a 09 69 6e 74 20 6d 75 74 65  t idx;..int mute
25390 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b  x_retval;...CACK
253a0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
253b0 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
253c0 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
253d0 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
253e0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
253f0 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
25400 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
25410 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
25420 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
25430 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c  ED);..}...if (sl
25440 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74  otID < 0 || slot
25450 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61  ID >= (sizeof(ca
25460 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69  ckey_slots) / si
25470 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
25480 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b  s[0]))) {...CACK
25490 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
254a0 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20  "Error. Invalid 
254b0 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28  slot requested (
254c0 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66  %lu), outside of
254d0 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73   valid range", s
254e0 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72  lotID);....retur
254f0 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e  n(CKR_SLOT_ID_IN
25500 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74  VALID);..}...mut
25510 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
25520 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61  ey_mutex_lock(ca
25530 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
25540 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
25550 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
25560 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
25570 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20  Error.  Locking 
25580 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
25590 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
255a0 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66  _ERROR);..}...if
255b0 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73   (cackey_slots[s
255c0 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d  lotID].active ==
255d0 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
255e0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
255f0 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74  or. Invalid slot
25600 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29   requested (%lu)
25610 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65  , slot not curre
25620 6e 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c  ntly active", sl
25630 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79  otID);....cackey
25640 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
25650 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
25660 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f  ..return(CKR_SLO
25670 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  T_ID_INVALID);..
25680 7d 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 30  }...for (idx = 0
25690 3b 20 69 64 78 20 3c 20 28 73 69 7a 65 6f 66 28  ; idx < (sizeof(
256a0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29  cackey_sessions)
256b0 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
256c0 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 3b 20  _sessions[0])); 
256d0 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28 63  idx++) {...if (c
256e0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69  ackey_sessions[i
256f0 64 78 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09  dx].active) {...
25700 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73  .if (cackey_sess
25710 69 6f 6e 73 5b 69 64 78 5d 2e 73 6c 6f 74 49 44  ions[idx].slotID
25720 20 21 3d 20 73 6c 6f 74 49 44 29 20 7b 0a 09 09   != slotID) {...
25730 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 7d  ..continue;....}
25740 0a 0a 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65  .....cackey_mute
25750 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
25760 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 09 43 5f 43  biglock);....C_C
25770 6c 6f 73 65 53 65 73 73 69 6f 6e 28 69 64 78 29  loseSession(idx)
25780 3b 0a 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65  ;....cackey_mute
25790 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  x_lock(cackey_bi
257a0 67 6c 6f 63 6b 29 3b 0a 09 09 7d 0a 09 7d 0a 0a  glock);...}..}..
257b0 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
257c0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
257d0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
257e0 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
257f0 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
25800 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
25810 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e  INTF("Error.  Un
25820 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  locking failed."
25830 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
25840 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
25850 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
25860 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
25870 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29  ning CKR_OK (%i)
25880 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65  ", CKR_OK);...re
25890 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a  turn(CKR_OK);.}.
258a0 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
258b0 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74  ION(CK_RV, C_Get
258c0 53 65 73 73 69 6f 6e 49 6e 66 6f 29 28 43 4b 5f  SessionInfo)(CK_
258d0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
258e0 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 53 45 53 53  Session, CK_SESS
258f0 49 4f 4e 5f 49 4e 46 4f 5f 50 54 52 20 70 49 6e  ION_INFO_PTR pIn
25900 66 6f 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78  fo) {..int mutex
25910 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45  _retval;...CACKE
25920 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
25930 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
25940 28 70 49 6e 66 6f 20 3d 3d 20 4e 55 4c 4c 29 20  (pInfo == NULL) 
25950 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
25960 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
25970 70 49 6e 66 6f 20 69 73 20 4e 55 4c 4c 2e 22 29  pInfo is NULL.")
25980 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
25990 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a  ARGUMENTS_BAD);.
259a0 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  .}...if (!cackey
259b0 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
259c0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
259d0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
259e0 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
259f0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
25a00 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
25a10 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
25a20 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d  .if (hSession ==
25a30 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e   0 || hSession >
25a40 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  = (sizeof(cackey
25a50 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a  _sessions) / siz
25a60 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
25a70 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41  ons[0]))) {...CA
25a80 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
25a90 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69  F("Error.  Sessi
25aa0 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e  on out of range.
25ab0 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
25ac0 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  CKR_SESSION_HAND
25ad0 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  LE_INVALID);..}.
25ae0 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
25af0 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f   cackey_mutex_lo
25b00 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
25b10 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
25b20 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
25b30 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
25b40 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63  NTF("Error.  Loc
25b50 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
25b60 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
25b70 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
25b80 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73  ...if (!cackey_s
25b90 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
25ba0 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61  ].active) {...ca
25bb0 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
25bc0 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
25bd0 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  );....CACKEY_DEB
25be0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
25bf0 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61  .  Session not a
25c00 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72  ctive.");......r
25c10 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f  eturn(CKR_SESSIO
25c20 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44  N_HANDLE_INVALID
25c30 29 3b 0a 09 7d 0a 0a 09 70 49 6e 66 6f 2d 3e 73  );..}...pInfo->s
25c40 6c 6f 74 49 44 20 3d 20 63 61 63 6b 65 79 5f 73  lotID = cackey_s
25c50 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
25c60 5d 2e 73 6c 6f 74 49 44 3b 0a 09 70 49 6e 66 6f  ].slotID;..pInfo
25c70 2d 3e 73 74 61 74 65 20 3d 20 63 61 63 6b 65 79  ->state = cackey
25c80 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
25c90 6f 6e 5d 2e 73 74 61 74 65 3b 0a 09 70 49 6e 66  on].state;..pInf
25ca0 6f 2d 3e 66 6c 61 67 73 20 3d 20 63 61 63 6b 65  o->flags = cacke
25cb0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
25cc0 69 6f 6e 5d 2e 66 6c 61 67 73 3b 0a 09 70 49 6e  ion].flags;..pIn
25cd0 66 6f 2d 3e 75 6c 44 65 76 69 63 65 45 72 72 6f  fo->ulDeviceErro
25ce0 72 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69  r = cackey_sessi
25cf0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 75 6c  ons[hSession].ul
25d00 44 65 76 69 63 65 45 72 72 6f 72 3b 0a 0a 09 6d  DeviceError;...m
25d10 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
25d20 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
25d30 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
25d40 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
25d50 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
25d60 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
25d70 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f  TF("Error.  Unlo
25d80 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
25d90 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
25da0 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
25db0 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
25dc0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
25dd0 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c  ng CKR_OK (%i)",
25de0 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75   CKR_OK);...retu
25df0 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43  rn(CKR_OK);.}..C
25e00 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
25e10 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 4f 70  N(CK_RV, C_GetOp
25e20 65 72 61 74 69 6f 6e 53 74 61 74 65 29 28 43 4b  erationState)(CK
25e30 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
25e40 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54  hSession, CK_BYT
25e50 45 5f 50 54 52 20 70 4f 70 65 72 61 74 69 6f 6e  E_PTR pOperation
25e60 53 74 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 5f  State, CK_ULONG_
25e70 50 54 52 20 70 75 6c 4f 70 65 72 61 74 69 6f 6e  PTR pulOperation
25e80 53 74 61 74 65 4c 65 6e 29 20 7b 0a 09 43 41 43  StateLen) {..CAC
25e90 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
25ea0 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
25eb0 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
25ec0 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
25ed0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
25ee0 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
25ef0 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
25f00 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
25f10 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
25f20 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
25f30 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
25f40 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
25f50 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
25f60 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
25f70 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
25f80 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
25f90 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
25fa0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
25fb0 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
25fc0 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 65  TION(CK_RV, C_Se
25fd0 74 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 65 29  tOperationState)
25fe0 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
25ff0 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
26000 42 59 54 45 5f 50 54 52 20 70 4f 70 65 72 61 74  BYTE_PTR pOperat
26010 69 6f 6e 53 74 61 74 65 2c 20 43 4b 5f 55 4c 4f  ionState, CK_ULO
26020 4e 47 20 75 6c 4f 70 65 72 61 74 69 6f 6e 53 74  NG ulOperationSt
26030 61 74 65 4c 65 6e 2c 20 43 4b 5f 4f 42 4a 45 43  ateLen, CK_OBJEC
26040 54 5f 48 41 4e 44 4c 45 20 68 45 6e 63 72 79 70  T_HANDLE hEncryp
26050 74 69 6f 6e 4b 65 79 2c 20 43 4b 5f 4f 42 4a 45  tionKey, CK_OBJE
26060 43 54 5f 48 41 4e 44 4c 45 20 68 41 75 74 68 65  CT_HANDLE hAuthe
26070 6e 74 69 63 61 74 69 6f 6e 4b 65 79 29 20 7b 0a  nticationKey) {.
26080 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
26090 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
260a0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
260b0 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
260c0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
260d0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
260e0 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
260f0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
26100 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
26110 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
26120 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
26130 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
26140 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
26150 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20  UPPORTED (%i)", 
26160 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
26170 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72  _SUPPORTED);...r
26180 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
26190 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
261a0 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
261b0 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
261c0 5f 43 5f 4c 6f 67 69 6e 4d 75 74 65 78 41 72 67  _C_LoginMutexArg
261d0 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
261e0 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
261f0 5f 55 53 45 52 5f 54 59 50 45 20 75 73 65 72 54  _USER_TYPE userT
26200 79 70 65 2c 20 43 4b 5f 55 54 46 38 43 48 41 52  ype, CK_UTF8CHAR
26210 5f 50 54 52 20 70 50 69 6e 2c 20 43 4b 5f 55 4c  _PTR pPin, CK_UL
26220 4f 4e 47 20 75 6c 50 69 6e 4c 65 6e 2c 20 69 6e  ONG ulPinLen, in
26230 74 20 6c 6f 63 6b 5f 6d 75 74 65 78 29 20 7b 0a  t lock_mutex) {.
26240 09 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74  .CK_SLOT_ID slot
26250 49 44 3b 0a 09 63 61 63 6b 65 79 5f 72 65 74 20  ID;..cackey_ret 
26260 67 65 74 5f 70 69 6e 5f 72 65 74 3b 0a 09 63 68  get_pin_ret;..ch
26270 61 72 20 70 69 6e 62 75 66 5b 36 34 5d 3b 0a 09  ar pinbuf[64];..
26280 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c  int mutex_retval
26290 3b 0a 09 69 6e 74 20 74 72 69 65 73 5f 72 65 6d  ;..int tries_rem
262a0 61 69 6e 69 6e 67 3b 0a 09 69 6e 74 20 6c 6f 67  aining;..int log
262b0 69 6e 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59  in_ret;...CACKEY
262c0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
262d0 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
262e0 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
262f0 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
26300 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
26310 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
26320 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
26330 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
26340 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
26350 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73  );..}...if (hSes
26360 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65  sion == 0 || hSe
26370 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66  ssion >= (sizeof
26380 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
26390 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
263a0 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29  y_sessions[0])))
263b0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
263c0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
263d0 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66    Session out of
263e0 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09   range.");......
263f0 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
26400 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  ON_HANDLE_INVALI
26410 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 73 65  D);..}...if (use
26420 72 54 79 70 65 20 21 3d 20 43 4b 55 5f 55 53 45  rType != CKU_USE
26430 52 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  R) {...CACKEY_DE
26440 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
26450 72 2e 20 20 57 65 20 6f 6e 6c 79 20 73 75 70 70  r.  We only supp
26460 6f 72 74 20 55 53 45 52 20 6d 6f 64 65 2c 20 61  ort USER mode, a
26470 73 6b 65 64 20 66 6f 72 20 25 6c 75 20 6d 6f 64  sked for %lu mod
26480 65 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  e.", (unsigned l
26490 6f 6e 67 29 20 75 73 65 72 54 79 70 65 29 0a 0a  ong) userType)..
264a0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 55 53 45  ..return(CKR_USE
264b0 52 5f 54 59 50 45 5f 49 4e 56 41 4c 49 44 29 3b  R_TYPE_INVALID);
264c0 0a 09 7d 0a 0a 09 69 66 20 28 6c 6f 63 6b 5f 6d  ..}...if (lock_m
264d0 75 74 65 78 29 20 7b 0a 09 09 6d 75 74 65 78 5f  utex) {...mutex_
264e0 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
264f0 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65  mutex_lock(cacke
26500 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 69 66  y_biglock);...if
26510 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
26520 3d 20 30 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  = 0) {....CACKEY
26530 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
26540 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66  rror.  Locking f
26550 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 09 72 65  ailed.");.....re
26560 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
26570 5f 45 52 52 4f 52 29 3b 0a 09 09 7d 0a 09 7d 0a  _ERROR);...}..}.
26580 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65  ..if (!cackey_se
26590 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
265a0 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 69 66 20  .active) {...if 
265b0 28 6c 6f 63 6b 5f 6d 75 74 65 78 29 20 7b 0a 09  (lock_mutex) {..
265c0 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
265d0 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
265e0 6c 6f 63 6b 29 3b 0a 09 09 7d 0a 0a 09 09 43 41  lock);...}....CA
265f0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
26600 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69  F("Error.  Sessi
26610 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29  on not active.")
26620 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
26630 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  R_SESSION_HANDLE
26640 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
26650 73 6c 6f 74 49 44 20 3d 20 63 61 63 6b 65 79 5f  slotID = cackey_
26660 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
26670 6e 5d 2e 73 6c 6f 74 49 44 3b 0a 0a 09 69 66 20  n].slotID;...if 
26680 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73  (slotID < 0 || s
26690 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66  lotID >= (sizeof
266a0 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f  (cackey_slots) /
266b0 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73   sizeof(cackey_s
266c0 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43  lots[0]))) {...C
266d0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
266e0 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c  TF("Error. Inval
266f0 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65  id slot requeste
26700 64 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 65  d (%lu), outside
26710 20 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 65 22   of valid range"
26720 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 69 66  , slotID);....if
26730 20 28 6c 6f 63 6b 5f 6d 75 74 65 78 29 20 7b 0a   (lock_mutex) {.
26740 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
26750 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
26760 67 6c 6f 63 6b 29 3b 0a 09 09 7d 0a 0a 09 09 72  glock);...}....r
26770 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
26780 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69  L_ERROR);..}...i
26790 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  f (cackey_slots[
267a0 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d  slotID].active =
267b0 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
267c0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
267d0 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f  ror. Invalid slo
267e0 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75  t requested (%lu
267f0 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72  ), slot not curr
26800 65 6e 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73  ently active", s
26810 6c 6f 74 49 44 29 3b 0a 0a 09 09 69 66 20 28 6c  lotID);....if (l
26820 6f 63 6b 5f 6d 75 74 65 78 29 20 7b 0a 09 09 09  ock_mutex) {....
26830 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
26840 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
26850 63 6b 29 3b 0a 09 09 7d 0a 0a 09 09 72 65 74 75  ck);...}....retu
26860 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
26870 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  RROR);..}...if (
26880 63 61 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61  cackey_pin_comma
26890 6e 64 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  nd != NULL) {...
268a0 69 66 20 28 70 50 69 6e 20 21 3d 20 4e 55 4c 4c  if (pPin != NULL
268b0 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
268c0 42 55 47 5f 50 52 49 4e 54 46 28 22 50 72 6f 74  BUG_PRINTF("Prot
268d0 65 63 74 65 64 20 61 75 74 68 65 6e 74 69 63 61  ected authentica
268e0 74 69 6f 6e 20 70 61 74 68 20 69 6e 20 65 66 66  tion path in eff
268f0 65 63 74 20 61 6e 64 20 50 49 4e 20 70 72 6f 76  ect and PIN prov
26900 69 64 65 64 20 21 3f 22 29 3b 0a 09 09 7d 0a 0a  ided !?");...}..
26910 09 09 67 65 74 5f 70 69 6e 5f 72 65 74 20 3d 20  ..get_pin_ret = 
26920 63 61 63 6b 65 79 5f 67 65 74 5f 70 69 6e 28 70  cackey_get_pin(p
26930 69 6e 62 75 66 29 3b 0a 0a 09 09 69 66 20 28 67  inbuf);....if (g
26940 65 74 5f 70 69 6e 5f 72 65 74 20 21 3d 20 43 41  et_pin_ret != CA
26950 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20  CKEY_PCSC_S_OK) 
26960 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
26970 47 5f 50 52 49 4e 54 46 28 22 63 61 63 6b 65 79  G_PRINTF("cackey
26980 5f 67 65 74 5f 70 69 6e 28 29 20 72 65 74 75 72  _get_pin() retur
26990 6e 65 64 20 69 6e 20 66 61 69 6c 75 72 65 2c 20  ned in failure, 
269a0 61 73 73 75 6d 69 6e 67 20 74 68 65 20 50 49 4e  assuming the PIN
269b0 20 77 61 73 20 69 6e 63 6f 72 72 65 63 74 2e 22   was incorrect."
269c0 29 3b 0a 0a 09 09 09 69 66 20 28 6c 6f 63 6b 5f  );.....if (lock_
269d0 6d 75 74 65 78 29 20 7b 0a 09 09 09 09 63 61 63  mutex) {.....cac
269e0 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
269f0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
26a00 3b 0a 09 09 09 7d 0a 0a 09 09 09 72 65 74 75 72  ;....}.....retur
26a10 6e 28 43 4b 52 5f 50 49 4e 5f 49 4e 43 4f 52 52  n(CKR_PIN_INCORR
26a20 45 43 54 29 3b 0a 09 09 7d 0a 0a 09 09 70 50 69  ECT);...}....pPi
26a30 6e 20 3d 20 28 43 4b 5f 55 54 46 38 43 48 41 52  n = (CK_UTF8CHAR
26a40 5f 50 54 52 29 20 70 69 6e 62 75 66 3b 0a 09 09  _PTR) pinbuf;...
26a50 75 6c 50 69 6e 4c 65 6e 20 3d 20 73 74 72 6c 65  ulPinLen = strle
26a60 6e 28 70 69 6e 62 75 66 29 3b 0a 09 7d 0a 0a 09  n(pinbuf);..}...
26a70 6c 6f 67 69 6e 5f 72 65 74 20 3d 20 63 61 63 6b  login_ret = cack
26a80 65 79 5f 6c 6f 67 69 6e 28 26 63 61 63 6b 65 79  ey_login(&cackey
26a90 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c 20  _slots[slotID], 
26aa0 70 50 69 6e 2c 20 75 6c 50 69 6e 4c 65 6e 2c 20  pPin, ulPinLen, 
26ab0 26 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67  &tries_remaining
26ac0 2c 20 33 29 3b 0a 09 69 66 20 28 6c 6f 67 69 6e  , 3);..if (login
26ad0 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50  _ret != CACKEY_P
26ae0 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 69 66  CSC_S_OK) {...if
26af0 20 28 6c 6f 63 6b 5f 6d 75 74 65 78 29 20 7b 0a   (lock_mutex) {.
26b00 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
26b10 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
26b20 67 6c 6f 63 6b 29 3b 0a 09 09 7d 0a 0a 09 09 69  glock);...}....i
26b30 66 20 28 6c 6f 67 69 6e 5f 72 65 74 20 3d 3d 20  f (login_ret == 
26b40 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4c 4f  CACKEY_PCSC_E_LO
26b50 43 4b 45 44 29 20 7b 0a 09 09 09 43 41 43 4b 45  CKED) {....CACKE
26b60 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
26b70 45 72 72 6f 72 2e 20 20 54 6f 6b 65 6e 20 69 73  Error.  Token is
26b80 20 6c 6f 63 6b 65 64 2e 22 29 3b 0a 0a 09 09 09   locked.");.....
26b90 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f  cackey_slots[slo
26ba0 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73  tID].token_flags
26bb0 20 7c 3d 20 43 4b 46 5f 55 53 45 52 5f 50 49 4e   |= CKF_USER_PIN
26bc0 5f 4c 4f 43 4b 45 44 3b 0a 0a 09 09 09 43 41 43  _LOCKED;.....CAC
26bd0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
26be0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
26bf0 50 49 4e 5f 4c 4f 43 4b 45 44 20 28 25 69 29 22  PIN_LOCKED (%i)"
26c00 2c 20 28 69 6e 74 29 20 43 4b 52 5f 50 49 4e 5f  , (int) CKR_PIN_
26c10 4c 4f 43 4b 45 44 29 3b 0a 0a 09 09 09 72 65 74  LOCKED);.....ret
26c20 75 72 6e 28 43 4b 52 5f 50 49 4e 5f 4c 4f 43 4b  urn(CKR_PIN_LOCK
26c30 45 44 29 3b 0a 09 09 7d 20 65 6c 73 65 20 69 66  ED);...} else if
26c40 20 28 6c 6f 67 69 6e 5f 72 65 74 20 3d 3d 20 43   (login_ret == C
26c50 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 42 41 44  ACKEY_PCSC_E_BAD
26c60 50 49 4e 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  PIN) {....CACKEY
26c70 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
26c80 72 72 6f 72 2e 20 20 49 6e 76 61 6c 69 64 20 50  rror.  Invalid P
26c90 49 4e 2e 22 29 3b 0a 0a 09 09 09 63 61 63 6b 65  IN.");.....cacke
26ca0 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e  y_slots[slotID].
26cb0 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 7c 3d 20 43  token_flags |= C
26cc0 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 43 4f 55 4e  KF_USER_PIN_COUN
26cd0 54 5f 4c 4f 57 3b 0a 0a 09 09 09 69 66 20 28 74  T_LOW;.....if (t
26ce0 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 20 3d  ries_remaining =
26cf0 3d 20 31 29 20 7b 0a 09 09 09 09 63 61 63 6b 65  = 1) {.....cacke
26d00 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e  y_slots[slotID].
26d10 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 7c 3d 20 43  token_flags |= C
26d20 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 46 49 4e 41  KF_USER_PIN_FINA
26d30 4c 5f 54 52 59 3b 0a 09 09 09 7d 0a 0a 09 09 09  L_TRY;....}.....
26d40 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
26d50 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
26d60 4b 52 5f 50 49 4e 5f 49 4e 43 4f 52 52 45 43 54  KR_PIN_INCORRECT
26d70 20 28 25 69 29 22 2c 20 28 69 6e 74 29 20 43 4b   (%i)", (int) CK
26d80 52 5f 50 49 4e 5f 49 4e 43 4f 52 52 45 43 54 29  R_PIN_INCORRECT)
26d90 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 4b 52  ;.....return(CKR
26da0 5f 50 49 4e 5f 49 4e 43 4f 52 52 45 43 54 29 3b  _PIN_INCORRECT);
26db0 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ...}....CACKEY_D
26dc0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
26dd0 6f 72 2e 20 20 55 6e 6b 6e 6f 77 6e 20 65 72 72  or.  Unknown err
26de0 6f 72 20 72 65 74 75 72 6e 65 64 20 66 72 6f 6d  or returned from
26df0 20 63 61 63 6b 65 79 5f 6c 6f 67 69 6e 28 29 20   cackey_login() 
26e00 28 25 69 29 22 2c 20 6c 6f 67 69 6e 5f 72 65 74  (%i)", login_ret
26e10 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
26e20 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
26e30 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 6c 6f  ..}...cackey_slo
26e40 74 73 5b 73 6c 6f 74 49 44 5d 2e 74 6f 6b 65 6e  ts[slotID].token
26e50 5f 66 6c 61 67 73 20 26 3d 20 7e 28 43 4b 46 5f  _flags &= ~(CKF_
26e60 55 53 45 52 5f 50 49 4e 5f 4c 4f 43 4b 45 44 20  USER_PIN_LOCKED 
26e70 7c 20 43 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 43  | CKF_USER_PIN_C
26e80 4f 55 4e 54 5f 4c 4f 57 20 7c 20 43 4b 46 5f 4c  OUNT_LOW | CKF_L
26e90 4f 47 49 4e 5f 52 45 51 55 49 52 45 44 20 7c 20  OGIN_REQUIRED | 
26ea0 43 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 46 49 4e  CKF_USER_PIN_FIN
26eb0 41 4c 5f 54 52 59 29 3b 0a 0a 09 63 61 63 6b 65  AL_TRY);...cacke
26ec0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
26ed0 69 6f 6e 5d 2e 73 74 61 74 65 20 3d 20 43 4b 53  ion].state = CKS
26ee0 5f 52 4f 5f 55 53 45 52 5f 46 55 4e 43 54 49 4f  _RO_USER_FUNCTIO
26ef0 4e 53 3b 0a 0a 09 69 66 20 28 6c 6f 63 6b 5f 6d  NS;...if (lock_m
26f00 75 74 65 78 29 20 7b 0a 09 09 6d 75 74 65 78 5f  utex) {...mutex_
26f10 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
26f20 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
26f30 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 09  key_biglock);...
26f40 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
26f50 20 21 3d 20 30 29 20 7b 0a 09 09 09 43 41 43 4b   != 0) {....CACK
26f60 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
26f70 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69  "Error.  Unlocki
26f80 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
26f90 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
26fa0 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 09 7d  ERAL_ERROR);...}
26fb0 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
26fc0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
26fd0 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29  ning CKR_OK (%i)
26fe0 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65  ", CKR_OK);...re
26ff0 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a  turn(CKR_OK);.}.
27000 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
27010 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 4c 6f 67  ION(CK_RV, C_Log
27020 69 6e 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  in)(CK_SESSION_H
27030 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
27040 43 4b 5f 55 53 45 52 5f 54 59 50 45 20 75 73 65  CK_USER_TYPE use
27050 72 54 79 70 65 2c 20 43 4b 5f 55 54 46 38 43 48  rType, CK_UTF8CH
27060 41 52 5f 50 54 52 20 70 50 69 6e 2c 20 43 4b 5f  AR_PTR pPin, CK_
27070 55 4c 4f 4e 47 20 75 6c 50 69 6e 4c 65 6e 29 20  ULONG ulPinLen) 
27080 7b 0a 09 72 65 74 75 72 6e 28 5f 43 5f 4c 6f 67  {..return(_C_Log
27090 69 6e 4d 75 74 65 78 41 72 67 28 68 53 65 73 73  inMutexArg(hSess
270a0 69 6f 6e 2c 20 75 73 65 72 54 79 70 65 2c 20 70  ion, userType, p
270b0 50 69 6e 2c 20 75 6c 50 69 6e 4c 65 6e 2c 20 31  Pin, ulPinLen, 1
270c0 29 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  ));.}..CK_DEFINE
270d0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
270e0 20 43 5f 4c 6f 67 6f 75 74 29 28 43 4b 5f 53 45   C_Logout)(CK_SE
270f0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
27100 73 73 69 6f 6e 29 20 7b 0a 09 43 4b 5f 53 4c 4f  ssion) {..CK_SLO
27110 54 5f 49 44 20 73 6c 6f 74 49 44 3b 0a 09 69 6e  T_ID slotID;..in
27120 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a  t mutex_retval;.
27130 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
27140 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
27150 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
27160 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
27170 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
27180 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
27190 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
271a0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
271b0 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
271c0 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
271d0 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20  if (hSession == 
271e0 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d  0 || hSession >=
271f0 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
27200 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65  sessions) / size
27210 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
27220 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43  ns[0]))) {...CAC
27230 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
27240 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f  ("Error.  Sessio
27250 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22  n out of range."
27260 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
27270 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  KR_SESSION_HANDL
27280 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
27290 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
272a0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63  cackey_mutex_loc
272b0 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
272c0 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
272d0 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
272e0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
272f0 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b  TF("Error.  Lock
27300 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
27310 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
27320 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
27330 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65  ..if (!cackey_se
27340 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
27350 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63  .active) {...cac
27360 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
27370 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
27380 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  ;....CACKEY_DEBU
27390 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
273a0 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63    Session not ac
273b0 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  tive.");......re
273c0 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e  turn(CKR_SESSION
273d0 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29  _HANDLE_INVALID)
273e0 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 49 44 20 3d 20  ;..}...slotID = 
273f0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
27400 68 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44  hSession].slotID
27410 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44 20 3c  ;...if (slotID <
27420 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20   0 || slotID >= 
27430 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
27440 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  lots) / sizeof(c
27450 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29  ackey_slots[0]))
27460 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
27470 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
27480 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72  . Invalid slot r
27490 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20  equested (%lu), 
274a0 6f 75 74 73 69 64 65 20 6f 66 20 76 61 6c 69 64  outside of valid
274b0 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29   range", slotID)
274c0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
274d0 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
274e0 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f  .}...if (cackey_
274f0 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63  slots[slotID].ac
27500 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43  tive == 0) {...C
27510 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
27520 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c  TF("Error. Inval
27530 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65  id slot requeste
27540 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f  d (%lu), slot no
27550 74 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69  t currently acti
27560 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09  ve", slotID);...
27570 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
27580 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
27590 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  ock);....return(
275a0 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
275b0 52 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f  R);..}...cackey_
275c0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
275d0 6e 5d 2e 73 74 61 74 65 20 3d 20 43 4b 53 5f 52  n].state = CKS_R
275e0 4f 5f 50 55 42 4c 49 43 5f 53 45 53 53 49 4f 4e  O_PUBLIC_SESSION
275f0 3b 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 70  ;...if (cackey_p
27600 69 6e 5f 63 6f 6d 6d 61 6e 64 20 3d 3d 20 4e 55  in_command == NU
27610 4c 4c 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 73  LL) {...cackey_s
27620 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 74 6f 6b  lots[slotID].tok
27630 65 6e 5f 66 6c 61 67 73 20 3d 20 43 4b 46 5f 4c  en_flags = CKF_L
27640 4f 47 49 4e 5f 52 45 51 55 49 52 45 44 3b 0a 09  OGIN_REQUIRED;..
27650 7d 20 65 6c 73 65 20 7b 0a 09 09 63 61 63 6b 65  } else {...cacke
27660 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e  y_slots[slotID].
27670 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 3d 20 30 3b  token_flags = 0;
27680 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  ..}...mutex_retv
27690 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
276a0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
276b0 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
276c0 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
276d0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
276e0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
276f0 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69  .  Unlocking fai
27700 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
27710 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
27720 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ROR);..}...CACKE
27730 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
27740 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b  Returning CKR_OK
27750 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b   (%i)", CKR_OK);
27760 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b  ...return(CKR_OK
27770 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
27780 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
27790 43 5f 43 72 65 61 74 65 4f 62 6a 65 63 74 29 28  C_CreateObject)(
277a0 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
277b0 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 41  E hSession, CK_A
277c0 54 54 52 49 42 55 54 45 5f 50 54 52 20 70 54 65  TTRIBUTE_PTR pTe
277d0 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47  mplate, CK_ULONG
277e0 20 75 6c 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a   ulCount, CK_OBJ
277f0 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70  ECT_HANDLE_PTR p
27800 68 4f 62 6a 65 63 74 29 20 7b 0a 09 43 41 43 4b  hObject) {..CACK
27810 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
27820 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
27830 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
27840 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
27850 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
27860 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
27870 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
27880 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
27890 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
278a0 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
278b0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
278c0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
278d0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
278e0 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
278f0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
27900 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
27910 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
27920 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
27930 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
27940 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 43 6f 70  ION(CK_RV, C_Cop
27950 79 4f 62 6a 65 63 74 29 28 43 4b 5f 53 45 53 53  yObject)(CK_SESS
27960 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
27970 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48  ion, CK_OBJECT_H
27980 41 4e 44 4c 45 20 68 4f 62 6a 65 63 74 2c 20 43  ANDLE hObject, C
27990 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52 20  K_ATTRIBUTE_PTR 
279a0 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c  pTemplate, CK_UL
279b0 4f 4e 47 20 75 6c 43 6f 75 6e 74 2c 20 43 4b 5f  ONG ulCount, CK_
279c0 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54  OBJECT_HANDLE_PT
279d0 52 20 70 68 4e 65 77 4f 62 6a 65 63 74 29 20 7b  R phNewObject) {
279e0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
279f0 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
27a00 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
27a10 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
27a20 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
27a30 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
27a40 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
27a50 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
27a60 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
27a70 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
27a80 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
27a90 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
27aa0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
27ab0 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
27ac0 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
27ad0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
27ae0 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
27af0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
27b00 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
27b10 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
27b20 20 43 5f 44 65 73 74 72 6f 79 4f 62 6a 65 63 74   C_DestroyObject
27b30 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
27b40 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
27b50 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68  _OBJECT_HANDLE h
27b60 4f 62 6a 65 63 74 29 20 7b 0a 09 43 41 43 4b 45  Object) {..CACKE
27b70 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
27b80 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
27b90 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
27ba0 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
27bb0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
27bc0 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
27bd0 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
27be0 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
27bf0 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
27c00 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
27c10 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
27c20 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
27c30 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
27c40 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
27c50 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
27c60 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
27c70 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
27c80 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
27c90 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
27ca0 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 4f  ON(CK_RV, C_GetO
27cb0 62 6a 65 63 74 53 69 7a 65 29 28 43 4b 5f 53 45  bjectSize)(CK_SE
27cc0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
27cd0 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54  ssion, CK_OBJECT
27ce0 5f 48 41 4e 44 4c 45 20 68 4f 62 6a 65 63 74 2c  _HANDLE hObject,
27cf0 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75   CK_ULONG_PTR pu
27d00 6c 53 69 7a 65 29 20 7b 0a 09 43 41 43 4b 45 59  lSize) {..CACKEY
27d10 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
27d20 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
27d30 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
27d40 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
27d50 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
27d60 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
27d70 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
27d80 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
27d90 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
27da0 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
27db0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
27dc0 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
27dd0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
27de0 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
27df0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
27e00 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
27e10 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
27e20 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
27e30 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
27e40 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 41 74  N(CK_RV, C_GetAt
27e50 74 72 69 62 75 74 65 56 61 6c 75 65 29 28 43 4b  tributeValue)(CK
27e60 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
27e70 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a  hSession, CK_OBJ
27e80 45 43 54 5f 48 41 4e 44 4c 45 20 68 4f 62 6a 65  ECT_HANDLE hObje
27e90 63 74 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45  ct, CK_ATTRIBUTE
27ea0 5f 50 54 52 20 70 54 65 6d 70 6c 61 74 65 2c 20  _PTR pTemplate, 
27eb0 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e 74  CK_ULONG ulCount
27ec0 29 20 7b 0a 09 43 4b 5f 41 54 54 52 49 42 55 54  ) {..CK_ATTRIBUT
27ed0 45 20 2a 63 75 72 72 5f 61 74 74 72 3b 0a 09 73  E *curr_attr;..s
27ee0 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65  truct cackey_ide
27ef0 6e 74 69 74 79 20 2a 69 64 65 6e 74 69 74 79 3b  ntity *identity;
27f00 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  ..unsigned long 
27f10 69 64 65 6e 74 69 74 79 5f 69 64 78 2c 20 61 74  identity_idx, at
27f20 74 72 5f 69 64 78 2c 20 73 65 73 73 5f 61 74 74  tr_idx, sess_att
27f30 72 5f 69 64 78 2c 20 6e 75 6d 5f 69 64 73 3b 0a  r_idx, num_ids;.
27f40 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61  .int mutex_retva
27f50 6c 3b 0a 09 43 4b 5f 52 56 20 72 65 74 76 61 6c  l;..CK_RV retval
27f60 20 3d 20 43 4b 52 5f 4f 4b 3b 0a 09 43 4b 5f 56   = CKR_OK;..CK_V
27f70 4f 49 44 5f 50 54 52 20 70 56 61 6c 75 65 3b 0a  OID_PTR pValue;.
27f80 09 43 4b 5f 55 4c 4f 4e 47 20 75 6c 56 61 6c 75  .CK_ULONG ulValu
27f90 65 4c 65 6e 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  eLen;...CACKEY_D
27fa0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
27fb0 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
27fc0 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
27fd0 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
27fe0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
27ff0 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
28000 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
28010 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
28020 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
28030 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69  ..}...if (hSessi
28040 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73  on == 0 || hSess
28050 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63  ion >= (sizeof(c
28060 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20  ackey_sessions) 
28070 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f  / sizeof(cackey_
28080 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b  sessions[0]))) {
28090 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
280a0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
280b0 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72  Session out of r
280c0 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  ange.");......re
280d0 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e  turn(CKR_SESSION
280e0 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29  _HANDLE_INVALID)
280f0 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 4f 62 6a 65  ;..}...if (hObje
28100 63 74 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43  ct == 0) {...CAC
28110 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
28120 28 22 45 72 72 6f 72 2e 20 20 4f 62 6a 65 63 74  ("Error.  Object
28130 20 68 61 6e 64 6c 65 20 6f 75 74 20 6f 66 20 72   handle out of r
28140 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  ange.");......re
28150 74 75 72 6e 28 43 4b 52 5f 4f 42 4a 45 43 54 5f  turn(CKR_OBJECT_
28160 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
28170 0a 09 7d 0a 0a 09 69 66 20 28 75 6c 43 6f 75 6e  ..}...if (ulCoun
28180 74 20 3d 3d 20 30 29 20 7b 0a 09 09 2f 2a 20 53  t == 0) {.../* S
28190 68 6f 72 74 20 63 69 72 63 75 69 74 2c 20 69 66  hort circuit, if
281a0 20 7a 65 72 6f 20 6f 62 6a 65 63 74 73 20 77 65   zero objects we
281b0 72 65 20 73 70 65 63 69 66 69 65 64 20 72 65 74  re specified ret
281c0 75 72 6e 20 7a 65 72 6f 20 69 74 65 6d 73 20 69  urn zero items i
281d0 6d 6d 65 64 69 61 74 65 6c 79 20 2a 2f 0a 09 09  mmediately */...
281e0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
281f0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
28200 4b 52 5f 4f 4b 20 28 25 69 29 20 28 73 68 6f 72  KR_OK (%i) (shor
28210 74 20 63 69 72 63 75 69 74 29 22 2c 20 43 4b 52  t circuit)", CKR
28220 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  _OK);....return(
28230 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66  CKR_OK);..}...if
28240 20 28 70 54 65 6d 70 6c 61 74 65 20 3d 3d 20 4e   (pTemplate == N
28250 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
28260 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
28270 72 6f 72 2e 20 20 70 54 65 6d 70 6c 61 74 65 20  ror.  pTemplate 
28280 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72  is NULL.");....r
28290 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45  eturn(CKR_ARGUME
282a0 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69  NTS_BAD);..}...i
282b0 64 65 6e 74 69 74 79 5f 69 64 78 20 3d 20 68 4f  dentity_idx = hO
282c0 62 6a 65 63 74 20 2d 20 31 3b 0a 0a 09 6d 75 74  bject - 1;...mut
282d0 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
282e0 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61  ey_mutex_lock(ca
282f0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
28300 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
28310 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
28320 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
28330 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20  Error.  Locking 
28340 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
28350 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
28360 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66  _ERROR);..}...if
28370 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   (!cackey_sessio
28380 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74  ns[hSession].act
28390 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  ive) {...cackey_
283a0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
283b0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
283c0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
283d0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65  INTF("Error.  Se
283e0 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65  ssion not active
283f0 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
28400 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  (CKR_SESSION_HAN
28410 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  DLE_INVALID);..}
28420 0a 0a 09 6e 75 6d 5f 69 64 73 20 3d 20 63 61 63  ...num_ids = cac
28430 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
28440 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65  ssion].identitie
28450 73 5f 63 6f 75 6e 74 3b 0a 0a 09 69 66 20 28 69  s_count;...if (i
28460 64 65 6e 74 69 74 79 5f 69 64 78 20 3e 3d 20 6e  dentity_idx >= n
28470 75 6d 5f 69 64 73 29 20 7b 0a 09 09 63 61 63 6b  um_ids) {...cack
28480 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
28490 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
284a0 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
284b0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
284c0 20 4f 62 6a 65 63 74 20 68 61 6e 64 6c 65 20 6f   Object handle o
284d0 75 74 20 6f 66 20 72 61 6e 67 65 2e 20 20 69 64  ut of range.  id
284e0 65 6e 74 69 74 79 5f 69 64 78 20 3d 20 25 6c 75  entity_idx = %lu
284f0 2c 20 6e 75 6d 5f 69 64 73 20 3d 20 25 6c 75 2e  , num_ids = %lu.
28500 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
28510 67 29 20 69 64 65 6e 74 69 74 79 5f 69 64 78 2c  g) identity_idx,
28520 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
28530 20 6e 75 6d 5f 69 64 73 29 3b 0a 0a 09 09 72 65   num_ids);....re
28540 74 75 72 6e 28 43 4b 52 5f 4f 42 4a 45 43 54 5f  turn(CKR_OBJECT_
28550 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
28560 0a 09 7d 0a 0a 09 69 64 65 6e 74 69 74 79 20 3d  ..}...identity =
28570 20 26 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e   &cackey_session
28580 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e  s[hSession].iden
28590 74 69 74 69 65 73 5b 69 64 65 6e 74 69 74 79 5f  tities[identity_
285a0 69 64 78 5d 3b 0a 0a 09 66 6f 72 20 28 61 74 74  idx];...for (att
285b0 72 5f 69 64 78 20 3d 20 30 3b 20 61 74 74 72 5f  r_idx = 0; attr_
285c0 69 64 78 20 3c 20 75 6c 43 6f 75 6e 74 3b 20 61  idx < ulCount; a
285d0 74 74 72 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 63  ttr_idx++) {...c
285e0 75 72 72 5f 61 74 74 72 20 3d 20 26 70 54 65 6d  urr_attr = &pTem
285f0 70 6c 61 74 65 5b 61 74 74 72 5f 69 64 78 5d 3b  plate[attr_idx];
28600 0a 0a 09 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c  ....pValue = NUL
28610 4c 3b 0a 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20  L;...ulValueLen 
28620 3d 20 28 43 4b 5f 4c 4f 4e 47 29 20 2d 31 3b 0a  = (CK_LONG) -1;.
28630 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
28640 50 52 49 4e 54 46 28 22 4c 6f 6f 6b 69 6e 67 20  PRINTF("Looking 
28650 66 6f 72 20 61 74 74 72 69 62 75 74 65 20 30 78  for attribute 0x
28660 25 30 38 6c 78 20 28 69 64 65 6e 74 69 74 79 3a  %08lx (identity:
28670 25 6c 75 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69  %lu) ...", (unsi
28680 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f  gned long) curr_
28690 61 74 74 72 2d 3e 74 79 70 65 2c 20 28 75 6e 73  attr->type, (uns
286a0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 69 64 65 6e  igned long) iden
286b0 74 69 74 79 5f 69 64 78 29 3b 0a 0a 09 09 66 6f  tity_idx);....fo
286c0 72 20 28 73 65 73 73 5f 61 74 74 72 5f 69 64 78  r (sess_attr_idx
286d0 20 3d 20 30 3b 20 73 65 73 73 5f 61 74 74 72 5f   = 0; sess_attr_
286e0 69 64 78 20 3c 20 69 64 65 6e 74 69 74 79 2d 3e  idx < identity->
286f0 61 74 74 72 69 62 75 74 65 73 5f 63 6f 75 6e 74  attributes_count
28700 3b 20 73 65 73 73 5f 61 74 74 72 5f 69 64 78 2b  ; sess_attr_idx+
28710 2b 29 20 7b 0a 09 09 09 69 66 20 28 69 64 65 6e  +) {....if (iden
28720 74 69 74 79 2d 3e 61 74 74 72 69 62 75 74 65 73  tity->attributes
28730 5b 73 65 73 73 5f 61 74 74 72 5f 69 64 78 5d 2e  [sess_attr_idx].
28740 74 79 70 65 20 3d 3d 20 63 75 72 72 5f 61 74 74  type == curr_att
28750 72 2d 3e 74 79 70 65 29 20 7b 0a 09 09 09 09 43  r->type) {.....C
28760 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
28770 54 46 28 22 20 2e 2e 2e 20 66 6f 75 6e 64 20 69  TF(" ... found i
28780 74 2c 20 70 56 61 6c 75 65 20 3d 20 25 70 2c 20  t, pValue = %p, 
28790 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 25 6c 75  ulValueLen = %lu
287a0 22 2c 20 69 64 65 6e 74 69 74 79 2d 3e 61 74 74  ", identity->att
287b0 72 69 62 75 74 65 73 5b 73 65 73 73 5f 61 74 74  ributes[sess_att
287c0 72 5f 69 64 78 5d 2e 70 56 61 6c 75 65 2c 20 69  r_idx].pValue, i
287d0 64 65 6e 74 69 74 79 2d 3e 61 74 74 72 69 62 75  dentity->attribu
287e0 74 65 73 5b 73 65 73 73 5f 61 74 74 72 5f 69 64  tes[sess_attr_id
287f0 78 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a  x].ulValueLen);.
28800 09 09 09 09 0a 09 09 09 09 70 56 61 6c 75 65 20  .........pValue 
28810 3d 20 69 64 65 6e 74 69 74 79 2d 3e 61 74 74 72  = identity->attr
28820 69 62 75 74 65 73 5b 73 65 73 73 5f 61 74 74 72  ibutes[sess_attr
28830 5f 69 64 78 5d 2e 70 56 61 6c 75 65 3b 0a 09 09  _idx].pValue;...
28840 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 69  ..ulValueLen = i
28850 64 65 6e 74 69 74 79 2d 3e 61 74 74 72 69 62 75  dentity->attribu
28860 74 65 73 5b 73 65 73 73 5f 61 74 74 72 5f 69 64  tes[sess_attr_id
28870 78 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 09  x].ulValueLen;..
28880 09 09 7d 0a 09 09 7d 0a 0a 09 09 69 66 20 28 63  ..}...}....if (c
28890 75 72 72 5f 61 74 74 72 2d 3e 70 56 61 6c 75 65  urr_attr->pValue
288a0 20 26 26 20 70 56 61 6c 75 65 29 20 7b 0a 09 09   && pValue) {...
288b0 09 69 66 20 28 63 75 72 72 5f 61 74 74 72 2d 3e  .if (curr_attr->
288c0 75 6c 56 61 6c 75 65 4c 65 6e 20 3e 3d 20 75 6c  ulValueLen >= ul
288d0 56 61 6c 75 65 4c 65 6e 29 20 7b 0a 09 09 09 09  ValueLen) {.....
288e0 6d 65 6d 63 70 79 28 63 75 72 72 5f 61 74 74 72  memcpy(curr_attr
288f0 2d 3e 70 56 61 6c 75 65 2c 20 70 56 61 6c 75 65  ->pValue, pValue
28900 2c 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 09  , ulValueLen);..
28910 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 75  ..} else {.....u
28920 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 28 43 4b 5f  lValueLen = (CK_
28930 4c 4f 4e 47 29 20 2d 31 3b 0a 0a 09 09 09 09 72  LONG) -1;......r
28940 65 74 76 61 6c 20 3d 20 43 4b 52 5f 42 55 46 46  etval = CKR_BUFF
28950 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 3b 0a 09 09  ER_TOO_SMALL;...
28960 09 7d 0a 09 09 7d 0a 0a 09 09 63 75 72 72 5f 61  .}...}....curr_a
28970 74 74 72 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 20  ttr->ulValueLen 
28980 3d 20 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 09 7d  = ulValueLen;..}
28990 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
289a0 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  = cackey_mutex_u
289b0 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
289c0 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
289d0 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
289e0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
289f0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
28a00 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64  Unlocking failed
28a10 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
28a20 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
28a30 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 72 65 74 76  );..}...if (retv
28a40 61 6c 20 3d 3d 20 43 4b 52 5f 41 54 54 52 49 42  al == CKR_ATTRIB
28a50 55 54 45 5f 54 59 50 45 5f 49 4e 56 41 4c 49 44  UTE_TYPE_INVALID
28a60 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
28a70 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
28a80 6e 69 6e 67 20 43 4b 52 5f 41 54 54 52 49 42 55  ning CKR_ATTRIBU
28a90 54 45 5f 54 59 50 45 5f 49 4e 56 41 4c 49 44 20  TE_TYPE_INVALID 
28aa0 28 25 69 29 22 2c 20 28 69 6e 74 29 20 72 65 74  (%i)", (int) ret
28ab0 76 61 6c 29 3b 0a 09 7d 20 65 6c 73 65 20 69 66  val);..} else if
28ac0 20 28 72 65 74 76 61 6c 20 3d 3d 20 43 4b 52 5f   (retval == CKR_
28ad0 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c  BUFFER_TOO_SMALL
28ae0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
28af0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
28b00 6e 69 6e 67 20 43 4b 52 5f 42 55 46 46 45 52 5f  ning CKR_BUFFER_
28b10 54 4f 4f 5f 53 4d 41 4c 4c 20 28 25 69 29 22 2c  TOO_SMALL (%i)",
28b20 20 28 69 6e 74 29 20 72 65 74 76 61 6c 29 3b 0a   (int) retval);.
28b30 09 7d 20 65 6c 73 65 20 69 66 20 28 72 65 74 76  .} else if (retv
28b40 61 6c 20 3d 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a  al == CKR_OK) {.
28b50 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
28b60 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
28b70 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 28   CKR_OK (%i)", (
28b80 69 6e 74 29 20 72 65 74 76 61 6c 29 3b 0a 09 7d  int) retval);..}
28b90 20 65 6c 73 65 20 7b 0a 09 09 43 41 43 4b 45 59   else {...CACKEY
28ba0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
28bb0 65 74 75 72 6e 69 6e 67 20 25 69 22 2c 20 28 69  eturning %i", (i
28bc0 6e 74 29 20 72 65 74 76 61 6c 29 3b 0a 09 7d 0a  nt) retval);..}.
28bd0 0a 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29  ..return(retval)
28be0 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
28bf0 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
28c00 5f 53 65 74 41 74 74 72 69 62 75 74 65 56 61 6c  _SetAttributeVal
28c10 75 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  ue)(CK_SESSION_H
28c20 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
28c30 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45  CK_OBJECT_HANDLE
28c40 20 68 4f 62 6a 65 63 74 2c 20 43 4b 5f 41 54 54   hObject, CK_ATT
28c50 52 49 42 55 54 45 5f 50 54 52 20 70 54 65 6d 70  RIBUTE_PTR pTemp
28c60 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  late, CK_ULONG u
28c70 6c 43 6f 75 6e 74 29 20 7b 0a 09 43 41 43 4b 45  lCount) {..CACKE
28c80 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
28c90 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
28ca0 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
28cb0 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
28cc0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
28cd0 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
28ce0 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
28cf0 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
28d00 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
28d10 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
28d20 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
28d30 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
28d40 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
28d50 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
28d60 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
28d70 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
28d80 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
28d90 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
28da0 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
28db0 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 46 69 6e 64  ON(CK_RV, C_Find
28dc0 4f 62 6a 65 63 74 73 49 6e 69 74 29 28 43 4b 5f  ObjectsInit)(CK_
28dd0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
28de0 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 41 54 54 52  Session, CK_ATTR
28df0 49 42 55 54 45 5f 50 54 52 20 70 54 65 6d 70 6c  IBUTE_PTR pTempl
28e00 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  ate, CK_ULONG ul
28e10 43 6f 75 6e 74 29 20 7b 0a 09 43 4b 5f 53 4c 4f  Count) {..CK_SLO
28e20 54 5f 49 44 20 73 6c 6f 74 49 44 3b 0a 09 43 4b  T_ID slotID;..CK
28e30 5f 55 4c 4f 4e 47 20 69 64 78 3b 0a 09 69 6e 74  _ULONG idx;..int
28e40 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a   mutex_retval;..
28e50 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
28e60 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
28e70 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
28e80 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
28e90 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
28ea0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
28eb0 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
28ec0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
28ed0 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
28ee0 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69  IALIZED);..}...i
28ef0 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30  f (hSession == 0
28f00 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20   || hSession >= 
28f10 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
28f20 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f  essions) / sizeo
28f30 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
28f40 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b  s[0]))) {...CACK
28f50 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
28f60 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e  "Error.  Session
28f70 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29   out of range.")
28f80 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
28f90 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  R_SESSION_HANDLE
28fa0 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
28fb0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
28fc0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b  ackey_mutex_lock
28fd0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
28fe0 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
28ff0 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
29000 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
29010 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69  F("Error.  Locki
29020 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
29030 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
29040 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
29050 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73  .if (!cackey_ses
29060 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
29070 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b  active) {...cack
29080 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
29090 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
290a0 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
290b0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
290c0 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74   Session not act
290d0 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  ive.");......ret
290e0 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  urn(CKR_SESSION_
290f0 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
29100 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79  ..}...if (cackey
29110 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
29120 6f 6e 5d 2e 73 65 61 72 63 68 5f 61 63 74 69 76  on].search_activ
29130 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75  e) {...cackey_mu
29140 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
29150 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43  y_biglock);....C
29160 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
29170 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 61 72  TF("Error.  Sear
29180 63 68 20 61 6c 72 65 61 64 79 20 61 63 74 69 76  ch already activ
29190 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
291a0 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f  n(CKR_OPERATION_
291b0 41 43 54 49 56 45 29 3b 0a 09 7d 0a 0a 09 73 6c  ACTIVE);..}...sl
291c0 6f 74 49 44 20 3d 20 63 61 63 6b 65 79 5f 73 65  otID = cackey_se
291d0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
291e0 2e 73 6c 6f 74 49 44 3b 0a 0a 09 69 66 20 28 73  .slotID;...if (s
291f0 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f  lotID < 0 || slo
29200 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63  tID >= (sizeof(c
29210 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73  ackey_slots) / s
29220 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f  izeof(cackey_slo
29230 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43  ts[0]))) {...CAC
29240 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
29250 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64  ("Error. Invalid
29260 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20   slot requested 
29270 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f  (%lu), outside o
29280 66 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20  f valid range", 
29290 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 75  slotID);....retu
292a0 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
292b0 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  RROR);..}...if (
292c0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f  cackey_slots[slo
292d0 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30  tID].active == 0
292e0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
292f0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
29300 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72  . Invalid slot r
29310 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20  equested (%lu), 
29320 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74  slot not current
29330 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74  ly active", slot
29340 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d  ID);....cackey_m
29350 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
29360 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
29370 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
29380 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
29390 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  if (cackey_slots
293a0 5b 73 6c 6f 74 49 44 5d 2e 73 6c 6f 74 5f 72 65  [slotID].slot_re
293b0 73 65 74 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  set) {...CACKEY_
293c0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54 68  DEBUG_PRINTF("Th
293d0 65 20 73 6c 6f 74 20 68 61 73 20 62 65 65 6e 20  e slot has been 
293e0 72 65 73 65 74 20 73 69 6e 63 65 20 77 65 20 6c  reset since we l
293f0 61 73 74 20 6c 6f 6f 6b 65 64 20 66 6f 72 20 69  ast looked for i
29400 64 65 6e 74 69 74 69 65 73 20 2d 2d 20 72 65 73  dentities -- res
29410 63 61 6e 6e 69 6e 67 22 29 3b 0a 0a 09 09 69 66  canning");....if
29420 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e   (cackey_session
29430 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e  s[hSession].iden
29440 74 69 74 69 65 73 20 21 3d 20 4e 55 4c 4c 29 20  tities != NULL) 
29450 7b 0a 09 09 09 63 61 63 6b 65 79 5f 66 72 65 65  {....cackey_free
29460 5f 69 64 65 6e 74 69 74 69 65 73 28 63 61 63 6b  _identities(cack
29470 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
29480 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73  sion].identities
29490 2c 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  , cackey_session
294a0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e  s[hSession].iden
294b0 74 69 74 69 65 73 5f 63 6f 75 6e 74 29 3b 0a 0a  tities_count);..
294c0 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
294d0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65  ns[hSession].ide
294e0 6e 74 69 74 69 65 73 20 3d 20 4e 55 4c 4c 3b 0a  ntities = NULL;.
294f0 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
29500 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65  ns[hSession].ide
29510 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 20 3d 20  ntities_count = 
29520 30 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 63 61  0;...}....if (ca
29530 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
29540 44 5d 2e 6c 61 62 65 6c 20 21 3d 20 4e 55 4c 4c  D].label != NULL
29550 29 20 7b 0a 09 09 09 66 72 65 65 28 63 61 63 6b  ) {....free(cack
29560 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
29570 2e 6c 61 62 65 6c 29 3b 0a 09 09 09 63 61 63 6b  .label);....cack
29580 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
29590 2e 6c 61 62 65 6c 20 3d 20 4e 55 4c 4c 3b 0a 09  .label = NULL;..
295a0 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 61 72  .}....cackey_mar
295b0 6b 5f 73 6c 6f 74 5f 72 65 73 65 74 28 26 63 61  k_slot_reset(&ca
295c0 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
295d0 44 5d 29 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c  D]);...cackey_sl
295e0 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 73 6c 6f 74  ots[slotID].slot
295f0 5f 72 65 73 65 74 20 3d 20 30 3b 0a 09 7d 0a 0a  _reset = 0;..}..
29600 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73  .if (cackey_sess
29610 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69  ions[hSession].i
29620 64 65 6e 74 69 74 69 65 73 20 3d 3d 20 4e 55 4c  dentities == NUL
29630 4c 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 73 65  L) {...cackey_se
29640 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
29650 2e 69 64 65 6e 74 69 74 69 65 73 20 3d 20 63 61  .identities = ca
29660 63 6b 65 79 5f 72 65 61 64 5f 69 64 65 6e 74 69  ckey_read_identi
29670 74 69 65 73 28 26 63 61 63 6b 65 79 5f 73 6c 6f  ties(&cackey_slo
29680 74 73 5b 73 6c 6f 74 49 44 5d 2c 20 26 63 61 63  ts[slotID], &cac
29690 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
296a0 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65  ssion].identitie
296b0 73 5f 63 6f 75 6e 74 29 3b 0a 09 7d 0a 0a 09 69  s_count);..}...i
296c0 66 20 28 70 54 65 6d 70 6c 61 74 65 20 21 3d 20  f (pTemplate != 
296d0 4e 55 4c 4c 29 20 7b 0a 09 09 69 66 20 28 75 6c  NULL) {...if (ul
296e0 43 6f 75 6e 74 20 21 3d 20 30 29 20 7b 0a 09 09  Count != 0) {...
296f0 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
29700 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63  [hSession].searc
29710 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74 20 3d 20  h_query_count = 
29720 75 6c 43 6f 75 6e 74 3b 0a 09 09 09 63 61 63 6b  ulCount;....cack
29730 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
29740 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65  sion].search_que
29750 72 79 20 3d 20 6d 61 6c 6c 6f 63 28 75 6c 43 6f  ry = malloc(ulCo
29760 75 6e 74 20 2a 20 73 69 7a 65 6f 66 28 2a 70 54  unt * sizeof(*pT
29770 65 6d 70 6c 61 74 65 29 29 3b 0a 0a 09 09 09 6d  emplate));.....m
29780 65 6d 63 70 79 28 63 61 63 6b 65 79 5f 73 65 73  emcpy(cackey_ses
29790 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
297a0 73 65 61 72 63 68 5f 71 75 65 72 79 2c 20 70 54  search_query, pT
297b0 65 6d 70 6c 61 74 65 2c 20 75 6c 43 6f 75 6e 74  emplate, ulCount
297c0 20 2a 20 73 69 7a 65 6f 66 28 2a 70 54 65 6d 70   * sizeof(*pTemp
297d0 6c 61 74 65 29 29 3b 0a 09 09 09 66 6f 72 20 28  late));....for (
297e0 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 75  idx = 0; idx < u
297f0 6c 43 6f 75 6e 74 3b 20 69 64 78 2b 2b 29 20 7b  lCount; idx++) {
29800 0a 09 09 09 09 69 66 20 28 70 54 65 6d 70 6c 61  .....if (pTempla
29810 74 65 5b 69 64 78 5d 2e 75 6c 56 61 6c 75 65 4c  te[idx].ulValueL
29820 65 6e 20 3d 3d 20 30 29 20 7b 0a 09 09 09 09 09  en == 0) {......
29830 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
29840 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68  hSession].search
29850 5f 71 75 65 72 79 5b 69 64 78 5d 2e 70 56 61 6c  _query[idx].pVal
29860 75 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09  ue = NULL;......
29870 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 09 7d  .continue;.....}
29880 0a 0a 09 09 09 09 63 61 63 6b 65 79 5f 73 65 73  ......cackey_ses
29890 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
298a0 73 65 61 72 63 68 5f 71 75 65 72 79 5b 69 64 78  search_query[idx
298b0 5d 2e 70 56 61 6c 75 65 20 3d 20 6d 61 6c 6c 6f  ].pValue = mallo
298c0 63 28 70 54 65 6d 70 6c 61 74 65 5b 69 64 78 5d  c(pTemplate[idx]
298d0 2e 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09  .ulValueLen);...
298e0 09 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65  ...if (cackey_se
298f0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
29900 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5b 69 64  .search_query[id
29910 78 5d 2e 70 56 61 6c 75 65 29 20 7b 0a 09 09 09  x].pValue) {....
29920 09 09 6d 65 6d 63 70 79 28 63 61 63 6b 65 79 5f  ..memcpy(cackey_
29930 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
29940 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5b  n].search_query[
29950 69 64 78 5d 2e 70 56 61 6c 75 65 2c 20 70 54 65  idx].pValue, pTe
29960 6d 70 6c 61 74 65 5b 69 64 78 5d 2e 70 56 61 6c  mplate[idx].pVal
29970 75 65 2c 20 70 54 65 6d 70 6c 61 74 65 5b 69 64  ue, pTemplate[id
29980 78 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a  x].ulValueLen);.
29990 09 09 09 09 7d 0a 09 09 09 7d 0a 09 09 7d 20 65  ....}....}...} e
299a0 6c 73 65 20 7b 0a 09 09 09 63 61 63 6b 65 79 5f  lse {....cackey_
299b0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
299c0 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5f  n].search_query_
299d0 63 6f 75 6e 74 20 3d 20 30 3b 0a 09 09 09 63 61  count = 0;....ca
299e0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
299f0 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71  ession].search_q
29a00 75 65 72 79 20 3d 20 4e 55 4c 4c 3b 0a 09 09 7d  uery = NULL;...}
29a10 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69 66 20  ..} else {...if 
29a20 28 75 6c 43 6f 75 6e 74 20 21 3d 20 30 29 20 7b  (ulCount != 0) {
29a30 0a 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  ....cackey_mutex
29a40 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
29a50 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 09 43 41 43  iglock);.....CAC
29a60 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
29a70 28 22 45 72 72 6f 72 2e 20 20 53 65 61 72 63 68  ("Error.  Search
29a80 20 71 75 65 72 79 20 73 70 65 63 69 66 69 65 64   query specified
29a90 20 61 73 20 4e 55 4c 4c 2c 20 62 75 74 20 6e 75   as NULL, but nu
29aa0 6d 62 65 72 20 6f 66 20 71 75 65 72 79 20 74 65  mber of query te
29ab0 72 6d 73 20 6e 6f 74 20 73 70 65 63 69 66 69 65  rms not specifie
29ac0 64 20 61 73 20 30 2e 22 29 3b 0a 0a 09 09 09 72  d as 0.");.....r
29ad0 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45  eturn(CKR_ARGUME
29ae0 4e 54 53 5f 42 41 44 29 3b 0a 09 09 7d 0a 0a 09  NTS_BAD);...}...
29af0 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
29b00 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63  [hSession].searc
29b10 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74 20 3d 20  h_query_count = 
29b20 30 3b 0a 09 09 63 61 63 6b 65 79 5f 73 65 73 73  0;...cackey_sess
29b30 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
29b40 65 61 72 63 68 5f 71 75 65 72 79 20 3d 20 4e 55  earch_query = NU
29b50 4c 4c 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f  LL;..}...cackey_
29b60 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
29b70 6e 5d 2e 73 65 61 72 63 68 5f 61 63 74 69 76 65  n].search_active
29b80 20 3d 20 31 3b 0a 09 63 61 63 6b 65 79 5f 73 65   = 1;..cackey_se
29b90 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
29ba0 2e 73 65 61 72 63 68 5f 63 75 72 72 5f 69 64 20  .search_curr_id 
29bb0 3d 20 30 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74  = 0;...mutex_ret
29bc0 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
29bd0 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
29be0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
29bf0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
29c00 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
29c10 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
29c20 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61  r.  Unlocking fa
29c30 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
29c40 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
29c50 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  RROR);..}...CACK
29c60 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
29c70 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
29c80 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29  K (%i)", CKR_OK)
29c90 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ;...return(CKR_O
29ca0 4b 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e  K);.}..static in
29cb0 74 20 63 61 63 6b 65 79 5f 70 6b 63 73 31 31 5f  t cackey_pkcs11_
29cc0 63 6f 6d 70 61 72 65 5f 61 74 74 72 69 62 75 74  compare_attribut
29cd0 65 73 28 43 4b 5f 41 54 54 52 49 42 55 54 45 20  es(CK_ATTRIBUTE 
29ce0 2a 61 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45  *a, CK_ATTRIBUTE
29cf0 20 2a 62 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64   *b) {..unsigned
29d00 20 63 68 61 72 20 2a 73 6d 61 6c 6c 62 75 66 2c   char *smallbuf,
29d10 20 2a 6c 61 72 67 65 62 75 66 3b 0a 09 73 69 7a   *largebuf;..siz
29d20 65 5f 74 20 73 6d 61 6c 6c 62 75 66 5f 6c 65 6e  e_t smallbuf_len
29d30 2c 20 6c 61 72 67 65 62 75 66 5f 6c 65 6e 3b 0a  , largebuf_len;.
29d40 0a 09 69 66 20 28 61 2d 3e 74 79 70 65 20 21 3d  ..if (a->type !=
29d50 20 62 2d 3e 74 79 70 65 29 20 7b 0a 09 09 72 65   b->type) {...re
29d60 74 75 72 6e 28 30 29 3b 0a 09 7d 0a 0a 09 43 41  turn(0);..}...CA
29d70 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
29d80 46 28 22 20 20 20 20 2e 2e 2e 20 66 6f 75 6e 64  F("    ... found
29d90 20 6d 61 74 63 68 69 6e 67 20 74 79 70 65 20 2e   matching type .
29da0 2e 2e 22 29 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  ..");...CACKEY_D
29db0 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22 20  EBUG_PRINTBUF(" 
29dc0 20 20 20 2e 2e 2e 20 6f 75 72 20 76 61 6c 75 65     ... our value
29dd0 3a 22 2c 20 61 2d 3e 70 56 61 6c 75 65 2c 20 61  :", a->pValue, a
29de0 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a  ->ulValueLen);..
29df0 09 69 66 20 28 62 2d 3e 70 56 61 6c 75 65 20 3d  .if (b->pValue =
29e00 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
29e10 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
29e20 22 20 20 20 20 20 20 20 2e 2e 2e 20 66 6f 75 6e  "       ... foun
29e30 64 20 77 69 6c 64 63 61 72 64 20 6d 61 74 63 68  d wildcard match
29e40 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 31 29  ");....return(1)
29e50 3b 0a 09 7d 0a 0a 09 69 66 20 28 61 2d 3e 70 56  ;..}...if (a->pV
29e60 61 6c 75 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  alue == NULL) {.
29e70 09 09 72 65 74 75 72 6e 28 30 29 3b 0a 09 7d 0a  ..return(0);..}.
29e80 0a 20 09 69 66 20 28 62 2d 3e 75 6c 56 61 6c 75  . .if (b->ulValu
29e90 65 4c 65 6e 20 3d 3d 20 61 2d 3e 75 6c 56 61 6c  eLen == a->ulVal
29ea0 75 65 4c 65 6e 20 26 26 20 6d 65 6d 63 6d 70 28  ueLen && memcmp(
29eb0 61 2d 3e 70 56 61 6c 75 65 2c 20 62 2d 3e 70 56  a->pValue, b->pV
29ec0 61 6c 75 65 2c 20 62 2d 3e 75 6c 56 61 6c 75 65  alue, b->ulValue
29ed0 4c 65 6e 29 20 3d 3d 20 30 29 20 7b 0a 09 09 43  Len) == 0) {...C
29ee0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
29ef0 54 46 28 22 20 20 20 20 20 20 20 2e 2e 2e 20 66  TF("       ... f
29f00 6f 75 6e 64 20 65 78 61 63 74 20 6d 61 74 63 68  ound exact match
29f10 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 31 29  ");....return(1)
29f20 3b 0a 09 7d 0a 0a 09 73 77 69 74 63 68 20 28 61  ;..}...switch (a
29f30 2d 3e 74 79 70 65 29 20 7b 0a 09 09 63 61 73 65  ->type) {...case
29f40 20 43 4b 41 5f 4d 4f 44 55 4c 55 53 3a 0a 09 09   CKA_MODULUS:...
29f50 09 69 66 20 28 61 2d 3e 75 6c 56 61 6c 75 65 4c  .if (a->ulValueL
29f60 65 6e 20 3d 3d 20 62 2d 3e 75 6c 56 61 6c 75 65  en == b->ulValue
29f70 4c 65 6e 29 20 7b 0a 09 09 09 09 62 72 65 61 6b  Len) {.....break
29f80 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 61  ;....}.....if (a
29f90 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 20 3e 20 62  ->ulValueLen > b
29fa0 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 29 20 7b 0a  ->ulValueLen) {.
29fb0 09 09 09 09 73 6d 61 6c 6c 62 75 66 20 3d 20 62  ....smallbuf = b
29fc0 2d 3e 70 56 61 6c 75 65 3b 0a 09 09 09 09 73 6d  ->pValue;.....sm
29fd0 61 6c 6c 62 75 66 5f 6c 65 6e 20 3d 20 62 2d 3e  allbuf_len = b->
29fe0 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 0a 09 09 09  ulValueLen;.....
29ff0 09 6c 61 72 67 65 62 75 66 20 3d 20 61 2d 3e 70  .largebuf = a->p
2a000 56 61 6c 75 65 3b 0a 09 09 09 09 6c 61 72 67 65  Value;.....large
2a010 62 75 66 5f 6c 65 6e 20 3d 20 61 2d 3e 75 6c 56  buf_len = a->ulV
2a020 61 6c 75 65 4c 65 6e 3b 0a 09 09 09 7d 20 65 6c  alueLen;....} el
2a030 73 65 20 7b 0a 09 09 09 09 73 6d 61 6c 6c 62 75  se {.....smallbu
2a040 66 20 3d 20 61 2d 3e 70 56 61 6c 75 65 3b 0a 09  f = a->pValue;..
2a050 09 09 09 73 6d 61 6c 6c 62 75 66 5f 6c 65 6e 20  ...smallbuf_len 
2a060 3d 20 61 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 3b  = a->ulValueLen;
2a070 0a 0a 09 09 09 09 6c 61 72 67 65 62 75 66 20 3d  ......largebuf =
2a080 20 62 2d 3e 70 56 61 6c 75 65 3b 0a 09 09 09 09   b->pValue;.....
2a090 6c 61 72 67 65 62 75 66 5f 6c 65 6e 20 3d 20 62  largebuf_len = b
2a0a0 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 09 09  ->ulValueLen;...
2a0b0 09 7d 0a 0a 09 09 09 66 6f 72 20 28 3b 20 6c 61  .}.....for (; la
2a0c0 72 67 65 62 75 66 5f 6c 65 6e 20 21 3d 20 73 6d  rgebuf_len != sm
2a0d0 61 6c 6c 62 75 66 5f 6c 65 6e 3b 20 6c 61 72 67  allbuf_len; larg
2a0e0 65 62 75 66 2b 2b 2c 6c 61 72 67 65 62 75 66 5f  ebuf++,largebuf_
2a0f0 6c 65 6e 2d 2d 29 20 7b 0a 09 09 09 09 69 66 20  len--) {.....if 
2a100 28 6c 61 72 67 65 62 75 66 5b 30 5d 20 21 3d 20  (largebuf[0] != 
2a110 30 29 20 7b 0a 09 09 09 09 09 62 72 65 61 6b 3b  0) {......break;
2a120 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 09  .....}....}.....
2a130 69 66 20 28 6c 61 72 67 65 62 75 66 5f 6c 65 6e  if (largebuf_len
2a140 20 21 3d 20 73 6d 61 6c 6c 62 75 66 5f 6c 65 6e   != smallbuf_len
2a150 29 20 7b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  ) {.....break;..
2a160 09 09 7d 0a 0a 09 09 09 69 66 20 28 6d 65 6d 63  ..}.....if (memc
2a170 6d 70 28 6c 61 72 67 65 62 75 66 2c 20 73 6d 61  mp(largebuf, sma
2a180 6c 6c 62 75 66 2c 20 73 6d 61 6c 6c 62 75 66 5f  llbuf, smallbuf_
2a190 6c 65 6e 29 20 3d 3d 20 30 29 20 7b 0a 09 09 09  len) == 0) {....
2a1a0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2a1b0 49 4e 54 46 28 22 20 20 20 20 20 20 20 2e 2e 2e  INTF("       ...
2a1c0 20 66 6f 75 6e 64 20 61 70 70 72 6f 78 69 6d 61   found approxima
2a1d0 74 65 20 6d 61 74 63 68 22 29 3b 0a 0a 09 09 09  te match");.....
2a1e0 09 72 65 74 75 72 6e 28 31 29 3b 0a 09 09 09 7d  .return(1);....}
2a1f0 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a  .....break;..}..
2a200 09 72 65 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a 43  .return(0);.}..C
2a210 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
2a220 4e 28 43 4b 5f 52 56 2c 20 43 5f 46 69 6e 64 4f  N(CK_RV, C_FindO
2a230 62 6a 65 63 74 73 29 28 43 4b 5f 53 45 53 53 49  bjects)(CK_SESSI
2a240 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
2a250 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41  on, CK_OBJECT_HA
2a260 4e 44 4c 45 5f 50 54 52 20 70 68 4f 62 6a 65 63  NDLE_PTR phObjec
2a270 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 4d 61  t, CK_ULONG ulMa
2a280 78 4f 62 6a 65 63 74 43 6f 75 6e 74 2c 20 43 4b  xObjectCount, CK
2a290 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 4f 62  _ULONG_PTR pulOb
2a2a0 6a 65 63 74 43 6f 75 6e 74 29 20 7b 0a 09 73 74  jectCount) {..st
2a2b0 72 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e  ruct cackey_iden
2a2c0 74 69 74 79 20 2a 63 75 72 72 5f 69 64 3b 0a 09  tity *curr_id;..
2a2d0 43 4b 5f 41 54 54 52 49 42 55 54 45 20 2a 63 75  CK_ATTRIBUTE *cu
2a2e0 72 72 5f 61 74 74 72 3b 0a 09 43 4b 5f 55 4c 4f  rr_attr;..CK_ULO
2a2f0 4e 47 20 63 75 72 72 5f 69 64 5f 69 64 78 2c 20  NG curr_id_idx, 
2a300 63 75 72 72 5f 6f 75 74 5f 69 64 5f 69 64 78 2c  curr_out_id_idx,
2a310 20 63 75 72 72 5f 61 74 74 72 5f 69 64 78 2c 20   curr_attr_idx, 
2a320 73 65 73 73 5f 61 74 74 72 5f 69 64 78 3b 0a 09  sess_attr_idx;..
2a330 43 4b 5f 55 4c 4f 4e 47 20 6d 61 74 63 68 65 64  CK_ULONG matched
2a340 5f 63 6f 75 6e 74 2c 20 70 72 65 76 5f 6d 61 74  _count, prev_mat
2a350 63 68 65 64 5f 63 6f 75 6e 74 3b 0a 09 69 6e 74  ched_count;..int
2a360 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 23   mutex_retval;.#
2a370 69 66 64 65 66 20 43 41 43 4b 45 59 5f 44 45 42  ifdef CACKEY_DEB
2a380 55 47 5f 53 45 41 52 43 48 5f 53 50 45 45 44 54  UG_SEARCH_SPEEDT
2a390 45 53 54 0a 09 73 74 72 75 63 74 20 74 69 6d 65  EST..struct time
2a3a0 76 61 6c 20 73 74 61 72 74 2c 20 65 6e 64 3b 0a  val start, end;.
2a3b0 09 75 69 6e 74 36 34 5f 74 20 73 74 61 72 74 5f  .uint64_t start_
2a3c0 69 6e 74 2c 20 65 6e 64 5f 69 6e 74 3b 0a 23 65  int, end_int;.#e
2a3d0 6e 64 69 66 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ndif...CACKEY_DE
2a3e0 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
2a3f0 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
2a400 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
2a410 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
2a420 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2a430 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
2a440 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
2a450 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
2a460 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
2a470 09 7d 0a 0a 09 69 66 20 28 70 75 6c 4f 62 6a 65  .}...if (pulObje
2a480 63 74 43 6f 75 6e 74 20 3d 3d 20 4e 55 4c 4c 29  ctCount == NULL)
2a490 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
2a4a0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2a4b0 20 20 70 75 6c 4f 62 6a 65 63 74 43 6f 75 6e 74    pulObjectCount
2a4c0 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09   is NULL.");....
2a4d0 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d  return(CKR_ARGUM
2a4e0 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09  ENTS_BAD);..}...
2a4f0 69 66 20 28 70 68 4f 62 6a 65 63 74 20 3d 3d 20  if (phObject == 
2a500 4e 55 4c 4c 20 26 26 20 75 6c 4d 61 78 4f 62 6a  NULL && ulMaxObj
2a510 65 63 74 43 6f 75 6e 74 20 3d 3d 20 30 29 20 7b  ectCount == 0) {
2a520 0a 09 09 2f 2a 20 53 68 6f 72 74 20 63 69 72 63  .../* Short circ
2a530 75 69 74 2c 20 69 66 20 7a 65 72 6f 20 6f 62 6a  uit, if zero obj
2a540 65 63 74 73 20 77 65 72 65 20 73 70 65 63 69 66  ects were specif
2a550 69 65 64 20 72 65 74 75 72 6e 20 7a 65 72 6f 20  ied return zero 
2a560 69 74 65 6d 73 20 69 6d 6d 65 64 69 61 74 65 6c  items immediatel
2a570 79 20 2a 2f 0a 09 09 2a 70 75 6c 4f 62 6a 65 63  y */...*pulObjec
2a580 74 43 6f 75 6e 74 20 3d 20 30 3b 0a 0a 09 09 43  tCount = 0;....C
2a590 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2a5a0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
2a5b0 52 5f 4f 4b 20 28 25 69 29 20 28 73 68 6f 72 74  R_OK (%i) (short
2a5c0 20 63 69 72 63 75 69 74 29 22 2c 20 43 4b 52 5f   circuit)", CKR_
2a5d0 4f 4b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  OK);....return(C
2a5e0 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66 20  KR_OK);..}...if 
2a5f0 28 70 68 4f 62 6a 65 63 74 20 3d 3d 20 4e 55 4c  (phObject == NUL
2a600 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
2a610 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2a620 72 2e 20 20 70 68 4f 62 6a 65 63 74 20 69 73 20  r.  phObject is 
2a630 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75  NULL.");....retu
2a640 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53  rn(CKR_ARGUMENTS
2a650 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  _BAD);..}...if (
2a660 75 6c 4d 61 78 4f 62 6a 65 63 74 43 6f 75 6e 74  ulMaxObjectCount
2a670 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   == 0) {...CACKE
2a680 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2a690 45 72 72 6f 72 2e 20 20 4d 61 78 69 6d 75 6d 20  Error.  Maximum 
2a6a0 6e 75 6d 62 65 72 20 6f 66 20 6f 62 6a 65 63 74  number of object
2a6b0 73 20 73 70 65 63 69 66 69 65 64 20 61 73 20 7a  s specified as z
2a6c0 65 72 6f 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  ero.");....retur
2a6d0 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f  n(CKR_ARGUMENTS_
2a6e0 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68  BAD);..}...if (h
2a6f0 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20  Session == 0 || 
2a700 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a  hSession >= (siz
2a710 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
2a720 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ons) / sizeof(ca
2a730 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d  ckey_sessions[0]
2a740 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ))) {...CACKEY_D
2a750 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2a760 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74  or.  Session out
2a770 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09   of range.");...
2a780 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
2a790 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56  SSION_HANDLE_INV
2a7a0 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65  ALID);..}...mute
2a7b0 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
2a7c0 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63  y_mutex_lock(cac
2a7d0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
2a7e0 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
2a7f0 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
2a800 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2a810 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66  rror.  Locking f
2a820 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
2a830 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
2a840 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20  ERROR);..}...if 
2a850 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  (!cackey_session
2a860 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69  s[hSession].acti
2a870 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d  ve) {...cackey_m
2a880 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
2a890 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
2a8a0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2a8b0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73  NTF("Error.  Ses
2a8c0 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e  sion not active.
2a8d0 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
2a8e0 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  CKR_SESSION_HAND
2a8f0 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  LE_INVALID);..}.
2a900 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65  ..if (!cackey_se
2a910 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
2a920 2e 73 65 61 72 63 68 5f 61 63 74 69 76 65 29 20  .search_active) 
2a930 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  {...cackey_mutex
2a940 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
2a950 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b  iglock);....CACK
2a960 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2a970 22 45 72 72 6f 72 2e 20 20 53 65 61 72 63 68 20  "Error.  Search 
2a980 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09  not active.");..
2a990 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ....return(CKR_O
2a9a0 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49  PERATION_NOT_INI
2a9b0 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 23  TIALIZED);..}..#
2a9c0 69 66 64 65 66 20 43 41 43 4b 45 59 5f 44 45 42  ifdef CACKEY_DEB
2a9d0 55 47 5f 53 45 41 52 43 48 5f 53 50 45 45 44 54  UG_SEARCH_SPEEDT
2a9e0 45 53 54 0a 09 67 65 74 74 69 6d 65 6f 66 64 61  EST..gettimeofda
2a9f0 79 28 26 73 74 61 72 74 2c 20 4e 55 4c 4c 29 3b  y(&start, NULL);
2aa00 0a 23 65 6e 64 69 66 0a 0a 09 63 75 72 72 5f 6f  .#endif...curr_o
2aa10 75 74 5f 69 64 5f 69 64 78 20 3d 20 30 3b 0a 09  ut_id_idx = 0;..
2aa20 66 6f 72 20 28 63 75 72 72 5f 69 64 5f 69 64 78  for (curr_id_idx
2aa30 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   = cackey_sessio
2aa40 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61  ns[hSession].sea
2aa50 72 63 68 5f 63 75 72 72 5f 69 64 3b 20 63 75 72  rch_curr_id; cur
2aa60 72 5f 69 64 5f 69 64 78 20 3c 20 63 61 63 6b 65  r_id_idx < cacke
2aa70 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
2aa80 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f  ion].identities_
2aa90 63 6f 75 6e 74 20 26 26 20 75 6c 4d 61 78 4f 62  count && ulMaxOb
2aaa0 6a 65 63 74 43 6f 75 6e 74 3b 20 63 75 72 72 5f  jectCount; curr_
2aab0 69 64 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 63 75  id_idx++) {...cu
2aac0 72 72 5f 69 64 20 3d 20 26 63 61 63 6b 65 79 5f  rr_id = &cackey_
2aad0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
2aae0 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5b 63 75  n].identities[cu
2aaf0 72 72 5f 69 64 5f 69 64 78 5d 3b 0a 0a 09 09 43  rr_id_idx];....C
2ab00 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2ab10 54 46 28 22 50 72 6f 63 65 73 73 69 6e 67 20 69  TF("Processing i
2ab20 64 65 6e 74 69 74 79 3a 25 6c 75 22 2c 20 28 75  dentity:%lu", (u
2ab30 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75  nsigned long) cu
2ab40 72 72 5f 69 64 5f 69 64 78 29 3b 0a 0a 09 09 6d  rr_id_idx);....m
2ab50 61 74 63 68 65 64 5f 63 6f 75 6e 74 20 3d 20 30  atched_count = 0
2ab60 3b 0a 0a 09 09 66 6f 72 20 28 63 75 72 72 5f 61  ;....for (curr_a
2ab70 74 74 72 5f 69 64 78 20 3d 20 30 3b 20 63 75 72  ttr_idx = 0; cur
2ab80 72 5f 61 74 74 72 5f 69 64 78 20 3c 20 63 61 63  r_attr_idx < cac
2ab90 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
2aba0 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75  ssion].search_qu
2abb0 65 72 79 5f 63 6f 75 6e 74 3b 20 63 75 72 72 5f  ery_count; curr_
2abc0 61 74 74 72 5f 69 64 78 2b 2b 29 20 7b 0a 09 09  attr_idx++) {...
2abd0 09 70 72 65 76 5f 6d 61 74 63 68 65 64 5f 63 6f  .prev_matched_co
2abe0 75 6e 74 20 3d 20 6d 61 74 63 68 65 64 5f 63 6f  unt = matched_co
2abf0 75 6e 74 3b 0a 0a 09 09 09 63 75 72 72 5f 61 74  unt;.....curr_at
2ac00 74 72 20 3d 20 26 63 61 63 6b 65 79 5f 73 65 73  tr = &cackey_ses
2ac10 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
2ac20 73 65 61 72 63 68 5f 71 75 65 72 79 5b 63 75 72  search_query[cur
2ac30 72 5f 61 74 74 72 5f 69 64 78 5d 3b 0a 0a 09 09  r_attr_idx];....
2ac40 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2ac50 49 4e 54 46 28 22 20 20 43 68 65 63 6b 69 6e 67  INTF("  Checking
2ac60 20 66 6f 72 20 61 74 74 72 69 62 75 74 65 20 25   for attribute %
2ac70 73 20 28 30 78 25 30 38 6c 78 29 20 69 6e 20 69  s (0x%08lx) in i
2ac80 64 65 6e 74 69 74 79 3a 25 69 2e 2e 2e 22 2c 20  dentity:%i...", 
2ac90 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e  CACKEY_DEBUG_FUN
2aca0 43 5f 41 54 54 52 49 42 55 54 45 5f 54 4f 5f 53  C_ATTRIBUTE_TO_S
2acb0 54 52 28 63 75 72 72 5f 61 74 74 72 2d 3e 74 79  TR(curr_attr->ty
2acc0 70 65 29 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  pe), (unsigned l
2acd0 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 2d 3e  ong) curr_attr->
2ace0 74 79 70 65 2c 20 28 69 6e 74 29 20 63 75 72 72  type, (int) curr
2acf0 5f 69 64 5f 69 64 78 29 3b 0a 09 09 09 43 41 43  _id_idx);....CAC
2ad00 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42  KEY_DEBUG_PRINTB
2ad10 55 46 28 22 20 20 20 20 56 61 6c 75 65 20 6c 6f  UF("    Value lo
2ad20 6f 6b 69 6e 67 20 66 6f 72 3a 22 2c 20 63 75 72  oking for:", cur
2ad30 72 5f 61 74 74 72 2d 3e 70 56 61 6c 75 65 2c 20  r_attr->pValue, 
2ad40 63 75 72 72 5f 61 74 74 72 2d 3e 75 6c 56 61 6c  curr_attr->ulVal
2ad50 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 66 6f 72 20  ueLen);.....for 
2ad60 28 73 65 73 73 5f 61 74 74 72 5f 69 64 78 20 3d  (sess_attr_idx =
2ad70 20 30 3b 20 73 65 73 73 5f 61 74 74 72 5f 69 64   0; sess_attr_id
2ad80 78 20 3c 20 63 75 72 72 5f 69 64 2d 3e 61 74 74  x < curr_id->att
2ad90 72 69 62 75 74 65 73 5f 63 6f 75 6e 74 3b 20 73  ributes_count; s
2ada0 65 73 73 5f 61 74 74 72 5f 69 64 78 2b 2b 29 20  ess_attr_idx++) 
2adb0 7b 0a 09 09 09 09 69 66 20 28 63 61 63 6b 65 79  {.....if (cackey
2adc0 5f 70 6b 63 73 31 31 5f 63 6f 6d 70 61 72 65 5f  _pkcs11_compare_
2add0 61 74 74 72 69 62 75 74 65 73 28 26 63 75 72 72  attributes(&curr
2ade0 5f 69 64 2d 3e 61 74 74 72 69 62 75 74 65 73 5b  _id->attributes[
2adf0 73 65 73 73 5f 61 74 74 72 5f 69 64 78 5d 2c 20  sess_attr_idx], 
2ae00 63 75 72 72 5f 61 74 74 72 29 29 20 7b 0a 09 09  curr_attr)) {...
2ae10 09 09 09 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74  ...matched_count
2ae20 2b 2b 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b  ++;.......break;
2ae30 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 09  .....}....}.....
2ae40 2f 2a 20 49 66 20 74 68 65 20 61 74 74 72 69 62  /* If the attrib
2ae50 75 74 65 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65  ute could not be
2ae60 20 6d 61 74 63 68 65 64 2c 20 64 6f 20 6e 6f 74   matched, do not
2ae70 20 74 72 79 20 74 6f 20 6d 61 74 63 68 20 61 64   try to match ad
2ae80 64 69 74 69 6f 6e 61 6c 20 61 74 74 72 69 62 75  ditional attribu
2ae90 74 65 73 20 2a 2f 0a 09 09 09 69 66 20 28 70 72  tes */....if (pr
2aea0 65 76 5f 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74  ev_matched_count
2aeb0 20 3d 3d 20 6d 61 74 63 68 65 64 5f 63 6f 75 6e   == matched_coun
2aec0 74 29 20 7b 0a 09 09 09 09 62 72 65 61 6b 3b 0a  t) {.....break;.
2aed0 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 69 66 20 28  ...}...}....if (
2aee0 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 20 3d 3d  matched_count ==
2aef0 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73   cackey_sessions
2af00 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63  [hSession].searc
2af10 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74 29 20 7b  h_query_count) {
2af20 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
2af30 5f 50 52 49 4e 54 46 28 22 20 20 2e 2e 2e 20 41  _PRINTF("  ... A
2af40 6c 6c 20 25 69 20 61 74 74 72 69 62 75 74 65 73  ll %i attributes
2af50 20 63 68 65 63 6b 65 64 20 66 6f 72 20 66 6f 75   checked for fou
2af60 6e 64 2c 20 61 64 64 69 6e 67 20 69 64 65 6e 74  nd, adding ident
2af70 69 74 79 3a 25 69 20 74 6f 20 72 65 74 75 72 6e  ity:%i to return
2af80 65 64 20 6c 69 73 74 22 2c 20 28 69 6e 74 29 20  ed list", (int) 
2af90 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2afa0 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68  hSession].search
2afb0 5f 71 75 65 72 79 5f 63 6f 75 6e 74 2c 20 28 69  _query_count, (i
2afc0 6e 74 29 20 63 75 72 72 5f 69 64 5f 69 64 78 29  nt) curr_id_idx)
2afd0 3b 0a 0a 09 09 09 70 68 4f 62 6a 65 63 74 5b 63  ;.....phObject[c
2afe0 75 72 72 5f 6f 75 74 5f 69 64 5f 69 64 78 5d 20  urr_out_id_idx] 
2aff0 3d 20 63 75 72 72 5f 69 64 5f 69 64 78 20 2b 20  = curr_id_idx + 
2b000 31 3b 0a 0a 09 09 09 75 6c 4d 61 78 4f 62 6a 65  1;.....ulMaxObje
2b010 63 74 43 6f 75 6e 74 2d 2d 3b 0a 0a 09 09 09 63  ctCount--;.....c
2b020 75 72 72 5f 6f 75 74 5f 69 64 5f 69 64 78 2b 2b  urr_out_id_idx++
2b030 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ;...} else {....
2b040 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2b050 4e 54 46 28 22 20 20 2e 2e 2e 20 4e 6f 74 20 61  NTF("  ... Not a
2b060 6c 6c 20 25 69 20 28 6f 6e 6c 79 20 66 6f 75 6e  ll %i (only foun
2b070 64 20 25 69 29 20 61 74 74 72 69 62 75 74 65 73  d %i) attributes
2b080 20 63 68 65 63 6b 65 64 20 66 6f 72 20 66 6f 75   checked for fou
2b090 6e 64 2c 20 6e 6f 74 20 61 64 64 69 6e 67 20 69  nd, not adding i
2b0a0 64 65 6e 74 69 74 79 3a 25 69 22 2c 20 28 69 6e  dentity:%i", (in
2b0b0 74 29 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  t) cackey_sessio
2b0c0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61  ns[hSession].sea
2b0d0 72 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74 2c  rch_query_count,
2b0e0 20 28 69 6e 74 29 20 6d 61 74 63 68 65 64 5f 63   (int) matched_c
2b0f0 6f 75 6e 74 2c 20 28 69 6e 74 29 20 63 75 72 72  ount, (int) curr
2b100 5f 69 64 5f 69 64 78 29 3b 0a 09 09 7d 0a 09 7d  _id_idx);...}..}
2b110 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
2b120 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72  s[hSession].sear
2b130 63 68 5f 63 75 72 72 5f 69 64 20 3d 20 63 75 72  ch_curr_id = cur
2b140 72 5f 69 64 5f 69 64 78 3b 0a 09 2a 70 75 6c 4f  r_id_idx;..*pulO
2b150 62 6a 65 63 74 43 6f 75 6e 74 20 3d 20 63 75 72  bjectCount = cur
2b160 72 5f 6f 75 74 5f 69 64 5f 69 64 78 3b 0a 0a 23  r_out_id_idx;..#
2b170 69 66 64 65 66 20 43 41 43 4b 45 59 5f 44 45 42  ifdef CACKEY_DEB
2b180 55 47 5f 53 45 41 52 43 48 5f 53 50 45 45 44 54  UG_SEARCH_SPEEDT
2b190 45 53 54 0a 09 67 65 74 74 69 6d 65 6f 66 64 61  EST..gettimeofda
2b1a0 79 28 26 65 6e 64 2c 20 4e 55 4c 4c 29 3b 0a 09  y(&end, NULL);..
2b1b0 73 74 61 72 74 5f 69 6e 74 20 3d 20 28 73 74 61  start_int = (sta
2b1c0 72 74 2e 74 76 5f 73 65 63 20 2a 20 31 30 30 30  rt.tv_sec * 1000
2b1d0 30 30 30 29 20 2b 20 73 74 61 72 74 2e 74 76 5f  000) + start.tv_
2b1e0 75 73 65 63 3b 0a 09 65 6e 64 5f 69 6e 74 20 3d  usec;..end_int =
2b1f0 20 28 65 6e 64 2e 74 76 5f 73 65 63 20 2a 20 31   (end.tv_sec * 1
2b200 30 30 30 30 30 30 29 20 2b 20 65 6e 64 2e 74 76  000000) + end.tv
2b210 5f 75 73 65 63 3b 0a 09 66 70 72 69 6e 74 66 28  _usec;..fprintf(
2b220 73 74 64 65 72 72 2c 20 22 53 65 61 72 63 68 20  stderr, "Search 
2b230 74 6f 6f 6b 20 25 6c 75 20 6d 69 63 72 6f 73 65  took %lu microse
2b240 63 6f 6e 64 73 5c 6e 22 2c 20 28 75 6e 73 69 67  conds\n", (unsig
2b250 6e 65 64 20 6c 6f 6e 67 29 20 28 65 6e 64 5f 69  ned long) (end_i
2b260 6e 74 20 2d 20 73 74 61 72 74 5f 69 6e 74 29 29  nt - start_int))
2b270 3b 0a 23 65 6e 64 69 66 0a 0a 09 6d 75 74 65 78  ;.#endif...mutex
2b280 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
2b290 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
2b2a0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
2b2b0 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
2b2c0 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
2b2d0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2b2e0 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e  Error.  Unlockin
2b2f0 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
2b300 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
2b310 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
2b320 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2b330 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
2b340 4b 52 5f 4f 4b 20 28 25 69 29 2c 20 6e 75 6d 20  KR_OK (%i), num 
2b350 6f 62 6a 65 63 74 73 20 3d 20 25 6c 75 22 2c 20  objects = %lu", 
2b360 43 4b 52 5f 4f 4b 2c 20 2a 70 75 6c 4f 62 6a 65  CKR_OK, *pulObje
2b370 63 74 43 6f 75 6e 74 29 3b 0a 0a 09 72 65 74 75  ctCount);...retu
2b380 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43  rn(CKR_OK);.}..C
2b390 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
2b3a0 4e 28 43 4b 5f 52 56 2c 20 43 5f 46 69 6e 64 4f  N(CK_RV, C_FindO
2b3b0 62 6a 65 63 74 73 46 69 6e 61 6c 29 28 43 4b 5f  bjectsFinal)(CK_
2b3c0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
2b3d0 53 65 73 73 69 6f 6e 29 20 7b 0a 09 43 4b 5f 55  Session) {..CK_U
2b3e0 4c 4f 4e 47 20 69 64 78 3b 0a 09 69 6e 74 20 6d  LONG idx;..int m
2b3f0 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43  utex_retval;...C
2b400 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2b410 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
2b420 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
2b430 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
2b440 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2b450 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
2b460 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
2b470 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
2b480 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
2b490 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  LIZED);..}...if 
2b4a0 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c  (hSession == 0 |
2b4b0 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73  | hSession >= (s
2b4c0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
2b4d0 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28  sions) / sizeof(
2b4e0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2b4f0 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59  0]))) {...CACKEY
2b500 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2b510 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f  rror.  Session o
2b520 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a  ut of range.");.
2b530 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
2b540 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49  SESSION_HANDLE_I
2b550 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75  NVALID);..}...mu
2b560 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
2b570 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63  key_mutex_lock(c
2b580 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
2b590 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
2b5a0 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
2b5b0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2b5c0 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67  "Error.  Locking
2b5d0 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
2b5e0 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
2b5f0 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69  L_ERROR);..}...i
2b600 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69  f (!cackey_sessi
2b610 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63  ons[hSession].ac
2b620 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79  tive) {...cackey
2b630 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
2b640 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
2b650 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2b660 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
2b670 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76  ession not activ
2b680 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
2b690 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41  n(CKR_SESSION_HA
2b6a0 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
2b6b0 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  }...if (!cackey_
2b6c0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
2b6d0 6e 5d 2e 73 65 61 72 63 68 5f 61 63 74 69 76 65  n].search_active
2b6e0 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  ) {...cackey_mut
2b6f0 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
2b700 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41  _biglock);....CA
2b710 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2b720 46 28 22 45 72 72 6f 72 2e 20 20 53 65 61 72 63  F("Error.  Searc
2b730 68 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b  h not active.");
2b740 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
2b750 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49  _OPERATION_NOT_I
2b760 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
2b770 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
2b780 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72  s[hSession].sear
2b790 63 68 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a 0a  ch_active = 0;..
2b7a0 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69  .for (idx = 0; i
2b7b0 64 78 20 3c 20 63 61 63 6b 65 79 5f 73 65 73 73  dx < cackey_sess
2b7c0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
2b7d0 65 61 72 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e  earch_query_coun
2b7e0 74 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66  t; idx++) {...if
2b7f0 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e   (cackey_session
2b800 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72  s[hSession].sear
2b810 63 68 5f 71 75 65 72 79 5b 69 64 78 5d 2e 70 56  ch_query[idx].pV
2b820 61 6c 75 65 29 20 7b 0a 09 09 09 66 72 65 65 28  alue) {....free(
2b830 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2b840 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68  hSession].search
2b850 5f 71 75 65 72 79 5b 69 64 78 5d 2e 70 56 61 6c  _query[idx].pVal
2b860 75 65 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66  ue);...}..}...if
2b870 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e   (cackey_session
2b880 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72  s[hSession].sear
2b890 63 68 5f 71 75 65 72 79 29 20 7b 0a 09 09 66 72  ch_query) {...fr
2b8a0 65 65 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ee(cackey_sessio
2b8b0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61  ns[hSession].sea
2b8c0 72 63 68 5f 71 75 65 72 79 29 3b 0a 09 7d 0a 0a  rch_query);..}..
2b8d0 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
2b8e0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
2b8f0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
2b900 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
2b910 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
2b920 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2b930 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e  INTF("Error.  Un
2b940 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  locking failed."
2b950 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
2b960 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
2b970 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
2b980 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
2b990 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29  ning CKR_OK (%i)
2b9a0 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65  ", CKR_OK);...re
2b9b0 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a  turn(CKR_OK);.}.
2b9c0 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
2b9d0 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 45 6e 63  ION(CK_RV, C_Enc
2b9e0 72 79 70 74 49 6e 69 74 29 28 43 4b 5f 53 45 53  ryptInit)(CK_SES
2b9f0 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
2ba00 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49  sion, CK_MECHANI
2ba10 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73  SM_PTR pMechanis
2ba20 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e  m, CK_OBJECT_HAN
2ba30 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09 43 41 43  DLE hKey) {..CAC
2ba40 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2ba50 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
2ba60 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
2ba70 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
2ba80 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2ba90 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
2baa0 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
2bab0 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
2bac0 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
2bad0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
2bae0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2baf0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
2bb00 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
2bb10 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
2bb20 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
2bb30 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
2bb40 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
2bb50 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
2bb60 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
2bb70 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 45 6e  TION(CK_RV, C_En
2bb80 63 72 79 70 74 29 28 43 4b 5f 53 45 53 53 49 4f  crypt)(CK_SESSIO
2bb90 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
2bba0 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
2bbb0 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  Data, CK_ULONG u
2bbc0 6c 44 61 74 61 4c 65 6e 2c 20 43 4b 5f 42 59 54  lDataLen, CK_BYT
2bbd0 45 5f 50 54 52 20 70 45 6e 63 72 79 70 74 65 64  E_PTR pEncrypted
2bbe0 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50  Data, CK_ULONG_P
2bbf0 54 52 20 70 75 6c 45 6e 63 72 79 70 74 65 64 44  TR pulEncryptedD
2bc00 61 74 61 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45  ataLen) {..CACKE
2bc10 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2bc20 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
2bc30 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
2bc40 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
2bc50 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2bc60 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
2bc70 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
2bc80 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
2bc90 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
2bca0 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
2bcb0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
2bcc0 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
2bcd0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
2bce0 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
2bcf0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
2bd00 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
2bd10 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
2bd20 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
2bd30 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
2bd40 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 45 6e 63 72  ON(CK_RV, C_Encr
2bd50 79 70 74 55 70 64 61 74 65 29 28 43 4b 5f 53 45  yptUpdate)(CK_SE
2bd60 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
2bd70 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  ssion, CK_BYTE_P
2bd80 54 52 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f  TR pPart, CK_ULO
2bd90 4e 47 20 75 6c 50 61 72 74 4c 65 6e 2c 20 43 4b  NG ulPartLen, CK
2bda0 5f 42 59 54 45 5f 50 54 52 20 70 45 6e 63 72 79  _BYTE_PTR pEncry
2bdb0 70 74 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f  ptedPart, CK_ULO
2bdc0 4e 47 5f 50 54 52 20 70 75 6c 45 6e 63 72 79 70  NG_PTR pulEncryp
2bdd0 74 65 64 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43  tedPartLen) {..C
2bde0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2bdf0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
2be00 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
2be10 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
2be20 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2be30 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
2be40 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
2be50 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
2be60 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
2be70 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
2be80 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2be90 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
2bea0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
2beb0 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
2bec0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2bed0 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
2bee0 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
2bef0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
2bf00 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
2bf10 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
2bf20 45 6e 63 72 79 70 74 46 69 6e 61 6c 29 28 43 4b  EncryptFinal)(CK
2bf30 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
2bf40 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54  hSession, CK_BYT
2bf50 45 5f 50 54 52 20 70 4c 61 73 74 45 6e 63 72 79  E_PTR pLastEncry
2bf60 70 74 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f  ptedPart, CK_ULO
2bf70 4e 47 5f 50 54 52 20 70 75 6c 4c 61 73 74 45 6e  NG_PTR pulLastEn
2bf80 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e 29 20  cryptedPartLen) 
2bf90 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
2bfa0 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
2bfb0 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
2bfc0 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
2bfd0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2bfe0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
2bff0 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
2c000 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
2c010 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
2c020 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
2c030 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2c040 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
2c050 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
2c060 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
2c070 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
2c080 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
2c090 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
2c0a0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
2c0b0 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
2c0c0 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
2c0d0 2c 20 43 5f 44 65 63 72 79 70 74 49 6e 69 74 29  , C_DecryptInit)
2c0e0 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
2c0f0 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
2c100 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d  MECHANISM_PTR pM
2c110 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a  echanism, CK_OBJ
2c120 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79 29  ECT_HANDLE hKey)
2c130 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65   {..int mutex_re
2c140 74 76 61 6c 3b 0a 0a 09 68 4b 65 79 2d 2d 3b 0a  tval;...hKey--;.
2c150 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2c160 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
2c170 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
2c180 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
2c190 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2c1a0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
2c1b0 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
2c1c0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
2c1d0 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
2c1e0 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
2c1f0 69 66 20 28 70 4d 65 63 68 61 6e 69 73 6d 20 3d  if (pMechanism =
2c200 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
2c210 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2c220 22 45 72 72 6f 72 2e 20 70 4d 65 63 68 61 6e 69  "Error. pMechani
2c230 73 6d 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a  sm is NULL.");..
2c240 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47  ..return(CKR_ARG
2c250 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a  UMENTS_BAD);..}.
2c260 0a 09 69 66 20 28 70 4d 65 63 68 61 6e 69 73 6d  ..if (pMechanism
2c270 2d 3e 6d 65 63 68 61 6e 69 73 6d 20 21 3d 20 43  ->mechanism != C
2c280 4b 4d 5f 52 53 41 5f 50 4b 43 53 29 20 7b 0a 09  KM_RSA_PKCS) {..
2c290 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2c2a0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 4d 65  INTF("Error. pMe
2c2b0 63 68 61 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e 69  chanism->mechani
2c2c0 73 6d 20 6e 6f 74 20 73 70 65 63 69 66 69 65 64  sm not specified
2c2d0 20 61 73 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53   as CKM_RSA_PKCS
2c2e0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
2c2f0 52 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 41 52 41  R_MECHANISM_PARA
2c300 4d 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  M_INVALID);..}..
2c310 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d  .if (hSession ==
2c320 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e   0 || hSession >
2c330 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  = (sizeof(cackey
2c340 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a  _sessions) / siz
2c350 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
2c360 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41  ons[0]))) {...CA
2c370 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2c380 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69  F("Error.  Sessi
2c390 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e  on out of range.
2c3a0 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
2c3b0 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  CKR_SESSION_HAND
2c3c0 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  LE_INVALID);..}.
2c3d0 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
2c3e0 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f   cackey_mutex_lo
2c3f0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
2c400 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
2c410 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
2c420 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2c430 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63  NTF("Error.  Loc
2c440 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
2c450 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
2c460 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
2c470 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73  ...if (!cackey_s
2c480 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
2c490 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61  ].active) {...ca
2c4a0 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
2c4b0 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
2c4c0 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  );....CACKEY_DEB
2c4d0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2c4e0 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61  .  Session not a
2c4f0 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72  ctive.");......r
2c500 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f  eturn(CKR_SESSIO
2c510 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44  N_HANDLE_INVALID
2c520 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b  );..}...if (cack
2c530 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
2c540 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 61 63  sion].decrypt_ac
2c550 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79  tive) {...cackey
2c560 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
2c570 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
2c580 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2c590 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 44  RINTF("Error.  D
2c5a0 65 63 72 79 70 74 20 61 6c 72 65 61 64 79 20 69  ecrypt already i
2c5b0 6e 20 70 72 6f 67 72 65 73 73 2e 22 29 3b 0a 09  n progress.");..
2c5c0 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ....return(CKR_O
2c5d0 50 45 52 41 54 49 4f 4e 5f 41 43 54 49 56 45 29  PERATION_ACTIVE)
2c5e0 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 4b 65 79 20  ;..}...if (hKey 
2c5f0 3e 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  >= cackey_sessio
2c600 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65  ns[hSession].ide
2c610 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 29 20 7b  ntities_count) {
2c620 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
2c630 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
2c640 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45  glock);....CACKE
2c650 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2c660 45 72 72 6f 72 2e 20 20 4b 65 79 20 68 61 6e 64  Error.  Key hand
2c670 6c 65 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 20  le out of range 
2c680 28 72 65 71 75 65 73 74 65 64 20 6b 65 79 20 25  (requested key %
2c690 6c 75 2c 20 6f 6e 6c 79 20 25 6c 75 20 69 64 65  lu, only %lu ide
2c6a0 6e 74 69 74 69 65 73 20 61 76 61 69 6c 61 62 6c  ntities availabl
2c6b0 65 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  e).", (unsigned 
2c6c0 6c 6f 6e 67 29 20 68 4b 65 79 2c 20 28 75 6e 73  long) hKey, (uns
2c6d0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 61 63 6b  igned long) cack
2c6e0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
2c6f0 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73  sion].identities
2c700 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09 72 65 74 75  _count);....retu
2c710 72 6e 28 43 4b 52 5f 4b 45 59 5f 48 41 4e 44 4c  rn(CKR_KEY_HANDL
2c720 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
2c730 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
2c740 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79  [hSession].decry
2c750 70 74 5f 61 63 74 69 76 65 20 3d 20 31 3b 0a 0a  pt_active = 1;..
2c760 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
2c770 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79  [hSession].decry
2c780 70 74 5f 6d 65 63 68 61 6e 69 73 6d 20 3d 20 70  pt_mechanism = p
2c790 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d 65 63 68 61  Mechanism->mecha
2c7a0 6e 69 73 6d 3b 0a 09 63 61 63 6b 65 79 5f 73 65  nism;..cackey_se
2c7b0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
2c7c0 2e 64 65 63 72 79 70 74 5f 6d 65 63 68 5f 70 61  .decrypt_mech_pa
2c7d0 72 6d 20 3d 20 70 4d 65 63 68 61 6e 69 73 6d 2d  rm = pMechanism-
2c7e0 3e 70 50 61 72 61 6d 65 74 65 72 3b 0a 09 63 61  >pParameter;..ca
2c7f0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
2c800 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f  ession].decrypt_
2c810 6d 65 63 68 5f 70 61 72 6d 6c 65 6e 20 3d 20 70  mech_parmlen = p
2c820 4d 65 63 68 61 6e 69 73 6d 2d 3e 75 6c 50 61 72  Mechanism->ulPar
2c830 61 6d 65 74 65 72 4c 65 6e 3b 0a 09 63 61 63 6b  ameterLen;..cack
2c840 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
2c850 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 69 64  sion].decrypt_id
2c860 65 6e 74 69 74 79 20 3d 20 26 63 61 63 6b 65 79  entity = &cackey
2c870 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
2c880 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5b 68  on].identities[h
2c890 4b 65 79 5d 3b 0a 0a 09 6d 75 74 65 78 5f 72 65  Key];...mutex_re
2c8a0 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
2c8b0 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
2c8c0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
2c8d0 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
2c8e0 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
2c8f0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2c900 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66  or.  Unlocking f
2c910 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
2c920 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
2c930 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43  ERROR);..}...CAC
2c940 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2c950 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
2c960 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b  OK (%i)", CKR_OK
2c970 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
2c980 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  OK);.}..CK_DEFIN
2c990 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
2c9a0 2c 20 43 5f 44 65 63 72 79 70 74 29 28 43 4b 5f  , C_Decrypt)(CK_
2c9b0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
2c9c0 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45  Session, CK_BYTE
2c9d0 5f 50 54 52 20 70 45 6e 63 72 79 70 74 65 64 44  _PTR pEncryptedD
2c9e0 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  ata, CK_ULONG ul
2c9f0 45 6e 63 72 79 70 74 65 64 44 61 74 61 4c 65 6e  EncryptedDataLen
2ca00 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 44  , CK_BYTE_PTR pD
2ca10 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54  ata, CK_ULONG_PT
2ca20 52 20 70 75 6c 44 61 74 61 4c 65 6e 29 20 7b 0a  R pulDataLen) {.
2ca30 09 43 4b 5f 55 4c 4f 4e 47 20 64 61 74 61 6c 65  .CK_ULONG datale
2ca40 6e 5f 75 70 64 61 74 65 2c 20 64 61 74 61 6c 65  n_update, datale
2ca50 6e 5f 66 69 6e 61 6c 3b 0a 09 43 4b 5f 52 56 20  n_final;..CK_RV 
2ca60 64 65 63 72 79 70 74 5f 72 65 74 3b 0a 09 69 6e  decrypt_ret;..in
2ca70 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a  t mutex_retval;.
2ca80 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2ca90 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
2caa0 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
2cab0 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
2cac0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2cad0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
2cae0 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
2caf0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
2cb00 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
2cb10 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
2cb20 69 66 20 28 70 75 6c 44 61 74 61 4c 65 6e 20 3d  if (pulDataLen =
2cb30 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
2cb40 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2cb50 22 45 72 72 6f 72 2e 20 70 75 6c 44 61 74 61 4c  "Error. pulDataL
2cb60 65 6e 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a  en is NULL.");..
2cb70 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47  ..return(CKR_ARG
2cb80 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a  UMENTS_BAD);..}.
2cb90 0a 09 64 61 74 61 6c 65 6e 5f 75 70 64 61 74 65  ..datalen_update
2cba0 20 3d 20 2a 70 75 6c 44 61 74 61 4c 65 6e 3b 0a   = *pulDataLen;.
2cbb0 0a 09 64 65 63 72 79 70 74 5f 72 65 74 20 3d 20  ..decrypt_ret = 
2cbc0 43 5f 44 65 63 72 79 70 74 55 70 64 61 74 65 28  C_DecryptUpdate(
2cbd0 68 53 65 73 73 69 6f 6e 2c 20 70 45 6e 63 72 79  hSession, pEncry
2cbe0 70 74 65 64 44 61 74 61 2c 20 75 6c 45 6e 63 72  ptedData, ulEncr
2cbf0 79 70 74 65 64 44 61 74 61 4c 65 6e 2c 20 70 44  yptedDataLen, pD
2cc00 61 74 61 2c 20 26 64 61 74 61 6c 65 6e 5f 75 70  ata, &datalen_up
2cc10 64 61 74 65 29 3b 0a 09 69 66 20 28 64 65 63 72  date);..if (decr
2cc20 79 70 74 5f 72 65 74 20 21 3d 20 43 4b 52 5f 4f  ypt_ret != CKR_O
2cc30 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  K) {...CACKEY_DE
2cc40 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2cc50 72 2e 20 20 44 65 63 72 79 70 74 55 70 64 61 74  r.  DecryptUpdat
2cc60 65 28 29 20 72 65 74 75 72 6e 65 64 20 66 61 69  e() returned fai
2cc70 6c 75 72 65 20 28 72 76 20 3d 20 25 6c 75 29 2e  lure (rv = %lu).
2cc80 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
2cc90 67 29 20 64 65 63 72 79 70 74 5f 72 65 74 29 3b  g) decrypt_ret);
2cca0 0a 0a 09 09 69 66 20 28 64 65 63 72 79 70 74 5f  ....if (decrypt_
2ccb0 72 65 74 20 21 3d 20 43 4b 52 5f 42 55 46 46 45  ret != CKR_BUFFE
2ccc0 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 20 7b 0a 09  R_TOO_SMALL) {..
2ccd0 09 09 2f 2a 20 54 65 72 6d 69 6e 61 74 65 20 64  ../* Terminate d
2cce0 65 63 72 79 70 74 69 6f 6e 20 6f 70 65 72 61 74  ecryption operat
2ccf0 69 6f 6e 20 2a 2f 0a 0a 09 09 09 6d 75 74 65 78  ion */.....mutex
2cd00 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
2cd10 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b  _mutex_lock(cack
2cd20 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 09  ey_biglock);....
2cd30 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
2cd40 20 21 3d 20 30 29 20 7b 0a 09 09 09 09 43 41 43   != 0) {.....CAC
2cd50 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2cd60 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e  ("Error.  Lockin
2cd70 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
2cd80 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
2cd90 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 09 09  ERAL_ERROR);....
2cda0 7d 0a 0a 09 09 09 69 66 20 28 21 63 61 63 6b 65  }.....if (!cacke
2cdb0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
2cdc0 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09  ion].active) {..
2cdd0 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
2cde0 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
2cdf0 67 6c 6f 63 6b 29 3b 0a 0a 09 09 09 09 43 41 43  glock);......CAC
2ce00 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2ce10 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f  ("Error.  Sessio
2ce20 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b  n not active.");
2ce30 0a 09 09 0a 09 09 09 09 72 65 74 75 72 6e 28 43  ........return(C
2ce40 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  KR_SESSION_HANDL
2ce50 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 09 09 7d  E_INVALID);....}
2ce60 0a 0a 09 09 09 69 66 20 28 21 63 61 63 6b 65 79  .....if (!cackey
2ce70 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
2ce80 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 61 63 74 69  on].decrypt_acti
2ce90 76 65 29 20 7b 0a 09 09 09 09 63 61 63 6b 65 79  ve) {.....cackey
2cea0 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
2ceb0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
2cec0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
2ced0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2cee0 20 44 65 63 72 79 70 74 20 6e 6f 74 20 61 63 74   Decrypt not act
2cef0 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 09 09 72  ive.");........r
2cf00 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54  eturn(CKR_OPERAT
2cf10 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  ION_NOT_INITIALI
2cf20 5a 45 44 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 63  ZED);....}.....c
2cf30 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
2cf40 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74  Session].decrypt
2cf50 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a 0a 09 09  _active = 0;....
2cf60 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
2cf70 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
2cf80 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
2cf90 63 6b 29 3b 0a 09 09 09 69 66 20 28 6d 75 74 65  ck);....if (mute
2cfa0 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
2cfb0 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
2cfc0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2cfd0 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c    Unlocking fail
2cfe0 65 64 2e 22 29 3b 0a 0a 09 09 09 09 72 65 74 75  ed.");......retu
2cff0 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
2d000 52 52 4f 52 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a  RROR);....}...}.
2d010 0a 09 09 72 65 74 75 72 6e 28 64 65 63 72 79 70  ...return(decryp
2d020 74 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09 69 66 20  t_ret);..}...if 
2d030 28 70 44 61 74 61 29 20 7b 0a 09 09 70 44 61 74  (pData) {...pDat
2d040 61 20 2b 3d 20 64 61 74 61 6c 65 6e 5f 75 70 64  a += datalen_upd
2d050 61 74 65 3b 0a 09 7d 0a 09 64 61 74 61 6c 65 6e  ate;..}..datalen
2d060 5f 66 69 6e 61 6c 20 3d 20 2a 70 75 6c 44 61 74  _final = *pulDat
2d070 61 4c 65 6e 20 2d 20 64 61 74 61 6c 65 6e 5f 75  aLen - datalen_u
2d080 70 64 61 74 65 3b 0a 0a 09 64 65 63 72 79 70 74  pdate;...decrypt
2d090 5f 72 65 74 20 3d 20 43 5f 44 65 63 72 79 70 74  _ret = C_Decrypt
2d0a0 46 69 6e 61 6c 28 68 53 65 73 73 69 6f 6e 2c 20  Final(hSession, 
2d0b0 70 44 61 74 61 2c 20 26 64 61 74 61 6c 65 6e 5f  pData, &datalen_
2d0c0 66 69 6e 61 6c 29 3b 0a 09 69 66 20 28 64 65 63  final);..if (dec
2d0d0 72 79 70 74 5f 72 65 74 20 21 3d 20 43 4b 52 5f  rypt_ret != CKR_
2d0e0 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  OK) {...CACKEY_D
2d0f0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2d100 6f 72 2e 20 20 44 65 63 72 79 70 74 46 69 6e 61  or.  DecryptFina
2d110 6c 28 29 20 72 65 74 75 72 6e 65 64 20 66 61 69  l() returned fai
2d120 6c 75 72 65 20 28 72 76 20 3d 20 25 6c 75 29 2e  lure (rv = %lu).
2d130 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
2d140 67 29 20 64 65 63 72 79 70 74 5f 72 65 74 29 3b  g) decrypt_ret);
2d150 0a 0a 09 09 72 65 74 75 72 6e 28 64 65 63 72 79  ....return(decry
2d160 70 74 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09 2a 70  pt_ret);..}...*p
2d170 75 6c 44 61 74 61 4c 65 6e 20 3d 20 64 61 74 61  ulDataLen = data
2d180 6c 65 6e 5f 75 70 64 61 74 65 20 2b 20 64 61 74  len_update + dat
2d190 61 6c 65 6e 5f 66 69 6e 61 6c 3b 0a 0a 09 43 41  alen_final;...CA
2d1a0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2d1b0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
2d1c0 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f  _OK (%i)", CKR_O
2d1d0 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  K);...return(CKR
2d1e0 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  _OK);.}..CK_DEFI
2d1f0 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
2d200 56 2c 20 43 5f 44 65 63 72 79 70 74 55 70 64 61  V, C_DecryptUpda
2d210 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  te)(CK_SESSION_H
2d220 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
2d230 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 45 6e 63  CK_BYTE_PTR pEnc
2d240 72 79 70 74 65 64 50 61 72 74 2c 20 43 4b 5f 55  ryptedPart, CK_U
2d250 4c 4f 4e 47 20 75 6c 45 6e 63 72 79 70 74 65 64  LONG ulEncrypted
2d260 50 61 72 74 4c 65 6e 2c 20 43 4b 5f 42 59 54 45  PartLen, CK_BYTE
2d270 5f 50 54 52 20 70 50 61 72 74 2c 20 43 4b 5f 55  _PTR pPart, CK_U
2d280 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 50 61 72 74  LONG_PTR pulPart
2d290 4c 65 6e 29 20 7b 0a 09 73 74 61 74 69 63 20 43  Len) {..static C
2d2a0 4b 5f 42 59 54 45 20 62 75 66 5b 31 36 33 38 34  K_BYTE buf[16384
2d2b0 5d 3b 0a 09 73 73 69 7a 65 5f 74 20 62 75 66 6c  ];..ssize_t bufl
2d2c0 65 6e 3b 0a 09 43 4b 5f 53 4c 4f 54 5f 49 44 20  en;..CK_SLOT_ID 
2d2d0 73 6c 6f 74 49 44 3b 0a 09 43 4b 5f 52 56 20 72  slotID;..CK_RV r
2d2e0 65 74 76 61 6c 20 3d 20 43 4b 52 5f 47 45 4e 45  etval = CKR_GENE
2d2f0 52 41 4c 5f 45 52 52 4f 52 3b 0a 09 69 6e 74 20  RAL_ERROR;..int 
2d300 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09  mutex_retval;...
2d310 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2d320 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
2d330 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
2d340 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
2d350 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2d360 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
2d370 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
2d380 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
2d390 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
2d3a0 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66  ALIZED);..}...if
2d3b0 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20   (hSession == 0 
2d3c0 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28  || hSession >= (
2d3d0 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
2d3e0 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66  ssions) / sizeof
2d3f0 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
2d400 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45  [0]))) {...CACKE
2d410 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2d420 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20  Error.  Session 
2d430 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b  out of range.");
2d440 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
2d450 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
2d460 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69  INVALID);..}...i
2d470 66 20 28 70 45 6e 63 72 79 70 74 65 64 50 61 72  f (pEncryptedPar
2d480 74 20 3d 3d 20 4e 55 4c 4c 20 26 26 20 75 6c 45  t == NULL && ulE
2d490 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e 20  ncryptedPartLen 
2d4a0 3d 3d 20 30 29 20 7b 0a 09 09 2f 2a 20 53 68 6f  == 0) {.../* Sho
2d4b0 72 74 20 63 69 72 63 75 69 74 20 69 66 20 77 65  rt circuit if we
2d4c0 20 61 72 65 20 61 73 6b 65 64 20 74 6f 20 64 65   are asked to de
2d4d0 63 72 79 70 74 20 6e 6f 74 68 69 6e 67 2e 2e 2e  crypt nothing...
2d4e0 20 2a 2f 0a 09 09 43 41 43 4b 45 59 5f 44 45 42   */...CACKEY_DEB
2d4f0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
2d500 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29  ning CKR_OK (%i)
2d510 20 28 73 68 6f 72 74 20 63 69 72 63 75 69 74 29   (short circuit)
2d520 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 09 72  ", CKR_OK);....r
2d530 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 09  eturn(CKR_OK);..
2d540 7d 0a 0a 09 69 66 20 28 70 45 6e 63 72 79 70 74  }...if (pEncrypt
2d550 65 64 50 61 72 74 20 3d 3d 20 4e 55 4c 4c 29 20  edPart == NULL) 
2d560 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
2d570 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2d580 70 45 6e 63 72 79 70 74 65 64 50 61 72 74 20 69  pEncryptedPart i
2d590 73 20 4e 55 4c 4c 2c 20 62 75 74 20 75 6c 45 6e  s NULL, but ulEn
2d5a0 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e 20 69  cryptedPartLen i
2d5b0 73 20 6e 6f 74 20 30 2e 22 29 3b 0a 0a 09 09 72  s not 0.");....r
2d5c0 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45  eturn(CKR_ARGUME
2d5d0 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69  NTS_BAD);..}...i
2d5e0 66 20 28 75 6c 45 6e 63 72 79 70 74 65 64 50 61  f (ulEncryptedPa
2d5f0 72 74 4c 65 6e 20 3d 3d 20 30 29 20 7b 0a 09 09  rtLen == 0) {...
2d600 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2d610 4e 54 46 28 22 45 72 72 6f 72 2e 20 75 6c 45 6e  NTF("Error. ulEn
2d620 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e 20 69  cryptedPartLen i
2d630 73 20 30 2c 20 62 75 74 20 70 50 61 72 74 20 69  s 0, but pPart i
2d640 73 20 6e 6f 74 20 4e 55 4c 4c 2e 22 29 3b 0a 0a  s not NULL.");..
2d650 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47  ..return(CKR_ARG
2d660 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a  UMENTS_BAD);..}.
2d670 0a 09 69 66 20 28 70 75 6c 50 61 72 74 4c 65 6e  ..if (pulPartLen
2d680 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
2d690 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2d6a0 46 28 22 45 72 72 6f 72 2e 20 70 75 6c 50 61 72  F("Error. pulPar
2d6b0 74 4c 65 6e 20 69 73 20 4e 55 4c 4c 2e 22 29 3b  tLen is NULL.");
2d6c0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41  ....return(CKR_A
2d6d0 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09  RGUMENTS_BAD);..
2d6e0 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  }...mutex_retval
2d6f0 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
2d700 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
2d710 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
2d720 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
2d730 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2d740 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c  RINTF("Error.  L
2d750 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
2d760 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
2d770 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
2d780 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  .}...if (!cackey
2d790 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
2d7a0 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09  on].active) {...
2d7b0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
2d7c0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
2d7d0 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ck);....CACKEY_D
2d7e0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2d7f0 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74  or.  Session not
2d800 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09   active.");.....
2d810 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
2d820 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
2d830 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63  ID);..}...if (!c
2d840 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
2d850 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74  Session].decrypt
2d860 5f 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63  _active) {...cac
2d870 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
2d880 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
2d890 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  ;....CACKEY_DEBU
2d8a0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2d8b0 20 20 44 65 63 72 79 70 74 20 6e 6f 74 20 61 63    Decrypt not ac
2d8c0 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  tive.");......re
2d8d0 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49  turn(CKR_OPERATI
2d8e0 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  ON_NOT_INITIALIZ
2d8f0 45 44 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 49 44  ED);..}...slotID
2d900 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   = cackey_sessio
2d910 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f  ns[hSession].slo
2d920 74 49 44 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 49  tID;...if (slotI
2d930 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20  D < 0 || slotID 
2d940 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65  >= (sizeof(cacke
2d950 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f  y_slots) / sizeo
2d960 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30  f(cackey_slots[0
2d970 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ]))) {...CACKEY_
2d980 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2d990 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f  ror. Invalid slo
2d9a0 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75  t requested (%lu
2d9b0 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 76 61  ), outside of va
2d9c0 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74  lid range", slot
2d9d0 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  ID);....return(C
2d9e0 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
2d9f0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b  );..}...if (cack
2da00 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
2da10 2e 61 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a  .active == 0) {.
2da20 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2da30 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e  RINTF("Error. In
2da40 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65  valid slot reque
2da50 73 74 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74  sted (%lu), slot
2da60 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61   not currently a
2da70 63 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b  ctive", slotID);
2da80 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  ....cackey_mutex
2da90 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
2daa0 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75  iglock);....retu
2dab0 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
2dac0 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 73 77 69 74  RROR);..}...swit
2dad0 63 68 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69  ch (cackey_sessi
2dae0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65  ons[hSession].de
2daf0 63 72 79 70 74 5f 6d 65 63 68 61 6e 69 73 6d 29  crypt_mechanism)
2db00 20 7b 0a 09 09 63 61 73 65 20 43 4b 4d 5f 52 53   {...case CKM_RS
2db10 41 5f 50 4b 43 53 3a 0a 09 09 09 2f 2a 20 41 73  A_PKCS:..../* As
2db20 6b 20 63 61 72 64 20 74 6f 20 64 65 63 72 79 70  k card to decryp
2db30 74 20 2a 2f 0a 09 09 09 62 75 66 6c 65 6e 20 3d  t */....buflen =
2db40 20 63 61 63 6b 65 79 5f 73 69 67 6e 64 65 63 72   cackey_signdecr
2db50 79 70 74 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74  ypt(&cackey_slot
2db60 73 5b 73 6c 6f 74 49 44 5d 2c 20 63 61 63 6b 65  s[slotID], cacke
2db70 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
2db80 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 69 64 65  ion].decrypt_ide
2db90 6e 74 69 74 79 2c 20 70 45 6e 63 72 79 70 74 65  ntity, pEncrypte
2dba0 64 50 61 72 74 2c 20 75 6c 45 6e 63 72 79 70 74  dPart, ulEncrypt
2dbb0 65 64 50 61 72 74 4c 65 6e 2c 20 62 75 66 2c 20  edPartLen, buf, 
2dbc0 73 69 7a 65 6f 66 28 62 75 66 29 2c 20 30 2c 20  sizeof(buf), 0, 
2dbd0 31 29 3b 0a 0a 09 09 09 69 66 20 28 62 75 66 6c  1);.....if (bufl
2dbe0 65 6e 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53  en == CACKEY_PCS
2dbf0 43 5f 45 5f 4e 45 45 44 4c 4f 47 49 4e 20 26 26  C_E_NEEDLOGIN &&
2dc00 20 63 61 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d   cackey_pin_comm
2dc10 61 6e 64 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  and != NULL) {..
2dc20 09 09 09 69 66 20 28 5f 43 5f 4c 6f 67 69 6e 4d  ...if (_C_LoginM
2dc30 75 74 65 78 41 72 67 28 68 53 65 73 73 69 6f 6e  utexArg(hSession
2dc40 2c 20 43 4b 55 5f 55 53 45 52 2c 20 4e 55 4c 4c  , CKU_USER, NULL
2dc50 2c 20 30 2c 20 30 29 20 3d 3d 20 43 4b 52 5f 4f  , 0, 0) == CKR_O
2dc60 4b 29 20 7b 0a 09 09 09 09 09 62 75 66 6c 65 6e  K) {......buflen
2dc70 20 3d 20 63 61 63 6b 65 79 5f 73 69 67 6e 64 65   = cackey_signde
2dc80 63 72 79 70 74 28 26 63 61 63 6b 65 79 5f 73 6c  crypt(&cackey_sl
2dc90 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c 20 63 61 63  ots[slotID], cac
2dca0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
2dcb0 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 69  ssion].decrypt_i
2dcc0 64 65 6e 74 69 74 79 2c 20 70 45 6e 63 72 79 70  dentity, pEncryp
2dcd0 74 65 64 50 61 72 74 2c 20 75 6c 45 6e 63 72 79  tedPart, ulEncry
2dce0 70 74 65 64 50 61 72 74 4c 65 6e 2c 20 62 75 66  ptedPartLen, buf
2dcf0 2c 20 73 69 7a 65 6f 66 28 62 75 66 29 2c 20 30  , sizeof(buf), 0
2dd00 2c 20 31 29 3b 0a 09 09 09 09 7d 0a 09 09 09 7d  , 1);.....}....}
2dd10 0a 0a 09 09 09 69 66 20 28 62 75 66 6c 65 6e 20  .....if (buflen 
2dd20 3c 20 30 29 20 7b 0a 09 09 09 09 2f 2a 20 44 65  < 0) {...../* De
2dd30 63 72 79 70 74 69 6f 6e 20 66 61 69 6c 65 64 2e  cryption failed.
2dd40 20 2a 2f 0a 09 09 09 09 69 66 20 28 62 75 66 6c   */.....if (bufl
2dd50 65 6e 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53  en == CACKEY_PCS
2dd60 43 5f 45 5f 4e 45 45 44 4c 4f 47 49 4e 29 20 7b  C_E_NEEDLOGIN) {
2dd70 0a 09 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43  ......retval = C
2dd80 4b 52 5f 55 53 45 52 5f 4e 4f 54 5f 4c 4f 47 47  KR_USER_NOT_LOGG
2dd90 45 44 5f 49 4e 3b 0a 09 09 09 09 7d 20 65 6c 73  ED_IN;.....} els
2dda0 65 20 69 66 20 28 62 75 66 6c 65 6e 20 3d 3d 20  e if (buflen == 
2ddb0 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f  CACKEY_PCSC_E_TO
2ddc0 4b 45 4e 41 42 53 45 4e 54 29 20 7b 0a 09 09 09  KENABSENT) {....
2ddd0 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 44  ..retval = CKR_D
2dde0 45 56 49 43 45 5f 52 45 4d 4f 56 45 44 3b 0a 09  EVICE_REMOVED;..
2ddf0 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09  ...} else {.....
2de00 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2de10 49 4e 54 46 28 22 46 61 69 6c 65 64 20 74 6f 20  INTF("Failed to 
2de20 73 65 6e 64 20 41 50 44 55 2c 20 65 72 72 6f 72  send APDU, error
2de30 20 3d 20 25 6c 69 22 2c 20 28 6c 6f 6e 67 20 69   = %li", (long i
2de40 6e 74 29 20 62 75 66 6c 65 6e 29 3b 0a 0a 09 09  nt) buflen);....
2de50 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f  ...retval = CKR_
2de60 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 3b 0a 09  GENERAL_ERROR;..
2de70 09 09 09 7d 0a 09 09 09 7d 20 65 6c 73 65 20 69  ...}....} else i
2de80 66 20 28 28 28 75 6e 73 69 67 6e 65 64 20 6c 6f  f (((unsigned lo
2de90 6e 67 29 20 62 75 66 6c 65 6e 29 20 3e 20 2a 70  ng) buflen) > *p
2dea0 75 6c 50 61 72 74 4c 65 6e 20 26 26 20 70 50 61  ulPartLen && pPa
2deb0 72 74 29 20 7b 0a 09 09 09 09 2f 2a 20 44 65 63  rt) {...../* Dec
2dec0 72 79 70 74 65 64 20 64 61 74 61 20 74 6f 6f 20  rypted data too 
2ded0 6c 61 72 67 65 20 2a 2f 0a 09 09 09 09 72 65 74  large */.....ret
2dee0 76 61 6c 20 3d 20 43 4b 52 5f 42 55 46 46 45 52  val = CKR_BUFFER
2def0 5f 54 4f 4f 5f 53 4d 41 4c 4c 3b 0a 09 09 09 7d  _TOO_SMALL;....}
2df00 20 65 6c 73 65 20 7b 0a 09 09 09 09 69 66 20 28   else {.....if (
2df10 70 50 61 72 74 29 20 7b 0a 09 09 09 09 09 6d 65  pPart) {......me
2df20 6d 63 70 79 28 70 50 61 72 74 2c 20 62 75 66 2c  mcpy(pPart, buf,
2df30 20 62 75 66 6c 65 6e 29 3b 0a 09 09 09 09 7d 0a   buflen);.....}.
2df40 0a 09 09 09 09 2a 70 75 6c 50 61 72 74 4c 65 6e  .....*pulPartLen
2df50 20 3d 20 62 75 66 6c 65 6e 3b 0a 0a 09 09 09 09   = buflen;......
2df60 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 4f 4b 3b  retval = CKR_OK;
2df70 0a 09 09 09 7d 0a 0a 09 09 09 62 72 65 61 6b 3b  ....}.....break;
2df80 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  ..}...mutex_retv
2df90 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
2dfa0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
2dfb0 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
2dfc0 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
2dfd0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
2dfe0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2dff0 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69  .  Unlocking fai
2e000 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
2e010 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
2e020 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ROR);..}...CACKE
2e030 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2e040 52 65 74 75 72 6e 69 6e 67 20 25 69 22 2c 20 28  Returning %i", (
2e050 69 6e 74 29 20 72 65 74 76 61 6c 29 3b 0a 0a 09  int) retval);...
2e060 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a  return(retval);.
2e070 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
2e080 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44  CTION(CK_RV, C_D
2e090 65 63 72 79 70 74 46 69 6e 61 6c 29 28 43 4b 5f  ecryptFinal)(CK_
2e0a0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
2e0b0 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45  Session, CK_BYTE
2e0c0 5f 50 54 52 20 70 4c 61 73 74 50 61 72 74 2c 20  _PTR pLastPart, 
2e0d0 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c  CK_ULONG_PTR pul
2e0e0 4c 61 73 74 50 61 72 74 4c 65 6e 29 20 7b 0a 09  LastPartLen) {..
2e0f0 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c  int mutex_retval
2e100 3b 0a 09 69 6e 74 20 74 65 72 6d 69 6e 61 74 65  ;..int terminate
2e110 5f 64 65 63 72 79 70 74 20 3d 20 31 3b 0a 0a 09  _decrypt = 1;...
2e120 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2e130 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
2e140 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
2e150 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
2e160 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2e170 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
2e180 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
2e190 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
2e1a0 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
2e1b0 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66  ALIZED);..}...if
2e1c0 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20   (hSession == 0 
2e1d0 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28  || hSession >= (
2e1e0 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
2e1f0 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66  ssions) / sizeof
2e200 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
2e210 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45  [0]))) {...CACKE
2e220 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2e230 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20  Error.  Session 
2e240 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b  out of range.");
2e250 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
2e260 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
2e270 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69  INVALID);..}...i
2e280 66 20 28 70 75 6c 4c 61 73 74 50 61 72 74 4c 65  f (pulLastPartLe
2e290 6e 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  n == NULL) {...C
2e2a0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2e2b0 54 46 28 22 45 72 72 6f 72 2e 20 70 75 6c 4c 61  TF("Error. pulLa
2e2c0 73 74 50 61 72 74 4c 65 6e 20 69 73 20 4e 55 4c  stPartLen is NUL
2e2d0 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  L.");....return(
2e2e0 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41  CKR_ARGUMENTS_BA
2e2f0 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  D);..}...mutex_r
2e300 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
2e310 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79  utex_lock(cackey
2e320 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
2e330 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
2e340 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
2e350 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2e360 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c  r.  Locking fail
2e370 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
2e380 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
2e390 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63  OR);..}...if (!c
2e3a0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
2e3b0 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29  Session].active)
2e3c0 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65   {...cackey_mute
2e3d0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
2e3e0 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43  biglock);....CAC
2e3f0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2e400 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f  ("Error.  Sessio
2e410 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b  n not active.");
2e420 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
2e430 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
2e440 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69  INVALID);..}...i
2e450 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69  f (!cackey_sessi
2e460 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65  ons[hSession].de
2e470 63 72 79 70 74 5f 61 63 74 69 76 65 29 20 7b 0a  crypt_active) {.
2e480 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
2e490 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
2e4a0 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59  lock);....CACKEY
2e4b0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2e4c0 72 72 6f 72 2e 20 20 44 65 63 72 79 70 74 20 6e  rror.  Decrypt n
2e4d0 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09  ot active.");...
2e4e0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50  ...return(CKR_OP
2e4f0 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54  ERATION_NOT_INIT
2e500 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 2a  IALIZED);..}...*
2e510 70 75 6c 4c 61 73 74 50 61 72 74 4c 65 6e 20 3d  pulLastPartLen =
2e520 20 30 3b 0a 0a 09 69 66 20 28 70 4c 61 73 74 50   0;...if (pLastP
2e530 61 72 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  art == NULL) {..
2e540 09 74 65 72 6d 69 6e 61 74 65 5f 64 65 63 72 79  .terminate_decry
2e550 70 74 20 3d 20 30 3b 0a 09 7d 0a 0a 09 69 66 20  pt = 0;..}...if 
2e560 28 74 65 72 6d 69 6e 61 74 65 5f 64 65 63 72 79  (terminate_decry
2e570 70 74 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 73  pt) {...cackey_s
2e580 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
2e590 5d 2e 64 65 63 72 79 70 74 5f 61 63 74 69 76 65  ].decrypt_active
2e5a0 20 3d 20 30 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78   = 0;..}...mutex
2e5b0 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
2e5c0 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
2e5d0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
2e5e0 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
2e5f0 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
2e600 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2e610 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e  Error.  Unlockin
2e620 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
2e630 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
2e640 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
2e650 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2e660 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
2e670 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52  KR_OK (%i)", CKR
2e680 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  _OK);...return(C
2e690 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  KR_OK);.}..CK_DE
2e6a0 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
2e6b0 5f 52 56 2c 20 43 5f 44 69 67 65 73 74 49 6e 69  _RV, C_DigestIni
2e6c0 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  t)(CK_SESSION_HA
2e6d0 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
2e6e0 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20  K_MECHANISM_PTR 
2e6f0 70 4d 65 63 68 61 6e 69 73 6d 29 20 7b 0a 09 43  pMechanism) {..C
2e700 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2e710 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
2e720 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
2e730 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
2e740 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2e750 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
2e760 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
2e770 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
2e780 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
2e790 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
2e7a0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2e7b0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
2e7c0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
2e7d0 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
2e7e0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2e7f0 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
2e800 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
2e810 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
2e820 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
2e830 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
2e840 44 69 67 65 73 74 29 28 43 4b 5f 53 45 53 53 49  Digest)(CK_SESSI
2e850 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
2e860 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  on, CK_BYTE_PTR 
2e870 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20  pData, CK_ULONG 
2e880 75 6c 44 61 74 61 4c 65 6e 2c 20 43 4b 5f 42 59  ulDataLen, CK_BY
2e890 54 45 5f 50 54 52 20 70 44 69 67 65 73 74 2c 20  TE_PTR pDigest, 
2e8a0 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c  CK_ULONG_PTR pul
2e8b0 44 69 67 65 73 74 4c 65 6e 29 20 7b 0a 09 43 41  DigestLen) {..CA
2e8c0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2e8d0 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
2e8e0 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
2e8f0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
2e900 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2e910 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
2e920 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
2e930 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
2e940 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
2e950 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
2e960 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2e970 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
2e980 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
2e990 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
2e9a0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
2e9b0 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
2e9c0 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
2e9d0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
2e9e0 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
2e9f0 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44  CTION(CK_RV, C_D
2ea00 69 67 65 73 74 55 70 64 61 74 65 29 28 43 4b 5f  igestUpdate)(CK_
2ea10 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
2ea20 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45  Session, CK_BYTE
2ea30 5f 50 54 52 20 70 50 61 72 74 2c 20 43 4b 5f 55  _PTR pPart, CK_U
2ea40 4c 4f 4e 47 20 75 6c 50 61 72 74 4c 65 6e 29 20  LONG ulPartLen) 
2ea50 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
2ea60 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
2ea70 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
2ea80 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
2ea90 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2eaa0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
2eab0 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
2eac0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
2ead0 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
2eae0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
2eaf0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2eb00 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
2eb10 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
2eb20 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
2eb30 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
2eb40 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
2eb50 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
2eb60 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
2eb70 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
2eb80 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
2eb90 2c 20 43 5f 44 69 67 65 73 74 4b 65 79 29 28 43  , C_DigestKey)(C
2eba0 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
2ebb0 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42   hSession, CK_OB
2ebc0 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79  JECT_HANDLE hKey
2ebd0 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
2ebe0 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
2ebf0 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
2ec00 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
2ec10 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
2ec20 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2ec30 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
2ec40 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
2ec50 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
2ec60 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
2ec70 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2ec80 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
2ec90 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
2eca0 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
2ecb0 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
2ecc0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
2ecd0 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
2ece0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
2ecf0 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
2ed00 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
2ed10 52 56 2c 20 43 5f 44 69 67 65 73 74 46 69 6e 61  RV, C_DigestFina
2ed20 6c 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  l)(CK_SESSION_HA
2ed30 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
2ed40 4b 5f 42 59 54 45 5f 50 54 52 20 70 44 69 67 65  K_BYTE_PTR pDige
2ed50 73 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52  st, CK_ULONG_PTR
2ed60 20 70 75 6c 44 69 67 65 73 74 4c 65 6e 29 20 7b   pulDigestLen) {
2ed70 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2ed80 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
2ed90 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
2eda0 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
2edb0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2edc0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
2edd0 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
2ede0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
2edf0 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
2ee00 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
2ee10 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2ee20 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
2ee30 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
2ee40 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
2ee50 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
2ee60 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
2ee70 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
2ee80 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
2ee90 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
2eea0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
2eeb0 20 43 5f 53 69 67 6e 49 6e 69 74 29 28 43 4b 5f   C_SignInit)(CK_
2eec0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
2eed0 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48  Session, CK_MECH
2eee0 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61  ANISM_PTR pMecha
2eef0 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f  nism, CK_OBJECT_
2ef00 48 41 4e 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09  HANDLE hKey) {..
2ef10 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c  int mutex_retval
2ef20 3b 0a 0a 09 68 4b 65 79 2d 2d 3b 0a 0a 09 43 41  ;...hKey--;...CA
2ef30 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2ef40 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
2ef50 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
2ef60 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
2ef70 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2ef80 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
2ef90 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
2efa0 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
2efb0 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
2efc0 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  IZED);..}...if (
2efd0 70 4d 65 63 68 61 6e 69 73 6d 20 3d 3d 20 4e 55  pMechanism == NU
2efe0 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
2eff0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2f000 6f 72 2e 20 70 4d 65 63 68 61 6e 69 73 6d 20 69  or. pMechanism i
2f010 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65  s NULL.");....re
2f020 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e  turn(CKR_ARGUMEN
2f030 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66  TS_BAD);..}...if
2f040 20 28 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d 65   (pMechanism->me
2f050 63 68 61 6e 69 73 6d 20 21 3d 20 43 4b 4d 5f 52  chanism != CKM_R
2f060 53 41 5f 50 4b 43 53 29 20 7b 0a 09 09 43 41 43  SA_PKCS) {...CAC
2f070 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2f080 28 22 45 72 72 6f 72 2e 20 70 4d 65 63 68 61 6e  ("Error. pMechan
2f090 69 73 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d 20 6e  ism->mechanism n
2f0a0 6f 74 20 73 70 65 63 69 66 69 65 64 20 61 73 20  ot specified as 
2f0b0 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 22 29 3b 0a  CKM_RSA_PKCS");.
2f0c0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4d 45  ...return(CKR_ME
2f0d0 43 48 41 4e 49 53 4d 5f 50 41 52 41 4d 5f 49 4e  CHANISM_PARAM_IN
2f0e0 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  VALID);..}...if 
2f0f0 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c  (hSession == 0 |
2f100 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73  | hSession >= (s
2f110 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
2f120 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28  sions) / sizeof(
2f130 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2f140 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59  0]))) {...CACKEY
2f150 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2f160 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f  rror.  Session o
2f170 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a  ut of range.");.
2f180 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
2f190 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49  SESSION_HANDLE_I
2f1a0 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75  NVALID);..}...mu
2f1b0 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
2f1c0 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63  key_mutex_lock(c
2f1d0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
2f1e0 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
2f1f0 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
2f200 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2f210 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67  "Error.  Locking
2f220 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
2f230 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
2f240 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69  L_ERROR);..}...i
2f250 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69  f (!cackey_sessi
2f260 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63  ons[hSession].ac
2f270 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79  tive) {...cackey
2f280 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
2f290 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
2f2a0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2f2b0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
2f2c0 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76  ession not activ
2f2d0 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
2f2e0 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41  n(CKR_SESSION_HA
2f2f0 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
2f300 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73  }...if (cackey_s
2f310 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
2f320 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65 29 20 7b  ].sign_active) {
2f330 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
2f340 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
2f350 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45  glock);....CACKE
2f360 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2f370 45 72 72 6f 72 2e 20 20 53 69 67 6e 20 61 6c 72  Error.  Sign alr
2f380 65 61 64 79 20 69 6e 20 70 72 6f 67 72 65 73 73  eady in progress
2f390 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
2f3a0 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 41  (CKR_OPERATION_A
2f3b0 43 54 49 56 45 29 3b 0a 09 7d 0a 0a 09 69 66 20  CTIVE);..}...if 
2f3c0 28 68 4b 65 79 20 3e 3d 20 63 61 63 6b 65 79 5f  (hKey >= cackey_
2f3d0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
2f3e0 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 6f  n].identities_co
2f3f0 75 6e 74 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  unt) {...cackey_
2f400 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
2f410 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
2f420 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2f430 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4b 65  INTF("Error.  Ke
2f440 79 20 68 61 6e 64 6c 65 20 6f 75 74 20 6f 66 20  y handle out of 
2f450 72 61 6e 67 65 20 28 72 65 71 75 65 73 74 65 64  range (requested
2f460 20 6b 65 79 20 25 6c 75 2c 20 6f 6e 6c 79 20 25   key %lu, only %
2f470 6c 75 20 69 64 65 6e 74 69 74 69 65 73 20 61 76  lu identities av
2f480 61 69 6c 61 62 6c 65 29 2e 22 2c 20 28 75 6e 73  ailable).", (uns
2f490 69 67 6e 65 64 20 6c 6f 6e 67 29 20 68 4b 65 79  igned long) hKey
2f4a0 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
2f4b0 29 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ) cackey_session
2f4c0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e  s[hSession].iden
2f4d0 74 69 74 69 65 73 5f 63 6f 75 6e 74 29 3b 0a 0a  tities_count);..
2f4e0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4b 45 59  ..return(CKR_KEY
2f4f0 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29  _HANDLE_INVALID)
2f500 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 65  ;..}...cackey_se
2f510 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
2f520 2e 73 69 67 6e 5f 61 63 74 69 76 65 20 3d 20 31  .sign_active = 1
2f530 3b 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ;...cackey_sessi
2f540 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
2f550 67 6e 5f 6d 65 63 68 61 6e 69 73 6d 20 3d 20 70  gn_mechanism = p
2f560 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d 65 63 68 61  Mechanism->mecha
2f570 6e 69 73 6d 3b 0a 0a 09 63 61 63 6b 65 79 5f 73  nism;...cackey_s
2f580 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
2f590 5d 2e 73 69 67 6e 5f 62 75 66 6c 65 6e 20 3d 20  ].sign_buflen = 
2f5a0 31 32 38 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73  128;..cackey_ses
2f5b0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
2f5c0 73 69 67 6e 5f 62 75 66 75 73 65 64 20 3d 20 30  sign_bufused = 0
2f5d0 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ;..cackey_sessio
2f5e0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
2f5f0 6e 5f 62 75 66 20 3d 20 6d 61 6c 6c 6f 63 28 73  n_buf = malloc(s
2f600 69 7a 65 6f 66 28 2a 63 61 63 6b 65 79 5f 73 65  izeof(*cackey_se
2f610 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
2f620 2e 73 69 67 6e 5f 62 75 66 29 20 2a 20 63 61 63  .sign_buf) * cac
2f630 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
2f640 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 6c  ssion].sign_bufl
2f650 65 6e 29 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  en);...CACKEY_DE
2f660 42 55 47 5f 50 52 49 4e 54 46 28 22 53 65 73 73  BUG_PRINTF("Sess
2f670 69 6f 6e 20 25 6c 75 20 73 69 67 6e 5f 69 64 65  ion %lu sign_ide
2f680 6e 74 69 74 79 20 69 73 20 25 70 20 28 69 64 65  ntity is %p (ide
2f690 6e 74 69 74 79 20 23 25 6c 75 29 22 2c 20 28 75  ntity #%lu)", (u
2f6a0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 68 53  nsigned long) hS
2f6b0 65 73 73 69 6f 6e 2c 20 28 76 6f 69 64 20 2a 29  ession, (void *)
2f6c0 20 26 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e   &cackey_session
2f6d0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e  s[hSession].iden
2f6e0 74 69 74 69 65 73 5b 68 4b 65 79 5d 2c 20 28 75  tities[hKey], (u
2f6f0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 68 4b  nsigned long) hK
2f700 65 79 29 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73  ey);..cackey_ses
2f710 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
2f720 73 69 67 6e 5f 69 64 65 6e 74 69 74 79 20 3d 20  sign_identity = 
2f730 26 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  &cackey_sessions
2f740 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74  [hSession].ident
2f750 69 74 69 65 73 5b 68 4b 65 79 5d 3b 0a 0a 09 6d  ities[hKey];...m
2f760 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
2f770 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
2f780 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
2f790 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
2f7a0 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
2f7b0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2f7c0 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f  TF("Error.  Unlo
2f7d0 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
2f7e0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
2f7f0 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
2f800 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
2f810 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
2f820 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c  ng CKR_OK (%i)",
2f830 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75   CKR_OK);...retu
2f840 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43  rn(CKR_OK);.}..C
2f850 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
2f860 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 69 67 6e 29  N(CK_RV, C_Sign)
2f870 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
2f880 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
2f890 42 59 54 45 5f 50 54 52 20 70 44 61 74 61 2c 20  BYTE_PTR pData, 
2f8a0 43 4b 5f 55 4c 4f 4e 47 20 75 6c 44 61 74 61 4c  CK_ULONG ulDataL
2f8b0 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  en, CK_BYTE_PTR 
2f8c0 70 53 69 67 6e 61 74 75 72 65 2c 20 43 4b 5f 55  pSignature, CK_U
2f8d0 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 53 69 67 6e  LONG_PTR pulSign
2f8e0 61 74 75 72 65 4c 65 6e 29 20 7b 0a 09 75 6e 73  atureLen) {..uns
2f8f0 69 67 6e 65 64 20 6c 6f 6e 67 20 73 74 61 72 74  igned long start
2f900 5f 73 69 67 6e 5f 62 75 66 75 73 65 64 3b 0a 09  _sign_bufused;..
2f910 43 4b 5f 52 56 20 73 69 67 6e 5f 72 65 74 3b 0a  CK_RV sign_ret;.
2f920 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61  .int mutex_retva
2f930 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  l;...CACKEY_DEBU
2f940 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
2f950 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
2f960 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
2f970 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
2f980 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2f990 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
2f9a0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
2f9b0 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
2f9c0 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
2f9d0 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20  ...if (hSession 
2f9e0 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e  == 0 || hSession
2f9f0 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b   >= (sizeof(cack
2fa00 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73  ey_sessions) / s
2fa10 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
2fa20 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09  sions[0]))) {...
2fa30 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2fa40 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73  NTF("Error.  Ses
2fa50 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67  sion out of rang
2fa60 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
2fa70 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41  n(CKR_SESSION_HA
2fa80 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
2fa90 7d 0a 0a 09 73 74 61 72 74 5f 73 69 67 6e 5f 62  }...start_sign_b
2faa0 75 66 75 73 65 64 20 3d 20 63 61 63 6b 65 79 5f  ufused = cackey_
2fab0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
2fac0 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 3b  n].sign_bufused;
2fad0 0a 0a 09 73 69 67 6e 5f 72 65 74 20 3d 20 43 5f  ...sign_ret = C_
2fae0 53 69 67 6e 55 70 64 61 74 65 28 68 53 65 73 73  SignUpdate(hSess
2faf0 69 6f 6e 2c 20 70 44 61 74 61 2c 20 75 6c 44 61  ion, pData, ulDa
2fb00 74 61 4c 65 6e 29 3b 0a 09 69 66 20 28 73 69 67  taLen);..if (sig
2fb10 6e 5f 72 65 74 20 21 3d 20 43 4b 52 5f 4f 4b 29  n_ret != CKR_OK)
2fb20 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
2fb30 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2fb40 20 20 53 69 67 6e 55 70 64 61 74 65 28 29 20 72    SignUpdate() r
2fb50 65 74 75 72 6e 65 64 20 66 61 69 6c 75 72 65 20  eturned failure 
2fb60 28 72 76 20 3d 20 25 6c 75 29 2e 22 2c 20 28 75  (rv = %lu).", (u
2fb70 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69  nsigned long) si
2fb80 67 6e 5f 72 65 74 29 3b 0a 0a 09 09 69 66 20 28  gn_ret);....if (
2fb90 73 69 67 6e 5f 72 65 74 20 21 3d 20 43 4b 52 5f  sign_ret != CKR_
2fba0 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c  BUFFER_TOO_SMALL
2fbb0 29 20 7b 0a 09 09 09 6d 75 74 65 78 5f 72 65 74  ) {....mutex_ret
2fbc0 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
2fbd0 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  ex_lock(cackey_b
2fbe0 69 67 6c 6f 63 6b 29 3b 0a 09 09 09 69 66 20 28  iglock);....if (
2fbf0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
2fc00 30 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f  0) {.....CACKEY_
2fc10 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2fc20 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61  ror.  Locking fa
2fc30 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 09 09 72 65  iled.");......re
2fc40 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
2fc50 5f 45 52 52 4f 52 29 3b 0a 09 09 09 7d 0a 0a 09  _ERROR);....}...
2fc60 09 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65  ..if (!cackey_se
2fc70 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
2fc80 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 09 09 63  .active) {.....c
2fc90 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
2fca0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
2fcb0 6b 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f  k);......CACKEY_
2fcc0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2fcd0 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f  ror.  Session no
2fce0 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a  t active.");....
2fcf0 09 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
2fd00 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e  ESSION_HANDLE_IN
2fd10 56 41 4c 49 44 29 3b 0a 09 09 09 7d 0a 0a 09 09  VALID);....}....
2fd20 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73  .if (!cackey_ses
2fd30 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
2fd40 73 69 67 6e 5f 61 63 74 69 76 65 29 20 7b 0a 09  sign_active) {..
2fd50 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
2fd60 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
2fd70 67 6c 6f 63 6b 29 3b 0a 0a 09 09 09 09 43 41 43  glock);......CAC
2fd80 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2fd90 28 22 45 72 72 6f 72 2e 20 20 53 69 67 6e 20 6e  ("Error.  Sign n
2fda0 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09  ot active.");...
2fdb0 0a 09 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
2fdc0 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e  OPERATION_NOT_IN
2fdd0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 09 09 7d  ITIALIZED);....}
2fde0 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73  .....cackey_sess
2fdf0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
2fe00 69 67 6e 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a  ign_active = 0;.
2fe10 0a 09 09 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  ....mutex_retval
2fe20 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
2fe30 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
2fe40 67 6c 6f 63 6b 29 3b 0a 09 09 09 69 66 20 28 6d  glock);....if (m
2fe50 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
2fe60 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  ) {.....CACKEY_D
2fe70 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2fe80 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66  or.  Unlocking f
2fe90 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 09 09 72  ailed.");......r
2fea0 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
2feb0 4c 5f 45 52 52 4f 52 29 3b 0a 09 09 09 7d 0a 09  L_ERROR);....}..
2fec0 09 7d 0a 0a 09 09 72 65 74 75 72 6e 28 73 69 67  .}....return(sig
2fed0 6e 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09 73 69 67  n_ret);..}...sig
2fee0 6e 5f 72 65 74 20 3d 20 43 5f 53 69 67 6e 46 69  n_ret = C_SignFi
2fef0 6e 61 6c 28 68 53 65 73 73 69 6f 6e 2c 20 70 53  nal(hSession, pS
2ff00 69 67 6e 61 74 75 72 65 2c 20 70 75 6c 53 69 67  ignature, pulSig
2ff10 6e 61 74 75 72 65 4c 65 6e 29 3b 0a 09 69 66 20  natureLen);..if 
2ff20 28 73 69 67 6e 5f 72 65 74 20 21 3d 20 43 4b 52  (sign_ret != CKR
2ff30 5f 4f 4b 29 20 7b 0a 09 09 69 66 20 28 73 69 67  _OK) {...if (sig
2ff40 6e 5f 72 65 74 20 3d 3d 20 43 4b 52 5f 42 55 46  n_ret == CKR_BUF
2ff50 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 20 7b  FER_TOO_SMALL) {
2ff60 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
2ff70 5f 50 52 49 4e 54 46 28 22 53 69 67 6e 46 69 6e  _PRINTF("SignFin
2ff80 61 6c 28 29 20 72 65 74 75 72 6e 65 64 20 43 4b  al() returned CK
2ff90 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41  R_BUFFER_TOO_SMA
2ffa0 4c 4c 20 28 72 76 20 3d 20 25 6c 75 29 2c 20 75  LL (rv = %lu), u
2ffb0 6e 64 6f 69 6e 67 20 43 5f 53 69 67 6e 55 70 64  ndoing C_SignUpd
2ffc0 61 74 65 28 29 22 2c 20 28 75 6e 73 69 67 6e 65  ate()", (unsigne
2ffd0 64 20 6c 6f 6e 67 29 20 73 69 67 6e 5f 72 65 74  d long) sign_ret
2ffe0 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65  );.....cackey_se
2fff0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
30000 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 20 3d 20  .sign_bufused = 
30010 73 74 61 72 74 5f 73 69 67 6e 5f 62 75 66 75 73  start_sign_bufus
30020 65 64 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 73  ed;.....return(s
30030 69 67 6e 5f 72 65 74 29 3b 0a 09 09 7d 0a 0a 09  ign_ret);...}...
30040 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
30050 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 69  INTF("Error.  Si
30060 67 6e 46 69 6e 61 6c 28 29 20 72 65 74 75 72 6e  gnFinal() return
30070 65 64 20 66 61 69 6c 75 72 65 20 28 72 76 20 3d  ed failure (rv =
30080 20 25 6c 75 29 2e 22 2c 20 28 75 6e 73 69 67 6e   %lu).", (unsign
30090 65 64 20 6c 6f 6e 67 29 20 73 69 67 6e 5f 72 65  ed long) sign_re
300a0 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 73 69  t);....return(si
300b0 67 6e 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09 69 66  gn_ret);..}...if
300c0 20 28 70 53 69 67 6e 61 74 75 72 65 20 3d 3d 20   (pSignature == 
300d0 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
300e0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 70  _DEBUG_PRINTF("p
300f0 53 69 67 6e 61 74 75 72 65 20 73 70 65 63 69 66  Signature specif
30100 69 65 64 20 61 73 20 4e 55 4c 4c 2c 20 75 6e 64  ied as NULL, und
30110 6f 69 6e 67 20 43 5f 53 69 67 6e 55 70 64 61 74  oing C_SignUpdat
30120 65 28 29 22 29 3b 0a 0a 09 09 63 61 63 6b 65 79  e()");....cackey
30130 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
30140 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65 64  on].sign_bufused
30150 20 3d 20 73 74 61 72 74 5f 73 69 67 6e 5f 62 75   = start_sign_bu
30160 66 75 73 65 64 3b 0a 0a 09 09 72 65 74 75 72 6e  fused;....return
30170 28 73 69 67 6e 5f 72 65 74 29 3b 0a 09 7d 0a 0a  (sign_ret);..}..
30180 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
30190 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
301a0 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b  CKR_OK (%i)", CK
301b0 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28  R_OK);...return(
301c0 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44  CKR_OK);.}..CK_D
301d0 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
301e0 4b 5f 52 56 2c 20 43 5f 53 69 67 6e 55 70 64 61  K_RV, C_SignUpda
301f0 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  te)(CK_SESSION_H
30200 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
30210 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 61 72  CK_BYTE_PTR pPar
30220 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 61  t, CK_ULONG ulPa
30230 72 74 4c 65 6e 29 20 7b 0a 09 69 6e 74 20 6d 75  rtLen) {..int mu
30240 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41  tex_retval;...CA
30250 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
30260 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
30270 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
30280 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
30290 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
302a0 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
302b0 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
302c0 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
302d0 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
302e0 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  IZED);..}...if (
302f0 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c  hSession == 0 ||
30300 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69   hSession >= (si
30310 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
30320 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  ions) / sizeof(c
30330 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30  ackey_sessions[0
30340 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ]))) {...CACKEY_
30350 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
30360 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75  ror.  Session ou
30370 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09  t of range.");..
30380 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
30390 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e  ESSION_HANDLE_IN
303a0 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  VALID);..}...if 
303b0 28 70 50 61 72 74 20 3d 3d 20 4e 55 4c 4c 20 26  (pPart == NULL &
303c0 26 20 75 6c 50 61 72 74 4c 65 6e 20 3d 3d 20 30  & ulPartLen == 0
303d0 29 20 7b 0a 09 09 2f 2a 20 53 68 6f 72 74 20 63  ) {.../* Short c
303e0 69 72 63 75 69 74 20 69 66 20 77 65 20 61 72 65  ircuit if we are
303f0 20 61 73 6b 65 64 20 74 6f 20 73 69 67 6e 20 6e   asked to sign n
30400 6f 74 68 69 6e 67 2e 2e 2e 20 2a 2f 0a 09 09 43  othing... */...C
30410 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
30420 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
30430 52 5f 4f 4b 20 28 25 69 29 20 28 73 68 6f 72 74  R_OK (%i) (short
30440 20 63 69 72 63 75 69 74 29 22 2c 20 43 4b 52 5f   circuit)", CKR_
30450 4f 4b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  OK);....return(C
30460 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66 20  KR_OK);..}...if 
30470 28 70 50 61 72 74 20 3d 3d 20 4e 55 4c 4c 29 20  (pPart == NULL) 
30480 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
30490 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
304a0 70 50 61 72 74 20 69 73 20 4e 55 4c 4c 2c 20 62  pPart is NULL, b
304b0 75 74 20 75 6c 50 61 72 74 4c 65 6e 20 69 73 20  ut ulPartLen is 
304c0 6e 6f 74 20 30 2e 22 29 3b 0a 0a 09 09 72 65 74  not 0.");....ret
304d0 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54  urn(CKR_ARGUMENT
304e0 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  S_BAD);..}...if 
304f0 28 75 6c 50 61 72 74 4c 65 6e 20 3d 3d 20 30 29  (ulPartLen == 0)
30500 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
30510 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
30520 20 75 6c 50 61 72 74 4c 65 6e 20 69 73 20 30 2c   ulPartLen is 0,
30530 20 62 75 74 20 70 50 61 72 74 20 69 73 20 6e 6f   but pPart is no
30540 74 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65  t NULL.");....re
30550 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e  turn(CKR_ARGUMEN
30560 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 6d 75  TS_BAD);..}...mu
30570 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
30580 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63  key_mutex_lock(c
30590 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
305a0 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
305b0 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
305c0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
305d0 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67  "Error.  Locking
305e0 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
305f0 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
30600 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69  L_ERROR);..}...i
30610 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69  f (!cackey_sessi
30620 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63  ons[hSession].ac
30630 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79  tive) {...cackey
30640 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
30650 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
30660 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
30670 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
30680 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76  ession not activ
30690 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
306a0 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41  n(CKR_SESSION_HA
306b0 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
306c0 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  }...if (!cackey_
306d0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
306e0 6e 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65 29 20  n].sign_active) 
306f0 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  {...cackey_mutex
30700 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
30710 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b  iglock);....CACK
30720 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
30730 22 45 72 72 6f 72 2e 20 20 53 69 67 6e 20 6e 6f  "Error.  Sign no
30740 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a  t active.");....
30750 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45  ..return(CKR_OPE
30760 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49  RATION_NOT_INITI
30770 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 73 77  ALIZED);..}...sw
30780 69 74 63 68 20 28 63 61 63 6b 65 79 5f 73 65 73  itch (cackey_ses
30790 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
307a0 73 69 67 6e 5f 6d 65 63 68 61 6e 69 73 6d 29 20  sign_mechanism) 
307b0 7b 0a 09 09 63 61 73 65 20 43 4b 4d 5f 52 53 41  {...case CKM_RSA
307c0 5f 50 4b 43 53 3a 0a 09 09 09 2f 2a 20 41 63 63  _PKCS:..../* Acc
307d0 75 6d 75 6c 61 74 65 20 64 69 72 65 63 74 6c 79  umulate directly
307e0 20 2a 2f 0a 09 09 09 69 66 20 28 28 63 61 63 6b   */....if ((cack
307f0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
30800 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73  sion].sign_bufus
30810 65 64 20 2b 20 75 6c 50 61 72 74 4c 65 6e 29 20  ed + ulPartLen) 
30820 3e 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  > cackey_session
30830 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
30840 5f 62 75 66 6c 65 6e 29 20 7b 0a 09 09 09 09 63  _buflen) {.....c
30850 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
30860 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75  Session].sign_bu
30870 66 6c 65 6e 20 2a 3d 20 32 3b 0a 0a 09 09 09 09  flen *= 2;......
30880 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
30890 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62  hSession].sign_b
308a0 75 66 20 3d 20 72 65 61 6c 6c 6f 63 28 63 61 63  uf = realloc(cac
308b0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
308c0 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 2c  ssion].sign_buf,
308d0 20 73 69 7a 65 6f 66 28 2a 63 61 63 6b 65 79 5f   sizeof(*cackey_
308e0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
308f0 6e 5d 2e 73 69 67 6e 5f 62 75 66 29 20 2a 20 63  n].sign_buf) * c
30900 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
30910 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75  Session].sign_bu
30920 66 6c 65 6e 29 3b 0a 09 09 09 7d 0a 0a 09 09 09  flen);....}.....
30930 6d 65 6d 63 70 79 28 63 61 63 6b 65 79 5f 73 65  memcpy(cackey_se
30940 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
30950 2e 73 69 67 6e 5f 62 75 66 20 2b 20 63 61 63 6b  .sign_buf + cack
30960 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
30970 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73  sion].sign_bufus
30980 65 64 2c 20 70 50 61 72 74 2c 20 75 6c 50 61 72  ed, pPart, ulPar
30990 74 4c 65 6e 29 3b 0a 0a 09 09 09 63 61 63 6b 65  tLen);.....cacke
309a0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
309b0 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65  ion].sign_bufuse
309c0 64 20 2b 3d 20 75 6c 50 61 72 74 4c 65 6e 3b 0a  d += ulPartLen;.
309d0 0a 09 09 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09  ....break;..}...
309e0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
309f0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
30a00 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
30a10 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
30a20 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
30a30 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
30a40 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c  NTF("Error.  Unl
30a50 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
30a60 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
30a70 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
30a80 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
30a90 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
30aa0 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22  ing CKR_OK (%i)"
30ab0 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74  , CKR_OK);...ret
30ac0 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a  urn(CKR_OK);.}..
30ad0 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
30ae0 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 69 67 6e  ON(CK_RV, C_Sign
30af0 46 69 6e 61 6c 29 28 43 4b 5f 53 45 53 53 49 4f  Final)(CK_SESSIO
30b00 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
30b10 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
30b20 53 69 67 6e 61 74 75 72 65 2c 20 43 4b 5f 55 4c  Signature, CK_UL
30b30 4f 4e 47 5f 50 54 52 20 70 75 6c 53 69 67 6e 61  ONG_PTR pulSigna
30b40 74 75 72 65 4c 65 6e 29 20 7b 0a 09 73 74 61 74  tureLen) {..stat
30b50 69 63 20 43 4b 5f 42 59 54 45 20 73 69 67 62 75  ic CK_BYTE sigbu
30b60 66 5b 31 30 32 34 5d 3b 0a 09 73 73 69 7a 65 5f  f[1024];..ssize_
30b70 74 20 73 69 67 62 75 66 6c 65 6e 3b 0a 09 43 4b  t sigbuflen;..CK
30b80 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 3b  _SLOT_ID slotID;
30b90 0a 09 43 4b 5f 52 56 20 72 65 74 76 61 6c 20 3d  ..CK_RV retval =
30ba0 20 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52   CKR_GENERAL_ERR
30bb0 4f 52 3b 0a 09 69 6e 74 20 74 65 72 6d 69 6e 61  OR;..int termina
30bc0 74 65 5f 73 69 67 6e 20 3d 20 31 3b 0a 09 69 6e  te_sign = 1;..in
30bd0 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a  t mutex_retval;.
30be0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
30bf0 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
30c00 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
30c10 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
30c20 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
30c30 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
30c40 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
30c50 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
30c60 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
30c70 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
30c80 69 66 20 28 70 75 6c 53 69 67 6e 61 74 75 72 65  if (pulSignature
30c90 4c 65 6e 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  Len == NULL) {..
30ca0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
30cb0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 75 6c  INTF("Error. pul
30cc0 53 69 67 6e 61 74 75 72 65 4c 65 6e 20 69 73 20  SignatureLen is 
30cd0 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75  NULL.");....retu
30ce0 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53  rn(CKR_ARGUMENTS
30cf0 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  _BAD);..}...if (
30d00 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c  hSession == 0 ||
30d10 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69   hSession >= (si
30d20 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
30d30 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  ions) / sizeof(c
30d40 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30  ackey_sessions[0
30d50 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ]))) {...CACKEY_
30d60 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
30d70 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75  ror.  Session ou
30d80 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09  t of range.");..
30d90 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
30da0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e  ESSION_HANDLE_IN
30db0 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74  VALID);..}...mut
30dc0 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
30dd0 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61  ey_mutex_lock(ca
30de0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
30df0 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
30e00 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
30e10 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
30e20 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20  Error.  Locking 
30e30 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
30e40 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
30e50 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66  _ERROR);..}...if
30e60 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   (!cackey_sessio
30e70 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74  ns[hSession].act
30e80 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  ive) {...cackey_
30e90 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
30ea0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
30eb0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
30ec0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65  INTF("Error.  Se
30ed0 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65  ssion not active
30ee0 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
30ef0 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  (CKR_SESSION_HAN
30f00 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  DLE_INVALID);..}
30f10 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73  ...if (!cackey_s
30f20 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
30f30 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65 29 20 7b  ].sign_active) {
30f40 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
30f50 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
30f60 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45  glock);....CACKE
30f70 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
30f80 45 72 72 6f 72 2e 20 20 53 69 67 6e 20 6e 6f 74  Error.  Sign not
30f90 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09   active.");.....
30fa0 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52  .return(CKR_OPER
30fb0 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41  ATION_NOT_INITIA
30fc0 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 73 6c 6f  LIZED);..}...slo
30fd0 74 49 44 20 3d 20 63 61 63 6b 65 79 5f 73 65 73  tID = cackey_ses
30fe0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
30ff0 73 6c 6f 74 49 44 3b 0a 0a 09 69 66 20 28 73 6c  slotID;...if (sl
31000 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74  otID < 0 || slot
31010 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61  ID >= (sizeof(ca
31020 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69  ckey_slots) / si
31030 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
31040 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b  s[0]))) {...CACK
31050 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
31060 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20  "Error. Invalid 
31070 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28  slot requested (
31080 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66  %lu), outside of
31090 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73   valid range", s
310a0 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72  lotID);....retur
310b0 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
310c0 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63  ROR);..}...if (c
310d0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
310e0 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 29  ID].active == 0)
310f0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
31100 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
31110 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65   Invalid slot re
31120 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 73  quested (%lu), s
31130 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c  lot not currentl
31140 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 49  y active", slotI
31150 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75  D);....cackey_mu
31160 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
31170 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72  y_biglock);....r
31180 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
31190 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 73  L_ERROR);..}...s
311a0 77 69 74 63 68 20 28 63 61 63 6b 65 79 5f 73 65  witch (cackey_se
311b0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
311c0 2e 73 69 67 6e 5f 6d 65 63 68 61 6e 69 73 6d 29  .sign_mechanism)
311d0 20 7b 0a 09 09 63 61 73 65 20 43 4b 4d 5f 52 53   {...case CKM_RS
311e0 41 5f 50 4b 43 53 3a 0a 09 09 09 2f 2a 20 41 73  A_PKCS:..../* As
311f0 6b 20 63 61 72 64 20 74 6f 20 73 69 67 6e 20 2a  k card to sign *
31200 2f 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  /....CACKEY_DEBU
31210 47 5f 50 52 49 4e 54 46 28 22 41 73 6b 69 6e 67  G_PRINTF("Asking
31220 20 74 6f 20 73 69 67 6e 20 66 72 6f 6d 20 69 64   to sign from id
31230 65 6e 74 69 74 79 20 25 70 20 69 6e 20 73 65 73  entity %p in ses
31240 73 69 6f 6e 20 25 6c 75 22 2c 20 28 76 6f 69 64  sion %lu", (void
31250 20 2a 29 20 63 61 63 6b 65 79 5f 73 65 73 73 69   *) cackey_sessi
31260 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
31270 67 6e 5f 69 64 65 6e 74 69 74 79 2c 20 28 75 6e  gn_identity, (un
31280 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 68 53 65  signed long) hSe
31290 73 73 69 6f 6e 29 3b 0a 09 09 09 73 69 67 62 75  ssion);....sigbu
312a0 66 6c 65 6e 20 3d 20 63 61 63 6b 65 79 5f 73 69  flen = cackey_si
312b0 67 6e 64 65 63 72 79 70 74 28 26 63 61 63 6b 65  gndecrypt(&cacke
312c0 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c  y_slots[slotID],
312d0 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73   cackey_sessions
312e0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
312f0 69 64 65 6e 74 69 74 79 2c 20 63 61 63 6b 65 79  identity, cackey
31300 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
31310 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 2c 20 63 61  on].sign_buf, ca
31320 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
31330 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66  ession].sign_buf
31340 75 73 65 64 2c 20 73 69 67 62 75 66 2c 20 73 69  used, sigbuf, si
31350 7a 65 6f 66 28 73 69 67 62 75 66 29 2c 20 31 2c  zeof(sigbuf), 1,
31360 20 30 29 3b 0a 0a 09 09 09 69 66 20 28 73 69 67   0);.....if (sig
31370 62 75 66 6c 65 6e 20 3d 3d 20 43 41 43 4b 45 59  buflen == CACKEY
31380 5f 50 43 53 43 5f 45 5f 4e 45 45 44 4c 4f 47 49  _PCSC_E_NEEDLOGI
31390 4e 20 26 26 20 63 61 63 6b 65 79 5f 70 69 6e 5f  N && cackey_pin_
313a0 63 6f 6d 6d 61 6e 64 20 21 3d 20 4e 55 4c 4c 29  command != NULL)
313b0 20 7b 0a 09 09 09 09 69 66 20 28 5f 43 5f 4c 6f   {.....if (_C_Lo
313c0 67 69 6e 4d 75 74 65 78 41 72 67 28 68 53 65 73  ginMutexArg(hSes
313d0 73 69 6f 6e 2c 20 43 4b 55 5f 55 53 45 52 2c 20  sion, CKU_USER, 
313e0 4e 55 4c 4c 2c 20 30 2c 20 30 29 20 3d 3d 20 43  NULL, 0, 0) == C
313f0 4b 52 5f 4f 4b 29 20 7b 0a 09 09 09 09 09 73 69  KR_OK) {......si
31400 67 62 75 66 6c 65 6e 20 3d 20 63 61 63 6b 65 79  gbuflen = cackey
31410 5f 73 69 67 6e 64 65 63 72 79 70 74 28 26 63 61  _signdecrypt(&ca
31420 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
31430 44 5d 2c 20 63 61 63 6b 65 79 5f 73 65 73 73 69  D], cackey_sessi
31440 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
31450 67 6e 5f 69 64 65 6e 74 69 74 79 2c 20 63 61 63  gn_identity, cac
31460 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
31470 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 2c  ssion].sign_buf,
31480 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73   cackey_sessions
31490 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
314a0 62 75 66 75 73 65 64 2c 20 73 69 67 62 75 66 2c  bufused, sigbuf,
314b0 20 73 69 7a 65 6f 66 28 73 69 67 62 75 66 29 2c   sizeof(sigbuf),
314c0 20 31 2c 20 30 29 3b 0a 09 09 09 09 7d 0a 09 09   1, 0);.....}...
314d0 09 7d 0a 0a 09 09 09 69 66 20 28 73 69 67 62 75  .}.....if (sigbu
314e0 66 6c 65 6e 20 3c 20 30 29 20 7b 0a 09 09 09 09  flen < 0) {.....
314f0 2f 2a 20 53 69 67 6e 69 6e 67 20 66 61 69 6c 65  /* Signing faile
31500 64 2e 20 2a 2f 0a 09 09 09 09 69 66 20 28 73 69  d. */.....if (si
31510 67 62 75 66 6c 65 6e 20 3d 3d 20 43 41 43 4b 45  gbuflen == CACKE
31520 59 5f 50 43 53 43 5f 45 5f 4e 45 45 44 4c 4f 47  Y_PCSC_E_NEEDLOG
31530 49 4e 29 20 7b 0a 09 09 09 09 09 72 65 74 76 61  IN) {......retva
31540 6c 20 3d 20 43 4b 52 5f 55 53 45 52 5f 4e 4f 54  l = CKR_USER_NOT
31550 5f 4c 4f 47 47 45 44 5f 49 4e 3b 0a 09 09 09 09  _LOGGED_IN;.....
31560 7d 20 65 6c 73 65 20 69 66 20 28 73 69 67 62 75  } else if (sigbu
31570 66 6c 65 6e 20 3d 3d 20 43 41 43 4b 45 59 5f 50  flen == CACKEY_P
31580 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e  CSC_E_TOKENABSEN
31590 54 29 20 7b 0a 09 09 09 09 09 72 65 74 76 61 6c  T) {......retval
315a0 20 3d 20 43 4b 52 5f 44 45 56 49 43 45 5f 52 45   = CKR_DEVICE_RE
315b0 4d 4f 56 45 44 3b 0a 09 09 09 09 7d 20 65 6c 73  MOVED;.....} els
315c0 65 20 7b 0a 09 09 09 09 09 72 65 74 76 61 6c 20  e {......retval 
315d0 3d 20 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  = CKR_GENERAL_ER
315e0 52 4f 52 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 20  ROR;.....}....} 
315f0 65 6c 73 65 20 69 66 20 28 28 28 75 6e 73 69 67  else if (((unsig
31600 6e 65 64 20 6c 6f 6e 67 29 20 73 69 67 62 75 66  ned long) sigbuf
31610 6c 65 6e 29 20 3e 20 2a 70 75 6c 53 69 67 6e 61  len) > *pulSigna
31620 74 75 72 65 4c 65 6e 20 26 26 20 70 53 69 67 6e  tureLen && pSign
31630 61 74 75 72 65 29 20 7b 0a 09 09 09 09 2f 2a 20  ature) {...../* 
31640 53 69 67 6e 65 64 20 64 61 74 61 20 74 6f 6f 20  Signed data too 
31650 6c 61 72 67 65 20 2a 2f 0a 09 09 09 09 43 41 43  large */.....CAC
31660 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
31670 28 22 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 42  ("retval = CKR_B
31680 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 3b  UFFER_TOO_SMALL;
31690 20 20 73 69 67 62 75 66 6c 65 6e 20 3d 20 25 6c    sigbuflen = %l
316a0 75 2c 20 70 75 6c 53 69 67 6e 61 74 75 72 65 4c  u, pulSignatureL
316b0 65 6e 20 3d 20 25 6c 75 22 2c 20 28 75 6e 73 69  en = %lu", (unsi
316c0 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69 67 62 75  gned long) sigbu
316d0 66 6c 65 6e 2c 20 28 75 6e 73 69 67 6e 65 64 20  flen, (unsigned 
316e0 6c 6f 6e 67 29 20 2a 70 75 6c 53 69 67 6e 61 74  long) *pulSignat
316f0 75 72 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 72 65  ureLen);......re
31700 74 76 61 6c 20 3d 20 43 4b 52 5f 42 55 46 46 45  tval = CKR_BUFFE
31710 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 3b 0a 0a 09 09  R_TOO_SMALL;....
31720 09 09 74 65 72 6d 69 6e 61 74 65 5f 73 69 67 6e  ..terminate_sign
31730 20 3d 20 30 3b 0a 09 09 09 7d 20 65 6c 73 65 20   = 0;....} else 
31740 7b 0a 09 09 09 09 74 65 72 6d 69 6e 61 74 65 5f  {.....terminate_
31750 73 69 67 6e 20 3d 20 30 3b 0a 0a 09 09 09 09 69  sign = 0;......i
31760 66 20 28 70 53 69 67 6e 61 74 75 72 65 29 20 7b  f (pSignature) {
31770 0a 09 09 09 09 09 6d 65 6d 63 70 79 28 70 53 69  ......memcpy(pSi
31780 67 6e 61 74 75 72 65 2c 20 73 69 67 62 75 66 2c  gnature, sigbuf,
31790 20 73 69 67 62 75 66 6c 65 6e 29 3b 0a 0a 09 09   sigbuflen);....
317a0 09 09 09 74 65 72 6d 69 6e 61 74 65 5f 73 69 67  ...terminate_sig
317b0 6e 20 3d 20 31 3b 0a 09 09 09 09 7d 0a 0a 09 09  n = 1;.....}....
317c0 09 09 2a 70 75 6c 53 69 67 6e 61 74 75 72 65 4c  ..*pulSignatureL
317d0 65 6e 20 3d 20 73 69 67 62 75 66 6c 65 6e 3b 0a  en = sigbuflen;.
317e0 0a 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b  .....retval = CK
317f0 52 5f 4f 4b 3b 0a 09 09 09 7d 0a 0a 09 09 09 62  R_OK;....}.....b
31800 72 65 61 6b 3b 0a 09 7d 0a 0a 09 69 66 20 28 74  reak;..}...if (t
31810 65 72 6d 69 6e 61 74 65 5f 73 69 67 6e 29 20 7b  erminate_sign) {
31820 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65  ...if (cackey_se
31830 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
31840 2e 73 69 67 6e 5f 62 75 66 29 20 7b 0a 09 09 09  .sign_buf) {....
31850 66 72 65 65 28 63 61 63 6b 65 79 5f 73 65 73 73  free(cackey_sess
31860 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
31870 69 67 6e 5f 62 75 66 29 3b 0a 09 09 7d 0a 0a 09  ign_buf);...}...
31880 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
31890 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
318a0 61 63 74 69 76 65 20 3d 20 30 3b 0a 09 7d 0a 0a  active = 0;..}..
318b0 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
318c0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
318d0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
318e0 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
318f0 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
31900 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
31910 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e  INTF("Error.  Un
31920 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  locking failed."
31930 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
31940 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
31950 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
31960 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
31970 6e 69 6e 67 20 25 69 22 2c 20 28 69 6e 74 29 20  ning %i", (int) 
31980 72 65 74 76 61 6c 29 3b 0a 0a 09 72 65 74 75 72  retval);...retur
31990 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 43 4b  n(retval);.}..CK
319a0 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
319b0 28 43 4b 5f 52 56 2c 20 43 5f 53 69 67 6e 52 65  (CK_RV, C_SignRe
319c0 63 6f 76 65 72 49 6e 69 74 29 28 43 4b 5f 53 45  coverInit)(CK_SE
319d0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
319e0 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e  ssion, CK_MECHAN
319f0 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69  ISM_PTR pMechani
31a00 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41  sm, CK_OBJECT_HA
31a10 4e 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09 43 41  NDLE hKey) {..CA
31a20 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
31a30 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
31a40 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
31a50 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
31a60 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
31a70 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
31a80 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
31a90 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
31aa0 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
31ab0 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
31ac0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
31ad0 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
31ae0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
31af0 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
31b00 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
31b10 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
31b20 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
31b30 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
31b40 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
31b50 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53  CTION(CK_RV, C_S
31b60 69 67 6e 52 65 63 6f 76 65 72 29 28 43 4b 5f 53  ignRecover)(CK_S
31b70 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
31b80 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f  ession, CK_BYTE_
31b90 50 54 52 20 70 44 61 74 61 2c 20 43 4b 5f 55 4c  PTR pData, CK_UL
31ba0 4f 4e 47 20 75 6c 44 61 74 61 4c 65 6e 2c 20 43  ONG ulDataLen, C
31bb0 4b 5f 42 59 54 45 5f 50 54 52 20 70 53 69 67 6e  K_BYTE_PTR pSign
31bc0 61 74 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47 5f  ature, CK_ULONG_
31bd0 50 54 52 20 70 75 6c 53 69 67 6e 61 74 75 72 65  PTR pulSignature
31be0 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  Len) {..CACKEY_D
31bf0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
31c00 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
31c10 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
31c20 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
31c30 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
31c40 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
31c50 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
31c60 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
31c70 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
31c80 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
31c90 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
31ca0 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
31cb0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
31cc0 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
31cd0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
31ce0 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
31cf0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
31d00 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
31d10 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
31d20 43 4b 5f 52 56 2c 20 43 5f 56 65 72 69 66 79 49  CK_RV, C_VerifyI
31d30 6e 69 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  nit)(CK_SESSION_
31d40 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
31d50 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54   CK_MECHANISM_PT
31d60 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b  R pMechanism, CK
31d70 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68  _OBJECT_HANDLE h
31d80 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  Key) {..CACKEY_D
31d90 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
31da0 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
31db0 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
31dc0 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
31dd0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
31de0 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
31df0 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
31e00 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
31e10 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
31e20 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
31e30 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
31e40 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
31e50 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
31e60 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
31e70 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
31e80 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
31e90 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
31ea0 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
31eb0 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
31ec0 43 4b 5f 52 56 2c 20 43 5f 56 65 72 69 66 79 29  CK_RV, C_Verify)
31ed0 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
31ee0 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
31ef0 42 59 54 45 5f 50 54 52 20 70 44 61 74 61 2c 20  BYTE_PTR pData, 
31f00 43 4b 5f 55 4c 4f 4e 47 20 75 6c 44 61 74 61 4c  CK_ULONG ulDataL
31f10 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  en, CK_BYTE_PTR 
31f20 70 53 69 67 6e 61 74 75 72 65 2c 20 43 4b 5f 55  pSignature, CK_U
31f30 4c 4f 4e 47 20 75 6c 53 69 67 6e 61 74 75 72 65  LONG ulSignature
31f40 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  Len) {..CACKEY_D
31f50 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
31f60 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
31f70 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
31f80 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
31f90 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
31fa0 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
31fb0 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
31fc0 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
31fd0 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
31fe0 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
31ff0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
32000 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
32010 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
32020 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
32030 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
32040 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
32050 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
32060 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
32070 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
32080 43 4b 5f 52 56 2c 20 43 5f 56 65 72 69 66 79 55  CK_RV, C_VerifyU
32090 70 64 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f  pdate)(CK_SESSIO
320a0 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
320b0 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
320c0 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  Part, CK_ULONG u
320d0 6c 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43  lPartLen) {..CAC
320e0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
320f0 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
32100 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
32110 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
32120 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
32130 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
32140 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
32150 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
32160 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
32170 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
32180 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
32190 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
321a0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
321b0 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
321c0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
321d0 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
321e0 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
321f0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
32200 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
32210 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 56 65  TION(CK_RV, C_Ve
32220 72 69 66 79 46 69 6e 61 6c 29 28 43 4b 5f 53 45  rifyFinal)(CK_SE
32230 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
32240 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  ssion, CK_BYTE_P
32250 54 52 20 70 53 69 67 6e 61 74 75 72 65 2c 20 43  TR pSignature, C
32260 4b 5f 55 4c 4f 4e 47 20 75 6c 53 69 67 6e 61 74  K_ULONG ulSignat
32270 75 72 65 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45  ureLen) {..CACKE
32280 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
32290 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
322a0 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
322b0 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
322c0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
322d0 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
322e0 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
322f0 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
32300 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
32310 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
32320 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
32330 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
32340 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
32350 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
32360 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
32370 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
32380 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
32390 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
323a0 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
323b0 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 56 65 72 69  ON(CK_RV, C_Veri
323c0 66 79 52 65 63 6f 76 65 72 49 6e 69 74 29 28 43  fyRecoverInit)(C
323d0 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
323e0 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45   hSession, CK_ME
323f0 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63  CHANISM_PTR pMec
32400 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43  hanism, CK_OBJEC
32410 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79 29 20 7b  T_HANDLE hKey) {
32420 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
32430 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
32440 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
32450 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
32460 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
32470 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
32480 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
32490 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
324a0 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
324b0 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
324c0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
324d0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
324e0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
324f0 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
32500 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
32510 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
32520 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
32530 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
32540 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
32550 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
32560 20 43 5f 56 65 72 69 66 79 52 65 63 6f 76 65 72   C_VerifyRecover
32570 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
32580 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
32590 5f 42 59 54 45 5f 50 54 52 20 70 53 69 67 6e 61  _BYTE_PTR pSigna
325a0 74 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  ture, CK_ULONG u
325b0 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 2c 20 43  lSignatureLen, C
325c0 4b 5f 42 59 54 45 5f 50 54 52 20 70 44 61 74 61  K_BYTE_PTR pData
325d0 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70  , CK_ULONG_PTR p
325e0 75 6c 44 61 74 61 4c 65 6e 29 20 7b 0a 09 43 41  ulDataLen) {..CA
325f0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
32600 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
32610 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
32620 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
32630 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
32640 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
32650 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
32660 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
32670 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
32680 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
32690 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
326a0 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
326b0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
326c0 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
326d0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
326e0 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
326f0 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
32700 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
32710 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
32720 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44  CTION(CK_RV, C_D
32730 69 67 65 73 74 45 6e 63 72 79 70 74 55 70 64 61  igestEncryptUpda
32740 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  te)(CK_SESSION_H
32750 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
32760 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 61 72  CK_BYTE_PTR pPar
32770 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 61  t, CK_ULONG ulPa
32780 72 74 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  rtLen, CK_BYTE_P
32790 54 52 20 70 45 6e 63 72 79 70 74 65 64 50 61 72  TR pEncryptedPar
327a0 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20  t, CK_ULONG_PTR 
327b0 70 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74  pulEncryptedPart
327c0 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  Len) {..CACKEY_D
327d0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
327e0 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
327f0 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
32800 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
32810 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
32820 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
32830 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
32840 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
32850 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
32860 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
32870 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
32880 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
32890 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
328a0 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
328b0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
328c0 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
328d0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
328e0 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
328f0 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
32900 43 4b 5f 52 56 2c 20 43 5f 44 65 63 72 79 70 74  CK_RV, C_Decrypt
32910 44 69 67 65 73 74 55 70 64 61 74 65 29 28 43 4b  DigestUpdate)(CK
32920 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
32930 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54  hSession, CK_BYT
32940 45 5f 50 54 52 20 70 45 6e 63 72 79 70 74 65 64  E_PTR pEncrypted
32950 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  Part, CK_ULONG u
32960 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65  lEncryptedPartLe
32970 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
32980 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50  Part, CK_ULONG_P
32990 54 52 20 70 75 6c 50 61 72 74 4c 65 6e 29 20 7b  TR pulPartLen) {
329a0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
329b0 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
329c0 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
329d0 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
329e0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
329f0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
32a00 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
32a10 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
32a20 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
32a30 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
32a40 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
32a50 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
32a60 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
32a70 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
32a80 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
32a90 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
32aa0 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
32ab0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
32ac0 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
32ad0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
32ae0 20 43 5f 53 69 67 6e 45 6e 63 72 79 70 74 55 70   C_SignEncryptUp
32af0 64 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e  date)(CK_SESSION
32b00 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
32b10 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50  , CK_BYTE_PTR pP
32b20 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  art, CK_ULONG ul
32b30 50 61 72 74 4c 65 6e 2c 20 43 4b 5f 42 59 54 45  PartLen, CK_BYTE
32b40 5f 50 54 52 20 70 45 6e 63 72 79 70 74 65 64 50  _PTR pEncryptedP
32b50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54  art, CK_ULONG_PT
32b60 52 20 70 75 6c 45 6e 63 72 79 70 74 65 64 50 61  R pulEncryptedPa
32b70 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59  rtLen) {..CACKEY
32b80 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
32b90 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
32ba0 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
32bb0 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
32bc0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
32bd0 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
32be0 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
32bf0 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
32c00 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
32c10 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
32c20 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
32c30 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
32c40 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
32c50 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
32c60 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
32c70 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
32c80 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
32c90 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
32ca0 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
32cb0 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65 63 72 79  N(CK_RV, C_Decry
32cc0 70 74 56 65 72 69 66 79 55 70 64 61 74 65 29 28  ptVerifyUpdate)(
32cd0 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
32ce0 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42  E hSession, CK_B
32cf0 59 54 45 5f 50 54 52 20 70 45 6e 63 72 79 70 74  YTE_PTR pEncrypt
32d00 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47  edPart, CK_ULONG
32d10 20 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74   ulEncryptedPart
32d20 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  Len, CK_BYTE_PTR
32d30 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47   pPart, CK_ULONG
32d40 5f 50 54 52 20 70 75 6c 50 61 72 74 4c 65 6e 29  _PTR pulPartLen)
32d50 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
32d60 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
32d70 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
32d80 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
32d90 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
32da0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
32db0 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
32dc0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
32dd0 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
32de0 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
32df0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
32e00 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
32e10 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
32e20 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
32e30 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
32e40 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
32e50 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
32e60 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
32e70 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  TED);.}..CK_DEFI
32e80 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
32e90 56 2c 20 43 5f 47 65 6e 65 72 61 74 65 4b 65 79  V, C_GenerateKey
32ea0 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
32eb0 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
32ec0 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70  _MECHANISM_PTR p
32ed0 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 41 54  Mechanism, CK_AT
32ee0 54 52 49 42 55 54 45 5f 50 54 52 20 70 54 65 6d  TRIBUTE_PTR pTem
32ef0 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20  plate, CK_ULONG 
32f00 75 6c 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45  ulCount, CK_OBJE
32f10 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 68  CT_HANDLE_PTR ph
32f20 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  Key) {..CACKEY_D
32f30 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
32f40 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
32f50 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
32f60 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
32f70 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
32f80 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
32f90 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
32fa0 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
32fb0 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
32fc0 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
32fd0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
32fe0 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
32ff0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
33000 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
33010 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
33020 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
33030 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
33040 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
33050 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
33060 43 4b 5f 52 56 2c 20 43 5f 47 65 6e 65 72 61 74  CK_RV, C_Generat
33070 65 4b 65 79 50 61 69 72 29 28 43 4b 5f 53 45 53  eKeyPair)(CK_SES
33080 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
33090 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49  sion, CK_MECHANI
330a0 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73  SM_PTR pMechanis
330b0 6d 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f  m, CK_ATTRIBUTE_
330c0 50 54 52 20 70 50 75 62 6c 69 63 4b 65 79 54 65  PTR pPublicKeyTe
330d0 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47  mplate, CK_ULONG
330e0 20 75 6c 50 75 62 6c 69 63 4b 65 79 41 74 74 72   ulPublicKeyAttr
330f0 69 62 75 74 65 43 6f 75 6e 74 2c 20 43 4b 5f 41  ibuteCount, CK_A
33100 54 54 52 49 42 55 54 45 5f 50 54 52 20 70 50 72  TTRIBUTE_PTR pPr
33110 69 76 61 74 65 4b 65 79 54 65 6d 70 6c 61 74 65  ivateKeyTemplate
33120 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 72 69  , CK_ULONG ulPri
33130 76 61 74 65 4b 65 79 41 74 74 72 69 62 75 74 65  vateKeyAttribute
33140 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43 54  Count, CK_OBJECT
33150 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 50 75  _HANDLE_PTR phPu
33160 62 6c 69 63 4b 65 79 2c 20 43 4b 5f 4f 42 4a 45  blicKey, CK_OBJE
33170 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 68  CT_HANDLE_PTR ph
33180 50 72 69 76 61 74 65 4b 65 79 29 20 7b 0a 09 43  PrivateKey) {..C
33190 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
331a0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
331b0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
331c0 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
331d0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
331e0 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
331f0 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
33200 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
33210 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
33220 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
33230 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
33240 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
33250 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
33260 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
33270 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
33280 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
33290 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
332a0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
332b0 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
332c0 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
332d0 57 72 61 70 4b 65 79 29 28 43 4b 5f 53 45 53 53  WrapKey)(CK_SESS
332e0 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
332f0 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53  ion, CK_MECHANIS
33300 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d  M_PTR pMechanism
33310 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44  , CK_OBJECT_HAND
33320 4c 45 20 68 57 72 61 70 70 69 6e 67 4b 65 79 2c  LE hWrappingKey,
33330 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c   CK_OBJECT_HANDL
33340 45 20 68 4b 65 79 2c 20 43 4b 5f 42 59 54 45 5f  E hKey, CK_BYTE_
33350 50 54 52 20 70 57 72 61 70 70 65 64 4b 65 79 2c  PTR pWrappedKey,
33360 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75   CK_ULONG_PTR pu
33370 6c 57 72 61 70 70 65 64 4b 65 79 4c 65 6e 29 20  lWrappedKeyLen) 
33380 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
33390 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
333a0 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
333b0 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
333c0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
333d0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
333e0 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
333f0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
33400 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
33410 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
33420 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
33430 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
33440 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
33450 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
33460 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
33470 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
33480 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
33490 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
334a0 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
334b0 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
334c0 2c 20 43 5f 55 6e 77 72 61 70 4b 65 79 29 28 43  , C_UnwrapKey)(C
334d0 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
334e0 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45   hSession, CK_ME
334f0 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63  CHANISM_PTR pMec
33500 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43  hanism, CK_OBJEC
33510 54 5f 48 41 4e 44 4c 45 20 68 55 6e 77 72 61 70  T_HANDLE hUnwrap
33520 70 69 6e 67 4b 65 79 2c 20 43 4b 5f 42 59 54 45  pingKey, CK_BYTE
33530 5f 50 54 52 20 70 57 72 61 70 70 65 64 4b 65 79  _PTR pWrappedKey
33540 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 57 72 61  , CK_ULONG ulWra
33550 70 70 65 64 4b 65 79 4c 65 6e 2c 20 43 4b 5f 41  ppedKeyLen, CK_A
33560 54 54 52 49 42 55 54 45 5f 50 54 52 20 70 54 65  TTRIBUTE_PTR pTe
33570 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47  mplate, CK_ULONG
33580 20 75 6c 41 74 74 72 69 62 75 74 65 43 6f 75 6e   ulAttributeCoun
33590 74 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e  t, CK_OBJECT_HAN
335a0 44 4c 45 5f 50 54 52 20 70 68 4b 65 79 29 20 7b  DLE_PTR phKey) {
335b0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
335c0 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
335d0 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
335e0 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
335f0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
33600 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
33610 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
33620 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
33630 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
33640 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
33650 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
33660 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
33670 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
33680 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
33690 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
336a0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
336b0 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
336c0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
336d0 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
336e0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
336f0 20 43 5f 44 65 72 69 76 65 4b 65 79 29 28 43 4b   C_DeriveKey)(CK
33700 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
33710 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43  hSession, CK_MEC
33720 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68  HANISM_PTR pMech
33730 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54  anism, CK_OBJECT
33740 5f 48 41 4e 44 4c 45 20 68 42 61 73 65 4b 65 79  _HANDLE hBaseKey
33750 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50  , CK_ATTRIBUTE_P
33760 54 52 20 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b  TR pTemplate, CK
33770 5f 55 4c 4f 4e 47 20 75 6c 41 74 74 72 69 62 75  _ULONG ulAttribu
33780 74 65 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45  teCount, CK_OBJE
33790 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 68  CT_HANDLE_PTR ph
337a0 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  Key) {..CACKEY_D
337b0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
337c0 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
337d0 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
337e0 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
337f0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
33800 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
33810 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
33820 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
33830 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
33840 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
33850 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
33860 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
33870 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
33880 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
33890 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
338a0 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
338b0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
338c0 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
338d0 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
338e0 43 4b 5f 52 56 2c 20 43 5f 53 65 65 64 52 61 6e  CK_RV, C_SeedRan
338f0 64 6f 6d 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  dom)(CK_SESSION_
33900 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
33910 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 53 65   CK_BYTE_PTR pSe
33920 65 64 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 53  ed, CK_ULONG ulS
33930 65 65 64 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45  eedLen) {..CACKE
33940 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
33950 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
33960 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
33970 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
33980 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
33990 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
339a0 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
339b0 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
339c0 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
339d0 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
339e0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
339f0 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
33a00 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
33a10 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
33a20 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
33a30 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
33a40 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
33a50 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
33a60 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
33a70 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 6e 65  ON(CK_RV, C_Gene
33a80 72 61 74 65 52 61 6e 64 6f 6d 29 28 43 4b 5f 53  rateRandom)(CK_S
33a90 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
33aa0 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f  ession, CK_BYTE_
33ab0 50 54 52 20 70 52 61 6e 64 6f 6d 44 61 74 61 2c  PTR pRandomData,
33ac0 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 52 61 6e 64   CK_ULONG ulRand
33ad0 6f 6d 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59  omLen) {..CACKEY
33ae0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
33af0 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
33b00 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
33b10 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
33b20 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
33b30 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
33b40 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
33b50 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
33b60 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
33b70 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
33b80 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
33b90 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
33ba0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
33bb0 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
33bc0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
33bd0 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
33be0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
33bf0 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 2f  SUPPORTED);.}../
33c00 2a 20 44 65 70 72 65 63 61 74 65 64 20 46 75 6e  * Deprecated Fun
33c10 63 74 69 6f 6e 20 2a 2f 0a 43 4b 5f 44 45 46 49  ction */.CK_DEFI
33c20 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
33c30 56 2c 20 43 5f 47 65 74 46 75 6e 63 74 69 6f 6e  V, C_GetFunction
33c40 53 74 61 74 75 73 29 28 43 4b 5f 53 45 53 53 49  Status)(CK_SESSI
33c50 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
33c60 6f 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  on) {..CACKEY_DE
33c70 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
33c80 65 64 2e 22 29 3b 0a 0a 09 43 41 43 4b 45 59 5f  ed.");...CACKEY_
33c90 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
33ca0 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
33cb0 54 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45  TION_NOT_PARALLE
33cc0 4c 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  L (%i)", CKR_FUN
33cd0 43 54 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c  CTION_NOT_PARALL
33ce0 45 4c 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  EL);...return(CK
33cf0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 50  R_FUNCTION_NOT_P
33d00 41 52 41 4c 4c 45 4c 29 3b 0a 0a 09 68 53 65 73  ARALLEL);...hSes
33d10 73 69 6f 6e 20 3d 20 68 53 65 73 73 69 6f 6e 3b  sion = hSession;
33d20 20 2f 2a 20 53 75 70 72 65 73 73 20 75 6e 75 73   /* Supress unus
33d30 65 64 20 76 61 72 69 61 62 6c 65 20 77 61 72 6e  ed variable warn
33d40 69 6e 67 20 2a 2f 0a 7d 0a 0a 2f 2a 20 44 65 70  ing */.}../* Dep
33d50 72 65 63 61 74 65 64 20 46 75 6e 63 74 69 6f 6e  recated Function
33d60 20 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55   */.CK_DEFINE_FU
33d70 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
33d80 43 61 6e 63 65 6c 46 75 6e 63 74 69 6f 6e 29 28  CancelFunction)(
33d90 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
33da0 45 20 68 53 65 73 73 69 6f 6e 29 20 7b 0a 09 43  E hSession) {..C
33db0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
33dc0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
33dd0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
33de0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
33df0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
33e00 5f 50 41 52 41 4c 4c 45 4c 20 28 25 69 29 22 2c  _PARALLEL (%i)",
33e10 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
33e20 54 5f 50 41 52 41 4c 4c 45 4c 29 3b 0a 0a 09 72  T_PARALLEL);...r
33e30 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
33e40 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c 29  ON_NOT_PARALLEL)
33e50 3b 0a 0a 09 68 53 65 73 73 69 6f 6e 20 3d 20 68  ;...hSession = h
33e60 53 65 73 73 69 6f 6e 3b 20 2f 2a 20 53 75 70 72  Session; /* Supr
33e70 65 73 73 20 75 6e 75 73 65 64 20 76 61 72 69 61  ess unused varia
33e80 62 6c 65 20 77 61 72 6e 69 6e 67 20 2a 2f 0a 7d  ble warning */.}
33e90 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
33ea0 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65  TION(CK_RV, C_Ge
33eb0 74 46 75 6e 63 74 69 6f 6e 4c 69 73 74 29 28 43  tFunctionList)(C
33ec0 4b 5f 46 55 4e 43 54 49 4f 4e 5f 4c 49 53 54 5f  K_FUNCTION_LIST_
33ed0 50 54 52 5f 50 54 52 20 70 70 46 75 6e 63 74 69  PTR_PTR ppFuncti
33ee0 6f 6e 4c 69 73 74 29 20 7b 0a 09 43 4b 5f 46 55  onList) {..CK_FU
33ef0 4e 43 54 49 4f 4e 5f 4c 49 53 54 5f 50 54 52 20  NCTION_LIST_PTR 
33f00 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 3b 0a 0a  pFunctionList;..
33f10 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
33f20 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
33f30 0a 0a 09 69 66 20 28 70 70 46 75 6e 63 74 69 6f  ...if (ppFunctio
33f40 6e 4c 69 73 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b  nList == NULL) {
33f50 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
33f60 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70  PRINTF("Error. p
33f70 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 20 69 73  pFunctionList is
33f80 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74   NULL.");....ret
33f90 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54  urn(CKR_ARGUMENT
33fa0 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 70 46 75  S_BAD);..}...pFu
33fb0 6e 63 74 69 6f 6e 4c 69 73 74 20 3d 20 6d 61 6c  nctionList = mal
33fc0 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70 46 75 6e  loc(sizeof(*pFun
33fd0 63 74 69 6f 6e 4c 69 73 74 29 29 3b 0a 0a 09 70  ctionList));...p
33fe0 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 76 65  FunctionList->ve
33ff0 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 28 28  rsion.major = ((
34000 43 41 43 4b 45 59 5f 43 52 59 50 54 4f 4b 49 5f  CACKEY_CRYPTOKI_
34010 56 45 52 53 49 4f 4e 5f 43 4f 44 45 29 20 3e 3e  VERSION_CODE) >>
34020 20 31 36 29 20 26 20 30 78 66 66 3b 0a 09 70 46   16) & 0xff;..pF
34030 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 76 65 72  unctionList->ver
34040 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 28 28 43  sion.minor = ((C
34050 41 43 4b 45 59 5f 43 52 59 50 54 4f 4b 49 5f 56  ACKEY_CRYPTOKI_V
34060 45 52 53 49 4f 4e 5f 43 4f 44 45 29 20 3e 3e 20  ERSION_CODE) >> 
34070 38 29 20 26 20 30 78 66 66 3b 0a 0a 09 70 46 75  8) & 0xff;...pFu
34080 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 49 6e  nctionList->C_In
34090 69 74 69 61 6c 69 7a 65 20 3d 20 43 5f 49 6e 69  itialize = C_Ini
340a0 74 69 61 6c 69 7a 65 3b 0a 09 70 46 75 6e 63 74  tialize;..pFunct
340b0 69 6f 6e 4c 69 73 74 2d 3e 43 5f 46 69 6e 61 6c  ionList->C_Final
340c0 69 7a 65 20 3d 20 43 5f 46 69 6e 61 6c 69 7a 65  ize = C_Finalize
340d0 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
340e0 2d 3e 43 5f 47 65 74 49 6e 66 6f 20 3d 20 43 5f  ->C_GetInfo = C_
340f0 47 65 74 49 6e 66 6f 3b 0a 09 70 46 75 6e 63 74  GetInfo;..pFunct
34100 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 53 6c  ionList->C_GetSl
34110 6f 74 4c 69 73 74 20 3d 20 43 5f 47 65 74 53 6c  otList = C_GetSl
34120 6f 74 4c 69 73 74 3b 0a 09 70 46 75 6e 63 74 69  otList;..pFuncti
34130 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 53 6c 6f  onList->C_GetSlo
34140 74 49 6e 66 6f 20 3d 20 43 5f 47 65 74 53 6c 6f  tInfo = C_GetSlo
34150 74 49 6e 66 6f 3b 0a 09 70 46 75 6e 63 74 69 6f  tInfo;..pFunctio
34160 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 54 6f 6b 65  nList->C_GetToke
34170 6e 49 6e 66 6f 20 3d 20 43 5f 47 65 74 54 6f 6b  nInfo = C_GetTok
34180 65 6e 49 6e 66 6f 3b 0a 09 70 46 75 6e 63 74 69  enInfo;..pFuncti
34190 6f 6e 4c 69 73 74 2d 3e 43 5f 57 61 69 74 46 6f  onList->C_WaitFo
341a0 72 53 6c 6f 74 45 76 65 6e 74 20 3d 20 43 5f 57  rSlotEvent = C_W
341b0 61 69 74 46 6f 72 53 6c 6f 74 45 76 65 6e 74 3b  aitForSlotEvent;
341c0 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
341d0 3e 43 5f 47 65 74 4d 65 63 68 61 6e 69 73 6d 4c  >C_GetMechanismL
341e0 69 73 74 20 3d 20 43 5f 47 65 74 4d 65 63 68 61  ist = C_GetMecha
341f0 6e 69 73 6d 4c 69 73 74 3b 0a 09 70 46 75 6e 63  nismList;..pFunc
34200 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 4d  tionList->C_GetM
34210 65 63 68 61 6e 69 73 6d 49 6e 66 6f 20 3d 20 43  echanismInfo = C
34220 5f 47 65 74 4d 65 63 68 61 6e 69 73 6d 49 6e 66  _GetMechanismInf
34230 6f 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  o;..pFunctionLis
34240 74 2d 3e 43 5f 49 6e 69 74 54 6f 6b 65 6e 20 3d  t->C_InitToken =
34250 20 43 5f 49 6e 69 74 54 6f 6b 65 6e 3b 0a 09 70   C_InitToken;..p
34260 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
34270 49 6e 69 74 50 49 4e 20 3d 20 43 5f 49 6e 69 74  InitPIN = C_Init
34280 50 49 4e 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  PIN;..pFunctionL
34290 69 73 74 2d 3e 43 5f 53 65 74 50 49 4e 20 3d 20  ist->C_SetPIN = 
342a0 43 5f 53 65 74 50 49 4e 3b 0a 09 70 46 75 6e 63  C_SetPIN;..pFunc
342b0 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 4f 70 65 6e  tionList->C_Open
342c0 53 65 73 73 69 6f 6e 20 3d 20 43 5f 4f 70 65 6e  Session = C_Open
342d0 53 65 73 73 69 6f 6e 3b 0a 09 70 46 75 6e 63 74  Session;..pFunct
342e0 69 6f 6e 4c 69 73 74 2d 3e 43 5f 43 6c 6f 73 65  ionList->C_Close
342f0 53 65 73 73 69 6f 6e 20 3d 20 43 5f 43 6c 6f 73  Session = C_Clos
34300 65 53 65 73 73 69 6f 6e 3b 0a 09 70 46 75 6e 63  eSession;..pFunc
34310 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 43 6c 6f 73  tionList->C_Clos
34320 65 41 6c 6c 53 65 73 73 69 6f 6e 73 20 3d 20 43  eAllSessions = C
34330 5f 43 6c 6f 73 65 41 6c 6c 53 65 73 73 69 6f 6e  _CloseAllSession
34340 73 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  s;..pFunctionLis
34350 74 2d 3e 43 5f 47 65 74 53 65 73 73 69 6f 6e 49  t->C_GetSessionI
34360 6e 66 6f 20 3d 20 43 5f 47 65 74 53 65 73 73 69  nfo = C_GetSessi
34370 6f 6e 49 6e 66 6f 3b 0a 09 70 46 75 6e 63 74 69  onInfo;..pFuncti
34380 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 4f 70 65  onList->C_GetOpe
34390 72 61 74 69 6f 6e 53 74 61 74 65 20 3d 20 43 5f  rationState = C_
343a0 47 65 74 4f 70 65 72 61 74 69 6f 6e 53 74 61 74  GetOperationStat
343b0 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  e;..pFunctionLis
343c0 74 2d 3e 43 5f 53 65 74 4f 70 65 72 61 74 69 6f  t->C_SetOperatio
343d0 6e 53 74 61 74 65 20 3d 20 43 5f 53 65 74 4f 70  nState = C_SetOp
343e0 65 72 61 74 69 6f 6e 53 74 61 74 65 3b 0a 09 70  erationState;..p
343f0 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
34400 4c 6f 67 69 6e 20 3d 20 43 5f 4c 6f 67 69 6e 3b  Login = C_Login;
34410 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
34420 3e 43 5f 4c 6f 67 6f 75 74 20 3d 20 43 5f 4c 6f  >C_Logout = C_Lo
34430 67 6f 75 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  gout;..pFunction
34440 4c 69 73 74 2d 3e 43 5f 43 72 65 61 74 65 4f 62  List->C_CreateOb
34450 6a 65 63 74 20 3d 20 43 5f 43 72 65 61 74 65 4f  ject = C_CreateO
34460 62 6a 65 63 74 3b 0a 09 70 46 75 6e 63 74 69 6f  bject;..pFunctio
34470 6e 4c 69 73 74 2d 3e 43 5f 43 6f 70 79 4f 62 6a  nList->C_CopyObj
34480 65 63 74 20 3d 20 43 5f 43 6f 70 79 4f 62 6a 65  ect = C_CopyObje
34490 63 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  ct;..pFunctionLi
344a0 73 74 2d 3e 43 5f 44 65 73 74 72 6f 79 4f 62 6a  st->C_DestroyObj
344b0 65 63 74 20 3d 20 43 5f 44 65 73 74 72 6f 79 4f  ect = C_DestroyO
344c0 62 6a 65 63 74 3b 0a 09 70 46 75 6e 63 74 69 6f  bject;..pFunctio
344d0 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 4f 62 6a 65  nList->C_GetObje
344e0 63 74 53 69 7a 65 20 3d 20 43 5f 47 65 74 4f 62  ctSize = C_GetOb
344f0 6a 65 63 74 53 69 7a 65 3b 0a 09 70 46 75 6e 63  jectSize;..pFunc
34500 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 41  tionList->C_GetA
34510 74 74 72 69 62 75 74 65 56 61 6c 75 65 20 3d 20  ttributeValue = 
34520 43 5f 47 65 74 41 74 74 72 69 62 75 74 65 56 61  C_GetAttributeVa
34530 6c 75 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  lue;..pFunctionL
34540 69 73 74 2d 3e 43 5f 53 65 74 41 74 74 72 69 62  ist->C_SetAttrib
34550 75 74 65 56 61 6c 75 65 20 3d 20 43 5f 53 65 74  uteValue = C_Set
34560 41 74 74 72 69 62 75 74 65 56 61 6c 75 65 3b 0a  AttributeValue;.
34570 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
34580 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73 49 6e 69  C_FindObjectsIni
34590 74 20 3d 20 43 5f 46 69 6e 64 4f 62 6a 65 63 74  t = C_FindObject
345a0 73 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f  sInit;..pFunctio
345b0 6e 4c 69 73 74 2d 3e 43 5f 46 69 6e 64 4f 62 6a  nList->C_FindObj
345c0 65 63 74 73 20 3d 20 43 5f 46 69 6e 64 4f 62 6a  ects = C_FindObj
345d0 65 63 74 73 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  ects;..pFunction
345e0 4c 69 73 74 2d 3e 43 5f 46 69 6e 64 4f 62 6a 65  List->C_FindObje
345f0 63 74 73 46 69 6e 61 6c 20 3d 20 43 5f 46 69 6e  ctsFinal = C_Fin
34600 64 4f 62 6a 65 63 74 73 46 69 6e 61 6c 3b 0a 09  dObjectsFinal;..
34610 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
34620 5f 45 6e 63 72 79 70 74 49 6e 69 74 20 3d 20 43  _EncryptInit = C
34630 5f 45 6e 63 72 79 70 74 49 6e 69 74 3b 0a 09 70  _EncryptInit;..p
34640 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
34650 45 6e 63 72 79 70 74 20 3d 20 43 5f 45 6e 63 72  Encrypt = C_Encr
34660 79 70 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  ypt;..pFunctionL
34670 69 73 74 2d 3e 43 5f 45 6e 63 72 79 70 74 55 70  ist->C_EncryptUp
34680 64 61 74 65 20 3d 20 43 5f 45 6e 63 72 79 70 74  date = C_Encrypt
34690 55 70 64 61 74 65 3b 0a 09 70 46 75 6e 63 74 69  Update;..pFuncti
346a0 6f 6e 4c 69 73 74 2d 3e 43 5f 45 6e 63 72 79 70  onList->C_Encryp
346b0 74 46 69 6e 61 6c 20 3d 20 43 5f 45 6e 63 72 79  tFinal = C_Encry
346c0 70 74 46 69 6e 61 6c 3b 0a 09 70 46 75 6e 63 74  ptFinal;..pFunct
346d0 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65 63 72 79  ionList->C_Decry
346e0 70 74 49 6e 69 74 20 3d 20 43 5f 44 65 63 72 79  ptInit = C_Decry
346f0 70 74 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69  ptInit;..pFuncti
34700 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65 63 72 79 70  onList->C_Decryp
34710 74 20 3d 20 43 5f 44 65 63 72 79 70 74 3b 0a 09  t = C_Decrypt;..
34720 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
34730 5f 44 65 63 72 79 70 74 55 70 64 61 74 65 20 3d  _DecryptUpdate =
34740 20 43 5f 44 65 63 72 79 70 74 55 70 64 61 74 65   C_DecryptUpdate
34750 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
34760 2d 3e 43 5f 44 65 63 72 79 70 74 46 69 6e 61 6c  ->C_DecryptFinal
34770 20 3d 20 43 5f 44 65 63 72 79 70 74 46 69 6e 61   = C_DecryptFina
34780 6c 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  l;..pFunctionLis
34790 74 2d 3e 43 5f 44 69 67 65 73 74 49 6e 69 74 20  t->C_DigestInit 
347a0 3d 20 43 5f 44 69 67 65 73 74 49 6e 69 74 3b 0a  = C_DigestInit;.
347b0 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
347c0 43 5f 44 69 67 65 73 74 20 3d 20 43 5f 44 69 67  C_Digest = C_Dig
347d0 65 73 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  est;..pFunctionL
347e0 69 73 74 2d 3e 43 5f 44 69 67 65 73 74 55 70 64  ist->C_DigestUpd
347f0 61 74 65 20 3d 20 43 5f 44 69 67 65 73 74 55 70  ate = C_DigestUp
34800 64 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  date;..pFunction
34810 4c 69 73 74 2d 3e 43 5f 44 69 67 65 73 74 4b 65  List->C_DigestKe
34820 79 20 3d 20 43 5f 44 69 67 65 73 74 4b 65 79 3b  y = C_DigestKey;
34830 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
34840 3e 43 5f 44 69 67 65 73 74 46 69 6e 61 6c 20 3d  >C_DigestFinal =
34850 20 43 5f 44 69 67 65 73 74 46 69 6e 61 6c 3b 0a   C_DigestFinal;.
34860 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
34870 43 5f 53 69 67 6e 49 6e 69 74 20 3d 20 43 5f 53  C_SignInit = C_S
34880 69 67 6e 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74  ignInit;..pFunct
34890 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 20  ionList->C_Sign 
348a0 3d 20 43 5f 53 69 67 6e 3b 0a 09 70 46 75 6e 63  = C_Sign;..pFunc
348b0 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 6e  tionList->C_Sign
348c0 55 70 64 61 74 65 20 3d 20 43 5f 53 69 67 6e 55  Update = C_SignU
348d0 70 64 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f  pdate;..pFunctio
348e0 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 46 69 6e  nList->C_SignFin
348f0 61 6c 20 3d 20 43 5f 53 69 67 6e 46 69 6e 61 6c  al = C_SignFinal
34900 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
34910 2d 3e 43 5f 53 69 67 6e 52 65 63 6f 76 65 72 49  ->C_SignRecoverI
34920 6e 69 74 20 3d 20 43 5f 53 69 67 6e 52 65 63 6f  nit = C_SignReco
34930 76 65 72 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74  verInit;..pFunct
34940 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 52  ionList->C_SignR
34950 65 63 6f 76 65 72 20 3d 20 43 5f 53 69 67 6e 52  ecover = C_SignR
34960 65 63 6f 76 65 72 3b 0a 09 70 46 75 6e 63 74 69  ecover;..pFuncti
34970 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65 72 69 66 79  onList->C_Verify
34980 49 6e 69 74 20 3d 20 43 5f 56 65 72 69 66 79 49  Init = C_VerifyI
34990 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  nit;..pFunctionL
349a0 69 73 74 2d 3e 43 5f 56 65 72 69 66 79 20 3d 20  ist->C_Verify = 
349b0 43 5f 56 65 72 69 66 79 3b 0a 09 70 46 75 6e 63  C_Verify;..pFunc
349c0 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65 72 69  tionList->C_Veri
349d0 66 79 55 70 64 61 74 65 20 3d 20 43 5f 56 65 72  fyUpdate = C_Ver
349e0 69 66 79 55 70 64 61 74 65 3b 0a 09 70 46 75 6e  ifyUpdate;..pFun
349f0 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65 72  ctionList->C_Ver
34a00 69 66 79 46 69 6e 61 6c 20 3d 20 43 5f 56 65 72  ifyFinal = C_Ver
34a10 69 66 79 46 69 6e 61 6c 3b 0a 09 70 46 75 6e 63  ifyFinal;..pFunc
34a20 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65 72 69  tionList->C_Veri
34a30 66 79 52 65 63 6f 76 65 72 49 6e 69 74 20 3d 20  fyRecoverInit = 
34a40 43 5f 56 65 72 69 66 79 52 65 63 6f 76 65 72 49  C_VerifyRecoverI
34a50 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  nit;..pFunctionL
34a60 69 73 74 2d 3e 43 5f 56 65 72 69 66 79 52 65 63  ist->C_VerifyRec
34a70 6f 76 65 72 20 3d 20 43 5f 56 65 72 69 66 79 52  over = C_VerifyR
34a80 65 63 6f 76 65 72 3b 0a 09 70 46 75 6e 63 74 69  ecover;..pFuncti
34a90 6f 6e 4c 69 73 74 2d 3e 43 5f 44 69 67 65 73 74  onList->C_Digest
34aa0 45 6e 63 72 79 70 74 55 70 64 61 74 65 20 3d 20  EncryptUpdate = 
34ab0 43 5f 44 69 67 65 73 74 45 6e 63 72 79 70 74 55  C_DigestEncryptU
34ac0 70 64 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f  pdate;..pFunctio
34ad0 6e 4c 69 73 74 2d 3e 43 5f 44 65 63 72 79 70 74  nList->C_Decrypt
34ae0 44 69 67 65 73 74 55 70 64 61 74 65 20 3d 20 43  DigestUpdate = C
34af0 5f 44 65 63 72 79 70 74 44 69 67 65 73 74 55 70  _DecryptDigestUp
34b00 64 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  date;..pFunction
34b10 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 45 6e 63 72  List->C_SignEncr
34b20 79 70 74 55 70 64 61 74 65 20 3d 20 43 5f 53 69  yptUpdate = C_Si
34b30 67 6e 45 6e 63 72 79 70 74 55 70 64 61 74 65 3b  gnEncryptUpdate;
34b40 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
34b50 3e 43 5f 44 65 63 72 79 70 74 56 65 72 69 66 79  >C_DecryptVerify
34b60 55 70 64 61 74 65 20 3d 20 43 5f 44 65 63 72 79  Update = C_Decry
34b70 70 74 56 65 72 69 66 79 55 70 64 61 74 65 3b 0a  ptVerifyUpdate;.
34b80 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
34b90 43 5f 47 65 6e 65 72 61 74 65 4b 65 79 20 3d 20  C_GenerateKey = 
34ba0 43 5f 47 65 6e 65 72 61 74 65 4b 65 79 3b 0a 09  C_GenerateKey;..
34bb0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
34bc0 5f 47 65 6e 65 72 61 74 65 4b 65 79 50 61 69 72  _GenerateKeyPair
34bd0 20 3d 20 43 5f 47 65 6e 65 72 61 74 65 4b 65 79   = C_GenerateKey
34be0 50 61 69 72 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  Pair;..pFunction
34bf0 4c 69 73 74 2d 3e 43 5f 57 72 61 70 4b 65 79 20  List->C_WrapKey 
34c00 3d 20 43 5f 57 72 61 70 4b 65 79 3b 0a 09 70 46  = C_WrapKey;..pF
34c10 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 55  unctionList->C_U
34c20 6e 77 72 61 70 4b 65 79 20 3d 20 43 5f 55 6e 77  nwrapKey = C_Unw
34c30 72 61 70 4b 65 79 3b 0a 09 70 46 75 6e 63 74 69  rapKey;..pFuncti
34c40 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65 72 69 76 65  onList->C_Derive
34c50 4b 65 79 20 3d 20 43 5f 44 65 72 69 76 65 4b 65  Key = C_DeriveKe
34c60 79 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  y;..pFunctionLis
34c70 74 2d 3e 43 5f 53 65 65 64 52 61 6e 64 6f 6d 20  t->C_SeedRandom 
34c80 3d 20 43 5f 53 65 65 64 52 61 6e 64 6f 6d 3b 0a  = C_SeedRandom;.
34c90 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
34ca0 43 5f 47 65 6e 65 72 61 74 65 52 61 6e 64 6f 6d  C_GenerateRandom
34cb0 20 3d 20 43 5f 47 65 6e 65 72 61 74 65 52 61 6e   = C_GenerateRan
34cc0 64 6f 6d 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  dom;..pFunctionL
34cd0 69 73 74 2d 3e 43 5f 47 65 74 46 75 6e 63 74 69  ist->C_GetFuncti
34ce0 6f 6e 53 74 61 74 75 73 20 3d 20 43 5f 47 65 74  onStatus = C_Get
34cf0 46 75 6e 63 74 69 6f 6e 53 74 61 74 75 73 3b 0a  FunctionStatus;.
34d00 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
34d10 43 5f 43 61 6e 63 65 6c 46 75 6e 63 74 69 6f 6e  C_CancelFunction
34d20 20 3d 20 43 5f 43 61 6e 63 65 6c 46 75 6e 63 74   = C_CancelFunct
34d30 69 6f 6e 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  ion;..pFunctionL
34d40 69 73 74 2d 3e 43 5f 47 65 74 46 75 6e 63 74 69  ist->C_GetFuncti
34d50 6f 6e 4c 69 73 74 20 3d 20 43 5f 47 65 74 46 75  onList = C_GetFu
34d60 6e 63 74 69 6f 6e 4c 69 73 74 3b 0a 0a 09 2a 70  nctionList;...*p
34d70 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 20 3d 20  pFunctionList = 
34d80 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 3b 0a 0a  pFunctionList;..
34d90 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
34da0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
34db0 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b  CKR_OK (%i)", CK
34dc0 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28  R_OK);...return(
34dd0 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a              CKR_OK);.}..