Hex Artifact Content

Artifact aa058371f0799a5f1f2e50cf7cf716d8a3010a86:


0000: 23 69 66 64 65 66 20 48 41 56 45 5f 43 4f 4e 46  #ifdef HAVE_CONF
0010: 49 47 5f 48 0a 23 69 6e 63 6c 75 64 65 20 22 63  IG_H.#include "c
0020: 6f 6e 66 69 67 2e 68 22 0a 23 65 6e 64 69 66 0a  onfig.h".#endif.
0030: 0a 23 69 66 64 65 66 20 48 41 56 45 5f 57 49 4e  .#ifdef HAVE_WIN
0040: 54 59 50 45 53 5f 48 0a 23 20 20 69 6e 63 6c 75  TYPES_H.#  inclu
0050: 64 65 20 3c 77 69 6e 74 79 70 65 73 2e 68 3e 0a  de <wintypes.h>.
0060: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 48 41  #endif.#ifdef HA
0070: 56 45 5f 50 43 53 43 4c 49 54 45 5f 48 0a 23 20  VE_PCSCLITE_H.# 
0080: 20 69 6e 63 6c 75 64 65 20 3c 70 63 73 63 6c 69   include <pcscli
0090: 74 65 2e 68 3e 0a 23 65 6e 64 69 66 0a 23 69 66  te.h>.#endif.#if
00a0: 64 65 66 20 48 41 56 45 5f 57 49 4e 53 43 41 52  def HAVE_WINSCAR
00b0: 44 5f 48 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c  D_H.#  include <
00c0: 77 69 6e 73 63 61 72 64 2e 68 3e 0a 23 65 6e 64  winscard.h>.#end
00d0: 69 66 0a 23 69 66 64 65 66 20 48 41 56 45 5f 53  if.#ifdef HAVE_S
00e0: 54 44 49 4e 54 5f 48 0a 23 20 20 69 6e 63 6c 75  TDINT_H.#  inclu
00f0: 64 65 20 3c 73 74 64 69 6e 74 2e 68 3e 0a 23 65  de <stdint.h>.#e
0100: 6e 64 69 66 0a 23 69 66 64 65 66 20 48 41 56 45  ndif.#ifdef HAVE
0110: 5f 49 4e 54 54 59 50 45 53 5f 48 0a 23 20 20 69  _INTTYPES_H.#  i
0120: 6e 63 6c 75 64 65 20 3c 69 6e 74 74 79 70 65 73  nclude <inttypes
0130: 2e 68 3e 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  .h>.#endif.#ifde
0140: 66 20 48 41 56 45 5f 53 54 44 4c 49 42 5f 48 0a  f HAVE_STDLIB_H.
0150: 23 20 20 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c  #  include <stdl
0160: 69 62 2e 68 3e 0a 23 65 6e 64 69 66 0a 23 69 66  ib.h>.#endif.#if
0170: 64 65 66 20 48 41 56 45 5f 55 4e 49 53 54 44 5f  def HAVE_UNISTD_
0180: 48 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 75 6e  H.#  include <un
0190: 69 73 74 64 2e 68 3e 0a 23 65 6e 64 69 66 0a 23  istd.h>.#endif.#
01a0: 69 66 64 65 66 20 48 41 56 45 5f 53 54 52 49 4e  ifdef HAVE_STRIN
01b0: 47 5f 48 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c  G_H.#  include <
01c0: 73 74 72 69 6e 67 2e 68 3e 0a 23 65 6e 64 69 66  string.h>.#endif
01d0: 0a 23 69 66 64 65 66 20 48 41 56 45 5f 50 54 48  .#ifdef HAVE_PTH
01e0: 52 45 41 44 5f 48 0a 23 20 20 69 6e 63 6c 75 64  READ_H.#  includ
01f0: 65 20 3c 70 74 68 72 65 61 64 2e 68 3e 0a 23 65  e <pthread.h>.#e
0200: 6e 64 69 66 0a 23 69 66 64 65 66 20 48 41 56 45  ndif.#ifdef HAVE
0210: 5f 4c 49 4d 49 54 53 5f 48 0a 23 20 20 69 6e 63  _LIMITS_H.#  inc
0220: 6c 75 64 65 20 3c 6c 69 6d 69 74 73 2e 68 3e 0a  lude <limits.h>.
0230: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 48 41  #endif.#ifdef HA
0240: 56 45 5f 53 54 44 49 4f 5f 48 0a 23 20 20 69 6e  VE_STDIO_H.#  in
0250: 63 6c 75 64 65 20 3c 73 74 64 69 6f 2e 68 3e 0a  clude <stdio.h>.
0260: 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 48  #endif.#define H
0270: 41 56 45 5f 45 52 52 4e 4f 5f 48 20 31 0a 23 69  AVE_ERRNO_H 1.#i
0280: 66 64 65 66 20 48 41 56 45 5f 45 52 52 4e 4f 5f  fdef HAVE_ERRNO_
0290: 48 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 65 72  H.#  include <er
02a0: 72 6e 6f 2e 68 3e 0a 23 65 6e 64 69 66 0a 23 69  rno.h>.#endif.#i
02b0: 66 64 65 66 20 48 41 56 45 5f 5a 4c 49 42 5f 48  fdef HAVE_ZLIB_H
02c0: 0a 23 20 20 69 66 64 65 66 20 48 41 56 45 5f 4c  .#  ifdef HAVE_L
02d0: 49 42 5a 0a 23 20 20 20 20 69 6e 63 6c 75 64 65  IBZ.#    include
02e0: 20 3c 7a 6c 69 62 2e 68 3e 0a 23 20 20 65 6e 64   <zlib.h>.#  end
02f0: 69 66 0a 23 65 6c 73 65 0a 23 20 20 69 66 64 65  if.#else.#  ifde
0300: 66 20 48 41 56 45 5f 4c 49 42 5a 0a 23 20 20 20  f HAVE_LIBZ.#   
0310: 20 75 6e 64 65 66 20 48 41 56 45 5f 4c 49 42 5a   undef HAVE_LIBZ
0320: 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69 66  .#  endif.#endif
0330: 0a 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f 44  .#ifdef CACKEY_D
0340: 45 42 55 47 5f 53 45 41 52 43 48 5f 53 50 45 45  EBUG_SEARCH_SPEE
0350: 44 54 45 53 54 0a 23 20 20 69 6e 63 6c 75 64 65  DTEST.#  include
0360: 20 3c 73 79 73 2f 74 69 6d 65 2e 68 3e 0a 23 65   <sys/time.h>.#e
0370: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 43 4b  ndif..#define CK
0380: 5f 50 54 52 20 2a 0a 23 64 65 66 69 6e 65 20 43  _PTR *.#define C
0390: 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
03a0: 4e 28 72 65 74 75 72 6e 54 79 70 65 2c 20 6e 61  N(returnType, na
03b0: 6d 65 29 20 72 65 74 75 72 6e 54 79 70 65 20 6e  me) returnType n
03c0: 61 6d 65 0a 23 64 65 66 69 6e 65 20 43 4b 5f 44  ame.#define CK_D
03d0: 45 43 4c 41 52 45 5f 46 55 4e 43 54 49 4f 4e 28  ECLARE_FUNCTION(
03e0: 72 65 74 75 72 6e 54 79 70 65 2c 20 6e 61 6d 65  returnType, name
03f0: 29 20 72 65 74 75 72 6e 54 79 70 65 20 6e 61 6d  ) returnType nam
0400: 65 0a 23 64 65 66 69 6e 65 20 43 4b 5f 44 45 43  e.#define CK_DEC
0410: 4c 41 52 45 5f 46 55 4e 43 54 49 4f 4e 5f 50 4f  LARE_FUNCTION_PO
0420: 49 4e 54 45 52 28 72 65 74 75 72 6e 54 79 70 65  INTER(returnType
0430: 2c 20 6e 61 6d 65 29 20 72 65 74 75 72 6e 54 79  , name) returnTy
0440: 70 65 20 28 2a 20 6e 61 6d 65 29 0a 23 64 65 66  pe (* name).#def
0450: 69 6e 65 20 43 4b 5f 43 41 4c 4c 42 41 43 4b 5f  ine CK_CALLBACK_
0460: 46 55 4e 43 54 49 4f 4e 28 72 65 74 75 72 6e 54  FUNCTION(returnT
0470: 79 70 65 2c 20 6e 61 6d 65 29 20 72 65 74 75 72  ype, name) retur
0480: 6e 54 79 70 65 20 28 2a 20 6e 61 6d 65 29 0a 23  nType (* name).#
0490: 69 66 6e 64 65 66 20 4e 55 4c 4c 5f 50 54 52 0a  ifndef NULL_PTR.
04a0: 23 20 20 64 65 66 69 6e 65 20 4e 55 4c 4c 5f 50  #  define NULL_P
04b0: 54 52 20 30 0a 23 65 6e 64 69 66 0a 0a 23 69 6e  TR 0.#endif..#in
04c0: 63 6c 75 64 65 20 22 70 6b 63 73 31 31 2e 68 22  clude "pkcs11.h"
04d0: 0a 23 69 6e 63 6c 75 64 65 20 22 70 6b 63 73 31  .#include "pkcs1
04e0: 31 6e 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22  1n.h".#include "
04f0: 61 73 6e 31 2d 78 35 30 39 2e 68 22 0a 23 69 6e  asn1-x509.h".#in
0500: 63 6c 75 64 65 20 22 73 68 61 31 2e 68 22 0a 23  clude "sha1.h".#
0510: 69 6e 63 6c 75 64 65 20 22 6d 64 35 2e 68 22 0a  include "md5.h".
0520: 0a 23 69 66 6e 64 65 66 20 43 41 43 4b 45 59 5f  .#ifndef CACKEY_
0530: 43 52 59 50 54 4f 4b 49 5f 56 45 52 53 49 4f 4e  CRYPTOKI_VERSION
0540: 5f 43 4f 44 45 0a 23 20 20 64 65 66 69 6e 65 20  _CODE.#  define 
0550: 43 41 43 4b 45 59 5f 43 52 59 50 54 4f 4b 49 5f  CACKEY_CRYPTOKI_
0560: 56 45 52 53 49 4f 4e 5f 43 4f 44 45 20 30 78 30  VERSION_CODE 0x0
0570: 32 31 65 30 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a  21e00.#endif../*
0580: 20 47 53 43 2d 49 53 20 76 32 2e 31 20 44 65 66   GSC-IS v2.1 Def
0590: 69 6e 69 74 69 6f 6e 73 20 2a 2f 0a 2f 2a 2a 20  initions */./** 
05a0: 43 6c 61 73 73 65 73 20 2a 2a 2f 0a 23 64 65 66  Classes **/.#def
05b0: 69 6e 65 20 47 53 43 49 53 5f 43 4c 41 53 53 5f  ine GSCIS_CLASS_
05c0: 49 53 4f 37 38 31 36 20 20 20 20 20 20 20 20 20  ISO7816         
05d0: 20 20 30 78 30 30 0a 23 64 65 66 69 6e 65 20 47    0x00.#define G
05e0: 53 43 49 53 5f 43 4c 41 53 53 5f 47 4c 4f 42 41  SCIS_CLASS_GLOBA
05f0: 4c 5f 50 4c 41 54 46 4f 52 4d 20 20 20 30 78 38  L_PLATFORM   0x8
0600: 30 0a 0a 2f 2a 2a 20 49 6e 73 74 72 75 63 74 69  0../** Instructi
0610: 6f 6e 73 20 2a 2a 2f 0a 23 64 65 66 69 6e 65 20  ons **/.#define 
0620: 47 53 43 49 53 5f 49 4e 53 54 52 5f 47 45 54 5f  GSCIS_INSTR_GET_
0630: 52 45 53 50 4f 4e 53 45 20 20 20 20 20 20 30 78  RESPONSE      0x
0640: 43 30 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53  C0.#define GSCIS
0650: 5f 49 4e 53 54 52 5f 52 45 41 44 5f 42 49 4e 41  _INSTR_READ_BINA
0660: 52 59 20 20 20 20 20 20 20 30 78 42 30 0a 23 64  RY       0xB0.#d
0670: 65 66 69 6e 65 20 47 53 43 49 53 5f 49 4e 53 54  efine GSCIS_INST
0680: 52 5f 55 50 44 41 54 45 5f 42 49 4e 41 52 59 20  R_UPDATE_BINARY 
0690: 20 20 20 20 30 78 44 36 0a 23 64 65 66 69 6e 65      0xD6.#define
06a0: 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 53 45 4c   GSCIS_INSTR_SEL
06b0: 45 43 54 20 20 20 20 20 20 20 20 20 20 20 20 30  ECT            0
06c0: 78 41 34 0a 23 64 65 66 69 6e 65 20 47 53 43 49  xA4.#define GSCI
06d0: 53 5f 49 4e 53 54 52 5f 45 58 54 45 52 4e 41 4c  S_INSTR_EXTERNAL
06e0: 5f 41 55 54 48 20 20 20 20 20 30 78 38 32 0a 23  _AUTH     0x82.#
06f0: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 49 4e 53  define GSCIS_INS
0700: 54 52 5f 47 45 54 5f 43 48 41 4c 4c 45 4e 47 45  TR_GET_CHALLENGE
0710: 20 20 20 20 20 30 78 38 34 0a 23 64 65 66 69 6e       0x84.#defin
0720: 65 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 49 4e  e GSCIS_INSTR_IN
0730: 54 45 52 4e 41 4c 5f 41 55 54 48 20 20 20 20 20  TERNAL_AUTH     
0740: 30 78 38 38 0a 23 64 65 66 69 6e 65 20 47 53 43  0x88.#define GSC
0750: 49 53 5f 49 4e 53 54 52 5f 56 45 52 49 46 59 20  IS_INSTR_VERIFY 
0760: 20 20 20 20 20 20 20 20 20 20 20 30 78 32 30 0a             0x20.
0770: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 49 4e  #define GSCIS_IN
0780: 53 54 52 5f 43 48 41 4e 47 45 5f 52 45 46 45 52  STR_CHANGE_REFER
0790: 45 4e 43 45 20 20 30 78 32 34 0a 23 64 65 66 69  ENCE  0x24.#defi
07a0: 6e 65 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 53  ne GSCIS_INSTR_S
07b0: 49 47 4e 20 20 20 20 20 20 20 20 20 20 20 20 20  IGN             
07c0: 20 30 78 32 41 0a 23 64 65 66 69 6e 65 20 47 53   0x2A.#define GS
07d0: 43 49 53 5f 49 4e 53 54 52 5f 47 45 54 5f 50 52  CIS_INSTR_GET_PR
07e0: 4f 50 20 20 20 20 20 20 20 20 20 20 30 78 35 36  OP          0x56
07f0: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 49  .#define GSCIS_I
0800: 4e 53 54 52 5f 47 45 54 5f 41 43 52 20 20 20 20  NSTR_GET_ACR    
0810: 20 20 20 20 20 20 20 30 78 34 43 0a 23 64 65 66         0x4C.#def
0820: 69 6e 65 20 47 53 43 49 53 5f 49 4e 53 54 52 5f  ine GSCIS_INSTR_
0830: 52 45 41 44 5f 42 55 46 46 45 52 20 20 20 20 20  READ_BUFFER     
0840: 20 20 30 78 35 32 0a 23 64 65 66 69 6e 65 20 47    0x52.#define G
0850: 53 43 49 53 5f 49 4e 53 54 52 5f 53 49 47 4e 44  SCIS_INSTR_SIGND
0860: 45 43 52 59 50 54 20 20 20 20 20 20 20 30 78 34  ECRYPT       0x4
0870: 32 0a 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53  2..#define GSCIS
0880: 5f 50 41 52 41 4d 5f 53 45 4c 45 43 54 5f 41 50  _PARAM_SELECT_AP
0890: 50 4c 45 54 20 20 20 20 20 30 78 30 34 0a 0a 2f  PLET     0x04../
08a0: 2a 2a 20 54 61 67 73 20 2a 2a 2f 0a 2f 2a 2a 2a  ** Tags **/./***
08b0: 20 43 43 43 20 54 61 67 73 20 2a 2a 2a 2f 0a 23   CCC Tags ***/.#
08c0: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47  define GSCIS_TAG
08d0: 5f 43 41 52 44 49 44 20 20 20 20 20 20 20 20 20  _CARDID         
08e0: 20 20 20 20 20 30 78 46 30 0a 23 64 65 66 69 6e       0xF0.#defin
08f0: 65 20 47 53 43 49 53 5f 54 41 47 5f 43 43 43 5f  e GSCIS_TAG_CCC_
0900: 56 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20  VER             
0910: 30 78 46 31 0a 23 64 65 66 69 6e 65 20 47 53 43  0xF1.#define GSC
0920: 49 53 5f 54 41 47 5f 43 43 47 5f 56 45 52 20 20  IS_TAG_CCG_VER  
0930: 20 20 20 20 20 20 20 20 20 20 20 30 78 46 32 0a             0xF2.
0940: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
0950: 47 5f 43 41 52 44 55 52 4c 20 20 20 20 20 20 20  G_CARDURL       
0960: 20 20 20 20 20 20 30 78 46 33 0a 23 64 65 66 69        0xF3.#defi
0970: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 50 4b 43  ne GSCIS_TAG_PKC
0980: 53 31 35 20 20 20 20 20 20 20 20 20 20 20 20 20  S15             
0990: 20 30 78 46 34 0a 23 64 65 66 69 6e 65 20 47 53   0xF4.#define GS
09a0: 43 49 53 5f 54 41 47 5f 52 45 47 5f 44 41 54 41  CIS_TAG_REG_DATA
09b0: 5f 4d 4f 44 45 4c 20 20 20 20 20 20 30 78 46 35  _MODEL      0xF5
09c0: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54  .#define GSCIS_T
09d0: 41 47 5f 41 43 52 5f 54 41 42 4c 45 20 20 20 20  AG_ACR_TABLE    
09e0: 20 20 20 20 20 20 20 30 78 46 36 0a 23 64 65 66         0xF6.#def
09f0: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 43 41  ine GSCIS_TAG_CA
0a00: 52 44 5f 41 50 44 55 20 20 20 20 20 20 20 20 20  RD_APDU         
0a10: 20 20 30 78 46 37 0a 23 64 65 66 69 6e 65 20 47    0xF7.#define G
0a20: 53 43 49 53 5f 54 41 47 5f 52 45 44 49 52 45 43  SCIS_TAG_REDIREC
0a30: 54 49 4f 4e 20 20 20 20 20 20 20 20 20 30 78 46  TION         0xF
0a40: 41 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f  A.#define GSCIS_
0a50: 54 41 47 5f 43 54 20 20 20 20 20 20 20 20 20 20  TAG_CT          
0a60: 20 20 20 20 20 20 20 20 30 78 46 42 0a 23 64 65          0xFB.#de
0a70: 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 53  fine GSCIS_TAG_S
0a80: 54 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  T               
0a90: 20 20 20 30 78 46 43 0a 23 64 65 66 69 6e 65 20     0xFC.#define 
0aa0: 47 53 43 49 53 5f 54 41 47 5f 4e 45 58 54 43 43  GSCIS_TAG_NEXTCC
0ab0: 43 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78  C             0x
0ac0: 46 44 0a 0a 2f 2a 2a 2a 20 47 65 6e 65 72 61 6c  FD../*** General
0ad0: 20 2d 20 45 46 20 32 32 30 30 20 2a 2a 2a 2f 0a   - EF 2200 ***/.
0ae0: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
0af0: 47 5f 46 4e 41 4d 45 20 20 20 20 20 20 20 20 20  G_FNAME         
0b00: 20 20 20 20 20 20 30 78 30 31 0a 23 64 65 66 69        0x01.#defi
0b10: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 4d 4e 41  ne GSCIS_TAG_MNA
0b20: 4d 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ME              
0b30: 20 30 78 30 32 0a 23 64 65 66 69 6e 65 20 47 53   0x02.#define GS
0b40: 43 49 53 5f 54 41 47 5f 4c 4e 41 4d 45 20 20 20  CIS_TAG_LNAME   
0b50: 20 20 20 20 20 20 20 20 20 20 20 20 30 78 30 33              0x03
0b60: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54  .#define GSCIS_T
0b70: 41 47 5f 53 55 46 46 49 58 20 20 20 20 20 20 20  AG_SUFFIX       
0b80: 20 20 20 20 20 20 20 30 78 30 34 0a 23 64 65 66         0x04.#def
0b90: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 47 4f  ine GSCIS_TAG_GO
0ba0: 56 54 5f 41 47 45 4e 43 59 20 20 20 20 20 20 20  VT_AGENCY       
0bb0: 20 20 30 78 30 35 0a 23 64 65 66 69 6e 65 20 47    0x05.#define G
0bc0: 53 43 49 53 5f 54 41 47 5f 42 55 52 45 41 55 20  SCIS_TAG_BUREAU 
0bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78 30               0x0
0be0: 36 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f  6.#define GSCIS_
0bf0: 54 41 47 5f 42 55 52 45 41 55 5f 43 4f 44 45 20  TAG_BUREAU_CODE 
0c00: 20 20 20 20 20 20 20 20 30 78 30 37 0a 23 64 65          0x07.#de
0c10: 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 44  fine GSCIS_TAG_D
0c20: 45 50 54 5f 43 4f 44 45 20 20 20 20 20 20 20 20  EPT_CODE        
0c30: 20 20 20 30 78 30 38 0a 23 64 65 66 69 6e 65 20     0x08.#define 
0c40: 47 53 43 49 53 5f 54 41 47 5f 54 49 54 4c 45 20  GSCIS_TAG_TITLE 
0c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78                0x
0c60: 30 39 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53  09.#define GSCIS
0c70: 5f 54 41 47 5f 42 55 49 4c 44 49 4e 47 20 20 20  _TAG_BUILDING   
0c80: 20 20 20 20 20 20 20 20 20 30 78 31 30 0a 23 64           0x10.#d
0c90: 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f  efine GSCIS_TAG_
0ca0: 4f 46 46 49 43 45 5f 41 44 44 52 31 20 20 20 20  OFFICE_ADDR1    
0cb0: 20 20 20 20 30 78 31 31 0a 23 64 65 66 69 6e 65      0x11.#define
0cc0: 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43   GSCIS_TAG_OFFIC
0cd0: 45 5f 41 44 44 52 32 20 20 20 20 20 20 20 20 30  E_ADDR2        0
0ce0: 78 31 32 0a 23 64 65 66 69 6e 65 20 47 53 43 49  x12.#define GSCI
0cf0: 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 43 49 54  S_TAG_OFFICE_CIT
0d00: 59 20 20 20 20 20 20 20 20 20 30 78 31 33 0a 23  Y         0x13.#
0d10: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47  define GSCIS_TAG
0d20: 5f 4f 46 46 49 43 45 5f 53 54 41 54 45 20 20 20  _OFFICE_STATE   
0d30: 20 20 20 20 20 30 78 31 34 0a 23 64 65 66 69 6e       0x14.#defin
0d40: 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49  e GSCIS_TAG_OFFI
0d50: 43 45 5f 5a 49 50 20 20 20 20 20 20 20 20 20 20  CE_ZIP          
0d60: 30 78 31 35 0a 23 64 65 66 69 6e 65 20 47 53 43  0x15.#define GSC
0d70: 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 43 4f  IS_TAG_OFFICE_CO
0d80: 55 4e 54 52 59 20 20 20 20 20 20 30 78 31 36 0a  UNTRY      0x16.
0d90: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
0da0: 47 5f 4f 46 46 49 43 45 5f 50 48 4f 4e 45 20 20  G_OFFICE_PHONE  
0db0: 20 20 20 20 20 20 30 78 31 37 0a 23 64 65 66 69        0x17.#defi
0dc0: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46  ne GSCIS_TAG_OFF
0dd0: 49 43 45 5f 50 48 4f 4e 45 5f 45 58 54 20 20 20  ICE_PHONE_EXT   
0de0: 20 30 78 31 38 0a 23 64 65 66 69 6e 65 20 47 53   0x18.#define GS
0df0: 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 46  CIS_TAG_OFFICE_F
0e00: 41 58 20 20 20 20 20 20 20 20 20 20 30 78 31 39  AX          0x19
0e10: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54  .#define GSCIS_T
0e20: 41 47 5f 4f 46 46 49 43 45 5f 45 4d 41 49 4c 20  AG_OFFICE_EMAIL 
0e30: 20 20 20 20 20 20 20 30 78 31 41 0a 23 64 65 66         0x1A.#def
0e40: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46  ine GSCIS_TAG_OF
0e50: 46 49 43 45 5f 52 4f 4f 4d 20 20 20 20 20 20 20  FICE_ROOM       
0e60: 20 20 30 78 31 42 0a 23 64 65 66 69 6e 65 20 47    0x1B.#define G
0e70: 53 43 49 53 5f 54 41 47 5f 4e 4f 4e 47 4f 56 5f  SCIS_TAG_NONGOV_
0e80: 41 47 45 4e 43 59 20 20 20 20 20 20 20 30 78 31  AGENCY       0x1
0e90: 43 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f  C.#define GSCIS_
0ea0: 54 41 47 5f 53 53 4e 5f 44 45 53 49 47 4e 41 54  TAG_SSN_DESIGNAT
0eb0: 4f 52 20 20 20 20 20 20 30 78 31 44 0a 0a 2f 2a  OR      0x1D../*
0ec0: 2a 2a 20 50 49 49 20 2d 20 45 46 20 32 31 30 30  ** PII - EF 2100
0ed0: 20 2a 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 47 53   ***/.#define GS
0ee0: 43 49 53 5f 54 41 47 5f 53 53 4e 20 20 20 20 20  CIS_TAG_SSN     
0ef0: 20 20 20 20 20 20 20 20 20 20 20 20 30 78 32 30              0x20
0f00: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54  .#define GSCIS_T
0f10: 41 47 5f 44 4f 42 20 20 20 20 20 20 20 20 20 20  AG_DOB          
0f20: 20 20 20 20 20 20 20 30 78 32 31 0a 23 64 65 66         0x21.#def
0f30: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 47 45  ine GSCIS_TAG_GE
0f40: 4e 44 45 52 20 20 20 20 20 20 20 20 20 20 20 20  NDER            
0f50: 20 20 30 78 32 32 0a 0a 2f 2a 2a 2a 20 4c 6f 67    0x22../*** Log
0f60: 69 6e 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d  in Information -
0f70: 20 45 46 20 34 30 30 30 20 2a 2a 2a 2f 0a 23 64   EF 4000 ***/.#d
0f80: 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f  efine GSCIS_TAG_
0f90: 55 53 45 52 49 44 20 20 20 20 20 20 20 20 20 20  USERID          
0fa0: 20 20 20 20 30 78 34 30 0a 23 64 65 66 69 6e 65      0x40.#define
0fb0: 20 47 53 43 49 53 5f 54 41 47 5f 44 4f 4d 41 49   GSCIS_TAG_DOMAI
0fc0: 4e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30  N              0
0fd0: 78 34 31 0a 23 64 65 66 69 6e 65 20 47 53 43 49  x41.#define GSCI
0fe0: 53 5f 54 41 47 5f 50 41 53 53 57 4f 52 44 20 20  S_TAG_PASSWORD  
0ff0: 20 20 20 20 20 20 20 20 20 20 30 78 34 32 0a 0a            0x42..
1000: 2f 2a 2a 2a 20 43 61 72 64 20 49 6e 66 6f 72 6d  /*** Card Inform
1010: 61 74 69 6f 6e 20 2d 20 45 46 20 35 30 30 30 20  ation - EF 5000 
1020: 2a 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 47 53 43  ***/.#define GSC
1030: 49 53 5f 54 41 47 5f 49 53 53 55 45 52 49 44 20  IS_TAG_ISSUERID 
1040: 20 20 20 20 20 20 20 20 20 20 20 30 78 35 30 0a             0x50.
1050: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
1060: 47 5f 53 45 52 4e 4f 20 20 20 20 20 20 20 20 20  G_SERNO         
1070: 20 20 20 20 20 20 30 78 35 31 0a 23 64 65 66 69        0x51.#defi
1080: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 49 53 53  ne GSCIS_TAG_ISS
1090: 55 45 5f 44 41 54 45 20 20 20 20 20 20 20 20 20  UE_DATE         
10a0: 20 30 78 35 32 0a 23 64 65 66 69 6e 65 20 47 53   0x52.#define GS
10b0: 43 49 53 5f 54 41 47 5f 45 58 50 49 52 45 5f 44  CIS_TAG_EXPIRE_D
10c0: 41 54 45 20 20 20 20 20 20 20 20 20 30 78 35 33  ATE         0x53
10d0: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54  .#define GSCIS_T
10e0: 41 47 5f 43 41 52 44 5f 54 59 50 45 20 20 20 20  AG_CARD_TYPE    
10f0: 20 20 20 20 20 20 20 30 78 35 34 0a 23 64 65 66         0x54.#def
1100: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 53 45  ine GSCIS_TAG_SE
1110: 43 55 52 49 54 59 5f 43 4f 44 45 20 20 20 20 20  CURITY_CODE     
1120: 20 20 30 78 35 37 0a 23 64 65 66 69 6e 65 20 47    0x57.#define G
1130: 53 43 49 53 5f 54 41 47 5f 43 41 52 44 49 44 5f  SCIS_TAG_CARDID_
1140: 41 49 44 20 20 20 20 20 20 20 20 20 20 30 78 35  AID          0x5
1150: 38 0a 0a 2f 2a 2a 2a 20 50 49 56 20 43 6f 64 65  8../*** PIV Code
1160: 73 20 2a 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e  s ***/.#define N
1170: 49 53 54 53 50 38 30 30 5f 37 33 5f 33 5f 49 4e  ISTSP800_73_3_IN
1180: 53 54 52 5f 47 45 54 5f 44 41 54 41 20 30 78 43  STR_GET_DATA 0xC
1190: 42 0a 23 64 65 66 69 6e 65 20 4e 49 53 54 53 50  B.#define NISTSP
11a0: 38 30 30 5f 37 33 5f 33 5f 49 4e 53 54 52 5f 47  800_73_3_INSTR_G
11b0: 45 4e 41 55 54 48 20 20 30 78 38 37 0a 0a 2f 2a  ENAUTH  0x87../*
11c0: 2a 2a 20 50 4b 49 20 49 6e 66 6f 72 6d 61 74 69  ** PKI Informati
11d0: 6f 6e 20 2d 20 45 46 20 37 30 30 30 20 2a 2a 2a  on - EF 7000 ***
11e0: 2f 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f  /.#define GSCIS_
11f0: 54 41 47 5f 43 45 52 54 49 46 49 43 41 54 45 20  TAG_CERTIFICATE 
1200: 20 20 20 20 20 20 20 20 30 78 37 30 0a 23 64 65          0x70.#de
1210: 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 43  fine GSCIS_TAG_C
1220: 45 52 54 5f 49 53 53 55 45 5f 44 41 54 45 20 20  ERT_ISSUE_DATE  
1230: 20 20 20 30 78 37 31 0a 23 64 65 66 69 6e 65 20     0x71.#define 
1240: 47 53 43 49 53 5f 54 41 47 5f 43 45 52 54 5f 45  GSCIS_TAG_CERT_E
1250: 58 50 49 52 45 5f 44 41 54 45 20 20 20 20 30 78  XPIRE_DATE    0x
1260: 37 32 0a 0a 2f 2a 2a 20 41 70 70 6c 65 74 20 49  72../** Applet I
1270: 44 73 20 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 47  Ds **/.#define G
1280: 53 43 49 53 5f 41 49 44 5f 43 43 43 20 20 20 20  SCIS_AID_CCC    
1290: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78 41               0xA
12a0: 30 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30  0, 0x00, 0x00, 0
12b0: 78 30 31 2c 20 30 78 31 36 2c 20 30 78 44 42 2c  x01, 0x16, 0xDB,
12c0: 20 30 78 30 30 0a 23 64 65 66 69 6e 65 20 4e 49   0x00.#define NI
12d0: 53 54 53 50 38 30 30 5f 37 33 5f 33 5f 50 49 56  STSP800_73_3_PIV
12e0: 5f 41 49 44 20 20 20 20 20 20 20 20 30 78 41 30  _AID        0xA0
12f0: 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78  , 0x00, 0x00, 0x
1300: 30 33 2c 20 30 78 30 38 2c 20 30 78 30 30 2c 20  03, 0x08, 0x00, 
1310: 30 78 30 30 2c 20 30 78 31 30 2c 20 30 78 30 30  0x00, 0x10, 0x00
1320: 2c 20 30 78 30 31 2c 20 30 78 30 30 0a 0a 2f 2a  , 0x01, 0x00../*
1330: 20 50 49 56 20 49 44 73 20 2a 2f 0a 2f 2a 2a 20   PIV IDs */./** 
1340: 4b 65 79 20 49 64 65 6e 74 69 66 69 65 72 73 20  Key Identifiers 
1350: 28 4e 49 53 54 20 53 50 20 38 30 30 2d 37 38 2d  (NIST SP 800-78-
1360: 33 2c 20 54 61 62 6c 65 20 36 2d 31 20 2a 2a 2f  3, Table 6-1 **/
1370: 0a 23 64 65 66 69 6e 65 20 4e 49 53 54 53 50 38  .#define NISTSP8
1380: 30 30 5f 37 38 5f 33 5f 4b 45 59 5f 50 49 56 41  00_78_3_KEY_PIVA
1390: 55 54 48 20 20 20 30 78 39 41 0a 23 64 65 66 69  UTH   0x9A.#defi
13a0: 6e 65 20 4e 49 53 54 53 50 38 30 30 5f 37 38 5f  ne NISTSP800_78_
13b0: 33 5f 4b 45 59 5f 53 49 47 4e 41 54 55 52 45 20  3_KEY_SIGNATURE 
13c0: 30 78 39 43 0a 23 64 65 66 69 6e 65 20 4e 49 53  0x9C.#define NIS
13d0: 54 53 50 38 30 30 5f 37 38 5f 33 5f 4b 45 59 5f  TSP800_78_3_KEY_
13e0: 4b 45 59 4d 47 54 20 20 20 20 30 78 39 44 0a 23  KEYMGT    0x9D.#
13f0: 64 65 66 69 6e 65 20 4e 49 53 54 53 50 38 30 30  define NISTSP800
1400: 5f 37 38 5f 33 5f 4b 45 59 5f 43 41 52 44 41 55  _78_3_KEY_CARDAU
1410: 54 48 20 20 30 78 39 45 0a 0a 2f 2a 2a 20 41 6c  TH  0x9E../** Al
1420: 67 6f 72 69 74 68 6d 20 49 64 65 6e 74 69 66 69  gorithm Identifi
1430: 65 72 73 20 28 4e 49 53 54 20 53 50 20 38 30 30  ers (NIST SP 800
1440: 2d 37 38 2d 33 2c 20 54 61 62 6c 65 20 36 2d 32  -78-3, Table 6-2
1450: 20 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 49 53   **/.#define NIS
1460: 54 53 50 38 30 30 5f 37 38 5f 33 5f 41 4c 47 4f  TSP800_78_3_ALGO
1470: 5f 52 53 41 31 30 32 34 20 20 30 78 30 36 0a 23  _RSA1024  0x06.#
1480: 64 65 66 69 6e 65 20 4e 49 53 54 53 50 38 30 30  define NISTSP800
1490: 5f 37 38 5f 33 5f 41 4c 47 4f 5f 52 53 41 32 30  _78_3_ALGO_RSA20
14a0: 34 38 20 20 30 78 30 37 0a 0a 2f 2a 2a 20 4f 62  48  0x07../** Ob
14b0: 6a 65 63 74 20 49 64 65 6e 74 69 66 69 65 72 73  ject Identifiers
14c0: 20 28 4e 49 53 54 20 53 50 20 38 30 30 2d 37 33   (NIST SP 800-73
14d0: 2d 33 20 50 61 72 74 20 31 2c 20 54 61 62 6c 65  -3 Part 1, Table
14e0: 20 32 29 20 2a 2a 2f 0a 23 64 65 66 69 6e 65 20   2) **/.#define 
14f0: 4e 49 53 54 53 50 38 30 30 5f 37 33 5f 33 5f 4f  NISTSP800_73_3_O
1500: 49 44 5f 50 49 56 41 55 54 48 20 20 20 30 78 35  ID_PIVAUTH   0x5
1510: 46 2c 20 30 78 43 31 2c 20 30 78 30 35 0a 23 64  F, 0xC1, 0x05.#d
1520: 65 66 69 6e 65 20 4e 49 53 54 53 50 38 30 30 5f  efine NISTSP800_
1530: 37 33 5f 33 5f 4f 49 44 5f 53 49 47 4e 41 54 55  73_3_OID_SIGNATU
1540: 52 45 20 30 78 35 46 2c 20 30 78 43 31 2c 20 30  RE 0x5F, 0xC1, 0
1550: 78 30 41 0a 23 64 65 66 69 6e 65 20 4e 49 53 54  x0A.#define NIST
1560: 53 50 38 30 30 5f 37 33 5f 33 5f 4f 49 44 5f 4b  SP800_73_3_OID_K
1570: 45 59 4d 47 54 20 20 20 20 30 78 35 46 2c 20 30  EYMGT    0x5F, 0
1580: 78 43 31 2c 20 30 78 30 42 0a 23 64 65 66 69 6e  xC1, 0x0B.#defin
1590: 65 20 4e 49 53 54 53 50 38 30 30 5f 37 33 5f 33  e NISTSP800_73_3
15a0: 5f 4f 49 44 5f 43 41 52 44 41 55 54 48 20 20 30  _OID_CARDAUTH  0
15b0: 78 35 46 2c 20 30 78 43 31 2c 20 30 78 30 31 0a  x5F, 0xC1, 0x01.
15c0: 0a 2f 2a 20 4d 61 78 69 6d 75 6d 20 73 69 7a 65  ./* Maximum size
15d0: 20 6f 66 20 64 61 74 61 20 70 6f 72 74 69 6f 6e   of data portion
15e0: 20 6f 66 20 41 50 44 55 73 20 2a 2f 0a 2f 2a 2a   of APDUs */./**
15f0: 20 44 6f 20 6e 6f 74 20 73 65 74 20 74 68 69 73   Do not set this
1600: 20 61 62 6f 76 65 20 32 35 30 20 2a 2a 2f 0a 23   above 250 **/.#
1610: 64 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 41 50  define CACKEY_AP
1620: 44 55 5f 4d 54 55 20 20 20 20 20 20 20 20 20 20  DU_MTU          
1630: 20 20 20 20 20 32 35 30 0a 0a 2f 2a 20 41 54 52       250../* ATR
1640: 20 49 66 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c   If not availabl
1650: 65 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4d 41 58  e */.#ifndef MAX
1660: 5f 41 54 52 5f 53 49 5a 45 0a 23 64 65 66 69 6e  _ATR_SIZE.#defin
1670: 65 20 4d 41 58 5f 41 54 52 5f 53 49 5a 45 20 31  e MAX_ATR_SIZE 1
1680: 30 32 34 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64  024.#endif..#ifd
1690: 65 66 20 43 41 43 4b 45 59 5f 44 45 42 55 47 0a  ef CACKEY_DEBUG.
16a0: 23 20 20 69 66 64 65 66 20 48 41 56 45 5f 54 49  #  ifdef HAVE_TI
16b0: 4d 45 5f 48 0a 23 20 20 20 20 69 6e 63 6c 75 64  ME_H.#    includ
16c0: 65 20 3c 74 69 6d 65 2e 68 3e 0a 73 74 61 74 69  e <time.h>.stati
16d0: 63 20 74 69 6d 65 5f 74 20 63 61 63 6b 65 79 5f  c time_t cackey_
16e0: 64 65 62 75 67 5f 73 74 61 72 74 5f 74 69 6d 65  debug_start_time
16f0: 20 3d 20 30 3b 0a 73 74 61 74 69 63 20 75 6e 73   = 0;.static uns
1700: 69 67 6e 65 64 20 6c 6f 6e 67 20 43 41 43 4b 45  igned long CACKE
1710: 59 5f 44 45 42 55 47 5f 47 45 54 54 49 4d 45 28  Y_DEBUG_GETTIME(
1720: 76 6f 69 64 29 20 7b 0a 09 69 66 20 28 63 61 63  void) {..if (cac
1730: 6b 65 79 5f 64 65 62 75 67 5f 73 74 61 72 74 5f  key_debug_start_
1740: 74 69 6d 65 20 3d 3d 20 30 29 20 7b 0a 09 09 63  time == 0) {...c
1750: 61 63 6b 65 79 5f 64 65 62 75 67 5f 73 74 61 72  ackey_debug_star
1760: 74 5f 74 69 6d 65 20 3d 20 74 69 6d 65 28 4e 55  t_time = time(NU
1770: 4c 4c 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e  LL);..}...return
1780: 28 74 69 6d 65 28 4e 55 4c 4c 29 20 2d 20 63 61  (time(NULL) - ca
1790: 63 6b 65 79 5f 64 65 62 75 67 5f 73 74 61 72 74  ckey_debug_start
17a0: 5f 74 69 6d 65 29 3b 0a 7d 0a 23 20 20 65 6c 73  _time);.}.#  els
17b0: 65 0a 73 74 61 74 69 63 20 75 6e 73 69 67 6e 65  e.static unsigne
17c0: 64 20 6c 6f 6e 67 20 43 41 43 4b 45 59 5f 44 45  d long CACKEY_DE
17d0: 42 55 47 5f 47 45 54 54 49 4d 45 28 76 6f 69 64  BUG_GETTIME(void
17e0: 29 20 7b 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a  ) {..return(0);.
17f0: 7d 0a 23 20 20 65 6e 64 69 66 0a 0a 23 20 20 64  }.#  endif..#  d
1800: 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 44 45 42  efine CACKEY_DEB
1810: 55 47 5f 50 52 49 4e 54 46 28 78 2e 2e 2e 29 20  UG_PRINTF(x...) 
1820: 7b 20 5c 0a 09 73 74 61 74 69 63 20 63 68 61 72  { \..static char
1830: 20 62 75 66 5f 75 73 65 72 5b 34 30 39 36 5d 20   buf_user[4096] 
1840: 3d 20 7b 30 7d 3b 20 5c 0a 09 73 6e 70 72 69 6e  = {0}; \..snprin
1850: 74 66 28 62 75 66 5f 75 73 65 72 2c 20 73 69 7a  tf(buf_user, siz
1860: 65 6f 66 28 62 75 66 5f 75 73 65 72 29 2c 20 78  eof(buf_user), x
1870: 29 3b 20 5c 0a 09 62 75 66 5f 75 73 65 72 5b 73  ); \..buf_user[s
1880: 69 7a 65 6f 66 28 62 75 66 5f 75 73 65 72 29 20  izeof(buf_user) 
1890: 2d 20 31 5d 20 3d 20 27 5c 30 27 3b 20 5c 0a 09  - 1] = '\0'; \..
18a0: 66 70 72 69 6e 74 66 28 63 61 63 6b 65 79 5f 64  fprintf(cackey_d
18b0: 65 62 75 67 5f 66 64 28 29 2c 20 22 5b 25 6c 75  ebug_fd(), "[%lu
18c0: 5d 3a 20 25 73 28 29 3a 25 69 3a 20 25 73 5c 6e  ]: %s():%i: %s\n
18d0: 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ", CACKEY_DEBUG_
18e0: 47 45 54 54 49 4d 45 28 29 2c 20 5f 5f 66 75 6e  GETTIME(), __fun
18f0: 63 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f 5f 2c 20 62  c__, __LINE__, b
1900: 75 66 5f 75 73 65 72 29 3b 20 5c 0a 09 66 66 6c  uf_user); \..ffl
1910: 75 73 68 28 63 61 63 6b 65 79 5f 64 65 62 75 67  ush(cackey_debug
1920: 5f 66 64 28 29 29 3b 20 5c 0a 7d 0a 23 20 20 64  _fd()); \.}.#  d
1930: 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 44 45 42  efine CACKEY_DEB
1940: 55 47 5f 50 52 49 4e 54 42 55 46 28 66 2c 20 78  UG_PRINTBUF(f, x
1950: 2c 20 79 29 20 7b 20 5c 0a 09 73 74 61 74 69 63  , y) { \..static
1960: 20 63 68 61 72 20 62 75 66 5f 75 73 65 72 5b 34   char buf_user[4
1970: 30 39 36 5d 20 3d 20 7b 30 7d 2c 20 2a 62 75 66  096] = {0}, *buf
1980: 5f 75 73 65 72 5f 70 2c 20 2a 62 75 66 5f 75 73  _user_p, *buf_us
1990: 65 72 5f 70 72 69 6e 74 3b 20 5c 0a 09 75 6e 73  er_print; \..uns
19a0: 69 67 6e 65 64 20 6c 6f 6e 67 20 62 75 66 5f 75  igned long buf_u
19b0: 73 65 72 5f 73 69 7a 65 3b 20 5c 0a 09 75 6e 73  ser_size; \..uns
19c0: 69 67 6e 65 64 20 63 68 61 72 20 2a 54 4d 50 42  igned char *TMPB
19d0: 55 46 3b 20 5c 0a 09 75 6e 73 69 67 6e 65 64 20  UF; \..unsigned 
19e0: 6c 6f 6e 67 20 69 64 78 3b 20 5c 0a 09 69 6e 74  long idx; \..int
19f0: 20 73 6e 70 72 69 6e 74 66 5f 72 65 74 3b 20 5c   snprintf_ret; \
1a00: 0a 09 54 4d 50 42 55 46 20 3d 20 28 75 6e 73 69  ..TMPBUF = (unsi
1a10: 67 6e 65 64 20 63 68 61 72 20 2a 29 20 28 78 29  gned char *) (x)
1a20: 3b 20 5c 0a 09 62 75 66 5f 75 73 65 72 5b 30 5d  ; \..buf_user[0]
1a30: 20 3d 20 30 3b 20 5c 0a 09 62 75 66 5f 75 73 65   = 0; \..buf_use
1a40: 72 5f 70 20 3d 20 62 75 66 5f 75 73 65 72 3b 20  r_p = buf_user; 
1a50: 5c 0a 09 62 75 66 5f 75 73 65 72 5f 73 69 7a 65  \..buf_user_size
1a60: 20 3d 20 73 69 7a 65 6f 66 28 62 75 66 5f 75 73   = sizeof(buf_us
1a70: 65 72 29 3b 20 5c 0a 09 66 6f 72 20 28 69 64 78  er); \..for (idx
1a80: 20 3d 20 30 3b 20 69 64 78 20 3c 20 28 79 29 3b   = 0; idx < (y);
1a90: 20 69 64 78 2b 2b 29 20 7b 20 5c 0a 09 09 69 66   idx++) { \...if
1aa0: 20 28 62 75 66 5f 75 73 65 72 5f 73 69 7a 65 20   (buf_user_size 
1ab0: 3c 3d 20 30 29 20 7b 20 5c 0a 09 09 09 62 72 65  <= 0) { \....bre
1ac0: 61 6b 3b 20 5c 0a 09 09 7d 3b 20 5c 0a 09 09 73  ak; \...}; \...s
1ad0: 6e 70 72 69 6e 74 66 5f 72 65 74 20 3d 20 73 6e  nprintf_ret = sn
1ae0: 70 72 69 6e 74 66 28 62 75 66 5f 75 73 65 72 5f  printf(buf_user_
1af0: 70 2c 20 62 75 66 5f 75 73 65 72 5f 73 69 7a 65  p, buf_user_size
1b00: 2c 20 22 2c 20 25 30 32 78 22 2c 20 54 4d 50 42  , ", %02x", TMPB
1b10: 55 46 5b 69 64 78 5d 29 3b 20 5c 0a 09 09 69 66  UF[idx]); \...if
1b20: 20 28 73 6e 70 72 69 6e 74 66 5f 72 65 74 20 3c   (snprintf_ret <
1b30: 3d 20 30 29 20 7b 20 5c 0a 09 09 09 62 72 65 61  = 0) { \....brea
1b40: 6b 3b 20 5c 0a 09 09 7d 3b 20 5c 0a 09 09 62 75  k; \...}; \...bu
1b50: 66 5f 75 73 65 72 5f 70 20 2b 3d 20 73 6e 70 72  f_user_p += snpr
1b60: 69 6e 74 66 5f 72 65 74 3b 20 5c 0a 09 09 62 75  intf_ret; \...bu
1b70: 66 5f 75 73 65 72 5f 73 69 7a 65 20 2d 3d 20 73  f_user_size -= s
1b80: 6e 70 72 69 6e 74 66 5f 72 65 74 3b 20 5c 0a 09  nprintf_ret; \..
1b90: 7d 3b 20 5c 0a 09 62 75 66 5f 75 73 65 72 5b 73  }; \..buf_user[s
1ba0: 69 7a 65 6f 66 28 62 75 66 5f 75 73 65 72 29 20  izeof(buf_user) 
1bb0: 2d 20 31 5d 20 3d 20 27 5c 30 27 3b 20 5c 0a 09  - 1] = '\0'; \..
1bc0: 62 75 66 5f 75 73 65 72 5f 70 72 69 6e 74 20 3d  buf_user_print =
1bd0: 20 62 75 66 5f 75 73 65 72 20 2b 20 32 3b 20 5c   buf_user + 2; \
1be0: 0a 09 66 70 72 69 6e 74 66 28 63 61 63 6b 65 79  ..fprintf(cackey
1bf0: 5f 64 65 62 75 67 5f 66 64 28 29 2c 20 22 5b 25  _debug_fd(), "[%
1c00: 6c 75 5d 3a 20 25 73 28 29 3a 25 69 3a 20 25 73  lu]: %s():%i: %s
1c10: 20 20 28 25 73 2f 25 6c 75 20 3d 20 7b 25 73 7d    (%s/%lu = {%s}
1c20: 29 5c 6e 22 2c 20 43 41 43 4b 45 59 5f 44 45 42  )\n", CACKEY_DEB
1c30: 55 47 5f 47 45 54 54 49 4d 45 28 29 2c 20 5f 5f  UG_GETTIME(), __
1c40: 66 75 6e 63 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f 5f  func__, __LINE__
1c50: 2c 20 66 2c 20 23 78 2c 20 28 75 6e 73 69 67 6e  , f, #x, (unsign
1c60: 65 64 20 6c 6f 6e 67 29 20 28 79 29 2c 20 62 75  ed long) (y), bu
1c70: 66 5f 75 73 65 72 5f 70 72 69 6e 74 29 3b 20 5c  f_user_print); \
1c80: 0a 09 66 66 6c 75 73 68 28 63 61 63 6b 65 79 5f  ..fflush(cackey_
1c90: 64 65 62 75 67 5f 66 64 28 29 29 3b 20 5c 0a 7d  debug_fd()); \.}
1ca0: 0a 23 20 20 64 65 66 69 6e 65 20 66 72 65 65 28  .#  define free(
1cb0: 78 29 20 7b 20 43 41 43 4b 45 59 5f 44 45 42 55  x) { CACKEY_DEBU
1cc0: 47 5f 50 52 49 4e 54 46 28 22 46 52 45 45 28 25  G_PRINTF("FREE(%
1cd0: 70 29 20 28 25 73 29 22 2c 20 28 76 6f 69 64 20  p) (%s)", (void 
1ce0: 2a 29 20 78 2c 20 23 78 29 3b 20 66 72 65 65 28  *) x, #x); free(
1cf0: 78 29 3b 20 7d 0a 0a 73 74 61 74 69 63 20 46 49  x); }..static FI
1d00: 4c 45 20 2a 63 61 63 6b 65 79 5f 64 65 62 75 67  LE *cackey_debug
1d10: 5f 66 64 28 76 6f 69 64 29 20 7b 0a 09 73 74 61  _fd(void) {..sta
1d20: 74 69 63 20 46 49 4c 45 20 2a 66 64 20 3d 20 4e  tic FILE *fd = N
1d30: 55 4c 4c 3b 0a 09 63 68 61 72 20 2a 6c 6f 67 66  ULL;..char *logf
1d40: 69 6c 65 3b 0a 0a 09 69 66 20 28 66 64 20 21 3d  ile;...if (fd !=
1d50: 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72   NULL) {...retur
1d60: 6e 28 66 64 29 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09  n(fd);..}.../*..
1d70: 20 2a 20 4c 6f 67 20 74 6f 20 73 74 64 65 72 72   * Log to stderr
1d80: 20 69 6e 69 74 69 61 6c 6c 79 20 73 6f 20 77 65   initially so we
1d90: 20 63 61 6e 20 75 73 65 20 64 65 62 75 67 67 69   can use debuggi
1da0: 6e 67 20 77 69 74 68 69 6e 0a 09 20 2a 20 74 68  ng within.. * th
1db0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68  is function with
1dc0: 6f 75 74 20 67 65 74 74 69 6e 67 20 69 6e 74 6f  out getting into
1dd0: 20 61 6e 20 69 6e 66 69 6e 69 74 65 20 6c 6f 6f   an infinite loo
1de0: 70 0a 09 20 2a 2f 0a 09 66 64 20 3d 20 73 74 64  p.. */..fd = std
1df0: 65 72 72 3b 0a 0a 09 6c 6f 67 66 69 6c 65 20 3d  err;...logfile =
1e00: 20 67 65 74 65 6e 76 28 22 43 41 43 4b 45 59 5f   getenv("CACKEY_
1e10: 44 45 42 55 47 5f 4c 4f 47 46 49 4c 45 22 29 3b  DEBUG_LOGFILE");
1e20: 0a 09 69 66 20 28 6c 6f 67 66 69 6c 65 20 21 3d  ..if (logfile !=
1e30: 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
1e40: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1e50: 46 6f 75 6e 64 20 65 6e 76 69 72 6f 6e 6d 65 6e  Found environmen
1e60: 74 20 76 61 72 69 61 62 6c 65 3a 20 25 73 22 2c  t variable: %s",
1e70: 20 6c 6f 67 66 69 6c 65 29 3b 0a 0a 09 09 6c 6f   logfile);....lo
1e80: 67 66 69 6c 65 20 3d 20 73 74 72 63 68 72 28 6c  gfile = strchr(l
1e90: 6f 67 66 69 6c 65 2c 20 27 3d 27 29 3b 0a 09 09  ogfile, '=');...
1ea0: 69 66 20 28 6c 6f 67 66 69 6c 65 20 3d 3d 20 4e  if (logfile == N
1eb0: 55 4c 4c 29 20 7b 0a 09 09 09 6c 6f 67 66 69 6c  ULL) {....logfil
1ec0: 65 20 3d 20 67 65 74 65 6e 76 28 22 43 41 43 4b  e = getenv("CACK
1ed0: 45 59 5f 44 45 42 55 47 5f 4c 4f 47 46 49 4c 45  EY_DEBUG_LOGFILE
1ee0: 22 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09  ");...} else {..
1ef0: 09 09 6c 6f 67 66 69 6c 65 2b 2b 3b 0a 09 09 7d  ..logfile++;...}
1f00: 0a 09 7d 0a 0a 23 69 66 64 65 66 20 43 41 43 4b  ..}..#ifdef CACK
1f10: 45 59 5f 44 45 42 55 47 5f 4c 4f 47 46 49 4c 45  EY_DEBUG_LOGFILE
1f20: 0a 09 69 66 20 28 6c 6f 67 66 69 6c 65 20 3d 3d  ..if (logfile ==
1f30: 20 4e 55 4c 4c 29 20 7b 0a 09 09 6c 6f 67 66 69   NULL) {...logfi
1f40: 6c 65 20 3d 20 43 41 43 4b 45 59 5f 44 45 42 55  le = CACKEY_DEBU
1f50: 47 5f 4c 4f 47 46 49 4c 45 3b 0a 09 7d 0a 23 65  G_LOGFILE;..}.#e
1f60: 6e 64 69 66 0a 0a 09 69 66 20 28 6c 6f 67 66 69  ndif...if (logfi
1f70: 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  le != NULL) {...
1f80: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1f90: 4e 54 46 28 22 46 6f 75 6e 64 20 6c 6f 67 20 66  NTF("Found log f
1fa0: 69 6c 65 3a 20 25 73 22 2c 20 6c 6f 67 66 69 6c  ile: %s", logfil
1fb0: 65 29 3b 0a 0a 09 09 66 64 20 3d 20 66 6f 70 65  e);....fd = fope
1fc0: 6e 28 6c 6f 67 66 69 6c 65 2c 20 22 61 22 29 3b  n(logfile, "a");
1fd0: 0a 09 7d 0a 0a 09 69 66 20 28 66 64 20 3d 3d 20  ..}...if (fd == 
1fe0: 4e 55 4c 4c 29 20 7b 0a 09 09 66 64 20 3d 20 73  NULL) {...fd = s
1ff0: 74 64 65 72 72 3b 0a 09 7d 0a 0a 09 69 66 20 28  tderr;..}...if (
2000: 66 64 20 3d 3d 20 73 74 64 65 72 72 29 20 7b 0a  fd == stderr) {.
2010: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2020: 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
2030: 20 73 74 64 65 72 72 22 29 3b 0a 09 7d 20 65 6c   stderr");..} el
2040: 73 65 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  se {...CACKEY_DE
2050: 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
2060: 72 6e 69 6e 67 20 25 70 22 2c 20 28 76 6f 69 64  rning %p", (void
2070: 20 2a 29 20 66 64 29 3b 0a 09 7d 0a 0a 09 72 65   *) fd);..}...re
2080: 74 75 72 6e 28 66 64 29 3b 0a 7d 0a 0a 73 74 61  turn(fd);.}..sta
2090: 74 69 63 20 76 6f 69 64 20 2a 43 41 43 4b 45 59  tic void *CACKEY
20a0: 5f 44 45 42 55 47 5f 46 55 4e 43 5f 4d 41 4c 4c  _DEBUG_FUNC_MALL
20b0: 4f 43 28 73 69 7a 65 5f 74 20 73 69 7a 65 2c 20  OC(size_t size, 
20c0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 75 6e 63  const char *func
20d0: 2c 20 69 6e 74 20 6c 69 6e 65 29 20 7b 0a 09 76  , int line) {..v
20e0: 6f 69 64 20 2a 72 65 74 76 61 6c 3b 0a 0a 09 72  oid *retval;...r
20f0: 65 74 76 61 6c 20 3d 20 6d 61 6c 6c 6f 63 28 73  etval = malloc(s
2100: 69 7a 65 29 3b 0a 0a 09 66 70 72 69 6e 74 66 28  ize);...fprintf(
2110: 63 61 63 6b 65 79 5f 64 65 62 75 67 5f 66 64 28  cackey_debug_fd(
2120: 29 2c 20 22 5b 25 6c 75 5d 3a 20 25 73 28 29 3a  ), "[%lu]: %s():
2130: 25 69 3a 20 4d 41 4c 4c 4f 43 28 29 20 3d 20 25  %i: MALLOC() = %
2140: 70 5c 6e 22 2c 20 43 41 43 4b 45 59 5f 44 45 42  p\n", CACKEY_DEB
2150: 55 47 5f 47 45 54 54 49 4d 45 28 29 2c 20 66 75  UG_GETTIME(), fu
2160: 6e 63 2c 20 6c 69 6e 65 2c 20 72 65 74 76 61 6c  nc, line, retval
2170: 29 3b 0a 09 66 66 6c 75 73 68 28 63 61 63 6b 65  );..fflush(cacke
2180: 79 5f 64 65 62 75 67 5f 66 64 28 29 29 3b 0a 0a  y_debug_fd());..
2190: 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b  .return(retval);
21a0: 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
21b0: 2a 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55  *CACKEY_DEBUG_FU
21c0: 4e 43 5f 52 45 41 4c 4c 4f 43 28 76 6f 69 64 20  NC_REALLOC(void 
21d0: 2a 70 74 72 2c 20 73 69 7a 65 5f 74 20 73 69 7a  *ptr, size_t siz
21e0: 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 66  e, const char *f
21f0: 75 6e 63 2c 20 69 6e 74 20 6c 69 6e 65 29 20 7b  unc, int line) {
2200: 0a 09 76 6f 69 64 20 2a 72 65 74 76 61 6c 3b 0a  ..void *retval;.
2210: 0a 09 72 65 74 76 61 6c 20 3d 20 72 65 61 6c 6c  ..retval = reall
2220: 6f 63 28 70 74 72 2c 20 73 69 7a 65 29 3b 0a 0a  oc(ptr, size);..
2230: 09 69 66 20 28 72 65 74 76 61 6c 20 21 3d 20 70  .if (retval != p
2240: 74 72 29 20 7b 0a 09 09 66 70 72 69 6e 74 66 28  tr) {...fprintf(
2250: 63 61 63 6b 65 79 5f 64 65 62 75 67 5f 66 64 28  cackey_debug_fd(
2260: 29 2c 20 22 5b 25 6c 75 5d 3a 20 25 73 28 29 3a  ), "[%lu]: %s():
2270: 25 69 3a 20 52 45 41 4c 4c 4f 43 28 25 70 29 20  %i: REALLOC(%p) 
2280: 3d 20 25 70 5c 6e 22 2c 20 43 41 43 4b 45 59 5f  = %p\n", CACKEY_
2290: 44 45 42 55 47 5f 47 45 54 54 49 4d 45 28 29 2c  DEBUG_GETTIME(),
22a0: 20 66 75 6e 63 2c 20 6c 69 6e 65 2c 20 70 74 72   func, line, ptr
22b0: 2c 20 72 65 74 76 61 6c 29 3b 0a 09 09 66 66 6c  , retval);...ffl
22c0: 75 73 68 28 63 61 63 6b 65 79 5f 64 65 62 75 67  ush(cackey_debug
22d0: 5f 66 64 28 29 29 3b 0a 09 7d 0a 0a 09 69 66 20  _fd());..}...if 
22e0: 28 72 65 74 76 61 6c 20 3d 3d 20 4e 55 4c 4c 29  (retval == NULL)
22f0: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
2300: 47 5f 50 52 49 4e 54 46 28 22 20 2a 2a 2a 20 45  G_PRINTF(" *** E
2310: 52 52 4f 52 20 2a 2a 2a 20 72 65 61 6c 6c 6f 63  RROR *** realloc
2320: 20 72 65 74 75 72 6e 65 64 20 4e 55 4c 4c 20 28   returned NULL (
2330: 73 69 7a 65 20 3d 20 25 6c 75 29 22 2c 20 28 75  size = %lu)", (u
2340: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69  nsigned long) si
2350: 7a 65 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e  ze);..}...return
2360: 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 73 74 61  (retval);.}..sta
2370: 74 69 63 20 63 68 61 72 20 2a 43 41 43 4b 45 59  tic char *CACKEY
2380: 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 54 52 44  _DEBUG_FUNC_STRD
2390: 55 50 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 70  UP(const char *p
23a0: 74 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tr, const char *
23b0: 66 75 6e 63 2c 20 69 6e 74 20 6c 69 6e 65 29 20  func, int line) 
23c0: 7b 0a 09 63 68 61 72 20 2a 72 65 74 76 61 6c 3b  {..char *retval;
23d0: 0a 0a 09 72 65 74 76 61 6c 20 3d 20 73 74 72 64  ...retval = strd
23e0: 75 70 28 70 74 72 29 3b 0a 0a 09 66 70 72 69 6e  up(ptr);...fprin
23f0: 74 66 28 63 61 63 6b 65 79 5f 64 65 62 75 67 5f  tf(cackey_debug_
2400: 66 64 28 29 2c 20 22 5b 25 6c 75 5d 3a 20 25 73  fd(), "[%lu]: %s
2410: 28 29 3a 25 69 3a 20 53 54 52 44 55 50 5f 4d 41  ():%i: STRDUP_MA
2420: 4c 4c 4f 43 28 29 20 3d 20 25 70 5c 6e 22 2c 20  LLOC() = %p\n", 
2430: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 47 45 54  CACKEY_DEBUG_GET
2440: 54 49 4d 45 28 29 2c 20 66 75 6e 63 2c 20 6c 69  TIME(), func, li
2450: 6e 65 2c 20 72 65 74 76 61 6c 29 3b 0a 09 66 66  ne, retval);..ff
2460: 6c 75 73 68 28 63 61 63 6b 65 79 5f 64 65 62 75  lush(cackey_debu
2470: 67 5f 66 64 28 29 29 3b 0a 0a 09 72 65 74 75 72  g_fd());...retur
2480: 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 73 74  n(retval);.}..st
2490: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
24a0: 2a 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55  *CACKEY_DEBUG_FU
24b0: 4e 43 5f 54 41 47 5f 54 4f 5f 53 54 52 28 75 6e  NC_TAG_TO_STR(un
24c0: 73 69 67 6e 65 64 20 63 68 61 72 20 74 61 67 29  signed char tag)
24d0: 20 7b 0a 09 73 77 69 74 63 68 20 28 74 61 67 29   {..switch (tag)
24e0: 20 7b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f   {...case GSCIS_
24f0: 54 41 47 5f 43 41 52 44 49 44 3a 0a 09 09 09 72  TAG_CARDID:....r
2500: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
2510: 5f 43 41 52 44 49 44 22 29 3b 0a 09 09 63 61 73  _CARDID");...cas
2520: 65 20 47 53 43 49 53 5f 54 41 47 5f 43 43 43 5f  e GSCIS_TAG_CCC_
2530: 56 45 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  VER:....return("
2540: 47 53 43 49 53 5f 54 41 47 5f 43 43 43 5f 56 45  GSCIS_TAG_CCC_VE
2550: 52 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  R");...case GSCI
2560: 53 5f 54 41 47 5f 43 43 47 5f 56 45 52 3a 0a 09  S_TAG_CCG_VER:..
2570: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
2580: 54 41 47 5f 43 43 47 5f 56 45 52 22 29 3b 0a 09  TAG_CCG_VER");..
2590: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
25a0: 43 41 52 44 55 52 4c 3a 0a 09 09 09 72 65 74 75  CARDURL:....retu
25b0: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 43 41  rn("GSCIS_TAG_CA
25c0: 52 44 55 52 4c 22 29 3b 0a 09 09 63 61 73 65 20  RDURL");...case 
25d0: 47 53 43 49 53 5f 54 41 47 5f 50 4b 43 53 31 35  GSCIS_TAG_PKCS15
25e0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
25f0: 49 53 5f 54 41 47 5f 50 4b 43 53 31 35 22 29 3b  IS_TAG_PKCS15");
2600: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
2610: 47 5f 52 45 47 5f 44 41 54 41 5f 4d 4f 44 45 4c  G_REG_DATA_MODEL
2620: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
2630: 49 53 5f 54 41 47 5f 52 45 47 5f 44 41 54 41 5f  IS_TAG_REG_DATA_
2640: 4d 4f 44 45 4c 22 29 3b 0a 09 09 63 61 73 65 20  MODEL");...case 
2650: 47 53 43 49 53 5f 54 41 47 5f 41 43 52 5f 54 41  GSCIS_TAG_ACR_TA
2660: 42 4c 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  BLE:....return("
2670: 47 53 43 49 53 5f 54 41 47 5f 41 43 52 5f 54 41  GSCIS_TAG_ACR_TA
2680: 42 4c 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53  BLE");...case GS
2690: 43 49 53 5f 54 41 47 5f 43 41 52 44 5f 41 50 44  CIS_TAG_CARD_APD
26a0: 55 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  U:....return("GS
26b0: 43 49 53 5f 54 41 47 5f 43 41 52 44 5f 41 50 44  CIS_TAG_CARD_APD
26c0: 55 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  U");...case GSCI
26d0: 53 5f 54 41 47 5f 52 45 44 49 52 45 43 54 49 4f  S_TAG_REDIRECTIO
26e0: 4e 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  N:....return("GS
26f0: 43 49 53 5f 54 41 47 5f 52 45 44 49 52 45 43 54  CIS_TAG_REDIRECT
2700: 49 4f 4e 22 29 3b 0a 09 09 63 61 73 65 20 47 53  ION");...case GS
2710: 43 49 53 5f 54 41 47 5f 43 54 3a 0a 09 09 09 72  CIS_TAG_CT:....r
2720: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
2730: 5f 43 54 22 29 3b 0a 09 09 63 61 73 65 20 47 53  _CT");...case GS
2740: 43 49 53 5f 54 41 47 5f 53 54 3a 0a 09 09 09 72  CIS_TAG_ST:....r
2750: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
2760: 5f 53 54 22 29 3b 0a 09 09 63 61 73 65 20 47 53  _ST");...case GS
2770: 43 49 53 5f 54 41 47 5f 4e 45 58 54 43 43 43 3a  CIS_TAG_NEXTCCC:
2780: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49  ....return("GSCI
2790: 53 5f 54 41 47 5f 4e 45 58 54 43 43 43 22 29 3b  S_TAG_NEXTCCC");
27a0: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
27b0: 47 5f 46 4e 41 4d 45 3a 0a 09 09 09 72 65 74 75  G_FNAME:....retu
27c0: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 46 4e  rn("GSCIS_TAG_FN
27d0: 41 4d 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53  AME");...case GS
27e0: 43 49 53 5f 54 41 47 5f 4d 4e 41 4d 45 3a 0a 09  CIS_TAG_MNAME:..
27f0: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
2800: 54 41 47 5f 4d 4e 41 4d 45 22 29 3b 0a 09 09 63  TAG_MNAME");...c
2810: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4c 4e  ase GSCIS_TAG_LN
2820: 41 4d 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  AME:....return("
2830: 47 53 43 49 53 5f 54 41 47 5f 4c 4e 41 4d 45 22  GSCIS_TAG_LNAME"
2840: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
2850: 54 41 47 5f 53 55 46 46 49 58 3a 0a 09 09 09 72  TAG_SUFFIX:....r
2860: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
2870: 5f 53 55 46 46 49 58 22 29 3b 0a 09 09 63 61 73  _SUFFIX");...cas
2880: 65 20 47 53 43 49 53 5f 54 41 47 5f 47 4f 56 54  e GSCIS_TAG_GOVT
2890: 5f 41 47 45 4e 43 59 3a 0a 09 09 09 72 65 74 75  _AGENCY:....retu
28a0: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 47 4f  rn("GSCIS_TAG_GO
28b0: 56 54 5f 41 47 45 4e 43 59 22 29 3b 0a 09 09 63  VT_AGENCY");...c
28c0: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 42 55  ase GSCIS_TAG_BU
28d0: 52 45 41 55 3a 0a 09 09 09 72 65 74 75 72 6e 28  REAU:....return(
28e0: 22 47 53 43 49 53 5f 54 41 47 5f 42 55 52 45 41  "GSCIS_TAG_BUREA
28f0: 55 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  U");...case GSCI
2900: 53 5f 54 41 47 5f 42 55 52 45 41 55 5f 43 4f 44  S_TAG_BUREAU_COD
2910: 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  E:....return("GS
2920: 43 49 53 5f 54 41 47 5f 42 55 52 45 41 55 5f 43  CIS_TAG_BUREAU_C
2930: 4f 44 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53  ODE");...case GS
2940: 43 49 53 5f 54 41 47 5f 44 45 50 54 5f 43 4f 44  CIS_TAG_DEPT_COD
2950: 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  E:....return("GS
2960: 43 49 53 5f 54 41 47 5f 44 45 50 54 5f 43 4f 44  CIS_TAG_DEPT_COD
2970: 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  E");...case GSCI
2980: 53 5f 54 41 47 5f 54 49 54 4c 45 3a 0a 09 09 09  S_TAG_TITLE:....
2990: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
29a0: 47 5f 54 49 54 4c 45 22 29 3b 0a 09 09 63 61 73  G_TITLE");...cas
29b0: 65 20 47 53 43 49 53 5f 54 41 47 5f 42 55 49 4c  e GSCIS_TAG_BUIL
29c0: 44 49 4e 47 3a 0a 09 09 09 72 65 74 75 72 6e 28  DING:....return(
29d0: 22 47 53 43 49 53 5f 54 41 47 5f 42 55 49 4c 44  "GSCIS_TAG_BUILD
29e0: 49 4e 47 22 29 3b 0a 09 09 63 61 73 65 20 47 53  ING");...case GS
29f0: 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 41  CIS_TAG_OFFICE_A
2a00: 44 44 52 31 3a 0a 09 09 09 72 65 74 75 72 6e 28  DDR1:....return(
2a10: 22 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43  "GSCIS_TAG_OFFIC
2a20: 45 5f 41 44 44 52 31 22 29 3b 0a 09 09 63 61 73  E_ADDR1");...cas
2a30: 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49  e GSCIS_TAG_OFFI
2a40: 43 45 5f 41 44 44 52 32 3a 0a 09 09 09 72 65 74  CE_ADDR2:....ret
2a50: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4f  urn("GSCIS_TAG_O
2a60: 46 46 49 43 45 5f 41 44 44 52 32 22 29 3b 0a 09  FFICE_ADDR2");..
2a70: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
2a80: 4f 46 46 49 43 45 5f 43 49 54 59 3a 0a 09 09 09  OFFICE_CITY:....
2a90: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
2aa0: 47 5f 4f 46 46 49 43 45 5f 43 49 54 59 22 29 3b  G_OFFICE_CITY");
2ab0: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
2ac0: 47 5f 4f 46 46 49 43 45 5f 53 54 41 54 45 3a 0a  G_OFFICE_STATE:.
2ad0: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
2ae0: 5f 54 41 47 5f 4f 46 46 49 43 45 5f 53 54 41 54  _TAG_OFFICE_STAT
2af0: 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  E");...case GSCI
2b00: 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 5a 49 50  S_TAG_OFFICE_ZIP
2b10: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
2b20: 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 5a 49  IS_TAG_OFFICE_ZI
2b30: 50 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  P");...case GSCI
2b40: 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 43 4f 55  S_TAG_OFFICE_COU
2b50: 4e 54 52 59 3a 0a 09 09 09 72 65 74 75 72 6e 28  NTRY:....return(
2b60: 22 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43  "GSCIS_TAG_OFFIC
2b70: 45 5f 43 4f 55 4e 54 52 59 22 29 3b 0a 09 09 63  E_COUNTRY");...c
2b80: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46  ase GSCIS_TAG_OF
2b90: 46 49 43 45 5f 50 48 4f 4e 45 3a 0a 09 09 09 72  FICE_PHONE:....r
2ba0: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
2bb0: 5f 4f 46 46 49 43 45 5f 50 48 4f 4e 45 22 29 3b  _OFFICE_PHONE");
2bc0: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
2bd0: 47 5f 4f 46 46 49 43 45 5f 50 48 4f 4e 45 5f 45  G_OFFICE_PHONE_E
2be0: 58 54 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47  XT:....return("G
2bf0: 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f  SCIS_TAG_OFFICE_
2c00: 50 48 4f 4e 45 5f 45 58 54 22 29 3b 0a 09 09 63  PHONE_EXT");...c
2c10: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46  ase GSCIS_TAG_OF
2c20: 46 49 43 45 5f 46 41 58 3a 0a 09 09 09 72 65 74  FICE_FAX:....ret
2c30: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4f  urn("GSCIS_TAG_O
2c40: 46 46 49 43 45 5f 46 41 58 22 29 3b 0a 09 09 63  FFICE_FAX");...c
2c50: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46  ase GSCIS_TAG_OF
2c60: 46 49 43 45 5f 45 4d 41 49 4c 3a 0a 09 09 09 72  FICE_EMAIL:....r
2c70: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
2c80: 5f 4f 46 46 49 43 45 5f 45 4d 41 49 4c 22 29 3b  _OFFICE_EMAIL");
2c90: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
2ca0: 47 5f 4f 46 46 49 43 45 5f 52 4f 4f 4d 3a 0a 09  G_OFFICE_ROOM:..
2cb0: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
2cc0: 54 41 47 5f 4f 46 46 49 43 45 5f 52 4f 4f 4d 22  TAG_OFFICE_ROOM"
2cd0: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
2ce0: 54 41 47 5f 4e 4f 4e 47 4f 56 5f 41 47 45 4e 43  TAG_NONGOV_AGENC
2cf0: 59 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  Y:....return("GS
2d00: 43 49 53 5f 54 41 47 5f 4e 4f 4e 47 4f 56 5f 41  CIS_TAG_NONGOV_A
2d10: 47 45 4e 43 59 22 29 3b 0a 09 09 63 61 73 65 20  GENCY");...case 
2d20: 47 53 43 49 53 5f 54 41 47 5f 53 53 4e 5f 44 45  GSCIS_TAG_SSN_DE
2d30: 53 49 47 4e 41 54 4f 52 3a 0a 09 09 09 72 65 74  SIGNATOR:....ret
2d40: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 53  urn("GSCIS_TAG_S
2d50: 53 4e 5f 44 45 53 49 47 4e 41 54 4f 52 22 29 3b  SN_DESIGNATOR");
2d60: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
2d70: 47 5f 53 53 4e 3a 0a 09 09 09 72 65 74 75 72 6e  G_SSN:....return
2d80: 28 22 47 53 43 49 53 5f 54 41 47 5f 53 53 4e 22  ("GSCIS_TAG_SSN"
2d90: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
2da0: 54 41 47 5f 44 4f 42 3a 0a 09 09 09 72 65 74 75  TAG_DOB:....retu
2db0: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 44 4f  rn("GSCIS_TAG_DO
2dc0: 42 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  B");...case GSCI
2dd0: 53 5f 54 41 47 5f 47 45 4e 44 45 52 3a 0a 09 09  S_TAG_GENDER:...
2de0: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
2df0: 41 47 5f 47 45 4e 44 45 52 22 29 3b 0a 09 09 63  AG_GENDER");...c
2e00: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 55 53  ase GSCIS_TAG_US
2e10: 45 52 49 44 3a 0a 09 09 09 72 65 74 75 72 6e 28  ERID:....return(
2e20: 22 47 53 43 49 53 5f 54 41 47 5f 55 53 45 52 49  "GSCIS_TAG_USERI
2e30: 44 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  D");...case GSCI
2e40: 53 5f 54 41 47 5f 44 4f 4d 41 49 4e 3a 0a 09 09  S_TAG_DOMAIN:...
2e50: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
2e60: 41 47 5f 44 4f 4d 41 49 4e 22 29 3b 0a 09 09 63  AG_DOMAIN");...c
2e70: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 50 41  ase GSCIS_TAG_PA
2e80: 53 53 57 4f 52 44 3a 0a 09 09 09 72 65 74 75 72  SSWORD:....retur
2e90: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 50 41 53  n("GSCIS_TAG_PAS
2ea0: 53 57 4f 52 44 22 29 3b 0a 09 09 63 61 73 65 20  SWORD");...case 
2eb0: 47 53 43 49 53 5f 54 41 47 5f 49 53 53 55 45 52  GSCIS_TAG_ISSUER
2ec0: 49 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47  ID:....return("G
2ed0: 53 43 49 53 5f 54 41 47 5f 49 53 53 55 45 52 49  SCIS_TAG_ISSUERI
2ee0: 44 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  D");...case GSCI
2ef0: 53 5f 54 41 47 5f 53 45 52 4e 4f 3a 0a 09 09 09  S_TAG_SERNO:....
2f00: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
2f10: 47 5f 53 45 52 4e 4f 22 29 3b 0a 09 09 63 61 73  G_SERNO");...cas
2f20: 65 20 47 53 43 49 53 5f 54 41 47 5f 49 53 53 55  e GSCIS_TAG_ISSU
2f30: 45 5f 44 41 54 45 3a 0a 09 09 09 72 65 74 75 72  E_DATE:....retur
2f40: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 49 53 53  n("GSCIS_TAG_ISS
2f50: 55 45 5f 44 41 54 45 22 29 3b 0a 09 09 63 61 73  UE_DATE");...cas
2f60: 65 20 47 53 43 49 53 5f 54 41 47 5f 45 58 50 49  e GSCIS_TAG_EXPI
2f70: 52 45 5f 44 41 54 45 3a 0a 09 09 09 72 65 74 75  RE_DATE:....retu
2f80: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 45 58  rn("GSCIS_TAG_EX
2f90: 50 49 52 45 5f 44 41 54 45 22 29 3b 0a 09 09 63  PIRE_DATE");...c
2fa0: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43 41  ase GSCIS_TAG_CA
2fb0: 52 44 5f 54 59 50 45 3a 0a 09 09 09 72 65 74 75  RD_TYPE:....retu
2fc0: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 43 41  rn("GSCIS_TAG_CA
2fd0: 52 44 5f 54 59 50 45 22 29 3b 0a 09 09 63 61 73  RD_TYPE");...cas
2fe0: 65 20 47 53 43 49 53 5f 54 41 47 5f 53 45 43 55  e GSCIS_TAG_SECU
2ff0: 52 49 54 59 5f 43 4f 44 45 3a 0a 09 09 09 72 65  RITY_CODE:....re
3000: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
3010: 53 45 43 55 52 49 54 59 5f 43 4f 44 45 22 29 3b  SECURITY_CODE");
3020: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
3030: 47 5f 43 41 52 44 49 44 5f 41 49 44 3a 0a 09 09  G_CARDID_AID:...
3040: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
3050: 41 47 5f 43 41 52 44 49 44 5f 41 49 44 22 29 3b  AG_CARDID_AID");
3060: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
3070: 47 5f 43 45 52 54 49 46 49 43 41 54 45 3a 0a 09  G_CERTIFICATE:..
3080: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
3090: 54 41 47 5f 43 45 52 54 49 46 49 43 41 54 45 22  TAG_CERTIFICATE"
30a0: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
30b0: 54 41 47 5f 43 45 52 54 5f 49 53 53 55 45 5f 44  TAG_CERT_ISSUE_D
30c0: 41 54 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ATE:....return("
30d0: 47 53 43 49 53 5f 54 41 47 5f 43 45 52 54 5f 49  GSCIS_TAG_CERT_I
30e0: 53 53 55 45 5f 44 41 54 45 22 29 3b 0a 09 09 63  SSUE_DATE");...c
30f0: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43 45  ase GSCIS_TAG_CE
3100: 52 54 5f 45 58 50 49 52 45 5f 44 41 54 45 3a 0a  RT_EXPIRE_DATE:.
3110: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
3120: 5f 54 41 47 5f 43 45 52 54 5f 45 58 50 49 52 45  _TAG_CERT_EXPIRE
3130: 5f 44 41 54 45 22 29 3b 0a 09 7d 0a 0a 09 72 65  _DATE");..}...re
3140: 74 75 72 6e 28 22 55 4e 4b 4e 4f 57 4e 22 29 3b  turn("UNKNOWN");
3150: 0a 7d 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .}..static const
3160: 20 63 68 61 72 20 2a 43 41 43 4b 45 59 5f 44 45   char *CACKEY_DE
3170: 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52  BUG_FUNC_SCARDER
3180: 52 5f 54 4f 5f 53 54 52 28 4c 4f 4e 47 20 72 65  R_TO_STR(LONG re
3190: 74 63 6f 64 65 29 20 7b 0a 09 73 77 69 74 63 68  tcode) {..switch
31a0: 20 28 72 65 74 63 6f 64 65 29 20 7b 0a 09 09 63   (retcode) {...c
31b0: 61 73 65 20 53 43 41 52 44 5f 53 5f 53 55 43 43  ase SCARD_S_SUCC
31c0: 45 53 53 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ESS:....return("
31d0: 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 22  SCARD_S_SUCCESS"
31e0: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  );...case SCARD_
31f0: 45 5f 43 41 4e 43 45 4c 4c 45 44 3a 0a 09 09 09  E_CANCELLED:....
3200: 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f  return("SCARD_E_
3210: 43 41 4e 43 45 4c 4c 45 44 22 29 3b 0a 09 09 63  CANCELLED");...c
3220: 61 73 65 20 53 43 41 52 44 5f 45 5f 43 41 4e 54  ase SCARD_E_CANT
3230: 5f 44 49 53 50 4f 53 45 3a 0a 09 09 09 72 65 74  _DISPOSE:....ret
3240: 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 43 41 4e  urn("SCARD_E_CAN
3250: 54 5f 44 49 53 50 4f 53 45 22 29 3b 0a 09 09 63  T_DISPOSE");...c
3260: 61 73 65 20 53 43 41 52 44 5f 45 5f 49 4e 53 55  ase SCARD_E_INSU
3270: 46 46 49 43 49 45 4e 54 5f 42 55 46 46 45 52 3a  FFICIENT_BUFFER:
3280: 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52  ....return("SCAR
3290: 44 5f 45 5f 49 4e 53 55 46 46 49 43 49 45 4e 54  D_E_INSUFFICIENT
32a0: 5f 42 55 46 46 45 52 22 29 3b 0a 09 09 63 61 73  _BUFFER");...cas
32b0: 65 20 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49  e SCARD_E_INVALI
32c0: 44 5f 41 54 52 3a 0a 09 09 09 72 65 74 75 72 6e  D_ATR:....return
32d0: 28 22 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49  ("SCARD_E_INVALI
32e0: 44 5f 41 54 52 22 29 3b 0a 09 09 63 61 73 65 20  D_ATR");...case 
32f0: 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f  SCARD_E_INVALID_
3300: 48 41 4e 44 4c 45 3a 0a 09 09 09 72 65 74 75 72  HANDLE:....retur
3310: 6e 28 22 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c  n("SCARD_E_INVAL
3320: 49 44 5f 48 41 4e 44 4c 45 22 29 3b 0a 09 09 63  ID_HANDLE");...c
3330: 61 73 65 20 53 43 41 52 44 5f 45 5f 49 4e 56 41  ase SCARD_E_INVA
3340: 4c 49 44 5f 50 41 52 41 4d 45 54 45 52 3a 0a 09  LID_PARAMETER:..
3350: 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f  ..return("SCARD_
3360: 45 5f 49 4e 56 41 4c 49 44 5f 50 41 52 41 4d 45  E_INVALID_PARAME
3370: 54 45 52 22 29 3b 0a 09 09 63 61 73 65 20 53 43  TER");...case SC
3380: 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 54 41  ARD_E_INVALID_TA
3390: 52 47 45 54 3a 0a 09 09 09 72 65 74 75 72 6e 28  RGET:....return(
33a0: 22 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44  "SCARD_E_INVALID
33b0: 5f 54 41 52 47 45 54 22 29 3b 0a 09 09 63 61 73  _TARGET");...cas
33c0: 65 20 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49  e SCARD_E_INVALI
33d0: 44 5f 56 41 4c 55 45 3a 0a 09 09 09 72 65 74 75  D_VALUE:....retu
33e0: 72 6e 28 22 53 43 41 52 44 5f 45 5f 49 4e 56 41  rn("SCARD_E_INVA
33f0: 4c 49 44 5f 56 41 4c 55 45 22 29 3b 0a 09 09 63  LID_VALUE");...c
3400: 61 73 65 20 53 43 41 52 44 5f 45 5f 4e 4f 5f 4d  ase SCARD_E_NO_M
3410: 45 4d 4f 52 59 3a 0a 09 09 09 72 65 74 75 72 6e  EMORY:....return
3420: 28 22 53 43 41 52 44 5f 45 5f 4e 4f 5f 4d 45 4d  ("SCARD_E_NO_MEM
3430: 4f 52 59 22 29 3b 0a 09 09 63 61 73 65 20 53 43  ORY");...case SC
3440: 41 52 44 5f 45 5f 55 4e 4b 4e 4f 57 4e 5f 52 45  ARD_E_UNKNOWN_RE
3450: 41 44 45 52 3a 0a 09 09 09 72 65 74 75 72 6e 28  ADER:....return(
3460: 22 53 43 41 52 44 5f 45 5f 55 4e 4b 4e 4f 57 4e  "SCARD_E_UNKNOWN
3470: 5f 52 45 41 44 45 52 22 29 3b 0a 09 09 63 61 73  _READER");...cas
3480: 65 20 53 43 41 52 44 5f 45 5f 54 49 4d 45 4f 55  e SCARD_E_TIMEOU
3490: 54 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43  T:....return("SC
34a0: 41 52 44 5f 45 5f 54 49 4d 45 4f 55 54 22 29 3b  ARD_E_TIMEOUT");
34b0: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
34c0: 53 48 41 52 49 4e 47 5f 56 49 4f 4c 41 54 49 4f  SHARING_VIOLATIO
34d0: 4e 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43  N:....return("SC
34e0: 41 52 44 5f 45 5f 53 48 41 52 49 4e 47 5f 56 49  ARD_E_SHARING_VI
34f0: 4f 4c 41 54 49 4f 4e 22 29 3b 0a 09 09 63 61 73  OLATION");...cas
3500: 65 20 53 43 41 52 44 5f 45 5f 4e 4f 5f 53 4d 41  e SCARD_E_NO_SMA
3510: 52 54 43 41 52 44 3a 0a 09 09 09 72 65 74 75 72  RTCARD:....retur
3520: 6e 28 22 53 43 41 52 44 5f 45 5f 4e 4f 5f 53 4d  n("SCARD_E_NO_SM
3530: 41 52 54 43 41 52 44 22 29 3b 0a 09 09 63 61 73  ARTCARD");...cas
3540: 65 20 53 43 41 52 44 5f 45 5f 55 4e 4b 4e 4f 57  e SCARD_E_UNKNOW
3550: 4e 5f 43 41 52 44 3a 0a 09 09 09 72 65 74 75 72  N_CARD:....retur
3560: 6e 28 22 53 43 41 52 44 5f 45 5f 55 4e 4b 4e 4f  n("SCARD_E_UNKNO
3570: 57 4e 5f 43 41 52 44 22 29 3b 0a 09 09 63 61 73  WN_CARD");...cas
3580: 65 20 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f  e SCARD_E_PROTO_
3590: 4d 49 53 4d 41 54 43 48 3a 0a 09 09 09 72 65 74  MISMATCH:....ret
35a0: 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 50 52 4f  urn("SCARD_E_PRO
35b0: 54 4f 5f 4d 49 53 4d 41 54 43 48 22 29 3b 0a 09  TO_MISMATCH");..
35c0: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 4e 4f  .case SCARD_E_NO
35d0: 54 5f 52 45 41 44 59 3a 0a 09 09 09 72 65 74 75  T_READY:....retu
35e0: 72 6e 28 22 53 43 41 52 44 5f 45 5f 4e 4f 54 5f  rn("SCARD_E_NOT_
35f0: 52 45 41 44 59 22 29 3b 0a 09 09 63 61 73 65 20  READY");...case 
3600: 53 43 41 52 44 5f 45 5f 53 59 53 54 45 4d 5f 43  SCARD_E_SYSTEM_C
3610: 41 4e 43 45 4c 4c 45 44 3a 0a 09 09 09 72 65 74  ANCELLED:....ret
3620: 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 53 59 53  urn("SCARD_E_SYS
3630: 54 45 4d 5f 43 41 4e 43 45 4c 4c 45 44 22 29 3b  TEM_CANCELLED");
3640: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
3650: 4e 4f 54 5f 54 52 41 4e 53 41 43 54 45 44 3a 0a  NOT_TRANSACTED:.
3660: 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44  ...return("SCARD
3670: 5f 45 5f 4e 4f 54 5f 54 52 41 4e 53 41 43 54 45  _E_NOT_TRANSACTE
3680: 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52  D");...case SCAR
3690: 44 5f 45 5f 52 45 41 44 45 52 5f 55 4e 41 56 41  D_E_READER_UNAVA
36a0: 49 4c 41 42 4c 45 3a 0a 09 09 09 72 65 74 75 72  ILABLE:....retur
36b0: 6e 28 22 53 43 41 52 44 5f 45 5f 52 45 41 44 45  n("SCARD_E_READE
36c0: 52 5f 55 4e 41 56 41 49 4c 41 42 4c 45 22 29 3b  R_UNAVAILABLE");
36d0: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 57 5f  ...case SCARD_W_
36e0: 55 4e 53 55 50 50 4f 52 54 45 44 5f 43 41 52 44  UNSUPPORTED_CARD
36f0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41  :....return("SCA
3700: 52 44 5f 57 5f 55 4e 53 55 50 50 4f 52 54 45 44  RD_W_UNSUPPORTED
3710: 5f 43 41 52 44 22 29 3b 0a 09 09 63 61 73 65 20  _CARD");...case 
3720: 53 43 41 52 44 5f 57 5f 55 4e 52 45 53 50 4f 4e  SCARD_W_UNRESPON
3730: 53 49 56 45 5f 43 41 52 44 3a 0a 09 09 09 72 65  SIVE_CARD:....re
3740: 74 75 72 6e 28 22 53 43 41 52 44 5f 57 5f 55 4e  turn("SCARD_W_UN
3750: 52 45 53 50 4f 4e 53 49 56 45 5f 43 41 52 44 22  RESPONSIVE_CARD"
3760: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  );...case SCARD_
3770: 57 5f 55 4e 50 4f 57 45 52 45 44 5f 43 41 52 44  W_UNPOWERED_CARD
3780: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41  :....return("SCA
3790: 52 44 5f 57 5f 55 4e 50 4f 57 45 52 45 44 5f 43  RD_W_UNPOWERED_C
37a0: 41 52 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43  ARD");...case SC
37b0: 41 52 44 5f 57 5f 52 45 53 45 54 5f 43 41 52 44  ARD_W_RESET_CARD
37c0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41  :....return("SCA
37d0: 52 44 5f 57 5f 52 45 53 45 54 5f 43 41 52 44 22  RD_W_RESET_CARD"
37e0: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  );...case SCARD_
37f0: 57 5f 52 45 4d 4f 56 45 44 5f 43 41 52 44 3a 0a  W_REMOVED_CARD:.
3800: 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44  ...return("SCARD
3810: 5f 57 5f 52 45 4d 4f 56 45 44 5f 43 41 52 44 22  _W_REMOVED_CARD"
3820: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  );...case SCARD_
3830: 45 5f 50 43 49 5f 54 4f 4f 5f 53 4d 41 4c 4c 3a  E_PCI_TOO_SMALL:
3840: 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52  ....return("SCAR
3850: 44 5f 45 5f 50 43 49 5f 54 4f 4f 5f 53 4d 41 4c  D_E_PCI_TOO_SMAL
3860: 4c 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52  L");...case SCAR
3870: 44 5f 45 5f 52 45 41 44 45 52 5f 55 4e 53 55 50  D_E_READER_UNSUP
3880: 50 4f 52 54 45 44 3a 0a 09 09 09 72 65 74 75 72  PORTED:....retur
3890: 6e 28 22 53 43 41 52 44 5f 45 5f 52 45 41 44 45  n("SCARD_E_READE
38a0: 52 5f 55 4e 53 55 50 50 4f 52 54 45 44 22 29 3b  R_UNSUPPORTED");
38b0: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
38c0: 44 55 50 4c 49 43 41 54 45 5f 52 45 41 44 45 52  DUPLICATE_READER
38d0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41  :....return("SCA
38e0: 52 44 5f 45 5f 44 55 50 4c 49 43 41 54 45 5f 52  RD_E_DUPLICATE_R
38f0: 45 41 44 45 52 22 29 3b 0a 09 09 63 61 73 65 20  EADER");...case 
3900: 53 43 41 52 44 5f 45 5f 43 41 52 44 5f 55 4e 53  SCARD_E_CARD_UNS
3910: 55 50 50 4f 52 54 45 44 3a 0a 09 09 09 72 65 74  UPPORTED:....ret
3920: 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 43 41 52  urn("SCARD_E_CAR
3930: 44 5f 55 4e 53 55 50 50 4f 52 54 45 44 22 29 3b  D_UNSUPPORTED");
3940: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
3950: 4e 4f 5f 53 45 52 56 49 43 45 3a 0a 09 09 09 72  NO_SERVICE:....r
3960: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 4e  eturn("SCARD_E_N
3970: 4f 5f 53 45 52 56 49 43 45 22 29 3b 0a 09 09 63  O_SERVICE");...c
3980: 61 73 65 20 53 43 41 52 44 5f 45 5f 53 45 52 56  ase SCARD_E_SERV
3990: 49 43 45 5f 53 54 4f 50 50 45 44 3a 0a 09 09 09  ICE_STOPPED:....
39a0: 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f  return("SCARD_E_
39b0: 53 45 52 56 49 43 45 5f 53 54 4f 50 50 45 44 22  SERVICE_STOPPED"
39c0: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  );...case SCARD_
39d0: 45 5f 55 4e 53 55 50 50 4f 52 54 45 44 5f 46 45  E_UNSUPPORTED_FE
39e0: 41 54 55 52 45 3a 0a 09 09 09 72 65 74 75 72 6e  ATURE:....return
39f0: 28 22 53 43 41 52 44 5f 45 5f 55 4e 53 55 50 50  ("SCARD_E_UNSUPP
3a00: 4f 52 54 45 44 5f 46 45 41 54 55 52 45 22 29 3b  ORTED_FEATURE");
3a10: 0a 23 69 66 64 65 66 20 53 43 41 52 44 5f 57 5f  .#ifdef SCARD_W_
3a20: 49 4e 53 45 52 54 45 44 5f 43 41 52 44 0a 09 09  INSERTED_CARD...
3a30: 63 61 73 65 20 53 43 41 52 44 5f 57 5f 49 4e 53  case SCARD_W_INS
3a40: 45 52 54 45 44 5f 43 41 52 44 3a 0a 09 09 09 72  ERTED_CARD:....r
3a50: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 57 5f 49  eturn("SCARD_W_I
3a60: 4e 53 45 52 54 45 44 5f 43 41 52 44 22 29 3b 0a  NSERTED_CARD");.
3a70: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 43  #endif.#ifdef SC
3a80: 41 52 44 5f 45 5f 4e 4f 5f 52 45 41 44 45 52 53  ARD_E_NO_READERS
3a90: 5f 41 56 41 49 4c 41 42 4c 45 0a 09 09 63 61 73  _AVAILABLE...cas
3aa0: 65 20 53 43 41 52 44 5f 45 5f 4e 4f 5f 52 45 41  e SCARD_E_NO_REA
3ab0: 44 45 52 53 5f 41 56 41 49 4c 41 42 4c 45 3a 0a  DERS_AVAILABLE:.
3ac0: 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44  ...return("SCARD
3ad0: 5f 45 5f 4e 4f 5f 52 45 41 44 45 52 53 5f 41 56  _E_NO_READERS_AV
3ae0: 41 49 4c 41 42 4c 45 22 29 3b 0a 23 65 6e 64 69  AILABLE");.#endi
3af0: 66 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 22 55  f..}...return("U
3b00: 4e 4b 4e 4f 57 4e 22 29 3b 0a 7d 0a 0a 73 74 61  NKNOWN");.}..sta
3b10: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
3b20: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e  CACKEY_DEBUG_FUN
3b30: 43 5f 4f 42 4a 49 44 5f 54 4f 5f 53 54 52 28 75  C_OBJID_TO_STR(u
3b40: 69 6e 74 31 36 5f 74 20 6f 62 6a 69 64 29 20 7b  int16_t objid) {
3b50: 0a 09 73 77 69 74 63 68 20 28 6f 62 6a 69 64 29  ..switch (objid)
3b60: 20 7b 0a 09 09 63 61 73 65 20 30 78 32 30 30 30   {...case 0x2000
3b70: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43  :....return("CAC
3b80: 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 47 45  KEY_TLV_OBJID_GE
3b90: 4e 45 52 41 4c 49 4e 46 4f 22 29 3b 0a 09 09 63  NERALINFO");...c
3ba0: 61 73 65 20 30 78 32 31 30 30 3a 0a 09 09 09 72  ase 0x2100:....r
3bb0: 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c  eturn("CACKEY_TL
3bc0: 56 5f 4f 42 4a 49 44 5f 50 52 4f 50 45 52 53 4f  V_OBJID_PROPERSO
3bd0: 4e 41 4c 49 4e 46 4f 22 29 3b 0a 09 09 63 61 73  NALINFO");...cas
3be0: 65 20 30 78 33 30 30 30 3a 0a 09 09 09 72 65 74  e 0x3000:....ret
3bf0: 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f  urn("CACKEY_TLV_
3c00: 4f 42 4a 49 44 5f 41 43 43 45 53 53 43 4f 4e 54  OBJID_ACCESSCONT
3c10: 52 4f 4c 22 29 3b 0a 09 09 63 61 73 65 20 30 78  ROL");...case 0x
3c20: 34 30 30 30 3a 0a 09 09 09 72 65 74 75 72 6e 28  4000:....return(
3c30: 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49  "CACKEY_TLV_OBJI
3c40: 44 5f 4c 4f 47 49 4e 22 29 3b 0a 09 09 63 61 73  D_LOGIN");...cas
3c50: 65 20 30 78 35 30 30 30 3a 0a 09 09 09 72 65 74  e 0x5000:....ret
3c60: 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f  urn("CACKEY_TLV_
3c70: 4f 42 4a 49 44 5f 43 41 52 44 49 4e 46 4f 22 29  OBJID_CARDINFO")
3c80: 3b 0a 09 09 63 61 73 65 20 30 78 36 30 30 30 3a  ;...case 0x6000:
3c90: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b  ....return("CACK
3ca0: 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 42 49 4f  EY_TLV_OBJID_BIO
3cb0: 4d 45 54 52 49 43 53 22 29 3b 0a 09 09 63 61 73  METRICS");...cas
3cc0: 65 20 30 78 37 30 30 30 3a 0a 09 09 09 72 65 74  e 0x7000:....ret
3cd0: 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f  urn("CACKEY_TLV_
3ce0: 4f 42 4a 49 44 5f 44 49 47 49 54 41 4c 53 49 47  OBJID_DIGITALSIG
3cf0: 43 45 52 54 22 29 3b 0a 09 09 63 61 73 65 20 30  CERT");...case 0
3d00: 78 30 32 30 30 3a 0a 09 09 09 72 65 74 75 72 6e  x0200:....return
3d10: 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a  ("CACKEY_TLV_OBJ
3d20: 49 44 5f 43 41 43 5f 50 45 52 53 4f 4e 22 29 3b  ID_CAC_PERSON");
3d30: 0a 09 09 63 61 73 65 20 30 78 30 32 30 32 3a 0a  ...case 0x0202:.
3d40: 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45  ...return("CACKE
3d50: 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f  Y_TLV_OBJID_CAC_
3d60: 42 45 4e 45 46 49 54 53 22 29 3b 0a 09 09 63 61  BENEFITS");...ca
3d70: 73 65 20 30 78 30 32 30 33 3a 0a 09 09 09 72 65  se 0x0203:....re
3d80: 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56  turn("CACKEY_TLV
3d90: 5f 4f 42 4a 49 44 5f 43 41 43 5f 4f 54 48 45 52  _OBJID_CAC_OTHER
3da0: 42 45 4e 45 46 49 54 53 22 29 3b 0a 09 09 63 61  BENEFITS");...ca
3db0: 73 65 20 30 78 30 32 30 31 3a 0a 09 09 09 72 65  se 0x0201:....re
3dc0: 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56  turn("CACKEY_TLV
3dd0: 5f 4f 42 4a 49 44 5f 43 41 43 5f 50 45 52 53 4f  _OBJID_CAC_PERSO
3de0: 4e 4e 45 4c 22 29 3b 0a 09 09 63 61 73 65 20 30  NNEL");...case 0
3df0: 78 30 32 46 45 3a 0a 09 09 09 72 65 74 75 72 6e  x02FE:....return
3e00: 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a  ("CACKEY_TLV_OBJ
3e10: 49 44 5f 43 41 43 5f 50 4b 49 43 45 52 54 22 29  ID_CAC_PKICERT")
3e20: 3b 0a 09 7d 0a 09 0a 09 72 65 74 75 72 6e 28 22  ;..}....return("
3e30: 55 4e 4b 4e 4f 57 4e 22 29 3b 0a 7d 0a 0a 73 74  UNKNOWN");.}..st
3e40: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
3e50: 2a 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55  *CACKEY_DEBUG_FU
3e60: 4e 43 5f 41 50 50 54 59 50 45 5f 54 4f 5f 53 54  NC_APPTYPE_TO_ST
3e70: 52 28 75 69 6e 74 38 5f 74 20 61 70 70 74 79 70  R(uint8_t apptyp
3e80: 65 29 20 7b 0a 09 73 77 69 74 63 68 20 28 61 70  e) {..switch (ap
3e90: 70 74 79 70 65 29 20 7b 0a 09 09 63 61 73 65 20  ptype) {...case 
3ea0: 30 78 30 30 3a 0a 09 09 09 72 65 74 75 72 6e 28  0x00:....return(
3eb0: 22 4e 4f 4e 45 22 29 3b 0a 09 09 63 61 73 65 20  "NONE");...case 
3ec0: 30 78 30 31 3a 0a 09 09 09 72 65 74 75 72 6e 28  0x01:....return(
3ed0: 22 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f  "CACKEY_TLV_APP_
3ee0: 47 45 4e 45 52 49 43 22 29 3b 0a 09 09 63 61 73  GENERIC");...cas
3ef0: 65 20 30 78 30 32 3a 0a 09 09 09 72 65 74 75 72  e 0x02:....retur
3f00: 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50  n("CACKEY_TLV_AP
3f10: 50 5f 53 4b 49 22 29 3b 0a 09 09 63 61 73 65 20  P_SKI");...case 
3f20: 30 78 30 33 3a 0a 09 09 09 72 65 74 75 72 6e 28  0x03:....return(
3f30: 22 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f  "CACKEY_TLV_APP_
3f40: 47 45 4e 45 52 49 43 20 7c 20 43 41 43 4b 45 59  GENERIC | CACKEY
3f50: 5f 54 4c 56 5f 41 50 50 5f 53 4b 49 22 29 3b 0a  _TLV_APP_SKI");.
3f60: 09 09 63 61 73 65 20 30 78 30 34 3a 0a 09 09 09  ..case 0x04:....
3f70: 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54  return("CACKEY_T
3f80: 4c 56 5f 41 50 50 5f 50 4b 49 22 29 3b 0a 09 09  LV_APP_PKI");...
3f90: 63 61 73 65 20 30 78 30 35 3a 0a 09 09 09 72 65  case 0x05:....re
3fa0: 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56  turn("CACKEY_TLV
3fb0: 5f 41 50 50 5f 47 45 4e 45 52 49 43 20 7c 20 43  _APP_GENERIC | C
3fc0: 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 50 4b  ACKEY_TLV_APP_PK
3fd0: 49 22 29 3b 0a 09 09 63 61 73 65 20 30 78 30 36  I");...case 0x06
3fe0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43  :....return("CAC
3ff0: 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 53 4b 49 20  KEY_TLV_APP_SKI 
4000: 7c 20 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50  | CACKEY_TLV_APP
4010: 5f 50 4b 49 22 29 3b 0a 09 09 63 61 73 65 20 30  _PKI");...case 0
4020: 78 30 37 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  x07:....return("
4030: 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 47  CACKEY_TLV_APP_G
4040: 45 4e 45 52 49 43 20 7c 20 43 41 43 4b 45 59 5f  ENERIC | CACKEY_
4050: 54 4c 56 5f 41 50 50 5f 53 4b 49 20 7c 20 43 41  TLV_APP_SKI | CA
4060: 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 50 4b 49  CKEY_TLV_APP_PKI
4070: 22 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28  ");..}...return(
4080: 22 49 4e 56 41 4c 49 44 22 29 3b 0a 7d 0a 0a 73  "INVALID");.}..s
4090: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
40a0: 20 2a 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46   *CACKEY_DEBUG_F
40b0: 55 4e 43 5f 41 54 54 52 49 42 55 54 45 5f 54 4f  UNC_ATTRIBUTE_TO
40c0: 5f 53 54 52 28 43 4b 5f 41 54 54 52 49 42 55 54  _STR(CK_ATTRIBUT
40d0: 45 5f 54 59 50 45 20 61 74 74 72 29 20 7b 0a 09  E_TYPE attr) {..
40e0: 73 77 69 74 63 68 20 28 61 74 74 72 29 20 7b 0a  switch (attr) {.
40f0: 09 09 63 61 73 65 20 43 4b 41 5f 43 4c 41 53 53  ..case CKA_CLASS
4100: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41  :....return("CKA
4110: 5f 43 4c 41 53 53 22 29 3b 0a 09 09 63 61 73 65  _CLASS");...case
4120: 20 43 4b 41 5f 54 4f 4b 45 4e 3a 0a 09 09 09 72   CKA_TOKEN:....r
4130: 65 74 75 72 6e 28 22 43 4b 41 5f 54 4f 4b 45 4e  eturn("CKA_TOKEN
4140: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 50  ");...case CKA_P
4150: 52 49 56 41 54 45 3a 0a 09 09 09 72 65 74 75 72  RIVATE:....retur
4160: 6e 28 22 43 4b 41 5f 50 52 49 56 41 54 45 22 29  n("CKA_PRIVATE")
4170: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 4c 41 42  ;...case CKA_LAB
4180: 45 4c 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  EL:....return("C
4190: 4b 41 5f 4c 41 42 45 4c 22 29 3b 0a 09 09 63 61  KA_LABEL");...ca
41a0: 73 65 20 43 4b 41 5f 41 50 50 4c 49 43 41 54 49  se CKA_APPLICATI
41b0: 4f 4e 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  ON:....return("C
41c0: 4b 41 5f 41 50 50 4c 49 43 41 54 49 4f 4e 22 29  KA_APPLICATION")
41d0: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 56 41 4c  ;...case CKA_VAL
41e0: 55 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  UE:....return("C
41f0: 4b 41 5f 56 41 4c 55 45 22 29 3b 0a 09 09 63 61  KA_VALUE");...ca
4200: 73 65 20 43 4b 41 5f 4f 42 4a 45 43 54 5f 49 44  se CKA_OBJECT_ID
4210: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41  :....return("CKA
4220: 5f 4f 42 4a 45 43 54 5f 49 44 22 29 3b 0a 09 09  _OBJECT_ID");...
4230: 63 61 73 65 20 43 4b 41 5f 43 45 52 54 49 46 49  case CKA_CERTIFI
4240: 43 41 54 45 5f 54 59 50 45 3a 0a 09 09 09 72 65  CATE_TYPE:....re
4250: 74 75 72 6e 28 22 43 4b 41 5f 43 45 52 54 49 46  turn("CKA_CERTIF
4260: 49 43 41 54 45 5f 54 59 50 45 22 29 3b 0a 09 09  ICATE_TYPE");...
4270: 63 61 73 65 20 43 4b 41 5f 49 53 53 55 45 52 3a  case CKA_ISSUER:
4280: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f  ....return("CKA_
4290: 49 53 53 55 45 52 22 29 3b 0a 09 09 63 61 73 65  ISSUER");...case
42a0: 20 43 4b 41 5f 53 45 52 49 41 4c 5f 4e 55 4d 42   CKA_SERIAL_NUMB
42b0: 45 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  ER:....return("C
42c0: 4b 41 5f 53 45 52 49 41 4c 5f 4e 55 4d 42 45 52  KA_SERIAL_NUMBER
42d0: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 41  ");...case CKA_A
42e0: 43 5f 49 53 53 55 45 52 3a 0a 09 09 09 72 65 74  C_ISSUER:....ret
42f0: 75 72 6e 28 22 43 4b 41 5f 41 43 5f 49 53 53 55  urn("CKA_AC_ISSU
4300: 45 52 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  ER");...case CKA
4310: 5f 4f 57 4e 45 52 3a 0a 09 09 09 72 65 74 75 72  _OWNER:....retur
4320: 6e 28 22 43 4b 41 5f 4f 57 4e 45 52 22 29 3b 0a  n("CKA_OWNER");.
4330: 09 09 63 61 73 65 20 43 4b 41 5f 41 54 54 52 5f  ..case CKA_ATTR_
4340: 54 59 50 45 53 3a 0a 09 09 09 72 65 74 75 72 6e  TYPES:....return
4350: 28 22 43 4b 41 5f 41 54 54 52 5f 54 59 50 45 53  ("CKA_ATTR_TYPES
4360: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 54  ");...case CKA_T
4370: 52 55 53 54 45 44 3a 0a 09 09 09 72 65 74 75 72  RUSTED:....retur
4380: 6e 28 22 43 4b 41 5f 54 52 55 53 54 45 44 22 29  n("CKA_TRUSTED")
4390: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 4b 45 59  ;...case CKA_KEY
43a0: 5f 54 59 50 45 3a 0a 09 09 09 72 65 74 75 72 6e  _TYPE:....return
43b0: 28 22 43 4b 41 5f 4b 45 59 5f 54 59 50 45 22 29  ("CKA_KEY_TYPE")
43c0: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 53 55 42  ;...case CKA_SUB
43d0: 4a 45 43 54 3a 0a 09 09 09 72 65 74 75 72 6e 28  JECT:....return(
43e0: 22 43 4b 41 5f 53 55 42 4a 45 43 54 22 29 3b 0a  "CKA_SUBJECT");.
43f0: 09 09 63 61 73 65 20 43 4b 41 5f 49 44 3a 0a 09  ..case CKA_ID:..
4400: 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 49 44  ..return("CKA_ID
4410: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 53  ");...case CKA_S
4420: 45 4e 53 49 54 49 56 45 3a 0a 09 09 09 72 65 74  ENSITIVE:....ret
4430: 75 72 6e 28 22 43 4b 41 5f 53 45 4e 53 49 54 49  urn("CKA_SENSITI
4440: 56 45 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  VE");...case CKA
4450: 5f 45 4e 43 52 59 50 54 3a 0a 09 09 09 72 65 74  _ENCRYPT:....ret
4460: 75 72 6e 28 22 43 4b 41 5f 45 4e 43 52 59 50 54  urn("CKA_ENCRYPT
4470: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 44  ");...case CKA_D
4480: 45 43 52 59 50 54 3a 0a 09 09 09 72 65 74 75 72  ECRYPT:....retur
4490: 6e 28 22 43 4b 41 5f 44 45 43 52 59 50 54 22 29  n("CKA_DECRYPT")
44a0: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 57 52 41  ;...case CKA_WRA
44b0: 50 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b  P:....return("CK
44c0: 41 5f 57 52 41 50 22 29 3b 0a 09 09 63 61 73 65  A_WRAP");...case
44d0: 20 43 4b 41 5f 55 4e 57 52 41 50 3a 0a 09 09 09   CKA_UNWRAP:....
44e0: 72 65 74 75 72 6e 28 22 43 4b 41 5f 55 4e 57 52  return("CKA_UNWR
44f0: 41 50 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  AP");...case CKA
4500: 5f 53 49 47 4e 3a 0a 09 09 09 72 65 74 75 72 6e  _SIGN:....return
4510: 28 22 43 4b 41 5f 53 49 47 4e 22 29 3b 0a 09 09  ("CKA_SIGN");...
4520: 63 61 73 65 20 43 4b 41 5f 53 49 47 4e 5f 52 45  case CKA_SIGN_RE
4530: 43 4f 56 45 52 3a 0a 09 09 09 72 65 74 75 72 6e  COVER:....return
4540: 28 22 43 4b 41 5f 53 49 47 4e 5f 52 45 43 4f 56  ("CKA_SIGN_RECOV
4550: 45 52 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  ER");...case CKA
4560: 5f 56 45 52 49 46 59 3a 0a 09 09 09 72 65 74 75  _VERIFY:....retu
4570: 72 6e 28 22 43 4b 41 5f 56 45 52 49 46 59 22 29  rn("CKA_VERIFY")
4580: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 56 45 52  ;...case CKA_VER
4590: 49 46 59 5f 52 45 43 4f 56 45 52 3a 0a 09 09 09  IFY_RECOVER:....
45a0: 72 65 74 75 72 6e 28 22 43 4b 41 5f 56 45 52 49  return("CKA_VERI
45b0: 46 59 5f 52 45 43 4f 56 45 52 22 29 3b 0a 09 09  FY_RECOVER");...
45c0: 63 61 73 65 20 43 4b 41 5f 44 45 52 49 56 45 3a  case CKA_DERIVE:
45d0: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f  ....return("CKA_
45e0: 44 45 52 49 56 45 22 29 3b 0a 09 09 63 61 73 65  DERIVE");...case
45f0: 20 43 4b 41 5f 53 54 41 52 54 5f 44 41 54 45 3a   CKA_START_DATE:
4600: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f  ....return("CKA_
4610: 53 54 41 52 54 5f 44 41 54 45 22 29 3b 0a 09 09  START_DATE");...
4620: 63 61 73 65 20 43 4b 41 5f 45 4e 44 5f 44 41 54  case CKA_END_DAT
4630: 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b  E:....return("CK
4640: 41 5f 45 4e 44 5f 44 41 54 45 22 29 3b 0a 09 09  A_END_DATE");...
4650: 63 61 73 65 20 43 4b 41 5f 4d 4f 44 55 4c 55 53  case CKA_MODULUS
4660: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41  :....return("CKA
4670: 5f 4d 4f 44 55 4c 55 53 22 29 3b 0a 09 09 63 61  _MODULUS");...ca
4680: 73 65 20 43 4b 41 5f 4d 4f 44 55 4c 55 53 5f 42  se CKA_MODULUS_B
4690: 49 54 53 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ITS:....return("
46a0: 43 4b 41 5f 4d 4f 44 55 4c 55 53 5f 42 49 54 53  CKA_MODULUS_BITS
46b0: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 50  ");...case CKA_P
46c0: 55 42 4c 49 43 5f 45 58 50 4f 4e 45 4e 54 3a 0a  UBLIC_EXPONENT:.
46d0: 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 50  ...return("CKA_P
46e0: 55 42 4c 49 43 5f 45 58 50 4f 4e 45 4e 54 22 29  UBLIC_EXPONENT")
46f0: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 50 52 49  ;...case CKA_PRI
4700: 56 41 54 45 5f 45 58 50 4f 4e 45 4e 54 3a 0a 09  VATE_EXPONENT:..
4710: 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 50 52  ..return("CKA_PR
4720: 49 56 41 54 45 5f 45 58 50 4f 4e 45 4e 54 22 29  IVATE_EXPONENT")
4730: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 50 52 49  ;...case CKA_PRI
4740: 4d 45 5f 31 3a 0a 09 09 09 72 65 74 75 72 6e 28  ME_1:....return(
4750: 22 43 4b 41 5f 50 52 49 4d 45 5f 31 22 29 3b 0a  "CKA_PRIME_1");.
4760: 09 09 63 61 73 65 20 43 4b 41 5f 50 52 49 4d 45  ..case CKA_PRIME
4770: 5f 32 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  _2:....return("C
4780: 4b 41 5f 50 52 49 4d 45 5f 32 22 29 3b 0a 09 09  KA_PRIME_2");...
4790: 63 61 73 65 20 43 4b 41 5f 45 58 50 4f 4e 45 4e  case CKA_EXPONEN
47a0: 54 5f 31 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  T_1:....return("
47b0: 43 4b 41 5f 45 58 50 4f 4e 45 4e 54 5f 31 22 29  CKA_EXPONENT_1")
47c0: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 45 58 50  ;...case CKA_EXP
47d0: 4f 4e 45 4e 54 5f 32 3a 0a 09 09 09 72 65 74 75  ONENT_2:....retu
47e0: 72 6e 28 22 43 4b 41 5f 45 58 50 4f 4e 45 4e 54  rn("CKA_EXPONENT
47f0: 5f 32 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  _2");...case CKA
4800: 5f 43 4f 45 46 46 49 43 49 45 4e 54 3a 0a 09 09  _COEFFICIENT:...
4810: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 43 4f 45  .return("CKA_COE
4820: 46 46 49 43 49 45 4e 54 22 29 3b 0a 09 09 63 61  FFICIENT");...ca
4830: 73 65 20 43 4b 41 5f 50 52 49 4d 45 3a 0a 09 09  se CKA_PRIME:...
4840: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 50 52 49  .return("CKA_PRI
4850: 4d 45 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  ME");...case CKA
4860: 5f 53 55 42 50 52 49 4d 45 3a 0a 09 09 09 72 65  _SUBPRIME:....re
4870: 74 75 72 6e 28 22 43 4b 41 5f 53 55 42 50 52 49  turn("CKA_SUBPRI
4880: 4d 45 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  ME");...case CKA
4890: 5f 42 41 53 45 3a 0a 09 09 09 72 65 74 75 72 6e  _BASE:....return
48a0: 28 22 43 4b 41 5f 42 41 53 45 22 29 3b 0a 09 09  ("CKA_BASE");...
48b0: 63 61 73 65 20 43 4b 41 5f 50 52 49 4d 45 5f 42  case CKA_PRIME_B
48c0: 49 54 53 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ITS:....return("
48d0: 43 4b 41 5f 50 52 49 4d 45 5f 42 49 54 53 22 29  CKA_PRIME_BITS")
48e0: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 53 55 42  ;...case CKA_SUB
48f0: 5f 50 52 49 4d 45 5f 42 49 54 53 3a 0a 09 09 09  _PRIME_BITS:....
4900: 72 65 74 75 72 6e 28 22 43 4b 41 5f 53 55 42 5f  return("CKA_SUB_
4910: 50 52 49 4d 45 5f 42 49 54 53 22 29 3b 0a 09 09  PRIME_BITS");...
4920: 63 61 73 65 20 43 4b 41 5f 56 41 4c 55 45 5f 42  case CKA_VALUE_B
4930: 49 54 53 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ITS:....return("
4940: 43 4b 41 5f 56 41 4c 55 45 5f 42 49 54 53 22 29  CKA_VALUE_BITS")
4950: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 56 41 4c  ;...case CKA_VAL
4960: 55 45 5f 4c 45 4e 3a 0a 09 09 09 72 65 74 75 72  UE_LEN:....retur
4970: 6e 28 22 43 4b 41 5f 56 41 4c 55 45 5f 4c 45 4e  n("CKA_VALUE_LEN
4980: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 45  ");...case CKA_E
4990: 58 54 52 41 43 54 41 42 4c 45 3a 0a 09 09 09 72  XTRACTABLE:....r
49a0: 65 74 75 72 6e 28 22 43 4b 41 5f 45 58 54 52 41  eturn("CKA_EXTRA
49b0: 43 54 41 42 4c 45 22 29 3b 0a 09 09 63 61 73 65  CTABLE");...case
49c0: 20 43 4b 41 5f 4c 4f 43 41 4c 3a 0a 09 09 09 72   CKA_LOCAL:....r
49d0: 65 74 75 72 6e 28 22 43 4b 41 5f 4c 4f 43 41 4c  eturn("CKA_LOCAL
49e0: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 4e  ");...case CKA_N
49f0: 45 56 45 52 5f 45 58 54 52 41 43 54 41 42 4c 45  EVER_EXTRACTABLE
4a00: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41  :....return("CKA
4a10: 5f 4e 45 56 45 52 5f 45 58 54 52 41 43 54 41 42  _NEVER_EXTRACTAB
4a20: 4c 45 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  LE");...case CKA
4a30: 5f 41 4c 57 41 59 53 5f 53 45 4e 53 49 54 49 56  _ALWAYS_SENSITIV
4a40: 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b  E:....return("CK
4a50: 41 5f 41 4c 57 41 59 53 5f 53 45 4e 53 49 54 49  A_ALWAYS_SENSITI
4a60: 56 45 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  VE");...case CKA
4a70: 5f 4b 45 59 5f 47 45 4e 5f 4d 45 43 48 41 4e 49  _KEY_GEN_MECHANI
4a80: 53 4d 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  SM:....return("C
4a90: 4b 41 5f 4b 45 59 5f 47 45 4e 5f 4d 45 43 48 41  KA_KEY_GEN_MECHA
4aa0: 4e 49 53 4d 22 29 3b 0a 09 09 63 61 73 65 20 43  NISM");...case C
4ab0: 4b 41 5f 4d 4f 44 49 46 49 41 42 4c 45 3a 0a 09  KA_MODIFIABLE:..
4ac0: 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 4d 4f  ..return("CKA_MO
4ad0: 44 49 46 49 41 42 4c 45 22 29 3b 0a 09 09 63 61  DIFIABLE");...ca
4ae0: 73 65 20 43 4b 41 5f 45 43 44 53 41 5f 50 41 52  se CKA_ECDSA_PAR
4af0: 41 4d 53 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  AMS:....return("
4b00: 43 4b 41 5f 45 43 44 53 41 5f 50 41 52 41 4d 53  CKA_ECDSA_PARAMS
4b10: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 45  ");...case CKA_E
4b20: 43 5f 50 4f 49 4e 54 3a 0a 09 09 09 72 65 74 75  C_POINT:....retu
4b30: 72 6e 28 22 43 4b 41 5f 45 43 5f 50 4f 49 4e 54  rn("CKA_EC_POINT
4b40: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 53  ");...case CKA_S
4b50: 45 43 4f 4e 44 41 52 59 5f 41 55 54 48 3a 0a 09  ECONDARY_AUTH:..
4b60: 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 53 45  ..return("CKA_SE
4b70: 43 4f 4e 44 41 52 59 5f 41 55 54 48 22 29 3b 0a  CONDARY_AUTH");.
4b80: 09 09 63 61 73 65 20 43 4b 41 5f 41 55 54 48 5f  ..case CKA_AUTH_
4b90: 50 49 4e 5f 46 4c 41 47 53 3a 0a 09 09 09 72 65  PIN_FLAGS:....re
4ba0: 74 75 72 6e 28 22 43 4b 41 5f 41 55 54 48 5f 50  turn("CKA_AUTH_P
4bb0: 49 4e 5f 46 4c 41 47 53 22 29 3b 0a 09 09 63 61  IN_FLAGS");...ca
4bc0: 73 65 20 43 4b 41 5f 48 57 5f 46 45 41 54 55 52  se CKA_HW_FEATUR
4bd0: 45 5f 54 59 50 45 3a 0a 09 09 09 72 65 74 75 72  E_TYPE:....retur
4be0: 6e 28 22 43 4b 41 5f 48 57 5f 46 45 41 54 55 52  n("CKA_HW_FEATUR
4bf0: 45 5f 54 59 50 45 22 29 3b 0a 09 09 63 61 73 65  E_TYPE");...case
4c00: 20 43 4b 41 5f 52 45 53 45 54 5f 4f 4e 5f 49 4e   CKA_RESET_ON_IN
4c10: 49 54 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  IT:....return("C
4c20: 4b 41 5f 52 45 53 45 54 5f 4f 4e 5f 49 4e 49 54  KA_RESET_ON_INIT
4c30: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 48  ");...case CKA_H
4c40: 41 53 5f 52 45 53 45 54 3a 0a 09 09 09 72 65 74  AS_RESET:....ret
4c50: 75 72 6e 28 22 43 4b 41 5f 48 41 53 5f 52 45 53  urn("CKA_HAS_RES
4c60: 45 54 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  ET");...case CKA
4c70: 5f 56 45 4e 44 4f 52 5f 44 45 46 49 4e 45 44 3a  _VENDOR_DEFINED:
4c80: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f  ....return("CKA_
4c90: 56 45 4e 44 4f 52 5f 44 45 46 49 4e 45 44 22 29  VENDOR_DEFINED")
4ca0: 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 22 55  ;..}...return("U
4cb0: 4e 4b 4e 4f 57 4e 22 29 3b 0a 7d 0a 0a 23 20 20  NKNOWN");.}..#  
4cc0: 64 65 66 69 6e 65 20 6d 61 6c 6c 6f 63 28 78 29  define malloc(x)
4cd0: 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55   CACKEY_DEBUG_FU
4ce0: 4e 43 5f 4d 41 4c 4c 4f 43 28 78 2c 20 5f 5f 66  NC_MALLOC(x, __f
4cf0: 75 6e 63 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f 5f 29  unc__, __LINE__)
4d00: 0a 23 20 20 64 65 66 69 6e 65 20 72 65 61 6c 6c  .#  define reall
4d10: 6f 63 28 78 2c 20 79 29 20 43 41 43 4b 45 59 5f  oc(x, y) CACKEY_
4d20: 44 45 42 55 47 5f 46 55 4e 43 5f 52 45 41 4c 4c  DEBUG_FUNC_REALL
4d30: 4f 43 28 78 2c 20 79 2c 20 5f 5f 66 75 6e 63 5f  OC(x, y, __func_
4d40: 5f 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 0a 23 20 20  _, __LINE__).#  
4d50: 69 66 64 65 66 20 73 74 72 64 75 70 0a 23 20 20  ifdef strdup.#  
4d60: 20 20 75 6e 64 65 66 20 73 74 72 64 75 70 0a 23    undef strdup.#
4d70: 20 20 65 6e 64 69 66 0a 23 20 20 64 65 66 69 6e    endif.#  defin
4d80: 65 20 73 74 72 64 75 70 28 78 29 20 43 41 43 4b  e strdup(x) CACK
4d90: 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 54  EY_DEBUG_FUNC_ST
4da0: 52 44 55 50 28 78 2c 20 5f 5f 66 75 6e 63 5f 5f  RDUP(x, __func__
4db0: 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 0a 23 65 6c 73  , __LINE__).#els
4dc0: 65 0a 23 20 20 64 65 66 69 6e 65 20 43 41 43 4b  e.#  define CACK
4dd0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
4de0: 78 2e 2e 2e 29 20 2f 2a 2a 2f 0a 23 20 20 64 65  x...) /**/.#  de
4df0: 66 69 6e 65 20 43 41 43 4b 45 59 5f 44 45 42 55  fine CACKEY_DEBU
4e00: 47 5f 50 52 49 4e 54 42 55 46 28 66 2c 20 78 2c  G_PRINTBUF(f, x,
4e10: 20 79 29 20 2f 2a 2a 2f 0a 23 20 20 64 65 66 69   y) /**/.#  defi
4e20: 6e 65 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ne CACKEY_DEBUG_
4e30: 46 55 4e 43 5f 54 41 47 5f 54 4f 5f 53 54 52 28  FUNC_TAG_TO_STR(
4e40: 78 29 20 22 44 45 42 55 47 5f 44 49 53 41 42 4c  x) "DEBUG_DISABL
4e50: 45 44 22 0a 23 20 20 64 65 66 69 6e 65 20 43 41  ED".#  define CA
4e60: 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
4e70: 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28  SCARDERR_TO_STR(
4e80: 78 29 20 22 44 45 42 55 47 5f 44 49 53 41 42 4c  x) "DEBUG_DISABL
4e90: 45 44 22 0a 23 20 20 64 65 66 69 6e 65 20 43 41  ED".#  define CA
4ea0: 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
4eb0: 4f 42 4a 49 44 5f 54 4f 5f 53 54 52 28 78 29 20  OBJID_TO_STR(x) 
4ec0: 22 44 45 42 55 47 5f 44 49 53 41 42 4c 45 44 22  "DEBUG_DISABLED"
4ed0: 0a 23 20 20 64 65 66 69 6e 65 20 43 41 43 4b 45  .#  define CACKE
4ee0: 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 41 50 50  Y_DEBUG_FUNC_APP
4ef0: 54 59 50 45 5f 54 4f 5f 53 54 52 28 78 29 20 22  TYPE_TO_STR(x) "
4f00: 44 45 42 55 47 5f 44 49 53 41 42 4c 45 44 22 0a  DEBUG_DISABLED".
4f10: 23 20 20 64 65 66 69 6e 65 20 43 41 43 4b 45 59  #  define CACKEY
4f20: 5f 44 45 42 55 47 5f 46 55 4e 43 5f 41 54 54 52  _DEBUG_FUNC_ATTR
4f30: 49 42 55 54 45 5f 54 4f 5f 53 54 52 28 78 29 20  IBUTE_TO_STR(x) 
4f40: 22 44 45 42 55 47 5f 44 49 53 41 42 4c 45 44 22  "DEBUG_DISABLED"
4f50: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 49  .#endif../*. * I
4f60: 6e 63 6c 75 64 65 20 74 68 65 73 65 20 73 6f 75  nclude these sou
4f70: 72 63 65 20 66 69 6c 65 73 20 69 6e 20 74 68 69  rce files in thi
4f80: 73 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 75 6e  s translation un
4f90: 69 74 20 73 6f 20 74 68 61 74 20 77 65 20 63 61  it so that we ca
4fa0: 6e 20 62 69 6e 64 20 74 6f 0a 20 2a 20 66 75 6e  n bind to. * fun
4fb0: 63 74 69 6f 6e 73 20 61 6e 64 20 6e 6f 74 20 69  ctions and not i
4fc0: 6e 63 6c 75 64 65 20 61 6e 79 20 73 79 6d 62 6f  nclude any symbo
4fd0: 6c 73 20 69 6e 20 74 68 65 20 6f 75 74 70 75 74  ls in the output
4fe0: 20 73 68 61 72 65 64 20 6f 62 6a 65 63 74 2e 0a   shared object..
4ff0: 20 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 61 73   */.#include "as
5000: 6e 31 2d 78 35 30 39 2e 63 22 0a 23 69 6e 63 6c  n1-x509.c".#incl
5010: 75 64 65 20 22 73 68 61 31 2e 63 22 0a 23 69 6e  ude "sha1.c".#in
5020: 63 6c 75 64 65 20 22 6d 64 35 2e 63 22 0a 0a 74  clude "md5.c"..t
5030: 79 70 65 64 65 66 20 65 6e 75 6d 20 7b 0a 09 43  ypedef enum {..C
5040: 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43 41  ACKEY_ID_TYPE_CA
5050: 43 2c 0a 09 43 41 43 4b 45 59 5f 49 44 5f 54 59  C,..CACKEY_ID_TY
5060: 50 45 5f 50 49 56 2c 0a 09 43 41 43 4b 45 59 5f  PE_PIV,..CACKEY_
5070: 49 44 5f 54 59 50 45 5f 43 45 52 54 5f 4f 4e 4c  ID_TYPE_CERT_ONL
5080: 59 0a 7d 20 63 61 63 6b 65 79 5f 70 63 73 63 5f  Y.} cackey_pcsc_
5090: 69 64 5f 74 79 70 65 3b 0a 0a 73 74 72 75 63 74  id_type;..struct
50a0: 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65   cackey_pcsc_ide
50b0: 6e 74 69 74 79 20 7b 0a 09 63 61 63 6b 65 79 5f  ntity {..cackey_
50c0: 70 63 73 63 5f 69 64 5f 74 79 70 65 20 69 64 5f  pcsc_id_type id_
50d0: 74 79 70 65 3b 0a 0a 09 73 69 7a 65 5f 74 20 63  type;...size_t c
50e0: 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 3b 0a  ertificate_len;.
50f0: 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  .unsigned char *
5100: 63 65 72 74 69 66 69 63 61 74 65 3b 0a 0a 09 73  certificate;...s
5110: 73 69 7a 65 5f 74 20 6b 65 79 73 69 7a 65 3b 0a  size_t keysize;.
5120: 0a 09 75 6e 69 6f 6e 20 7b 0a 09 09 73 74 72 75  ..union {...stru
5130: 63 74 20 7b 0a 09 09 09 75 6e 73 69 67 6e 65 64  ct {....unsigned
5140: 20 63 68 61 72 20 61 70 70 6c 65 74 5b 37 5d 3b   char applet[7];
5150: 0a 09 09 09 75 69 6e 74 31 36 5f 74 20 66 69 6c  ....uint16_t fil
5160: 65 3b 0a 09 09 7d 20 63 61 63 3b 0a 0a 09 09 73  e;...} cac;....s
5170: 74 72 75 63 74 20 7b 0a 09 09 09 75 6e 73 69 67  truct {....unsig
5180: 6e 65 64 20 63 68 61 72 20 6b 65 79 5f 69 64 3b  ned char key_id;
5190: 0a 09 09 09 63 68 61 72 20 6c 61 62 65 6c 5b 33  ....char label[3
51a0: 32 5d 3b 0a 09 09 7d 20 70 69 76 3b 0a 09 7d 20  2];...} piv;..} 
51b0: 63 61 72 64 3b 0a 7d 3b 0a 0a 73 74 72 75 63 74  card;.};..struct
51c0: 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79   cackey_identity
51d0: 20 7b 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65   {..struct cacke
51e0: 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20  y_pcsc_identity 
51f0: 2a 70 63 73 63 5f 69 64 65 6e 74 69 74 79 3b 0a  *pcsc_identity;.
5200: 0a 09 43 4b 5f 41 54 54 52 49 42 55 54 45 20 2a  ..CK_ATTRIBUTE *
5210: 61 74 74 72 69 62 75 74 65 73 3b 0a 09 43 4b 5f  attributes;..CK_
5220: 55 4c 4f 4e 47 20 61 74 74 72 69 62 75 74 65 73  ULONG attributes
5230: 5f 63 6f 75 6e 74 3b 0a 7d 3b 0a 0a 73 74 72 75  _count;.};..stru
5240: 63 74 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ct cackey_sessio
5250: 6e 20 7b 0a 09 69 6e 74 20 61 63 74 69 76 65 3b  n {..int active;
5260: 0a 0a 09 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c  ...CK_SLOT_ID sl
5270: 6f 74 49 44 3b 0a 0a 09 43 4b 5f 53 54 41 54 45  otID;...CK_STATE
5280: 20 73 74 61 74 65 3b 0a 09 43 4b 5f 46 4c 41 47   state;..CK_FLAG
5290: 53 20 66 6c 61 67 73 3b 0a 09 43 4b 5f 55 4c 4f  S flags;..CK_ULO
52a0: 4e 47 20 75 6c 44 65 76 69 63 65 45 72 72 6f 72  NG ulDeviceError
52b0: 3b 0a 09 43 4b 5f 56 4f 49 44 5f 50 54 52 20 70  ;..CK_VOID_PTR p
52c0: 41 70 70 6c 69 63 61 74 69 6f 6e 3b 0a 09 43 4b  Application;..CK
52d0: 5f 4e 4f 54 49 46 59 20 4e 6f 74 69 66 79 3b 0a  _NOTIFY Notify;.
52e0: 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  ..struct cackey_
52f0: 69 64 65 6e 74 69 74 79 20 2a 69 64 65 6e 74 69  identity *identi
5300: 74 69 65 73 3b 0a 09 75 6e 73 69 67 6e 65 64 20  ties;..unsigned 
5310: 6c 6f 6e 67 20 69 64 65 6e 74 69 74 69 65 73 5f  long identities_
5320: 63 6f 75 6e 74 3b 0a 0a 09 69 6e 74 20 73 65 61  count;...int sea
5330: 72 63 68 5f 61 63 74 69 76 65 3b 0a 09 43 4b 5f  rch_active;..CK_
5340: 41 54 54 52 49 42 55 54 45 5f 50 54 52 20 73 65  ATTRIBUTE_PTR se
5350: 61 72 63 68 5f 71 75 65 72 79 3b 0a 09 43 4b 5f  arch_query;..CK_
5360: 55 4c 4f 4e 47 20 73 65 61 72 63 68 5f 71 75 65  ULONG search_que
5370: 72 79 5f 63 6f 75 6e 74 3b 0a 09 75 6e 73 69 67  ry_count;..unsig
5380: 6e 65 64 20 6c 6f 6e 67 20 73 65 61 72 63 68 5f  ned long search_
5390: 63 75 72 72 5f 69 64 3b 0a 0a 09 69 6e 74 20 73  curr_id;...int s
53a0: 69 67 6e 5f 61 63 74 69 76 65 3b 0a 09 43 4b 5f  ign_active;..CK_
53b0: 4d 45 43 48 41 4e 49 53 4d 5f 54 59 50 45 20 73  MECHANISM_TYPE s
53c0: 69 67 6e 5f 6d 65 63 68 61 6e 69 73 6d 3b 0a 09  ign_mechanism;..
53d0: 43 4b 5f 42 59 54 45 5f 50 54 52 20 73 69 67 6e  CK_BYTE_PTR sign
53e0: 5f 62 75 66 3b 0a 09 75 6e 73 69 67 6e 65 64 20  _buf;..unsigned 
53f0: 6c 6f 6e 67 20 73 69 67 6e 5f 62 75 66 6c 65 6e  long sign_buflen
5400: 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  ;..unsigned long
5410: 20 73 69 67 6e 5f 62 75 66 75 73 65 64 3b 0a 09   sign_bufused;..
5420: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69 64  struct cackey_id
5430: 65 6e 74 69 74 79 20 2a 73 69 67 6e 5f 69 64 65  entity *sign_ide
5440: 6e 74 69 74 79 3b 0a 0a 09 69 6e 74 20 64 65 63  ntity;...int dec
5450: 72 79 70 74 5f 61 63 74 69 76 65 3b 0a 09 43 4b  rypt_active;..CK
5460: 5f 4d 45 43 48 41 4e 49 53 4d 5f 54 59 50 45 20  _MECHANISM_TYPE 
5470: 64 65 63 72 79 70 74 5f 6d 65 63 68 61 6e 69 73  decrypt_mechanis
5480: 6d 3b 0a 09 43 4b 5f 56 4f 49 44 5f 50 54 52 20  m;..CK_VOID_PTR 
5490: 64 65 63 72 79 70 74 5f 6d 65 63 68 5f 70 61 72  decrypt_mech_par
54a0: 6d 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 64 65 63  m;..CK_ULONG dec
54b0: 72 79 70 74 5f 6d 65 63 68 5f 70 61 72 6d 6c 65  rypt_mech_parmle
54c0: 6e 3b 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65  n;..struct cacke
54d0: 79 5f 69 64 65 6e 74 69 74 79 20 2a 64 65 63 72  y_identity *decr
54e0: 79 70 74 5f 69 64 65 6e 74 69 74 79 3b 0a 7d 3b  ypt_identity;.};
54f0: 0a 0a 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  ..struct cackey_
5500: 73 6c 6f 74 20 7b 0a 09 69 6e 74 20 61 63 74 69  slot {..int acti
5510: 76 65 3b 0a 09 69 6e 74 20 69 6e 74 65 72 6e 61  ve;..int interna
5520: 6c 3b 0a 0a 09 63 68 61 72 20 2a 70 63 73 63 5f  l;...char *pcsc_
5530: 72 65 61 64 65 72 3b 0a 0a 09 69 6e 74 20 70 63  reader;...int pc
5540: 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65  sc_card_connecte
5550: 64 3b 0a 09 53 43 41 52 44 48 41 4e 44 4c 45 20  d;..SCARDHANDLE 
5560: 70 63 73 63 5f 63 61 72 64 3b 0a 0a 09 69 6e 74  pcsc_card;...int
5570: 20 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70   transaction_dep
5580: 74 68 3b 0a 09 69 6e 74 20 74 72 61 6e 73 61 63  th;..int transac
5590: 74 69 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63  tion_need_hw_loc
55a0: 6b 3b 0a 0a 09 69 6e 74 20 73 6c 6f 74 5f 72 65  k;...int slot_re
55b0: 73 65 74 3b 0a 0a 09 43 4b 5f 46 4c 41 47 53 20  set;...CK_FLAGS 
55c0: 74 6f 6b 65 6e 5f 66 6c 61 67 73 3b 0a 0a 09 75  token_flags;...u
55d0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6c 61  nsigned char *la
55e0: 62 65 6c 3b 0a 0a 09 44 57 4f 52 44 20 70 72 6f  bel;...DWORD pro
55f0: 74 6f 63 6f 6c 3b 0a 0a 09 75 6e 73 69 67 6e 65  tocol;...unsigne
5600: 64 20 69 6e 74 20 63 61 63 68 65 64 5f 63 65 72  d int cached_cer
5610: 74 73 5f 63 6f 75 6e 74 3b 0a 09 73 74 72 75 63  ts_count;..struc
5620: 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64  t cackey_pcsc_id
5630: 65 6e 74 69 74 79 20 2a 63 61 63 68 65 64 5f 63  entity *cached_c
5640: 65 72 74 73 3b 0a 7d 3b 0a 0a 74 79 70 65 64 65  erts;.};..typede
5650: 66 20 65 6e 75 6d 20 7b 0a 09 43 41 43 4b 45 59  f enum {..CACKEY
5660: 5f 54 4c 56 5f 41 50 50 5f 47 45 4e 45 52 49 43  _TLV_APP_GENERIC
5670: 20 3d 20 30 78 30 31 2c 0a 09 43 41 43 4b 45 59   = 0x01,..CACKEY
5680: 5f 54 4c 56 5f 41 50 50 5f 53 4b 49 20 20 20 20  _TLV_APP_SKI    
5690: 20 3d 20 30 78 30 32 2c 0a 09 43 41 43 4b 45 59   = 0x02,..CACKEY
56a0: 5f 54 4c 56 5f 41 50 50 5f 50 4b 49 20 20 20 20  _TLV_APP_PKI    
56b0: 20 3d 20 30 78 30 34 0a 7d 20 63 61 63 6b 65 79   = 0x04.} cackey
56c0: 5f 74 6c 76 5f 61 70 70 74 79 70 65 3b 0a 0a 74  _tlv_apptype;..t
56d0: 79 70 65 64 65 66 20 65 6e 75 6d 20 7b 0a 09 43  ypedef enum {..C
56e0: 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f  ACKEY_TLV_OBJID_
56f0: 47 45 4e 45 52 41 4c 49 4e 46 4f 20 20 20 20 20  GENERALINFO     
5700: 20 20 3d 20 30 78 32 30 30 30 2c 0a 09 43 41 43    = 0x2000,..CAC
5710: 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 50 52  KEY_TLV_OBJID_PR
5720: 4f 50 45 52 53 4f 4e 41 4c 49 4e 46 4f 20 20 20  OPERSONALINFO   
5730: 3d 20 30 78 32 31 30 30 2c 0a 09 43 41 43 4b 45  = 0x2100,..CACKE
5740: 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 41 43 43 45  Y_TLV_OBJID_ACCE
5750: 53 53 43 4f 4e 54 52 4f 4c 20 20 20 20 20 3d 20  SSCONTROL     = 
5760: 30 78 33 30 30 30 2c 0a 09 43 41 43 4b 45 59 5f  0x3000,..CACKEY_
5770: 54 4c 56 5f 4f 42 4a 49 44 5f 4c 4f 47 49 4e 20  TLV_OBJID_LOGIN 
5780: 20 20 20 20 20 20 20 20 20 20 20 20 3d 20 30 78              = 0x
5790: 34 30 30 30 2c 0a 09 43 41 43 4b 45 59 5f 54 4c  4000,..CACKEY_TL
57a0: 56 5f 4f 42 4a 49 44 5f 43 41 52 44 49 4e 46 4f  V_OBJID_CARDINFO
57b0: 20 20 20 20 20 20 20 20 20 20 3d 20 30 78 35 30            = 0x50
57c0: 30 30 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f  00,..CACKEY_TLV_
57d0: 4f 42 4a 49 44 5f 42 49 4f 4d 45 54 52 49 43 53  OBJID_BIOMETRICS
57e0: 20 20 20 20 20 20 20 20 3d 20 30 78 36 30 30 30          = 0x6000
57f0: 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42  ,..CACKEY_TLV_OB
5800: 4a 49 44 5f 44 49 47 49 54 41 4c 53 49 47 43 45  JID_DIGITALSIGCE
5810: 52 54 20 20 20 20 3d 20 30 78 37 30 30 30 2c 0a  RT    = 0x7000,.
5820: 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49  .CACKEY_TLV_OBJI
5830: 44 5f 43 41 43 5f 50 45 52 53 4f 4e 20 20 20 20  D_CAC_PERSON    
5840: 20 20 20 20 3d 20 30 78 30 32 30 30 2c 0a 09 43      = 0x0200,..C
5850: 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f  ACKEY_TLV_OBJID_
5860: 43 41 43 5f 42 45 4e 45 46 49 54 53 20 20 20 20  CAC_BENEFITS    
5870: 20 20 3d 20 30 78 30 32 30 32 2c 0a 09 43 41 43    = 0x0202,..CAC
5880: 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41  KEY_TLV_OBJID_CA
5890: 43 5f 4f 54 48 45 52 42 45 4e 45 46 49 54 53 20  C_OTHERBENEFITS 
58a0: 3d 20 30 78 30 32 30 33 2c 0a 09 43 41 43 4b 45  = 0x0203,..CACKE
58b0: 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f  Y_TLV_OBJID_CAC_
58c0: 50 45 52 53 4f 4e 4e 45 4c 20 20 20 20 20 3d 20  PERSONNEL     = 
58d0: 30 78 30 32 30 31 2c 0a 09 43 41 43 4b 45 59 5f  0x0201,..CACKEY_
58e0: 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 50 4b  TLV_OBJID_CAC_PK
58f0: 49 43 45 52 54 20 20 20 20 20 20 20 3d 20 30 78  ICERT       = 0x
5900: 30 32 46 45 0a 7d 20 63 61 63 6b 65 79 5f 74 6c  02FE.} cackey_tl
5910: 76 5f 6f 62 6a 65 63 74 69 64 3b 0a 0a 74 79 70  v_objectid;..typ
5920: 65 64 65 66 20 65 6e 75 6d 20 7b 0a 09 43 41 43  edef enum {..CAC
5930: 4b 45 59 5f 50 43 53 43 5f 53 5f 54 4f 4b 45 4e  KEY_PCSC_S_TOKEN
5940: 50 52 45 53 45 4e 54 20 20 20 20 3d 20 31 2c 0a  PRESENT    = 1,.
5950: 09 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f  .CACKEY_PCSC_S_O
5960: 4b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3d  K              =
5970: 20 30 2c 0a 09 43 41 43 4b 45 59 5f 50 43 53 43   0,..CACKEY_PCSC
5980: 5f 45 5f 47 45 4e 45 52 49 43 20 20 20 20 20 20  _E_GENERIC      
5990: 20 20 20 3d 20 2d 31 2c 0a 09 43 41 43 4b 45 59     = -1,..CACKEY
59a0: 5f 50 43 53 43 5f 45 5f 42 41 44 50 49 4e 20 20  _PCSC_E_BADPIN  
59b0: 20 20 20 20 20 20 20 20 3d 20 2d 32 2c 0a 09 43          = -2,..C
59c0: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4c 4f 43  ACKEY_PCSC_E_LOC
59d0: 4b 45 44 20 20 20 20 20 20 20 20 20 20 3d 20 2d  KED          = -
59e0: 33 2c 0a 09 43 41 43 4b 45 59 5f 50 43 53 43 5f  3,..CACKEY_PCSC_
59f0: 45 5f 4e 45 45 44 4c 4f 47 49 4e 20 20 20 20 20  E_NEEDLOGIN     
5a00: 20 20 3d 20 2d 34 2c 0a 09 43 41 43 4b 45 59 5f    = -4,..CACKEY_
5a10: 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45  PCSC_E_TOKENABSE
5a20: 4e 54 20 20 20 20 20 3d 20 2d 36 2c 0a 09 43 41  NT     = -6,..CA
5a30: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 52 45 54 52  CKEY_PCSC_E_RETR
5a40: 59 20 20 20 20 20 20 20 20 20 20 20 3d 20 2d 37  Y           = -7
5a50: 2c 0a 09 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  ,..CACKEY_PCSC_E
5a60: 5f 4e 4f 44 41 54 41 20 20 20 20 20 20 20 20 20  _NODATA         
5a70: 20 3d 20 2d 38 0a 7d 20 63 61 63 6b 65 79 5f 72   = -8.} cackey_r
5a80: 65 74 3b 0a 0a 73 74 72 75 63 74 20 63 61 63 6b  et;..struct cack
5a90: 65 79 5f 74 6c 76 5f 63 61 72 64 75 72 6c 20 7b  ey_tlv_cardurl {
5aa0: 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  ..unsigned char 
5ab0: 20 20 20 20 20 20 20 72 69 64 5b 35 5d 3b 0a 09         rid[5];..
5ac0: 63 61 63 6b 65 79 5f 74 6c 76 5f 61 70 70 74 79  cackey_tlv_appty
5ad0: 70 65 20 20 20 61 70 70 74 79 70 65 3b 0a 09 63  pe   apptype;..c
5ae0: 61 63 6b 65 79 5f 74 6c 76 5f 6f 62 6a 65 63 74  ackey_tlv_object
5af0: 69 64 20 20 6f 62 6a 65 63 74 69 64 3b 0a 09 63  id  objectid;..c
5b00: 61 63 6b 65 79 5f 74 6c 76 5f 6f 62 6a 65 63 74  ackey_tlv_object
5b10: 69 64 20 20 61 70 70 69 64 3b 0a 09 75 6e 73 69  id  appid;..unsi
5b20: 67 6e 65 64 20 63 68 61 72 20 20 20 20 20 20 20  gned char       
5b30: 20 70 69 6e 69 64 3b 0a 7d 3b 0a 0a 73 74 72 75   pinid;.};..stru
5b40: 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e  ct cackey_tlv_en
5b50: 74 69 74 79 3b 0a 73 74 72 75 63 74 20 63 61 63  tity;.struct cac
5b60: 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20 7b  key_tlv_entity {
5b70: 0a 09 75 69 6e 74 38 5f 74 20 74 61 67 3b 0a 09  ..uint8_t tag;..
5b80: 73 69 7a 65 5f 74 20 6c 65 6e 67 74 68 3b 0a 0a  size_t length;..
5b90: 09 75 6e 69 6f 6e 20 7b 0a 09 09 76 6f 69 64 20  .union {...void 
5ba0: 2a 76 61 6c 75 65 3b 0a 09 09 73 74 72 75 63 74  *value;...struct
5bb0: 20 63 61 63 6b 65 79 5f 74 6c 76 5f 63 61 72 64   cackey_tlv_card
5bc0: 75 72 6c 20 2a 76 61 6c 75 65 5f 63 61 72 64 75  url *value_cardu
5bd0: 72 6c 3b 0a 09 09 75 69 6e 74 38 5f 74 20 76 61  rl;...uint8_t va
5be0: 6c 75 65 5f 62 79 74 65 3b 0a 09 7d 3b 0a 0a 09  lue_byte;..};...
5bf0: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c  struct cackey_tl
5c00: 76 5f 65 6e 74 69 74 79 20 2a 5f 6e 65 78 74 3b  v_entity *_next;
5c10: 0a 7d 3b 0a 0a 2f 2a 20 43 41 43 4b 45 59 20 47  .};../* CACKEY G
5c20: 6c 6f 62 61 6c 20 48 61 6e 64 6c 65 73 20 2a 2f  lobal Handles */
5c30: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 63 61  .static void *ca
5c40: 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 20 3d 20 4e  ckey_biglock = N
5c50: 55 4c 4c 3b 0a 73 74 61 74 69 63 20 73 74 72 75  ULL;.static stru
5c60: 63 74 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ct cackey_sessio
5c70: 6e 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  n cackey_session
5c80: 73 5b 31 32 38 5d 3b 0a 73 74 61 74 69 63 20 73  s[128];.static s
5c90: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f  truct cackey_slo
5ca0: 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 31  t cackey_slots[1
5cb0: 32 38 5d 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  28];.static int 
5cc0: 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
5cd0: 65 64 20 3d 20 30 3b 0a 73 74 61 74 69 63 20 69  ed = 0;.static i
5ce0: 6e 74 20 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  nt cackey_bigloc
5cf0: 6b 5f 69 6e 69 74 20 3d 20 30 3b 0a 43 4b 5f 43  k_init = 0;.CK_C
5d00: 5f 49 4e 49 54 49 41 4c 49 5a 45 5f 41 52 47 53  _INITIALIZE_ARGS
5d10: 20 63 61 63 6b 65 79 5f 61 72 67 73 3b 0a 0a 2f   cackey_args;../
5d20: 2a 2a 20 45 78 74 72 61 20 63 65 72 74 69 66 69  ** Extra certifi
5d30: 63 61 74 65 73 20 74 6f 20 69 6e 63 6c 75 64 65  cates to include
5d40: 20 69 6e 20 74 6f 6b 65 6e 20 2a 2a 2f 0a 73 74   in token **/.st
5d50: 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63  ruct cackey_pcsc
5d60: 5f 69 64 65 6e 74 69 74 79 20 65 78 74 72 61 5f  _identity extra_
5d70: 63 65 72 74 73 5b 5d 20 3d 20 7b 0a 23 69 6e 63  certs[] = {.#inc
5d80: 6c 75 64 65 20 22 63 61 63 6b 65 79 5f 62 75 69  lude "cackey_bui
5d90: 6c 74 69 6e 5f 63 65 72 74 73 2e 68 22 0a 7d 3b  ltin_certs.h".};
5da0: 0a 0a 23 64 65 66 69 6e 65 20 43 41 43 4b 45 59  ..#define CACKEY
5db0: 5f 4d 41 43 52 4f 5f 44 45 46 41 55 4c 54 5f 58  _MACRO_DEFAULT_X
5dc0: 53 54 52 28 73 74 72 29 20 43 41 43 4b 45 59 5f  STR(str) CACKEY_
5dd0: 4d 41 43 52 4f 5f 44 45 46 41 55 4c 54 5f 53 54  MACRO_DEFAULT_ST
5de0: 52 28 73 74 72 29 0a 23 64 65 66 69 6e 65 20 43  R(str).#define C
5df0: 41 43 4b 45 59 5f 4d 41 43 52 4f 5f 44 45 46 41  ACKEY_MACRO_DEFA
5e00: 55 4c 54 5f 53 54 52 28 73 74 72 29 20 23 73 74  ULT_STR(str) #st
5e10: 72 0a 0a 2f 2a 20 50 72 6f 74 65 63 74 65 64 20  r../* Protected 
5e20: 41 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 20 50  Authentication P
5e30: 61 74 68 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 73  ath command */.s
5e40: 74 61 74 69 63 20 63 68 61 72 20 2a 63 61 63 6b  tatic char *cack
5e50: 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20 3d  ey_pin_command =
5e60: 20 4e 55 4c 4c 3b 0a 0a 2f 2a 20 52 65 61 64 65   NULL;../* Reade
5e70: 72 20 45 78 63 6c 75 73 69 6f 6e 20 6f 72 20 49  r Exclusion or I
5e80: 6e 63 6c 75 64 65 2d 6f 6e 6c 79 20 2a 2f 0a 73  nclude-only */.s
5e90: 74 61 74 69 63 20 63 68 61 72 20 2a 63 61 63 6b  tatic char *cack
5ea0: 65 79 5f 72 65 61 64 65 72 73 5f 69 6e 63 6c 75  ey_readers_inclu
5eb0: 64 65 5f 6f 6e 6c 79 20 3d 20 4e 55 4c 4c 3b 0a  de_only = NULL;.
5ec0: 73 74 61 74 69 63 20 63 68 61 72 20 2a 63 61 63  static char *cac
5ed0: 6b 65 79 5f 72 65 61 64 65 72 73 5f 65 78 63 6c  key_readers_excl
5ee0: 75 64 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 2f 2a 20  ude = NULL;../* 
5ef0: 50 43 53 43 20 47 6c 6f 62 61 6c 20 48 61 6e 64  PCSC Global Hand
5f00: 6c 65 73 20 2a 2f 0a 73 74 61 74 69 63 20 4c 50  les */.static LP
5f10: 53 43 41 52 44 43 4f 4e 54 45 58 54 20 63 61 63  SCARDCONTEXT cac
5f20: 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 20  key_pcsc_handle 
5f30: 3d 20 4e 55 4c 4c 3b 0a 0a 73 74 61 74 69 63 20  = NULL;..static 
5f40: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 63 61  unsigned long ca
5f50: 63 6b 65 79 5f 67 65 74 76 65 72 73 69 6f 6e 28  ckey_getversion(
5f60: 76 6f 69 64 29 20 7b 0a 09 73 74 61 74 69 63 20  void) {..static 
5f70: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 72 65  unsigned long re
5f80: 74 76 61 6c 20 3d 20 32 35 35 3b 0a 09 75 6e 73  tval = 255;..uns
5f90: 69 67 6e 65 64 20 6c 6f 6e 67 20 6d 61 6a 6f 72  igned long major
5fa0: 20 3d 20 30 3b 0a 09 75 6e 73 69 67 6e 65 64 20   = 0;..unsigned 
5fb0: 6c 6f 6e 67 20 6d 69 6e 6f 72 20 3d 20 30 3b 0a  long minor = 0;.
5fc0: 09 63 68 61 72 20 2a 6d 61 6a 6f 72 5f 73 74 72  .char *major_str
5fd0: 20 3d 20 4e 55 4c 4c 3b 0a 09 63 68 61 72 20 2a   = NULL;..char *
5fe0: 6d 69 6e 6f 72 5f 73 74 72 20 3d 20 4e 55 4c 4c  minor_str = NULL
5ff0: 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
6000: 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
6010: 22 29 3b 0a 0a 09 69 66 20 28 72 65 74 76 61 6c  ");...if (retval
6020: 20 21 3d 20 32 35 35 29 20 7b 0a 09 09 43 41 43   != 255) {...CAC
6030: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
6040: 28 22 52 65 74 75 72 6e 69 6e 67 20 30 78 25 6c  ("Returning 0x%l
6050: 78 20 28 63 61 63 68 65 64 29 2e 22 2c 20 72 65  x (cached).", re
6060: 74 76 61 6c 29 3b 0a 0a 09 09 72 65 74 75 72 6e  tval);....return
6070: 28 72 65 74 76 61 6c 29 3b 0a 09 7d 0a 0a 09 72  (retval);..}...r
6080: 65 74 76 61 6c 20 3d 20 30 3b 0a 0a 23 69 66 64  etval = 0;..#ifd
6090: 65 66 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49  ef PACKAGE_VERSI
60a0: 4f 4e 0a 20 20 20 20 20 20 20 20 6d 61 6a 6f 72  ON.        major
60b0: 5f 73 74 72 20 3d 20 50 41 43 4b 41 47 45 5f 56  _str = PACKAGE_V
60c0: 45 52 53 49 4f 4e 3b 0a 09 69 66 20 28 6d 61 6a  ERSION;..if (maj
60d0: 6f 72 5f 73 74 72 29 20 7b 0a 09 20 20 20 20 20  or_str) {..     
60e0: 20 20 20 6d 61 6a 6f 72 20 3d 20 73 74 72 74 6f     major = strto
60f0: 75 6c 28 6d 61 6a 6f 72 5f 73 74 72 2c 20 26 6d  ul(major_str, &m
6100: 69 6e 6f 72 5f 73 74 72 2c 20 31 30 29 3b 0a 0a  inor_str, 10);..
6110: 09 09 69 66 20 28 6d 69 6e 6f 72 5f 73 74 72 29  ..if (minor_str)
6120: 20 7b 0a 09 09 09 6d 69 6e 6f 72 20 3d 20 73 74   {....minor = st
6130: 72 74 6f 75 6c 28 6d 69 6e 6f 72 5f 73 74 72 20  rtoul(minor_str 
6140: 2b 20 31 2c 20 4e 55 4c 4c 2c 20 31 30 29 3b 0a  + 1, NULL, 10);.
6150: 09 09 7d 0a 09 7d 0a 0a 09 72 65 74 76 61 6c 20  ..}..}...retval 
6160: 3d 20 28 6d 61 6a 6f 72 20 3c 3c 20 31 36 29 20  = (major << 16) 
6170: 7c 20 28 6d 69 6e 6f 72 20 3c 3c 20 38 29 3b 0a  | (minor << 8);.
6180: 23 65 6e 64 69 66 0a 0a 09 43 41 43 4b 45 59 5f  #endif...CACKEY_
6190: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
61a0: 74 75 72 6e 69 6e 67 20 30 78 25 6c 78 22 2c 20  turning 0x%lx", 
61b0: 72 65 74 76 61 6c 29 3b 0a 0a 09 72 65 74 75 72  retval);...retur
61c0: 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 2f 2a  n(retval);.}../*
61d0: 20 50 43 2f 53 43 20 52 65 6c 61 74 65 64 20 46   PC/SC Related F
61e0: 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 2f 2a 0a 20  unctions */./*. 
61f0: 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20  * SYNPOSIS. *   
6200: 20 20 76 6f 69 64 20 63 61 63 6b 65 79 5f 73 6c    void cackey_sl
6210: 6f 74 73 5f 64 69 73 63 6f 6e 6e 65 63 74 5f 61  ots_disconnect_a
6220: 6c 6c 28 76 6f 69 64 29 3b 0a 20 2a 0a 20 2a 20  ll(void);. *. * 
6230: 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20  ARGUMENTS. *    
6240: 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 52 45 54 55   None. *. * RETU
6250: 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20  RN VALUE. *     
6260: 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53  None. *. * NOTES
6270: 0a 20 2a 20 20 20 20 20 54 68 69 73 20 66 75 6e  . *     This fun
6280: 63 74 69 6f 6e 20 64 69 73 63 6f 6e 6e 65 63 74  ction disconnect
6290: 73 20 66 72 6f 6d 20 61 6c 6c 20 63 61 72 64 73  s from all cards
62a0: 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20  .. *. */.static 
62b0: 76 6f 69 64 20 63 61 63 6b 65 79 5f 73 6c 6f 74  void cackey_slot
62c0: 73 5f 64 69 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c  s_disconnect_all
62d0: 28 76 6f 69 64 29 20 7b 0a 09 75 69 6e 74 33 32  (void) {..uint32
62e0: 5f 74 20 69 64 78 3b 0a 0a 09 43 41 43 4b 45 59  _t idx;...CACKEY
62f0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
6300: 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 66 6f 72 20  alled.");...for 
6310: 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20  (idx = 0; idx < 
6320: 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
6330: 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  lots) / sizeof(c
6340: 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29  ackey_slots[0]))
6350: 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20  ; idx++) {...if 
6360: 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64  (cackey_slots[id
6370: 78 5d 2e 69 6e 74 65 72 6e 61 6c 29 20 7b 0a 09  x].internal) {..
6380: 09 09 2f 2a 20 53 6b 69 70 20 69 6e 74 65 72 6e  ../* Skip intern
6390: 61 6c 20 73 6c 6f 74 73 20 2a 2f 0a 09 09 09 63  al slots */....c
63a0: 6f 6e 74 69 6e 75 65 3b 0a 09 09 7d 0a 0a 09 09  ontinue;...}....
63b0: 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  if (cackey_slots
63c0: 5b 69 64 78 5d 2e 70 63 73 63 5f 63 61 72 64 5f  [idx].pcsc_card_
63d0: 63 6f 6e 6e 65 63 74 65 64 29 20 7b 0a 09 09 09  connected) {....
63e0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
63f0: 4e 54 46 28 22 53 43 61 72 64 44 69 73 63 6f 6e  NTF("SCardDiscon
6400: 6e 65 63 74 28 25 6c 75 29 20 63 61 6c 6c 65 64  nect(%lu) called
6410: 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
6420: 67 29 20 69 64 78 29 3b 0a 0a 09 09 09 53 43 61  g) idx);.....SCa
6430: 72 64 44 69 73 63 6f 6e 6e 65 63 74 28 63 61 63  rdDisconnect(cac
6440: 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 70  key_slots[idx].p
6450: 63 73 63 5f 63 61 72 64 2c 20 53 43 41 52 44 5f  csc_card, SCARD_
6460: 4c 45 41 56 45 5f 43 41 52 44 29 3b 0a 09 09 7d  LEAVE_CARD);...}
6470: 0a 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73  ....if (cackey_s
6480: 6c 6f 74 73 5b 69 64 78 5d 2e 6c 61 62 65 6c 29  lots[idx].label)
6490: 20 7b 0a 09 09 09 66 72 65 65 28 63 61 63 6b 65   {....free(cacke
64a0: 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 6c 61 62  y_slots[idx].lab
64b0: 65 6c 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f  el);.....cackey_
64c0: 73 6c 6f 74 73 5b 69 64 78 5d 2e 6c 61 62 65 6c  slots[idx].label
64d0: 20 3d 20 4e 55 4c 4c 3b 0a 09 09 7d 0a 0a 09 09   = NULL;...}....
64e0: 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78  cackey_slots[idx
64f0: 5d 2e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e  ].pcsc_card_conn
6500: 65 63 74 65 64 20 3d 20 30 3b 0a 09 09 63 61 63  ected = 0;...cac
6510: 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 74  key_slots[idx].t
6520: 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68  ransaction_depth
6530: 20 3d 20 30 3b 0a 09 09 63 61 63 6b 65 79 5f 73   = 0;...cackey_s
6540: 6c 6f 74 73 5b 69 64 78 5d 2e 74 72 61 6e 73 61  lots[idx].transa
6550: 63 74 69 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f  ction_need_hw_lo
6560: 63 6b 20 3d 20 30 3b 0a 0a 09 09 69 66 20 28 63  ck = 0;....if (c
6570: 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d  ackey_slots[idx]
6580: 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 09 43 41  .active) {....CA
6590: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
65a0: 46 28 22 4d 61 72 6b 69 6e 67 20 61 63 74 69 76  F("Marking activ
65b0: 65 20 73 6c 6f 74 20 25 6c 75 20 61 73 20 62 65  e slot %lu as be
65c0: 69 6e 67 20 72 65 73 65 74 22 2c 20 28 75 6e 73  ing reset", (uns
65d0: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 69 64 78 29  igned long) idx)
65e0: 3b 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f  ;...}....cackey_
65f0: 73 6c 6f 74 73 5b 69 64 78 5d 2e 73 6c 6f 74 5f  slots[idx].slot_
6600: 72 65 73 65 74 20 3d 20 31 3b 0a 09 7d 0a 0a 09  reset = 1;..}...
6610: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
6620: 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 22 29  NTF("Returning")
6630: 3b 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  ;...return;.}../
6640: 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a  *. * SYNPOSIS. *
6650: 20 20 20 20 20 63 61 63 6b 65 79 5f 72 65 74 20       cackey_ret 
6660: 63 61 63 6b 65 79 5f 70 63 73 63 5f 63 6f 6e 6e  cackey_pcsc_conn
6670: 65 63 74 28 76 6f 69 64 29 3b 0a 20 2a 0a 20 2a  ect(void);. *. *
6680: 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20   ARGUMENTS. *   
6690: 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 52 45 54    None. *. * RET
66a0: 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20  URN VALUE. *    
66b0: 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f   CACKEY_PCSC_S_O
66c0: 4b 20 20 20 20 20 20 20 20 20 4f 6e 20 73 75 63  K         On suc
66d0: 63 65 73 73 0a 20 2a 20 20 20 20 20 43 41 43 4b  cess. *     CACK
66e0: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49  EY_PCSC_E_GENERI
66f0: 43 20 20 20 20 4f 6e 20 65 72 72 6f 72 0a 20 2a  C    On error. *
6700: 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20  . * NOTES. *    
6710: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   This function c
6720: 6f 6e 6e 65 63 74 73 20 74 6f 20 74 68 65 20 50  onnects to the P
6730: 43 2f 53 43 20 43 6f 6e 6e 65 63 74 69 6f 6e 20  C/SC Connection 
6740: 4d 61 6e 61 67 65 72 20 61 6e 64 20 75 70 64 61  Manager and upda
6750: 74 65 73 20 74 68 65 0a 20 2a 20 20 20 20 20 67  tes the. *     g
6760: 6c 6f 62 61 6c 20 68 61 6e 64 6c 65 2e 0a 20 2a  lobal handle.. *
6770: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 61 63 6b  . */.static cack
6780: 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 70 63  ey_ret cackey_pc
6790: 73 63 5f 63 6f 6e 6e 65 63 74 28 76 6f 69 64 29  sc_connect(void)
67a0: 20 7b 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f 65   {..LONG scard_e
67b0: 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74 3b 0a  st_context_ret;.
67c0: 23 69 66 64 65 66 20 48 41 56 45 5f 53 43 41 52  #ifdef HAVE_SCAR
67d0: 44 49 53 56 41 4c 49 44 43 4f 4e 54 45 58 54 0a  DISVALIDCONTEXT.
67e0: 09 4c 4f 4e 47 20 73 63 61 72 64 5f 69 73 76 61  .LONG scard_isva
67f0: 6c 69 64 5f 72 65 74 3b 0a 23 65 6e 64 69 66 0a  lid_ret;.#endif.
6800: 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
6810: 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
6820: 3b 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 70  ;...if (cackey_p
6830: 63 73 63 5f 68 61 6e 64 6c 65 20 3d 3d 20 4e 55  csc_handle == NU
6840: 4c 4c 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 70  LL) {...cackey_p
6850: 63 73 63 5f 68 61 6e 64 6c 65 20 3d 20 6d 61 6c  csc_handle = mal
6860: 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63 61 63 6b  loc(sizeof(*cack
6870: 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 29 29  ey_pcsc_handle))
6880: 3b 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 70  ;...if (cackey_p
6890: 63 73 63 5f 68 61 6e 64 6c 65 20 3d 3d 20 4e 55  csc_handle == NU
68a0: 4c 4c 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  LL) {....CACKEY_
68b0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
68c0: 6c 6c 20 74 6f 20 6d 61 6c 6c 6f 63 28 29 20 66  ll to malloc() f
68d0: 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 69 6e 67  ailed, returning
68e0: 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a   in failure");..
68f0: 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5f  ...cackey_slots_
6900: 64 69 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28 29  disconnect_all()
6910: 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43  ;.....return(CAC
6920: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52  KEY_PCSC_E_GENER
6930: 49 43 29 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b  IC);...}....CACK
6940: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
6950: 22 53 43 61 72 64 45 73 74 61 62 6c 69 73 68 43  "SCardEstablishC
6960: 6f 6e 74 65 78 74 28 29 20 63 61 6c 6c 65 64 22  ontext() called"
6970: 29 3b 0a 09 09 73 63 61 72 64 5f 65 73 74 5f 63  );...scard_est_c
6980: 6f 6e 74 65 78 74 5f 72 65 74 20 3d 20 53 43 61  ontext_ret = SCa
6990: 72 64 45 73 74 61 62 6c 69 73 68 43 6f 6e 74 65  rdEstablishConte
69a0: 78 74 28 53 43 41 52 44 5f 53 43 4f 50 45 5f 53  xt(SCARD_SCOPE_S
69b0: 59 53 54 45 4d 2c 20 4e 55 4c 4c 2c 20 4e 55 4c  YSTEM, NULL, NUL
69c0: 4c 2c 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 68  L, cackey_pcsc_h
69d0: 61 6e 64 6c 65 29 3b 0a 09 09 69 66 20 28 73 63  andle);...if (sc
69e0: 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f  ard_est_context_
69f0: 72 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f 53  ret != SCARD_S_S
6a00: 55 43 43 45 53 53 29 20 7b 0a 09 09 09 43 41 43  UCCESS) {....CAC
6a10: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
6a20: 28 22 43 61 6c 6c 20 74 6f 20 53 43 61 72 64 45  ("Call to SCardE
6a30: 73 74 61 62 6c 69 73 68 43 6f 6e 74 65 78 74 20  stablishContext 
6a40: 66 61 69 6c 65 64 20 28 72 65 74 75 72 6e 65 64  failed (returned
6a50: 20 25 73 2f 25 6c 69 29 2c 20 72 65 74 75 72 6e   %s/%li), return
6a60: 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 2c  ing in failure",
6a70: 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55   CACKEY_DEBUG_FU
6a80: 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53  NC_SCARDERR_TO_S
6a90: 54 52 28 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e  TR(scard_est_con
6aa0: 74 65 78 74 5f 72 65 74 29 2c 20 28 6c 6f 6e 67  text_ret), (long
6ab0: 29 20 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74  ) scard_est_cont
6ac0: 65 78 74 5f 72 65 74 29 3b 0a 0a 09 09 09 66 72  ext_ret);.....fr
6ad0: 65 65 28 63 61 63 6b 65 79 5f 70 63 73 63 5f 68  ee(cackey_pcsc_h
6ae0: 61 6e 64 6c 65 29 3b 0a 09 09 09 63 61 63 6b 65  andle);....cacke
6af0: 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d 20  y_pcsc_handle = 
6b00: 4e 55 4c 4c 3b 0a 0a 09 09 09 63 61 63 6b 65 79  NULL;.....cackey
6b10: 5f 73 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e 65 63  _slots_disconnec
6b20: 74 5f 61 6c 6c 28 29 3b 0a 0a 09 09 09 72 65 74  t_all();.....ret
6b30: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
6b40: 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 09 7d 0a  E_GENERIC);...}.
6b50: 09 7d 0a 0a 23 69 66 64 65 66 20 48 41 56 45 5f  .}..#ifdef HAVE_
6b60: 53 43 41 52 44 49 53 56 41 4c 49 44 43 4f 4e 54  SCARDISVALIDCONT
6b70: 45 58 54 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  EXT..CACKEY_DEBU
6b80: 47 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64 49  G_PRINTF("SCardI
6b90: 73 56 61 6c 69 64 43 6f 6e 74 65 78 74 28 29 20  sValidContext() 
6ba0: 63 61 6c 6c 65 64 22 29 3b 0a 09 73 63 61 72 64  called");..scard
6bb0: 5f 69 73 76 61 6c 69 64 5f 72 65 74 20 3d 20 53  _isvalid_ret = S
6bc0: 43 61 72 64 49 73 56 61 6c 69 64 43 6f 6e 74 65  CardIsValidConte
6bd0: 78 74 28 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f  xt(*cackey_pcsc_
6be0: 68 61 6e 64 6c 65 29 3b 0a 09 69 66 20 28 73 63  handle);..if (sc
6bf0: 61 72 64 5f 69 73 76 61 6c 69 64 5f 72 65 74 20  ard_isvalid_ret 
6c00: 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45  != SCARD_S_SUCCE
6c10: 53 53 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  SS) {...CACKEY_D
6c20: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 48 61 6e  EBUG_PRINTF("Han
6c30: 64 6c 65 20 68 61 73 20 62 65 63 6f 6d 65 20 69  dle has become i
6c40: 6e 76 61 6c 69 64 20 28 53 43 61 72 64 49 73 56  nvalid (SCardIsV
6c50: 61 6c 69 64 43 6f 6e 74 65 78 74 20 3d 20 25 73  alidContext = %s
6c60: 2f 25 6c 69 29 2c 20 74 72 79 69 6e 67 20 74 6f  /%li), trying to
6c70: 20 72 65 2d 65 73 74 61 62 6c 69 73 68 2e 2e 2e   re-establish...
6c80: 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ", CACKEY_DEBUG_
6c90: 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f  FUNC_SCARDERR_TO
6ca0: 5f 53 54 52 28 73 63 61 72 64 5f 69 73 76 61 6c  _STR(scard_isval
6cb0: 69 64 5f 72 65 74 29 2c 20 28 6c 6f 6e 67 29 20  id_ret), (long) 
6cc0: 73 63 61 72 64 5f 69 73 76 61 6c 69 64 5f 72 65  scard_isvalid_re
6cd0: 74 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  t);....CACKEY_DE
6ce0: 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43 61 72  BUG_PRINTF("SCar
6cf0: 64 45 73 74 61 62 6c 69 73 68 43 6f 6e 74 65 78  dEstablishContex
6d00: 74 28 29 20 63 61 6c 6c 65 64 22 29 3b 0a 09 09  t() called");...
6d10: 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78  scard_est_contex
6d20: 74 5f 72 65 74 20 3d 20 53 43 61 72 64 45 73 74  t_ret = SCardEst
6d30: 61 62 6c 69 73 68 43 6f 6e 74 65 78 74 28 53 43  ablishContext(SC
6d40: 41 52 44 5f 53 43 4f 50 45 5f 53 59 53 54 45 4d  ARD_SCOPE_SYSTEM
6d50: 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 63 61  , NULL, NULL, ca
6d60: 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65  ckey_pcsc_handle
6d70: 29 3b 0a 09 09 69 66 20 28 73 63 61 72 64 5f 65  );...if (scard_e
6d80: 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74 20 21  st_context_ret !
6d90: 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53  = SCARD_S_SUCCES
6da0: 53 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  S) {....CACKEY_D
6db0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
6dc0: 6c 20 74 6f 20 53 43 61 72 64 45 73 74 61 62 6c  l to SCardEstabl
6dd0: 69 73 68 43 6f 6e 74 65 78 74 20 66 61 69 6c 65  ishContext faile
6de0: 64 20 28 72 65 74 75 72 6e 65 64 20 25 73 2f 25  d (returned %s/%
6df0: 6c 69 29 2c 20 72 65 74 75 72 6e 69 6e 67 20 69  li), returning i
6e00: 6e 20 66 61 69 6c 75 72 65 22 2c 20 43 41 43 4b  n failure", CACK
6e10: 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43  EY_DEBUG_FUNC_SC
6e20: 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 63  ARDERR_TO_STR(sc
6e30: 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f  ard_est_context_
6e40: 72 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61  ret), (long) sca
6e50: 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72  rd_est_context_r
6e60: 65 74 29 3b 0a 0a 09 09 09 66 72 65 65 28 63 61  et);.....free(ca
6e70: 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65  ckey_pcsc_handle
6e80: 29 3b 0a 09 09 09 63 61 63 6b 65 79 5f 70 63 73  );....cackey_pcs
6e90: 63 5f 68 61 6e 64 6c 65 20 3d 20 4e 55 4c 4c 3b  c_handle = NULL;
6ea0: 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  .....cackey_slot
6eb0: 73 5f 64 69 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c  s_disconnect_all
6ec0: 28 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43  ();.....return(C
6ed0: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e  ACKEY_PCSC_E_GEN
6ee0: 45 52 49 43 29 3b 0a 09 09 7d 0a 0a 09 09 43 41  ERIC);...}....CA
6ef0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
6f00: 46 28 22 48 61 6e 64 6c 65 20 68 61 73 20 62 65  F("Handle has be
6f10: 65 6e 20 72 65 2d 65 73 74 61 62 6c 69 73 68 65  en re-establishe
6f20: 64 22 29 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a 0a  d");..}.#endif..
6f30: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
6f40: 49 4e 54 46 28 22 53 75 63 65 73 73 66 75 6c 6c  INTF("Sucessfull
6f50: 79 20 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20 50  y connected to P
6f60: 43 2f 53 43 2c 20 72 65 74 75 72 6e 69 6e 67 20  C/SC, returning 
6f70: 69 6e 20 73 75 63 63 65 73 73 22 29 3b 0a 0a 09  in success");...
6f80: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
6f90: 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a  SC_S_OK);.}../*.
6fa0: 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20   * SYNPOSIS. *  
6fb0: 20 20 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61     cackey_ret ca
6fc0: 63 6b 65 79 5f 70 63 73 63 5f 64 69 73 63 6f 6e  ckey_pcsc_discon
6fd0: 6e 65 63 74 28 76 6f 69 64 29 3b 0a 20 2a 0a 20  nect(void);. *. 
6fe0: 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20  * ARGUMENTS. *  
6ff0: 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 52 45     None. *. * RE
7000: 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20  TURN VALUE. *   
7010: 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f    CACKEY_PCSC_S_
7020: 4f 4b 20 20 20 20 20 20 20 20 20 4f 6e 20 73 75  OK         On su
7030: 63 63 65 73 73 0a 20 2a 20 20 20 20 20 43 41 43  ccess. *     CAC
7040: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52  KEY_PCSC_E_GENER
7050: 49 43 20 20 20 20 4f 6e 20 65 72 72 6f 72 0a 20  IC    On error. 
7060: 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20  *. * NOTES. *   
7070: 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20    This function 
7080: 64 69 73 63 6f 6e 6e 65 63 74 73 20 66 72 6f 6d  disconnects from
7090: 20 74 68 65 20 50 43 2f 53 43 20 43 6f 6e 6e 65   the PC/SC Conne
70a0: 63 74 69 6f 6e 20 6d 61 6e 61 67 65 72 20 61 6e  ction manager an
70b0: 64 20 75 70 64 61 74 65 73 0a 20 2a 20 20 20 20  d updates. *    
70c0: 20 74 68 65 20 67 6c 6f 62 61 6c 20 68 61 6e 64   the global hand
70d0: 6c 65 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69  le.. *. */.stati
70e0: 63 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63  c cackey_ret cac
70f0: 6b 65 79 5f 70 63 73 63 5f 64 69 73 63 6f 6e 6e  key_pcsc_disconn
7100: 65 63 74 28 76 6f 69 64 29 20 7b 0a 09 4c 4f 4e  ect(void) {..LON
7110: 47 20 73 63 61 72 64 5f 72 65 6c 5f 63 6f 6e 74  G scard_rel_cont
7120: 65 78 74 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45  ext_ret;...CACKE
7130: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
7140: 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
7150: 28 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e  (cackey_pcsc_han
7160: 64 6c 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  dle == NULL) {..
7170: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
7180: 43 53 43 5f 53 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09  CSC_S_OK);..}...
7190: 73 63 61 72 64 5f 72 65 6c 5f 63 6f 6e 74 65 78  scard_rel_contex
71a0: 74 5f 72 65 74 20 3d 20 53 43 61 72 64 52 65 6c  t_ret = SCardRel
71b0: 65 61 73 65 43 6f 6e 74 65 78 74 28 2a 63 61 63  easeContext(*cac
71c0: 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 29  key_pcsc_handle)
71d0: 3b 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 70  ;...if (cackey_p
71e0: 63 73 63 5f 68 61 6e 64 6c 65 29 20 7b 0a 09 09  csc_handle) {...
71f0: 66 72 65 65 28 63 61 63 6b 65 79 5f 70 63 73 63  free(cackey_pcsc
7200: 5f 68 61 6e 64 6c 65 29 3b 0a 09 0a 09 09 63 61  _handle);.....ca
7210: 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65  ckey_pcsc_handle
7220: 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 0a 09 69 66   = NULL;..}...if
7230: 20 28 73 63 61 72 64 5f 72 65 6c 5f 63 6f 6e 74   (scard_rel_cont
7240: 65 78 74 5f 72 65 74 20 21 3d 20 53 43 41 52 44  ext_ret != SCARD
7250: 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09  _S_SUCCESS) {...
7260: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
7270: 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09  SC_E_GENERIC);..
7280: 7d 0a 0a 09 72 65 74 75 72 6e 28 43 41 43 4b 45  }...return(CACKE
7290: 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a  Y_PCSC_S_OK);.}.
72a0: 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a  ./*. * SYNPOSIS.
72b0: 20 2a 20 20 20 20 20 76 6f 69 64 20 63 61 63 6b   *     void cack
72c0: 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65 73  ey_mark_slot_res
72d0: 65 74 28 73 74 72 75 63 74 20 63 61 63 6b 65 79  et(struct cackey
72e0: 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 3b 0a 20 2a  _slot *slot);. *
72f0: 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a  . * ARGUMENTS. *
7300: 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 20       None. *. * 
7310: 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20  RETURN VALUE. * 
7320: 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 4e      None. *. * N
7330: 4f 54 45 53 0a 20 2a 20 20 20 20 20 54 68 69 73  OTES. *     This
7340: 20 66 75 6e 63 74 69 6f 6e 20 6d 61 72 6b 73 20   function marks 
7350: 61 20 73 6c 6f 74 20 68 61 73 20 68 61 76 69 6e  a slot has havin
7360: 67 20 62 65 65 6e 20 72 65 73 65 74 2c 20 74 6f  g been reset, to
7370: 20 6c 61 74 65 72 20 62 65 20 63 6c 65 61 6e 65   later be cleane
7380: 64 20 75 70 2e 0a 20 2a 20 20 20 20 20 43 6c 65  d up.. *     Cle
7390: 61 6e 75 70 20 6f 6e 6c 79 20 68 61 70 70 65 6e  anup only happen
73a0: 73 20 77 68 65 6e 20 61 20 50 4b 43 53 23 31 31  s when a PKCS#11
73b0: 20 63 6c 69 65 6e 74 20 63 61 6c 6c 73 20 43 5f   client calls C_
73c0: 46 69 6e 64 4f 62 6a 65 63 74 73 49 6e 69 74 2e  FindObjectsInit.
73d0: 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76  . *. */.static v
73e0: 6f 69 64 20 63 61 63 6b 65 79 5f 6d 61 72 6b 5f  oid cackey_mark_
73f0: 73 6c 6f 74 5f 72 65 73 65 74 28 73 74 72 75 63  slot_reset(struc
7400: 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73  t cackey_slot *s
7410: 6c 6f 74 29 20 7b 0a 09 69 66 20 28 73 6c 6f 74  lot) {..if (slot
7420: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65   == NULL) {...re
7430: 74 75 72 6e 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  turn;..}...CACKE
7440: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
7450: 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
7460: 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64  (slot->pcsc_card
7470: 5f 63 6f 6e 6e 65 63 74 65 64 29 20 7b 0a 09 09  _connected) {...
7480: 53 43 61 72 64 44 69 73 63 6f 6e 6e 65 63 74 28  SCardDisconnect(
7490: 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c  slot->pcsc_card,
74a0: 20 53 43 41 52 44 5f 4c 45 41 56 45 5f 43 41 52   SCARD_LEAVE_CAR
74b0: 44 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 2d 3e 73  D);..}...slot->s
74c0: 6c 6f 74 5f 72 65 73 65 74 20 3d 20 31 3b 0a 09  lot_reset = 1;..
74d0: 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 5f  slot->pcsc_card_
74e0: 63 6f 6e 6e 65 63 74 65 64 20 3d 20 30 3b 0a 09  connected = 0;..
74f0: 69 66 20 28 63 61 63 6b 65 79 5f 70 69 6e 5f 63  if (cackey_pin_c
7500: 6f 6d 6d 61 6e 64 20 3d 3d 20 4e 55 4c 4c 29 20  ommand == NULL) 
7510: 7b 0a 09 09 73 6c 6f 74 2d 3e 74 6f 6b 65 6e 5f  {...slot->token_
7520: 66 6c 61 67 73 20 3d 20 43 4b 46 5f 4c 4f 47 49  flags = CKF_LOGI
7530: 4e 5f 52 45 51 55 49 52 45 44 3b 0a 09 7d 20 65  N_REQUIRED;..} e
7540: 6c 73 65 20 7b 0a 09 09 73 6c 6f 74 2d 3e 74 6f  lse {...slot->to
7550: 6b 65 6e 5f 66 6c 61 67 73 20 3d 20 30 3b 0a 09  ken_flags = 0;..
7560: 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
7570: 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
7580: 6e 67 2e 22 29 3b 0a 0a 09 72 65 74 75 72 6e 3b  ng.");...return;
7590: 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53  .}../*. * SYNPOS
75a0: 49 53 0a 20 2a 20 20 20 20 20 4c 4f 4e 47 20 63  IS. *     LONG c
75b0: 61 63 6b 65 79 5f 72 65 63 6f 6e 6e 65 63 74 5f  ackey_reconnect_
75c0: 63 61 72 64 28 73 74 72 75 63 74 20 63 61 63 6b  card(struct cack
75d0: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 44  ey_slot *slot, D
75e0: 57 4f 52 44 20 64 65 66 61 75 6c 74 5f 70 72 6f  WORD default_pro
75f0: 74 6f 63 6f 6c 29 3b 0a 20 2a 0a 20 2a 20 41 52  tocol);. *. * AR
7600: 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 63  GUMENTS. *     c
7610: 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74  ackey_slot *slot
7620: 0a 20 2a 20 20 20 20 20 20 20 20 20 53 6c 6f 74  . *         Slot
7630: 20 74 6f 20 73 65 6e 64 20 63 6f 6d 6d 61 6e 64   to send command
7640: 73 20 74 6f 0a 20 2a 0a 20 2a 20 20 20 20 20 44  s to. *. *     D
7650: 57 4f 52 44 20 64 65 66 61 75 6c 74 5f 70 72 6f  WORD default_pro
7660: 74 6f 63 6f 6c 0a 20 2a 20 20 20 20 20 20 20 20  tocol. *        
7670: 20 50 72 6f 74 6f 63 6f 6c 20 74 6f 20 61 74 74   Protocol to att
7680: 65 6d 70 74 20 66 69 72 73 74 0a 20 2a 0a 20 2a  empt first. *. *
7690: 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a   RETURN VALUE. *
76a0: 20 20 20 20 20 54 68 65 20 72 65 74 75 72 6e 20       The return 
76b0: 76 61 6c 75 65 20 66 72 6f 6d 20 53 43 61 72 64  value from SCard
76c0: 52 65 63 6f 6e 6e 65 63 74 28 29 0a 20 2a 0a 20  Reconnect(). *. 
76d0: 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 54  * NOTES. *     T
76e0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
76f0: 61 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64  a wrapper around
7700: 20 53 43 61 72 64 52 65 63 6f 6e 6e 65 63 74 28   SCardReconnect(
7710: 29 0a 20 2a 0a 20 2a 20 20 20 20 20 54 68 65 20  ). *. *     The 
7720: 53 43 61 72 64 52 65 63 6f 6e 6e 65 63 74 28 29  SCardReconnect()
7730: 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 77   function call w
7740: 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 66 69  ill be called fi
7750: 72 73 74 20 77 69 74 68 20 74 68 65 0a 20 2a 20  rst with the. * 
7760: 20 20 20 20 64 77 50 72 65 66 65 72 72 65 64 50      dwPreferredP
7770: 72 6f 74 6f 63 6f 6c 73 20 6f 66 20 22 64 65 66  rotocols of "def
7780: 61 75 6c 74 5f 70 72 6f 74 6f 63 6f 6c 22 2e 20  ault_protocol". 
7790: 20 49 66 20 74 68 61 74 20 63 61 6c 6c 20 72 65   If that call re
77a0: 74 75 72 6e 73 0a 20 2a 20 20 20 20 20 53 43 41  turns. *     SCA
77b0: 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41  RD_E_PROTO_MISMA
77c0: 54 43 48 20 74 72 79 20 61 67 61 69 6e 20 77 69  TCH try again wi
77d0: 74 68 20 61 20 70 72 6f 74 6f 63 6f 6c 20 6f 66  th a protocol of
77e0: 20 54 3d 30 2c 20 61 6e 64 20 66 61 69 6c 69 6e   T=0, and failin
77f0: 67 0a 20 2a 20 20 20 20 20 74 68 61 74 20 54 3d  g. *     that T=
7800: 31 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63  1.. *. */.static
7810: 20 4c 4f 4e 47 20 63 61 63 6b 65 79 5f 72 65 63   LONG cackey_rec
7820: 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73 74 72 75  onnect_card(stru
7830: 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a  ct cackey_slot *
7840: 73 6c 6f 74 2c 20 44 57 4f 52 44 20 64 65 66 61  slot, DWORD defa
7850: 75 6c 74 5f 70 72 6f 74 6f 63 6f 6c 29 20 7b 0a  ult_protocol) {.
7860: 09 44 57 4f 52 44 20 73 65 6c 65 63 74 65 64 5f  .DWORD selected_
7870: 70 72 6f 74 6f 63 6f 6c 3b 0a 09 4c 4f 4e 47 20  protocol;..LONG 
7880: 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 3b 0a  scard_conn_ret;.
7890: 0a 09 73 65 6c 65 63 74 65 64 5f 70 72 6f 74 6f  ..selected_proto
78a0: 63 6f 6c 20 3d 20 30 3b 0a 0a 09 73 63 61 72 64  col = 0;...scard
78b0: 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 53 43 61 72  _conn_ret = SCar
78c0: 64 52 65 63 6f 6e 6e 65 63 74 28 73 6c 6f 74 2d  dReconnect(slot-
78d0: 3e 70 63 73 63 5f 63 61 72 64 2c 20 53 43 41 52  >pcsc_card, SCAR
78e0: 44 5f 53 48 41 52 45 5f 53 48 41 52 45 44 2c 20  D_SHARE_SHARED, 
78f0: 64 65 66 61 75 6c 74 5f 70 72 6f 74 6f 63 6f 6c  default_protocol
7900: 2c 20 53 43 41 52 44 5f 52 45 53 45 54 5f 43 41  , SCARD_RESET_CA
7910: 52 44 2c 20 26 73 65 6c 65 63 74 65 64 5f 70 72  RD, &selected_pr
7920: 6f 74 6f 63 6f 6c 29 3b 0a 0a 09 69 66 20 28 73  otocol);...if (s
7930: 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 3d  card_conn_ret ==
7940: 20 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d   SCARD_E_PROTO_M
7950: 49 53 4d 41 54 43 48 29 20 7b 0a 09 09 43 41 43  ISMATCH) {...CAC
7960: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
7970: 28 22 53 43 61 72 64 52 65 63 6f 6e 6e 65 63 74  ("SCardReconnect
7980: 28 29 20 72 65 74 75 72 6e 65 64 20 53 43 41 52  () returned SCAR
7990: 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54  D_E_PROTO_MISMAT
79a0: 43 48 2c 20 74 72 79 69 6e 67 20 77 69 74 68 20  CH, trying with 
79b0: 6a 75 73 74 20 54 3d 30 22 29 0a 09 09 73 63 61  just T=0")...sca
79c0: 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 53 43  rd_conn_ret = SC
79d0: 61 72 64 52 65 63 6f 6e 6e 65 63 74 28 73 6c 6f  ardReconnect(slo
79e0: 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 53 43  t->pcsc_card, SC
79f0: 41 52 44 5f 53 48 41 52 45 5f 53 48 41 52 45 44  ARD_SHARE_SHARED
7a00: 2c 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c  , SCARD_PROTOCOL
7a10: 5f 54 30 2c 20 53 43 41 52 44 5f 52 45 53 45 54  _T0, SCARD_RESET
7a20: 5f 43 41 52 44 2c 20 26 73 65 6c 65 63 74 65 64  _CARD, &selected
7a30: 5f 70 72 6f 74 6f 63 6f 6c 29 3b 0a 0a 09 09 69  _protocol);....i
7a40: 66 20 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65  f (scard_conn_re
7a50: 74 20 3d 3d 20 53 43 41 52 44 5f 45 5f 50 52 4f  t == SCARD_E_PRO
7a60: 54 4f 5f 4d 49 53 4d 41 54 43 48 29 20 7b 0a 09  TO_MISMATCH) {..
7a70: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
7a80: 52 49 4e 54 46 28 22 53 43 61 72 64 52 65 63 6f  RINTF("SCardReco
7a90: 6e 6e 65 63 74 28 29 20 72 65 74 75 72 6e 65 64  nnect() returned
7aa0: 20 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d   SCARD_E_PROTO_M
7ab0: 49 53 4d 41 54 43 48 2c 20 74 72 79 69 6e 67 20  ISMATCH, trying 
7ac0: 77 69 74 68 20 6a 75 73 74 20 54 3d 31 22 29 0a  with just T=1").
7ad0: 09 09 09 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65  ...scard_conn_re
7ae0: 74 20 3d 20 53 43 61 72 64 52 65 63 6f 6e 6e 65  t = SCardReconne
7af0: 63 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61  ct(slot->pcsc_ca
7b00: 72 64 2c 20 53 43 41 52 44 5f 53 48 41 52 45 5f  rd, SCARD_SHARE_
7b10: 53 48 41 52 45 44 2c 20 53 43 41 52 44 5f 50 52  SHARED, SCARD_PR
7b20: 4f 54 4f 43 4f 4c 5f 54 31 2c 20 53 43 41 52 44  OTOCOL_T1, SCARD
7b30: 5f 52 45 53 45 54 5f 43 41 52 44 2c 20 26 73 65  _RESET_CARD, &se
7b40: 6c 65 63 74 65 64 5f 70 72 6f 74 6f 63 6f 6c 29  lected_protocol)
7b50: 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28 73  ;...}..}...if (s
7b60: 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 3d  card_conn_ret ==
7b70: 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53   SCARD_S_SUCCESS
7b80: 29 20 7b 0a 09 09 73 6c 6f 74 2d 3e 70 72 6f 74  ) {...slot->prot
7b90: 6f 63 6f 6c 20 3d 20 73 65 6c 65 63 74 65 64 5f  ocol = selected_
7ba0: 70 72 6f 74 6f 63 6f 6c 3b 0a 09 7d 0a 0a 09 72  protocol;..}...r
7bb0: 65 74 75 72 6e 28 73 63 61 72 64 5f 63 6f 6e 6e  eturn(scard_conn
7bc0: 5f 72 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20  _ret);.}../*. * 
7bd0: 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20  SYNPOSIS. *     
7be0: 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65  cackey_ret cacke
7bf0: 79 5f 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73  y_connect_card(s
7c00: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f  truct cackey_slo
7c10: 74 20 2a 73 6c 6f 74 29 3b 0a 20 2a 0a 20 2a 20  t *slot);. *. * 
7c20: 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20  ARGUMENTS. *    
7c30: 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c   cackey_slot *sl
7c40: 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20 53 6c  ot. *         Sl
7c50: 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d 6d 61  ot to send comma
7c60: 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 52 45 54  nds to. *. * RET
7c70: 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20  URN VALUE. *    
7c80: 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f   CACKEY_PCSC_S_O
7c90: 4b 20 20 20 20 20 20 20 20 20 4f 6e 20 73 75 63  K         On suc
7ca0: 63 65 73 73 0a 20 2a 20 20 20 20 20 43 41 43 4b  cess. *     CACK
7cb0: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49  EY_PCSC_E_GENERI
7cc0: 43 20 20 20 20 4f 6e 20 65 72 72 6f 72 0a 20 2a  C    On error. *
7cd0: 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20  . * NOTES. *    
7ce0: 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 2f 0a 73 74 61   None. *. */.sta
7cf0: 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74 20 63  tic cackey_ret c
7d00: 61 63 6b 65 79 5f 63 6f 6e 6e 65 63 74 5f 63 61  ackey_connect_ca
7d10: 72 64 28 73 74 72 75 63 74 20 63 61 63 6b 65 79  rd(struct cackey
7d20: 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 20 7b 0a 09  _slot *slot) {..
7d30: 63 61 63 6b 65 79 5f 72 65 74 20 70 63 73 63 5f  cackey_ret pcsc_
7d40: 63 6f 6e 6e 65 63 74 5f 72 65 74 3b 0a 09 44 57  connect_ret;..DW
7d50: 4f 52 44 20 70 72 6f 74 6f 63 6f 6c 3b 0a 09 4c  ORD protocol;..L
7d60: 4f 4e 47 20 73 63 61 72 64 5f 63 6f 6e 6e 5f 72  ONG scard_conn_r
7d70: 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  et;...CACKEY_DEB
7d80: 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
7d90: 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 73 6c 6f  d.");...if (!slo
7da0: 74 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  t) {...CACKEY_DE
7db0: 42 55 47 5f 50 52 49 4e 54 46 28 22 49 6e 76 61  BUG_PRINTF("Inva
7dc0: 6c 69 64 20 73 6c 6f 74 20 73 70 65 63 69 66 69  lid slot specifi
7dd0: 65 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e  ed, returning in
7de0: 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72   failure");....r
7df0: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
7e00: 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d  C_E_GENERIC);..}
7e10: 0a 0a 09 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f  ...pcsc_connect_
7e20: 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 70 63 73  ret = cackey_pcs
7e30: 63 5f 63 6f 6e 6e 65 63 74 28 29 3b 0a 09 69 66  c_connect();..if
7e40: 20 28 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72   (pcsc_connect_r
7e50: 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53  et != CACKEY_PCS
7e60: 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b  C_S_OK) {...CACK
7e70: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
7e80: 22 43 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 50  "Connection to P
7e90: 43 2f 53 43 20 66 61 69 6c 65 64 2c 20 72 65 74  C/SC failed, ret
7ea0: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
7eb0: 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  e");....return(C
7ec0: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e  ACKEY_PCSC_E_GEN
7ed0: 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 43  ERIC);..}.../* C
7ee0: 6f 6e 6e 65 63 74 20 74 6f 20 72 65 61 64 65 72  onnect to reader
7ef0: 2c 20 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a 09  , if needed */..
7f00: 69 66 20 28 21 73 6c 6f 74 2d 3e 70 63 73 63 5f  if (!slot->pcsc_
7f10: 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 29 20  card_connected) 
7f20: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
7f30: 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64 43 6f  _PRINTF("SCardCo
7f40: 6e 6e 65 63 74 28 25 73 29 20 63 61 6c 6c 65 64  nnect(%s) called
7f50: 20 66 6f 72 20 73 6c 6f 74 20 25 70 22 2c 20 73   for slot %p", s
7f60: 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64 65 72  lot->pcsc_reader
7f70: 2c 20 73 6c 6f 74 29 3b 0a 09 09 73 63 61 72 64  , slot);...scard
7f80: 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 53 43 61 72  _conn_ret = SCar
7f90: 64 43 6f 6e 6e 65 63 74 28 2a 63 61 63 6b 65 79  dConnect(*cackey
7fa0: 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20 73 6c  _pcsc_handle, sl
7fb0: 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64 65 72 2c  ot->pcsc_reader,
7fc0: 20 53 43 41 52 44 5f 53 48 41 52 45 5f 53 48 41   SCARD_SHARE_SHA
7fd0: 52 45 44 2c 20 53 43 41 52 44 5f 50 52 4f 54 4f  RED, SCARD_PROTO
7fe0: 43 4f 4c 5f 54 30 20 7c 20 53 43 41 52 44 5f 50  COL_T0 | SCARD_P
7ff0: 52 4f 54 4f 43 4f 4c 5f 54 31 2c 20 26 73 6c 6f  ROTOCOL_T1, &slo
8000: 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 26 70  t->pcsc_card, &p
8010: 72 6f 74 6f 63 6f 6c 29 3b 0a 0a 09 09 69 66 20  rotocol);....if 
8020: 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20  (scard_conn_ret 
8030: 3d 3d 20 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f  == SCARD_E_PROTO
8040: 5f 4d 49 53 4d 41 54 43 48 29 20 7b 0a 09 09 09  _MISMATCH) {....
8050: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
8060: 4e 54 46 28 22 53 43 61 72 64 43 6f 6e 6e 65 63  NTF("SCardConnec
8070: 74 28 29 20 72 65 74 75 72 6e 65 64 20 53 43 41  t() returned SCA
8080: 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41  RD_E_PROTO_MISMA
8090: 54 43 48 2c 20 74 72 79 69 6e 67 20 77 69 74 68  TCH, trying with
80a0: 20 6a 75 73 74 20 54 3d 30 22 29 0a 09 09 09 73   just T=0")....s
80b0: 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20  card_conn_ret = 
80c0: 53 43 61 72 64 43 6f 6e 6e 65 63 74 28 2a 63 61  SCardConnect(*ca
80d0: 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65  ckey_pcsc_handle
80e0: 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61  , slot->pcsc_rea
80f0: 64 65 72 2c 20 53 43 41 52 44 5f 53 48 41 52 45  der, SCARD_SHARE
8100: 5f 53 48 41 52 45 44 2c 20 53 43 41 52 44 5f 50  _SHARED, SCARD_P
8110: 52 4f 54 4f 43 4f 4c 5f 54 30 2c 20 26 73 6c 6f  ROTOCOL_T0, &slo
8120: 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 26 70  t->pcsc_card, &p
8130: 72 6f 74 6f 63 6f 6c 29 3b 0a 0a 09 09 09 69 66  rotocol);.....if
8140: 20 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74   (scard_conn_ret
8150: 20 3d 3d 20 53 43 41 52 44 5f 45 5f 50 52 4f 54   == SCARD_E_PROT
8160: 4f 5f 4d 49 53 4d 41 54 43 48 29 20 7b 0a 09 09  O_MISMATCH) {...
8170: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
8180: 52 49 4e 54 46 28 22 53 43 61 72 64 43 6f 6e 6e  RINTF("SCardConn
8190: 65 63 74 28 29 20 72 65 74 75 72 6e 65 64 20 53  ect() returned S
81a0: 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53  CARD_E_PROTO_MIS
81b0: 4d 41 54 43 48 2c 20 74 72 79 69 6e 67 20 77 69  MATCH, trying wi
81c0: 74 68 20 6a 75 73 74 20 54 3d 31 22 29 0a 09 09  th just T=1")...
81d0: 09 09 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74  ..scard_conn_ret
81e0: 20 3d 20 53 43 61 72 64 43 6f 6e 6e 65 63 74 28   = SCardConnect(
81f0: 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e  *cackey_pcsc_han
8200: 64 6c 65 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 5f  dle, slot->pcsc_
8210: 72 65 61 64 65 72 2c 20 53 43 41 52 44 5f 53 48  reader, SCARD_SH
8220: 41 52 45 5f 53 48 41 52 45 44 2c 20 53 43 41 52  ARE_SHARED, SCAR
8230: 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31 2c 20 26  D_PROTOCOL_T1, &
8240: 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c  slot->pcsc_card,
8250: 20 26 70 72 6f 74 6f 63 6f 6c 29 3b 0a 09 09 09   &protocol);....
8260: 7d 0a 09 09 7d 0a 0a 09 09 69 66 20 28 73 63 61  }...}....if (sca
8270: 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53  rd_conn_ret == S
8280: 43 41 52 44 5f 57 5f 55 4e 50 4f 57 45 52 45 44  CARD_W_UNPOWERED
8290: 5f 43 41 52 44 29 20 7b 0a 09 09 09 43 41 43 4b  _CARD) {....CACK
82a0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
82b0: 22 53 43 61 72 64 43 6f 6e 6e 65 63 74 28 29 20  "SCardConnect() 
82c0: 72 65 74 75 72 6e 65 64 20 53 43 41 52 44 5f 57  returned SCARD_W
82d0: 5f 55 4e 50 4f 57 45 52 45 44 5f 43 41 52 44 2c  _UNPOWERED_CARD,
82e0: 20 74 72 79 69 6e 67 20 74 6f 20 72 65 2d 63 6f   trying to re-co
82f0: 6e 6e 65 63 74 2e 2e 2e 22 29 3b 0a 0a 09 09 09  nnect...");.....
8300: 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d  scard_conn_ret =
8310: 20 53 43 61 72 64 43 6f 6e 6e 65 63 74 28 2a 63   SCardConnect(*c
8320: 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c  ackey_pcsc_handl
8330: 65 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 65  e, slot->pcsc_re
8340: 61 64 65 72 2c 20 53 43 41 52 44 5f 53 48 41 52  ader, SCARD_SHAR
8350: 45 5f 44 49 52 45 43 54 2c 20 53 43 41 52 44 5f  E_DIRECT, SCARD_
8360: 50 52 4f 54 4f 43 4f 4c 5f 54 30 20 7c 20 53 43  PROTOCOL_T0 | SC
8370: 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31 2c  ARD_PROTOCOL_T1,
8380: 20 26 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72   &slot->pcsc_car
8390: 64 2c 20 26 70 72 6f 74 6f 63 6f 6c 29 3b 0a 0a  d, &protocol);..
83a0: 09 09 09 69 66 20 28 73 63 61 72 64 5f 63 6f 6e  ...if (scard_con
83b0: 6e 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 45  n_ret == SCARD_E
83c0: 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 29  _PROTO_MISMATCH)
83d0: 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45   {.....CACKEY_DE
83e0: 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43 61 72  BUG_PRINTF("SCar
83f0: 64 43 6f 6e 6e 65 63 74 28 29 20 72 65 74 75 72  dConnect() retur
8400: 6e 65 64 20 53 43 41 52 44 5f 45 5f 50 52 4f 54  ned SCARD_E_PROT
8410: 4f 5f 4d 49 53 4d 41 54 43 48 2c 20 74 72 79 69  O_MISMATCH, tryi
8420: 6e 67 20 77 69 74 68 20 6a 75 73 74 20 54 3d 30  ng with just T=0
8430: 22 29 0a 09 09 09 09 73 63 61 72 64 5f 63 6f 6e  ").....scard_con
8440: 6e 5f 72 65 74 20 3d 20 53 43 61 72 64 43 6f 6e  n_ret = SCardCon
8450: 6e 65 63 74 28 2a 63 61 63 6b 65 79 5f 70 63 73  nect(*cackey_pcs
8460: 63 5f 68 61 6e 64 6c 65 2c 20 73 6c 6f 74 2d 3e  c_handle, slot->
8470: 70 63 73 63 5f 72 65 61 64 65 72 2c 20 53 43 41  pcsc_reader, SCA
8480: 52 44 5f 53 48 41 52 45 5f 53 48 41 52 45 44 2c  RD_SHARE_SHARED,
8490: 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f   SCARD_PROTOCOL_
84a0: 54 30 2c 20 26 73 6c 6f 74 2d 3e 70 63 73 63 5f  T0, &slot->pcsc_
84b0: 63 61 72 64 2c 20 26 70 72 6f 74 6f 63 6f 6c 29  card, &protocol)
84c0: 3b 0a 0a 09 09 09 09 69 66 20 28 73 63 61 72 64  ;......if (scard
84d0: 5f 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53 43 41  _conn_ret == SCA
84e0: 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41  RD_E_PROTO_MISMA
84f0: 54 43 48 29 20 7b 0a 09 09 09 09 09 43 41 43 4b  TCH) {......CACK
8500: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
8510: 22 53 43 61 72 64 43 6f 6e 6e 65 63 74 28 29 20  "SCardConnect() 
8520: 72 65 74 75 72 6e 65 64 20 53 43 41 52 44 5f 45  returned SCARD_E
8530: 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 2c  _PROTO_MISMATCH,
8540: 20 74 72 79 69 6e 67 20 77 69 74 68 20 6a 75 73   trying with jus
8550: 74 20 54 3d 31 22 29 0a 09 09 09 09 09 73 63 61  t T=1")......sca
8560: 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 53 43  rd_conn_ret = SC
8570: 61 72 64 43 6f 6e 6e 65 63 74 28 2a 63 61 63 6b  ardConnect(*cack
8580: 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20  ey_pcsc_handle, 
8590: 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64 65  slot->pcsc_reade
85a0: 72 2c 20 53 43 41 52 44 5f 53 48 41 52 45 5f 53  r, SCARD_SHARE_S
85b0: 48 41 52 45 44 2c 20 53 43 41 52 44 5f 50 52 4f  HARED, SCARD_PRO
85c0: 54 4f 43 4f 4c 5f 54 31 2c 20 26 73 6c 6f 74 2d  TOCOL_T1, &slot-
85d0: 3e 70 63 73 63 5f 63 61 72 64 2c 20 26 70 72 6f  >pcsc_card, &pro
85e0: 74 6f 63 6f 6c 29 3b 0a 09 09 09 09 7d 0a 09 09  tocol);.....}...
85f0: 09 7d 0a 0a 09 09 09 73 63 61 72 64 5f 63 6f 6e  .}.....scard_con
8600: 6e 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 72  n_ret = cackey_r
8610: 65 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73 6c  econnect_card(sl
8620: 6f 74 2c 20 70 72 6f 74 6f 63 6f 6c 29 3b 0a 09  ot, protocol);..
8630: 09 7d 0a 0a 09 09 69 66 20 28 73 63 61 72 64 5f  .}....if (scard_
8640: 63 6f 6e 6e 5f 72 65 74 20 21 3d 20 53 43 41 52  conn_ret != SCAR
8650: 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09  D_S_SUCCESS) {..
8660: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
8670: 52 49 4e 54 46 28 22 43 6f 6e 6e 65 63 74 69 6f  RINTF("Connectio
8680: 6e 20 74 6f 20 63 61 72 64 20 66 61 69 6c 65 64  n to card failed
8690: 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66  , returning in f
86a0: 61 69 6c 75 72 65 20 28 53 43 61 72 64 43 6f 6e  ailure (SCardCon
86b0: 6e 65 63 74 28 29 20 3d 20 25 73 2f 25 6c 69 29  nect() = %s/%li)
86c0: 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ", CACKEY_DEBUG_
86d0: 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f  FUNC_SCARDERR_TO
86e0: 5f 53 54 52 28 73 63 61 72 64 5f 63 6f 6e 6e 5f  _STR(scard_conn_
86f0: 72 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61  ret), (long) sca
8700: 72 64 5f 63 6f 6e 6e 5f 72 65 74 29 3b 0a 0a 09  rd_conn_ret);...
8710: 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
8720: 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b  PCSC_E_GENERIC);
8730: 0a 09 09 7d 0a 0a 09 09 73 6c 6f 74 2d 3e 70 63  ...}....slot->pc
8740: 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65  sc_card_connecte
8750: 64 20 3d 20 31 3b 0a 09 09 73 6c 6f 74 2d 3e 74  d = 1;...slot->t
8760: 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68  ransaction_depth
8770: 20 3d 20 30 3b 0a 09 09 73 6c 6f 74 2d 3e 74 72   = 0;...slot->tr
8780: 61 6e 73 61 63 74 69 6f 6e 5f 6e 65 65 64 5f 68  ansaction_need_h
8790: 77 5f 6c 6f 63 6b 20 3d 20 30 3b 0a 09 09 73 6c  w_lock = 0;...sl
87a0: 6f 74 2d 3e 70 72 6f 74 6f 63 6f 6c 20 3d 20 70  ot->protocol = p
87b0: 72 6f 74 6f 63 6f 6c 3b 0a 09 7d 0a 0a 09 43 41  rotocol;..}...CA
87c0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
87d0: 46 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e 20  F("Returning in 
87e0: 73 75 63 63 65 73 73 22 29 3b 0a 0a 09 72 65 74  success");...ret
87f0: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
8800: 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20  S_OK);.}../*. * 
8810: 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20  SYNPOSIS. *     
8820: 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65  cackey_ret cacke
8830: 79 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74  y_begin_transact
8840: 69 6f 6e 28 73 74 72 75 63 74 20 63 61 63 6b 65  ion(struct cacke
8850: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 3b 0a 20  y_slot *slot);. 
8860: 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20  *. * ARGUMENTS. 
8870: 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 73 6c 6f  *     cackey_slo
8880: 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20  t *slot. *      
8890: 20 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20     Slot to send 
88a0: 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20  commands to. *. 
88b0: 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20  * RETURN VALUE. 
88c0: 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53  *     CACKEY_PCS
88d0: 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 20 4f  C_S_OK         O
88e0: 6e 20 73 75 63 63 65 73 73 0a 20 2a 20 20 20 20  n success. *    
88f0: 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47   CACKEY_PCSC_E_G
8900: 45 4e 45 52 49 43 20 20 20 20 4f 6e 20 65 72 72  ENERIC    On err
8910: 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20  or. *. * NOTES. 
8920: 2a 20 20 20 20 20 54 68 65 20 74 72 61 6e 73 61  *     The transa
8930: 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20  ction should be 
8940: 74 65 72 6d 69 6e 61 74 65 64 20 75 73 69 6e 67  terminated using
8950: 20 22 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61   "cackey_end_tra
8960: 6e 73 61 63 74 69 6f 6e 22 0a 20 2a 0a 20 2a 2f  nsaction". *. */
8970: 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f 72  .static cackey_r
8980: 65 74 20 63 61 63 6b 65 79 5f 62 65 67 69 6e 5f  et cackey_begin_
8990: 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 74 72 75  transaction(stru
89a0: 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a  ct cackey_slot *
89b0: 73 6c 6f 74 29 20 7b 0a 09 63 61 63 6b 65 79 5f  slot) {..cackey_
89c0: 72 65 74 20 63 61 63 6b 65 79 5f 63 6f 6e 6e 5f  ret cackey_conn_
89d0: 72 65 74 3b 0a 09 4c 4f 4e 47 20 73 63 61 72 64  ret;..LONG scard
89e0: 5f 74 72 61 6e 73 5f 72 65 74 3b 0a 0a 09 43 41  _trans_ret;...CA
89f0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
8a00: 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
8a10: 63 61 63 6b 65 79 5f 63 6f 6e 6e 5f 72 65 74 20  cackey_conn_ret 
8a20: 3d 20 63 61 63 6b 65 79 5f 63 6f 6e 6e 65 63 74  = cackey_connect
8a30: 5f 63 61 72 64 28 73 6c 6f 74 29 3b 0a 09 69 66  _card(slot);..if
8a40: 20 28 63 61 63 6b 65 79 5f 63 6f 6e 6e 5f 72 65   (cackey_conn_re
8a50: 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43  t != CACKEY_PCSC
8a60: 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45  _S_OK) {...CACKE
8a70: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
8a80: 55 6e 61 62 6c 65 20 74 6f 20 63 6f 6e 6e 65 63  Unable to connec
8a90: 74 20 74 6f 20 63 61 72 64 2c 20 72 65 74 75 72  t to card, retur
8aa0: 6e 69 6e 67 20 69 6e 20 65 72 72 6f 72 22 29 3b  ning in error");
8ab0: 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ....return(CACKE
8ac0: 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43  Y_PCSC_E_GENERIC
8ad0: 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 2d 3e 74 72  );..}...slot->tr
8ae0: 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 2b  ansaction_depth+
8af0: 2b 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 2d 3e 74  +;...if (slot->t
8b00: 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68  ransaction_depth
8b10: 20 3e 20 31 20 26 26 20 21 73 6c 6f 74 2d 3e 74   > 1 && !slot->t
8b20: 72 61 6e 73 61 63 74 69 6f 6e 5f 6e 65 65 64 5f  ransaction_need_
8b30: 68 77 5f 6c 6f 63 6b 29 20 7b 0a 09 09 43 41 43  hw_lock) {...CAC
8b40: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
8b50: 28 22 41 6c 72 65 61 64 79 20 69 6e 20 61 20 74  ("Already in a t
8b60: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 70 65 72 66  ransaction, perf
8b70: 6f 72 6d 69 6e 67 20 6e 6f 20 61 63 74 69 6f 6e  orming no action
8b80: 20 28 6e 65 77 20 64 65 70 74 68 20 3d 20 25 69   (new depth = %i
8b90: 29 22 2c 20 73 6c 6f 74 2d 3e 74 72 61 6e 73 61  )", slot->transa
8ba0: 63 74 69 6f 6e 5f 64 65 70 74 68 29 3b 0a 0a 09  ction_depth);...
8bb0: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
8bc0: 43 53 43 5f 53 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09  CSC_S_OK);..}...
8bd0: 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f  slot->transactio
8be0: 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b 20 3d  n_need_hw_lock =
8bf0: 20 30 3b 0a 0a 09 73 63 61 72 64 5f 74 72 61 6e   0;...scard_tran
8c00: 73 5f 72 65 74 20 3d 20 53 43 61 72 64 42 65 67  s_ret = SCardBeg
8c10: 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c  inTransaction(sl
8c20: 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 29 3b 0a  ot->pcsc_card);.
8c30: 09 69 66 20 28 73 63 61 72 64 5f 74 72 61 6e 73  .if (scard_trans
8c40: 5f 72 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f  _ret != SCARD_S_
8c50: 53 55 43 43 45 53 53 29 20 7b 0a 09 09 43 41 43  SUCCESS) {...CAC
8c60: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
8c70: 28 22 55 6e 61 62 6c 65 20 74 6f 20 62 65 67 69  ("Unable to begi
8c80: 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 72  n transaction, r
8c90: 65 74 75 72 6e 69 6e 67 20 69 6e 20 65 72 72 6f  eturning in erro
8ca0: 72 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  r");....return(C
8cb0: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e  ACKEY_PCSC_E_GEN
8cc0: 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  ERIC);..}...CACK
8cd0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
8ce0: 22 53 75 63 65 73 73 66 75 6c 6c 79 20 62 65 67  "Sucessfully beg
8cf0: 61 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  an transaction o
8d00: 6e 20 73 6c 6f 74 20 28 25 73 29 22 2c 20 73 6c  n slot (%s)", sl
8d10: 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64 65 72 29  ot->pcsc_reader)
8d20: 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ;...return(CACKE
8d30: 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a  Y_PCSC_S_OK);.}.
8d40: 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a  ./*. * SYNPOSIS.
8d50: 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 72 65   *     cackey_re
8d60: 74 20 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61  t cackey_end_tra
8d70: 6e 73 61 63 74 69 6f 6e 28 73 74 72 75 63 74 20  nsaction(struct 
8d80: 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f  cackey_slot *slo
8d90: 74 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45  t);. *. * ARGUME
8da0: 4e 54 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65  NTS. *     cacke
8db0: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20  y_slot *slot. * 
8dc0: 20 20 20 20 20 20 20 20 53 6c 6f 74 20 74 6f 20          Slot to 
8dd0: 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f  send commands to
8de0: 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41  . *. * RETURN VA
8df0: 4c 55 45 0a 20 2a 20 20 20 20 20 43 41 43 4b 45  LUE. *     CACKE
8e00: 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20 20 20  Y_PCSC_S_OK     
8e10: 20 20 20 20 4f 6e 20 73 75 63 63 65 73 73 0a 20      On success. 
8e20: 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53  *     CACKEY_PCS
8e30: 43 5f 45 5f 47 45 4e 45 52 49 43 20 20 20 20 4f  C_E_GENERIC    O
8e40: 6e 20 65 72 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f  n error. *. * NO
8e50: 54 45 53 0a 20 2a 20 20 20 20 20 54 68 69 73 20  TES. *     This 
8e60: 66 75 6e 63 74 69 6f 6e 20 72 65 71 75 69 72 65  function require
8e70: 73 20 22 63 61 63 6b 65 79 5f 62 65 67 69 6e 5f  s "cackey_begin_
8e80: 74 72 61 6e 73 61 63 74 69 6f 6e 22 20 74 6f 20  transaction" to 
8e90: 62 65 20 63 61 6c 6c 65 64 20 66 69 72 73 74 0a  be called first.
8ea0: 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 61   *. */.static ca
8eb0: 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f  ckey_ret cackey_
8ec0: 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
8ed0: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c  struct cackey_sl
8ee0: 6f 74 20 2a 73 6c 6f 74 29 20 7b 0a 09 4c 4f 4e  ot *slot) {..LON
8ef0: 47 20 73 63 61 72 64 5f 74 72 61 6e 73 5f 72 65  G scard_trans_re
8f00: 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  t;...CACKEY_DEBU
8f10: 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
8f20: 2e 22 29 3b 0a 0a 09 69 66 20 28 21 73 6c 6f 74  .");...if (!slot
8f30: 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e  ->pcsc_card_conn
8f40: 65 63 74 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  ected) {...CACKE
8f50: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
8f60: 43 61 72 64 20 69 73 20 6e 6f 74 20 63 6f 6e 6e  Card is not conn
8f70: 65 63 74 65 64 2c 20 75 6e 61 62 6c 65 20 74 6f  ected, unable to
8f80: 20 65 6e 64 20 74 72 61 6e 73 61 63 74 69 6f 6e   end transaction
8f90: 20 6f 6e 20 63 61 72 64 22 29 3b 0a 0a 09 09 69   on card");....i
8fa0: 66 20 28 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63  f (slot->transac
8fb0: 74 69 6f 6e 5f 64 65 70 74 68 20 3e 20 30 29 20  tion_depth > 0) 
8fc0: 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
8fd0: 47 5f 50 52 49 4e 54 46 28 22 44 65 63 72 65 61  G_PRINTF("Decrea
8fe0: 73 69 6e 67 20 74 72 61 6e 73 61 63 74 69 6f 6e  sing transaction
8ff0: 20 64 65 70 74 68 20 61 6e 64 20 61 73 6b 69 6e   depth and askin
9000: 67 20 66 6f 72 20 61 20 68 61 72 64 77 61 72 65  g for a hardware
9010: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6e 65 78   lock on the nex
9020: 74 20 62 65 67 69 6e 20 74 72 61 6e 73 61 63 74  t begin transact
9030: 69 6f 6e 20 28 63 75 72 72 65 6e 74 20 64 65 70  ion (current dep
9040: 74 68 20 3d 20 25 69 29 22 2c 20 73 6c 6f 74 2d  th = %i)", slot-
9050: 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70  >transaction_dep
9060: 74 68 29 3b 0a 0a 09 09 09 73 6c 6f 74 2d 3e 74  th);.....slot->t
9070: 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68  ransaction_depth
9080: 2d 2d 3b 0a 0a 09 09 09 69 66 20 28 73 6c 6f 74  --;.....if (slot
9090: 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65  ->transaction_de
90a0: 70 74 68 20 3e 20 30 29 20 7b 0a 09 09 09 09 73  pth > 0) {.....s
90b0: 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e  lot->transaction
90c0: 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b 20 3d 20  _need_hw_lock = 
90d0: 31 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 72  1;....}...}....r
90e0: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
90f0: 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d  C_E_GENERIC);..}
9100: 0a 0a 09 69 66 20 28 73 6c 6f 74 2d 3e 74 72 61  ...if (slot->tra
9110: 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d  nsaction_depth =
9120: 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
9130: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54 65  DEBUG_PRINTF("Te
9140: 72 6d 69 6e 61 74 69 6e 67 20 61 20 74 72 61 6e  rminating a tran
9150: 73 61 63 74 69 6f 6e 20 74 68 61 74 20 68 61 73  saction that has
9160: 20 6e 6f 74 20 62 65 67 75 6e 21 22 29 3b 0a 0a   not begun!");..
9170: 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
9180: 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b  PCSC_E_GENERIC);
9190: 0a 09 7d 0a 0a 09 73 6c 6f 74 2d 3e 74 72 61 6e  ..}...slot->tran
91a0: 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 2d 2d 3b  saction_depth--;
91b0: 0a 0a 09 69 66 20 28 73 6c 6f 74 2d 3e 74 72 61  ...if (slot->tra
91c0: 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3e  nsaction_depth >
91d0: 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
91e0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54 72 61  EBUG_PRINTF("Tra
91f0: 6e 73 61 63 74 69 6f 6e 73 20 73 74 69 6c 6c 20  nsactions still 
9200: 69 6e 20 70 72 6f 67 72 65 73 73 2c 20 6e 6f 74  in progress, not
9210: 20 74 65 72 6d 69 6e 61 74 69 6e 67 20 6f 6e 2d   terminating on-
9220: 63 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e  card Transaction
9230: 20 28 63 75 72 72 65 6e 74 20 64 65 70 74 68 20   (current depth 
9240: 3d 20 25 69 29 22 2c 20 73 6c 6f 74 2d 3e 74 72  = %i)", slot->tr
9250: 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 29  ansaction_depth)
9260: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b  ;....return(CACK
9270: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 09  EY_PCSC_S_OK);..
9280: 7d 0a 0a 09 73 63 61 72 64 5f 74 72 61 6e 73 5f  }...scard_trans_
9290: 72 65 74 20 3d 20 53 43 61 72 64 45 6e 64 54 72  ret = SCardEndTr
92a0: 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 2d 3e  ansaction(slot->
92b0: 70 63 73 63 5f 63 61 72 64 2c 20 53 43 41 52 44  pcsc_card, SCARD
92c0: 5f 4c 45 41 56 45 5f 43 41 52 44 29 3b 0a 09 69  _LEAVE_CARD);..i
92d0: 66 20 28 73 63 61 72 64 5f 74 72 61 6e 73 5f 72  f (scard_trans_r
92e0: 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f 53 55  et != SCARD_S_SU
92f0: 43 43 45 53 53 29 20 7b 0a 09 09 43 41 43 4b 45  CCESS) {...CACKE
9300: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
9310: 55 6e 61 62 6c 65 20 74 6f 20 65 6e 64 20 74 72  Unable to end tr
9320: 61 6e 73 61 63 74 69 6f 6e 2c 20 72 65 74 75 72  ansaction, retur
9330: 6e 69 6e 67 20 69 6e 20 65 72 72 6f 72 22 29 3b  ning in error");
9340: 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ....return(CACKE
9350: 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43  Y_PCSC_E_GENERIC
9360: 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
9370: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 75 63  EBUG_PRINTF("Suc
9380: 65 73 73 66 75 6c 6c 79 20 74 65 72 6d 69 6e 61  essfully termina
9390: 74 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ted transaction 
93a0: 6f 6e 20 73 6c 6f 74 20 28 25 73 29 22 2c 20 73  on slot (%s)", s
93b0: 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64 65 72  lot->pcsc_reader
93c0: 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41 43 4b  );...return(CACK
93d0: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d  EY_PCSC_S_OK);.}
93e0: 0a 0a 2f 2a 20 41 50 44 55 20 52 65 6c 61 74 65  ../* APDU Relate
93f0: 64 20 46 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 2f  d Functions */./
9400: 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a  *. * SYNPOSIS. *
9410: 20 20 20 20 20 63 61 63 6b 65 79 5f 72 65 74 20       cackey_ret 
9420: 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75  cackey_send_apdu
9430: 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73  (struct cackey_s
9440: 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67  lot *slot, unsig
9450: 6e 65 64 20 63 68 61 72 20 63 6c 61 73 73 2c 20  ned char class, 
9460: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 69 6e  unsigned char in
9470: 73 74 72 75 63 74 69 6f 6e 2c 20 75 6e 73 69 67  struction, unsig
9480: 6e 65 64 20 63 68 61 72 20 70 31 2c 20 75 6e 73  ned char p1, uns
9490: 69 67 6e 65 64 20 63 68 61 72 20 70 32 2c 20 75  igned char p2, u
94a0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6c 63 2c  nsigned char lc,
94b0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
94c0: 64 61 74 61 2c 20 75 6e 73 69 67 6e 65 64 20 63  data, unsigned c
94d0: 68 61 72 20 6c 65 2c 20 75 69 6e 74 31 36 5f 74  har le, uint16_t
94e0: 20 2a 72 65 73 70 63 6f 64 65 2c 20 75 6e 73 69   *respcode, unsi
94f0: 67 6e 65 64 20 63 68 61 72 20 2a 72 65 73 70 64  gned char *respd
9500: 61 74 61 2c 20 73 69 7a 65 5f 74 20 2a 72 65 73  ata, size_t *res
9510: 70 64 61 74 61 5f 6c 65 6e 29 3b 0a 20 2a 0a 20  pdata_len);. *. 
9520: 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20  * ARGUMENTS. *  
9530: 20 20 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a     cackey_slot *
9540: 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20  slot. *         
9550: 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d  Slot to send com
9560: 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 20  mands to. *. *  
9570: 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
9580: 20 63 6c 61 73 73 0a 20 2a 20 20 20 20 20 20 20   class. *       
9590: 20 20 41 50 44 55 20 43 6c 61 73 73 20 28 47 53    APDU Class (GS
95a0: 43 49 53 5f 43 4c 41 53 53 5f 49 53 4f 37 38 31  CIS_CLASS_ISO781
95b0: 36 20 6f 72 20 47 53 43 49 53 5f 43 4c 41 53 53  6 or GSCIS_CLASS
95c0: 5f 47 4c 4f 42 41 4c 5f 50 4c 41 54 46 4f 52 4d  _GLOBAL_PLATFORM
95d0: 0a 20 2a 20 20 20 20 20 20 20 20 20 75 73 75 61  . *         usua
95e0: 6c 6c 79 29 2c 20 28 43 4c 41 29 0a 20 2a 0a 20  lly), (CLA). *. 
95f0: 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63  *     unsigned c
9600: 68 61 72 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a  har instruction.
9610: 20 2a 20 20 20 20 20 20 20 20 20 41 50 44 55 20   *         APDU 
9620: 49 6e 73 74 72 75 63 74 69 6f 6e 20 28 49 4e 53  Instruction (INS
9630: 29 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69  ). *. *     unsi
9640: 67 6e 65 64 20 63 68 61 72 20 70 31 0a 20 2a 20  gned char p1. * 
9650: 20 20 20 20 20 20 20 20 41 50 44 55 20 50 61 72          APDU Par
9660: 61 6d 65 74 65 72 20 31 20 28 50 31 29 0a 20 2a  ameter 1 (P1). *
9670: 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64  . *     unsigned
9680: 20 63 68 61 72 20 70 32 0a 20 2a 20 20 20 20 20   char p2. *     
9690: 20 20 20 20 41 50 44 55 20 50 61 72 61 6d 65 74      APDU Paramet
96a0: 65 72 20 32 20 28 50 32 29 0a 20 2a 0a 20 2a 20  er 2 (P2). *. * 
96b0: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
96c0: 72 20 6c 63 0a 20 2a 20 20 20 20 20 20 20 20 20  r lc. *         
96d0: 41 50 44 55 20 4c 65 6e 67 74 68 20 6f 66 20 43  APDU Length of C
96e0: 6f 6e 74 65 6e 74 20 28 4c 63 29 20 2d 2d 20 74  ontent (Lc) -- t
96f0: 68 69 73 20 69 73 20 74 68 65 20 6c 65 6e 67 74  his is the lengt
9700: 68 20 6f 66 20 22 64 61 74 61 22 0a 20 2a 20 20  h of "data". *  
9710: 20 20 20 20 20 20 20 70 61 72 61 6d 65 74 65 72         parameter
9720: 2e 20 20 49 66 20 22 64 61 74 61 22 20 69 73 20  .  If "data" is 
9730: 73 70 65 63 69 66 69 65 64 20 61 73 20 4e 55 4c  specified as NUL
9740: 4c 2c 20 74 68 69 73 20 70 61 72 61 6d 65 74 65  L, this paramete
9750: 72 20 77 69 6c 6c 0a 20 2a 20 20 20 20 20 20 20  r will. *       
9760: 20 20 62 65 20 69 67 6e 6f 72 65 64 2e 0a 20 2a    be ignored.. *
9770: 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64  . *     unsigned
9780: 20 63 68 61 72 20 2a 64 61 74 61 0a 20 2a 20 20   char *data. *  
9790: 20 20 20 20 20 20 20 50 6f 69 6e 74 65 72 20 74         Pointer t
97a0: 6f 20 62 75 66 66 65 72 20 74 6f 20 73 65 6e 64  o buffer to send
97b0: 2e 20 20 49 74 20 73 68 6f 75 6c 64 20 62 65 20  .  It should be 
97c0: 22 4c 63 22 20 62 79 74 65 73 20 6c 6f 6e 67 2e  "Lc" bytes long.
97d0: 20 20 49 66 0a 20 2a 20 20 20 20 20 20 20 20 20    If. *         
97e0: 73 70 65 63 69 66 69 65 64 20 61 73 20 4e 55 4c  specified as NUL
97f0: 4c 2c 20 22 4c 63 22 20 77 69 6c 6c 20 6e 6f 74  L, "Lc" will not
9800: 20 62 65 20 73 65 6e 74 2c 20 61 6e 64 20 74 68   be sent, and th
9810: 69 73 20 62 75 66 66 65 72 20 77 69 6c 6c 20 62  is buffer will b
9820: 65 0a 20 2a 20 20 20 20 20 20 20 20 20 69 67 6e  e. *         ign
9830: 6f 72 65 64 2e 0a 20 2a 0a 20 2a 20 20 20 20 20  ored.. *. *     
9840: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6c 65  unsigned char le
9850: 0a 20 2a 20 20 20 20 20 20 20 20 20 41 50 44 55  . *         APDU
9860: 20 4c 65 6e 67 74 68 20 6f 66 20 45 78 70 65 63   Length of Expec
9870: 74 61 74 69 6f 6e 20 28 4c 65 29 20 2d 2d 20 74  tation (Le) -- t
9880: 68 69 73 20 69 73 20 74 68 65 20 6c 65 6e 67 74  his is the lengt
9890: 68 20 6f 66 20 74 68 65 0a 20 2a 20 20 20 20 20  h of the. *     
98a0: 20 20 20 20 65 78 70 65 63 74 65 64 20 72 65 70      expected rep
98b0: 6c 79 2e 20 20 49 66 20 74 68 69 73 20 69 73 20  ly.  If this is 
98c0: 73 70 65 63 69 66 69 65 64 20 61 73 20 30 20 74  specified as 0 t
98d0: 68 65 6e 20 69 74 20 77 69 6c 6c 20 6e 6f 74 0a  hen it will not.
98e0: 20 2a 20 20 20 20 20 20 20 20 20 62 65 20 73 65   *         be se
98f0: 6e 74 2e 0a 20 2a 0a 20 2a 20 20 20 20 20 75 69  nt.. *. *     ui
9900: 6e 74 31 36 5f 74 20 2a 72 65 73 70 63 6f 64 65  nt16_t *respcode
9910: 0a 20 2a 20 20 20 20 20 20 20 20 20 5b 4f 55 54  . *         [OUT
9920: 5d 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 74 6f  ] Pointer to sto
9930: 72 61 67 65 20 6f 66 20 41 50 44 55 20 72 65 73  rage of APDU res
9940: 70 6f 6e 73 65 20 63 6f 64 65 2e 20 20 49 66 20  ponse code.  If 
9950: 74 68 69 73 20 69 73 0a 20 2a 20 20 20 20 20 20  this is. *      
9960: 20 20 20 73 70 65 63 69 66 69 65 64 20 61 73 20     specified as 
9970: 4e 55 4c 4c 2c 20 74 68 65 20 72 65 73 70 6f 6e  NULL, the respon
9980: 73 65 20 63 6f 64 65 20 77 69 6c 6c 20 62 65 20  se code will be 
9990: 64 69 73 63 61 72 64 65 64 2e 0a 20 2a 0a 20 2a  discarded.. *. *
99a0: 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68       unsigned ch
99b0: 61 72 20 2a 72 65 73 70 64 61 74 61 0a 20 2a 20  ar *respdata. * 
99c0: 20 20 20 20 20 20 20 20 5b 4f 55 54 5d 20 50 6f          [OUT] Po
99d0: 69 6e 74 65 72 20 74 6f 20 73 74 6f 72 61 67 65  inter to storage
99e0: 20 6f 66 20 41 50 44 55 20 72 65 73 70 6f 6e 73   of APDU respons
99f0: 65 20 64 61 74 61 2e 20 20 49 66 20 74 68 69 73  e data.  If this
9a00: 20 69 73 0a 20 2a 20 20 20 20 20 20 20 20 20 73   is. *         s
9a10: 70 65 63 69 66 69 65 64 20 61 73 20 4e 55 4c 4c  pecified as NULL
9a20: 2c 20 74 68 65 20 72 65 73 70 6f 6e 73 65 20 64  , the response d
9a30: 61 74 61 20 77 69 6c 6c 20 62 65 20 64 69 73 63  ata will be disc
9a40: 61 72 64 65 64 2e 20 20 49 66 0a 20 2a 20 20 20  arded.  If. *   
9a50: 20 20 20 20 20 20 74 68 65 20 22 72 65 73 70 64        the "respd
9a60: 61 74 61 5f 6c 65 6e 22 20 70 61 72 61 6d 65 74  ata_len" paramet
9a70: 65 72 20 69 73 20 73 70 65 63 69 66 69 65 64 20  er is specified 
9a80: 61 73 20 4e 55 4c 4c 2c 20 74 68 69 73 20 62 75  as NULL, this bu
9a90: 66 66 65 72 0a 20 2a 20 20 20 20 20 20 20 20 20  ffer. *         
9aa0: 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75 70 64 61  will not be upda
9ab0: 74 65 64 2e 0a 20 2a 0a 20 2a 20 20 20 20 20 73  ted.. *. *     s
9ac0: 69 7a 65 5f 74 20 2a 72 65 73 70 64 61 74 61 5f  ize_t *respdata_
9ad0: 6c 65 6e 0a 20 2a 20 20 20 20 20 20 20 20 20 5b  len. *         [
9ae0: 49 4e 2c 20 4f 55 54 5d 20 50 6f 69 6e 74 65 72  IN, OUT] Pointer
9af0: 20 69 6e 69 74 69 61 6c 69 6e 67 20 63 6f 6e 74   initialing cont
9b00: 61 69 6e 69 6e 67 20 74 68 65 20 73 69 7a 65 20  aining the size 
9b10: 6f 66 20 74 68 65 20 22 72 65 73 70 64 61 74 61  of the "respdata
9b20: 22 0a 20 2a 20 20 20 20 20 20 20 20 20 62 75 66  ". *         buf
9b30: 66 65 72 2e 20 20 42 65 66 6f 72 65 20 72 65 74  fer.  Before ret
9b40: 75 72 6e 69 6e 67 2c 20 74 68 65 20 70 6f 69 6e  urning, the poin
9b50: 74 65 64 20 74 6f 20 76 61 6c 75 65 20 69 73 20  ted to value is 
9b60: 75 70 64 61 74 65 64 20 74 6f 20 74 68 65 0a 20  updated to the. 
9b70: 2a 20 20 20 20 20 20 20 20 20 6e 75 6d 62 65 72  *         number
9b80: 20 6f 66 20 62 79 74 65 73 20 77 72 69 74 74 65   of bytes writte
9b90: 6e 20 74 6f 20 74 68 65 20 62 75 66 66 65 72 2e  n to the buffer.
9ba0: 20 20 49 66 20 74 68 69 73 20 69 73 20 73 70 65    If this is spe
9bb0: 63 69 66 69 65 64 20 61 73 0a 20 2a 20 20 20 20  cified as. *    
9bc0: 20 20 20 20 20 4e 55 4c 4c 2c 20 69 74 20 77 69       NULL, it wi
9bd0: 6c 6c 20 6e 6f 74 20 62 65 20 75 70 64 61 74 65  ll not be update
9be0: 64 2c 20 61 6e 64 20 22 72 65 73 70 64 61 74 61  d, and "respdata
9bf0: 22 20 77 69 6c 6c 20 62 65 20 69 67 6e 6f 72 65  " will be ignore
9c00: 64 20 63 61 75 73 69 6e 67 0a 20 2a 20 20 20 20  d causing. *    
9c10: 20 20 20 20 20 74 68 65 20 72 65 73 70 6f 6e 73       the respons
9c20: 65 20 64 61 74 61 20 74 6f 20 62 65 20 64 69 73  e data to be dis
9c30: 63 61 72 64 65 64 2e 0a 20 2a 0a 20 2a 20 52 45  carded.. *. * RE
9c40: 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20  TURN VALUE. *   
9c50: 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f    CACKEY_PCSC_S_
9c60: 4f 4b 20 20 20 20 20 20 20 20 20 20 20 4f 6e 20  OK           On 
9c70: 73 75 63 63 65 73 73 0a 20 2a 20 20 20 20 20 43  success. *     C
9c80: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e  ACKEY_PCSC_E_GEN
9c90: 45 52 49 43 20 20 20 20 20 20 4f 6e 20 65 72 72  ERIC      On err
9ca0: 6f 72 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59  or. *     CACKEY
9cb0: 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53  _PCSC_E_TOKENABS
9cc0: 45 4e 54 20 20 49 66 20 74 68 65 20 73 65 6e 64  ENT  If the send
9cd0: 69 6e 67 20 66 61 69 6c 65 64 20 62 65 63 61 75  ing failed becau
9ce0: 73 65 20 74 68 65 20 74 6f 6b 65 6e 20 69 73 0a  se the token is.
9cf0: 20 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   *              
9d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d10: 20 20 61 62 73 65 6e 74 0a 20 2a 20 20 20 20 20    absent. *     
9d20: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 52 45  CACKEY_PCSC_E_RE
9d30: 54 52 59 20 20 20 20 20 20 20 20 49 66 20 73 6f  TRY        If so
9d40: 6d 65 74 68 69 6e 67 20 74 68 61 74 20 6c 6f 6f  mething that loo
9d50: 6b 73 20 72 65 74 72 79 27 61 62 6c 65 20 77 65  ks retry'able we
9d60: 6e 74 0a 20 2a 20 20 20 20 20 20 20 20 20 20 20  nt. *           
9d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d80: 20 20 20 20 20 77 72 6f 6e 67 20 2d 2d 20 74 72       wrong -- tr
9d90: 79 20 74 68 65 20 77 68 6f 6c 65 20 74 72 61 6e  y the whole tran
9da0: 73 61 63 74 69 6f 6e 20 6f 76 65 72 0a 20 2a 20  saction over. * 
9db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
9dd0: 67 61 69 6e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53  gain. *. * NOTES
9de0: 0a 20 2a 20 20 20 20 20 54 68 69 73 20 66 75 6e  . *     This fun
9df0: 63 74 69 6f 6e 20 77 69 6c 6c 20 63 6f 6e 6e 65  ction will conne
9e00: 63 74 20 74 6f 20 74 68 65 20 50 43 2f 53 43 20  ct to the PC/SC 
9e10: 43 6f 6e 6e 65 63 74 69 6f 6e 20 4d 61 6e 61 67  Connection Manag
9e20: 65 72 20 76 69 61 0a 20 2a 20 20 20 20 20 63 61  er via. *     ca
9e30: 63 6b 65 79 5f 70 63 73 63 5f 63 6f 6e 6e 65 63  ckey_pcsc_connec
9e40: 74 28 29 20 69 66 20 6e 65 65 64 65 64 2e 0a 20  t() if needed.. 
9e50: 2a 0a 20 2a 20 20 20 20 20 49 74 20 77 69 6c 6c  *. *     It will
9e60: 20 63 6f 6e 6e 65 63 74 20 74 6f 20 74 68 65 20   connect to the 
9e70: 63 61 72 64 20 69 6e 20 74 68 65 20 72 65 61 64  card in the read
9e80: 65 72 20 61 74 74 61 63 68 65 64 20 74 6f 20 74  er attached to t
9e90: 68 65 20 73 6c 6f 74 0a 20 2a 20 20 20 20 20 73  he slot. *     s
9ea0: 70 65 63 69 66 69 65 64 2e 20 20 49 74 20 77 69  pecified.  It wi
9eb0: 6c 6c 20 72 65 63 6f 6e 6e 65 63 74 20 74 6f 20  ll reconnect to 
9ec0: 74 68 65 20 63 61 72 64 20 69 66 20 74 68 65 20  the card if the 
9ed0: 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 2a 20 20 20  connection. *   
9ee0: 20 20 67 6f 65 73 20 61 77 61 79 2e 0a 20 2a 0a    goes away.. *.
9ef0: 20 2a 2f 0a 73 74 61 74 69 63 20 63 61 63 6b 65   */.static cacke
9f00: 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 73 65 6e  y_ret cackey_sen
9f10: 64 5f 61 70 64 75 28 73 74 72 75 63 74 20 63 61  d_apdu(struct ca
9f20: 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c  ckey_slot *slot,
9f30: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63   unsigned char c
9f40: 6c 61 73 73 2c 20 75 6e 73 69 67 6e 65 64 20 63  lass, unsigned c
9f50: 68 61 72 20 69 6e 73 74 72 75 63 74 69 6f 6e 2c  har instruction,
9f60: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 70   unsigned char p
9f70: 31 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  1, unsigned char
9f80: 20 70 32 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e   p2, unsigned in
9f90: 74 20 6c 63 2c 20 75 6e 73 69 67 6e 65 64 20 63  t lc, unsigned c
9fa0: 68 61 72 20 2a 64 61 74 61 2c 20 75 6e 73 69 67  har *data, unsig
9fb0: 6e 65 64 20 69 6e 74 20 6c 65 2c 20 75 69 6e 74  ned int le, uint
9fc0: 31 36 5f 74 20 2a 72 65 73 70 63 6f 64 65 2c 20  16_t *respcode, 
9fd0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 72  unsigned char *r
9fe0: 65 73 70 64 61 74 61 2c 20 73 69 7a 65 5f 74 20  espdata, size_t 
9ff0: 2a 72 65 73 70 64 61 74 61 5f 6c 65 6e 29 20 7b  *respdata_len) {
a000: 0a 09 75 69 6e 74 38 5f 74 20 6d 61 6a 6f 72 5f  ..uint8_t major_
a010: 72 63 2c 20 6d 69 6e 6f 72 5f 72 63 3b 0a 09 73  rc, minor_rc;..s
a020: 69 7a 65 5f 74 20 62 79 74 65 73 5f 74 6f 5f 63  ize_t bytes_to_c
a030: 6f 70 79 2c 20 74 6d 70 5f 72 65 73 70 64 61 74  opy, tmp_respdat
a040: 61 5f 6c 65 6e 3b 0a 09 4c 50 43 53 43 41 52 44  a_len;..LPCSCARD
a050: 5f 49 4f 5f 52 45 51 55 45 53 54 20 70 69 6f 53  _IO_REQUEST pioS
a060: 65 6e 64 50 63 69 3b 0a 09 44 57 4f 52 44 20 78  endPci;..DWORD x
a070: 6d 69 74 5f 6c 65 6e 2c 20 72 65 63 76 5f 6c 65  mit_len, recv_le
a080: 6e 3b 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f 78  n;..LONG scard_x
a090: 6d 69 74 5f 72 65 74 2c 20 73 63 61 72 64 5f 72  mit_ret, scard_r
a0a0: 65 63 6f 6e 6e 5f 72 65 74 3b 0a 09 42 59 54 45  econn_ret;..BYTE
a0b0: 20 78 6d 69 74 5f 62 75 66 5b 31 30 32 34 5d 2c   xmit_buf[1024],
a0c0: 20 72 65 63 76 5f 62 75 66 5b 31 30 32 34 5d 3b   recv_buf[1024];
a0d0: 0a 09 69 6e 74 20 70 63 73 63 5f 63 6f 6e 6e 65  ..int pcsc_conne
a0e0: 63 74 5f 72 65 74 2c 20 70 63 73 63 5f 67 65 74  ct_ret, pcsc_get
a0f0: 72 65 73 70 5f 72 65 74 3b 0a 09 69 6e 74 20 69  resp_ret;..int i
a100: 64 78 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  dx;...CACKEY_DEB
a110: 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
a120: 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 73 6c 6f  d.");...if (!slo
a130: 74 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  t) {...CACKEY_DE
a140: 42 55 47 5f 50 52 49 4e 54 46 28 22 49 6e 76 61  BUG_PRINTF("Inva
a150: 6c 69 64 20 73 6c 6f 74 20 73 70 65 63 69 66 69  lid slot specifi
a160: 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
a170: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47  (CACKEY_PCSC_E_G
a180: 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 70 63  ENERIC);..}...pc
a190: 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 20 3d  sc_connect_ret =
a1a0: 20 63 61 63 6b 65 79 5f 63 6f 6e 6e 65 63 74 5f   cackey_connect_
a1b0: 63 61 72 64 28 73 6c 6f 74 29 3b 0a 09 69 66 20  card(slot);..if 
a1c0: 28 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65  (pcsc_connect_re
a1d0: 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43  t != CACKEY_PCSC
a1e0: 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45  _S_OK) {...CACKE
a1f0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
a200: 55 6e 61 62 6c 65 20 74 6f 20 63 6f 6e 6e 65 63  Unable to connec
a210: 74 20 74 6f 20 63 61 72 64 2c 20 72 65 74 75 72  t to card, retur
a220: 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22  ning in failure"
a230: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43  );....return(CAC
a240: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52  KEY_PCSC_E_GENER
a250: 49 43 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74  IC);..}.../* Det
a260: 65 72 6d 69 6e 65 20 77 68 69 63 68 20 70 72 6f  ermine which pro
a270: 74 6f 63 6f 6c 20 74 6f 20 73 65 6e 64 20 75 73  tocol to send us
a280: 69 6e 67 20 2a 2f 0a 09 73 77 69 74 63 68 20 28  ing */..switch (
a290: 73 6c 6f 74 2d 3e 70 72 6f 74 6f 63 6f 6c 29 20  slot->protocol) 
a2a0: 7b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 50  {...case SCARD_P
a2b0: 52 4f 54 4f 43 4f 4c 5f 54 30 3a 0a 09 09 09 43  ROTOCOL_T0:....C
a2c0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
a2d0: 54 46 28 22 50 72 6f 74 6f 63 6f 6c 20 74 6f 20  TF("Protocol to 
a2e0: 73 65 6e 64 20 64 61 74 61 67 72 61 6d 20 69 73  send datagram is
a2f0: 20 54 3d 30 22 29 3b 0a 0a 09 09 09 70 69 6f 53   T=0");.....pioS
a300: 65 6e 64 50 63 69 20 3d 20 53 43 41 52 44 5f 50  endPci = SCARD_P
a310: 43 49 5f 54 30 3b 0a 0a 09 09 09 62 72 65 61 6b  CI_T0;.....break
a320: 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 50  ;...case SCARD_P
a330: 52 4f 54 4f 43 4f 4c 5f 54 31 3a 0a 09 09 09 43  ROTOCOL_T1:....C
a340: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
a350: 54 46 28 22 50 72 6f 74 6f 63 6f 6c 20 74 6f 20  TF("Protocol to 
a360: 73 65 6e 64 20 64 61 74 61 67 72 61 6d 20 69 73  send datagram is
a370: 20 54 3d 31 22 29 3b 0a 0a 09 09 09 70 69 6f 53   T=1");.....pioS
a380: 65 6e 64 50 63 69 20 3d 20 53 43 41 52 44 5f 50  endPci = SCARD_P
a390: 43 49 5f 54 31 3b 0a 0a 09 09 09 62 72 65 61 6b  CI_T1;.....break
a3a0: 3b 0a 09 09 64 65 66 61 75 6c 74 3a 0a 09 09 09  ;...default:....
a3b0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
a3c0: 4e 54 46 28 22 49 6e 76 61 6c 69 64 20 70 72 6f  NTF("Invalid pro
a3d0: 74 6f 63 6f 6c 20 66 6f 75 6e 64 2c 20 61 62 6f  tocol found, abo
a3e0: 72 74 69 6e 67 2e 22 29 3b 0a 0a 09 09 09 72 65  rting.");.....re
a3f0: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
a400: 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a  _E_GENERIC);..}.
a410: 0a 09 2f 2a 20 54 72 61 6e 73 6d 69 74 20 2a 2f  ../* Transmit */
a420: 0a 09 78 6d 69 74 5f 6c 65 6e 20 3d 20 30 3b 0a  ..xmit_len = 0;.
a430: 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c  .xmit_buf[xmit_l
a440: 65 6e 2b 2b 5d 20 3d 20 63 6c 61 73 73 3b 0a 09  en++] = class;..
a450: 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c 65  xmit_buf[xmit_le
a460: 6e 2b 2b 5d 20 3d 20 69 6e 73 74 72 75 63 74 69  n++] = instructi
a470: 6f 6e 3b 0a 09 78 6d 69 74 5f 62 75 66 5b 78 6d  on;..xmit_buf[xm
a480: 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 70 31 3b 0a  it_len++] = p1;.
a490: 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c  .xmit_buf[xmit_l
a4a0: 65 6e 2b 2b 5d 20 3d 20 70 32 3b 0a 09 69 66 20  en++] = p2;..if 
a4b0: 28 64 61 74 61 29 20 7b 0a 09 09 69 66 20 28 6c  (data) {...if (l
a4c0: 63 20 3e 20 32 35 35 29 20 7b 0a 09 09 09 43 41  c > 255) {....CA
a4d0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
a4e0: 46 28 22 43 41 55 54 49 4f 4e 21 20 20 55 73 69  F("CAUTION!  Usi
a4f0: 6e 67 20 61 6e 20 4c 63 20 67 72 65 61 74 65 72  ng an Lc greater
a500: 20 74 68 61 6e 20 32 35 35 20 69 73 20 75 6e 74   than 255 is unt
a510: 65 73 74 65 64 2e 20 20 4c 63 20 3d 20 25 75 22  ested.  Lc = %u"
a520: 2c 20 6c 63 29 3b 0a 0a 09 09 09 78 6d 69 74 5f  , lc);.....xmit_
a530: 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20  buf[xmit_len++] 
a540: 3d 20 30 78 38 32 3b 20 2f 2a 20 58 58 58 20 55  = 0x82; /* XXX U
a550: 4e 54 45 53 54 45 44 20 2a 2f 0a 09 09 09 78 6d  NTESTED */....xm
a560: 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b  it_buf[xmit_len+
a570: 2b 5d 20 3d 20 28 6c 63 20 26 20 30 78 66 66 30  +] = (lc & 0xff0
a580: 30 29 20 3e 3e 20 38 3b 0a 09 09 09 78 6d 69 74  0) >> 8;....xmit
a590: 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d  _buf[xmit_len++]
a5a0: 20 3d 20 6c 63 20 26 20 30 78 66 66 3b 0a 09 09   = lc & 0xff;...
a5b0: 7d 20 65 6c 73 65 20 7b 0a 09 09 09 78 6d 69 74  } else {....xmit
a5c0: 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d  _buf[xmit_len++]
a5d0: 20 3d 20 6c 63 3b 0a 09 09 7d 0a 09 09 66 6f 72   = lc;...}...for
a5e0: 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c   (idx = 0; idx <
a5f0: 20 6c 63 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09   lc; idx++) {...
a600: 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c  .xmit_buf[xmit_l
a610: 65 6e 2b 2b 5d 20 3d 20 64 61 74 61 5b 69 64 78  en++] = data[idx
a620: 5d 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28  ];...}..}...if (
a630: 6c 65 20 21 3d 20 30 78 30 30 29 20 7b 0a 09 09  le != 0x00) {...
a640: 69 66 20 28 6c 65 20 3e 20 32 35 36 29 20 7b 0a  if (le > 256) {.
a650: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
a660: 50 52 49 4e 54 46 28 22 43 41 55 54 49 4f 4e 21  PRINTF("CAUTION!
a670: 20 20 55 73 69 6e 67 20 61 6e 20 4c 65 20 67 72    Using an Le gr
a680: 65 61 74 65 72 20 74 68 61 6e 20 32 35 36 20 69  eater than 256 i
a690: 73 20 75 6e 74 65 73 74 65 64 2e 20 20 4c 65 20  s untested.  Le 
a6a0: 3d 20 25 75 22 2c 20 6c 65 29 3b 0a 0a 09 09 09  = %u", le);.....
a6b0: 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c 65  xmit_buf[xmit_le
a6c0: 6e 2b 2b 5d 20 3d 20 30 78 38 32 3b 20 2f 2a 20  n++] = 0x82; /* 
a6d0: 58 58 58 20 55 4e 54 45 53 54 45 44 20 2a 2f 0a  XXX UNTESTED */.
a6e0: 09 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74  ...xmit_buf[xmit
a6f0: 5f 6c 65 6e 2b 2b 5d 20 3d 20 28 6c 65 20 26 20  _len++] = (le & 
a700: 30 78 66 66 30 30 29 20 3e 3e 20 38 3b 0a 09 09  0xff00) >> 8;...
a710: 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c  .xmit_buf[xmit_l
a720: 65 6e 2b 2b 5d 20 3d 20 6c 65 20 26 20 30 78 66  en++] = le & 0xf
a730: 66 3b 0a 09 09 7d 20 65 6c 73 65 20 69 66 20 28  f;...} else if (
a740: 6c 65 20 3d 3d 20 32 35 36 29 20 7b 0a 09 09 09  le == 256) {....
a750: 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c 65  xmit_buf[xmit_le
a760: 6e 2b 2b 5d 20 3d 20 30 78 30 30 3b 0a 09 09 7d  n++] = 0x00;...}
a770: 20 65 6c 73 65 20 7b 0a 09 09 09 78 6d 69 74 5f   else {....xmit_
a780: 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20  buf[xmit_len++] 
a790: 3d 20 6c 65 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 2f  = le;...}..}.../
a7a0: 2a 20 42 65 67 69 6e 20 53 6d 61 72 74 63 61 72  * Begin Smartcar
a7b0: 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f  d Transaction */
a7c0: 0a 09 63 61 63 6b 65 79 5f 62 65 67 69 6e 5f 74  ..cackey_begin_t
a7d0: 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29  ransaction(slot)
a7e0: 3b 0a 0a 09 69 66 20 28 63 6c 61 73 73 20 3d 3d  ;...if (class ==
a7f0: 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 49 53 4f   GSCIS_CLASS_ISO
a800: 37 38 31 36 20 26 26 20 28 69 6e 73 74 72 75 63  7816 && (instruc
a810: 74 69 6f 6e 20 3d 3d 20 47 53 43 49 53 5f 49 4e  tion == GSCIS_IN
a820: 53 54 52 5f 56 45 52 49 46 59 20 7c 7c 20 69 6e  STR_VERIFY || in
a830: 73 74 72 75 63 74 69 6f 6e 20 3d 3d 20 47 53 43  struction == GSC
a840: 49 53 5f 49 4e 53 54 52 5f 43 48 41 4e 47 45 5f  IS_INSTR_CHANGE_
a850: 52 45 46 45 52 45 4e 43 45 29 20 26 26 20 70 31  REFERENCE) && p1
a860: 20 3d 3d 20 30 78 30 30 29 20 7b 0a 09 09 43 41   == 0x00) {...CA
a870: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
a880: 46 28 22 53 65 6e 64 69 6e 67 20 41 50 44 55 3a  F("Sending APDU:
a890: 20 3c 3c 63 65 6e 73 6f 72 65 64 3e 3e 22 29 3b   <<censored>>");
a8a0: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 43 41 43  ..} else {...CAC
a8b0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42  KEY_DEBUG_PRINTB
a8c0: 55 46 28 22 53 65 6e 64 69 6e 67 20 41 50 44 55  UF("Sending APDU
a8d0: 3a 22 2c 20 78 6d 69 74 5f 62 75 66 2c 20 78 6d  :", xmit_buf, xm
a8e0: 69 74 5f 6c 65 6e 29 3b 0a 09 7d 0a 0a 09 72 65  it_len);..}...re
a8f0: 63 76 5f 6c 65 6e 20 3d 20 73 69 7a 65 6f 66 28  cv_len = sizeof(
a900: 72 65 63 76 5f 62 75 66 29 3b 0a 09 73 63 61 72  recv_buf);..scar
a910: 64 5f 78 6d 69 74 5f 72 65 74 20 3d 20 53 43 61  d_xmit_ret = SCa
a920: 72 64 54 72 61 6e 73 6d 69 74 28 73 6c 6f 74 2d  rdTransmit(slot-
a930: 3e 70 63 73 63 5f 63 61 72 64 2c 20 70 69 6f 53  >pcsc_card, pioS
a940: 65 6e 64 50 63 69 2c 20 78 6d 69 74 5f 62 75 66  endPci, xmit_buf
a950: 2c 20 78 6d 69 74 5f 6c 65 6e 2c 20 4e 55 4c 4c  , xmit_len, NULL
a960: 2c 20 72 65 63 76 5f 62 75 66 2c 20 26 72 65 63  , recv_buf, &rec
a970: 76 5f 6c 65 6e 29 3b 0a 0a 09 69 66 20 28 73 63  v_len);...if (sc
a980: 61 72 64 5f 78 6d 69 74 5f 72 65 74 20 3d 3d 20  ard_xmit_ret == 
a990: 53 43 41 52 44 5f 45 5f 4e 4f 54 5f 54 52 41 4e  SCARD_E_NOT_TRAN
a9a0: 53 41 43 54 45 44 29 20 7b 0a 09 09 43 41 43 4b  SACTED) {...CACK
a9b0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
a9c0: 22 46 61 69 6c 65 64 20 74 6f 20 73 65 6e 64 20  "Failed to send 
a9d0: 41 50 44 55 20 74 6f 20 63 61 72 64 20 28 53 43  APDU to card (SC
a9e0: 61 72 64 54 72 61 6e 73 6d 69 74 28 29 20 3d 20  ardTransmit() = 
a9f0: 25 73 2f 25 6c 78 29 2c 20 77 69 6c 6c 20 61 73  %s/%lx), will as
aa00: 6b 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  k calling functi
aa10: 6f 6e 20 74 6f 20 72 65 74 72 79 20 28 6e 6f 74  on to retry (not
aa20: 20 72 65 73 65 74 74 69 6e 67 20 63 61 72 64 29   resetting card)
aa30: 2e 2e 2e 22 2c 20 43 41 43 4b 45 59 5f 44 45 42  ...", CACKEY_DEB
aa40: 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52  UG_FUNC_SCARDERR
aa50: 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 5f 78 6d  _TO_STR(scard_xm
aa60: 69 74 5f 72 65 74 29 2c 20 28 75 6e 73 69 67 6e  it_ret), (unsign
aa70: 65 64 20 6c 6f 6e 67 29 20 73 63 61 72 64 5f 78  ed long) scard_x
aa80: 6d 69 74 5f 72 65 74 29 3b 0a 0a 09 09 2f 2a 20  mit_ret);..../* 
aa90: 42 65 67 69 6e 20 53 6d 61 72 74 63 61 72 64 20  Begin Smartcard 
aaa0: 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09  Transaction */..
aab0: 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e  .cackey_end_tran
aac0: 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a  saction(slot);..
aad0: 09 09 63 61 63 6b 65 79 5f 72 65 63 6f 6e 6e 65  ..cackey_reconne
aae0: 63 74 5f 63 61 72 64 28 73 6c 6f 74 2c 20 73 6c  ct_card(slot, sl
aaf0: 6f 74 2d 3e 70 72 6f 74 6f 63 6f 6c 29 3b 0a 0a  ot->protocol);..
ab00: 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
ab10: 50 43 53 43 5f 45 5f 52 45 54 52 59 29 3b 0a 09  PCSC_E_RETRY);..
ab20: 7d 0a 0a 09 69 66 20 28 73 63 61 72 64 5f 78 6d  }...if (scard_xm
ab30: 69 74 5f 72 65 74 20 21 3d 20 53 43 41 52 44 5f  it_ret != SCARD_
ab40: 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09 43  S_SUCCESS) {...C
ab50: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
ab60: 54 46 28 22 46 61 69 6c 65 64 20 74 6f 20 73 65  TF("Failed to se
ab70: 6e 64 20 41 50 44 55 20 74 6f 20 63 61 72 64 20  nd APDU to card 
ab80: 28 53 43 61 72 64 54 72 61 6e 73 6d 69 74 28 29  (SCardTransmit()
ab90: 20 3d 20 25 73 2f 25 6c 78 29 22 2c 20 43 41 43   = %s/%lx)", CAC
aba0: 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53  KEY_DEBUG_FUNC_S
abb0: 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73  CARDERR_TO_STR(s
abc0: 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 29 2c 20  card_xmit_ret), 
abd0: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
abe0: 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 29 3b  scard_xmit_ret);
abf0: 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
ac00: 5f 50 52 49 4e 54 46 28 22 4d 61 72 6b 69 6e 67  _PRINTF("Marking
ac10: 20 73 6c 6f 74 20 61 73 20 68 61 76 69 6e 67 20   slot as having 
ac20: 62 65 65 6e 20 72 65 73 65 74 22 29 3b 0a 09 09  been reset");...
ac30: 63 61 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74  cackey_mark_slot
ac40: 5f 72 65 73 65 74 28 73 6c 6f 74 29 3b 0a 0a 09  _reset(slot);...
ac50: 09 69 66 20 28 73 63 61 72 64 5f 78 6d 69 74 5f  .if (scard_xmit_
ac60: 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 57 5f 52  ret == SCARD_W_R
ac70: 45 53 45 54 5f 43 41 52 44 29 20 7b 0a 09 09 09  ESET_CARD) {....
ac80: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
ac90: 4e 54 46 28 22 52 65 73 65 74 20 72 65 71 75 69  NTF("Reset requi
aca0: 72 65 64 2c 20 70 6c 65 61 73 65 20 68 6f 6c 64  red, please hold
acb0: 2e 2e 2e 22 29 3b 0a 0a 09 09 09 73 63 61 72 64  ...");.....scard
acc0: 5f 72 65 63 6f 6e 6e 5f 72 65 74 20 3d 20 63 61  _reconn_ret = ca
acd0: 63 6b 65 79 5f 72 65 63 6f 6e 6e 65 63 74 5f 63  ckey_reconnect_c
ace0: 61 72 64 28 73 6c 6f 74 2c 20 53 43 41 52 44 5f  ard(slot, SCARD_
acf0: 50 52 4f 54 4f 43 4f 4c 5f 54 30 20 7c 20 53 43  PROTOCOL_T0 | SC
ad00: 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31 29  ARD_PROTOCOL_T1)
ad10: 3b 0a 0a 09 09 09 69 66 20 28 73 63 61 72 64 5f  ;.....if (scard_
ad20: 72 65 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53 43  reconn_ret == SC
ad30: 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b  ARD_S_SUCCESS) {
ad40: 0a 09 09 09 09 73 77 69 74 63 68 20 28 73 6c 6f  .....switch (slo
ad50: 74 2d 3e 70 72 6f 74 6f 63 6f 6c 29 20 7b 0a 09  t->protocol) {..
ad60: 09 09 09 09 63 61 73 65 20 53 43 41 52 44 5f 50  ....case SCARD_P
ad70: 52 4f 54 4f 43 4f 4c 5f 54 30 3a 0a 09 09 09 09  ROTOCOL_T0:.....
ad80: 09 09 70 69 6f 53 65 6e 64 50 63 69 20 3d 20 53  ..pioSendPci = S
ad90: 43 41 52 44 5f 50 43 49 5f 54 30 3b 0a 0a 09 09  CARD_PCI_T0;....
ada0: 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09  ....break;......
adb0: 63 61 73 65 20 53 43 41 52 44 5f 50 52 4f 54 4f  case SCARD_PROTO
adc0: 43 4f 4c 5f 54 31 3a 0a 09 09 09 09 09 09 70 69  COL_T1:.......pi
add0: 6f 53 65 6e 64 50 63 69 20 3d 20 53 43 41 52 44  oSendPci = SCARD
ade0: 5f 50 43 49 5f 54 31 3b 0a 0a 09 09 09 09 09 09  _PCI_T1;........
adf0: 62 72 65 61 6b 3b 0a 09 09 09 09 09 64 65 66 61  break;......defa
ae00: 75 6c 74 3a 0a 09 09 09 09 09 09 43 41 43 4b 45  ult:.......CACKE
ae10: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
ae20: 49 6e 76 61 6c 69 64 20 70 72 6f 74 6f 63 6f 6c  Invalid protocol
ae30: 20 66 6f 75 6e 64 2c 20 62 75 74 20 74 6f 6f 20   found, but too 
ae40: 6c 61 74 65 20 74 6f 20 64 6f 20 61 6e 79 74 68  late to do anyth
ae50: 69 6e 67 20 61 62 6f 75 74 20 69 74 20 6e 6f 77  ing about it now
ae60: 20 2d 2d 20 74 72 79 69 6e 67 20 61 6e 79 77 61   -- trying anywa
ae70: 79 2e 22 29 3b 0a 0a 09 09 09 09 09 09 62 72 65  y.");........bre
ae80: 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 2f  ak;.....}....../
ae90: 2a 20 52 65 2d 65 73 74 61 62 6c 69 73 68 20 74  * Re-establish t
aea0: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 66 20 69  ransaction, if i
aeb0: 74 20 77 61 73 20 70 72 65 73 65 6e 74 20 2a 2f  t was present */
aec0: 0a 09 09 09 09 69 66 20 28 73 6c 6f 74 2d 3e 74  .....if (slot->t
aed0: 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68  ransaction_depth
aee0: 20 3e 20 30 29 20 7b 0a 09 09 09 09 09 73 6c 6f   > 0) {......slo
aef0: 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64  t->transaction_d
af00: 65 70 74 68 2d 2d 3b 0a 09 09 09 09 09 73 6c 6f  epth--;......slo
af10: 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 6e  t->transaction_n
af20: 65 65 64 5f 68 77 5f 6c 6f 63 6b 20 3d 20 31 3b  eed_hw_lock = 1;
af30: 0a 09 09 09 09 09 63 61 63 6b 65 79 5f 62 65 67  ......cackey_beg
af40: 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73  in_transaction(s
af50: 6c 6f 74 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09  lot);.....}.....
af60: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
af70: 49 4e 54 46 28 22 52 65 73 65 74 20 73 75 63 63  INTF("Reset succ
af80: 65 73 73 66 75 6c 2c 20 72 65 74 72 61 6e 73 6d  essful, retransm
af90: 69 74 74 69 6e 67 22 29 3b 0a 0a 09 09 09 09 72  itting");......r
afa0: 65 63 76 5f 6c 65 6e 20 3d 20 73 69 7a 65 6f 66  ecv_len = sizeof
afb0: 28 72 65 63 76 5f 62 75 66 29 3b 0a 09 09 09 09  (recv_buf);.....
afc0: 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 20 3d  scard_xmit_ret =
afd0: 20 53 43 61 72 64 54 72 61 6e 73 6d 69 74 28 73   SCardTransmit(s
afe0: 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20  lot->pcsc_card, 
aff0: 70 69 6f 53 65 6e 64 50 63 69 2c 20 78 6d 69 74  pioSendPci, xmit
b000: 5f 62 75 66 2c 20 78 6d 69 74 5f 6c 65 6e 2c 20  _buf, xmit_len, 
b010: 4e 55 4c 4c 2c 20 72 65 63 76 5f 62 75 66 2c 20  NULL, recv_buf, 
b020: 26 72 65 63 76 5f 6c 65 6e 29 3b 0a 0a 09 09 09  &recv_len);.....
b030: 09 69 66 20 28 73 63 61 72 64 5f 78 6d 69 74 5f  .if (scard_xmit_
b040: 72 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f 53  ret != SCARD_S_S
b050: 55 43 43 45 53 53 29 20 7b 0a 09 09 09 09 09 43  UCCESS) {......C
b060: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
b070: 54 46 28 22 52 65 74 72 61 6e 73 6d 69 74 20 66  TF("Retransmit f
b080: 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 69 6e 67  ailed, returning
b090: 20 69 6e 20 66 61 69 6c 75 72 65 20 61 66 74 65   in failure afte
b0a0: 72 20 64 69 73 63 6f 6e 6e 65 63 74 69 6e 67 20  r disconnecting 
b0b0: 74 68 65 20 63 61 72 64 20 28 53 43 61 72 64 54  the card (SCardT
b0c0: 72 61 6e 73 6d 69 74 20 3d 20 25 73 2f 25 6c 69  ransmit = %s/%li
b0d0: 29 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47  )", CACKEY_DEBUG
b0e0: 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54  _FUNC_SCARDERR_T
b0f0: 4f 5f 53 54 52 28 73 63 61 72 64 5f 78 6d 69 74  O_STR(scard_xmit
b100: 5f 72 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63  _ret), (long) sc
b110: 61 72 64 5f 78 6d 69 74 5f 72 65 74 29 3b 0a 0a  ard_xmit_ret);..
b120: 09 09 09 09 09 53 43 61 72 64 44 69 73 63 6f 6e  .....SCardDiscon
b130: 6e 65 63 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f  nect(slot->pcsc_
b140: 63 61 72 64 2c 20 53 43 41 52 44 5f 4c 45 41 56  card, SCARD_LEAV
b150: 45 5f 43 41 52 44 29 3b 0a 09 09 09 09 09 73 6c  E_CARD);......sl
b160: 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f  ot->pcsc_card_co
b170: 6e 6e 65 63 74 65 64 20 3d 20 30 3b 0a 0a 09 09  nnected = 0;....
b180: 09 09 09 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63  .../* End Smartc
b190: 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20  ard Transaction 
b1a0: 2a 2f 0a 09 09 09 09 09 73 6c 6f 74 2d 3e 74 72  */......slot->tr
b1b0: 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20  ansaction_depth 
b1c0: 3d 20 31 3b 0a 09 09 09 09 09 63 61 63 6b 65 79  = 1;......cackey
b1d0: 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
b1e0: 28 73 6c 6f 74 29 3b 0a 0a 09 09 09 09 09 72 65  (slot);.......re
b1f0: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
b200: 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b  _E_TOKENABSENT);
b210: 0a 09 09 09 09 7d 0a 09 09 09 7d 20 65 6c 73 65  .....}....} else
b220: 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45   {.....CACKEY_DE
b230: 42 55 47 5f 50 52 49 4e 54 46 28 22 44 69 73 63  BUG_PRINTF("Disc
b240: 6f 6e 6e 65 63 74 69 6e 67 20 63 61 72 64 22 29  onnecting card")
b250: 3b 0a 0a 09 09 09 09 53 43 61 72 64 44 69 73 63  ;......SCardDisc
b260: 6f 6e 6e 65 63 74 28 73 6c 6f 74 2d 3e 70 63 73  onnect(slot->pcs
b270: 63 5f 63 61 72 64 2c 20 53 43 41 52 44 5f 4c 45  c_card, SCARD_LE
b280: 41 56 45 5f 43 41 52 44 29 3b 0a 09 09 09 09 73  AVE_CARD);.....s
b290: 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63  lot->pcsc_card_c
b2a0: 6f 6e 6e 65 63 74 65 64 20 3d 20 30 3b 0a 0a 09  onnected = 0;...
b2b0: 09 09 09 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63  .../* End Smartc
b2c0: 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20  ard Transaction 
b2d0: 2a 2f 0a 09 09 09 09 73 6c 6f 74 2d 3e 74 72 61  */.....slot->tra
b2e0: 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d  nsaction_depth =
b2f0: 20 31 3b 0a 09 09 09 09 63 61 63 6b 65 79 5f 65   1;.....cackey_e
b300: 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73  nd_transaction(s
b310: 6c 6f 74 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45  lot);......CACKE
b320: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
b330: 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  Returning in fai
b340: 6c 75 72 65 22 29 3b 0a 09 09 09 09 72 65 74 75  lure");.....retu
b350: 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  rn(CACKEY_PCSC_E
b360: 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b 0a 09  _TOKENABSENT);..
b370: 09 09 7d 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09  ..}...} else {..
b380: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
b390: 52 49 4e 54 46 28 22 44 69 73 63 6f 6e 6e 65 63  RINTF("Disconnec
b3a0: 74 69 6e 67 20 63 61 72 64 22 29 3b 0a 0a 09 09  ting card");....
b3b0: 09 53 43 61 72 64 44 69 73 63 6f 6e 6e 65 63 74  .SCardDisconnect
b3c0: 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64  (slot->pcsc_card
b3d0: 2c 20 53 43 41 52 44 5f 4c 45 41 56 45 5f 43 41  , SCARD_LEAVE_CA
b3e0: 52 44 29 3b 0a 09 09 09 73 6c 6f 74 2d 3e 70 63  RD);....slot->pc
b3f0: 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65  sc_card_connecte
b400: 64 20 3d 20 30 3b 0a 0a 09 09 09 2f 2a 20 45 6e  d = 0;...../* En
b410: 64 20 53 6d 61 72 74 63 61 72 64 20 54 72 61 6e  d Smartcard Tran
b420: 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 09 09 73 6c  saction */....sl
b430: 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f  ot->transaction_
b440: 64 65 70 74 68 20 3d 20 31 3b 0a 09 09 09 63 61  depth = 1;....ca
b450: 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ckey_end_transac
b460: 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 09  tion(slot);.....
b470: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
b480: 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 69  NTF("Returning i
b490: 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 09 09 09  n failure");....
b4a0: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
b4b0: 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54  SC_E_TOKENABSENT
b4c0: 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 43 41 43 4b  );...}..}...CACK
b4d0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55  EY_DEBUG_PRINTBU
b4e0: 46 28 22 52 65 74 75 72 6e 65 64 20 56 61 6c 75  F("Returned Valu
b4f0: 65 3a 22 2c 20 72 65 63 76 5f 62 75 66 2c 20 72  e:", recv_buf, r
b500: 65 63 76 5f 6c 65 6e 29 3b 0a 0a 09 69 66 20 28  ecv_len);...if (
b510: 72 65 63 76 5f 6c 65 6e 20 3c 20 32 29 20 7b 0a  recv_len < 2) {.
b520: 09 09 2f 2a 20 4d 69 6e 69 6d 61 6c 20 72 65 73  ../* Minimal res
b530: 70 6f 6e 73 65 20 6c 65 6e 67 74 68 20 69 73 20  ponse length is 
b540: 32 20 62 79 74 65 73 2c 20 72 65 74 75 72 6e 69  2 bytes, returni
b550: 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 20 2a 2f  ng in failure */
b560: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
b570: 50 52 49 4e 54 46 28 22 52 65 73 70 6f 6e 73 65  PRINTF("Response
b580: 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20 72 65 74 75   too small, retu
b590: 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65  rning in failure
b5a0: 20 28 72 65 63 76 5f 6c 65 6e 20 3d 20 25 6c 75   (recv_len = %lu
b5b0: 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  )", (unsigned lo
b5c0: 6e 67 29 20 72 65 63 76 5f 6c 65 6e 29 3b 0a 0a  ng) recv_len);..
b5d0: 09 09 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63 61  ../* End Smartca
b5e0: 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a  rd Transaction *
b5f0: 2f 0a 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74  /...cackey_end_t
b600: 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29  ransaction(slot)
b610: 3b 0a 0a 09 09 2f 2a 20 53 75 70 70 6c 79 20 61  ;..../* Supply a
b620: 6e 20 69 6e 76 61 6c 69 64 20 72 65 73 70 6f 6e  n invalid respon
b630: 73 65 20 63 6f 64 65 20 2a 2f 0a 09 09 69 66 20  se code */...if 
b640: 28 72 65 73 70 63 6f 64 65 29 20 7b 0a 09 09 09  (respcode) {....
b650: 2a 72 65 73 70 63 6f 64 65 20 3d 20 30 3b 0a 09  *respcode = 0;..
b660: 09 7d 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43  .}....return(CAC
b670: 4b 45 59 5f 50 43 53 43 5f 45 5f 4e 4f 44 41 54  KEY_PCSC_E_NODAT
b680: 41 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74 65  A);..}.../* Dete
b690: 72 6d 69 6e 65 20 72 65 73 75 6c 74 20 63 6f 64  rmine result cod
b6a0: 65 20 2a 2f 0a 09 6d 61 6a 6f 72 5f 72 63 20 3d  e */..major_rc =
b6b0: 20 72 65 63 76 5f 62 75 66 5b 72 65 63 76 5f 6c   recv_buf[recv_l
b6c0: 65 6e 20 2d 20 32 5d 3b 0a 09 6d 69 6e 6f 72 5f  en - 2];..minor_
b6d0: 72 63 20 3d 20 72 65 63 76 5f 62 75 66 5b 72 65  rc = recv_buf[re
b6e0: 63 76 5f 6c 65 6e 20 2d 20 31 5d 3b 0a 09 69 66  cv_len - 1];..if
b6f0: 20 28 72 65 73 70 63 6f 64 65 29 20 7b 0a 09 09   (respcode) {...
b700: 2a 72 65 73 70 63 6f 64 65 20 3d 20 28 6d 61 6a  *respcode = (maj
b710: 6f 72 5f 72 63 20 3c 3c 20 38 29 20 7c 20 6d 69  or_rc << 8) | mi
b720: 6e 6f 72 5f 72 63 3b 0a 09 7d 0a 0a 09 2f 2a 20  nor_rc;..}.../* 
b730: 41 64 6a 75 73 74 20 6d 65 73 73 61 67 65 20 62  Adjust message b
b740: 75 66 66 65 72 20 2a 2f 0a 09 72 65 63 76 5f 6c  uffer */..recv_l
b750: 65 6e 20 2d 3d 20 32 3b 0a 0a 09 2f 2a 20 41 64  en -= 2;.../* Ad
b760: 64 20 62 79 74 65 73 20 74 6f 20 72 65 74 75 72  d bytes to retur
b770: 6e 20 76 61 6c 75 65 20 2a 2f 0a 09 74 6d 70 5f  n value */..tmp_
b780: 72 65 73 70 64 61 74 61 5f 6c 65 6e 20 3d 20 30  respdata_len = 0
b790: 3b 0a 09 69 66 20 28 72 65 73 70 64 61 74 61 20  ;..if (respdata 
b7a0: 26 26 20 72 65 73 70 64 61 74 61 5f 6c 65 6e 29  && respdata_len)
b7b0: 20 7b 0a 09 09 74 6d 70 5f 72 65 73 70 64 61 74   {...tmp_respdat
b7c0: 61 5f 6c 65 6e 20 3d 20 2a 72 65 73 70 64 61 74  a_len = *respdat
b7d0: 61 5f 6c 65 6e 3b 0a 0a 09 09 62 79 74 65 73 5f  a_len;....bytes_
b7e0: 74 6f 5f 63 6f 70 79 20 3d 20 2a 72 65 73 70 64  to_copy = *respd
b7f0: 61 74 61 5f 6c 65 6e 3b 0a 0a 09 09 69 66 20 28  ata_len;....if (
b800: 72 65 63 76 5f 6c 65 6e 20 3c 20 62 79 74 65 73  recv_len < bytes
b810: 5f 74 6f 5f 63 6f 70 79 29 20 7b 0a 09 09 09 62  _to_copy) {....b
b820: 79 74 65 73 5f 74 6f 5f 63 6f 70 79 20 3d 20 72  ytes_to_copy = r
b830: 65 63 76 5f 6c 65 6e 3b 0a 09 09 7d 0a 0a 09 09  ecv_len;...}....
b840: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
b850: 4e 54 46 28 22 43 6f 70 79 69 6e 67 20 25 6c 75  NTF("Copying %lu
b860: 20 62 79 74 65 73 20 74 6f 20 74 68 65 20 62 75   bytes to the bu
b870: 66 66 65 72 20 28 72 65 63 76 27 64 20 25 6c 75  ffer (recv'd %lu
b880: 20 62 79 74 65 73 2c 20 62 75 74 20 6f 6e 6c 79   bytes, but only
b890: 20 25 6c 75 20 62 79 74 65 73 20 6c 65 66 74 20   %lu bytes left 
b8a0: 69 6e 20 6f 75 72 20 62 75 66 66 65 72 29 22 2c  in our buffer)",
b8b0: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
b8c0: 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 2c 20   bytes_to_copy, 
b8d0: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
b8e0: 72 65 63 76 5f 6c 65 6e 2c 20 28 75 6e 73 69 67  recv_len, (unsig
b8f0: 6e 65 64 20 6c 6f 6e 67 29 20 2a 72 65 73 70 64  ned long) *respd
b900: 61 74 61 5f 6c 65 6e 29 3b 0a 0a 09 09 6d 65 6d  ata_len);....mem
b910: 63 70 79 28 72 65 73 70 64 61 74 61 2c 20 72 65  cpy(respdata, re
b920: 63 76 5f 62 75 66 2c 20 62 79 74 65 73 5f 74 6f  cv_buf, bytes_to
b930: 5f 63 6f 70 79 29 3b 0a 09 09 72 65 73 70 64 61  _copy);...respda
b940: 74 61 20 2b 3d 20 62 79 74 65 73 5f 74 6f 5f 63  ta += bytes_to_c
b950: 6f 70 79 3b 0a 0a 09 09 2a 72 65 73 70 64 61 74  opy;....*respdat
b960: 61 5f 6c 65 6e 20 3d 20 62 79 74 65 73 5f 74 6f  a_len = bytes_to
b970: 5f 63 6f 70 79 3b 0a 09 09 74 6d 70 5f 72 65 73  _copy;...tmp_res
b980: 70 64 61 74 61 5f 6c 65 6e 20 2d 3d 20 62 79 74  pdata_len -= byt
b990: 65 73 5f 74 6f 5f 63 6f 70 79 3b 0a 09 7d 20 65  es_to_copy;..} e
b9a0: 6c 73 65 20 7b 0a 09 09 69 66 20 28 72 65 63 76  lse {...if (recv
b9b0: 5f 6c 65 6e 20 21 3d 20 30 29 20 7b 0a 09 09 09  _len != 0) {....
b9c0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
b9d0: 4e 54 46 28 22 54 68 72 6f 77 69 6e 67 20 61 77  NTF("Throwing aw
b9e0: 61 79 20 25 6c 75 20 62 79 74 65 73 2c 20 6e 6f  ay %lu bytes, no
b9f0: 77 68 65 72 65 20 74 6f 20 70 75 74 20 74 68 65  where to put the
ba00: 6d 21 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  m!", (unsigned l
ba10: 6f 6e 67 29 20 72 65 63 76 5f 6c 65 6e 29 3b 0a  ong) recv_len);.
ba20: 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28 6d 61 6a  ..}..}...if (maj
ba30: 6f 72 5f 72 63 20 3d 3d 20 30 78 36 31 29 20 7b  or_rc == 0x61) {
ba40: 0a 09 09 2f 2a 20 57 65 20 6e 65 65 64 20 74 6f  .../* We need to
ba50: 20 52 45 41 44 20 2a 2f 0a 09 09 43 41 43 4b 45   READ */...CACKE
ba60: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
ba70: 42 75 66 66 65 72 20 72 65 61 64 20 72 65 71 75  Buffer read requ
ba80: 69 72 65 64 22 29 3b 0a 0a 09 09 69 66 20 28 6d  ired");....if (m
ba90: 69 6e 6f 72 5f 72 63 20 3d 3d 20 30 78 30 30 29  inor_rc == 0x00)
baa0: 20 7b 0a 09 09 09 6d 69 6e 6f 72 5f 72 63 20 3d   {....minor_rc =
bab0: 20 43 41 43 4b 45 59 5f 41 50 44 55 5f 4d 54 55   CACKEY_APDU_MTU
bac0: 3b 0a 09 09 7d 0a 0a 09 09 70 63 73 63 5f 67 65  ;...}....pcsc_ge
bad0: 74 72 65 73 70 5f 72 65 74 20 3d 20 63 61 63 6b  tresp_ret = cack
bae0: 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f  ey_send_apdu(slo
baf0: 74 2c 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 49  t, GSCIS_CLASS_I
bb00: 53 4f 37 38 31 36 2c 20 47 53 43 49 53 5f 49 4e  SO7816, GSCIS_IN
bb10: 53 54 52 5f 47 45 54 5f 52 45 53 50 4f 4e 53 45  STR_GET_RESPONSE
bb20: 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 2c  , 0x00, 0x00, 0,
bb30: 20 4e 55 4c 4c 2c 20 6d 69 6e 6f 72 5f 72 63 2c   NULL, minor_rc,
bb40: 20 72 65 73 70 63 6f 64 65 2c 20 72 65 73 70 64   respcode, respd
bb50: 61 74 61 2c 20 26 74 6d 70 5f 72 65 73 70 64 61  ata, &tmp_respda
bb60: 74 61 5f 6c 65 6e 29 3b 0a 0a 09 09 69 66 20 28  ta_len);....if (
bb70: 70 63 73 63 5f 67 65 74 72 65 73 70 5f 72 65 74  pcsc_getresp_ret
bb80: 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f   != CACKEY_PCSC_
bb90: 53 5f 4f 4b 29 20 7b 0a 09 09 09 43 41 43 4b 45  S_OK) {....CACKE
bba0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
bbb0: 42 75 66 66 65 72 20 72 65 61 64 20 66 61 69 6c  Buffer read fail
bbc0: 65 64 21 20 20 52 65 74 75 72 6e 69 6e 67 20 69  ed!  Returning i
bbd0: 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09  n failure");....
bbe0: 09 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63 61 72  ./* End Smartcar
bbf0: 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f  d Transaction */
bc00: 0a 09 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74  ....cackey_end_t
bc10: 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29  ransaction(slot)
bc20: 3b 0a 0a 09 09 09 69 66 20 28 70 63 73 63 5f 67  ;.....if (pcsc_g
bc30: 65 74 72 65 73 70 5f 72 65 74 20 3d 3d 20 43 41  etresp_ret == CA
bc40: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 52 45 54 52  CKEY_PCSC_E_RETR
bc50: 59 29 20 7b 0a 09 09 09 09 72 65 74 75 72 6e 28  Y) {.....return(
bc60: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 52 45  CACKEY_PCSC_E_RE
bc70: 54 52 59 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 72  TRY);....}.....r
bc80: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
bc90: 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 09  C_E_GENERIC);...
bca0: 7d 0a 0a 09 09 69 66 20 28 72 65 73 70 64 61 74  }....if (respdat
bcb0: 61 5f 6c 65 6e 29 20 7b 0a 09 09 09 2a 72 65 73  a_len) {....*res
bcc0: 70 64 61 74 61 5f 6c 65 6e 20 2b 3d 20 74 6d 70  pdata_len += tmp
bcd0: 5f 72 65 73 70 64 61 74 61 5f 6c 65 6e 3b 0a 09  _respdata_len;..
bce0: 09 7d 0a 0a 09 09 2f 2a 20 45 6e 64 20 53 6d 61  .}..../* End Sma
bcf0: 72 74 63 61 72 64 20 54 72 61 6e 73 61 63 74 69  rtcard Transacti
bd00: 6f 6e 20 2a 2f 0a 09 09 63 61 63 6b 65 79 5f 65  on */...cackey_e
bd10: 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73  nd_transaction(s
bd20: 6c 6f 74 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f  lot);....CACKEY_
bd30: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
bd40: 74 75 72 6e 69 6e 67 20 69 6e 20 73 75 63 63 65  turning in succe
bd50: 73 73 20 28 62 75 66 66 65 72 20 72 65 61 64 20  ss (buffer read 
bd60: 63 6f 6d 70 6c 65 74 65 29 22 29 3b 0a 09 09 72  complete)");...r
bd70: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
bd80: 43 5f 53 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 2f 2a  C_S_OK);..}.../*
bd90: 20 45 6e 64 20 53 6d 61 72 74 63 61 72 64 20 54   End Smartcard T
bda0: 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 63  ransaction */..c
bdb0: 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61  ackey_end_transa
bdc0: 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 69  ction(slot);...i
bdd0: 66 20 28 6d 61 6a 6f 72 5f 72 63 20 3d 3d 20 30  f (major_rc == 0
bde0: 78 39 30 29 20 7b 0a 09 09 2f 2a 20 53 75 63 63  x90) {.../* Succ
bdf0: 65 73 73 20 2a 2f 0a 09 09 43 41 43 4b 45 59 5f  ess */...CACKEY_
be00: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
be10: 74 75 72 6e 69 6e 67 20 69 6e 20 73 75 63 63 65  turning in succe
be20: 73 73 20 28 6d 61 6a 6f 72 5f 72 63 20 3d 20 30  ss (major_rc = 0
be30: 78 39 30 29 22 29 3b 0a 0a 09 09 72 65 74 75 72  x90)");....retur
be40: 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  n(CACKEY_PCSC_S_
be50: 4f 4b 29 3b 0a 09 7d 0a 0a 0a 09 43 41 43 4b 45  OK);..}....CACKE
be60: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
be70: 41 50 44 55 20 52 65 74 75 72 6e 65 64 20 61 6e  APDU Returned an
be80: 20 65 72 72 6f 72 2c 20 72 65 74 75 72 6e 69 6e   error, returnin
be90: 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a  g in failure");.
bea0: 0a 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
beb0: 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b  PCSC_E_GENERIC);
bec0: 0a 7d 0a 0a 73 74 61 74 69 63 20 75 6e 73 69 67  .}..static unsig
bed0: 6e 65 64 20 63 68 61 72 20 2a 63 61 63 6b 65 79  ned char *cackey
bee0: 5f 72 65 61 64 5f 62 65 72 74 6c 76 5f 74 61 67  _read_bertlv_tag
bef0: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  (unsigned char *
bf00: 62 75 66 66 65 72 2c 20 73 69 7a 65 5f 74 20 2a  buffer, size_t *
bf10: 62 75 66 66 65 72 5f 6c 65 6e 5f 70 2c 20 75 6e  buffer_len_p, un
bf20: 73 69 67 6e 65 64 20 63 68 61 72 20 74 61 67 2c  signed char tag,
bf30: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
bf40: 6f 75 74 62 75 66 66 65 72 2c 20 73 69 7a 65 5f  outbuffer, size_
bf50: 74 20 2a 6f 75 74 62 75 66 66 65 72 5f 6c 65 6e  t *outbuffer_len
bf60: 5f 70 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20  _p) {..unsigned 
bf70: 63 68 61 72 20 2a 62 75 66 66 65 72 5f 70 3b 0a  char *buffer_p;.
bf80: 09 73 69 7a 65 5f 74 20 6f 75 74 62 75 66 66 65  .size_t outbuffe
bf90: 72 5f 6c 65 6e 2c 20 62 75 66 66 65 72 5f 6c 65  r_len, buffer_le
bfa0: 6e 3b 0a 09 73 69 7a 65 5f 74 20 73 69 7a 65 3b  n;..size_t size;
bfb0: 0a 09 69 6e 74 20 69 64 78 3b 0a 0a 09 43 41 43  ..int idx;...CAC
bfc0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
bfd0: 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
bfe0: 66 20 28 62 75 66 66 65 72 5f 6c 65 6e 5f 70 20  f (buffer_len_p 
bff0: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43  == NULL) {...CAC
c000: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
c010: 28 22 62 75 66 66 65 72 5f 6c 65 6e 5f 70 20 69  ("buffer_len_p i
c020: 73 20 4e 55 4c 4c 2e 20 20 52 65 74 75 72 6e 69  s NULL.  Returni
c030: 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 2e 22 29  ng in failure.")
c040: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c  ;....return(NULL
c050: 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 6f 75 74 62  );..}...if (outb
c060: 75 66 66 65 72 5f 6c 65 6e 5f 70 20 3d 3d 20 4e  uffer_len_p == N
c070: 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
c080: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 6f 75  DEBUG_PRINTF("ou
c090: 74 62 75 66 66 65 72 5f 6c 65 6e 5f 70 20 69 73  tbuffer_len_p is
c0a0: 20 4e 55 4c 4c 2e 20 20 52 65 74 75 72 6e 69 6e   NULL.  Returnin
c0b0: 67 20 69 6e 20 66 61 69 6c 75 72 65 2e 22 29 3b  g in failure.");
c0c0: 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29  ....return(NULL)
c0d0: 3b 0a 09 7d 0a 0a 09 62 75 66 66 65 72 5f 6c 65  ;..}...buffer_le
c0e0: 6e 20 3d 20 2a 6f 75 74 62 75 66 66 65 72 5f 6c  n = *outbuffer_l
c0f0: 65 6e 5f 70 3b 0a 09 6f 75 74 62 75 66 66 65 72  en_p;..outbuffer
c100: 5f 6c 65 6e 20 3d 20 2a 6f 75 74 62 75 66 66 65  _len = *outbuffe
c110: 72 5f 6c 65 6e 5f 70 3b 0a 0a 09 69 66 20 28 62  r_len_p;...if (b
c120: 75 66 66 65 72 5f 6c 65 6e 20 3c 20 32 29 20 7b  uffer_len < 2) {
c130: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
c140: 50 52 49 4e 54 46 28 22 62 75 66 66 65 72 5f 6c  PRINTF("buffer_l
c150: 65 6e 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  en is less than 
c160: 32 2c 20 73 6f 20 77 65 20 63 61 6e 27 74 20 72  2, so we can't r
c170: 65 61 64 20 61 6e 79 20 74 61 67 2e 20 20 52 65  ead any tag.  Re
c180: 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
c190: 72 65 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  re.");....return
c1a0: 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 62 75 66  (NULL);..}...buf
c1b0: 66 65 72 5f 70 20 3d 20 62 75 66 66 65 72 3b 0a  fer_p = buffer;.
c1c0: 09 69 66 20 28 62 75 66 66 65 72 5f 70 5b 30 5d  .if (buffer_p[0]
c1d0: 20 21 3d 20 74 61 67 29 20 7b 0a 09 09 43 41 43   != tag) {...CAC
c1e0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
c1f0: 28 22 54 61 67 20 66 6f 75 6e 64 20 77 61 73 20  ("Tag found was 
c200: 6e 6f 74 20 74 61 67 20 65 78 70 65 63 74 65 64  not tag expected
c210: 2e 20 20 54 61 67 20 3d 20 25 30 32 78 2c 20 45  .  Tag = %02x, E
c220: 78 70 65 63 74 65 64 20 3d 20 25 30 32 78 2e 20  xpected = %02x. 
c230: 20 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61   Returning in fa
c240: 69 6c 75 72 65 2e 22 2c 20 28 75 6e 73 69 67 6e  ilure.", (unsign
c250: 65 64 20 69 6e 74 29 20 62 75 66 66 65 72 5f 70  ed int) buffer_p
c260: 5b 30 5d 2c 20 74 61 67 29 3b 0a 0a 09 09 72 65  [0], tag);....re
c270: 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a  turn(NULL);..}..
c280: 09 62 75 66 66 65 72 5f 70 2b 2b 3b 0a 09 62 75  .buffer_p++;..bu
c290: 66 66 65 72 5f 6c 65 6e 2d 2d 3b 0a 0a 09 69 66  ffer_len--;...if
c2a0: 20 28 28 62 75 66 66 65 72 5f 70 5b 30 5d 20 26   ((buffer_p[0] &
c2b0: 20 30 78 38 30 29 20 3d 3d 20 30 78 38 30 29 20   0x80) == 0x80) 
c2c0: 7b 0a 09 09 73 69 7a 65 20 3d 20 30 3b 0a 09 09  {...size = 0;...
c2d0: 69 64 78 20 3d 20 28 62 75 66 66 65 72 5f 70 5b  idx = (buffer_p[
c2e0: 30 5d 20 26 20 30 78 37 66 29 3b 0a 0a 09 09 69  0] & 0x7f);....i
c2f0: 66 20 28 69 64 78 20 3e 20 62 75 66 66 65 72 5f  f (idx > buffer_
c300: 6c 65 6e 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  len) {....CACKEY
c310: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4d  _DEBUG_PRINTF("M
c320: 61 6c 66 6f 72 6d 65 64 20 42 45 52 20 76 61 6c  alformed BER val
c330: 75 65 20 2d 2d 20 6e 6f 74 20 65 6e 6f 75 67 68  ue -- not enough
c340: 20 62 79 74 65 73 20 61 76 61 69 6c 61 62 6c 65   bytes available
c350: 20 74 6f 20 72 65 61 64 20 6c 65 6e 67 74 68 20   to read length 
c360: 28 69 64 78 20 3d 20 25 69 2c 20 62 75 66 66 65  (idx = %i, buffe
c370: 72 5f 6c 65 6e 20 3d 20 25 6c 75 29 22 2c 20 69  r_len = %lu)", i
c380: 64 78 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  dx, (unsigned lo
c390: 6e 67 29 20 62 75 66 66 65 72 5f 6c 65 6e 29 3b  ng) buffer_len);
c3a0: 0a 0a 09 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c  .....return(NULL
c3b0: 29 3b 0a 09 09 7d 0a 0a 09 09 66 6f 72 20 28 3b  );...}....for (;
c3c0: 20 69 64 78 20 3e 20 30 3b 20 69 64 78 2d 2d 29   idx > 0; idx--)
c3d0: 20 7b 0a 09 09 09 62 75 66 66 65 72 5f 70 2b 2b   {....buffer_p++
c3e0: 3b 0a 09 09 09 62 75 66 66 65 72 5f 6c 65 6e 2d  ;....buffer_len-
c3f0: 2d 3b 0a 0a 09 09 09 73 69 7a 65 20 3c 3c 3d 20  -;.....size <<= 
c400: 38 3b 0a 09 09 09 73 69 7a 65 20 7c 3d 20 62 75  8;....size |= bu
c410: 66 66 65 72 5f 70 5b 30 5d 3b 0a 09 09 7d 0a 09  ffer_p[0];...}..
c420: 7d 20 65 6c 73 65 20 7b 0a 09 09 73 69 7a 65 20  } else {...size 
c430: 3d 20 62 75 66 66 65 72 5f 70 5b 30 5d 3b 0a 09  = buffer_p[0];..
c440: 7d 0a 0a 09 62 75 66 66 65 72 5f 70 2b 2b 3b 0a  }...buffer_p++;.
c450: 09 62 75 66 66 65 72 5f 6c 65 6e 2d 2d 3b 0a 0a  .buffer_len--;..
c460: 09 69 66 20 28 73 69 7a 65 20 3e 20 6f 75 74 62  .if (size > outb
c470: 75 66 66 65 72 5f 6c 65 6e 29 20 7b 0a 09 09 43  uffer_len) {...C
c480: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
c490: 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 63 6f  TF("Unable to co
c4a0: 70 79 20 76 61 6c 75 65 20 62 75 66 66 65 72 20  py value buffer 
c4b0: 74 6f 20 6f 75 74 62 75 66 66 65 72 2c 20 6e 6f  to outbuffer, no
c4c0: 74 20 65 6e 6f 75 67 68 20 72 6f 6f 6d 2e 20 20  t enough room.  
c4d0: 56 61 6c 75 65 20 62 75 66 66 65 72 20 6c 65 6e  Value buffer len
c4e0: 67 74 68 20 3d 20 25 6c 75 2c 20 6f 75 74 20 62  gth = %lu, out b
c4f0: 75 66 66 65 72 20 6c 65 6e 67 74 68 20 3d 20 25  uffer length = %
c500: 6c 75 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  lu", (unsigned l
c510: 6f 6e 67 29 20 73 69 7a 65 2c 20 28 75 6e 73 69  ong) size, (unsi
c520: 67 6e 65 64 20 6c 6f 6e 67 29 20 6f 75 74 62 75  gned long) outbu
c530: 66 66 65 72 5f 6c 65 6e 29 3b 0a 0a 09 09 72 65  ffer_len);....re
c540: 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a  turn(NULL);..}..
c550: 09 2a 6f 75 74 62 75 66 66 65 72 5f 6c 65 6e 5f  .*outbuffer_len_
c560: 70 20 3d 20 73 69 7a 65 3b 0a 09 69 66 20 28 6f  p = size;..if (o
c570: 75 74 62 75 66 66 65 72 29 20 7b 0a 09 09 6d 65  utbuffer) {...me
c580: 6d 63 70 79 28 6f 75 74 62 75 66 66 65 72 2c 20  mcpy(outbuffer, 
c590: 62 75 66 66 65 72 5f 70 2c 20 73 69 7a 65 29 3b  buffer_p, size);
c5a0: 0a 09 09 62 75 66 66 65 72 5f 70 20 2b 3d 20 73  ...buffer_p += s
c5b0: 69 7a 65 3b 0a 09 09 62 75 66 66 65 72 5f 6c 65  ize;...buffer_le
c5c0: 6e 20 2d 3d 20 73 69 7a 65 3b 0a 0a 09 09 2a 62  n -= size;....*b
c5d0: 75 66 66 65 72 5f 6c 65 6e 5f 70 20 3d 20 62 75  uffer_len_p = bu
c5e0: 66 66 65 72 5f 6c 65 6e 3b 0a 0a 09 09 43 41 43  ffer_len;....CAC
c5f0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42  KEY_DEBUG_PRINTB
c600: 55 46 28 22 42 45 52 2d 54 4c 56 20 72 65 73 75  UF("BER-TLV resu
c610: 6c 74 73 3a 22 2c 20 6f 75 74 62 75 66 66 65 72  lts:", outbuffer
c620: 2c 20 73 69 7a 65 29 3b 0a 09 7d 20 65 6c 73 65  , size);..} else
c630: 20 7b 0a 09 09 6d 65 6d 6d 6f 76 65 28 62 75 66   {...memmove(buf
c640: 66 65 72 2c 20 62 75 66 66 65 72 5f 70 2c 20 73  fer, buffer_p, s
c650: 69 7a 65 29 3b 0a 09 09 62 75 66 66 65 72 5f 70  ize);...buffer_p
c660: 20 3d 20 62 75 66 66 65 72 3b 0a 0a 09 09 43 41   = buffer;....CA
c670: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
c680: 42 55 46 28 22 42 45 52 2d 54 4c 56 20 72 65 73  BUF("BER-TLV res
c690: 75 6c 74 73 3a 22 2c 20 62 75 66 66 65 72 2c 20  ults:", buffer, 
c6a0: 73 69 7a 65 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  size);..}...CACK
c6b0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
c6c0: 22 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 73 75  "Returning in su
c6d0: 63 63 65 73 73 2e 20 20 53 69 7a 65 20 6f 66 20  ccess.  Size of 
c6e0: 63 6f 6e 74 65 6e 74 73 20 66 6f 72 20 74 61 67  contents for tag
c6f0: 20 25 30 32 78 20 69 73 20 25 6c 75 22 2c 20 28   %02x is %lu", (
c700: 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 74 61  unsigned int) ta
c710: 67 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  g, (unsigned lon
c720: 67 29 20 73 69 7a 65 29 3b 0a 0a 09 72 65 74 75  g) size);...retu
c730: 72 6e 28 62 75 66 66 65 72 5f 70 29 3b 0a 7d 0a  rn(buffer_p);.}.
c740: 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a  ./*. * SYNPOSIS.
c750: 20 2a 20 20 20 20 20 73 73 69 7a 65 5f 74 20 63   *     ssize_t c
c760: 61 63 6b 65 79 5f 67 65 74 5f 64 61 74 61 28 73  ackey_get_data(s
c770: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f  truct cackey_slo
c780: 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65  t *slot, unsigne
c790: 64 20 63 68 61 72 20 2a 62 75 66 66 65 72 2c 20  d char *buffer, 
c7a0: 73 69 7a 65 5f 74 20 62 75 66 66 65 72 5f 6c 65  size_t buffer_le
c7b0: 6e 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  n, unsigned char
c7c0: 20 6f 69 64 5b 33 5d 29 3b 0a 20 2a 0a 20 2a 20   oid[3]);. *. * 
c7d0: 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20  ARGUMENTS. *    
c7e0: 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73   struct cackey_s
c7f0: 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20  lot *slot. *    
c800: 20 20 20 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e       Slot to sen
c810: 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a  d commands to. *
c820: 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64  . *     unsigned
c830: 20 63 68 61 72 20 2a 62 75 66 66 65 72 0a 20 2a   char *buffer. *
c840: 20 20 20 20 20 20 20 20 20 5b 4f 55 54 5d 20 42           [OUT] B
c850: 75 66 66 65 72 0a 20 2a 0a 20 2a 20 20 20 20 20  uffer. *. *     
c860: 73 69 7a 65 5f 74 20 62 75 66 66 65 72 5f 6c 65  size_t buffer_le
c870: 6e 0a 20 2a 20 20 20 20 20 20 20 20 20 4e 75 6d  n. *         Num
c880: 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20  ber of bytes to 
c890: 61 74 74 65 6d 70 74 20 74 6f 20 72 65 61 64 0a  attempt to read.
c8a0: 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e   *. *     unsign
c8b0: 65 64 20 63 68 61 72 20 6f 69 64 5b 33 5d 0a 20  ed char oid[3]. 
c8c0: 2a 20 20 20 20 20 20 20 20 20 33 2d 62 79 74 65  *         3-byte
c8d0: 20 4f 49 44 20 74 6f 20 72 65 61 64 0a 20 2a 0a   OID to read. *.
c8e0: 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c   *. * RETURN VAL
c8f0: 55 45 0a 20 2a 20 20 20 20 20 54 68 69 73 20 66  UE. *     This f
c900: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
c910: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
c920: 74 65 73 20 61 63 74 75 61 6c 6c 79 20 72 65 61  tes actually rea
c930: 64 2c 20 6f 72 20 2d 31 20 6f 6e 20 65 72 72 6f  d, or -1 on erro
c940: 72 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20  r.. *. * NOTES. 
c950: 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a  *     None. *. *
c960: 2f 0a 73 74 61 74 69 63 20 73 73 69 7a 65 5f 74  /.static ssize_t
c970: 20 63 61 63 6b 65 79 5f 67 65 74 5f 64 61 74 61   cackey_get_data
c980: 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73  (struct cackey_s
c990: 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67  lot *slot, unsig
c9a0: 6e 65 64 20 63 68 61 72 20 2a 62 75 66 66 65 72  ned char *buffer
c9b0: 2c 20 73 69 7a 65 5f 74 20 62 75 66 66 65 72 5f  , size_t buffer_
c9c0: 6c 65 6e 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  len, unsigned ch
c9d0: 61 72 20 6f 69 64 5b 33 5d 29 20 7b 0a 09 75 6e  ar oid[3]) {..un
c9e0: 73 69 67 6e 65 64 20 63 68 61 72 20 63 6d 64 5b  signed char cmd[
c9f0: 5d 20 3d 20 7b 30 78 35 43 2c 20 30 78 30 33 2c  ] = {0x5C, 0x03,
ca00: 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30   0x00, 0x00, 0x0
ca10: 30 7d 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68  0};..unsigned ch
ca20: 61 72 20 2a 62 75 66 66 65 72 5f 70 3b 0a 09 73  ar *buffer_p;..s
ca30: 69 7a 65 5f 74 20 69 6e 69 74 5f 62 75 66 66 65  ize_t init_buffe
ca40: 72 5f 6c 65 6e 2c 20 73 69 7a 65 3b 0a 09 75 69  r_len, size;..ui
ca50: 6e 74 31 36 5f 74 20 72 65 73 70 63 6f 64 65 3b  nt16_t respcode;
ca60: 0a 09 69 6e 74 20 73 65 6e 64 5f 72 65 74 3b 0a  ..int send_ret;.
ca70: 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
ca80: 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
ca90: 3b 0a 0a 09 69 6e 69 74 5f 62 75 66 66 65 72 5f  ;...init_buffer_
caa0: 6c 65 6e 20 3d 20 62 75 66 66 65 72 5f 6c 65 6e  len = buffer_len
cab0: 3b 0a 0a 09 63 6d 64 5b 32 5d 20 3d 20 6f 69 64  ;...cmd[2] = oid
cac0: 5b 30 5d 3b 0a 09 63 6d 64 5b 33 5d 20 3d 20 6f  [0];..cmd[3] = o
cad0: 69 64 5b 31 5d 3b 0a 09 63 6d 64 5b 34 5d 20 3d  id[1];..cmd[4] =
cae0: 20 6f 69 64 5b 32 5d 3b 0a 0a 09 2f 2a 20 32 35   oid[2];.../* 25
caf0: 36 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68  6 to indicate th
cb00: 65 20 6c 61 72 67 65 73 74 20 6d 65 73 73 61 67  e largest messag
cb10: 65 20 73 69 7a 65 20 2d 2d 20 6e 6f 74 20 63 6c  e size -- not cl
cb20: 65 61 72 20 69 66 20 74 68 69 73 20 77 69 6c 6c  ear if this will
cb30: 20 77 6f 72 6b 20 77 69 74 68 20 61 6c 6c 20 6d   work with all m
cb40: 65 73 73 61 67 65 73 20 2a 2f 0a 09 73 65 6e 64  essages */..send
cb50: 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65  _ret = cackey_se
cb60: 6e 64 5f 61 70 64 75 28 73 6c 6f 74 2c 20 47 53  nd_apdu(slot, GS
cb70: 43 49 53 5f 43 4c 41 53 53 5f 49 53 4f 37 38 31  CIS_CLASS_ISO781
cb80: 36 2c 20 4e 49 53 54 53 50 38 30 30 5f 37 33 5f  6, NISTSP800_73_
cb90: 33 5f 49 4e 53 54 52 5f 47 45 54 5f 44 41 54 41  3_INSTR_GET_DATA
cba0: 2c 20 30 78 33 46 2c 20 30 78 46 46 2c 20 73 69  , 0x3F, 0xFF, si
cbb0: 7a 65 6f 66 28 63 6d 64 29 2c 20 63 6d 64 2c 20  zeof(cmd), cmd, 
cbc0: 32 35 36 2c 20 26 72 65 73 70 63 6f 64 65 2c 20  256, &respcode, 
cbd0: 62 75 66 66 65 72 2c 20 26 62 75 66 66 65 72 5f  buffer, &buffer_
cbe0: 6c 65 6e 29 3b 0a 0a 09 69 66 20 28 73 65 6e 64  len);...if (send
cbf0: 5f 72 65 74 20 3d 3d 20 43 41 43 4b 45 59 5f 50  _ret == CACKEY_P
cc00: 43 53 43 5f 45 5f 52 45 54 52 59 29 20 7b 0a 09  CSC_E_RETRY) {..
cc10: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
cc20: 49 4e 54 46 28 22 41 44 50 55 20 53 65 6e 64 69  INTF("ADPU Sendi
cc30: 6e 67 20 66 61 69 6c 65 64 2c 20 72 65 74 72 79  ng failed, retry
cc40: 69 6e 67 20 72 65 61 64 20 62 75 66 66 65 72 22  ing read buffer"
cc50: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 63 61 63  );....return(cac
cc60: 6b 65 79 5f 67 65 74 5f 64 61 74 61 28 73 6c 6f  key_get_data(slo
cc70: 74 2c 20 62 75 66 66 65 72 2c 20 69 6e 69 74 5f  t, buffer, init_
cc80: 62 75 66 66 65 72 5f 6c 65 6e 2c 20 6f 69 64 29  buffer_len, oid)
cc90: 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 65 6e 64  );..}...if (send
cca0: 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50  _ret != CACKEY_P
ccb0: 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41  CSC_S_OK) {...CA
ccc0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
ccd0: 46 28 22 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61  F("cackey_send_a
cce0: 70 64 75 28 29 20 66 61 69 6c 65 64 2c 20 72 65  pdu() failed, re
ccf0: 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
cd00: 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  re");....return(
cd10: 2d 31 29 3b 0a 09 7d 0a 0a 23 69 66 64 65 66 20  -1);..}..#ifdef 
cd20: 43 41 43 4b 45 59 5f 50 41 52 41 4e 4f 49 44 0a  CACKEY_PARANOID.
cd30: 23 20 20 69 66 64 65 66 20 5f 50 4f 53 49 58 5f  #  ifdef _POSIX_
cd40: 53 53 49 5a 45 5f 4d 41 58 0a 09 69 66 20 28 62  SSIZE_MAX..if (b
cd50: 75 66 66 65 72 5f 6c 65 6e 20 3e 20 5f 50 4f 53  uffer_len > _POS
cd60: 49 58 5f 53 53 49 5a 45 5f 4d 41 58 29 20 7b 0a  IX_SSIZE_MAX) {.
cd70: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
cd80: 52 49 4e 54 46 28 22 52 65 61 64 20 62 79 74 65  RINTF("Read byte
cd90: 73 20 28 62 75 66 66 65 72 5f 6c 65 6e 29 20 65  s (buffer_len) e
cda0: 78 63 65 65 64 73 20 6d 61 78 69 6d 75 6d 20 76  xceeds maximum v
cdb0: 61 6c 75 65 2c 20 72 65 74 75 72 6e 69 6e 67 20  alue, returning 
cdc0: 69 6e 20 66 61 69 6c 75 72 65 2e 20 28 6d 61 78  in failure. (max
cdd0: 20 3d 20 25 6c 69 2c 20 62 75 66 66 65 72 5f 6c   = %li, buffer_l
cde0: 65 6e 20 3d 20 25 6c 75 29 22 2c 20 28 6c 6f 6e  en = %lu)", (lon
cdf0: 67 29 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f  g) _POSIX_SSIZE_
ce00: 4d 41 58 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  MAX, (unsigned l
ce10: 6f 6e 67 29 20 62 75 66 66 65 72 5f 6c 65 6e 29  ong) buffer_len)
ce20: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b  ;....return(-1);
ce30: 0a 09 7d 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e  ..}.#  endif.#en
ce40: 64 69 66 0a 0a 09 69 66 20 28 62 75 66 66 65 72  dif...if (buffer
ce50: 5f 6c 65 6e 20 3c 20 32 29 20 7b 0a 09 09 43 41  _len < 2) {...CA
ce60: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
ce70: 46 28 22 41 50 44 55 20 47 45 54 20 44 41 54 41  F("APDU GET DATA
ce80: 20 72 65 74 75 72 6e 65 64 20 25 6c 75 20 62 79   returned %lu by
ce90: 74 65 73 2c 20 77 68 69 63 68 20 69 73 20 74 6f  tes, which is to
cea0: 6f 20 73 68 6f 72 74 20 66 6f 72 20 61 20 42 45  o short for a BE
ceb0: 52 2d 54 4c 56 20 72 65 73 70 6f 6e 73 65 22 2c  R-TLV response",
cec0: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
ced0: 20 62 75 66 66 65 72 5f 6c 65 6e 29 3b 0a 0a 09   buffer_len);...
cee0: 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a  .return(-1);..}.
cef0: 0a 09 73 69 7a 65 20 3d 20 62 75 66 66 65 72 5f  ..size = buffer_
cf00: 6c 65 6e 3b 0a 09 62 75 66 66 65 72 5f 70 20 3d  len;..buffer_p =
cf10: 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 62 65 72   cackey_read_ber
cf20: 74 6c 76 5f 74 61 67 28 62 75 66 66 65 72 2c 20  tlv_tag(buffer, 
cf30: 26 62 75 66 66 65 72 5f 6c 65 6e 2c 20 30 78 35  &buffer_len, 0x5
cf40: 33 2c 20 4e 55 4c 4c 2c 20 26 73 69 7a 65 29 3b  3, NULL, &size);
cf50: 0a 0a 09 69 66 20 28 62 75 66 66 65 72 5f 70 20  ...if (buffer_p 
cf60: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43  == NULL) {...CAC
cf70: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
cf80: 28 22 54 61 67 20 64 65 63 6f 64 69 6e 67 20 66  ("Tag decoding f
cf90: 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 69 6e 67  ailed, returning
cfa0: 20 69 6e 20 65 72 72 6f 72 2e 22 29 3b 0a 0a 09   in error.");...
cfb0: 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a  .return(-1);..}.
cfc0: 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
cfd0: 52 49 4e 54 42 55 46 28 22 47 45 54 20 44 41 54  RINTBUF("GET DAT
cfe0: 41 20 72 65 73 75 6c 74 22 2c 20 62 75 66 66 65  A result", buffe
cff0: 72 2c 20 73 69 7a 65 29 3b 0a 0a 09 43 41 43 4b  r, size);...CACK
d000: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
d010: 22 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 73 75  "Returning in su
d020: 63 63 65 73 73 2c 20 72 65 61 64 20 25 6c 75 20  ccess, read %lu 
d030: 62 79 74 65 73 22 2c 20 28 75 6e 73 69 67 6e 65  bytes", (unsigne
d040: 64 20 6c 6f 6e 67 29 20 73 69 7a 65 29 3b 0a 0a  d long) size);..
d050: 09 72 65 74 75 72 6e 28 73 69 7a 65 29 3b 0a 7d  .return(size);.}
d060: 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53  ../*. * SYNPOSIS
d070: 0a 20 2a 20 20 20 20 20 73 73 69 7a 65 5f 74 20  . *     ssize_t 
d080: 63 61 63 6b 65 79 5f 72 65 61 64 5f 62 75 66 66  cackey_read_buff
d090: 65 72 28 73 74 72 75 63 74 20 63 61 63 6b 65 79  er(struct cackey
d0a0: 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73  _slot *slot, uns
d0b0: 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 66  igned char *buff
d0c0: 65 72 2c 20 73 69 7a 65 5f 74 20 63 6f 75 6e 74  er, size_t count
d0d0: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
d0e0: 74 5f 6f 72 5f 76 2c 20 73 69 7a 65 5f 74 20 69  t_or_v, size_t i
d0f0: 6e 69 74 69 61 6c 5f 6f 66 66 73 65 74 29 3b 0a  nitial_offset);.
d100: 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a   *. * ARGUMENTS.
d110: 20 2a 20 20 20 20 20 73 74 72 75 63 74 20 63 61   *     struct ca
d120: 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a  ckey_slot *slot.
d130: 20 2a 20 20 20 20 20 20 20 20 20 53 6c 6f 74 20   *         Slot 
d140: 74 6f 20 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 73  to send commands
d150: 20 74 6f 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e   to. *. *     un
d160: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66  signed char *buf
d170: 66 65 72 0a 20 2a 20 20 20 20 20 20 20 20 20 5b  fer. *         [
d180: 4f 55 54 5d 20 42 75 66 66 65 72 0a 20 2a 0a 20  OUT] Buffer. *. 
d190: 2a 20 20 20 20 20 73 69 7a 65 5f 74 20 63 6f 75  *     size_t cou
d1a0: 6e 74 0a 20 2a 20 20 20 20 20 20 20 20 20 4e 75  nt. *         Nu
d1b0: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f  mber of bytes to
d1c0: 20 61 74 74 65 6d 70 74 20 74 6f 20 72 65 61 64   attempt to read
d1d0: 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67  . *. *     unsig
d1e0: 6e 65 64 20 63 68 61 72 20 74 5f 6f 72 5f 76 0a  ned char t_or_v.
d1f0: 20 2a 20 20 20 20 20 20 20 20 20 53 65 6c 65 63   *         Selec
d200: 74 20 74 68 65 20 54 2d 62 75 66 66 65 72 20 28  t the T-buffer (
d210: 30 31 29 20 6f 72 20 56 2d 62 75 66 66 65 72 20  01) or V-buffer 
d220: 28 30 32 29 20 74 6f 20 72 65 61 64 20 66 72 6f  (02) to read fro
d230: 6d 2e 20 20 0a 20 2a 0a 20 2a 20 20 20 20 20 73  m.  . *. *     s
d240: 69 7a 65 5f 74 20 69 6e 69 74 69 61 6c 5f 6f 66  ize_t initial_of
d250: 66 73 65 74 0a 20 2a 20 20 20 20 20 20 20 20 20  fset. *         
d260: 53 70 65 63 69 66 79 20 74 68 65 20 6f 66 66 73  Specify the offs
d270: 65 74 20 74 6f 20 62 65 67 69 6e 20 74 68 65 20  et to begin the 
d280: 72 65 61 64 20 66 72 6f 6d 0a 20 2a 0a 20 2a 0a  read from. *. *.
d290: 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a   * RETURN VALUE.
d2a0: 20 2a 20 20 20 20 20 54 68 69 73 20 66 75 6e 63   *     This func
d2b0: 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65  tion returns the
d2c0: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
d2d0: 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64 2c 20   actually read, 
d2e0: 6f 72 20 2d 31 20 6f 6e 20 65 72 72 6f 72 2e 0a  or -1 on error..
d2f0: 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20   *. * NOTES. *  
d300: 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 2f 0a 73     None. *. */.s
d310: 74 61 74 69 63 20 73 73 69 7a 65 5f 74 20 63 61  tatic ssize_t ca
d320: 63 6b 65 79 5f 72 65 61 64 5f 62 75 66 66 65 72  ckey_read_buffer
d330: 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73  (struct cackey_s
d340: 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67  lot *slot, unsig
d350: 6e 65 64 20 63 68 61 72 20 2a 62 75 66 66 65 72  ned char *buffer
d360: 2c 20 73 69 7a 65 5f 74 20 63 6f 75 6e 74 2c 20  , size_t count, 
d370: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 74 5f  unsigned char t_
d380: 6f 72 5f 76 2c 20 73 69 7a 65 5f 74 20 69 6e 69  or_v, size_t ini
d390: 74 69 61 6c 5f 6f 66 66 73 65 74 29 20 7b 0a 09  tial_offset) {..
d3a0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 69  unsigned char *i
d3b0: 6e 69 74 5f 62 75 66 66 65 72 3b 0a 09 73 69 7a  nit_buffer;..siz
d3c0: 65 5f 74 20 69 6e 69 74 5f 63 6f 75 6e 74 3b 0a  e_t init_count;.
d3d0: 09 73 69 7a 65 5f 74 20 69 6e 69 74 5f 69 6e 69  .size_t init_ini
d3e0: 74 69 61 6c 5f 6f 66 66 73 65 74 3b 0a 0a 09 73  tial_offset;...s
d3f0: 69 7a 65 5f 74 20 6f 66 66 73 65 74 20 3d 20 30  ize_t offset = 0
d400: 2c 20 6d 61 78 5f 6f 66 66 73 65 74 2c 20 6d 61  , max_offset, ma
d410: 78 5f 63 6f 75 6e 74 3b 0a 09 75 6e 73 69 67 6e  x_count;..unsign
d420: 65 64 20 63 68 61 72 20 63 6d 64 5b 32 5d 3b 0a  ed char cmd[2];.
d430: 09 75 69 6e 74 31 36 5f 74 20 72 65 73 70 63 6f  .uint16_t respco
d440: 64 65 3b 0a 09 69 6e 74 20 73 65 6e 64 5f 72 65  de;..int send_re
d450: 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  t;...CACKEY_DEBU
d460: 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
d470: 2e 22 29 3b 0a 0a 09 69 6e 69 74 5f 62 75 66 66  .");...init_buff
d480: 65 72 20 3d 20 62 75 66 66 65 72 3b 0a 09 69 6e  er = buffer;..in
d490: 69 74 5f 63 6f 75 6e 74 20 3d 20 63 6f 75 6e 74  it_count = count
d4a0: 3b 0a 09 69 6e 69 74 5f 69 6e 69 74 69 61 6c 5f  ;..init_initial_
d4b0: 6f 66 66 73 65 74 20 3d 20 69 6e 69 74 69 61 6c  offset = initial
d4c0: 5f 6f 66 66 73 65 74 3b 0a 0a 09 6d 61 78 5f 6f  _offset;...max_o
d4d0: 66 66 73 65 74 20 3d 20 63 6f 75 6e 74 3b 0a 09  ffset = count;..
d4e0: 6d 61 78 5f 63 6f 75 6e 74 20 3d 20 43 41 43 4b  max_count = CACK
d4f0: 45 59 5f 41 50 44 55 5f 4d 54 55 3b 0a 0a 09 69  EY_APDU_MTU;...i
d500: 66 20 28 74 5f 6f 72 5f 76 20 21 3d 20 31 20 26  f (t_or_v != 1 &
d510: 26 20 74 5f 6f 72 5f 76 20 21 3d 20 32 29 20 7b  & t_or_v != 2) {
d520: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
d530: 50 52 49 4e 54 46 28 22 49 6e 76 61 6c 69 64 20  PRINTF("Invalid 
d540: 54 20 6f 72 20 56 20 70 61 72 61 6d 65 74 65 72  T or V parameter
d550: 20 73 70 65 63 69 66 69 65 64 2c 20 72 65 74 75   specified, retu
d560: 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65  rning in failure
d570: 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31  ");....return(-1
d580: 29 3b 0a 09 7d 0a 0a 09 63 6d 64 5b 30 5d 20 3d  );..}...cmd[0] =
d590: 20 74 5f 6f 72 5f 76 3b 0a 0a 09 77 68 69 6c 65   t_or_v;...while
d5a0: 20 28 31 29 20 7b 0a 09 09 69 66 20 28 6f 66 66   (1) {...if (off
d5b0: 73 65 74 20 3e 3d 20 6d 61 78 5f 6f 66 66 73 65  set >= max_offse
d5c0: 74 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  t) {....CACKEY_D
d5d0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 42 75 66  EBUG_PRINTF("Buf
d5e0: 66 65 72 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20 72  fer too small, r
d5f0: 65 74 75 72 6e 69 6e 67 20 77 68 61 74 20 77 65  eturning what we
d600: 20 67 6f 74 2e 2e 2e 22 29 3b 0a 0a 09 09 09 62   got...");.....b
d610: 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09 63 6f 75  reak;...}....cou
d620: 6e 74 20 3d 20 6d 61 78 5f 6f 66 66 73 65 74 20  nt = max_offset 
d630: 2d 20 6f 66 66 73 65 74 3b 0a 09 09 69 66 20 28  - offset;...if (
d640: 63 6f 75 6e 74 20 3e 20 6d 61 78 5f 63 6f 75 6e  count > max_coun
d650: 74 29 20 7b 0a 09 09 09 63 6f 75 6e 74 20 3d 20  t) {....count = 
d660: 6d 61 78 5f 63 6f 75 6e 74 3b 0a 09 09 7d 0a 0a  max_count;...}..
d670: 09 09 63 6d 64 5b 31 5d 20 3d 20 63 6f 75 6e 74  ..cmd[1] = count
d680: 3b 0a 0a 09 09 73 65 6e 64 5f 72 65 74 20 3d 20  ;....send_ret = 
d690: 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75  cackey_send_apdu
d6a0: 28 73 6c 6f 74 2c 20 47 53 43 49 53 5f 43 4c 41  (slot, GSCIS_CLA
d6b0: 53 53 5f 47 4c 4f 42 41 4c 5f 50 4c 41 54 46 4f  SS_GLOBAL_PLATFO
d6c0: 52 4d 2c 20 47 53 43 49 53 5f 49 4e 53 54 52 5f  RM, GSCIS_INSTR_
d6d0: 52 45 41 44 5f 42 55 46 46 45 52 2c 20 28 28 69  READ_BUFFER, ((i
d6e0: 6e 69 74 69 61 6c 5f 6f 66 66 73 65 74 20 2b 20  nitial_offset + 
d6f0: 6f 66 66 73 65 74 29 20 3e 3e 20 38 29 20 26 20  offset) >> 8) & 
d700: 30 78 66 66 2c 20 28 69 6e 69 74 69 61 6c 5f 6f  0xff, (initial_o
d710: 66 66 73 65 74 20 2b 20 6f 66 66 73 65 74 29 20  ffset + offset) 
d720: 26 20 30 78 66 66 2c 20 73 69 7a 65 6f 66 28 63  & 0xff, sizeof(c
d730: 6d 64 29 2c 20 63 6d 64 2c 20 30 78 30 30 2c 20  md), cmd, 0x00, 
d740: 26 72 65 73 70 63 6f 64 65 2c 20 62 75 66 66 65  &respcode, buffe
d750: 72 20 2b 20 6f 66 66 73 65 74 2c 20 26 63 6f 75  r + offset, &cou
d760: 6e 74 29 3b 0a 0a 09 09 69 66 20 28 73 65 6e 64  nt);....if (send
d770: 5f 72 65 74 20 3d 3d 20 43 41 43 4b 45 59 5f 50  _ret == CACKEY_P
d780: 43 53 43 5f 45 5f 52 45 54 52 59 29 20 7b 0a 09  CSC_E_RETRY) {..
d790: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
d7a0: 52 49 4e 54 46 28 22 41 44 50 55 20 53 65 6e 64  RINTF("ADPU Send
d7b0: 69 6e 67 20 66 61 69 6c 65 64 2c 20 72 65 74 72  ing failed, retr
d7c0: 79 69 6e 67 20 72 65 61 64 20 62 75 66 66 65 72  ying read buffer
d7d0: 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 63  ");.....return(c
d7e0: 61 63 6b 65 79 5f 72 65 61 64 5f 62 75 66 66 65  ackey_read_buffe
d7f0: 72 28 73 6c 6f 74 2c 20 69 6e 69 74 5f 62 75 66  r(slot, init_buf
d800: 66 65 72 2c 20 69 6e 69 74 5f 63 6f 75 6e 74 2c  fer, init_count,
d810: 20 74 5f 6f 72 5f 76 2c 20 69 6e 69 74 5f 69 6e   t_or_v, init_in
d820: 69 74 69 61 6c 5f 6f 66 66 73 65 74 29 29 3b 0a  itial_offset));.
d830: 09 09 7d 0a 0a 09 09 69 66 20 28 73 65 6e 64 5f  ..}....if (send_
d840: 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43  ret != CACKEY_PC
d850: 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 69 66  SC_S_OK) {....if
d860: 20 28 72 65 73 70 63 6f 64 65 20 3d 3d 20 30 78   (respcode == 0x
d870: 36 41 38 36 29 20 7b 0a 09 09 09 09 69 66 20 28  6A86) {.....if (
d880: 6d 61 78 5f 63 6f 75 6e 74 20 3d 3d 20 31 29 20  max_count == 1) 
d890: 7b 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  {......break;...
d8a0: 09 09 7d 0a 0a 09 09 09 09 6d 61 78 5f 63 6f 75  ..}......max_cou
d8b0: 6e 74 20 3d 20 6d 61 78 5f 63 6f 75 6e 74 20 2f  nt = max_count /
d8c0: 20 32 3b 0a 0a 09 09 09 09 63 6f 6e 74 69 6e 75   2;......continu
d8d0: 65 3b 0a 09 09 09 7d 0a 0a 09 09 09 43 41 43 4b  e;....}.....CACK
d8e0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
d8f0: 22 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64  "cackey_send_apd
d900: 75 28 29 20 66 61 69 6c 65 64 2c 20 72 65 74 75  u() failed, retu
d910: 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65  rning in failure
d920: 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 2d  ");.....return(-
d930: 31 29 3b 0a 09 09 7d 0a 0a 09 09 6f 66 66 73 65  1);...}....offse
d940: 74 20 2b 3d 20 63 6f 75 6e 74 3b 0a 0a 09 09 69  t += count;....i
d950: 66 20 28 63 6f 75 6e 74 20 3c 20 6d 61 78 5f 63  f (count < max_c
d960: 6f 75 6e 74 29 20 7b 0a 09 09 09 43 41 43 4b 45  ount) {....CACKE
d970: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
d980: 53 68 6f 72 74 20 72 65 61 64 20 2d 2d 20 63 6f  Short read -- co
d990: 75 6e 74 20 3d 20 25 69 2c 20 63 6d 64 5b 31 5d  unt = %i, cmd[1]
d9a0: 20 3d 20 25 69 22 2c 20 28 69 6e 74 29 20 63 6f   = %i", (int) co
d9b0: 75 6e 74 2c 20 28 69 6e 74 29 20 63 6d 64 5b 31  unt, (int) cmd[1
d9c0: 5d 29 3b 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09  ]);.....break;..
d9d0: 09 7d 0a 09 7d 0a 0a 23 69 66 64 65 66 20 43 41  .}..}..#ifdef CA
d9e0: 43 4b 45 59 5f 50 41 52 41 4e 4f 49 44 0a 23 20  CKEY_PARANOID.# 
d9f0: 20 69 66 64 65 66 20 5f 50 4f 53 49 58 5f 53 53   ifdef _POSIX_SS
da00: 49 5a 45 5f 4d 41 58 0a 09 69 66 20 28 6f 66 66  IZE_MAX..if (off
da10: 73 65 74 20 3e 20 5f 50 4f 53 49 58 5f 53 53 49  set > _POSIX_SSI
da20: 5a 45 5f 4d 41 58 29 20 7b 0a 09 09 43 41 43 4b  ZE_MAX) {...CACK
da30: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
da40: 22 4f 66 66 73 65 74 20 65 78 63 65 65 64 73 20  "Offset exceeds 
da50: 6d 61 78 69 6d 75 6d 20 76 61 6c 75 65 2c 20 72  maximum value, r
da60: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
da70: 75 72 65 2e 20 28 6d 61 78 20 3d 20 25 6c 69 2c  ure. (max = %li,
da80: 20 6f 66 66 73 65 74 20 3d 20 25 6c 75 29 22 2c   offset = %lu)",
da90: 20 28 6c 6f 6e 67 29 20 5f 50 4f 53 49 58 5f 53   (long) _POSIX_S
daa0: 53 49 5a 45 5f 4d 41 58 2c 20 28 75 6e 73 69 67  SIZE_MAX, (unsig
dab0: 6e 65 64 20 6c 6f 6e 67 29 20 6f 66 66 73 65 74  ned long) offset
dac0: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29  );....return(-1)
dad0: 3b 0a 09 7d 0a 23 20 20 65 6e 64 69 66 0a 23 65  ;..}.#  endif.#e
dae0: 6e 64 69 66 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ndif...CACKEY_DE
daf0: 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
db00: 72 6e 69 6e 67 20 69 6e 20 73 75 63 63 65 73 73  rning in success
db10: 2c 20 72 65 61 64 20 25 6c 75 20 62 79 74 65 73  , read %lu bytes
db20: 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
db30: 67 29 20 6f 66 66 73 65 74 29 3b 0a 0a 09 72 65  g) offset);...re
db40: 74 75 72 6e 28 6f 66 66 73 65 74 29 3b 0a 7d 0a  turn(offset);.}.
db50: 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a  ./*. * SYNPOSIS.
db60: 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 72 65   *     cackey_re
db70: 74 20 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f  t cackey_select_
db80: 61 70 70 6c 65 74 28 73 74 72 75 63 74 20 63 61  applet(struct ca
db90: 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c  ckey_slot *slot,
dba0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
dbb0: 61 69 64 2c 20 73 69 7a 65 5f 74 20 61 69 64 5f  aid, size_t aid_
dbc0: 6c 65 6e 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55  len);. *. * ARGU
dbd0: 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 73 74 72  MENTS. *     str
dbe0: 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20  uct cackey_slot 
dbf0: 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20 20  *slot. *        
dc00: 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f   Slot to send co
dc10: 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20  mmands to. *. * 
dc20: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
dc30: 72 20 2a 61 69 64 0a 20 2a 20 20 20 20 20 20 20  r *aid. *       
dc40: 20 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e    Buffer contain
dc50: 69 6e 67 20 41 70 70 6c 65 74 20 49 44 20 74 6f  ing Applet ID to
dc60: 20 73 65 6c 65 63 74 0a 20 2a 0a 20 2a 20 20 20   select. *. *   
dc70: 20 20 73 69 7a 65 5f 74 20 61 69 64 5f 6c 65 6e    size_t aid_len
dc80: 0a 20 2a 20 20 20 20 20 20 20 20 20 4e 75 6d 62  . *         Numb
dc90: 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74  er of bytes in t
dca0: 68 65 20 22 61 69 64 22 20 28 41 70 70 6c 65 74  he "aid" (Applet
dcb0: 20 49 44 29 20 70 61 72 61 6d 65 74 65 72 0a 20   ID) parameter. 
dcc0: 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55  *. * RETURN VALU
dcd0: 45 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f  E. *     CACKEY_
dce0: 50 43 53 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20  PCSC_S_OK       
dcf0: 20 20 4f 6e 20 73 75 63 63 65 73 73 0a 20 2a 20    On success. * 
dd00: 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f      CACKEY_PCSC_
dd10: 45 5f 47 45 4e 45 52 49 43 20 20 20 20 4f 6e 20  E_GENERIC    On 
dd20: 65 72 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45  error. *. * NOTE
dd30: 53 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a  S. *     None. *
dd40: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 61 63 6b  . */.static cack
dd50: 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 73 65  ey_ret cackey_se
dd60: 6c 65 63 74 5f 61 70 70 6c 65 74 28 73 74 72 75  lect_applet(stru
dd70: 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a  ct cackey_slot *
dd80: 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20 63  slot, unsigned c
dd90: 68 61 72 20 2a 61 69 64 2c 20 73 69 7a 65 5f 74  har *aid, size_t
dda0: 20 61 69 64 5f 6c 65 6e 29 20 7b 0a 09 69 6e 74   aid_len) {..int
ddb0: 20 73 65 6e 64 5f 72 65 74 3b 0a 0a 09 43 41 43   send_ret;...CAC
ddc0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
ddd0: 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 43  ("Called.");...C
dde0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
ddf0: 54 42 55 46 28 22 53 65 6c 65 63 74 69 6e 67 20  TBUF("Selecting 
de00: 61 70 70 6c 65 74 3a 22 2c 20 61 69 64 2c 20 61  applet:", aid, a
de10: 69 64 5f 6c 65 6e 29 3b 0a 0a 09 73 65 6e 64 5f  id_len);...send_
de20: 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e  ret = cackey_sen
de30: 64 5f 61 70 64 75 28 73 6c 6f 74 2c 20 47 53 43  d_apdu(slot, GSC
de40: 49 53 5f 43 4c 41 53 53 5f 49 53 4f 37 38 31 36  IS_CLASS_ISO7816
de50: 2c 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 53 45  , GSCIS_INSTR_SE
de60: 4c 45 43 54 2c 20 47 53 43 49 53 5f 50 41 52 41  LECT, GSCIS_PARA
de70: 4d 5f 53 45 4c 45 43 54 5f 41 50 50 4c 45 54 2c  M_SELECT_APPLET,
de80: 20 30 78 30 30 2c 20 61 69 64 5f 6c 65 6e 2c 20   0x00, aid_len, 
de90: 61 69 64 2c 20 30 78 30 30 2c 20 4e 55 4c 4c 2c  aid, 0x00, NULL,
dea0: 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 0a 09   NULL, NULL);...
deb0: 69 66 20 28 73 65 6e 64 5f 72 65 74 20 3d 3d 20  if (send_ret == 
dec0: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 52 45  CACKEY_PCSC_E_RE
ded0: 54 52 59 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  TRY) {...CACKEY_
dee0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 41 44  DEBUG_PRINTF("AD
def0: 50 55 20 53 65 6e 64 69 6e 67 20 66 61 69 6c 65  PU Sending faile
df00: 64 2c 20 72 65 74 72 79 69 6e 67 20 73 65 6c 65  d, retrying sele
df10: 63 74 20 61 70 70 6c 65 74 22 29 3b 0a 0a 09 09  ct applet");....
df20: 72 65 74 75 72 6e 28 63 61 63 6b 65 79 5f 73 65  return(cackey_se
df30: 6c 65 63 74 5f 61 70 70 6c 65 74 28 73 6c 6f 74  lect_applet(slot
df40: 2c 20 61 69 64 2c 20 61 69 64 5f 6c 65 6e 29 29  , aid, aid_len))
df50: 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 65 6e 64 5f  ;..}...if (send_
df60: 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43  ret != CACKEY_PC
df70: 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43  SC_S_OK) {...CAC
df80: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
df90: 28 22 46 61 69 6c 65 64 20 74 6f 20 6f 70 65 6e  ("Failed to open
dfa0: 20 61 70 70 6c 65 74 2c 20 72 65 74 75 72 6e 69   applet, returni
dfb0: 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b  ng in failure");
dfc0: 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ....return(CACKE
dfd0: 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43  Y_PCSC_E_GENERIC
dfe0: 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
dff0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 75 63  EBUG_PRINTF("Suc
e000: 63 65 73 73 66 75 6c 6c 79 20 73 65 6c 65 63 74  cessfully select
e010: 65 64 20 66 69 6c 65 22 29 3b 0a 0a 09 72 65 74  ed file");...ret
e020: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
e030: 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20  S_OK);.}../*. * 
e040: 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20  SYNPOSIS. *     
e050: 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65  cackey_ret cacke
e060: 79 5f 73 65 6c 65 63 74 5f 66 69 6c 65 28 73 74  y_select_file(st
e070: 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74  ruct cackey_slot
e080: 20 2a 73 6c 6f 74 2c 20 75 69 6e 74 31 36 5f 74   *slot, uint16_t
e090: 20 65 66 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55   ef);. *. * ARGU
e0a0: 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 73 74 72  MENTS. *     str
e0b0: 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20  uct cackey_slot 
e0c0: 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20 20  *slot. *        
e0d0: 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f   Slot to send co
e0e0: 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20  mmands to. *. * 
e0f0: 20 20 20 20 75 69 6e 74 31 36 5f 74 20 65 66 0a      uint16_t ef.
e100: 20 2a 20 20 20 20 20 20 20 20 20 45 6c 65 6d 65   *         Eleme
e110: 6e 74 61 6c 20 46 69 6c 65 20 74 6f 20 73 65 6c  ntal File to sel
e120: 65 63 74 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e  ect. *. * RETURN
e130: 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 43 41   VALUE. *     CA
e140: 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20  CKEY_PCSC_S_OK  
e150: 20 20 20 20 20 20 20 4f 6e 20 73 75 63 63 65 73         On succes
e160: 73 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f  s. *     CACKEY_
e170: 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 20 20  PCSC_E_GENERIC  
e180: 20 20 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a 20 2a    On error. *. *
e190: 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 54 68   NOTES. *     Th
e1a0: 69 73 20 73 65 6c 65 63 74 73 20 61 6e 20 45 6c  is selects an El
e1b0: 65 6d 65 6e 74 61 72 79 20 46 69 6c 65 20 28 45  ementary File (E
e1c0: 46 29 20 75 6e 64 65 72 20 74 68 65 20 63 75 72  F) under the cur
e1d0: 72 65 6e 74 6c 79 20 73 65 6c 65 63 74 65 64 0a  rently selected.
e1e0: 20 2a 20 20 20 20 20 44 65 64 69 63 61 74 65 64   *     Dedicated
e1f0: 20 46 69 6c 65 20 28 44 46 29 0a 20 2a 0a 20 2a   File (DF). *. *
e200: 20 20 20 20 20 54 79 70 69 63 61 6c 6c 79 20 74       Typically t
e210: 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 61 66  his is called af
e220: 74 65 72 20 73 65 6c 65 63 74 69 6e 67 20 74 68  ter selecting th
e230: 65 20 63 6f 72 72 65 63 74 20 41 70 70 6c 65 74  e correct Applet
e240: 20 28 75 73 69 6e 67 0a 20 2a 20 20 20 20 20 63   (using. *     c
e250: 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 61 70 70  ackey_select_app
e260: 6c 65 74 29 20 66 6f 72 20 56 4d 20 63 61 72 64  let) for VM card
e270: 73 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20  s. *. */.static 
e280: 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65  cackey_ret cacke
e290: 79 5f 73 65 6c 65 63 74 5f 66 69 6c 65 28 73 74  y_select_file(st
e2a0: 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74  ruct cackey_slot
e2b0: 20 2a 73 6c 6f 74 2c 20 75 69 6e 74 31 36 5f 74   *slot, uint16_t
e2c0: 20 65 66 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64   ef) {..unsigned
e2d0: 20 63 68 61 72 20 66 69 64 5f 62 75 66 5b 32 5d   char fid_buf[2]
e2e0: 3b 0a 09 69 6e 74 20 73 65 6e 64 5f 72 65 74 3b  ;..int send_ret;
e2f0: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
e300: 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
e310: 29 3b 0a 0a 09 2f 2a 20 4f 70 65 6e 20 74 68 65  );.../* Open the
e320: 20 65 6c 65 6d 65 6e 74 61 72 79 20 66 69 6c 65   elementary file
e330: 20 2a 2f 0a 09 66 69 64 5f 62 75 66 5b 30 5d 20   */..fid_buf[0] 
e340: 3d 20 28 65 66 20 3e 3e 20 38 29 20 26 20 30 78  = (ef >> 8) & 0x
e350: 66 66 3b 0a 09 66 69 64 5f 62 75 66 5b 31 5d 20  ff;..fid_buf[1] 
e360: 3d 20 65 66 20 26 20 30 78 66 66 3b 0a 0a 09 43  = ef & 0xff;...C
e370: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
e380: 54 46 28 22 53 65 6c 65 63 74 69 6e 67 20 66 69  TF("Selecting fi
e390: 6c 65 3a 20 25 30 34 6c 78 22 2c 20 28 75 6e 73  le: %04lx", (uns
e3a0: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 65 66 29 3b  igned long) ef);
e3b0: 0a 0a 09 73 65 6e 64 5f 72 65 74 20 3d 20 63 61  ...send_ret = ca
e3c0: 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 73  ckey_send_apdu(s
e3d0: 6c 6f 74 2c 20 47 53 43 49 53 5f 43 4c 41 53 53  lot, GSCIS_CLASS
e3e0: 5f 49 53 4f 37 38 31 36 2c 20 47 53 43 49 53 5f  _ISO7816, GSCIS_
e3f0: 49 4e 53 54 52 5f 53 45 4c 45 43 54 2c 20 30 78  INSTR_SELECT, 0x
e400: 30 32 2c 20 30 78 30 43 2c 20 73 69 7a 65 6f 66  02, 0x0C, sizeof
e410: 28 66 69 64 5f 62 75 66 29 2c 20 66 69 64 5f 62  (fid_buf), fid_b
e420: 75 66 2c 20 30 78 30 30 2c 20 4e 55 4c 4c 2c 20  uf, 0x00, NULL, 
e430: 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 69 66  NULL, NULL);..if
e440: 20 28 73 65 6e 64 5f 72 65 74 20 21 3d 20 43 41   (send_ret != CA
e450: 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20  CKEY_PCSC_S_OK) 
e460: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
e470: 5f 50 52 49 4e 54 46 28 22 46 61 69 6c 65 64 20  _PRINTF("Failed 
e480: 74 6f 20 6f 70 65 6e 20 66 69 6c 65 2c 20 72 65  to open file, re
e490: 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
e4a0: 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  re");....return(
e4b0: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45  CACKEY_PCSC_E_GE
e4c0: 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 43 41 43  NERIC);..}...CAC
e4d0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
e4e0: 28 22 53 75 63 63 65 73 73 66 75 6c 6c 79 20 73  ("Successfully s
e4f0: 65 6c 65 63 74 65 64 20 66 69 6c 65 22 29 3b 0a  elected file");.
e500: 0a 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
e510: 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f  PCSC_S_OK);.}../
e520: 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a  *. * SYNPOSIS. *
e530: 20 20 20 20 20 76 6f 69 64 20 63 61 63 6b 65 79       void cackey
e540: 5f 66 72 65 65 5f 74 6c 76 28 73 74 72 75 63 74  _free_tlv(struct
e550: 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69   cackey_tlv_enti
e560: 74 79 20 2a 72 6f 6f 74 29 3b 0a 20 2a 0a 20 2a  ty *root);. *. *
e570: 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20   ARGUMENTS. *   
e580: 20 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f    struct cackey_
e590: 74 6c 76 5f 65 6e 74 69 74 79 20 2a 72 6f 6f 74  tlv_entity *root
e5a0: 0a 20 2a 20 20 20 20 20 20 20 20 20 52 6f 6f 74  . *         Root
e5b0: 20 6f 66 20 74 68 65 20 54 4c 56 20 6c 69 73 74   of the TLV list
e5c0: 20 74 6f 20 73 74 61 72 74 20 66 72 65 65 69 6e   to start freein
e5d0: 67 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56  g. *. * RETURN V
e5e0: 41 4c 55 45 0a 20 2a 20 20 20 20 20 4e 6f 6e 65  ALUE. *     None
e5f0: 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20  . *. * NOTES. * 
e600: 20 20 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f      This functio
e610: 6e 20 66 72 65 65 73 20 74 68 65 20 54 4c 56 20  n frees the TLV 
e620: 6c 69 6e 6b 65 64 20 6c 69 73 74 65 64 20 72 65  linked listed re
e630: 74 75 72 6e 65 64 20 66 72 6f 6d 0a 20 2a 20 20  turned from. *  
e640: 20 20 20 22 63 61 63 6b 65 79 5f 72 65 61 64 5f     "cackey_read_
e650: 74 6c 76 22 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74  tlv". *. */.stat
e660: 69 63 20 76 6f 69 64 20 63 61 63 6b 65 79 5f 66  ic void cackey_f
e670: 72 65 65 5f 74 6c 76 28 73 74 72 75 63 74 20 63  ree_tlv(struct c
e680: 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79  ackey_tlv_entity
e690: 20 2a 72 6f 6f 74 29 20 7b 0a 09 73 74 72 75 63   *root) {..struc
e6a0: 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74  t cackey_tlv_ent
e6b0: 69 74 79 20 2a 63 75 72 72 2c 20 2a 6e 65 78 74  ity *curr, *next
e6c0: 3b 0a 0a 09 69 66 20 28 72 6f 6f 74 20 3d 3d 20  ;...if (root == 
e6d0: 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e  NULL) {...return
e6e0: 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 63 75 72 72  ;..}...for (curr
e6f0: 20 3d 20 72 6f 6f 74 3b 20 63 75 72 72 3b 20 63   = root; curr; c
e700: 75 72 72 20 3d 20 6e 65 78 74 29 20 7b 0a 09 09  urr = next) {...
e710: 6e 65 78 74 20 3d 20 63 75 72 72 2d 3e 5f 6e 65  next = curr->_ne
e720: 78 74 3b 0a 0a 09 09 73 77 69 74 63 68 20 28 63  xt;....switch (c
e730: 75 72 72 2d 3e 74 61 67 29 20 7b 0a 09 09 09 63  urr->tag) {....c
e740: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 41 43  ase GSCIS_TAG_AC
e750: 52 5f 54 41 42 4c 45 3a 0a 09 09 09 63 61 73 65  R_TABLE:....case
e760: 20 47 53 43 49 53 5f 54 41 47 5f 43 45 52 54 49   GSCIS_TAG_CERTI
e770: 46 49 43 41 54 45 3a 0a 09 09 09 09 69 66 20 28  FICATE:.....if (
e780: 63 75 72 72 2d 3e 76 61 6c 75 65 29 20 7b 0a 09  curr->value) {..
e790: 09 09 09 09 66 72 65 65 28 63 75 72 72 2d 3e 76  ....free(curr->v
e7a0: 61 6c 75 65 29 3b 0a 09 09 09 09 7d 0a 09 09 09  alue);.....}....
e7b0: 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
e7c0: 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44 55 52  GSCIS_TAG_CARDUR
e7d0: 4c 3a 0a 09 09 09 09 69 66 20 28 63 75 72 72 2d  L:.....if (curr-
e7e0: 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 29 20  >value_cardurl) 
e7f0: 7b 0a 09 09 09 09 09 66 72 65 65 28 63 75 72 72  {......free(curr
e800: 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 29  ->value_cardurl)
e810: 3b 0a 09 09 09 09 7d 0a 09 09 09 09 62 72 65 61  ;.....}.....brea
e820: 6b 3b 0a 09 09 7d 0a 0a 09 09 66 72 65 65 28 63  k;...}....free(c
e830: 75 72 72 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72  urr);..}...retur
e840: 6e 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50  n;.}../*. * SYNP
e850: 4f 53 49 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a  OSIS. *     ....
e860: 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a   *. * ARGUMENTS.
e870: 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a   *     .... *. *
e880: 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a   RETURN VALUE. *
e890: 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e       .... *. * N
e8a0: 4f 54 45 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a  OTES. *     ....
e8b0: 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 73 74   *. */.static st
e8c0: 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f  ruct cackey_tlv_
e8d0: 65 6e 74 69 74 79 20 2a 63 61 63 6b 65 79 5f 72  entity *cackey_r
e8e0: 65 61 64 5f 74 6c 76 28 73 74 72 75 63 74 20 63  ead_tlv(struct c
e8f0: 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74  ackey_slot *slot
e900: 29 20 7b 0a 09 73 74 72 75 63 74 20 63 61 63 6b  ) {..struct cack
e910: 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20 2a 63  ey_tlv_entity *c
e920: 75 72 72 5f 65 6e 74 69 74 79 2c 20 2a 72 6f 6f  urr_entity, *roo
e930: 74 20 3d 20 4e 55 4c 4c 2c 20 2a 6c 61 73 74 20  t = NULL, *last 
e940: 3d 20 4e 55 4c 4c 3b 0a 09 75 6e 73 69 67 6e 65  = NULL;..unsigne
e950: 64 20 63 68 61 72 20 74 6c 65 6e 5f 62 75 66 5b  d char tlen_buf[
e960: 32 5d 2c 20 74 76 61 6c 5f 62 75 66 5b 31 30 32  2], tval_buf[102
e970: 34 5d 2c 20 2a 74 76 61 6c 3b 0a 09 75 6e 73 69  4], *tval;..unsi
e980: 67 6e 65 64 20 63 68 61 72 20 76 6c 65 6e 5f 62  gned char vlen_b
e990: 75 66 5b 32 5d 2c 20 76 76 61 6c 5f 62 75 66 5b  uf[2], vval_buf[
e9a0: 38 31 39 32 5d 2c 20 2a 76 76 61 6c 3b 0a 09 75  8192], *vval;..u
e9b0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74 6d  nsigned char *tm
e9c0: 70 62 75 66 3b 0a 09 75 6e 73 69 67 6e 65 64 20  pbuf;..unsigned 
e9d0: 6c 6f 6e 67 20 74 6d 70 62 75 66 6c 65 6e 3b 0a  long tmpbuflen;.
e9e0: 09 73 73 69 7a 65 5f 74 20 74 6c 65 6e 2c 20 76  .ssize_t tlen, v
e9f0: 6c 65 6e 3b 0a 09 73 73 69 7a 65 5f 74 20 72 65  len;..ssize_t re
ea00: 61 64 5f 72 65 74 3b 0a 09 73 69 7a 65 5f 74 20  ad_ret;..size_t 
ea10: 6f 66 66 73 65 74 5f 74 20 3d 20 30 2c 20 6f 66  offset_t = 0, of
ea20: 66 73 65 74 5f 76 20 3d 20 30 3b 0a 09 75 6e 73  fset_v = 0;..uns
ea30: 69 67 6e 65 64 20 63 68 61 72 20 74 61 67 3b 0a  igned char tag;.
ea40: 09 73 69 7a 65 5f 74 20 6c 65 6e 67 74 68 3b 0a  .size_t length;.
ea50: 23 69 66 64 65 66 20 48 41 56 45 5f 4c 49 42 5a  #ifdef HAVE_LIBZ
ea60: 0a 09 69 6e 74 20 75 6e 63 6f 6d 70 72 65 73 73  ..int uncompress
ea70: 5f 72 65 74 3b 0a 23 65 6e 64 69 66 0a 0a 09 43  _ret;.#endif...C
ea80: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
ea90: 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
eaa0: 09 72 65 61 64 5f 72 65 74 20 3d 20 63 61 63 6b  .read_ret = cack
eab0: 65 79 5f 72 65 61 64 5f 62 75 66 66 65 72 28 73  ey_read_buffer(s
eac0: 6c 6f 74 2c 20 74 6c 65 6e 5f 62 75 66 2c 20 73  lot, tlen_buf, s
ead0: 69 7a 65 6f 66 28 74 6c 65 6e 5f 62 75 66 29 2c  izeof(tlen_buf),
eae0: 20 31 2c 20 6f 66 66 73 65 74 5f 74 29 3b 0a 09   1, offset_t);..
eaf0: 69 66 20 28 72 65 61 64 5f 72 65 74 20 21 3d 20  if (read_ret != 
eb00: 73 69 7a 65 6f 66 28 74 6c 65 6e 5f 62 75 66 29  sizeof(tlen_buf)
eb10: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
eb20: 55 47 5f 50 52 49 4e 54 46 28 22 52 65 61 64 20  UG_PRINTF("Read 
eb30: 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 69 6e  failed, returnin
eb40: 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a  g in failure");.
eb50: 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b  ...return(NULL);
eb60: 0a 09 7d 0a 0a 09 74 6c 65 6e 20 3d 20 28 74 6c  ..}...tlen = (tl
eb70: 65 6e 5f 62 75 66 5b 31 5d 20 3c 3c 20 38 29 20  en_buf[1] << 8) 
eb80: 7c 20 74 6c 65 6e 5f 62 75 66 5b 30 5d 3b 0a 0a  | tlen_buf[0];..
eb90: 09 72 65 61 64 5f 72 65 74 20 3d 20 63 61 63 6b  .read_ret = cack
eba0: 65 79 5f 72 65 61 64 5f 62 75 66 66 65 72 28 73  ey_read_buffer(s
ebb0: 6c 6f 74 2c 20 76 6c 65 6e 5f 62 75 66 2c 20 73  lot, vlen_buf, s
ebc0: 69 7a 65 6f 66 28 76 6c 65 6e 5f 62 75 66 29 2c  izeof(vlen_buf),
ebd0: 20 32 2c 20 6f 66 66 73 65 74 5f 76 29 3b 0a 09   2, offset_v);..
ebe0: 69 66 20 28 72 65 61 64 5f 72 65 74 20 21 3d 20  if (read_ret != 
ebf0: 73 69 7a 65 6f 66 28 76 6c 65 6e 5f 62 75 66 29  sizeof(vlen_buf)
ec00: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
ec10: 55 47 5f 50 52 49 4e 54 46 28 22 52 65 61 64 20  UG_PRINTF("Read 
ec20: 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 69 6e  failed, returnin
ec30: 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a  g in failure");.
ec40: 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b  ...return(NULL);
ec50: 0a 09 7d 0a 0a 09 76 6c 65 6e 20 3d 20 28 76 6c  ..}...vlen = (vl
ec60: 65 6e 5f 62 75 66 5b 31 5d 20 3c 3c 20 38 29 20  en_buf[1] << 8) 
ec70: 7c 20 76 6c 65 6e 5f 62 75 66 5b 30 5d 3b 0a 0a  | vlen_buf[0];..
ec80: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
ec90: 49 4e 54 46 28 22 54 61 67 20 4c 65 6e 67 74 68  INTF("Tag Length
eca0: 20 3d 20 25 6c 75 2c 20 56 61 6c 75 65 20 4c 65   = %lu, Value Le
ecb0: 6e 67 74 68 20 3d 20 25 6c 75 22 2c 20 28 75 6e  ngth = %lu", (un
ecc0: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 74 6c 65  signed long) tle
ecd0: 6e 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  n, (unsigned lon
ece0: 67 29 20 76 6c 65 6e 29 3b 0a 0a 09 6f 66 66 73  g) vlen);...offs
ecf0: 65 74 5f 74 20 2b 3d 20 32 3b 0a 09 6f 66 66 73  et_t += 2;..offs
ed00: 65 74 5f 76 20 2b 3d 20 32 3b 0a 0a 09 69 66 20  et_v += 2;...if 
ed10: 28 74 6c 65 6e 20 3e 20 73 69 7a 65 6f 66 28 74  (tlen > sizeof(t
ed20: 76 61 6c 5f 62 75 66 29 29 20 7b 0a 09 09 43 41  val_buf)) {...CA
ed30: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
ed40: 46 28 22 54 61 67 20 6c 65 6e 67 74 68 20 69 73  F("Tag length is
ed50: 20 74 6f 6f 20 6c 61 72 67 65 2c 20 72 65 74 75   too large, retu
ed60: 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65  rning in failure
ed70: 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55  ");....return(NU
ed80: 4c 4c 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 76 6c  LL);..}...if (vl
ed90: 65 6e 20 3e 20 73 69 7a 65 6f 66 28 76 76 61 6c  en > sizeof(vval
eda0: 5f 62 75 66 29 29 20 7b 0a 09 09 43 41 43 4b 45  _buf)) {...CACKE
edb0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
edc0: 56 61 6c 75 65 20 6c 65 6e 67 74 68 20 69 73 20  Value length is 
edd0: 74 6f 6f 20 6c 61 72 67 65 2c 20 72 65 74 75 72  too large, retur
ede0: 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22  ning in failure"
edf0: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c  );....return(NUL
ee00: 4c 29 3b 0a 09 7d 0a 0a 09 72 65 61 64 5f 72 65  L);..}...read_re
ee10: 74 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f  t = cackey_read_
ee20: 62 75 66 66 65 72 28 73 6c 6f 74 2c 20 74 76 61  buffer(slot, tva
ee30: 6c 5f 62 75 66 2c 20 74 6c 65 6e 2c 20 31 2c 20  l_buf, tlen, 1, 
ee40: 6f 66 66 73 65 74 5f 74 29 3b 0a 09 69 66 20 28  offset_t);..if (
ee50: 72 65 61 64 5f 72 65 74 20 21 3d 20 74 6c 65 6e  read_ret != tlen
ee60: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
ee70: 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c  UG_PRINTF("Unabl
ee80: 65 20 74 6f 20 72 65 61 64 20 65 6e 74 69 72 65  e to read entire
ee90: 20 54 2d 62 75 66 66 65 72 2c 20 72 65 74 75 72   T-buffer, retur
eea0: 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22  ning in failure"
eeb0: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c  );....return(NUL
eec0: 4c 29 3b 0a 09 7d 0a 0a 09 72 65 61 64 5f 72 65  L);..}...read_re
eed0: 74 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f  t = cackey_read_
eee0: 62 75 66 66 65 72 28 73 6c 6f 74 2c 20 76 76 61  buffer(slot, vva
eef0: 6c 5f 62 75 66 2c 20 76 6c 65 6e 2c 20 32 2c 20  l_buf, vlen, 2, 
ef00: 6f 66 66 73 65 74 5f 76 29 3b 0a 09 69 66 20 28  offset_v);..if (
ef10: 72 65 61 64 5f 72 65 74 20 21 3d 20 76 6c 65 6e  read_ret != vlen
ef20: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
ef30: 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c  UG_PRINTF("Unabl
ef40: 65 20 74 6f 20 72 65 61 64 20 65 6e 74 69 72 65  e to read entire
ef50: 20 56 2d 62 75 66 66 65 72 2c 20 72 65 74 75 72   V-buffer, retur
ef60: 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22  ning in failure"
ef70: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c  );....return(NUL
ef80: 4c 29 3b 0a 09 7d 0a 0a 09 74 76 61 6c 20 3d 20  L);..}...tval = 
ef90: 74 76 61 6c 5f 62 75 66 3b 0a 09 76 76 61 6c 20  tval_buf;..vval 
efa0: 3d 20 76 76 61 6c 5f 62 75 66 3b 0a 09 77 68 69  = vval_buf;..whi
efb0: 6c 65 20 28 74 6c 65 6e 20 3e 20 30 20 26 26 20  le (tlen > 0 && 
efc0: 76 6c 65 6e 20 3e 20 30 29 20 7b 0a 09 09 74 61  vlen > 0) {...ta
efd0: 67 20 3d 20 2a 74 76 61 6c 3b 0a 09 09 74 76 61  g = *tval;...tva
efe0: 6c 2b 2b 3b 0a 09 09 74 6c 65 6e 2d 2d 3b 0a 0a  l++;...tlen--;..
eff0: 09 09 69 66 20 28 2a 74 76 61 6c 20 3d 3d 20 30  ..if (*tval == 0
f000: 78 66 66 29 20 7b 0a 09 09 09 6c 65 6e 67 74 68  xff) {....length
f010: 20 3d 20 28 74 76 61 6c 5b 32 5d 20 3c 3c 20 38   = (tval[2] << 8
f020: 29 20 7c 20 74 76 61 6c 5b 31 5d 3b 0a 09 09 09  ) | tval[1];....
f030: 74 76 61 6c 20 2b 3d 20 33 3b 0a 09 09 09 74 6c  tval += 3;....tl
f040: 65 6e 20 2d 3d 20 33 3b 0a 09 09 7d 20 65 6c 73  en -= 3;...} els
f050: 65 20 7b 0a 09 09 09 6c 65 6e 67 74 68 20 3d 20  e {....length = 
f060: 2a 74 76 61 6c 3b 0a 09 09 09 74 76 61 6c 2b 2b  *tval;....tval++
f070: 3b 0a 09 09 09 74 6c 65 6e 2d 2d 3b 0a 09 09 7d  ;....tlen--;...}
f080: 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
f090: 5f 50 52 49 4e 54 46 28 22 54 61 67 3a 20 25 73  _PRINTF("Tag: %s
f0a0: 20 28 25 30 32 78 29 22 2c 20 43 41 43 4b 45 59   (%02x)", CACKEY
f0b0: 5f 44 45 42 55 47 5f 46 55 4e 43 5f 54 41 47 5f  _DEBUG_FUNC_TAG_
f0c0: 54 4f 5f 53 54 52 28 74 61 67 29 2c 20 28 75 6e  TO_STR(tag), (un
f0d0: 73 69 67 6e 65 64 20 69 6e 74 29 20 74 61 67 29  signed int) tag)
f0e0: 3b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
f0f0: 5f 50 52 49 4e 54 42 55 46 28 22 56 61 6c 75 65  _PRINTBUF("Value
f100: 3a 22 2c 20 76 76 61 6c 2c 20 6c 65 6e 67 74 68  :", vval, length
f110: 29 3b 0a 0a 09 09 63 75 72 72 5f 65 6e 74 69 74  );....curr_entit
f120: 79 20 3d 20 4e 55 4c 4c 3b 0a 09 09 73 77 69 74  y = NULL;...swit
f130: 63 68 20 28 74 61 67 29 20 7b 0a 09 09 09 63 61  ch (tag) {....ca
f140: 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43 41 52  se GSCIS_TAG_CAR
f150: 44 55 52 4c 3a 0a 09 09 09 09 63 75 72 72 5f 65  DURL:.....curr_e
f160: 6e 74 69 74 79 20 3d 20 6d 61 6c 6c 6f 63 28 73  ntity = malloc(s
f170: 69 7a 65 6f 66 28 2a 63 75 72 72 5f 65 6e 74 69  izeof(*curr_enti
f180: 74 79 29 29 3b 0a 09 09 09 09 63 75 72 72 5f 65  ty));.....curr_e
f190: 6e 74 69 74 79 2d 3e 76 61 6c 75 65 5f 63 61 72  ntity->value_car
f1a0: 64 75 72 6c 20 3d 20 6d 61 6c 6c 6f 63 28 73 69  durl = malloc(si
f1b0: 7a 65 6f 66 28 2a 63 75 72 72 5f 65 6e 74 69 74  zeof(*curr_entit
f1c0: 79 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c  y->value_cardurl
f1d0: 29 29 3b 0a 0a 09 09 09 09 6d 65 6d 63 70 79 28  ));......memcpy(
f1e0: 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c  curr_entity->val
f1f0: 75 65 5f 63 61 72 64 75 72 6c 2d 3e 72 69 64 2c  ue_cardurl->rid,
f200: 20 76 76 61 6c 2c 20 35 29 3b 0a 09 09 09 09 63   vval, 5);.....c
f210: 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75  urr_entity->valu
f220: 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70 74 79  e_cardurl->appty
f230: 70 65 20 3d 20 76 76 61 6c 5b 35 5d 3b 0a 09 09  pe = vval[5];...
f240: 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76  ..curr_entity->v
f250: 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 6f 62  alue_cardurl->ob
f260: 6a 65 63 74 69 64 20 3d 20 28 76 76 61 6c 5b 36  jectid = (vval[6
f270: 5d 20 3c 3c 20 38 29 20 7c 20 76 76 61 6c 5b 37  ] << 8) | vval[7
f280: 5d 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69  ];.....curr_enti
f290: 74 79 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72  ty->value_cardur
f2a0: 6c 2d 3e 61 70 70 69 64 20 3d 20 28 76 76 61 6c  l->appid = (vval
f2b0: 5b 38 5d 20 3c 3c 20 38 29 20 7c 20 76 76 61 6c  [8] << 8) | vval
f2c0: 5b 39 5d 3b 0a 0a 09 09 09 09 63 75 72 72 5f 65  [9];......curr_e
f2d0: 6e 74 69 74 79 2d 3e 74 61 67 20 3d 20 74 61 67  ntity->tag = tag
f2e0: 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74  ;.....curr_entit
f2f0: 79 2d 3e 5f 6e 65 78 74 20 3d 20 4e 55 4c 4c 3b  y->_next = NULL;
f300: 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
f310: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 41  case GSCIS_TAG_A
f320: 43 52 5f 54 41 42 4c 45 3a 0a 09 09 09 09 63 75  CR_TABLE:.....cu
f330: 72 72 5f 65 6e 74 69 74 79 20 3d 20 6d 61 6c 6c  rr_entity = mall
f340: 6f 63 28 73 69 7a 65 6f 66 28 2a 63 75 72 72 5f  oc(sizeof(*curr_
f350: 65 6e 74 69 74 79 29 29 3b 0a 09 09 09 09 74 6d  entity));.....tm
f360: 70 62 75 66 20 3d 20 6d 61 6c 6c 6f 63 28 6c 65  pbuf = malloc(le
f370: 6e 67 74 68 29 3b 0a 0a 09 09 09 09 6d 65 6d 63  ngth);......memc
f380: 70 79 28 74 6d 70 62 75 66 2c 20 76 76 61 6c 2c  py(tmpbuf, vval,
f390: 20 6c 65 6e 67 74 68 29 3b 0a 0a 09 09 09 09 63   length);......c
f3a0: 75 72 72 5f 65 6e 74 69 74 79 2d 3e 74 61 67 20  urr_entity->tag 
f3b0: 3d 20 74 61 67 3b 0a 09 09 09 09 63 75 72 72 5f  = tag;.....curr_
f3c0: 65 6e 74 69 74 79 2d 3e 6c 65 6e 67 74 68 20 3d  entity->length =
f3d0: 20 6c 65 6e 67 74 68 3b 0a 09 09 09 09 63 75 72   length;.....cur
f3e0: 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65 20  r_entity->value 
f3f0: 3d 20 74 6d 70 62 75 66 3b 0a 09 09 09 09 63 75  = tmpbuf;.....cu
f400: 72 72 5f 65 6e 74 69 74 79 2d 3e 5f 6e 65 78 74  rr_entity->_next
f410: 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09 62 72   = NULL;......br
f420: 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 47 53 43  eak;....case GSC
f430: 49 53 5f 54 41 47 5f 43 45 52 54 49 46 49 43 41  IS_TAG_CERTIFICA
f440: 54 45 3a 0a 09 09 09 09 63 75 72 72 5f 65 6e 74  TE:.....curr_ent
f450: 69 74 79 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a  ity = malloc(siz
f460: 65 6f 66 28 2a 63 75 72 72 5f 65 6e 74 69 74 79  eof(*curr_entity
f470: 29 29 3b 0a 0a 23 69 66 64 65 66 20 48 41 56 45  ));..#ifdef HAVE
f480: 5f 4c 49 42 5a 0a 09 09 09 09 74 6d 70 62 75 66  _LIBZ.....tmpbuf
f490: 6c 65 6e 20 3d 20 6c 65 6e 67 74 68 20 2a 20 32  len = length * 2
f4a0: 3b 0a 09 09 09 09 74 6d 70 62 75 66 20 3d 20 6d  ;.....tmpbuf = m
f4b0: 61 6c 6c 6f 63 28 74 6d 70 62 75 66 6c 65 6e 29  alloc(tmpbuflen)
f4c0: 3b 0a 0a 09 09 09 09 75 6e 63 6f 6d 70 72 65 73  ;......uncompres
f4d0: 73 5f 72 65 74 20 3d 20 75 6e 63 6f 6d 70 72 65  s_ret = uncompre
f4e0: 73 73 28 74 6d 70 62 75 66 2c 20 26 74 6d 70 62  ss(tmpbuf, &tmpb
f4f0: 75 66 6c 65 6e 2c 20 76 76 61 6c 2c 20 6c 65 6e  uflen, vval, len
f500: 67 74 68 29 3b 0a 09 09 09 09 69 66 20 28 75 6e  gth);.....if (un
f510: 63 6f 6d 70 72 65 73 73 5f 72 65 74 20 21 3d 20  compress_ret != 
f520: 5a 5f 4f 4b 29 20 7b 0a 09 09 09 09 09 43 41 43  Z_OK) {......CAC
f530: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
f540: 28 22 46 61 69 6c 65 64 20 74 6f 20 64 65 63 6f  ("Failed to deco
f550: 6d 70 72 65 73 73 2c 20 75 6e 63 6f 6d 70 72 65  mpress, uncompre
f560: 73 73 28 29 20 72 65 74 75 72 6e 65 64 20 25 69  ss() returned %i
f570: 20 2d 2d 20 72 65 73 6f 72 74 69 6e 67 20 74 6f   -- resorting to
f580: 20 64 69 72 65 63 74 20 63 6f 70 79 22 2c 20 75   direct copy", u
f590: 6e 63 6f 6d 70 72 65 73 73 5f 72 65 74 29 3b 0a  ncompress_ret);.
f5a0: 0a 09 09 09 09 09 74 6d 70 62 75 66 6c 65 6e 20  ......tmpbuflen 
f5b0: 3d 20 6c 65 6e 67 74 68 3b 0a 09 09 09 09 09 6d  = length;......m
f5c0: 65 6d 63 70 79 28 74 6d 70 62 75 66 2c 20 76 76  emcpy(tmpbuf, vv
f5d0: 61 6c 2c 20 6c 65 6e 67 74 68 29 3b 0a 09 09 09  al, length);....
f5e0: 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  .}......CACKEY_D
f5f0: 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22 44  EBUG_PRINTBUF("D
f600: 65 63 6f 6d 70 72 65 73 73 65 64 20 74 6f 3a 22  ecompressed to:"
f610: 2c 20 74 6d 70 62 75 66 2c 20 74 6d 70 62 75 66  , tmpbuf, tmpbuf
f620: 6c 65 6e 29 3b 0a 23 65 6c 73 65 0a 09 09 09 09  len);.#else.....
f630: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
f640: 4e 54 46 28 22 4d 69 73 73 69 6e 67 20 5a 4c 49  NTF("Missing ZLI
f650: 42 20 53 75 70 70 6f 72 74 2c 20 74 68 69 73 20  B Support, this 
f660: 63 65 72 74 69 66 69 63 61 74 65 20 69 73 20 6c  certificate is l
f670: 69 6b 65 6c 79 20 75 73 65 6c 65 73 73 2e 2e 2e  ikely useless...
f680: 22 29 3b 0a 0a 09 09 09 09 74 6d 70 62 75 66 6c  ");......tmpbufl
f690: 65 6e 20 3d 20 6c 65 6e 67 74 68 3b 0a 09 09 09  en = length;....
f6a0: 09 6d 65 6d 63 70 79 28 74 6d 70 62 75 66 2c 20  .memcpy(tmpbuf, 
f6b0: 76 76 61 6c 2c 20 6c 65 6e 67 74 68 29 3b 0a 23  vval, length);.#
f6c0: 65 6e 64 69 66 0a 0a 09 09 09 09 63 75 72 72 5f  endif......curr_
f6d0: 65 6e 74 69 74 79 2d 3e 74 61 67 20 3d 20 74 61  entity->tag = ta
f6e0: 67 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69  g;.....curr_enti
f6f0: 74 79 2d 3e 6c 65 6e 67 74 68 20 3d 20 74 6d 70  ty->length = tmp
f700: 62 75 66 6c 65 6e 3b 0a 09 09 09 09 63 75 72 72  buflen;.....curr
f710: 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65 20 3d  _entity->value =
f720: 20 74 6d 70 62 75 66 3b 0a 09 09 09 09 63 75 72   tmpbuf;.....cur
f730: 72 5f 65 6e 74 69 74 79 2d 3e 5f 6e 65 78 74 20  r_entity->_next 
f740: 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09 62 72 65  = NULL;......bre
f750: 61 6b 3b 0a 09 09 09 63 61 73 65 20 47 53 43 49  ak;....case GSCI
f760: 53 5f 54 41 47 5f 50 4b 43 53 31 35 3a 0a 09 09  S_TAG_PKCS15:...
f770: 09 09 63 75 72 72 5f 65 6e 74 69 74 79 20 3d 20  ..curr_entity = 
f780: 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63  malloc(sizeof(*c
f790: 75 72 72 5f 65 6e 74 69 74 79 29 29 3b 0a 0a 09  urr_entity));...
f7a0: 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e  ...curr_entity->
f7b0: 74 61 67 20 3d 20 74 61 67 3b 0a 09 09 09 09 63  tag = tag;.....c
f7c0: 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75  urr_entity->valu
f7d0: 65 5f 62 79 74 65 20 3d 20 76 76 61 6c 5b 30 5d  e_byte = vval[0]
f7e0: 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74  ;.....curr_entit
f7f0: 79 2d 3e 5f 6e 65 78 74 20 3d 20 4e 55 4c 4c 3b  y->_next = NULL;
f800: 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d  ......break;...}
f810: 0a 0a 09 09 76 76 61 6c 20 2b 3d 20 6c 65 6e 67  ....vval += leng
f820: 74 68 3b 0a 09 09 76 6c 65 6e 20 2d 3d 20 6c 65  th;...vlen -= le
f830: 6e 67 74 68 3b 0a 0a 09 09 69 66 20 28 63 75 72  ngth;....if (cur
f840: 72 5f 65 6e 74 69 74 79 20 21 3d 20 4e 55 4c 4c  r_entity != NULL
f850: 29 20 7b 0a 09 09 09 69 66 20 28 72 6f 6f 74 20  ) {....if (root 
f860: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 72  == NULL) {.....r
f870: 6f 6f 74 20 3d 20 63 75 72 72 5f 65 6e 74 69 74  oot = curr_entit
f880: 79 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28  y;....}.....if (
f890: 6c 61 73 74 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  last != NULL) {.
f8a0: 09 09 09 09 6c 61 73 74 2d 3e 5f 6e 65 78 74 20  ....last->_next 
f8b0: 3d 20 63 75 72 72 5f 65 6e 74 69 74 79 3b 0a 09  = curr_entity;..
f8c0: 09 09 7d 0a 0a 09 09 09 6c 61 73 74 20 3d 20 63  ..}.....last = c
f8d0: 75 72 72 5f 65 6e 74 69 74 79 3b 0a 09 09 7d 0a  urr_entity;...}.
f8e0: 09 7d 0a 0a 09 72 65 74 75 72 6e 28 72 6f 6f 74  .}...return(root
f8f0: 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50  );.}../*. * SYNP
f900: 4f 53 49 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a  OSIS. *     ....
f910: 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a   *. * ARGUMENTS.
f920: 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a   *     .... *. *
f930: 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a   RETURN VALUE. *
f940: 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e       .... *. * N
f950: 4f 54 45 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a  OTES. *     ....
f960: 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f   *. */.static vo
f970: 69 64 20 63 61 63 6b 65 79 5f 66 72 65 65 5f 63  id cackey_free_c
f980: 65 72 74 73 28 73 74 72 75 63 74 20 63 61 63 6b  erts(struct cack
f990: 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79  ey_pcsc_identity
f9a0: 20 2a 73 74 61 72 74 2c 20 73 69 7a 65 5f 74 20   *start, size_t 
f9b0: 63 6f 75 6e 74 2c 20 69 6e 74 20 66 72 65 65 5f  count, int free_
f9c0: 73 74 61 72 74 29 20 7b 0a 09 73 69 7a 65 5f 74  start) {..size_t
f9d0: 20 69 64 78 3b 0a 0a 09 69 66 20 28 73 74 61 72   idx;...if (star
f9e0: 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72  t == NULL) {...r
f9f0: 65 74 75 72 6e 3b 0a 09 7d 0a 0a 09 66 6f 72 20  eturn;..}...for 
fa00: 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20  (idx = 0; idx < 
fa10: 63 6f 75 6e 74 3b 20 69 64 78 2b 2b 29 20 7b 0a  count; idx++) {.
fa20: 09 09 69 66 20 28 73 74 61 72 74 5b 69 64 78 5d  ..if (start[idx]
fa30: 2e 63 65 72 74 69 66 69 63 61 74 65 29 20 7b 0a  .certificate) {.
fa40: 09 09 09 66 72 65 65 28 73 74 61 72 74 5b 69 64  ...free(start[id
fa50: 78 5d 2e 63 65 72 74 69 66 69 63 61 74 65 29 3b  x].certificate);
fa60: 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28 66 72  ...}..}...if (fr
fa70: 65 65 5f 73 74 61 72 74 29 20 7b 0a 09 09 66 72  ee_start) {...fr
fa80: 65 65 28 73 74 61 72 74 29 3b 0a 09 7d 0a 0a 09  ee(start);..}...
fa90: 72 65 74 75 72 6e 3b 0a 7d 0a 0a 73 74 61 74 69  return;.}..stati
faa0: 63 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  c struct cackey_
fab0: 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 63  pcsc_identity *c
fac0: 61 63 6b 65 79 5f 63 6f 70 79 5f 63 65 72 74 73  ackey_copy_certs
fad0: 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70  (struct cackey_p
fae0: 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 64 65  csc_identity *de
faf0: 73 74 2c 20 73 74 72 75 63 74 20 63 61 63 6b 65  st, struct cacke
fb00: 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20  y_pcsc_identity 
fb10: 2a 73 74 61 72 74 2c 20 73 69 7a 65 5f 74 20 63  *start, size_t c
fb20: 6f 75 6e 74 29 20 7b 0a 09 73 69 7a 65 5f 74 20  ount) {..size_t 
fb30: 69 64 78 3b 0a 0a 09 69 66 20 28 73 74 61 72 74  idx;...if (start
fb40: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65   == NULL) {...re
fb50: 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a  turn(NULL);..}..
fb60: 09 69 66 20 28 64 65 73 74 20 3d 3d 20 4e 55 4c  .if (dest == NUL
fb70: 4c 29 20 7b 0a 09 09 64 65 73 74 20 3d 20 6d 61  L) {...dest = ma
fb80: 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 64 65 73  lloc(sizeof(*des
fb90: 74 29 20 2a 20 63 6f 75 6e 74 29 3b 0a 09 7d 0a  t) * count);..}.
fba0: 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20  ..for (idx = 0; 
fbb0: 69 64 78 20 3c 20 63 6f 75 6e 74 3b 20 69 64 78  idx < count; idx
fbc0: 2b 2b 29 20 7b 0a 09 09 64 65 73 74 5b 69 64 78  ++) {...dest[idx
fbd0: 5d 2e 69 64 5f 74 79 70 65 20 3d 20 73 74 61 72  ].id_type = star
fbe0: 74 5b 69 64 78 5d 2e 69 64 5f 74 79 70 65 3b 0a  t[idx].id_type;.
fbf0: 0a 09 09 73 77 69 74 63 68 20 28 64 65 73 74 5b  ...switch (dest[
fc00: 69 64 78 5d 2e 69 64 5f 74 79 70 65 29 20 7b 0a  idx].id_type) {.
fc10: 09 09 09 63 61 73 65 20 43 41 43 4b 45 59 5f 49  ...case CACKEY_I
fc20: 44 5f 54 59 50 45 5f 43 41 43 3a 0a 09 09 09 09  D_TYPE_CAC:.....
fc30: 6d 65 6d 63 70 79 28 64 65 73 74 5b 69 64 78 5d  memcpy(dest[idx]
fc40: 2e 63 61 72 64 2e 63 61 63 2e 61 70 70 6c 65 74  .card.cac.applet
fc50: 2c 20 73 74 61 72 74 5b 69 64 78 5d 2e 63 61 72  , start[idx].car
fc60: 64 2e 63 61 63 2e 61 70 70 6c 65 74 2c 20 73 69  d.cac.applet, si
fc70: 7a 65 6f 66 28 64 65 73 74 5b 69 64 78 5d 2e 63  zeof(dest[idx].c
fc80: 61 72 64 2e 63 61 63 2e 61 70 70 6c 65 74 29 29  ard.cac.applet))
fc90: 3b 0a 09 09 09 09 64 65 73 74 5b 69 64 78 5d 2e  ;.....dest[idx].
fca0: 63 61 72 64 2e 63 61 63 2e 66 69 6c 65 20 3d 20  card.cac.file = 
fcb0: 73 74 61 72 74 5b 69 64 78 5d 2e 63 61 72 64 2e  start[idx].card.
fcc0: 63 61 63 2e 66 69 6c 65 3b 0a 09 09 09 09 62 72  cac.file;.....br
fcd0: 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 41 43  eak;....case CAC
fce0: 4b 45 59 5f 49 44 5f 54 59 50 45 5f 50 49 56 3a  KEY_ID_TYPE_PIV:
fcf0: 0a 09 09 09 09 64 65 73 74 5b 69 64 78 5d 2e 63  .....dest[idx].c
fd00: 61 72 64 2e 70 69 76 2e 6b 65 79 5f 69 64 20 3d  ard.piv.key_id =
fd10: 20 73 74 61 72 74 5b 69 64 78 5d 2e 63 61 72 64   start[idx].card
fd20: 2e 70 69 76 2e 6b 65 79 5f 69 64 3b 0a 09 09 09  .piv.key_id;....
fd30: 09 6d 65 6d 63 70 79 28 64 65 73 74 5b 69 64 78  .memcpy(dest[idx
fd40: 5d 2e 63 61 72 64 2e 70 69 76 2e 6c 61 62 65 6c  ].card.piv.label
fd50: 2c 20 73 74 61 72 74 5b 69 64 78 5d 2e 63 61 72  , start[idx].car
fd60: 64 2e 70 69 76 2e 6c 61 62 65 6c 2c 20 73 69 7a  d.piv.label, siz
fd70: 65 6f 66 28 64 65 73 74 5b 69 64 78 5d 2e 63 61  eof(dest[idx].ca
fd80: 72 64 2e 70 69 76 2e 6c 61 62 65 6c 29 29 3b 0a  rd.piv.label));.
fd90: 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61  ....break;....ca
fda0: 73 65 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50  se CACKEY_ID_TYP
fdb0: 45 5f 43 45 52 54 5f 4f 4e 4c 59 3a 0a 09 09 09  E_CERT_ONLY:....
fdc0: 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 09 09 64 65  .break;...}...de
fdd0: 73 74 5b 69 64 78 5d 2e 63 65 72 74 69 66 69 63  st[idx].certific
fde0: 61 74 65 5f 6c 65 6e 20 3d 20 73 74 61 72 74 5b  ate_len = start[
fdf0: 69 64 78 5d 2e 63 65 72 74 69 66 69 63 61 74 65  idx].certificate
fe00: 5f 6c 65 6e 3b 0a 09 09 64 65 73 74 5b 69 64 78  _len;...dest[idx
fe10: 5d 2e 6b 65 79 73 69 7a 65 20 3d 20 73 74 61 72  ].keysize = star
fe20: 74 5b 69 64 78 5d 2e 6b 65 79 73 69 7a 65 3b 0a  t[idx].keysize;.
fe30: 0a 09 09 64 65 73 74 5b 69 64 78 5d 2e 63 65 72  ...dest[idx].cer
fe40: 74 69 66 69 63 61 74 65 20 3d 20 6d 61 6c 6c 6f  tificate = mallo
fe50: 63 28 64 65 73 74 5b 69 64 78 5d 2e 63 65 72 74  c(dest[idx].cert
fe60: 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a 09 09  ificate_len);...
fe70: 6d 65 6d 63 70 79 28 64 65 73 74 5b 69 64 78 5d  memcpy(dest[idx]
fe80: 2e 63 65 72 74 69 66 69 63 61 74 65 2c 20 73 74  .certificate, st
fe90: 61 72 74 5b 69 64 78 5d 2e 63 65 72 74 69 66 69  art[idx].certifi
fea0: 63 61 74 65 2c 20 64 65 73 74 5b 69 64 78 5d 2e  cate, dest[idx].
feb0: 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 29  certificate_len)
fec0: 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 64 65  ;..}...return(de
fed0: 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59  st);.}../*. * SY
fee0: 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 2e 2e  NPOSIS. *     ..
fef0: 2e 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54  .. *. * ARGUMENT
ff00: 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a  S. *     .... *.
ff10: 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a   * RETURN VALUE.
ff20: 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a   *     .... *. *
ff30: 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 2e 2e   NOTES. *     ..
ff40: 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20  .. *. */.static 
ff50: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63  struct cackey_pc
ff60: 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 63 61 63  sc_identity *cac
ff70: 6b 65 79 5f 72 65 61 64 5f 63 65 72 74 73 28 73  key_read_certs(s
ff80: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f  truct cackey_slo
ff90: 74 20 2a 73 6c 6f 74 2c 20 73 74 72 75 63 74 20  t *slot, struct 
ffa0: 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e  cackey_pcsc_iden
ffb0: 74 69 74 79 20 2a 63 65 72 74 73 2c 20 75 6e 73  tity *certs, uns
ffc0: 69 67 6e 65 64 20 6c 6f 6e 67 20 2a 63 6f 75 6e  igned long *coun
ffd0: 74 29 20 7b 0a 09 73 74 72 75 63 74 20 63 61 63  t) {..struct cac
ffe0: 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74  key_pcsc_identit
fff0: 79 20 2a 63 75 72 72 5f 69 64 3b 0a 09 73 74 72  y *curr_id;..str
10000 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65  uct cackey_tlv_e
10010 6e 74 69 74 79 20 2a 63 63 63 5f 74 6c 76 2c 20  ntity *ccc_tlv, 
10020 2a 63 63 63 5f 63 75 72 72 2c 20 2a 61 70 70 5f  *ccc_curr, *app_
10030 74 6c 76 2c 20 2a 61 70 70 5f 63 75 72 72 3b 0a  tlv, *app_curr;.
10040 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63  .unsigned char c
10050 63 63 5f 61 69 64 5b 5d 20 3d 20 7b 47 53 43 49  cc_aid[] = {GSCI
10060 53 5f 41 49 44 5f 43 43 43 7d 2c 20 70 69 76 5f  S_AID_CCC}, piv_
10070 61 69 64 5b 5d 20 3d 20 7b 4e 49 53 54 53 50 38  aid[] = {NISTSP8
10080 30 30 5f 37 33 5f 33 5f 50 49 56 5f 41 49 44 7d  00_73_3_PIV_AID}
10090 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72  ;..unsigned char
100a0 20 2a 70 69 76 5f 6f 69 64 2c 20 70 69 76 5f 6f   *piv_oid, piv_o
100b0 69 64 5f 70 69 76 61 75 74 68 5b 5d 20 3d 20 7b  id_pivauth[] = {
100c0 4e 49 53 54 53 50 38 30 30 5f 37 33 5f 33 5f 4f  NISTSP800_73_3_O
100d0 49 44 5f 50 49 56 41 55 54 48 7d 2c 20 70 69 76  ID_PIVAUTH}, piv
100e0 5f 6f 69 64 5f 73 69 67 6e 61 74 75 72 65 5b 5d  _oid_signature[]
100f0 20 3d 20 7b 4e 49 53 54 53 50 38 30 30 5f 37 33   = {NISTSP800_73
10100 5f 33 5f 4f 49 44 5f 53 49 47 4e 41 54 55 52 45  _3_OID_SIGNATURE
10110 7d 2c 20 70 69 76 5f 6f 69 64 5f 6b 65 79 6d 67  }, piv_oid_keymg
10120 74 5b 5d 20 3d 20 7b 4e 49 53 54 53 50 38 30 30  t[] = {NISTSP800
10130 5f 37 33 5f 33 5f 4f 49 44 5f 4b 45 59 4d 47 54  _73_3_OID_KEYMGT
10140 7d 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61  };..unsigned cha
10150 72 20 63 75 72 72 5f 61 69 64 5b 37 5d 3b 0a 09  r curr_aid[7];..
10160 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 62 75  unsigned char bu
10170 66 66 65 72 5b 38 31 39 32 5d 2c 20 2a 62 75 66  ffer[8192], *buf
10180 66 65 72 5f 70 2c 20 2a 74 6d 70 62 75 66 3b 0a  fer_p, *tmpbuf;.
10190 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6f  .unsigned long o
101a0 75 74 69 64 78 20 3d 20 30 3b 0a 09 63 68 61 72  utidx = 0;..char
101b0 20 2a 70 69 76 5f 6c 61 62 65 6c 3b 0a 09 63 61   *piv_label;..ca
101c0 63 6b 65 79 5f 72 65 74 20 74 72 61 6e 73 61 63  ckey_ret transac
101d0 74 69 6f 6e 5f 72 65 74 3b 0a 09 73 73 69 7a 65  tion_ret;..ssize
101e0 5f 74 20 72 65 61 64 5f 72 65 74 3b 0a 09 73 69  _t read_ret;..si
101f0 7a 65 5f 74 20 62 75 66 66 65 72 5f 6c 65 6e 2c  ze_t buffer_len,
10200 20 74 6d 70 62 75 66 6c 65 6e 3b 0a 09 69 6e 74   tmpbuflen;..int
10210 20 63 65 72 74 73 5f 72 65 73 69 7a 61 62 6c 65   certs_resizable
10220 3b 0a 09 69 6e 74 20 73 65 6e 64 5f 72 65 74 2c  ;..int send_ret,
10230 20 73 65 6c 65 63 74 5f 72 65 74 3b 0a 09 69 6e   select_ret;..in
10240 74 20 70 69 76 5f 6b 65 79 2c 20 70 69 76 20 3d  t piv_key, piv =
10250 20 30 3b 0a 09 69 6e 74 20 69 64 78 3b 0a 23 69   0;..int idx;.#i
10260 66 64 65 66 20 48 41 56 45 5f 4c 49 42 5a 0a 09  fdef HAVE_LIBZ..
10270 69 6e 74 20 75 6e 63 6f 6d 70 72 65 73 73 5f 72  int uncompress_r
10280 65 74 3b 0a 09 7a 5f 73 74 72 65 61 6d 20 67 7a  et;..z_stream gz
10290 69 70 5f 73 74 72 65 61 6d 3b 0a 23 65 6e 64 69  ip_stream;.#endi
102a0 66 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  f...CACKEY_DEBUG
102b0 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
102c0 22 29 3b 0a 0a 09 69 66 20 28 63 6f 75 6e 74 20  ");...if (count 
102d0 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43  == NULL) {...CAC
102e0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
102f0 28 22 63 6f 75 6e 74 20 69 73 20 4e 55 4c 4c 2c  ("count is NULL,
10300 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61   returning in fa
10310 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75  ilure");....retu
10320 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 69  rn(NULL);..}...i
10330 66 20 28 63 65 72 74 73 20 21 3d 20 4e 55 4c 4c  f (certs != NULL
10340 29 20 7b 0a 09 09 69 66 20 28 2a 63 6f 75 6e 74  ) {...if (*count
10350 20 3d 3d 20 30 29 20 7b 0a 09 09 09 43 41 43 4b   == 0) {....CACK
10360 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
10370 22 52 65 71 75 65 73 74 65 64 20 77 65 20 72 65  "Requested we re
10380 74 75 72 6e 20 30 20 6f 62 6a 65 63 74 73 2c 20  turn 0 objects, 
10390 73 68 6f 72 74 2d 63 69 72 63 75 69 74 22 29 3b  short-circuit");
103a0 0a 0a 09 09 09 72 65 74 75 72 6e 28 63 65 72 74  .....return(cert
103b0 73 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20  s);...}..}...if 
103c0 28 21 73 6c 6f 74 2d 3e 73 6c 6f 74 5f 72 65 73  (!slot->slot_res
103d0 65 74 29 20 7b 0a 09 09 69 66 20 28 73 6c 6f 74  et) {...if (slot
103e0 2d 3e 63 61 63 68 65 64 5f 63 65 72 74 73 29 20  ->cached_certs) 
103f0 7b 0a 09 09 09 69 66 20 28 63 65 72 74 73 20 3d  {....if (certs =
10400 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 63 65  = NULL) {.....ce
10410 72 74 73 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a  rts = malloc(siz
10420 65 6f 66 28 2a 63 65 72 74 73 29 20 2a 20 73 6c  eof(*certs) * sl
10430 6f 74 2d 3e 63 61 63 68 65 64 5f 63 65 72 74 73  ot->cached_certs
10440 5f 63 6f 75 6e 74 29 3b 0a 09 09 09 09 2a 63 6f  _count);.....*co
10450 75 6e 74 20 3d 20 73 6c 6f 74 2d 3e 63 61 63 68  unt = slot->cach
10460 65 64 5f 63 65 72 74 73 5f 63 6f 75 6e 74 3b 0a  ed_certs_count;.
10470 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09  ...} else {.....
10480 69 66 20 28 2a 63 6f 75 6e 74 20 3e 20 73 6c 6f  if (*count > slo
10490 74 2d 3e 63 61 63 68 65 64 5f 63 65 72 74 73 5f  t->cached_certs_
104a0 63 6f 75 6e 74 29 20 7b 0a 09 09 09 09 09 2a 63  count) {......*c
104b0 6f 75 6e 74 20 3d 20 73 6c 6f 74 2d 3e 63 61 63  ount = slot->cac
104c0 68 65 64 5f 63 65 72 74 73 5f 63 6f 75 6e 74 3b  hed_certs_count;
104d0 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 09  .....}....}.....
104e0 63 61 63 6b 65 79 5f 63 6f 70 79 5f 63 65 72 74  cackey_copy_cert
104f0 73 28 63 65 72 74 73 2c 20 73 6c 6f 74 2d 3e 63  s(certs, slot->c
10500 61 63 68 65 64 5f 63 65 72 74 73 2c 20 2a 63 6f  ached_certs, *co
10510 75 6e 74 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e  unt);.....return
10520 28 63 65 72 74 73 29 3b 0a 09 09 7d 0a 09 7d 0a  (certs);...}..}.
10530 0a 09 69 66 20 28 73 6c 6f 74 2d 3e 63 61 63 68  ..if (slot->cach
10540 65 64 5f 63 65 72 74 73 29 20 7b 0a 09 09 63 61  ed_certs) {...ca
10550 63 6b 65 79 5f 66 72 65 65 5f 63 65 72 74 73 28  ckey_free_certs(
10560 73 6c 6f 74 2d 3e 63 61 63 68 65 64 5f 63 65 72  slot->cached_cer
10570 74 73 2c 20 73 6c 6f 74 2d 3e 63 61 63 68 65 64  ts, slot->cached
10580 5f 63 65 72 74 73 5f 63 6f 75 6e 74 2c 20 31 29  _certs_count, 1)
10590 3b 0a 0a 09 09 73 6c 6f 74 2d 3e 63 61 63 68 65  ;....slot->cache
105a0 64 5f 63 65 72 74 73 20 3d 20 4e 55 4c 4c 3b 0a  d_certs = NULL;.
105b0 09 7d 0a 0a 09 2f 2a 20 42 65 67 69 6e 20 61 20  .}.../* Begin a 
105c0 53 6d 61 72 74 43 61 72 64 20 74 72 61 6e 73 61  SmartCard transa
105d0 63 74 69 6f 6e 20 2a 2f 0a 09 74 72 61 6e 73 61  ction */..transa
105e0 63 74 69 6f 6e 5f 72 65 74 20 3d 20 63 61 63 6b  ction_ret = cack
105f0 65 79 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 63  ey_begin_transac
10600 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 09 69 66 20  tion(slot);..if 
10610 28 74 72 61 6e 73 61 63 74 69 6f 6e 5f 72 65 74  (transaction_ret
10620 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f   != CACKEY_PCSC_
10630 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59  S_OK) {...CACKEY
10640 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55  _DEBUG_PRINTF("U
10650 6e 61 62 6c 65 20 62 65 67 69 6e 20 74 72 61 6e  nable begin tran
10660 73 61 63 74 69 6f 6e 2c 20 72 65 74 75 72 6e 69  saction, returni
10670 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b  ng in failure");
10680 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29  ....return(NULL)
10690 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 65 6c 65 63 74  ;..}.../* Select
106a0 20 74 68 65 20 43 43 43 20 41 70 70 6c 65 74 20   the CCC Applet 
106b0 2a 2f 0a 09 73 65 6e 64 5f 72 65 74 20 3d 20 63  */..send_ret = c
106c0 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 61 70 70  ackey_select_app
106d0 6c 65 74 28 73 6c 6f 74 2c 20 63 63 63 5f 61 69  let(slot, ccc_ai
106e0 64 2c 20 73 69 7a 65 6f 66 28 63 63 63 5f 61 69  d, sizeof(ccc_ai
106f0 64 29 29 3b 0a 09 69 66 20 28 73 65 6e 64 5f 72  d));..if (send_r
10700 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53  et != CACKEY_PCS
10710 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 2f 2a 20 54  C_S_OK) {.../* T
10720 72 79 20 50 49 56 20 61 70 70 6c 69 63 61 74 69  ry PIV applicati
10730 6f 6e 20 2a 2f 0a 09 09 73 65 6e 64 5f 72 65 74  on */...send_ret
10740 20 3d 20 63 61 63 6b 65 79 5f 73 65 6c 65 63 74   = cackey_select
10750 5f 61 70 70 6c 65 74 28 73 6c 6f 74 2c 20 70 69  _applet(slot, pi
10760 76 5f 61 69 64 2c 20 73 69 7a 65 6f 66 28 70 69  v_aid, sizeof(pi
10770 76 5f 61 69 64 29 29 3b 0a 09 09 69 66 20 28 73  v_aid));...if (s
10780 65 6e 64 5f 72 65 74 20 3d 3d 20 43 41 43 4b 45  end_ret == CACKE
10790 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09  Y_PCSC_S_OK) {..
107a0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
107b0 52 49 4e 54 46 28 22 57 65 20 68 61 76 65 20 61  RINTF("We have a
107c0 20 50 49 56 20 63 61 72 64 20 2d 2d 20 6e 6f 74   PIV card -- not
107d0 20 75 73 69 6e 67 20 74 68 65 20 43 43 43 2c 20   using the CCC, 
107e0 70 75 6c 6c 69 6e 67 20 70 72 65 2d 73 65 6c 65  pulling pre-sele
107f0 63 74 65 64 20 6b 65 79 73 22 29 3b 0a 0a 09 09  cted keys");....
10800 09 70 69 76 20 3d 20 31 3b 0a 09 09 7d 20 65 6c  .piv = 1;...} el
10810 73 65 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  se {....CACKEY_D
10820 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61  EBUG_PRINTF("Una
10830 62 6c 65 20 74 6f 20 73 65 6c 65 63 74 20 43 43  ble to select CC
10840 43 20 41 70 70 6c 65 74 2c 20 72 65 74 75 72 6e  C Applet, return
10850 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29  ing in failure")
10860 3b 0a 0a 09 09 09 2f 2a 20 54 65 72 6d 69 6e 61  ;...../* Termina
10870 74 65 20 53 6d 61 72 74 43 61 72 64 20 54 72 61  te SmartCard Tra
10880 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 09 09 63  nsaction */....c
10890 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61  ackey_end_transa
108a0 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09  ction(slot);....
108b0 09 69 66 20 28 63 65 72 74 73 20 3d 3d 20 4e 55  .if (certs == NU
108c0 4c 4c 29 20 7b 0a 09 09 09 09 2a 63 6f 75 6e 74  LL) {.....*count
108d0 20 3d 20 30 3b 0a 09 09 09 7d 0a 0a 09 09 09 72   = 0;....}.....r
108e0 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 09 7d  eturn(NULL);...}
108f0 0a 09 7d 0a 0a 09 69 66 20 28 63 65 72 74 73 20  ..}...if (certs 
10900 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 63 65 72  == NULL) {...cer
10910 74 73 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65  ts = malloc(size
10920 6f 66 28 2a 63 65 72 74 73 29 20 2a 20 35 29 3b  of(*certs) * 5);
10930 0a 09 09 2a 63 6f 75 6e 74 20 3d 20 35 3b 0a 09  ...*count = 5;..
10940 09 63 65 72 74 73 5f 72 65 73 69 7a 61 62 6c 65  .certs_resizable
10950 20 3d 20 31 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a   = 1;..} else {.
10960 09 09 63 65 72 74 73 5f 72 65 73 69 7a 61 62 6c  ..certs_resizabl
10970 65 20 3d 20 30 3b 0a 09 7d 0a 0a 09 69 66 20 28  e = 0;..}...if (
10980 70 69 76 29 20 7b 0a 09 09 66 6f 72 20 28 69 64  piv) {...for (id
10990 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 33 3b 20  x = 0; idx < 3; 
109a0 69 64 78 2b 2b 29 20 7b 0a 09 09 09 73 77 69 74  idx++) {....swit
109b0 63 68 20 28 69 64 78 29 20 7b 0a 09 09 09 09 63  ch (idx) {.....c
109c0 61 73 65 20 30 3a 0a 09 09 09 09 09 70 69 76 5f  ase 0:......piv_
109d0 6f 69 64 20 3d 20 70 69 76 5f 6f 69 64 5f 70 69  oid = piv_oid_pi
109e0 76 61 75 74 68 3b 0a 09 09 09 09 09 70 69 76 5f  vauth;......piv_
109f0 6b 65 79 20 3d 20 4e 49 53 54 53 50 38 30 30 5f  key = NISTSP800_
10a00 37 38 5f 33 5f 4b 45 59 5f 50 49 56 41 55 54 48  78_3_KEY_PIVAUTH
10a10 3b 0a 09 09 09 09 09 70 69 76 5f 6c 61 62 65 6c  ;......piv_label
10a20 20 3d 20 22 41 75 74 68 65 6e 74 69 63 61 74 69   = "Authenticati
10a30 6f 6e 22 3b 0a 09 09 09 09 09 62 72 65 61 6b 3b  on";......break;
10a40 0a 09 09 09 09 63 61 73 65 20 31 3a 0a 09 09 09  .....case 1:....
10a50 09 09 70 69 76 5f 6f 69 64 20 3d 20 70 69 76 5f  ..piv_oid = piv_
10a60 6f 69 64 5f 73 69 67 6e 61 74 75 72 65 3b 0a 09  oid_signature;..
10a70 09 09 09 09 70 69 76 5f 6b 65 79 20 3d 20 4e 49  ....piv_key = NI
10a80 53 54 53 50 38 30 30 5f 37 38 5f 33 5f 4b 45 59  STSP800_78_3_KEY
10a90 5f 53 49 47 4e 41 54 55 52 45 3b 0a 09 09 09 09  _SIGNATURE;.....
10aa0 09 70 69 76 5f 6c 61 62 65 6c 20 3d 20 22 53 69  .piv_label = "Si
10ab0 67 6e 61 74 75 72 65 22 3b 0a 09 09 09 09 09 62  gnature";......b
10ac0 72 65 61 6b 3b 0a 09 09 09 09 63 61 73 65 20 32  reak;.....case 2
10ad0 3a 0a 09 09 09 09 09 70 69 76 5f 6f 69 64 20 3d  :......piv_oid =
10ae0 20 70 69 76 5f 6f 69 64 5f 6b 65 79 6d 67 74 3b   piv_oid_keymgt;
10af0 0a 09 09 09 09 09 70 69 76 5f 6b 65 79 20 3d 20  ......piv_key = 
10b00 4e 49 53 54 53 50 38 30 30 5f 37 38 5f 33 5f 4b  NISTSP800_78_3_K
10b10 45 59 5f 4b 45 59 4d 47 54 3b 0a 09 09 09 09 09  EY_KEYMGT;......
10b20 70 69 76 5f 6c 61 62 65 6c 20 3d 20 22 4b 65 79  piv_label = "Key
10b30 20 4d 61 6e 61 67 65 6d 65 6e 74 22 3b 0a 09 09   Management";...
10b40 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 7d 0a 0a  ...break;....}..
10b50 09 09 09 72 65 61 64 5f 72 65 74 20 3d 20 63 61  ...read_ret = ca
10b60 63 6b 65 79 5f 67 65 74 5f 64 61 74 61 28 73 6c  ckey_get_data(sl
10b70 6f 74 2c 20 62 75 66 66 65 72 2c 20 73 69 7a 65  ot, buffer, size
10b80 6f 66 28 62 75 66 66 65 72 29 2c 20 70 69 76 5f  of(buffer), piv_
10b90 6f 69 64 29 3b 0a 0a 09 09 09 69 66 20 28 72 65  oid);.....if (re
10ba0 61 64 5f 72 65 74 20 3c 3d 20 30 29 20 7b 0a 09  ad_ret <= 0) {..
10bb0 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09  ...continue;....
10bc0 7d 0a 0a 09 09 09 63 75 72 72 5f 69 64 20 3d 20  }.....curr_id = 
10bd0 26 63 65 72 74 73 5b 6f 75 74 69 64 78 5d 3b 0a  &certs[outidx];.
10be0 09 09 09 6f 75 74 69 64 78 2b 2b 3b 0a 0a 09 09  ...outidx++;....
10bf0 09 63 75 72 72 5f 69 64 2d 3e 6b 65 79 73 69 7a  .curr_id->keysiz
10c00 65 20 3d 20 2d 31 3b 0a 09 09 09 63 75 72 72 5f  e = -1;....curr_
10c10 69 64 2d 3e 69 64 5f 74 79 70 65 20 3d 20 43 41  id->id_type = CA
10c20 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 50 49 56  CKEY_ID_TYPE_PIV
10c30 3b 0a 09 09 09 63 75 72 72 5f 69 64 2d 3e 63 61  ;....curr_id->ca
10c40 72 64 2e 70 69 76 2e 6b 65 79 5f 69 64 20 3d 20  rd.piv.key_id = 
10c50 70 69 76 5f 6b 65 79 3b 0a 09 09 09 6d 65 6d 63  piv_key;....memc
10c60 70 79 28 63 75 72 72 5f 69 64 2d 3e 63 61 72 64  py(curr_id->card
10c70 2e 70 69 76 2e 6c 61 62 65 6c 2c 20 70 69 76 5f  .piv.label, piv_
10c80 6c 61 62 65 6c 2c 20 73 74 72 6c 65 6e 28 70 69  label, strlen(pi
10c90 76 5f 6c 61 62 65 6c 29 20 2b 20 31 29 3b 0a 0a  v_label) + 1);..
10ca0 09 09 09 63 75 72 72 5f 69 64 2d 3e 63 65 72 74  ...curr_id->cert
10cb0 69 66 69 63 61 74 65 5f 6c 65 6e 20 3d 20 72 65  ificate_len = re
10cc0 61 64 5f 72 65 74 3b 0a 09 09 09 63 75 72 72 5f  ad_ret;....curr_
10cd0 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65 20  id->certificate 
10ce0 3d 20 6d 61 6c 6c 6f 63 28 63 75 72 72 5f 69 64  = malloc(curr_id
10cf0 2d 3e 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65  ->certificate_le
10d00 6e 29 3b 0a 0a 09 09 09 62 75 66 66 65 72 5f 6c  n);.....buffer_l
10d10 65 6e 20 3d 20 73 69 7a 65 6f 66 28 62 75 66 66  en = sizeof(buff
10d20 65 72 29 3b 0a 09 09 09 62 75 66 66 65 72 5f 70  er);....buffer_p
10d30 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 62   = cackey_read_b
10d40 65 72 74 6c 76 5f 74 61 67 28 62 75 66 66 65 72  ertlv_tag(buffer
10d50 2c 20 26 62 75 66 66 65 72 5f 6c 65 6e 2c 20 30  , &buffer_len, 0
10d60 78 37 30 2c 20 63 75 72 72 5f 69 64 2d 3e 63 65  x70, curr_id->ce
10d70 72 74 69 66 69 63 61 74 65 2c 20 26 63 75 72 72  rtificate, &curr
10d80 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65  _id->certificate
10d90 5f 6c 65 6e 29 3b 0a 0a 09 09 09 69 66 20 28 62  _len);.....if (b
10da0 75 66 66 65 72 5f 70 20 3d 3d 20 4e 55 4c 4c 29  uffer_p == NULL)
10db0 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45   {.....CACKEY_DE
10dc0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 61 64  BUG_PRINTF("Read
10dd0 69 6e 67 20 63 65 72 74 69 66 69 63 61 74 65 20  ing certificate 
10de0 66 72 6f 6d 20 42 45 52 2d 54 4c 56 20 72 65 73  from BER-TLV res
10df0 70 6f 6e 73 65 20 66 61 69 6c 65 64 2c 20 73 6b  ponse failed, sk
10e00 69 70 70 69 6e 67 20 6b 65 79 20 25 69 22 2c 20  ipping key %i", 
10e10 69 64 78 29 3b 0a 0a 09 09 09 09 66 72 65 65 28  idx);......free(
10e20 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69  curr_id->certifi
10e30 63 61 74 65 29 3b 0a 0a 09 09 09 09 63 75 72 72  cate);......curr
10e40 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65  _id->certificate
10e50 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09 6f 75   = NULL;......ou
10e60 74 69 64 78 2d 2d 3b 0a 0a 09 09 09 09 63 6f 6e  tidx--;......con
10e70 74 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a 23 69 66  tinue;....}..#if
10e80 64 65 66 20 48 41 56 45 5f 4c 49 42 5a 0a 09 09  def HAVE_LIBZ...
10e90 09 69 66 20 28 63 75 72 72 5f 69 64 2d 3e 63 65  .if (curr_id->ce
10ea0 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3e 20  rtificate_len > 
10eb0 34 29 20 7b 0a 09 09 09 09 69 66 20 28 6d 65 6d  4) {.....if (mem
10ec0 63 6d 70 28 63 75 72 72 5f 69 64 2d 3e 63 65 72  cmp(curr_id->cer
10ed0 74 69 66 69 63 61 74 65 2c 20 22 5c 78 31 66 5c  tificate, "\x1f\
10ee0 78 38 62 5c 78 30 38 5c 78 30 30 22 2c 20 34 29  x8b\x08\x00", 4)
10ef0 20 3d 3d 20 30 29 20 7b 0a 09 09 09 09 09 74 6d   == 0) {......tm
10f00 70 62 75 66 6c 65 6e 20 3d 20 63 75 72 72 5f 69  pbuflen = curr_i
10f10 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65 5f 6c  d->certificate_l
10f20 65 6e 20 2a 20 32 3b 0a 09 09 09 09 09 74 6d 70  en * 2;......tmp
10f30 62 75 66 20 3d 20 6d 61 6c 6c 6f 63 28 74 6d 70  buf = malloc(tmp
10f40 62 75 66 6c 65 6e 29 3b 0a 0a 09 09 09 09 09 43  buflen);.......C
10f50 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
10f60 54 42 55 46 28 22 41 74 74 65 6d 70 74 69 6e 67  TBUF("Attempting
10f70 20 74 6f 20 64 65 63 6f 6d 70 72 65 73 73 3a 22   to decompress:"
10f80 2c 20 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69  , curr_id->certi
10f90 66 69 63 61 74 65 2c 20 63 75 72 72 5f 69 64 2d  ficate, curr_id-
10fa0 3e 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e  >certificate_len
10fb0 29 3b 0a 0a 09 09 09 09 09 67 7a 69 70 5f 73 74  );.......gzip_st
10fc0 72 65 61 6d 2e 7a 61 6c 6c 6f 63 20 3d 20 4e 55  ream.zalloc = NU
10fd0 4c 4c 3b 0a 09 09 09 09 09 67 7a 69 70 5f 73 74  LL;......gzip_st
10fe0 72 65 61 6d 2e 7a 66 72 65 65 20 3d 20 4e 55 4c  ream.zfree = NUL
10ff0 4c 3b 0a 09 09 09 09 09 67 7a 69 70 5f 73 74 72  L;......gzip_str
11000 65 61 6d 2e 6f 70 61 71 75 65 20 3d 20 4e 55 4c  eam.opaque = NUL
11010 4c 3b 0a 0a 09 09 09 09 09 67 7a 69 70 5f 73 74  L;.......gzip_st
11020 72 65 61 6d 2e 6e 65 78 74 5f 69 6e 20 20 3d 20  ream.next_in  = 
11030 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69  curr_id->certifi
11040 63 61 74 65 3b 0a 09 09 09 09 09 67 7a 69 70 5f  cate;......gzip_
11050 73 74 72 65 61 6d 2e 61 76 61 69 6c 5f 69 6e 20  stream.avail_in 
11060 3d 20 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69  = curr_id->certi
11070 66 69 63 61 74 65 5f 6c 65 6e 3b 0a 09 09 09 09  ficate_len;.....
11080 09 67 7a 69 70 5f 73 74 72 65 61 6d 2e 6e 65 78  .gzip_stream.nex
11090 74 5f 6f 75 74 20 3d 20 74 6d 70 62 75 66 3b 0a  t_out = tmpbuf;.
110a0 09 09 09 09 09 67 7a 69 70 5f 73 74 72 65 61 6d  .....gzip_stream
110b0 2e 61 76 61 69 6c 5f 6f 75 74 20 3d 20 74 6d 70  .avail_out = tmp
110c0 62 75 66 6c 65 6e 3b 0a 0a 09 09 09 09 09 75 6e  buflen;.......un
110d0 63 6f 6d 70 72 65 73 73 5f 72 65 74 20 3d 20 69  compress_ret = i
110e0 6e 66 6c 61 74 65 49 6e 69 74 28 26 67 7a 69 70  nflateInit(&gzip
110f0 5f 73 74 72 65 61 6d 29 3b 0a 09 09 09 09 09 69  _stream);......i
11100 66 20 28 75 6e 63 6f 6d 70 72 65 73 73 5f 72 65  f (uncompress_re
11110 74 20 3d 3d 20 5a 5f 4f 4b 29 20 7b 0a 09 09 09  t == Z_OK) {....
11120 09 09 09 75 6e 63 6f 6d 70 72 65 73 73 5f 72 65  ...uncompress_re
11130 74 20 3d 20 69 6e 66 6c 61 74 65 52 65 73 65 74  t = inflateReset
11140 32 28 26 67 7a 69 70 5f 73 74 72 65 61 6d 2c 20  2(&gzip_stream, 
11150 33 31 29 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09  31);......}.....
11160 09 69 66 20 28 75 6e 63 6f 6d 70 72 65 73 73 5f  .if (uncompress_
11170 72 65 74 20 3d 3d 20 5a 5f 4f 4b 29 20 7b 0a 09  ret == Z_OK) {..
11180 09 09 09 09 09 75 6e 63 6f 6d 70 72 65 73 73 5f  .....uncompress_
11190 72 65 74 20 3d 20 69 6e 66 6c 61 74 65 28 26 67  ret = inflate(&g
111a0 7a 69 70 5f 73 74 72 65 61 6d 2c 20 30 29 3b 0a  zip_stream, 0);.
111b0 09 09 09 09 09 7d 0a 09 09 09 09 09 69 66 20 28  .....}......if (
111c0 75 6e 63 6f 6d 70 72 65 73 73 5f 72 65 74 20 3d  uncompress_ret =
111d0 3d 20 5a 5f 53 54 52 45 41 4d 5f 45 4e 44 29 20  = Z_STREAM_END) 
111e0 7b 0a 09 09 09 09 09 09 75 6e 63 6f 6d 70 72 65  {.......uncompre
111f0 73 73 5f 72 65 74 20 3d 20 69 6e 66 6c 61 74 65  ss_ret = inflate
11200 45 6e 64 28 26 67 7a 69 70 5f 73 74 72 65 61 6d  End(&gzip_stream
11210 29 3b 0a 09 09 09 09 09 7d 20 65 6c 73 65 20 7b  );......} else {
11220 0a 09 09 09 09 09 09 75 6e 63 6f 6d 70 72 65 73  .......uncompres
11230 73 5f 72 65 74 20 3d 20 5a 5f 44 41 54 41 5f 45  s_ret = Z_DATA_E
11240 52 52 4f 52 3b 0a 09 09 09 09 09 7d 0a 09 09 09  RROR;......}....
11250 09 09 69 66 20 28 75 6e 63 6f 6d 70 72 65 73 73  ..if (uncompress
11260 5f 72 65 74 20 3d 3d 20 5a 5f 4f 4b 29 20 7b 0a  _ret == Z_OK) {.
11270 09 09 09 09 09 09 74 6d 70 62 75 66 6c 65 6e 20  ......tmpbuflen 
11280 3d 20 67 7a 69 70 5f 73 74 72 65 61 6d 2e 74 6f  = gzip_stream.to
11290 74 61 6c 5f 6f 75 74 3b 0a 0a 09 09 09 09 09 09  tal_out;........
112a0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
112b0 4e 54 42 55 46 28 22 44 65 63 6f 6d 70 72 65 73  NTBUF("Decompres
112c0 73 65 64 20 74 6f 3a 22 2c 20 74 6d 70 62 75 66  sed to:", tmpbuf
112d0 2c 20 74 6d 70 62 75 66 6c 65 6e 29 3b 0a 0a 09  , tmpbuflen);...
112e0 09 09 09 09 09 66 72 65 65 28 63 75 72 72 5f 69  .....free(curr_i
112f0 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65 29 3b  d->certificate);
11300 0a 0a 09 09 09 09 09 09 63 75 72 72 5f 69 64 2d  ........curr_id-
11310 3e 63 65 72 74 69 66 69 63 61 74 65 20 3d 20 74  >certificate = t
11320 6d 70 62 75 66 3b 0a 09 09 09 09 09 09 63 75 72  mpbuf;.......cur
11330 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74  r_id->certificat
11340 65 5f 6c 65 6e 20 3d 20 74 6d 70 62 75 66 6c 65  e_len = tmpbufle
11350 6e 3b 0a 09 09 09 09 09 7d 20 65 6c 73 65 20 7b  n;......} else {
11360 0a 09 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45  .......CACKEY_DE
11370 42 55 47 5f 50 52 49 4e 54 46 28 22 44 65 63 6f  BUG_PRINTF("Deco
11380 6d 70 72 65 73 73 69 6e 67 20 66 61 69 6c 65 64  mpressing failed
11390 21 20 75 6e 63 6f 6d 70 72 65 73 73 28 29 20 72  ! uncompress() r
113a0 65 74 75 72 6e 65 64 20 25 69 22 2c 20 75 6e 63  eturned %i", unc
113b0 6f 6d 70 72 65 73 73 5f 72 65 74 29 3b 0a 0a 09  ompress_ret);...
113c0 09 09 09 09 09 66 72 65 65 28 74 6d 70 62 75 66  .....free(tmpbuf
113d0 29 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a  );......}.....}.
113e0 09 09 09 7d 0a 23 65 6e 64 69 66 0a 09 09 7d 0a  ...}.#endif...}.
113f0 09 7d 20 65 6c 73 65 20 7b 0a 09 09 2f 2a 20 52  .} else {.../* R
11400 65 61 64 20 61 6c 6c 20 74 68 65 20 61 70 70 6c  ead all the appl
11410 65 74 73 20 66 72 6f 6d 20 74 68 65 20 43 43 43  ets from the CCC
11420 27 73 20 54 4c 56 20 2a 2f 0a 09 09 63 63 63 5f  's TLV */...ccc_
11430 74 6c 76 20 3d 20 63 61 63 6b 65 79 5f 72 65 61  tlv = cackey_rea
11440 64 5f 74 6c 76 28 73 6c 6f 74 29 3b 0a 0a 09 09  d_tlv(slot);....
11450 2f 2a 20 4c 6f 6f 6b 20 66 6f 72 20 43 41 52 44  /* Look for CARD
11460 55 52 4c 73 20 74 68 61 74 20 63 6f 6f 72 65 73  URLs that coores
11470 70 6f 6e 64 20 74 6f 20 50 4b 49 20 61 70 70 6c  pond to PKI appl
11480 65 74 73 20 2a 2f 0a 09 09 66 6f 72 20 28 63 63  ets */...for (cc
11490 63 5f 63 75 72 72 20 3d 20 63 63 63 5f 74 6c 76  c_curr = ccc_tlv
114a0 3b 20 63 63 63 5f 63 75 72 72 3b 20 63 63 63 5f  ; ccc_curr; ccc_
114b0 63 75 72 72 20 3d 20 63 63 63 5f 63 75 72 72 2d  curr = ccc_curr-
114c0 3e 5f 6e 65 78 74 29 20 7b 0a 09 09 09 43 41 43  >_next) {....CAC
114d0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
114e0 28 22 46 6f 75 6e 64 20 74 61 67 3a 20 25 73 20  ("Found tag: %s 
114f0 2e 2e 2e 20 22 2c 20 43 41 43 4b 45 59 5f 44 45  ... ", CACKEY_DE
11500 42 55 47 5f 46 55 4e 43 5f 54 41 47 5f 54 4f 5f  BUG_FUNC_TAG_TO_
11510 53 54 52 28 63 63 63 5f 63 75 72 72 2d 3e 74 61  STR(ccc_curr->ta
11520 67 29 29 3b 0a 0a 09 09 09 69 66 20 28 63 63 63  g));.....if (ccc
11530 5f 63 75 72 72 2d 3e 74 61 67 20 21 3d 20 47 53  _curr->tag != GS
11540 43 49 53 5f 54 41 47 5f 43 41 52 44 55 52 4c 29  CIS_TAG_CARDURL)
11550 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45   {.....CACKEY_DE
11560 42 55 47 5f 50 52 49 4e 54 46 28 22 20 20 2e 2e  BUG_PRINTF("  ..
11570 2e 20 73 6b 69 70 70 69 6e 67 20 69 74 20 28 77  . skipping it (w
11580 65 20 6f 6e 6c 79 20 63 61 72 65 20 61 62 6f 75  e only care abou
11590 74 20 43 41 52 44 55 52 4c 73 29 22 29 3b 0a 0a  t CARDURLs)");..
115a0 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09  ....continue;...
115b0 09 7d 0a 0a 09 09 09 69 66 20 28 28 63 63 63 5f  .}.....if ((ccc_
115c0 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64  curr->value_card
115d0 75 72 6c 2d 3e 61 70 70 74 79 70 65 20 26 20 43  url->apptype & C
115e0 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 50 4b  ACKEY_TLV_APP_PK
115f0 49 29 20 21 3d 20 43 41 43 4b 45 59 5f 54 4c 56  I) != CACKEY_TLV
11600 5f 41 50 50 5f 50 4b 49 29 20 7b 0a 09 09 09 09  _APP_PKI) {.....
11610 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
11620 4e 54 46 28 22 20 20 2e 2e 2e 20 73 6b 69 70 70  NTF("  ... skipp
11630 69 6e 67 20 69 74 20 28 77 65 20 6f 6e 6c 79 20  ing it (we only 
11640 63 61 72 65 20 61 62 6f 75 74 20 50 4b 49 20 61  care about PKI a
11650 70 70 6c 65 74 73 2c 20 74 68 69 73 20 61 70 70  pplets, this app
11660 6c 65 74 20 73 75 70 70 6f 72 74 73 3a 20 25 73  let supports: %s
11670 2f 25 30 32 78 29 22 2c 20 43 41 43 4b 45 59 5f  /%02x)", CACKEY_
11680 44 45 42 55 47 5f 46 55 4e 43 5f 41 50 50 54 59  DEBUG_FUNC_APPTY
11690 50 45 5f 54 4f 5f 53 54 52 28 63 63 63 5f 63 75  PE_TO_STR(ccc_cu
116a0 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72  rr->value_cardur
116b0 6c 2d 3e 61 70 70 74 79 70 65 29 2c 20 28 75 6e  l->apptype), (un
116c0 73 69 67 6e 65 64 20 69 6e 74 29 20 63 63 63 5f  signed int) ccc_
116d0 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64  curr->value_card
116e0 75 72 6c 2d 3e 61 70 70 74 79 70 65 29 3b 0a 0a  url->apptype);..
116f0 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09  ....continue;...
11700 09 7d 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  .}.....CACKEY_DE
11710 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22 52 49  BUG_PRINTBUF("RI
11720 44 3a 22 2c 20 63 63 63 5f 63 75 72 72 2d 3e 76  D:", ccc_curr->v
11730 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 72 69  alue_cardurl->ri
11740 64 2c 20 73 69 7a 65 6f 66 28 63 63 63 5f 63 75  d, sizeof(ccc_cu
11750 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72  rr->value_cardur
11760 6c 2d 3e 72 69 64 29 29 3b 0a 09 09 09 43 41 43  l->rid));....CAC
11770 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
11780 28 22 41 70 70 49 44 20 3d 20 25 73 2f 25 30 34  ("AppID = %s/%04
11790 6c 78 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55  lx", CACKEY_DEBU
117a0 47 5f 46 55 4e 43 5f 4f 42 4a 49 44 5f 54 4f 5f  G_FUNC_OBJID_TO_
117b0 53 54 52 28 63 63 63 5f 63 75 72 72 2d 3e 76 61  STR(ccc_curr->va
117c0 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70  lue_cardurl->app
117d0 69 64 29 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  id), (unsigned l
117e0 6f 6e 67 29 20 63 63 63 5f 63 75 72 72 2d 3e 76  ong) ccc_curr->v
117f0 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70  alue_cardurl->ap
11800 70 69 64 29 3b 0a 09 09 09 43 41 43 4b 45 59 5f  pid);....CACKEY_
11810 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4f 62  DEBUG_PRINTF("Ob
11820 6a 65 63 74 49 44 20 3d 20 25 73 2f 25 30 34 6c  jectID = %s/%04l
11830 78 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47  x", CACKEY_DEBUG
11840 5f 46 55 4e 43 5f 4f 42 4a 49 44 5f 54 4f 5f 53  _FUNC_OBJID_TO_S
11850 54 52 28 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c  TR(ccc_curr->val
11860 75 65 5f 63 61 72 64 75 72 6c 2d 3e 6f 62 6a 65  ue_cardurl->obje
11870 63 74 69 64 29 2c 20 28 75 6e 73 69 67 6e 65 64  ctid), (unsigned
11880 20 6c 6f 6e 67 29 20 63 63 63 5f 63 75 72 72 2d   long) ccc_curr-
11890 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e  >value_cardurl->
118a0 6f 62 6a 65 63 74 69 64 29 3b 0a 0a 09 09 09 6d  objectid);.....m
118b0 65 6d 63 70 79 28 63 75 72 72 5f 61 69 64 2c 20  emcpy(curr_aid, 
118c0 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f  ccc_curr->value_
118d0 63 61 72 64 75 72 6c 2d 3e 72 69 64 2c 20 73 69  cardurl->rid, si
118e0 7a 65 6f 66 28 63 63 63 5f 63 75 72 72 2d 3e 76  zeof(ccc_curr->v
118f0 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 72 69  alue_cardurl->ri
11900 64 29 29 3b 0a 09 09 09 63 75 72 72 5f 61 69 64  d));....curr_aid
11910 5b 73 69 7a 65 6f 66 28 63 75 72 72 5f 61 69 64  [sizeof(curr_aid
11920 29 20 2d 20 32 5d 20 3d 20 28 63 63 63 5f 63 75  ) - 2] = (ccc_cu
11930 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72  rr->value_cardur
11940 6c 2d 3e 61 70 70 69 64 20 3e 3e 20 38 29 20 26  l->appid >> 8) &
11950 20 30 78 66 66 3b 0a 09 09 09 63 75 72 72 5f 61   0xff;....curr_a
11960 69 64 5b 73 69 7a 65 6f 66 28 63 75 72 72 5f 61  id[sizeof(curr_a
11970 69 64 29 20 2d 20 31 5d 20 3d 20 63 63 63 5f 63  id) - 1] = ccc_c
11980 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75  urr->value_cardu
11990 72 6c 2d 3e 61 70 70 69 64 20 26 20 30 78 66 66  rl->appid & 0xff
119a0 3b 0a 0a 09 09 09 2f 2a 20 53 65 6c 65 63 74 20  ;...../* Select 
119b0 66 6f 75 6e 64 20 61 70 70 6c 65 74 20 2e 2e 2e  found applet ...
119c0 20 2a 2f 0a 09 09 09 73 65 6c 65 63 74 5f 72 65   */....select_re
119d0 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6c 65 63  t = cackey_selec
119e0 74 5f 61 70 70 6c 65 74 28 73 6c 6f 74 2c 20 63  t_applet(slot, c
119f0 75 72 72 5f 61 69 64 2c 20 73 69 7a 65 6f 66 28  urr_aid, sizeof(
11a00 63 75 72 72 5f 61 69 64 29 29 3b 0a 09 09 09 69  curr_aid));....i
11a10 66 20 28 73 65 6c 65 63 74 5f 72 65 74 20 21 3d  f (select_ret !=
11a20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f   CACKEY_PCSC_S_O
11a30 4b 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f  K) {.....CACKEY_
11a40 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 61  DEBUG_PRINTF("Fa
11a50 69 6c 65 64 20 74 6f 20 73 65 6c 65 63 74 20 61  iled to select a
11a60 70 70 6c 65 74 2c 20 73 6b 69 70 70 69 6e 67 20  pplet, skipping 
11a70 70 72 6f 63 65 73 73 69 6e 67 20 6f 66 20 74 68  processing of th
11a80 69 73 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09  is object");....
11a90 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 7d  ..continue;....}
11aa0 0a 0a 09 09 09 2f 2a 20 2e 2e 2e 20 61 6e 64 20  ...../* ... and 
11ab0 6f 62 6a 65 63 74 20 28 66 69 6c 65 29 20 2a 2f  object (file) */
11ac0 0a 09 09 09 73 65 6c 65 63 74 5f 72 65 74 20 3d  ....select_ret =
11ad0 20 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 66   cackey_select_f
11ae0 69 6c 65 28 73 6c 6f 74 2c 20 63 63 63 5f 63 75  ile(slot, ccc_cu
11af0 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72  rr->value_cardur
11b00 6c 2d 3e 6f 62 6a 65 63 74 69 64 29 3b 0a 09 09  l->objectid);...
11b10 09 69 66 20 28 73 65 6c 65 63 74 5f 72 65 74 20  .if (select_ret 
11b20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  != CACKEY_PCSC_S
11b30 5f 4f 4b 29 20 7b 0a 09 09 09 09 43 41 43 4b 45  _OK) {.....CACKE
11b40 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
11b50 46 61 69 6c 65 64 20 74 6f 20 73 65 6c 65 63 74  Failed to select
11b60 20 66 69 6c 65 2c 20 73 6b 69 70 70 69 6e 67 20   file, skipping 
11b70 70 72 6f 63 65 73 73 69 6e 67 20 6f 66 20 74 68  processing of th
11b80 69 73 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09  is object");....
11b90 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 7d  ..continue;....}
11ba0 0a 0a 09 09 09 2f 2a 20 50 72 6f 63 65 73 73 20  ...../* Process 
11bb0 74 68 69 73 20 66 69 6c 65 27 73 20 54 4c 56 20  this file's TLV 
11bc0 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 63 65 72 74  looking for cert
11bd0 69 66 69 63 61 74 65 73 20 2a 2f 0a 09 09 09 61  ificates */....a
11be0 70 70 5f 74 6c 76 20 3d 20 63 61 63 6b 65 79 5f  pp_tlv = cackey_
11bf0 72 65 61 64 5f 74 6c 76 28 73 6c 6f 74 29 3b 0a  read_tlv(slot);.
11c00 09 0a 09 09 09 66 6f 72 20 28 61 70 70 5f 63 75  .....for (app_cu
11c10 72 72 20 3d 20 61 70 70 5f 74 6c 76 3b 20 61 70  rr = app_tlv; ap
11c20 70 5f 63 75 72 72 3b 20 61 70 70 5f 63 75 72 72  p_curr; app_curr
11c30 20 3d 20 61 70 70 5f 63 75 72 72 2d 3e 5f 6e 65   = app_curr->_ne
11c40 78 74 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59  xt) {.....CACKEY
11c50 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46  _DEBUG_PRINTF("F
11c60 6f 75 6e 64 20 74 61 67 3a 20 25 73 22 2c 20 43  ound tag: %s", C
11c70 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43  ACKEY_DEBUG_FUNC
11c80 5f 54 41 47 5f 54 4f 5f 53 54 52 28 61 70 70 5f  _TAG_TO_STR(app_
11c90 63 75 72 72 2d 3e 74 61 67 29 29 3b 0a 09 09 09  curr->tag));....
11ca0 09 69 66 20 28 61 70 70 5f 63 75 72 72 2d 3e 74  .if (app_curr->t
11cb0 61 67 20 21 3d 20 47 53 43 49 53 5f 54 41 47 5f  ag != GSCIS_TAG_
11cc0 43 45 52 54 49 46 49 43 41 54 45 29 20 7b 0a 09  CERTIFICATE) {..
11cd0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
11ce0 5f 50 52 49 4e 54 46 28 22 20 20 2e 2e 2e 20 73  _PRINTF("  ... s
11cf0 6b 69 70 70 69 6e 67 20 69 74 20 28 77 65 20 6f  kipping it (we o
11d00 6e 6c 79 20 63 61 72 65 20 61 62 6f 75 74 20 43  nly care about C
11d10 45 52 54 49 46 49 43 41 54 45 73 29 22 29 3b 0a  ERTIFICATEs)");.
11d20 0a 09 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a  ......continue;.
11d30 09 09 09 09 7d 0a 0a 09 09 09 09 63 75 72 72 5f  ....}......curr_
11d40 69 64 20 3d 20 26 63 65 72 74 73 5b 6f 75 74 69  id = &certs[outi
11d50 64 78 5d 3b 0a 09 09 09 09 6f 75 74 69 64 78 2b  dx];.....outidx+
11d60 2b 3b 0a 0a 09 09 09 09 63 75 72 72 5f 69 64 2d  +;......curr_id-
11d70 3e 69 64 5f 74 79 70 65 20 3d 20 43 41 43 4b 45  >id_type = CACKE
11d80 59 5f 49 44 5f 54 59 50 45 5f 43 41 43 3b 0a 09  Y_ID_TYPE_CAC;..
11d90 09 09 09 6d 65 6d 63 70 79 28 63 75 72 72 5f 69  ...memcpy(curr_i
11da0 64 2d 3e 63 61 72 64 2e 63 61 63 2e 61 70 70 6c  d->card.cac.appl
11db0 65 74 2c 20 63 75 72 72 5f 61 69 64 2c 20 73 69  et, curr_aid, si
11dc0 7a 65 6f 66 28 63 75 72 72 5f 69 64 2d 3e 63 61  zeof(curr_id->ca
11dd0 72 64 2e 63 61 63 2e 61 70 70 6c 65 74 29 29 3b  rd.cac.applet));
11de0 0a 09 09 09 09 63 75 72 72 5f 69 64 2d 3e 63 61  .....curr_id->ca
11df0 72 64 2e 63 61 63 2e 66 69 6c 65 20 3d 20 63 63  rd.cac.file = cc
11e00 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61  c_curr->value_ca
11e10 72 64 75 72 6c 2d 3e 6f 62 6a 65 63 74 69 64 3b  rdurl->objectid;
11e20 0a 09 09 09 09 63 75 72 72 5f 69 64 2d 3e 6b 65  .....curr_id->ke
11e30 79 73 69 7a 65 20 3d 20 2d 31 3b 0a 0a 09 09 09  ysize = -1;.....
11e40 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
11e50 49 4e 54 46 28 22 46 69 6c 6c 69 6e 67 20 63 75  INTF("Filling cu
11e60 72 72 5f 69 64 2d 3e 63 61 72 64 2e 63 61 63 2e  rr_id->card.cac.
11e70 61 70 70 6c 65 74 20 28 25 70 29 20 77 69 74 68  applet (%p) with
11e80 20 25 6c 75 20 62 79 74 65 73 3a 22 2c 20 63 75   %lu bytes:", cu
11e90 72 72 5f 69 64 2d 3e 63 61 72 64 2e 63 61 63 2e  rr_id->card.cac.
11ea0 61 70 70 6c 65 74 2c 20 28 75 6e 73 69 67 6e 65  applet, (unsigne
11eb0 64 20 6c 6f 6e 67 29 20 73 69 7a 65 6f 66 28 63  d long) sizeof(c
11ec0 75 72 72 5f 69 64 2d 3e 63 61 72 64 2e 63 61 63  urr_id->card.cac
11ed0 2e 61 70 70 6c 65 74 29 29 3b 0a 09 09 09 09 43  .applet));.....C
11ee0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
11ef0 54 42 55 46 28 22 56 41 4c 3a 22 2c 20 63 75 72  TBUF("VAL:", cur
11f00 72 5f 69 64 2d 3e 63 61 72 64 2e 63 61 63 2e 61  r_id->card.cac.a
11f10 70 70 6c 65 74 2c 20 73 69 7a 65 6f 66 28 63 75  pplet, sizeof(cu
11f20 72 72 5f 69 64 2d 3e 63 61 72 64 2e 63 61 63 2e  rr_id->card.cac.
11f30 61 70 70 6c 65 74 29 29 3b 0a 0a 09 09 09 09 63  applet));......c
11f40 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63  urr_id->certific
11f50 61 74 65 5f 6c 65 6e 20 3d 20 61 70 70 5f 63 75  ate_len = app_cu
11f60 72 72 2d 3e 6c 65 6e 67 74 68 3b 0a 0a 09 09 09  rr->length;.....
11f70 09 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66  .curr_id->certif
11f80 69 63 61 74 65 20 3d 20 6d 61 6c 6c 6f 63 28 63  icate = malloc(c
11f90 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63  urr_id->certific
11fa0 61 74 65 5f 6c 65 6e 29 3b 0a 09 09 09 09 6d 65  ate_len);.....me
11fb0 6d 63 70 79 28 63 75 72 72 5f 69 64 2d 3e 63 65  mcpy(curr_id->ce
11fc0 72 74 69 66 69 63 61 74 65 2c 20 61 70 70 5f 63  rtificate, app_c
11fd0 75 72 72 2d 3e 76 61 6c 75 65 2c 20 63 75 72 72  urr->value, curr
11fe0 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65  _id->certificate
11ff0 5f 6c 65 6e 29 3b 0a 0a 09 09 09 09 69 66 20 28  _len);......if (
12000 6f 75 74 69 64 78 20 3e 3d 20 2a 63 6f 75 6e 74  outidx >= *count
12010 29 20 7b 0a 09 09 09 09 09 69 66 20 28 63 65 72  ) {......if (cer
12020 74 73 5f 72 65 73 69 7a 61 62 6c 65 29 20 7b 0a  ts_resizable) {.
12030 09 09 09 09 09 09 2a 63 6f 75 6e 74 20 2a 3d 20  ......*count *= 
12040 32 3b 0a 09 09 09 09 09 09 69 66 20 28 2a 63 6f  2;.......if (*co
12050 75 6e 74 20 21 3d 20 30 29 20 7b 0a 09 09 09 09  unt != 0) {.....
12060 09 09 09 63 65 72 74 73 20 3d 20 72 65 61 6c 6c  ...certs = reall
12070 6f 63 28 63 65 72 74 73 2c 20 73 69 7a 65 6f 66  oc(certs, sizeof
12080 28 2a 63 65 72 74 73 29 20 2a 20 28 2a 63 6f 75  (*certs) * (*cou
12090 6e 74 29 29 3b 0a 09 09 09 09 09 09 7d 20 65 6c  nt));.......} el
120a0 73 65 20 7b 0a 09 09 09 09 09 09 09 63 65 72 74  se {........cert
120b0 73 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 09  s = NULL;.......
120c0 7d 0a 09 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a  }......} else {.
120d0 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
120e0 09 09 7d 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a  ..}.....}....}..
120f0 09 09 09 63 61 63 6b 65 79 5f 66 72 65 65 5f 74  ...cackey_free_t
12100 6c 76 28 61 70 70 5f 74 6c 76 29 3b 0a 0a 09 09  lv(app_tlv);....
12110 09 69 66 20 28 6f 75 74 69 64 78 20 3e 3d 20 2a  .if (outidx >= *
12120 63 6f 75 6e 74 29 20 7b 0a 09 09 09 09 62 72 65  count) {.....bre
12130 61 6b 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09  ak;....}...}....
12140 63 61 63 6b 65 79 5f 66 72 65 65 5f 74 6c 76 28  cackey_free_tlv(
12150 63 63 63 5f 74 6c 76 29 3b 0a 09 7d 0a 0a 09 2a  ccc_tlv);..}...*
12160 63 6f 75 6e 74 20 3d 20 6f 75 74 69 64 78 3b 0a  count = outidx;.
12170 0a 09 69 66 20 28 63 65 72 74 73 5f 72 65 73 69  ..if (certs_resi
12180 7a 61 62 6c 65 29 20 7b 0a 09 09 69 66 20 28 2a  zable) {...if (*
12190 63 6f 75 6e 74 20 21 3d 20 30 29 20 7b 0a 09 09  count != 0) {...
121a0 09 63 65 72 74 73 20 3d 20 72 65 61 6c 6c 6f 63  .certs = realloc
121b0 28 63 65 72 74 73 2c 20 73 69 7a 65 6f 66 28 2a  (certs, sizeof(*
121c0 63 65 72 74 73 29 20 2a 20 28 2a 63 6f 75 6e 74  certs) * (*count
121d0 29 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09  ));...} else {..
121e0 09 09 63 65 72 74 73 20 3d 20 4e 55 4c 4c 3b 0a  ..certs = NULL;.
121f0 09 09 7d 0a 09 7d 0a 0a 09 73 6c 6f 74 2d 3e 63  ..}..}...slot->c
12200 61 63 68 65 64 5f 63 65 72 74 73 20 3d 20 63 61  ached_certs = ca
12210 63 6b 65 79 5f 63 6f 70 79 5f 63 65 72 74 73 28  ckey_copy_certs(
12220 4e 55 4c 4c 2c 20 63 65 72 74 73 2c 20 2a 63 6f  NULL, certs, *co
12230 75 6e 74 29 3b 0a 09 73 6c 6f 74 2d 3e 63 61 63  unt);..slot->cac
12240 68 65 64 5f 63 65 72 74 73 5f 63 6f 75 6e 74 20  hed_certs_count 
12250 3d 20 2a 63 6f 75 6e 74 3b 0a 0a 09 2f 2a 20 54  = *count;.../* T
12260 65 72 6d 69 6e 61 74 65 20 53 6d 61 72 74 43 61  erminate SmartCa
12270 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a  rd Transaction *
12280 2f 0a 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72  /..cackey_end_tr
12290 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b  ansaction(slot);
122a0 0a 0a 09 72 65 74 75 72 6e 28 63 65 72 74 73 29  ...return(certs)
122b0 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f  ;.}../*. * SYNPO
122c0 53 49 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20  SIS. *     .... 
122d0 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20  *. * ARGUMENTS. 
122e0 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20  *     .... *. * 
122f0 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20  RETURN VALUE. * 
12300 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f      .... *. * NO
12310 54 45 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20  TES. *     .... 
12320 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 73 73 69  *. */.static ssi
12330 7a 65 5f 74 20 63 61 63 6b 65 79 5f 73 69 67 6e  ze_t cackey_sign
12340 64 65 63 72 79 70 74 28 73 74 72 75 63 74 20 63  decrypt(struct c
12350 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74  ackey_slot *slot
12360 2c 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  , struct cackey_
12370 69 64 65 6e 74 69 74 79 20 2a 69 64 65 6e 74 69  identity *identi
12380 74 79 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ty, unsigned cha
12390 72 20 2a 62 75 66 2c 20 73 69 7a 65 5f 74 20 62  r *buf, size_t b
123a0 75 66 6c 65 6e 2c 20 75 6e 73 69 67 6e 65 64 20  uflen, unsigned 
123b0 63 68 61 72 20 2a 6f 75 74 62 75 66 2c 20 73 69  char *outbuf, si
123c0 7a 65 5f 74 20 6f 75 74 62 75 66 6c 65 6e 2c 20  ze_t outbuflen, 
123d0 69 6e 74 20 70 61 64 49 6e 70 75 74 2c 20 69 6e  int padInput, in
123e0 74 20 75 6e 70 61 64 4f 75 74 70 75 74 29 20 7b  t unpadOutput) {
123f0 0a 09 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64  ..cackey_pcsc_id
12400 5f 74 79 70 65 20 69 64 5f 74 79 70 65 3b 0a 09  _type id_type;..
12410 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 64 79  unsigned char dy
12420 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74 65 5b  n_auth_template[
12430 31 30 5d 2c 20 2a 64 79 6e 5f 61 75 74 68 5f 74  10], *dyn_auth_t
12440 6d 70 62 75 66 3b 0a 09 75 6e 73 69 67 6e 65 64  mpbuf;..unsigned
12450 20 63 68 61 72 20 2a 74 6d 70 62 75 66 2c 20 2a   char *tmpbuf, *
12460 74 6d 70 62 75 66 5f 73 2c 20 2a 6f 75 74 62 75  tmpbuf_s, *outbu
12470 66 5f 73 2c 20 2a 6f 75 74 62 75 66 5f 70 3b 0a  f_s, *outbuf_p;.
12480 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 62  .unsigned char b
12490 79 74 65 73 5f 74 6f 5f 73 65 6e 64 2c 20 70 31  ytes_to_send, p1
124a0 2c 20 63 6c 61 73 73 3b 0a 09 75 6e 73 69 67 6e  , class;..unsign
124b0 65 64 20 63 68 61 72 20 62 6c 6f 63 6b 74 79 70  ed char blocktyp
124c0 65 3b 0a 09 63 61 63 6b 65 79 5f 72 65 74 20 73  e;..cackey_ret s
124d0 65 6e 64 5f 72 65 74 3b 0a 09 75 69 6e 74 31 36  end_ret;..uint16
124e0 5f 74 20 72 65 73 70 63 6f 64 65 3b 0a 09 73 73  _t respcode;..ss
124f0 69 7a 65 5f 74 20 72 65 74 76 61 6c 20 3d 20 30  ize_t retval = 0
12500 2c 20 75 6e 70 61 64 6f 66 66 73 65 74 3b 0a 09  , unpadoffset;..
12510 73 69 7a 65 5f 74 20 74 6d 70 62 75 66 6c 65 6e  size_t tmpbuflen
12520 2c 20 70 61 64 6c 65 6e 2c 20 74 6d 70 6f 75 74  , padlen, tmpout
12530 62 75 66 6c 65 6e 2c 20 6f 75 74 62 75 66 5f 6c  buflen, outbuf_l
12540 65 6e 3b 0a 09 69 6e 74 20 66 72 65 65 5f 74 6d  en;..int free_tm
12550 70 62 75 66 20 3d 20 30 3b 0a 09 69 6e 74 20 6c  pbuf = 0;..int l
12560 65 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  e;...CACKEY_DEBU
12570 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
12580 2e 22 29 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 20  .");...if (slot 
12590 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43  == NULL) {...CAC
125a0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
125b0 28 22 45 72 72 6f 72 2e 20 20 73 6c 6f 74 20 69  ("Error.  slot i
125c0 73 20 4e 55 4c 4c 22 29 3b 0a 0a 09 09 72 65 74  s NULL");....ret
125d0 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 69 66  urn(-1);..}...if
125e0 20 28 62 75 66 20 3d 3d 20 4e 55 4c 4c 29 20 7b   (buf == NULL) {
125f0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
12600 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
12610 62 75 66 20 69 73 20 4e 55 4c 4c 22 29 3b 0a 0a  buf is NULL");..
12620 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d  ..return(-1);..}
12630 0a 0a 09 69 66 20 28 6f 75 74 62 75 66 20 3d 3d  ...if (outbuf ==
12640 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
12650 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
12660 45 72 72 6f 72 2e 20 20 6f 75 74 62 75 66 20 69  Error.  outbuf i
12670 73 20 4e 55 4c 4c 22 29 3b 0a 0a 09 09 72 65 74  s NULL");....ret
12680 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 69 66  urn(-1);..}...if
12690 20 28 69 64 65 6e 74 69 74 79 20 3d 3d 20 4e 55   (identity == NU
126a0 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
126b0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
126c0 6f 72 2e 20 20 69 64 65 6e 74 69 74 79 20 69 73  or.  identity is
126d0 20 4e 55 4c 4c 22 29 3b 0a 0a 09 09 72 65 74 75   NULL");....retu
126e0 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 69 66 20  rn(-1);..}...if 
126f0 28 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f  (identity->pcsc_
12700 69 64 65 6e 74 69 74 79 20 3d 3d 20 4e 55 4c 4c  identity == NULL
12710 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
12720 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
12730 2e 20 20 69 64 65 6e 74 69 74 79 2d 3e 70 63 73  .  identity->pcs
12740 63 5f 69 64 65 6e 74 69 74 79 20 69 73 20 4e 55  c_identity is NU
12750 4c 4c 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  LL");....return(
12760 2d 31 29 3b 0a 09 7d 0a 0a 09 69 64 5f 74 79 70  -1);..}...id_typ
12770 65 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e 70 63  e = identity->pc
12780 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 69 64 5f  sc_identity->id_
12790 74 79 70 65 3b 0a 09 69 66 20 28 69 64 5f 74 79  type;..if (id_ty
127a0 70 65 20 3d 3d 20 43 41 43 4b 45 59 5f 49 44 5f  pe == CACKEY_ID_
127b0 54 59 50 45 5f 43 45 52 54 5f 4f 4e 4c 59 29 20  TYPE_CERT_ONLY) 
127c0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
127d0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
127e0 20 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f   identity->pcsc_
127f0 69 64 65 6e 74 69 74 79 20 69 73 20 43 41 43 4b  identity is CACK
12800 45 59 5f 49 44 5f 54 59 50 45 5f 43 45 52 54 5f  EY_ID_TYPE_CERT_
12810 4f 4e 4c 59 2c 20 77 68 69 63 68 20 63 61 6e 6e  ONLY, which cann
12820 6f 74 20 62 65 20 75 73 65 64 20 66 6f 72 20 73  ot be used for s
12830 69 67 6e 2f 64 65 63 72 79 70 74 22 29 3b 0a 0a  ign/decrypt");..
12840 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d  ..return(-1);..}
12850 0a 0a 09 73 77 69 74 63 68 20 28 69 64 5f 74 79  ...switch (id_ty
12860 70 65 29 20 7b 0a 09 09 63 61 73 65 20 43 41 43  pe) {...case CAC
12870 4b 45 59 5f 49 44 5f 54 59 50 45 5f 50 49 56 3a  KEY_ID_TYPE_PIV:
12880 0a 09 09 63 61 73 65 20 43 41 43 4b 45 59 5f 49  ...case CACKEY_I
12890 44 5f 54 59 50 45 5f 43 41 43 3a 0a 09 09 09 62  D_TYPE_CAC:....b
128a0 72 65 61 6b 3b 0a 09 09 64 65 66 61 75 6c 74 3a  reak;...default:
128b0 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
128c0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
128d0 20 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f   identity->pcsc_
128e0 69 64 65 6e 74 69 74 79 20 69 73 20 6e 6f 74 20  identity is not 
128f0 61 20 73 75 70 70 6f 72 74 65 64 20 76 61 6c 75  a supported valu
12900 65 2e 20 54 79 70 65 20 69 73 3a 20 30 78 25 6c  e. Type is: 0x%l
12910 78 20 28 50 49 56 20 3d 20 30 78 25 6c 78 2c 20  x (PIV = 0x%lx, 
12920 43 41 43 20 3d 20 30 78 25 6c 78 29 22 2c 20 28  CAC = 0x%lx)", (
12930 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 69  unsigned long) i
12940 64 5f 74 79 70 65 2c 20 28 75 6e 73 69 67 6e 65  d_type, (unsigne
12950 64 20 6c 6f 6e 67 29 20 43 41 43 4b 45 59 5f 49  d long) CACKEY_I
12960 44 5f 54 59 50 45 5f 50 49 56 2c 20 28 75 6e 73  D_TYPE_PIV, (uns
12970 69 67 6e 65 64 20 6c 6f 6e 67 29 20 43 41 43 4b  igned long) CACK
12980 45 59 5f 49 44 5f 54 59 50 45 5f 43 41 43 29 3b  EY_ID_TYPE_CAC);
12990 0a 0a 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b  .....return(-1);
129a0 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74 65 72 6d 69  ..}.../* Determi
129b0 6e 65 20 69 64 65 6e 74 69 74 79 20 4b 65 79 20  ne identity Key 
129c0 73 69 7a 65 20 2a 2f 0a 09 69 66 20 28 69 64 65  size */..if (ide
129d0 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e  ntity->pcsc_iden
129e0 74 69 74 79 2d 3e 6b 65 79 73 69 7a 65 20 3c 20  tity->keysize < 
129f0 30 29 20 7b 0a 09 09 69 64 65 6e 74 69 74 79 2d  0) {...identity-
12a00 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e  >pcsc_identity->
12a10 6b 65 79 73 69 7a 65 20 3d 20 78 35 30 39 5f 74  keysize = x509_t
12a20 6f 5f 6b 65 79 73 69 7a 65 28 69 64 65 6e 74 69  o_keysize(identi
12a30 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74  ty->pcsc_identit
12a40 79 2d 3e 63 65 72 74 69 66 69 63 61 74 65 2c 20  y->certificate, 
12a50 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69  identity->pcsc_i
12a60 64 65 6e 74 69 74 79 2d 3e 63 65 72 74 69 66 69  dentity->certifi
12a70 63 61 74 65 5f 6c 65 6e 29 3b 0a 09 7d 0a 0a 09  cate_len);..}...
12a80 2f 2a 20 50 61 64 20 6d 65 73 73 61 67 65 20 74  /* Pad message t
12a90 6f 20 6b 65 79 20 73 69 7a 65 20 2a 2f 0a 09 69  o key size */..i
12aa0 66 20 28 70 61 64 49 6e 70 75 74 29 20 7b 0a 09  f (padInput) {..
12ab0 09 69 66 20 28 69 64 65 6e 74 69 74 79 2d 3e 70  .if (identity->p
12ac0 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 6b 65  csc_identity->ke
12ad0 79 73 69 7a 65 20 3e 20 30 29 20 7b 0a 09 09 09  ysize > 0) {....
12ae0 69 66 20 28 62 75 66 6c 65 6e 20 21 3d 20 69 64  if (buflen != id
12af0 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65  entity->pcsc_ide
12b00 6e 74 69 74 79 2d 3e 6b 65 79 73 69 7a 65 29 20  ntity->keysize) 
12b10 7b 0a 09 09 09 09 69 66 20 28 62 75 66 6c 65 6e  {.....if (buflen
12b20 20 3e 20 28 69 64 65 6e 74 69 74 79 2d 3e 70 63   > (identity->pc
12b30 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 6b 65 79  sc_identity->key
12b40 73 69 7a 65 20 2d 20 33 29 29 20 7b 0a 09 09 09  size - 3)) {....
12b50 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
12b60 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4d  RINTF("Error.  M
12b70 65 73 73 61 67 65 20 69 73 20 74 6f 6f 20 6c 61  essage is too la
12b80 72 67 65 20 74 6f 20 73 69 67 6e 2f 64 65 63 72  rge to sign/decr
12b90 79 70 74 22 29 3b 0a 0a 09 09 09 09 09 72 65 74  ypt");.......ret
12ba0 75 72 6e 28 2d 31 29 3b 0a 09 09 09 09 7d 0a 0a  urn(-1);.....}..
12bb0 09 09 09 09 74 6d 70 62 75 66 6c 65 6e 20 3d 20  ....tmpbuflen = 
12bc0 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69  identity->pcsc_i
12bd0 64 65 6e 74 69 74 79 2d 3e 6b 65 79 73 69 7a 65  dentity->keysize
12be0 3b 0a 09 09 09 09 74 6d 70 62 75 66 20 3d 20 6d  ;.....tmpbuf = m
12bf0 61 6c 6c 6f 63 28 74 6d 70 62 75 66 6c 65 6e 29  alloc(tmpbuflen)
12c00 3b 0a 09 09 09 09 66 72 65 65 5f 74 6d 70 62 75  ;.....free_tmpbu
12c10 66 20 3d 20 31 3b 0a 0a 09 09 09 09 70 61 64 6c  f = 1;......padl
12c20 65 6e 20 3d 20 74 6d 70 62 75 66 6c 65 6e 20 2d  en = tmpbuflen -
12c30 20 62 75 66 6c 65 6e 20 2d 20 33 3b 0a 0a 09 09   buflen - 3;....
12c40 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
12c50 52 49 4e 54 46 28 22 4e 65 65 64 20 74 6f 20 70  RINTF("Need to p
12c60 61 64 20 74 68 65 20 62 75 66 66 65 72 20 77 69  ad the buffer wi
12c70 74 68 20 25 6c 6c 75 20 62 79 74 65 73 20 28 74  th %llu bytes (t
12c80 6d 70 62 75 66 6c 65 6e 20 3d 20 25 6c 6c 75 2c  mpbuflen = %llu,
12c90 20 62 75 66 6c 65 6e 20 3d 20 25 6c 6c 75 29 22   buflen = %llu)"
12ca0 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
12cb0 20 6c 6f 6e 67 29 20 70 61 64 6c 65 6e 2c 20 28   long) padlen, (
12cc0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f  unsigned long lo
12cd0 6e 67 29 20 74 6d 70 62 75 66 6c 65 6e 2c 20 28  ng) tmpbuflen, (
12ce0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f  unsigned long lo
12cf0 6e 67 29 20 62 75 66 6c 65 6e 29 3b 0a 0a 09 09  ng) buflen);....
12d00 09 09 2f 2a 20 52 53 41 20 50 4b 43 53 23 31 20  ../* RSA PKCS#1 
12d10 45 4d 53 41 2d 50 4b 43 53 31 2d 76 31 5f 35 20  EMSA-PKCS1-v1_5 
12d20 50 61 64 64 69 6e 67 20 2a 2f 0a 09 09 09 09 74  Padding */.....t
12d30 6d 70 62 75 66 5b 30 5d 20 3d 20 30 78 30 30 3b  mpbuf[0] = 0x00;
12d40 0a 09 09 09 09 74 6d 70 62 75 66 5b 31 5d 20 3d  .....tmpbuf[1] =
12d50 20 30 78 30 31 3b 0a 09 09 09 09 6d 65 6d 73 65   0x01;.....memse
12d60 74 28 26 74 6d 70 62 75 66 5b 32 5d 2c 20 30 78  t(&tmpbuf[2], 0x
12d70 46 46 2c 20 70 61 64 6c 65 6e 29 3b 0a 09 09 09  FF, padlen);....
12d80 09 74 6d 70 62 75 66 5b 70 61 64 6c 65 6e 20 2b  .tmpbuf[padlen +
12d90 20 32 5d 3d 20 30 78 30 30 3b 0a 09 09 09 09 6d   2]= 0x00;.....m
12da0 65 6d 63 70 79 28 26 74 6d 70 62 75 66 5b 70 61  emcpy(&tmpbuf[pa
12db0 64 6c 65 6e 20 2b 20 33 5d 2c 20 62 75 66 2c 20  dlen + 3], buf, 
12dc0 62 75 66 6c 65 6e 29 3b 0a 0a 09 09 09 09 43 41  buflen);......CA
12dd0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
12de0 42 55 46 28 22 55 6e 70 61 64 64 65 64 3a 22 2c  BUF("Unpadded:",
12df0 20 62 75 66 2c 20 62 75 66 6c 65 6e 29 3b 0a 09   buf, buflen);..
12e00 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
12e10 50 52 49 4e 54 42 55 46 28 22 50 61 64 64 65 64  PRINTBUF("Padded
12e20 3a 22 2c 20 74 6d 70 62 75 66 2c 20 74 6d 70 62  :", tmpbuf, tmpb
12e30 75 66 6c 65 6e 29 3b 0a 09 09 09 7d 20 65 6c 73  uflen);....} els
12e40 65 20 7b 0a 09 09 09 09 74 6d 70 62 75 66 20 3d  e {.....tmpbuf =
12e50 20 62 75 66 3b 0a 09 09 09 09 74 6d 70 62 75 66   buf;.....tmpbuf
12e60 6c 65 6e 20 3d 20 62 75 66 6c 65 6e 3b 0a 09 09  len = buflen;...
12e70 09 09 66 72 65 65 5f 74 6d 70 62 75 66 20 3d 20  ..free_tmpbuf = 
12e80 30 3b 0a 09 09 09 09 70 61 64 6c 65 6e 20 3d 20  0;.....padlen = 
12e90 30 3b 0a 09 09 09 7d 0a 09 09 7d 20 65 6c 73 65  0;....}...} else
12ea0 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
12eb0 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c  UG_PRINTF("Unabl
12ec0 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 6b  e to determine k
12ed0 65 79 20 73 69 7a 65 2c 20 68 6f 70 69 6e 67 20  ey size, hoping 
12ee0 74 68 65 20 6d 65 73 73 61 67 65 20 69 73 20 70  the message is p
12ef0 72 6f 70 65 72 6c 79 20 70 61 64 64 65 64 21 22  roperly padded!"
12f00 29 3b 0a 0a 09 09 09 74 6d 70 62 75 66 20 3d 20  );.....tmpbuf = 
12f10 62 75 66 3b 0a 09 09 09 74 6d 70 62 75 66 6c 65  buf;....tmpbufle
12f20 6e 20 3d 20 62 75 66 6c 65 6e 3b 0a 09 09 09 66  n = buflen;....f
12f30 72 65 65 5f 74 6d 70 62 75 66 20 3d 20 30 3b 0a  ree_tmpbuf = 0;.
12f40 09 09 09 70 61 64 6c 65 6e 20 3d 20 30 3b 0a 09  ...padlen = 0;..
12f50 09 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 74  .}..} else {...t
12f60 6d 70 62 75 66 20 3d 20 62 75 66 3b 0a 09 09 74  mpbuf = buf;...t
12f70 6d 70 62 75 66 6c 65 6e 20 3d 20 62 75 66 6c 65  mpbuflen = bufle
12f80 6e 3b 0a 09 09 66 72 65 65 5f 74 6d 70 62 75 66  n;...free_tmpbuf
12f90 20 3d 20 30 3b 0a 09 09 70 61 64 6c 65 6e 20 3d   = 0;...padlen =
12fa0 20 30 3b 0a 09 7d 0a 0a 09 2f 2a 20 42 65 67 69   0;..}.../* Begi
12fb0 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f  n transaction */
12fc0 0a 09 63 61 63 6b 65 79 5f 62 65 67 69 6e 5f 74  ..cackey_begin_t
12fd0 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29  ransaction(slot)
12fe0 3b 0a 0a 09 2f 2a 20 53 65 6c 65 63 74 20 63 6f  ;.../* Select co
12ff0 72 72 65 63 74 20 61 70 70 6c 65 74 20 2a 2f 0a  rrect applet */.
13000 09 73 77 69 74 63 68 20 28 69 64 5f 74 79 70 65  .switch (id_type
13010 29 20 7b 0a 09 09 63 61 73 65 20 43 41 43 4b 45  ) {...case CACKE
13020 59 5f 49 44 5f 54 59 50 45 5f 43 41 43 3a 0a 09  Y_ID_TYPE_CAC:..
13030 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
13040 52 49 4e 54 46 28 22 53 65 6c 65 63 74 69 6e 67  RINTF("Selecting
13050 20 61 70 70 6c 65 74 20 66 6f 75 6e 64 20 61 74   applet found at
13060 20 25 70 20 2e 2e 2e 22 2c 20 69 64 65 6e 74 69   %p ...", identi
13070 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74  ty->pcsc_identit
13080 79 2d 3e 63 61 72 64 2e 63 61 63 2e 61 70 70 6c  y->card.cac.appl
13090 65 74 29 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73  et);....cackey_s
130a0 65 6c 65 63 74 5f 61 70 70 6c 65 74 28 73 6c 6f  elect_applet(slo
130b0 74 2c 20 69 64 65 6e 74 69 74 79 2d 3e 70 63 73  t, identity->pcs
130c0 63 5f 69 64 65 6e 74 69 74 79 2d 3e 63 61 72 64  c_identity->card
130d0 2e 63 61 63 2e 61 70 70 6c 65 74 2c 20 73 69 7a  .cac.applet, siz
130e0 65 6f 66 28 69 64 65 6e 74 69 74 79 2d 3e 70 63  eof(identity->pc
130f0 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 63 61 72  sc_identity->car
13100 64 2e 63 61 63 2e 61 70 70 6c 65 74 29 29 3b 0a  d.cac.applet));.
13110 0a 09 09 09 2f 2a 20 53 65 6c 65 63 74 20 63 6f  ..../* Select co
13120 72 72 65 63 74 20 66 69 6c 65 20 2a 2f 0a 09 09  rrect file */...
13130 09 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 66  .cackey_select_f
13140 69 6c 65 28 73 6c 6f 74 2c 20 69 64 65 6e 74 69  ile(slot, identi
13150 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74  ty->pcsc_identit
13160 79 2d 3e 63 61 72 64 2e 63 61 63 2e 66 69 6c 65  y->card.cac.file
13170 29 3b 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 63  );....break;...c
13180 61 73 65 20 43 41 43 4b 45 59 5f 49 44 5f 54 59  ase CACKEY_ID_TY
13190 50 45 5f 50 49 56 3a 0a 09 09 09 64 79 6e 5f 61  PE_PIV:....dyn_a
131a0 75 74 68 5f 74 65 6d 70 6c 61 74 65 5b 30 5d 20  uth_template[0] 
131b0 3d 20 30 78 37 43 3b 0a 09 09 09 64 79 6e 5f 61  = 0x7C;....dyn_a
131c0 75 74 68 5f 74 65 6d 70 6c 61 74 65 5b 31 5d 20  uth_template[1] 
131d0 3d 20 30 78 38 32 3b 0a 09 09 09 64 79 6e 5f 61  = 0x82;....dyn_a
131e0 75 74 68 5f 74 65 6d 70 6c 61 74 65 5b 32 5d 20  uth_template[2] 
131f0 3d 20 28 28 74 6d 70 62 75 66 6c 65 6e 20 2b 20  = ((tmpbuflen + 
13200 36 29 20 26 20 30 78 66 66 30 30 29 20 3e 3e 20  6) & 0xff00) >> 
13210 38 3b 0a 09 09 09 64 79 6e 5f 61 75 74 68 5f 74  8;....dyn_auth_t
13220 65 6d 70 6c 61 74 65 5b 33 5d 20 3d 20 28 74 6d  emplate[3] = (tm
13230 70 62 75 66 6c 65 6e 20 2b 20 36 29 20 26 20 30  pbuflen + 6) & 0
13240 78 30 30 66 66 3b 0a 09 09 09 64 79 6e 5f 61 75  x00ff;....dyn_au
13250 74 68 5f 74 65 6d 70 6c 61 74 65 5b 34 5d 20 3d  th_template[4] =
13260 20 30 78 38 32 3b 0a 09 09 09 64 79 6e 5f 61 75   0x82;....dyn_au
13270 74 68 5f 74 65 6d 70 6c 61 74 65 5b 35 5d 20 3d  th_template[5] =
13280 20 30 78 30 30 3b 0a 09 09 09 64 79 6e 5f 61 75   0x00;....dyn_au
13290 74 68 5f 74 65 6d 70 6c 61 74 65 5b 36 5d 20 3d  th_template[6] =
132a0 20 30 78 38 31 3b 0a 09 09 09 64 79 6e 5f 61 75   0x81;....dyn_au
132b0 74 68 5f 74 65 6d 70 6c 61 74 65 5b 37 5d 20 3d  th_template[7] =
132c0 20 30 78 38 32 3b 0a 09 09 09 64 79 6e 5f 61 75   0x82;....dyn_au
132d0 74 68 5f 74 65 6d 70 6c 61 74 65 5b 38 5d 20 3d  th_template[8] =
132e0 20 28 74 6d 70 62 75 66 6c 65 6e 20 26 20 30 78   (tmpbuflen & 0x
132f0 66 66 30 30 29 20 3e 3e 20 38 3b 0a 09 09 09 64  ff00) >> 8;....d
13300 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74 65  yn_auth_template
13310 5b 39 5d 20 3d 20 74 6d 70 62 75 66 6c 65 6e 20  [9] = tmpbuflen 
13320 26 20 30 78 30 30 66 66 3b 0a 0a 09 09 09 64 79  & 0x00ff;.....dy
13330 6e 5f 61 75 74 68 5f 74 6d 70 62 75 66 20 3d 20  n_auth_tmpbuf = 
13340 6d 61 6c 6c 6f 63 28 74 6d 70 62 75 66 6c 65 6e  malloc(tmpbuflen
13350 20 2b 20 73 69 7a 65 6f 66 28 64 79 6e 5f 61 75   + sizeof(dyn_au
13360 74 68 5f 74 65 6d 70 6c 61 74 65 29 29 3b 0a 09  th_template));..
13370 09 09 6d 65 6d 63 70 79 28 64 79 6e 5f 61 75 74  ..memcpy(dyn_aut
13380 68 5f 74 6d 70 62 75 66 2c 20 64 79 6e 5f 61 75  h_tmpbuf, dyn_au
13390 74 68 5f 74 65 6d 70 6c 61 74 65 2c 20 73 69 7a  th_template, siz
133a0 65 6f 66 28 64 79 6e 5f 61 75 74 68 5f 74 65 6d  eof(dyn_auth_tem
133b0 70 6c 61 74 65 29 29 3b 0a 09 09 09 6d 65 6d 63  plate));....memc
133c0 70 79 28 64 79 6e 5f 61 75 74 68 5f 74 6d 70 62  py(dyn_auth_tmpb
133d0 75 66 20 2b 20 73 69 7a 65 6f 66 28 64 79 6e 5f  uf + sizeof(dyn_
133e0 61 75 74 68 5f 74 65 6d 70 6c 61 74 65 29 2c 20  auth_template), 
133f0 74 6d 70 62 75 66 2c 20 74 6d 70 62 75 66 6c 65  tmpbuf, tmpbufle
13400 6e 29 3b 0a 0a 09 09 09 69 66 20 28 66 72 65 65  n);.....if (free
13410 5f 74 6d 70 62 75 66 29 20 7b 0a 09 09 09 09 66  _tmpbuf) {.....f
13420 72 65 65 28 74 6d 70 62 75 66 29 3b 0a 09 09 09  ree(tmpbuf);....
13430 7d 0a 0a 09 09 09 74 6d 70 62 75 66 6c 65 6e 20  }.....tmpbuflen 
13440 2b 3d 20 73 69 7a 65 6f 66 28 64 79 6e 5f 61 75  += sizeof(dyn_au
13450 74 68 5f 74 65 6d 70 6c 61 74 65 29 3b 0a 09 09  th_template);...
13460 09 74 6d 70 62 75 66 20 3d 20 64 79 6e 5f 61 75  .tmpbuf = dyn_au
13470 74 68 5f 74 6d 70 62 75 66 3b 0a 09 09 09 66 72  th_tmpbuf;....fr
13480 65 65 5f 74 6d 70 62 75 66 20 3d 20 31 3b 0a 0a  ee_tmpbuf = 1;..
13490 09 09 09 62 72 65 61 6b 3b 0a 09 09 63 61 73 65  ...break;...case
134a0 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f   CACKEY_ID_TYPE_
134b0 43 45 52 54 5f 4f 4e 4c 59 3a 0a 09 09 09 62 72  CERT_ONLY:....br
134c0 65 61 6b 3b 0a 09 7d 0a 0a 09 74 6d 70 62 75 66  eak;..}...tmpbuf
134d0 5f 73 20 3d 20 74 6d 70 62 75 66 3b 0a 09 6f 75  _s = tmpbuf;..ou
134e0 74 62 75 66 5f 73 20 3d 20 6f 75 74 62 75 66 3b  tbuf_s = outbuf;
134f0 0a 09 77 68 69 6c 65 20 28 74 6d 70 62 75 66 6c  ..while (tmpbufl
13500 65 6e 29 20 7b 0a 09 09 74 6d 70 6f 75 74 62 75  en) {...tmpoutbu
13510 66 6c 65 6e 20 3d 20 6f 75 74 62 75 66 6c 65 6e  flen = outbuflen
13520 3b 0a 0a 09 09 69 66 20 28 74 6d 70 62 75 66 6c  ;....if (tmpbufl
13530 65 6e 20 3e 20 43 41 43 4b 45 59 5f 41 50 44 55  en > CACKEY_APDU
13540 5f 4d 54 55 29 20 7b 0a 09 09 09 62 79 74 65 73  _MTU) {....bytes
13550 5f 74 6f 5f 73 65 6e 64 20 3d 20 43 41 43 4b 45  _to_send = CACKE
13560 59 5f 41 50 44 55 5f 4d 54 55 3b 0a 09 09 7d 20  Y_APDU_MTU;...} 
13570 65 6c 73 65 20 7b 0a 09 09 09 62 79 74 65 73 5f  else {....bytes_
13580 74 6f 5f 73 65 6e 64 20 3d 20 74 6d 70 62 75 66  to_send = tmpbuf
13590 6c 65 6e 3b 0a 09 09 7d 0a 0a 09 09 73 65 6e 64  len;...}....send
135a0 5f 72 65 74 20 3d 20 43 41 43 4b 45 59 5f 50 43  _ret = CACKEY_PC
135b0 53 43 5f 45 5f 47 45 4e 45 52 49 43 3b 0a 09 09  SC_E_GENERIC;...
135c0 73 77 69 74 63 68 20 28 69 64 5f 74 79 70 65 29  switch (id_type)
135d0 20 7b 0a 09 09 09 63 61 73 65 20 43 41 43 4b 45   {....case CACKE
135e0 59 5f 49 44 5f 54 59 50 45 5f 43 41 43 3a 0a 09  Y_ID_TYPE_CAC:..
135f0 09 09 09 69 66 20 28 74 6d 70 62 75 66 6c 65 6e  ...if (tmpbuflen
13600 20 3e 20 43 41 43 4b 45 59 5f 41 50 44 55 5f 4d   > CACKEY_APDU_M
13610 54 55 29 20 7b 0a 09 09 09 09 09 70 31 20 3d 20  TU) {......p1 = 
13620 30 78 38 30 3b 0a 09 09 09 09 09 6c 65 20 3d 20  0x80;......le = 
13630 30 78 30 30 3b 0a 09 09 09 09 7d 20 65 6c 73 65  0x00;.....} else
13640 20 7b 0a 09 09 09 09 09 70 31 20 3d 20 30 78 30   {......p1 = 0x0
13650 30 3b 0a 09 09 09 09 09 6c 65 20 3d 20 30 78 30  0;......le = 0x0
13660 30 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 73 65  0;.....}......se
13670 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f  nd_ret = cackey_
13680 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f 74 2c 20  send_apdu(slot, 
13690 47 53 43 49 53 5f 43 4c 41 53 53 5f 47 4c 4f 42  GSCIS_CLASS_GLOB
136a0 41 4c 5f 50 4c 41 54 46 4f 52 4d 2c 20 47 53 43  AL_PLATFORM, GSC
136b0 49 53 5f 49 4e 53 54 52 5f 53 49 47 4e 44 45 43  IS_INSTR_SIGNDEC
136c0 52 59 50 54 2c 20 70 31 2c 20 30 78 30 30 2c 20  RYPT, p1, 0x00, 
136d0 62 79 74 65 73 5f 74 6f 5f 73 65 6e 64 2c 20 74  bytes_to_send, t
136e0 6d 70 62 75 66 2c 20 6c 65 2c 20 26 72 65 73 70  mpbuf, le, &resp
136f0 63 6f 64 65 2c 20 6f 75 74 62 75 66 2c 20 26 74  code, outbuf, &t
13700 6d 70 6f 75 74 62 75 66 6c 65 6e 29 3b 0a 09 09  mpoutbuflen);...
13710 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
13720 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f   CACKEY_ID_TYPE_
13730 50 49 56 3a 0a 09 09 09 09 69 66 20 28 74 6d 70  PIV:.....if (tmp
13740 62 75 66 6c 65 6e 20 3e 20 43 41 43 4b 45 59 5f  buflen > CACKEY_
13750 41 50 44 55 5f 4d 54 55 29 20 7b 0a 09 09 09 09  APDU_MTU) {.....
13760 09 63 6c 61 73 73 20 3d 20 30 78 31 30 3b 0a 09  .class = 0x10;..
13770 09 09 09 09 6c 65 20 3d 20 30 78 30 30 3b 0a 09  ....le = 0x00;..
13780 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09  ...} else {.....
13790 09 63 6c 61 73 73 20 3d 20 47 53 43 49 53 5f 43  .class = GSCIS_C
137a0 4c 41 53 53 5f 49 53 4f 37 38 31 36 3b 0a 09 09  LASS_ISO7816;...
137b0 09 09 09 6c 65 20 3d 20 32 35 36 3b 0a 09 09 09  ...le = 256;....
137c0 09 7d 0a 0a 09 09 09 09 73 65 6e 64 5f 72 65 74  .}......send_ret
137d0 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61   = cackey_send_a
137e0 70 64 75 28 73 6c 6f 74 2c 20 63 6c 61 73 73 2c  pdu(slot, class,
137f0 20 4e 49 53 54 53 50 38 30 30 5f 37 33 5f 33 5f   NISTSP800_73_3_
13800 49 4e 53 54 52 5f 47 45 4e 41 55 54 48 2c 20 4e  INSTR_GENAUTH, N
13810 49 53 54 53 50 38 30 30 5f 37 38 5f 33 5f 41 4c  ISTSP800_78_3_AL
13820 47 4f 5f 52 53 41 32 30 34 38 2c 20 69 64 65 6e  GO_RSA2048, iden
13830 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74  tity->pcsc_ident
13840 69 74 79 2d 3e 63 61 72 64 2e 70 69 76 2e 6b 65  ity->card.piv.ke
13850 79 5f 69 64 2c 20 62 79 74 65 73 5f 74 6f 5f 73  y_id, bytes_to_s
13860 65 6e 64 2c 20 74 6d 70 62 75 66 2c 20 6c 65 2c  end, tmpbuf, le,
13870 20 26 72 65 73 70 63 6f 64 65 2c 20 6f 75 74 62   &respcode, outb
13880 75 66 2c 20 26 74 6d 70 6f 75 74 62 75 66 6c 65  uf, &tmpoutbufle
13890 6e 29 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  n);.....break;..
138a0 09 09 63 61 73 65 20 43 41 43 4b 45 59 5f 49 44  ..case CACKEY_ID
138b0 5f 54 59 50 45 5f 43 45 52 54 5f 4f 4e 4c 59 3a  _TYPE_CERT_ONLY:
138c0 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a  .....break;...}.
138d0 0a 09 09 69 66 20 28 73 65 6e 64 5f 72 65 74 20  ...if (send_ret 
138e0 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  != CACKEY_PCSC_S
138f0 5f 4f 4b 29 20 7b 0a 09 09 09 69 66 20 28 66 72  _OK) {....if (fr
13900 65 65 5f 74 6d 70 62 75 66 29 20 7b 0a 09 09 09  ee_tmpbuf) {....
13910 09 69 66 20 28 74 6d 70 62 75 66 5f 73 29 20 7b  .if (tmpbuf_s) {
13920 0a 09 09 09 09 09 66 72 65 65 28 74 6d 70 62 75  ......free(tmpbu
13930 66 5f 73 29 3b 0a 09 09 09 09 7d 0a 09 09 09 7d  f_s);.....}....}
13940 0a 0a 09 09 09 2f 2a 20 45 6e 64 20 74 72 61 6e  ...../* End tran
13950 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 09 09 63 61  saction */....ca
13960 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ckey_end_transac
13970 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 09  tion(slot);.....
13980 69 66 20 28 73 65 6e 64 5f 72 65 74 20 3d 3d 20  if (send_ret == 
13990 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 52 45  CACKEY_PCSC_E_RE
139a0 54 52 59 29 20 7b 0a 09 09 09 09 43 41 43 4b 45  TRY) {.....CACKE
139b0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
139c0 41 44 50 55 20 53 65 6e 64 69 6e 67 20 46 61 69  ADPU Sending Fai
139d0 6c 65 64 20 2d 2d 20 72 65 74 72 79 69 6e 67 2e  led -- retrying.
139e0 22 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28  ");......return(
139f0 63 61 63 6b 65 79 5f 73 69 67 6e 64 65 63 72 79  cackey_signdecry
13a00 70 74 28 73 6c 6f 74 2c 20 69 64 65 6e 74 69 74  pt(slot, identit
13a10 79 2c 20 62 75 66 2c 20 62 75 66 6c 65 6e 2c 20  y, buf, buflen, 
13a20 6f 75 74 62 75 66 2c 20 6f 75 74 62 75 66 6c 65  outbuf, outbufle
13a30 6e 2c 20 70 61 64 49 6e 70 75 74 2c 20 75 6e 70  n, padInput, unp
13a40 61 64 4f 75 74 70 75 74 29 29 3b 0a 09 09 09 7d  adOutput));....}
13a50 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
13a60 47 5f 50 52 49 4e 54 46 28 22 41 44 50 55 20 53  G_PRINTF("ADPU S
13a70 65 6e 64 69 6e 67 20 46 61 69 6c 65 64 20 2d 2d  ending Failed --
13a80 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 65 72   returning in er
13a90 72 6f 72 2e 22 29 3b 0a 0a 09 09 09 69 66 20 28  ror.");.....if (
13aa0 72 65 73 70 63 6f 64 65 20 3d 3d 20 30 78 36 39  respcode == 0x69
13ab0 38 32 20 7c 7c 20 72 65 73 70 63 6f 64 65 20 3d  82 || respcode =
13ac0 3d 20 30 78 36 65 30 30 29 20 7b 0a 09 09 09 09  = 0x6e00) {.....
13ad0 69 66 20 28 72 65 73 70 63 6f 64 65 20 3d 3d 20  if (respcode == 
13ae0 30 78 36 45 30 30 29 20 7b 0a 09 09 09 09 09 43  0x6E00) {......C
13af0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
13b00 54 46 28 22 47 6f 74 20 5c 22 57 52 4f 4e 47 20  TF("Got \"WRONG 
13b10 43 4c 41 53 53 5c 22 2c 20 74 68 69 73 20 6d 65  CLASS\", this me
13b20 61 6e 73 20 77 65 20 61 72 65 20 74 61 6c 6b 69  ans we are talki
13b30 6e 67 20 74 6f 20 74 68 65 20 77 72 6f 6e 67 20  ng to the wrong 
13b40 6f 62 6a 65 63 74 20 28 6c 69 6b 65 6c 79 20 62  object (likely b
13b50 65 63 61 75 73 65 20 74 68 65 20 63 61 72 64 20  ecause the card 
13b60 77 65 6e 74 20 61 77 61 79 29 20 2d 2d 20 72 65  went away) -- re
13b70 73 65 74 74 69 6e 67 22 29 3b 0a 09 09 09 09 7d  setting");.....}
13b80 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 43 41 43   else {......CAC
13b90 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
13ba0 28 22 53 65 63 75 72 69 74 79 20 73 74 61 74 75  ("Security statu
13bb0 73 20 6e 6f 74 20 73 61 74 69 73 69 66 69 65 64  s not satisified
13bc0 20 28 72 65 73 70 63 6f 64 65 20 3d 20 30 78 25   (respcode = 0x%
13bd0 30 34 78 29 2e 20 20 52 65 74 75 72 6e 69 6e 67  04x).  Returning
13be0 20 4e 45 45 44 4c 4f 47 49 4e 22 2c 20 28 69 6e   NEEDLOGIN", (in
13bf0 74 29 20 72 65 73 70 63 6f 64 65 29 3b 0a 09 09  t) respcode);...
13c00 09 09 7d 0a 0a 09 09 09 09 63 61 63 6b 65 79 5f  ..}......cackey_
13c10 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74 28  mark_slot_reset(
13c20 73 6c 6f 74 29 3b 0a 0a 09 09 09 09 73 6c 6f 74  slot);......slot
13c30 2d 3e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 3d 20  ->token_flags = 
13c40 43 4b 46 5f 4c 4f 47 49 4e 5f 52 45 51 55 49 52  CKF_LOGIN_REQUIR
13c50 45 44 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28  ED;......return(
13c60 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4e 45  CACKEY_PCSC_E_NE
13c70 45 44 4c 4f 47 49 4e 29 3b 0a 09 09 09 7d 0a 0a  EDLOGIN);....}..
13c80 09 09 09 69 66 20 28 73 65 6e 64 5f 72 65 74 20  ...if (send_ret 
13c90 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  == CACKEY_PCSC_E
13ca0 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 20 7b 0a  _TOKENABSENT) {.
13cb0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
13cc0 5f 50 52 49 4e 54 46 28 22 54 6f 6b 65 6e 20 61  _PRINTF("Token a
13cd0 62 73 65 6e 74 2e 20 20 52 65 74 75 72 6e 69 6e  bsent.  Returnin
13ce0 67 20 54 4f 4b 45 4e 41 42 53 45 4e 54 22 29 3b  g TOKENABSENT");
13cf0 0a 0a 09 09 09 09 63 61 63 6b 65 79 5f 6d 61 72  ......cackey_mar
13d00 6b 5f 73 6c 6f 74 5f 72 65 73 65 74 28 73 6c 6f  k_slot_reset(slo
13d10 74 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28  t);......return(
13d20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f  CACKEY_PCSC_E_TO
13d30 4b 45 4e 41 42 53 45 4e 54 29 3b 0a 09 09 09 7d  KENABSENT);....}
13d40 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
13d50 47 5f 50 52 49 4e 54 46 28 22 53 6f 6d 65 74 68  G_PRINTF("Someth
13d60 69 6e 67 20 77 65 6e 74 20 77 72 6f 6e 67 20 64  ing went wrong d
13d70 75 72 69 6e 67 20 73 69 67 6e 69 6e 67 2c 20 72  uring signing, r
13d80 65 73 65 74 74 69 6e 67 20 74 68 65 20 73 6c 6f  esetting the slo
13d90 74 20 61 6e 64 20 68 6f 70 69 6e 67 20 66 6f 72  t and hoping for
13da0 20 74 68 65 20 62 65 73 74 2e 22 29 3b 0a 0a 09   the best.");...
13db0 09 09 63 61 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c  ..cackey_mark_sl
13dc0 6f 74 5f 72 65 73 65 74 28 73 6c 6f 74 29 3b 0a  ot_reset(slot);.
13dd0 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ....return(CACKE
13de0 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43  Y_PCSC_E_GENERIC
13df0 29 3b 0a 09 09 7d 0a 0a 09 09 74 6d 70 62 75 66  );...}....tmpbuf
13e00 20 2b 3d 20 62 79 74 65 73 5f 74 6f 5f 73 65 6e   += bytes_to_sen
13e10 64 3b 0a 09 09 74 6d 70 62 75 66 6c 65 6e 20 2d  d;...tmpbuflen -
13e20 3d 20 62 79 74 65 73 5f 74 6f 5f 73 65 6e 64 3b  = bytes_to_send;
13e30 0a 0a 09 09 6f 75 74 62 75 66 20 2b 3d 20 74 6d  ....outbuf += tm
13e40 70 6f 75 74 62 75 66 6c 65 6e 3b 0a 09 09 6f 75  poutbuflen;...ou
13e50 74 62 75 66 6c 65 6e 20 2d 3d 20 74 6d 70 6f 75  tbuflen -= tmpou
13e60 74 62 75 66 6c 65 6e 3b 0a 09 09 72 65 74 76 61  tbuflen;...retva
13e70 6c 20 2b 3d 20 74 6d 70 6f 75 74 62 75 66 6c 65  l += tmpoutbufle
13e80 6e 3b 0a 09 7d 0a 0a 09 69 66 20 28 66 72 65 65  n;..}...if (free
13e90 5f 74 6d 70 62 75 66 29 20 7b 0a 09 09 69 66 20  _tmpbuf) {...if 
13ea0 28 74 6d 70 62 75 66 5f 73 29 20 7b 0a 09 09 09  (tmpbuf_s) {....
13eb0 66 72 65 65 28 74 6d 70 62 75 66 5f 73 29 3b 0a  free(tmpbuf_s);.
13ec0 09 09 7d 0a 09 7d 0a 0a 09 6f 75 74 62 75 66 20  ..}..}...outbuf 
13ed0 3d 20 6f 75 74 62 75 66 5f 73 3b 0a 0a 09 2f 2a  = outbuf_s;.../*
13ee0 20 45 6e 64 20 74 72 61 6e 73 61 63 74 69 6f 6e   End transaction
13ef0 20 2a 2f 0a 09 63 61 63 6b 65 79 5f 65 6e 64 5f   */..cackey_end_
13f00 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74  transaction(slot
13f10 29 3b 0a 0a 23 69 66 64 65 66 20 43 41 43 4b 45  );..#ifdef CACKE
13f20 59 5f 50 41 52 41 4e 4f 49 44 0a 23 20 20 69 66  Y_PARANOID.#  if
13f30 64 65 66 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45  def _POSIX_SSIZE
13f40 5f 4d 41 58 0a 09 69 66 20 28 6f 75 74 62 75 66  _MAX..if (outbuf
13f50 6c 65 6e 20 3e 20 5f 50 4f 53 49 58 5f 53 53 49  len > _POSIX_SSI
13f60 5a 45 5f 4d 41 58 29 20 7b 0a 09 09 43 41 43 4b  ZE_MAX) {...CACK
13f70 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
13f80 22 4f 75 74 62 75 66 6c 65 6e 20 65 78 63 65 65  "Outbuflen excee
13f90 64 73 20 6d 61 78 69 6d 75 6d 20 76 61 6c 75 65  ds maximum value
13fa0 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66  , returning in f
13fb0 61 69 6c 75 72 65 2e 20 28 6d 61 78 20 3d 20 25  ailure. (max = %
13fc0 6c 69 2c 20 6f 75 74 62 75 66 6c 65 6e 20 3d 20  li, outbuflen = 
13fd0 25 6c 75 29 22 2c 20 28 6c 6f 6e 67 29 20 5f 50  %lu)", (long) _P
13fe0 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58 2c 20  OSIX_SSIZE_MAX, 
13ff0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
14000 6f 75 74 62 75 66 6c 65 6e 29 3b 0a 0a 09 09 72  outbuflen);....r
14010 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 23 20  eturn(-1);..}.# 
14020 20 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 09   endif.#endif...
14030 2f 2a 20 57 65 20 6d 75 73 74 20 72 65 6d 6f 76  /* We must remov
14040 65 20 74 68 65 20 22 37 43 22 20 74 61 67 20 74  e the "7C" tag t
14050 6f 20 67 65 74 20 74 6f 20 74 68 65 20 73 69 67  o get to the sig
14060 6e 61 74 75 72 65 20 2a 2f 0a 09 73 77 69 74 63  nature */..switc
14070 68 20 28 69 64 5f 74 79 70 65 29 20 7b 0a 09 09  h (id_type) {...
14080 63 61 73 65 20 43 41 43 4b 45 59 5f 49 44 5f 54  case CACKEY_ID_T
14090 59 50 45 5f 50 49 56 3a 0a 09 09 09 6f 75 74 62  YPE_PIV:....outb
140a0 75 66 5f 6c 65 6e 20 3d 20 72 65 74 76 61 6c 3b  uf_len = retval;
140b0 0a 09 09 09 6f 75 74 62 75 66 5f 70 20 3d 20 63  ....outbuf_p = c
140c0 61 63 6b 65 79 5f 72 65 61 64 5f 62 65 72 74 6c  ackey_read_bertl
140d0 76 5f 74 61 67 28 6f 75 74 62 75 66 2c 20 26 6f  v_tag(outbuf, &o
140e0 75 74 62 75 66 5f 6c 65 6e 2c 20 30 78 37 43 2c  utbuf_len, 0x7C,
140f0 20 4e 55 4c 4c 2c 20 20 26 6f 75 74 62 75 66 5f   NULL,  &outbuf_
14100 6c 65 6e 29 3b 0a 09 09 09 69 66 20 28 6f 75 74  len);....if (out
14110 62 75 66 5f 70 20 3d 3d 20 4e 55 4c 4c 29 20 7b  buf_p == NULL) {
14120 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
14130 47 5f 50 52 49 4e 54 46 28 22 52 65 73 70 6f 6e  G_PRINTF("Respon
14140 73 65 20 66 72 6f 6d 20 50 49 56 20 66 6f 72 20  se from PIV for 
14150 47 45 4e 45 52 41 54 45 20 41 55 54 48 45 4e 54  GENERATE AUTHENT
14160 49 43 41 54 49 4f 4e 20 77 61 73 20 6e 6f 74 20  ICATION was not 
14170 61 20 30 78 37 43 20 74 61 67 2c 20 72 65 74 75  a 0x7C tag, retu
14180 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65  rning in failure
14190 22 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28  ");......return(
141a0 2d 31 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 72 65  -1);....}.....re
141b0 74 76 61 6c 20 3d 20 6f 75 74 62 75 66 5f 6c 65  tval = outbuf_le
141c0 6e 3b 0a 0a 09 09 09 6f 75 74 62 75 66 5f 6c 65  n;.....outbuf_le
141d0 6e 20 3d 20 72 65 74 76 61 6c 3b 0a 09 09 09 6f  n = retval;....o
141e0 75 74 62 75 66 5f 70 20 3d 20 63 61 63 6b 65 79  utbuf_p = cackey
141f0 5f 72 65 61 64 5f 62 65 72 74 6c 76 5f 74 61 67  _read_bertlv_tag
14200 28 6f 75 74 62 75 66 2c 20 26 6f 75 74 62 75 66  (outbuf, &outbuf
14210 5f 6c 65 6e 2c 20 30 78 38 32 2c 20 4e 55 4c 4c  _len, 0x82, NULL
14220 2c 20 20 26 6f 75 74 62 75 66 5f 6c 65 6e 29 3b  ,  &outbuf_len);
14230 0a 09 09 09 69 66 20 28 6f 75 74 62 75 66 5f 70  ....if (outbuf_p
14240 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09   == NULL) {.....
14250 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
14260 4e 54 46 28 22 52 65 73 70 6f 6e 73 65 20 66 72  NTF("Response fr
14270 6f 6d 20 50 49 56 20 66 6f 72 20 47 45 4e 45 52  om PIV for GENER
14280 41 54 45 20 41 55 54 48 45 4e 54 49 43 41 54 49  ATE AUTHENTICATI
14290 4f 4e 20 77 61 73 20 6e 6f 74 20 61 20 30 78 38  ON was not a 0x8
142a0 32 20 77 69 74 68 69 6e 20 61 20 30 78 37 43 20  2 within a 0x7C 
142b0 74 61 67 2c 20 72 65 74 75 72 6e 69 6e 67 20 69  tag, returning i
142c0 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09  n failure");....
142d0 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09  ..return(-1);...
142e0 09 7d 0a 0a 09 09 09 72 65 74 76 61 6c 20 3d 20  .}.....retval = 
142f0 6f 75 74 62 75 66 5f 6c 65 6e 3b 0a 0a 09 09 09  outbuf_len;.....
14300 62 72 65 61 6b 3b 0a 09 09 63 61 73 65 20 43 41  break;...case CA
14310 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43 41 43  CKEY_ID_TYPE_CAC
14320 3a 0a 09 09 63 61 73 65 20 43 41 43 4b 45 59 5f  :...case CACKEY_
14330 49 44 5f 54 59 50 45 5f 43 45 52 54 5f 4f 4e 4c  ID_TYPE_CERT_ONL
14340 59 3a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 7d 0a  Y:....break;..}.
14350 0a 09 2f 2a 20 55 6e 70 61 64 20 72 65 70 6c 79  ../* Unpad reply
14360 20 2a 2f 0a 09 69 66 20 28 75 6e 70 61 64 4f 75   */..if (unpadOu
14370 74 70 75 74 29 20 7b 0a 09 09 69 66 20 28 72 65  tput) {...if (re
14380 74 76 61 6c 20 3c 20 33 29 20 7b 0a 09 09 09 43  tval < 3) {....C
14390 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
143a0 54 46 28 22 52 65 70 6c 79 20 69 73 20 74 6f 6f  TF("Reply is too
143b0 20 73 6d 61 6c 6c 2c 20 77 65 20 61 72 65 20 6e   small, we are n
143c0 6f 74 20 61 62 6c 65 20 74 6f 20 75 6e 70 61 64  ot able to unpad
143d0 20 2d 2d 20 70 61 73 73 69 6e 67 20 62 61 63 6b   -- passing back
143e0 20 61 6e 64 20 68 6f 70 69 6e 67 20 66 6f 72 20   and hoping for 
143f0 74 68 65 20 62 65 73 74 21 22 29 3b 0a 0a 09 09  the best!");....
14400 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
14410 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
14420 69 6e 20 73 75 63 63 65 73 73 2c 20 72 65 74 76  in success, retv
14430 61 6c 20 3d 20 25 6c 69 20 28 62 79 74 65 73 29  al = %li (bytes)
14440 22 2c 20 28 6c 6f 6e 67 29 20 72 65 74 76 61 6c  ", (long) retval
14450 29 3b 0a 09 09 09 72 65 74 75 72 6e 28 72 65 74  );....return(ret
14460 76 61 6c 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 20  val);...}....if 
14470 28 6f 75 74 62 75 66 5b 30 5d 20 21 3d 20 30 78  (outbuf[0] != 0x
14480 30 30 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  00) {....CACKEY_
14490 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e  DEBUG_PRINTF("Un
144a0 72 65 63 6f 67 6e 69 7a 65 64 20 70 61 64 64 69  recognized paddi
144b0 6e 67 20 73 63 68 65 6d 65 20 2d 2d 20 70 61 73  ng scheme -- pas
144c0 73 69 6e 67 20 62 61 63 6b 20 61 6e 64 20 68 6f  sing back and ho
144d0 70 69 6e 67 20 66 6f 72 20 74 68 65 20 62 65 73  ping for the bes
144e0 74 21 22 29 3b 0a 0a 09 09 09 43 41 43 4b 45 59  t!");.....CACKEY
144f0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
14500 65 74 75 72 6e 69 6e 67 20 69 6e 20 73 75 63 63  eturning in succ
14510 65 73 73 2c 20 72 65 74 76 61 6c 20 3d 20 25 6c  ess, retval = %l
14520 69 20 28 62 79 74 65 73 29 22 2c 20 28 6c 6f 6e  i (bytes)", (lon
14530 67 29 20 72 65 74 76 61 6c 29 3b 0a 09 09 09 72  g) retval);....r
14540 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 09  eturn(retval);..
14550 09 7d 0a 0a 09 09 62 6c 6f 63 6b 74 79 70 65 20  .}....blocktype 
14560 3d 20 6f 75 74 62 75 66 5b 31 5d 3b 0a 09 09 75  = outbuf[1];...u
14570 6e 70 61 64 6f 66 66 73 65 74 20 3d 20 30 3b 0a  npadoffset = 0;.
14580 0a 09 09 73 77 69 74 63 68 20 28 62 6c 6f 63 6b  ...switch (block
14590 74 79 70 65 29 20 7b 0a 09 09 09 63 61 73 65 20  type) {....case 
145a0 30 78 30 30 3a 0a 09 09 09 09 2f 2a 20 50 61 64  0x00:...../* Pad
145b0 64 69 6e 67 20 53 63 68 65 6d 65 20 31 2c 20 74  ding Scheme 1, t
145c0 68 65 20 66 69 72 73 74 20 6e 6f 6e 2d 7a 65 72  he first non-zer
145d0 6f 20 62 79 74 65 20 69 73 20 74 68 65 20 73 74  o byte is the st
145e0 61 72 74 20 6f 66 20 64 61 74 61 20 2a 2f 0a 09  art of data */..
145f0 09 09 09 66 6f 72 20 28 75 6e 70 61 64 6f 66 66  ...for (unpadoff
14600 73 65 74 20 3d 20 32 3b 20 75 6e 70 61 64 6f 66  set = 2; unpadof
14610 66 73 65 74 20 3c 20 72 65 74 76 61 6c 3b 20 75  fset < retval; u
14620 6e 70 61 64 6f 66 66 73 65 74 2b 2b 29 20 7b 0a  npadoffset++) {.
14630 09 09 09 09 09 69 66 20 28 6f 75 74 62 75 66 5b  .....if (outbuf[
14640 75 6e 70 61 64 6f 66 66 73 65 74 5d 20 21 3d 20  unpadoffset] != 
14650 30 78 30 30 29 20 7b 0a 09 09 09 09 09 09 62 72  0x00) {.......br
14660 65 61 6b 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09  eak;......}.....
14670 7d 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  }.....break;....
14680 63 61 73 65 20 30 78 30 31 3a 0a 09 09 09 09 2f  case 0x01:...../
14690 2a 20 50 61 64 64 69 6e 67 20 53 63 68 65 6d 65  * Padding Scheme
146a0 20 32 2c 20 70 61 64 20 62 79 74 65 73 20 61 72   2, pad bytes ar
146b0 65 20 30 78 46 46 20 66 6f 6c 6c 6f 77 65 64 20  e 0xFF followed 
146c0 62 79 20 30 78 30 30 20 2a 2f 0a 09 09 09 09 66  by 0x00 */.....f
146d0 6f 72 20 28 75 6e 70 61 64 6f 66 66 73 65 74 20  or (unpadoffset 
146e0 3d 20 32 3b 20 75 6e 70 61 64 6f 66 66 73 65 74  = 2; unpadoffset
146f0 20 3c 20 72 65 74 76 61 6c 3b 20 75 6e 70 61 64   < retval; unpad
14700 6f 66 66 73 65 74 2b 2b 29 20 7b 0a 09 09 09 09  offset++) {.....
14710 09 69 66 20 28 6f 75 74 62 75 66 5b 75 6e 70 61  .if (outbuf[unpa
14720 64 6f 66 66 73 65 74 5d 20 21 3d 20 30 78 46 46  doffset] != 0xFF
14730 29 20 7b 0a 09 09 09 09 09 09 69 66 20 28 6f 75  ) {.......if (ou
14740 74 62 75 66 5b 75 6e 70 61 64 6f 66 66 73 65 74  tbuf[unpadoffset
14750 5d 20 3d 3d 20 30 78 30 30 29 20 7b 0a 09 09 09  ] == 0x00) {....
14760 09 09 09 09 75 6e 70 61 64 6f 66 66 73 65 74 2b  ....unpadoffset+
14770 2b 3b 0a 0a 09 09 09 09 09 09 09 62 72 65 61 6b  +;.........break
14780 3b 0a 09 09 09 09 09 09 7d 20 65 6c 73 65 20 7b  ;.......} else {
14790 0a 09 09 09 09 09 09 09 43 41 43 4b 45 59 5f 44  ........CACKEY_D
147a0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 49 6e 76  EBUG_PRINTF("Inv
147b0 61 6c 69 64 20 70 61 64 64 69 6e 67 20 64 61 74  alid padding dat
147c0 61 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 69  a found, returni
147d0 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 2c 20 73  ng in failure, s
147e0 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20  hould have been 
147f0 30 78 30 30 20 66 6f 75 6e 64 20 30 78 25 30 32  0x00 found 0x%02
14800 78 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 69 6e  x", (unsigned in
14810 74 29 20 6f 75 74 62 75 66 5b 75 6e 70 61 64 6f  t) outbuf[unpado
14820 66 66 73 65 74 5d 29 3b 0a 0a 09 09 09 09 09 09  ffset]);........
14830 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 09  .return(-1);....
14840 09 09 09 7d 0a 09 09 09 09 09 7d 20 65 6c 73 65  ...}......} else
14850 20 7b 0a 09 09 09 09 09 09 43 41 43 4b 45 59 5f   {.......CACKEY_
14860 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 49 6e  DEBUG_PRINTF("In
14870 76 61 6c 69 64 20 70 61 64 64 69 6e 67 20 64 61  valid padding da
14880 74 61 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e  ta found, return
14890 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 2c 20  ing in failure, 
148a0 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e  should have been
148b0 20 30 78 46 46 20 66 6f 75 6e 64 20 30 78 25 30   0xFF found 0x%0
148c0 32 78 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 69  2x", (unsigned i
148d0 6e 74 29 20 6f 75 74 62 75 66 5b 75 6e 70 61 64  nt) outbuf[unpad
148e0 6f 66 66 73 65 74 5d 29 3b 0a 0a 09 09 09 09 09  offset]);.......
148f0 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 09  .return(-1);....
14900 09 09 7d 0a 09 09 09 09 7d 0a 09 09 09 09 62 72  ..}.....}.....br
14910 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 30 78 30  eak;....case 0x0
14920 32 3a 0a 09 09 09 09 2f 2a 20 50 61 64 64 69 6e  2:...../* Paddin
14930 67 20 53 63 68 65 6d 65 20 33 2c 20 70 61 64 20  g Scheme 3, pad 
14940 62 79 74 65 73 20 61 72 65 20 6e 6f 6e 2d 7a 65  bytes are non-ze
14950 72 6f 20 66 69 72 73 74 20 7a 65 72 6f 20 62 79  ro first zero by
14960 74 65 20 66 6f 75 6e 64 20 69 73 20 74 68 65 20  te found is the 
14970 73 65 70 65 72 61 74 6f 72 20 62 79 74 65 20 2a  seperator byte *
14980 2f 0a 09 09 09 09 66 6f 72 20 28 75 6e 70 61 64  /.....for (unpad
14990 6f 66 66 73 65 74 20 3d 20 32 3b 20 75 6e 70 61  offset = 2; unpa
149a0 64 6f 66 66 73 65 74 20 3c 20 72 65 74 76 61 6c  doffset < retval
149b0 3b 20 75 6e 70 61 64 6f 66 66 73 65 74 2b 2b 29  ; unpadoffset++)
149c0 20 7b 0a 09 09 09 09 09 69 66 20 28 6f 75 74 62   {......if (outb
149d0 75 66 5b 75 6e 70 61 64 6f 66 66 73 65 74 5d 20  uf[unpadoffset] 
149e0 3d 3d 20 30 78 30 30 29 20 7b 0a 09 09 09 09 09  == 0x00) {......
149f0 09 75 6e 70 61 64 6f 66 66 73 65 74 2b 2b 3b 0a  .unpadoffset++;.
14a00 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .......break;...
14a10 09 09 09 7d 0a 09 09 09 09 7d 0a 09 09 09 09 62  ...}.....}.....b
14a20 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09 69 66 20  reak;...}....if 
14a30 28 75 6e 70 61 64 6f 66 66 73 65 74 20 3e 20 72  (unpadoffset > r
14a40 65 74 76 61 6c 29 20 7b 0a 09 09 09 43 41 43 4b  etval) {....CACK
14a50 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
14a60 22 4f 66 66 73 65 74 20 67 72 65 61 74 65 72 20  "Offset greater 
14a70 74 68 61 6e 20 72 65 70 6c 79 20 73 69 7a 65 2c  than reply size,
14a80 20 61 62 6f 72 74 69 6e 67 2e 20 20 28 75 6e 70   aborting.  (unp
14a90 61 64 6f 66 66 73 65 74 20 3d 20 25 6c 75 2c 20  adoffset = %lu, 
14aa0 72 65 74 76 61 6c 20 3d 20 25 6c 75 29 22 2c 20  retval = %lu)", 
14ab0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
14ac0 75 6e 70 61 64 6f 66 66 73 65 74 2c 20 28 75 6e  unpadoffset, (un
14ad0 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 72 65 74  signed long) ret
14ae0 76 61 6c 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e  val);.....return
14af0 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09 09 43 41 43  (-1);...}....CAC
14b00 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42  KEY_DEBUG_PRINTB
14b10 55 46 28 22 50 61 64 64 65 64 3a 22 2c 20 6f 75  UF("Padded:", ou
14b20 74 62 75 66 2c 20 72 65 74 76 61 6c 29 3b 0a 0a  tbuf, retval);..
14b30 09 09 72 65 74 76 61 6c 20 2d 3d 20 75 6e 70 61  ..retval -= unpa
14b40 64 6f 66 66 73 65 74 3b 0a 09 09 6d 65 6d 6d 6f  doffset;...memmo
14b50 76 65 28 6f 75 74 62 75 66 2c 20 6f 75 74 62 75  ve(outbuf, outbu
14b60 66 20 2b 20 75 6e 70 61 64 6f 66 66 73 65 74 2c  f + unpadoffset,
14b70 20 72 65 74 76 61 6c 29 3b 0a 0a 09 09 43 41 43   retval);....CAC
14b80 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42  KEY_DEBUG_PRINTB
14b90 55 46 28 22 55 6e 70 61 64 64 65 64 3a 22 2c 20  UF("Unpadded:", 
14ba0 6f 75 74 62 75 66 2c 20 72 65 74 76 61 6c 29 3b  outbuf, retval);
14bb0 0a 09 7d 0a 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ..}....CACKEY_DE
14bc0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
14bd0 72 6e 69 6e 67 20 69 6e 20 73 75 63 63 65 73 73  rning in success
14be0 2c 20 72 65 74 76 61 6c 20 3d 20 25 6c 69 20 28  , retval = %li (
14bf0 62 79 74 65 73 29 22 2c 20 28 6c 6f 6e 67 29 20  bytes)", (long) 
14c00 72 65 74 76 61 6c 29 3b 0a 0a 09 72 65 74 75 72  retval);...retur
14c10 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 2f 2a  n(retval);.}../*
14c20 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20  . * SYNPOSIS. * 
14c30 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52      .... *. * AR
14c40 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 2e  GUMENTS. *     .
14c50 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20  ... *. * RETURN 
14c60 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e 2e  VALUE. *     ...
14c70 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20  . *. * NOTES. * 
14c80 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73      .... *. */.s
14c90 74 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74  tatic cackey_ret
14ca0 20 63 61 63 6b 65 79 5f 74 6f 6b 65 6e 5f 70 72   cackey_token_pr
14cb0 65 73 65 6e 74 28 73 74 72 75 63 74 20 63 61 63  esent(struct cac
14cc0 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 20  key_slot *slot) 
14cd0 7b 0a 09 63 61 63 6b 65 79 5f 72 65 74 20 70 63  {..cackey_ret pc
14ce0 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 3b 0a  sc_connect_ret;.
14cf0 09 44 57 4f 52 44 20 72 65 61 64 65 72 5f 6c 65  .DWORD reader_le
14d00 6e 20 3d 20 30 2c 20 73 74 61 74 65 20 3d 20 30  n = 0, state = 0
14d10 2c 20 70 72 6f 74 6f 63 6f 6c 20 3d 20 30 2c 20  , protocol = 0, 
14d20 61 74 72 5f 6c 65 6e 3b 0a 09 42 59 54 45 20 61  atr_len;..BYTE a
14d30 74 72 5b 4d 41 58 5f 41 54 52 5f 53 49 5a 45 5d  tr[MAX_ATR_SIZE]
14d40 3b 0a 09 4c 4f 4e 47 20 73 74 61 74 75 73 5f 72  ;..LONG status_r
14d50 65 74 2c 20 73 63 61 72 64 5f 72 65 63 6f 6e 6e  et, scard_reconn
14d60 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  _ret;...CACKEY_D
14d70 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
14d80 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 73 6c  led.");...if (sl
14d90 6f 74 2d 3e 69 6e 74 65 72 6e 61 6c 29 20 7b 0a  ot->internal) {.
14da0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
14db0 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
14dc0 20 74 6f 6b 65 6e 20 70 72 65 73 65 6e 74 20 28   token present (
14dd0 69 6e 74 65 72 6e 61 6c 20 74 6f 6b 65 6e 29 22  internal token)"
14de0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43  );....return(CAC
14df0 4b 45 59 5f 50 43 53 43 5f 53 5f 54 4f 4b 45 4e  KEY_PCSC_S_TOKEN
14e00 50 52 45 53 45 4e 54 29 3b 0a 09 7d 0a 0a 09 70  PRESENT);..}...p
14e10 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 20  csc_connect_ret 
14e20 3d 20 63 61 63 6b 65 79 5f 63 6f 6e 6e 65 63 74  = cackey_connect
14e30 5f 63 61 72 64 28 73 6c 6f 74 29 3b 0a 09 69 66  _card(slot);..if
14e40 20 28 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72   (pcsc_connect_r
14e50 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53  et != CACKEY_PCS
14e60 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b  C_S_OK) {...CACK
14e70 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
14e80 22 55 6e 61 62 6c 65 20 74 6f 20 63 6f 6e 6e 65  "Unable to conne
14e90 63 74 20 74 6f 20 63 61 72 64 2c 20 72 65 74 75  ct to card, retu
14ea0 72 6e 69 6e 67 20 74 6f 6b 65 6e 20 61 62 73 65  rning token abse
14eb0 6e 74 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  nt");....return(
14ec0 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f  CACKEY_PCSC_E_TO
14ed0 4b 45 4e 41 42 53 45 4e 54 29 3b 0a 09 7d 0a 0a  KENABSENT);..}..
14ee0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
14ef0 49 4e 54 46 28 22 43 61 6c 6c 69 6e 67 20 53 43  INTF("Calling SC
14f00 61 72 64 53 74 61 74 75 73 28 29 20 74 6f 20 64  ardStatus() to d
14f10 65 74 65 72 6d 69 6e 65 20 63 61 72 64 20 73 74  etermine card st
14f20 61 74 75 73 22 29 3b 0a 0a 09 61 74 72 5f 6c 65  atus");...atr_le
14f30 6e 20 3d 20 73 69 7a 65 6f 66 28 61 74 72 29 3b  n = sizeof(atr);
14f40 0a 09 73 74 61 74 75 73 5f 72 65 74 20 3d 20 53  ..status_ret = S
14f50 43 61 72 64 53 74 61 74 75 73 28 73 6c 6f 74 2d  CardStatus(slot-
14f60 3e 70 63 73 63 5f 63 61 72 64 2c 20 4e 55 4c 4c  >pcsc_card, NULL
14f70 2c 20 26 72 65 61 64 65 72 5f 6c 65 6e 2c 20 26  , &reader_len, &
14f80 73 74 61 74 65 2c 20 26 70 72 6f 74 6f 63 6f 6c  state, &protocol
14f90 2c 20 61 74 72 2c 20 26 61 74 72 5f 6c 65 6e 29  , atr, &atr_len)
14fa0 3b 0a 0a 09 69 66 20 28 73 74 61 74 75 73 5f 72  ;...if (status_r
14fb0 65 74 20 3d 3d 20 53 43 41 52 44 5f 45 5f 49 4e  et == SCARD_E_IN
14fc0 56 41 4c 49 44 5f 48 41 4e 44 4c 45 29 20 7b 0a  VALID_HANDLE) {.
14fd0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
14fe0 52 49 4e 54 46 28 22 53 43 61 72 64 53 74 61 74  RINTF("SCardStat
14ff0 75 73 28 29 20 72 65 74 75 72 6e 65 64 20 53 43  us() returned SC
15000 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 48 41  ARD_E_INVALID_HA
15010 4e 44 4c 45 2c 20 6d 61 72 6b 69 6e 67 20 69 73  NDLE, marking is
15020 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 63 6f 6e   not already con
15030 6e 65 63 74 65 64 20 61 6e 64 20 74 72 79 69 6e  nected and tryin
15040 67 20 61 67 61 69 6e 22 29 3b 0a 09 09 63 61 63  g again");...cac
15050 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65  key_mark_slot_re
15060 73 65 74 28 73 6c 6f 74 29 3b 0a 0a 09 09 70 63  set(slot);....pc
15070 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 20 3d  sc_connect_ret =
15080 20 63 61 63 6b 65 79 5f 63 6f 6e 6e 65 63 74 5f   cackey_connect_
15090 63 61 72 64 28 73 6c 6f 74 29 3b 0a 09 09 69 66  card(slot);...if
150a0 20 28 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72   (pcsc_connect_r
150b0 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53  et != CACKEY_PCS
150c0 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 43 41 43  C_S_OK) {....CAC
150d0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
150e0 28 22 55 6e 61 62 6c 65 20 74 6f 20 63 6f 6e 6e  ("Unable to conn
150f0 65 63 74 20 74 6f 20 63 61 72 64 2c 20 72 65 74  ect to card, ret
15100 75 72 6e 69 6e 67 20 74 6f 6b 65 6e 20 61 62 73  urning token abs
15110 65 6e 74 22 29 3b 0a 0a 09 09 09 72 65 74 75 72  ent");.....retur
15120 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  n(CACKEY_PCSC_E_
15130 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b 0a 09 09  TOKENABSENT);...
15140 7d 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  }....CACKEY_DEBU
15150 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 69 6e  G_PRINTF("Callin
15160 67 20 53 43 61 72 64 53 74 61 74 75 73 28 29 20  g SCardStatus() 
15170 61 67 61 69 6e 22 29 3b 0a 0a 09 09 61 74 72 5f  again");....atr_
15180 6c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 61 74 72  len = sizeof(atr
15190 29 3b 0a 09 09 73 74 61 74 75 73 5f 72 65 74 20  );...status_ret 
151a0 3d 20 53 43 61 72 64 53 74 61 74 75 73 28 73 6c  = SCardStatus(sl
151b0 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 4e  ot->pcsc_card, N
151c0 55 4c 4c 2c 20 26 72 65 61 64 65 72 5f 6c 65 6e  ULL, &reader_len
151d0 2c 20 26 73 74 61 74 65 2c 20 26 70 72 6f 74 6f  , &state, &proto
151e0 63 6f 6c 2c 20 61 74 72 2c 20 26 61 74 72 5f 6c  col, atr, &atr_l
151f0 65 6e 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 74  en);..}...if (st
15200 61 74 75 73 5f 72 65 74 20 21 3d 20 53 43 41 52  atus_ret != SCAR
15210 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09  D_S_SUCCESS) {..
15220 09 63 61 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f  .cackey_mark_slo
15230 74 5f 72 65 73 65 74 28 73 6c 6f 74 29 3b 0a 0a  t_reset(slot);..
15240 09 09 69 66 20 28 73 74 61 74 75 73 5f 72 65 74  ..if (status_ret
15250 20 3d 3d 20 53 43 41 52 44 5f 57 5f 52 45 53 45   == SCARD_W_RESE
15260 54 5f 43 41 52 44 29 20 7b 0a 09 09 09 43 41 43  T_CARD) {....CAC
15270 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
15280 28 22 52 65 73 65 74 20 72 65 71 75 69 72 65 64  ("Reset required
15290 2c 20 70 6c 65 61 73 65 20 68 6f 6c 64 2e 2e 2e  , please hold...
152a0 22 29 3b 0a 0a 09 09 09 73 63 61 72 64 5f 72 65  ");.....scard_re
152b0 63 6f 6e 6e 5f 72 65 74 20 3d 20 63 61 63 6b 65  conn_ret = cacke
152c0 79 5f 72 65 63 6f 6e 6e 65 63 74 5f 63 61 72 64  y_reconnect_card
152d0 28 73 6c 6f 74 2c 20 53 43 41 52 44 5f 50 52 4f  (slot, SCARD_PRO
152e0 54 4f 43 4f 4c 5f 54 30 20 7c 20 53 43 41 52 44  TOCOL_T0 | SCARD
152f0 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31 29 3b 0a 09  _PROTOCOL_T1);..
15300 09 09 69 66 20 28 73 63 61 72 64 5f 72 65 63 6f  ..if (scard_reco
15310 6e 6e 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f  nn_ret == SCARD_
15320 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09 09  S_SUCCESS) {....
15330 09 2f 2a 20 52 65 2d 65 73 74 61 62 6c 69 73 68  ./* Re-establish
15340 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 66   transaction, if
15350 20 69 74 20 77 61 73 20 70 72 65 73 65 6e 74 20   it was present 
15360 2a 2f 0a 09 09 09 09 69 66 20 28 73 6c 6f 74 2d  */.....if (slot-
15370 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70  >transaction_dep
15380 74 68 20 3e 20 30 29 20 7b 0a 09 09 09 09 09 73  th > 0) {......s
15390 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e  lot->transaction
153a0 5f 64 65 70 74 68 2d 2d 3b 0a 09 09 09 09 09 73  _depth--;......s
153b0 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e  lot->transaction
153c0 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b 20 3d 20  _need_hw_lock = 
153d0 31 3b 0a 09 09 09 09 09 63 61 63 6b 65 79 5f 62  1;......cackey_b
153e0 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e  egin_transaction
153f0 28 73 6c 6f 74 29 3b 0a 09 09 09 09 7d 0a 0a 09  (slot);.....}...
15400 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
15410 50 52 49 4e 54 46 28 22 52 65 73 65 74 20 73 75  PRINTF("Reset su
15420 63 63 65 73 73 66 75 6c 2c 20 72 65 71 75 65 72  ccessful, requer
15430 79 69 6e 67 22 29 3b 0a 09 09 09 09 73 74 61 74  ying");.....stat
15440 75 73 5f 72 65 74 20 3d 20 53 43 61 72 64 53 74  us_ret = SCardSt
15450 61 74 75 73 28 73 6c 6f 74 2d 3e 70 63 73 63 5f  atus(slot->pcsc_
15460 63 61 72 64 2c 20 4e 55 4c 4c 2c 20 26 72 65 61  card, NULL, &rea
15470 64 65 72 5f 6c 65 6e 2c 20 26 73 74 61 74 65 2c  der_len, &state,
15480 20 26 70 72 6f 74 6f 63 6f 6c 2c 20 61 74 72 2c   &protocol, atr,
15490 20 26 61 74 72 5f 6c 65 6e 29 3b 0a 09 09 09 09   &atr_len);.....
154a0 69 66 20 28 73 74 61 74 75 73 5f 72 65 74 20 21  if (status_ret !
154b0 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53  = SCARD_S_SUCCES
154c0 53 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59  S) {......CACKEY
154d0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53  _DEBUG_PRINTF("S
154e0 74 69 6c 6c 20 75 6e 61 62 6c 65 20 74 6f 20 71  till unable to q
154f0 75 65 72 79 20 63 61 72 64 20 73 74 61 74 75 73  uery card status
15500 2c 20 72 65 74 75 72 6e 69 6e 67 20 74 6f 6b 65  , returning toke
15510 6e 20 61 62 73 65 6e 74 2e 20 20 53 43 61 72 64  n absent.  SCard
15520 53 74 61 74 75 73 28 29 20 3d 20 25 73 22 2c 20  Status() = %s", 
15530 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e  CACKEY_DEBUG_FUN
15540 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54  C_SCARDERR_TO_ST
15550 52 28 73 74 61 74 75 73 5f 72 65 74 29 29 3b 0a  R(status_ret));.
15560 0a 09 09 09 09 09 72 65 74 75 72 6e 28 43 41 43  ......return(CAC
15570 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e  KEY_PCSC_E_TOKEN
15580 41 42 53 45 4e 54 29 3b 0a 09 09 09 09 7d 0a 09  ABSENT);.....}..
15590 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 43  ..} else {.....C
155a0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
155b0 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 72 65  TF("Unable to re
155c0 63 6f 6e 6e 65 63 74 20 74 6f 20 63 61 72 64 2c  connect to card,
155d0 20 72 65 74 75 72 6e 69 6e 67 20 74 6f 6b 65 6e   returning token
155e0 20 61 62 73 65 6e 74 2e 20 20 53 43 61 72 64 52   absent.  SCardR
155f0 65 63 6f 6e 6e 65 63 74 28 29 20 3d 20 25 73 22  econnect() = %s"
15600 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46  , CACKEY_DEBUG_F
15610 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f  UNC_SCARDERR_TO_
15620 53 54 52 28 73 63 61 72 64 5f 72 65 63 6f 6e 6e  STR(scard_reconn
15630 5f 72 65 74 29 29 3b 0a 0a 09 09 09 09 72 65 74  _ret));......ret
15640 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
15650 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b 0a  E_TOKENABSENT);.
15660 09 09 09 7d 0a 09 09 7d 20 65 6c 73 65 20 7b 0a  ...}...} else {.
15670 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
15680 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74  PRINTF("Unable t
15690 6f 20 71 75 65 72 79 20 63 61 72 64 20 73 74 61  o query card sta
156a0 74 75 73 2c 20 72 65 74 75 72 6e 69 6e 67 20 74  tus, returning t
156b0 6f 6b 65 6e 20 61 62 73 65 6e 74 2e 20 20 53 43  oken absent.  SC
156c0 61 72 64 53 74 61 74 75 73 28 29 20 3d 20 25 73  ardStatus() = %s
156d0 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ", CACKEY_DEBUG_
156e0 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f  FUNC_SCARDERR_TO
156f0 5f 53 54 52 28 73 74 61 74 75 73 5f 72 65 74 29  _STR(status_ret)
15700 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 41  );.....return(CA
15710 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45  CKEY_PCSC_E_TOKE
15720 4e 41 42 53 45 4e 54 29 3b 0a 09 09 7d 0a 09 7d  NABSENT);...}..}
15730 0a 0a 09 69 66 20 28 28 73 74 61 74 65 20 26 20  ...if ((state & 
15740 53 43 41 52 44 5f 41 42 53 45 4e 54 29 20 3d 3d  SCARD_ABSENT) ==
15750 20 53 43 41 52 44 5f 41 42 53 45 4e 54 29 20 7b   SCARD_ABSENT) {
15760 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
15770 50 52 49 4e 54 46 28 22 43 61 72 64 20 69 73 20  PRINTF("Card is 
15780 61 62 73 65 6e 74 2c 20 72 65 74 75 72 6e 69 6e  absent, returnin
15790 67 20 74 6f 6b 65 6e 20 61 62 73 65 6e 74 22 29  g token absent")
157a0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b  ;....return(CACK
157b0 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41  EY_PCSC_E_TOKENA
157c0 42 53 45 4e 54 29 3b 0a 09 7d 0a 0a 09 43 41 43  BSENT);..}...CAC
157d0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
157e0 28 22 52 65 74 75 72 6e 69 6e 67 20 74 6f 6b 65  ("Returning toke
157f0 6e 20 70 72 65 73 65 6e 74 2e 22 29 3b 0a 0a 09  n present.");...
15800 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
15810 53 43 5f 53 5f 54 4f 4b 45 4e 50 52 45 53 45 4e  SC_S_TOKENPRESEN
15820 54 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e  T);.}../*. * SYN
15830 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 2e 2e 2e  POSIS. *     ...
15840 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53  . *. * ARGUMENTS
15850 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20  . *     .... *. 
15860 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20  * RETURN VALUE. 
15870 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20  *     .... *. * 
15880 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 2e 2e 2e  NOTES. *     ...
15890 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63  . *. */.static c
158a0 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79  ackey_ret cackey
158b0 5f 73 65 74 5f 70 69 6e 28 73 74 72 75 63 74 20  _set_pin(struct 
158c0 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f  cackey_slot *slo
158d0 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  t, unsigned char
158e0 20 2a 6f 6c 64 5f 70 69 6e 2c 20 75 6e 73 69 67   *old_pin, unsig
158f0 6e 65 64 20 6c 6f 6e 67 20 6f 6c 64 5f 70 69 6e  ned long old_pin
15900 5f 6c 65 6e 2c 20 75 6e 73 69 67 6e 65 64 20 63  _len, unsigned c
15910 68 61 72 20 2a 70 69 6e 2c 20 75 6e 73 69 67 6e  har *pin, unsign
15920 65 64 20 6c 6f 6e 67 20 70 69 6e 5f 6c 65 6e 29  ed long pin_len)
15930 20 7b 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65   {..struct cacke
15940 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20  y_pcsc_identity 
15950 2a 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73  *pcsc_identities
15960 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72  ;..unsigned char
15970 20 63 61 63 5f 70 69 6e 5b 38 5d 20 3d 20 7b 30   cac_pin[8] = {0
15980 78 46 46 2c 20 30 78 46 46 2c 20 30 78 46 46 2c  xFF, 0xFF, 0xFF,
15990 20 30 78 46 46 2c 20 30 78 46 46 2c 20 30 78 46   0xFF, 0xFF, 0xF
159a0 46 2c 20 30 78 46 46 2c 20 30 78 46 46 7d 3b 0a  F, 0xFF, 0xFF};.
159b0 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6f  .unsigned char o
159c0 6c 64 5f 63 61 63 5f 70 69 6e 5b 38 5d 20 3d 20  ld_cac_pin[8] = 
159d0 7b 30 78 46 46 2c 20 30 78 46 46 2c 20 30 78 46  {0xFF, 0xFF, 0xF
159e0 46 2c 20 30 78 46 46 2c 20 30 78 46 46 2c 20 30  F, 0xFF, 0xFF, 0
159f0 78 46 46 2c 20 30 78 46 46 2c 20 30 78 46 46 7d  xFF, 0xFF, 0xFF}
15a00 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72  ;..unsigned char
15a10 20 70 69 6e 5f 75 70 64 61 74 65 5b 73 69 7a 65   pin_update[size
15a20 6f 66 28 63 61 63 5f 70 69 6e 29 20 2b 20 73 69  of(cac_pin) + si
15a30 7a 65 6f 66 28 6f 6c 64 5f 63 61 63 5f 70 69 6e  zeof(old_cac_pin
15a40 29 5d 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f  )];..unsigned lo
15a50 6e 67 20 6e 75 6d 5f 63 65 72 74 73 3b 0a 09 75  ng num_certs;..u
15a60 69 6e 74 31 36 5f 74 20 72 65 73 70 6f 6e 73 65  int16_t response
15a70 5f 63 6f 64 65 3b 0a 09 69 6e 74 20 74 72 69 65  _code;..int trie
15a80 73 5f 72 65 6d 61 69 6e 69 6e 67 3b 0a 09 69 6e  s_remaining;..in
15a90 74 20 73 65 6e 64 5f 72 65 74 3b 0a 09 69 6e 74  t send_ret;..int
15aa0 20 6b 65 79 5f 72 65 66 65 72 65 6e 63 65 20 3d   key_reference =
15ab0 20 30 78 30 30 3b 0a 0a 09 2f 2a 20 41 70 70 61   0x00;.../* Appa
15ac0 72 65 6e 74 6c 79 2c 20 43 41 43 20 50 49 4e 73  rently, CAC PINs
15ad0 20 61 72 65 20 2a 45 58 41 43 54 4c 59 2a 20 38   are *EXACTLY* 8
15ae0 20 62 79 74 65 73 20 6c 6f 6e 67 20 2d 2d 20 70   bytes long -- p
15af0 61 64 20 77 69 74 68 20 30 78 46 46 20 69 66 20  ad with 0xFF if 
15b00 74 6f 6f 20 73 68 6f 72 74 20 2a 2f 0a 09 69 66  too short */..if
15b10 20 28 70 69 6e 5f 6c 65 6e 20 3e 3d 20 38 29 20   (pin_len >= 8) 
15b20 7b 0a 09 09 6d 65 6d 63 70 79 28 63 61 63 5f 70  {...memcpy(cac_p
15b30 69 6e 2c 20 70 69 6e 2c 20 38 29 3b 0a 09 7d 20  in, pin, 8);..} 
15b40 65 6c 73 65 20 7b 0a 09 09 6d 65 6d 63 70 79 28  else {...memcpy(
15b50 63 61 63 5f 70 69 6e 2c 20 70 69 6e 2c 20 70 69  cac_pin, pin, pi
15b60 6e 5f 6c 65 6e 29 3b 0a 09 7d 0a 0a 09 69 66 20  n_len);..}...if 
15b70 28 6f 6c 64 5f 70 69 6e 5f 6c 65 6e 20 3e 3d 20  (old_pin_len >= 
15b80 38 29 20 7b 0a 09 09 6d 65 6d 63 70 79 28 6f 6c  8) {...memcpy(ol
15b90 64 5f 63 61 63 5f 70 69 6e 2c 20 6f 6c 64 5f 70  d_cac_pin, old_p
15ba0 69 6e 2c 20 38 29 3b 0a 09 7d 20 65 6c 73 65 20  in, 8);..} else 
15bb0 7b 0a 09 09 6d 65 6d 63 70 79 28 6f 6c 64 5f 63  {...memcpy(old_c
15bc0 61 63 5f 70 69 6e 2c 20 6f 6c 64 5f 70 69 6e 2c  ac_pin, old_pin,
15bd0 20 6f 6c 64 5f 70 69 6e 5f 6c 65 6e 29 3b 0a 09   old_pin_len);..
15be0 7d 0a 0a 09 2f 2a 20 43 6f 6e 63 61 74 65 6e 61  }.../* Concatena
15bf0 74 65 20 62 6f 74 68 20 50 49 4e 73 20 74 6f 67  te both PINs tog
15c00 65 74 68 65 72 20 74 6f 20 73 65 6e 64 20 61 73  ether to send as
15c10 20 61 20 73 69 6e 67 6c 65 20 69 6e 73 74 72 75   a single instru
15c20 63 74 69 6f 6e 20 2a 2f 0a 09 6d 65 6d 63 70 79  ction */..memcpy
15c30 28 70 69 6e 5f 75 70 64 61 74 65 2c 20 6f 6c 64  (pin_update, old
15c40 5f 63 61 63 5f 70 69 6e 2c 20 73 69 7a 65 6f 66  _cac_pin, sizeof
15c50 28 6f 6c 64 5f 63 61 63 5f 70 69 6e 29 29 3b 0a  (old_cac_pin));.
15c60 09 6d 65 6d 63 70 79 28 70 69 6e 5f 75 70 64 61  .memcpy(pin_upda
15c70 74 65 20 2b 20 73 69 7a 65 6f 66 28 6f 6c 64 5f  te + sizeof(old_
15c80 63 61 63 5f 70 69 6e 29 2c 20 63 61 63 5f 70 69  cac_pin), cac_pi
15c90 6e 2c 20 73 69 7a 65 6f 66 28 63 61 63 5f 70 69  n, sizeof(cac_pi
15ca0 6e 29 29 3b 0a 0a 09 2f 2a 20 52 65 6a 65 63 74  n));.../* Reject
15cb0 20 50 49 4e 73 20 77 68 69 63 68 20 61 72 65 20   PINs which are 
15cc0 74 6f 6f 20 73 68 6f 72 74 20 2a 2f 0a 09 69 66  too short */..if
15cd0 20 28 70 69 6e 5f 6c 65 6e 20 3c 20 35 29 20 7b   (pin_len < 5) {
15ce0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
15cf0 50 52 49 4e 54 46 28 22 52 65 6a 65 63 74 69 6e  PRINTF("Rejectin
15d00 67 20 4e 65 77 20 50 49 4e 20 77 68 69 63 68 20  g New PIN which 
15d10 69 73 20 74 6f 6f 20 73 68 6f 72 74 20 28 6c 65  is too short (le
15d20 6e 67 74 68 20 3d 20 25 6c 75 2c 20 6d 75 73 74  ngth = %lu, must
15d30 20 62 65 20 61 74 6c 65 61 73 74 20 35 29 22 2c   be atleast 5)",
15d40 20 70 69 6e 5f 6c 65 6e 29 3b 0a 0a 09 09 72 65   pin_len);....re
15d50 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
15d60 5f 45 5f 42 41 44 50 49 4e 29 3b 0a 09 7d 0a 0a  _E_BADPIN);..}..
15d70 09 69 66 20 28 6f 6c 64 5f 70 69 6e 5f 6c 65 6e  .if (old_pin_len
15d80 20 3c 20 35 29 20 7b 0a 09 09 43 41 43 4b 45 59   < 5) {...CACKEY
15d90 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
15da0 65 6a 65 63 74 69 6e 67 20 4f 6c 64 20 50 49 4e  ejecting Old PIN
15db0 20 77 68 69 63 68 20 69 73 20 74 6f 6f 20 73 68   which is too sh
15dc0 6f 72 74 20 28 6c 65 6e 67 74 68 20 3d 20 25 6c  ort (length = %l
15dd0 75 2c 20 6d 75 73 74 20 62 65 20 61 74 6c 65 61  u, must be atlea
15de0 73 74 20 35 29 22 2c 20 6f 6c 64 5f 70 69 6e 5f  st 5)", old_pin_
15df0 6c 65 6e 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  len);....return(
15e00 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 42 41  CACKEY_PCSC_E_BA
15e10 44 50 49 4e 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 50  DPIN);..}.../* P
15e20 49 56 20 61 75 74 68 65 6e 74 69 63 61 74 69 6f  IV authenticatio
15e30 6e 20 75 73 65 73 20 61 20 22 6b 65 79 5f 72 65  n uses a "key_re
15e40 66 65 72 65 6e 63 65 22 20 6f 66 20 30 78 38 30  ference" of 0x80
15e50 20 2a 2f 0a 09 70 63 73 63 5f 69 64 65 6e 74 69   */..pcsc_identi
15e60 74 69 65 73 20 3d 20 63 61 63 6b 65 79 5f 72 65  ties = cackey_re
15e70 61 64 5f 63 65 72 74 73 28 73 6c 6f 74 2c 20 4e  ad_certs(slot, N
15e80 55 4c 4c 2c 20 26 6e 75 6d 5f 63 65 72 74 73 29  ULL, &num_certs)
15e90 3b 0a 09 69 66 20 28 6e 75 6d 5f 63 65 72 74 73  ;..if (num_certs
15ea0 20 3e 20 30 20 26 26 20 70 63 73 63 5f 69 64 65   > 0 && pcsc_ide
15eb0 6e 74 69 74 69 65 73 20 21 3d 20 4e 55 4c 4c 29  ntities != NULL)
15ec0 20 7b 0a 09 09 73 77 69 74 63 68 20 28 70 63 73   {...switch (pcs
15ed0 63 5f 69 64 65 6e 74 69 74 69 65 73 5b 30 5d 2e  c_identities[0].
15ee0 69 64 5f 74 79 70 65 29 20 7b 0a 09 09 09 63 61  id_type) {....ca
15ef0 73 65 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50  se CACKEY_ID_TYP
15f00 45 5f 50 49 56 3a 0a 09 09 09 09 43 41 43 4b 45  E_PIV:.....CACKE
15f10 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
15f20 57 65 20 68 61 76 65 20 50 49 56 20 63 61 72 64  We have PIV card
15f30 2c 20 73 6f 20 77 65 20 77 69 6c 6c 20 61 74 74  , so we will att
15f40 65 6d 70 74 20 74 6f 20 61 75 74 68 65 6e 74 69  empt to authenti
15f50 63 61 74 65 20 75 73 69 6e 67 20 74 68 65 20 50  cate using the P
15f60 49 56 20 41 70 70 6c 69 63 61 74 69 6f 6e 20 6b  IV Application k
15f70 65 79 20 72 65 66 65 72 65 6e 63 65 22 29 3b 0a  ey reference");.
15f80 0a 09 09 09 09 6b 65 79 5f 72 65 66 65 72 65 6e  .....key_referen
15f90 63 65 20 3d 20 30 78 38 30 3b 0a 09 09 09 09 62  ce = 0x80;.....b
15fa0 72 65 61 6b 3b 0a 09 09 09 64 65 66 61 75 6c 74  reak;....default
15fb0 3a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d  :.....break;...}
15fc0 0a 0a 09 09 63 61 63 6b 65 79 5f 66 72 65 65 5f  ....cackey_free_
15fd0 63 65 72 74 73 28 70 63 73 63 5f 69 64 65 6e 74  certs(pcsc_ident
15fe0 69 74 69 65 73 2c 20 6e 75 6d 5f 63 65 72 74 73  ities, num_certs
15ff0 2c 20 31 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 49 73  , 1);..}.../* Is
16000 73 75 65 20 61 20 53 65 74 20 50 49 4e 20 28 43  sue a Set PIN (C
16010 48 41 4e 47 45 20 52 45 46 45 52 45 4e 43 45 29  HANGE REFERENCE)
16020 20 2a 2f 0a 09 73 65 6e 64 5f 72 65 74 20 3d 20   */..send_ret = 
16030 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75  cackey_send_apdu
16040 28 73 6c 6f 74 2c 20 47 53 43 49 53 5f 43 4c 41  (slot, GSCIS_CLA
16050 53 53 5f 49 53 4f 37 38 31 36 2c 20 47 53 43 49  SS_ISO7816, GSCI
16060 53 5f 49 4e 53 54 52 5f 43 48 41 4e 47 45 5f 52  S_INSTR_CHANGE_R
16070 45 46 45 52 45 4e 43 45 2c 20 30 78 30 30 2c 20  EFERENCE, 0x00, 
16080 6b 65 79 5f 72 65 66 65 72 65 6e 63 65 2c 20 73  key_reference, s
16090 69 7a 65 6f 66 28 70 69 6e 5f 75 70 64 61 74 65  izeof(pin_update
160a0 29 2c 20 70 69 6e 5f 75 70 64 61 74 65 2c 20 30  ), pin_update, 0
160b0 78 30 30 2c 20 26 72 65 73 70 6f 6e 73 65 5f 63  x00, &response_c
160c0 6f 64 65 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29  ode, NULL, NULL)
160d0 3b 0a 0a 09 69 66 20 28 73 65 6e 64 5f 72 65 74  ;...if (send_ret
160e0 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f   != CACKEY_PCSC_
160f0 53 5f 4f 4b 29 20 7b 0a 09 09 69 66 20 28 28 72  S_OK) {...if ((r
16100 65 73 70 6f 6e 73 65 5f 63 6f 64 65 20 26 20 30  esponse_code & 0
16110 78 36 33 43 30 29 20 3d 3d 20 30 78 36 33 43 30  x63C0) == 0x63C0
16120 29 20 7b 0a 09 09 09 74 72 69 65 73 5f 72 65 6d  ) {....tries_rem
16130 61 69 6e 69 6e 67 20 3d 20 28 72 65 73 70 6f 6e  aining = (respon
16140 73 65 5f 63 6f 64 65 20 26 20 30 78 46 29 3b 0a  se_code & 0xF);.
16150 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
16160 5f 50 52 49 4e 54 46 28 22 50 49 4e 20 56 65 72  _PRINTF("PIN Ver
16170 69 66 69 63 61 74 69 6f 6e 20 66 61 69 6c 65 64  ification failed
16180 2c 20 25 69 20 74 72 69 65 73 20 72 65 6d 61 69  , %i tries remai
16190 6e 69 6e 67 22 2c 20 74 72 69 65 73 5f 72 65 6d  ning", tries_rem
161a0 61 69 6e 69 6e 67 29 3b 0a 0a 09 09 09 72 65 74  aining);.....ret
161b0 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
161c0 45 5f 42 41 44 50 49 4e 29 3b 0a 09 09 7d 0a 0a  E_BADPIN);...}..
161d0 09 09 69 66 20 28 72 65 73 70 6f 6e 73 65 5f 63  ..if (response_c
161e0 6f 64 65 20 3d 3d 20 30 78 36 39 38 33 29 20 7b  ode == 0x6983) {
161f0 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
16200 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20  _PRINTF("Unable 
16210 74 6f 20 73 65 74 20 50 49 4e 2c 20 64 65 76 69  to set PIN, devi
16220 63 65 20 69 73 20 6c 6f 63 6b 65 64 20 6f 72 20  ce is locked or 
16230 63 68 61 6e 67 69 6e 67 20 74 68 65 20 50 49 4e  changing the PIN
16240 20 69 73 20 64 69 73 61 62 6c 65 64 22 29 3b 0a   is disabled");.
16250 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ....return(CACKE
16260 59 5f 50 43 53 43 5f 45 5f 4c 4f 43 4b 45 44 29  Y_PCSC_E_LOCKED)
16270 3b 0a 09 09 7d 0a 0a 09 09 72 65 74 75 72 6e 28  ;...}....return(
16280 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45  CACKEY_PCSC_E_GE
16290 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 43 41 43  NERIC);..}...CAC
162a0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
162b0 28 22 50 49 4e 20 43 68 61 6e 67 65 20 73 75 63  ("PIN Change suc
162c0 63 65 65 64 65 64 22 29 3b 0a 0a 09 72 65 74 75  ceeded");...retu
162d0 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  rn(CACKEY_PCSC_S
162e0 5f 4f 4b 29 3b 0a 0a 09 2f 2a 20 44 69 73 61 62  _OK);.../* Disab
162f0 6c 65 20 61 20 77 61 72 6e 69 6e 67 2c 20 73 69  le a warning, si
16300 6e 63 65 20 74 68 69 73 20 69 73 20 6f 6e 6c 79  nce this is only
16310 20 75 73 65 64 20 69 6e 20 64 65 62 75 67 20 6d   used in debug m
16320 6f 64 65 20 2a 2f 0a 09 74 72 69 65 73 5f 72 65  ode */..tries_re
16330 6d 61 69 6e 69 6e 67 20 3d 20 74 72 69 65 73 5f  maining = tries_
16340 72 65 6d 61 69 6e 69 6e 67 3b 0a 7d 0a 0a 2f 2a  remaining;.}../*
16350 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20  . * SYNPOSIS. * 
16360 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52      .... *. * AR
16370 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 2e  GUMENTS. *     .
16380 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20  ... *. * RETURN 
16390 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e 2e  VALUE. *     ...
163a0 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20  . *. * NOTES. * 
163b0 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73      .... *. */.s
163c0 74 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74  tatic cackey_ret
163d0 20 63 61 63 6b 65 79 5f 6c 6f 67 69 6e 28 73 74   cackey_login(st
163e0 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74  ruct cackey_slot
163f0 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64   *slot, unsigned
16400 20 63 68 61 72 20 2a 70 69 6e 2c 20 75 6e 73 69   char *pin, unsi
16410 67 6e 65 64 20 6c 6f 6e 67 20 70 69 6e 5f 6c 65  gned long pin_le
16420 6e 2c 20 69 6e 74 20 2a 74 72 69 65 73 5f 72 65  n, int *tries_re
16430 6d 61 69 6e 69 6e 67 5f 70 2c 20 69 6e 74 20 72  maining_p, int r
16440 65 74 72 69 65 73 29 20 7b 0a 09 73 74 72 75 63  etries) {..struc
16450 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64  t cackey_pcsc_id
16460 65 6e 74 69 74 79 20 2a 70 63 73 63 5f 69 64 65  entity *pcsc_ide
16470 6e 74 69 74 69 65 73 3b 0a 09 75 6e 73 69 67 6e  ntities;..unsign
16480 65 64 20 63 68 61 72 20 63 61 63 5f 70 69 6e 5b  ed char cac_pin[
16490 38 5d 20 3d 20 7b 30 78 46 46 2c 20 30 78 46 46  8] = {0xFF, 0xFF
164a0 2c 20 30 78 46 46 2c 20 30 78 46 46 2c 20 30 78  , 0xFF, 0xFF, 0x
164b0 46 46 2c 20 30 78 46 46 2c 20 30 78 46 46 2c 20  FF, 0xFF, 0xFF, 
164c0 30 78 46 46 7d 3b 0a 09 75 6e 73 69 67 6e 65 64  0xFF};..unsigned
164d0 20 6c 6f 6e 67 20 6e 75 6d 5f 63 65 72 74 73 3b   long num_certs;
164e0 0a 09 75 69 6e 74 31 36 5f 74 20 72 65 73 70 6f  ..uint16_t respo
164f0 6e 73 65 5f 63 6f 64 65 3b 0a 09 69 6e 74 20 74  nse_code;..int t
16500 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 3b 0a  ries_remaining;.
16510 09 69 6e 74 20 73 65 6e 64 5f 72 65 74 3b 0a 09  .int send_ret;..
16520 69 6e 74 20 6b 65 79 5f 72 65 66 65 72 65 6e 63  int key_referenc
16530 65 20 3d 20 30 78 30 30 2c 20 68 61 76 65 5f 70  e = 0x00, have_p
16540 69 76 20 3d 20 30 3b 0a 09 63 61 63 6b 65 79 5f  iv = 0;..cackey_
16550 72 65 74 20 63 6f 6e 6e 65 63 74 5f 72 65 74 2c  ret connect_ret,
16560 20 74 6f 6b 65 6e 5f 72 65 74 3b 0a 0a 09 2f 2a   token_ret;.../*
16570 20 49 6e 64 69 63 61 74 65 20 74 68 61 74 20 77   Indicate that w
16580 65 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77 20 61 62  e do not know ab
16590 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 74 72 69  out how many tri
165a0 65 73 20 61 72 65 20 72 65 6d 61 69 6e 69 6e 67  es are remaining
165b0 20 2a 2f 0a 09 69 66 20 28 74 72 69 65 73 5f 72   */..if (tries_r
165c0 65 6d 61 69 6e 69 6e 67 5f 70 29 20 7b 0a 09 09  emaining_p) {...
165d0 2a 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67  *tries_remaining
165e0 5f 70 20 3d 20 2d 31 3b 0a 09 7d 0a 0a 09 2f 2a  _p = -1;..}.../*
165f0 20 41 70 70 61 72 65 6e 74 6c 79 2c 20 43 41 43   Apparently, CAC
16600 20 50 49 4e 73 20 61 72 65 20 2a 45 58 41 43 54   PINs are *EXACT
16610 4c 59 2a 20 38 20 62 79 74 65 73 20 6c 6f 6e 67  LY* 8 bytes long
16620 20 2d 2d 20 70 61 64 20 77 69 74 68 20 30 78 46   -- pad with 0xF
16630 46 20 69 66 20 74 6f 6f 20 73 68 6f 72 74 20 2a  F if too short *
16640 2f 0a 09 69 66 20 28 70 69 6e 5f 6c 65 6e 20 3e  /..if (pin_len >
16650 3d 20 38 29 20 7b 0a 09 09 6d 65 6d 63 70 79 28  = 8) {...memcpy(
16660 63 61 63 5f 70 69 6e 2c 20 70 69 6e 2c 20 38 29  cac_pin, pin, 8)
16670 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 6d 65  ;..} else {...me
16680 6d 63 70 79 28 63 61 63 5f 70 69 6e 2c 20 70 69  mcpy(cac_pin, pi
16690 6e 2c 20 70 69 6e 5f 6c 65 6e 29 3b 0a 09 7d 0a  n, pin_len);..}.
166a0 0a 09 2f 2a 20 52 65 6a 65 63 74 20 50 49 4e 73  ../* Reject PINs
166b0 20 77 68 69 63 68 20 61 72 65 20 74 6f 6f 20 73   which are too s
166c0 68 6f 72 74 20 2a 2f 0a 09 69 66 20 28 70 69 6e  hort */..if (pin
166d0 5f 6c 65 6e 20 3c 20 35 29 20 7b 0a 09 09 43 41  _len < 5) {...CA
166e0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
166f0 46 28 22 52 65 6a 65 63 74 69 6e 67 20 50 49 4e  F("Rejecting PIN
16700 20 77 68 69 63 68 20 69 73 20 74 6f 6f 20 73 68   which is too sh
16710 6f 72 74 20 28 6c 65 6e 67 74 68 20 3d 20 25 6c  ort (length = %l
16720 75 2c 20 6d 75 73 74 20 62 65 20 61 74 6c 65 61  u, must be atlea
16730 73 74 20 35 29 22 2c 20 70 69 6e 5f 6c 65 6e 29  st 5)", pin_len)
16740 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b  ;....return(CACK
16750 45 59 5f 50 43 53 43 5f 45 5f 42 41 44 50 49 4e  EY_PCSC_E_BADPIN
16760 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 50 49 56 20 61  );..}.../* PIV a
16770 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 20 75 73  uthentication us
16780 65 73 20 61 20 22 6b 65 79 5f 72 65 66 65 72 65  es a "key_refere
16790 6e 63 65 22 20 6f 66 20 30 78 38 30 20 2a 2f 0a  nce" of 0x80 */.
167a0 09 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73  .pcsc_identities
167b0 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 63   = cackey_read_c
167c0 65 72 74 73 28 73 6c 6f 74 2c 20 4e 55 4c 4c 2c  erts(slot, NULL,
167d0 20 26 6e 75 6d 5f 63 65 72 74 73 29 3b 0a 09 69   &num_certs);..i
167e0 66 20 28 6e 75 6d 5f 63 65 72 74 73 20 3e 20 30  f (num_certs > 0
167f0 20 26 26 20 70 63 73 63 5f 69 64 65 6e 74 69 74   && pcsc_identit
16800 69 65 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ies != NULL) {..
16810 09 73 77 69 74 63 68 20 28 70 63 73 63 5f 69 64  .switch (pcsc_id
16820 65 6e 74 69 74 69 65 73 5b 30 5d 2e 69 64 5f 74  entities[0].id_t
16830 79 70 65 29 20 7b 0a 09 09 09 63 61 73 65 20 43  ype) {....case C
16840 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 50 49  ACKEY_ID_TYPE_PI
16850 56 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  V:.....CACKEY_DE
16860 42 55 47 5f 50 52 49 4e 54 46 28 22 57 65 20 68  BUG_PRINTF("We h
16870 61 76 65 20 50 49 56 20 63 61 72 64 2c 20 73 6f  ave PIV card, so
16880 20 77 65 20 77 69 6c 6c 20 61 74 74 65 6d 70 74   we will attempt
16890 20 74 6f 20 61 75 74 68 65 6e 74 69 63 61 74 65   to authenticate
168a0 20 75 73 69 6e 67 20 74 68 65 20 50 49 56 20 41   using the PIV A
168b0 70 70 6c 69 63 61 74 69 6f 6e 20 6b 65 79 20 72  pplication key r
168c0 65 66 65 72 65 6e 63 65 22 29 3b 0a 0a 09 09 09  eference");.....
168d0 09 68 61 76 65 5f 70 69 76 20 3d 20 31 3b 0a 09  .have_piv = 1;..
168e0 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 64 65 66  ...break;....def
168f0 61 75 6c 74 3a 0a 09 09 09 09 62 72 65 61 6b 3b  ault:.....break;
16900 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 66  ...}....cackey_f
16910 72 65 65 5f 63 65 72 74 73 28 70 63 73 63 5f 69  ree_certs(pcsc_i
16920 64 65 6e 74 69 74 69 65 73 2c 20 6e 75 6d 5f 63  dentities, num_c
16930 65 72 74 73 2c 20 31 29 3b 0a 09 7d 0a 0a 09 69  erts, 1);..}...i
16940 66 20 28 68 61 76 65 5f 70 69 76 20 3d 3d 20 31  f (have_piv == 1
16950 29 20 7b 0a 09 09 6b 65 79 5f 72 65 66 65 72 65  ) {...key_refere
16960 6e 63 65 20 3d 20 30 78 38 30 3b 0a 09 7d 0a 0a  nce = 0x80;..}..
16970 09 2f 2a 20 49 73 73 75 65 20 50 49 4e 20 56 65  ./* Issue PIN Ve
16980 72 69 66 79 20 2a 2f 0a 09 73 65 6e 64 5f 72 65  rify */..send_re
16990 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f  t = cackey_send_
169a0 61 70 64 75 28 73 6c 6f 74 2c 20 47 53 43 49 53  apdu(slot, GSCIS
169b0 5f 43 4c 41 53 53 5f 49 53 4f 37 38 31 36 2c 20  _CLASS_ISO7816, 
169c0 47 53 43 49 53 5f 49 4e 53 54 52 5f 56 45 52 49  GSCIS_INSTR_VERI
169d0 46 59 2c 20 30 78 30 30 2c 20 6b 65 79 5f 72 65  FY, 0x00, key_re
169e0 66 65 72 65 6e 63 65 2c 20 73 69 7a 65 6f 66 28  ference, sizeof(
169f0 63 61 63 5f 70 69 6e 29 2c 20 63 61 63 5f 70 69  cac_pin), cac_pi
16a00 6e 2c 20 30 78 30 30 2c 20 26 72 65 73 70 6f 6e  n, 0x00, &respon
16a10 73 65 5f 63 6f 64 65 2c 20 4e 55 4c 4c 2c 20 4e  se_code, NULL, N
16a20 55 4c 4c 29 3b 0a 0a 09 69 66 20 28 73 65 6e 64  ULL);...if (send
16a30 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50  _ret != CACKEY_P
16a40 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 69 66  CSC_S_OK) {...if
16a50 20 28 28 72 65 73 70 6f 6e 73 65 5f 63 6f 64 65   ((response_code
16a60 20 26 20 30 78 36 33 43 30 29 20 3d 3d 20 30 78   & 0x63C0) == 0x
16a70 36 33 43 30 29 20 7b 0a 09 09 09 74 72 69 65 73  63C0) {....tries
16a80 5f 72 65 6d 61 69 6e 69 6e 67 20 3d 20 28 72 65  _remaining = (re
16a90 73 70 6f 6e 73 65 5f 63 6f 64 65 20 26 20 30 78  sponse_code & 0x
16aa0 46 29 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44  F);.....CACKEY_D
16ab0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 50 49 4e  EBUG_PRINTF("PIN
16ac0 20 56 65 72 69 66 69 63 61 74 69 6f 6e 20 66 61   Verification fa
16ad0 69 6c 65 64 2c 20 25 69 20 74 72 69 65 73 20 72  iled, %i tries r
16ae0 65 6d 61 69 6e 69 6e 67 22 2c 20 74 72 69 65 73  emaining", tries
16af0 5f 72 65 6d 61 69 6e 69 6e 67 29 3b 0a 0a 09 09  _remaining);....
16b00 09 69 66 20 28 74 72 69 65 73 5f 72 65 6d 61 69  .if (tries_remai
16b10 6e 69 6e 67 5f 70 29 20 7b 0a 09 09 09 09 2a 74  ning_p) {.....*t
16b20 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 5f 70  ries_remaining_p
16b30 20 3d 20 74 72 69 65 73 5f 72 65 6d 61 69 6e 69   = tries_remaini
16b40 6e 67 3b 0a 09 09 09 7d 0a 0a 09 09 09 72 65 74  ng;....}.....ret
16b50 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
16b60 45 5f 42 41 44 50 49 4e 29 3b 0a 09 09 7d 0a 0a  E_BADPIN);...}..
16b70 09 09 69 66 20 28 72 65 73 70 6f 6e 73 65 5f 63  ..if (response_c
16b80 6f 64 65 20 3d 3d 20 30 78 36 39 38 33 29 20 7b  ode == 0x6983) {
16b90 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
16ba0 5f 50 52 49 4e 54 46 28 22 50 49 4e 20 56 65 72  _PRINTF("PIN Ver
16bb0 69 66 69 63 61 74 69 6f 6e 20 66 61 69 6c 65 64  ification failed
16bc0 2c 20 64 65 76 69 63 65 20 69 73 20 6c 6f 63 6b  , device is lock
16bd0 65 64 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e  ed");.....return
16be0 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4c  (CACKEY_PCSC_E_L
16bf0 4f 43 4b 45 44 29 3b 0a 09 09 7d 0a 0a 09 09 69  OCKED);...}....i
16c00 66 20 28 72 65 73 70 6f 6e 73 65 5f 63 6f 64 65  f (response_code
16c10 20 3d 3d 20 30 78 36 64 30 30 29 20 7b 0a 09 09   == 0x6d00) {...
16c20 09 69 66 20 28 72 65 74 72 69 65 73 20 3e 20 30  .if (retries > 0
16c30 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  ) {.....CACKEY_D
16c40 45 42 55 47 5f 50 52 49 4e 54 46 28 22 47 6f 74  EBUG_PRINTF("Got
16c50 20 49 53 4f 20 37 38 31 36 20 52 65 73 70 6f 6e   ISO 7816 Respon
16c60 73 65 20 5c 22 36 44 20 30 30 5c 22 20 69 6e 20  se \"6D 00\" in 
16c70 72 65 73 70 6f 6e 73 65 20 74 6f 20 61 20 56 45  response to a VE
16c80 52 49 46 59 20 72 65 71 75 65 73 74 2e 22 29 3b  RIFY request.");
16c90 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
16ca0 47 5f 50 52 49 4e 54 46 28 22 57 65 20 64 69 64  G_PRINTF("We did
16cb0 20 6e 6f 74 20 65 78 70 65 63 74 20 74 68 69 73   not expect this
16cc0 20 62 65 63 61 75 73 65 20 69 74 20 69 73 20 6e   because it is n
16cd0 6f 74 20 6d 65 6e 74 69 6f 6e 65 64 20 69 6e 20  ot mentioned in 
16ce0 4e 49 53 54 20 53 50 20 38 30 30 2d 37 33 2d 33  NIST SP 800-73-3
16cf0 20 50 61 72 74 20 32 20 53 65 63 74 69 6f 6e 20   Part 2 Section 
16d00 33 2e 32 2e 31 20 6f 72 20 47 53 43 2d 49 53 20  3.2.1 or GSC-IS 
16d10 76 32 2e 31 22 29 3b 0a 09 09 09 09 43 41 43 4b  v2.1");.....CACK
16d20 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
16d30 22 57 65 20 61 72 65 20 67 6f 69 6e 67 20 74 6f  "We are going to
16d40 20 74 72 79 20 74 6f 20 72 65 73 65 74 20 74 68   try to reset th
16d50 65 20 63 61 72 64 20 61 6e 64 20 73 65 6c 65 63  e card and selec
16d60 74 20 74 68 65 20 61 70 70 6c 65 74 20 61 67 61  t the applet aga
16d70 69 6e 2e 22 29 3b 0a 0a 09 09 09 09 63 61 63 6b  in.");......cack
16d80 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65 73  ey_mark_slot_res
16d90 65 74 28 73 6c 6f 74 29 3b 0a 0a 09 09 09 09 63  et(slot);......c
16da0 6f 6e 6e 65 63 74 5f 72 65 74 20 3d 20 63 61 63  onnect_ret = cac
16db0 6b 65 79 5f 63 6f 6e 6e 65 63 74 5f 63 61 72 64  key_connect_card
16dc0 28 73 6c 6f 74 29 3b 0a 09 09 09 09 69 66 20 28  (slot);.....if (
16dd0 63 6f 6e 6e 65 63 74 5f 72 65 74 20 21 3d 20 43  connect_ret != C
16de0 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29  ACKEY_PCSC_S_OK)
16df0 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44   {......CACKEY_D
16e00 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61  EBUG_PRINTF("Una
16e10 62 6c 65 20 74 6f 20 72 65 63 6f 6e 6e 65 63 74  ble to reconnect
16e20 20 61 66 74 65 72 20 72 65 73 65 74 74 69 6e 67   after resetting
16e30 20 74 68 65 20 63 61 72 64 2c 20 72 65 74 75 72   the card, retur
16e40 6e 69 6e 67 20 69 6e 20 65 72 72 6f 72 2e 22 29  ning in error.")
16e50 3b 0a 0a 09 09 09 09 09 72 65 74 75 72 6e 28 63  ;.......return(c
16e60 6f 6e 6e 65 63 74 5f 72 65 74 29 3b 0a 09 09 09  onnect_ret);....
16e70 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  .}......CACKEY_D
16e80 45 42 55 47 5f 50 52 49 4e 54 46 28 22 56 65 72  EBUG_PRINTF("Ver
16e90 69 66 79 69 6e 67 20 77 65 20 73 74 69 6c 6c 20  ifying we still 
16ea0 68 61 76 65 20 61 20 74 6f 6b 65 6e 2e 22 29 3b  have a token.");
16eb0 0a 09 09 09 09 74 6f 6b 65 6e 5f 72 65 74 20 3d  .....token_ret =
16ec0 20 63 61 63 6b 65 79 5f 74 6f 6b 65 6e 5f 70 72   cackey_token_pr
16ed0 65 73 65 6e 74 28 73 6c 6f 74 29 3b 0a 09 09 09  esent(slot);....
16ee0 09 69 66 20 28 74 6f 6b 65 6e 5f 72 65 74 20 21  .if (token_ret !
16ef0 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  = CACKEY_PCSC_S_
16f00 54 4f 4b 45 4e 50 52 45 53 45 4e 54 29 20 7b 0a  TOKENPRESENT) {.
16f10 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
16f20 47 5f 50 52 49 4e 54 46 28 22 54 6f 6b 65 6e 20  G_PRINTF("Token 
16f30 6e 6f 74 20 70 72 65 73 65 6e 74 2c 20 72 65 74  not present, ret
16f40 75 72 6e 69 6e 67 20 69 6e 20 65 72 72 6f 72 2e  urning in error.
16f50 22 29 3b 0a 0a 09 09 09 09 09 72 65 74 75 72 6e  ");.......return
16f60 28 74 6f 6b 65 6e 5f 72 65 74 29 3b 0a 09 09 09  (token_ret);....
16f70 09 7d 0a 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f  .}.......CACKEY_
16f80 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54 72  DEBUG_PRINTF("Tr
16f90 79 69 6e 67 20 74 6f 20 6c 6f 67 69 6e 20 61 67  ying to login ag
16fa0 61 69 6e 22 29 3b 0a 09 09 09 09 72 65 74 75 72  ain");.....retur
16fb0 6e 28 63 61 63 6b 65 79 5f 6c 6f 67 69 6e 28 73  n(cackey_login(s
16fc0 6c 6f 74 2c 20 70 69 6e 2c 20 70 69 6e 5f 6c 65  lot, pin, pin_le
16fd0 6e 2c 20 74 72 69 65 73 5f 72 65 6d 61 69 6e 69  n, tries_remaini
16fe0 6e 67 5f 70 2c 20 72 65 74 72 69 65 73 20 2d 20  ng_p, retries - 
16ff0 31 29 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09  1));....}...}...
17000 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
17010 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a  CSC_E_GENERIC);.
17020 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
17030 47 5f 50 52 49 4e 54 46 28 22 50 49 4e 20 56 65  G_PRINTF("PIN Ve
17040 72 69 66 69 63 61 74 69 6f 6e 20 73 75 63 63 65  rification succe
17050 65 64 65 64 22 29 3b 0a 0a 09 72 65 74 75 72 6e  eded");...return
17060 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f  (CACKEY_PCSC_S_O
17070 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e  K);.}../*. * SYN
17080 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 2e 2e 2e  POSIS. *     ...
17090 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53  . *. * ARGUMENTS
170a0 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20  . *     .... *. 
170b0 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20  * RETURN VALUE. 
170c0 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20  *     .... *. * 
170d0 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 2e 2e 2e  NOTES. *     ...
170e0 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 73  . *. */.static s
170f0 73 69 7a 65 5f 74 20 63 61 63 6b 65 79 5f 70 63  size_t cackey_pc
17100 73 63 5f 69 64 65 6e 74 69 74 79 5f 74 6f 5f 6c  sc_identity_to_l
17110 61 62 65 6c 28 73 74 72 75 63 74 20 63 61 63 6b  abel(struct cack
17120 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79  ey_pcsc_identity
17130 20 2a 69 64 65 6e 74 69 74 79 2c 20 75 6e 73 69   *identity, unsi
17140 67 6e 65 64 20 63 68 61 72 20 2a 6c 61 62 65 6c  gned char *label
17150 5f 62 75 66 2c 20 75 6e 73 69 67 6e 65 64 20 6c  _buf, unsigned l
17160 6f 6e 67 20 6c 61 62 65 6c 5f 62 75 66 5f 6c 65  ong label_buf_le
17170 6e 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 6c  n) {..unsigned l
17180 6f 6e 67 20 63 65 72 74 69 66 69 63 61 74 65 5f  ong certificate_
17190 6c 65 6e 3b 0a 09 76 6f 69 64 20 2a 6c 61 62 65  len;..void *labe
171a0 6c 5f 61 73 6e 31 3b 0a 09 76 6f 69 64 20 2a 63  l_asn1;..void *c
171b0 65 72 74 69 66 69 63 61 74 65 3b 0a 09 69 6e 74  ertificate;..int
171c0 20 78 35 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a   x509_read_ret;.
171d0 0a 09 63 65 72 74 69 66 69 63 61 74 65 20 3d 20  ..certificate = 
171e0 69 64 65 6e 74 69 74 79 2d 3e 63 65 72 74 69 66  identity->certif
171f0 69 63 61 74 65 3b 0a 09 63 65 72 74 69 66 69 63  icate;..certific
17200 61 74 65 5f 6c 65 6e 20 3d 20 69 64 65 6e 74 69  ate_len = identi
17210 74 79 2d 3e 63 65 72 74 69 66 69 63 61 74 65 5f  ty->certificate_
17220 6c 65 6e 3b 0a 0a 09 69 66 20 28 63 65 72 74 69  len;...if (certi
17230 66 69 63 61 74 65 5f 6c 65 6e 20 3c 20 30 29 20  ficate_len < 0) 
17240 7b 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a  {...return(-1);.
17250 09 7d 0a 0a 09 78 35 30 39 5f 72 65 61 64 5f 72  .}...x509_read_r
17260 65 74 20 3d 20 78 35 30 39 5f 74 6f 5f 73 75 62  et = x509_to_sub
17270 6a 65 63 74 28 63 65 72 74 69 66 69 63 61 74 65  ject(certificate
17280 2c 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65  , certificate_le
17290 6e 2c 20 28 76 6f 69 64 20 2a 2a 29 20 26 6c 61  n, (void **) &la
172a0 62 65 6c 5f 61 73 6e 31 29 3b 0a 09 69 66 20 28  bel_asn1);..if (
172b0 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3c 20  x509_read_ret < 
172c0 30 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 2d 31  0) {...return(-1
172d0 29 3b 0a 09 7d 0a 0a 09 78 35 30 39 5f 72 65 61  );..}...x509_rea
172e0 64 5f 72 65 74 20 3d 20 78 35 30 39 5f 64 6e 5f  d_ret = x509_dn_
172f0 74 6f 5f 73 74 72 69 6e 67 28 6c 61 62 65 6c 5f  to_string(label_
17300 61 73 6e 31 2c 20 78 35 30 39 5f 72 65 61 64 5f  asn1, x509_read_
17310 72 65 74 2c 20 28 63 68 61 72 20 2a 29 20 6c 61  ret, (char *) la
17320 62 65 6c 5f 62 75 66 2c 20 6c 61 62 65 6c 5f 62  bel_buf, label_b
17330 75 66 5f 6c 65 6e 2c 20 22 43 4e 22 29 3b 0a 09  uf_len, "CN");..
17340 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72 65  if (x509_read_re
17350 74 20 3c 3d 20 30 29 20 7b 0a 09 09 78 35 30 39  t <= 0) {...x509
17360 5f 72 65 61 64 5f 72 65 74 20 3d 20 78 35 30 39  _read_ret = x509
17370 5f 64 6e 5f 74 6f 5f 73 74 72 69 6e 67 28 6c 61  _dn_to_string(la
17380 62 65 6c 5f 61 73 6e 31 2c 20 78 35 30 39 5f 72  bel_asn1, x509_r
17390 65 61 64 5f 72 65 74 2c 20 28 63 68 61 72 20 2a  ead_ret, (char *
173a0 29 20 6c 61 62 65 6c 5f 62 75 66 2c 20 6c 61 62  ) label_buf, lab
173b0 65 6c 5f 62 75 66 5f 6c 65 6e 2c 20 4e 55 4c 4c  el_buf_len, NULL
173c0 29 3b 0a 0a 09 09 69 66 20 28 78 35 30 39 5f 72  );....if (x509_r
173d0 65 61 64 5f 72 65 74 20 3c 3d 20 30 29 20 7b 0a  ead_ret <= 0) {.
173e0 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09  ...return(-1);..
173f0 09 7d 0a 09 7d 0a 0a 23 69 66 64 65 66 20 43 41  .}..}..#ifdef CA
17400 43 4b 45 59 5f 50 41 52 41 4e 4f 49 44 0a 23 20  CKEY_PARANOID.# 
17410 20 69 66 64 65 66 20 5f 50 4f 53 49 58 5f 53 53   ifdef _POSIX_SS
17420 49 5a 45 5f 4d 41 58 0a 09 69 66 20 28 78 35 30  IZE_MAX..if (x50
17430 39 5f 72 65 61 64 5f 72 65 74 20 3e 20 5f 50 4f  9_read_ret > _PO
17440 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58 29 20 7b  SIX_SSIZE_MAX) {
17450 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
17460 50 52 49 4e 54 46 28 22 78 35 30 39 5f 72 65 61  PRINTF("x509_rea
17470 64 5f 72 65 74 20 65 78 63 65 65 64 73 20 6d 61  d_ret exceeds ma
17480 78 69 6d 75 6d 20 76 61 6c 75 65 2c 20 72 65 74  ximum value, ret
17490 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
174a0 65 2e 20 28 6d 61 78 20 3d 20 25 6c 69 2c 20 78  e. (max = %li, x
174b0 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3d 20 25  509_read_ret = %
174c0 6c 75 29 22 2c 20 28 6c 6f 6e 67 29 20 5f 50 4f  lu)", (long) _PO
174d0 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58 2c 20 28  SIX_SSIZE_MAX, (
174e0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 78  unsigned long) x
174f0 35 30 39 5f 72 65 61 64 5f 72 65 74 29 3b 0a 0a  509_read_ret);..
17500 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d  ..return(-1);..}
17510 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69 66  .#  endif.#endif
17520 0a 0a 09 72 65 74 75 72 6e 28 78 35 30 39 5f 72  ...return(x509_r
17530 65 61 64 5f 72 65 74 29 3b 0a 7d 0a 0a 2f 2a 20  ead_ret);.}../* 
17540 52 65 74 75 72 6e 73 20 30 20 6f 6e 20 73 75 63  Returns 0 on suc
17550 63 65 73 73 20 2a 2f 0a 73 74 61 74 69 63 20 69  cess */.static i
17560 6e 74 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  nt cackey_mutex_
17570 63 72 65 61 74 65 28 76 6f 69 64 20 2a 2a 6d 75  create(void **mu
17580 74 65 78 29 20 7b 0a 09 70 74 68 72 65 61 64 5f  tex) {..pthread_
17590 6d 75 74 65 78 5f 74 20 2a 70 74 68 72 65 61 64  mutex_t *pthread
175a0 5f 6d 75 74 65 78 3b 0a 09 69 6e 74 20 70 74 68  _mutex;..int pth
175b0 72 65 61 64 5f 72 65 74 76 61 6c 3b 0a 09 43 4b  read_retval;..CK
175c0 5f 52 56 20 63 75 73 74 6f 6d 5f 72 65 74 76 61  _RV custom_retva
175d0 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  l;...CACKEY_DEBU
175e0 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
175f0 2e 22 29 3b 0a 0a 09 69 66 20 28 28 63 61 63 6b  .");...if ((cack
17600 65 79 5f 61 72 67 73 2e 66 6c 61 67 73 20 26 20  ey_args.flags & 
17610 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f  CKF_OS_LOCKING_O
17620 4b 29 20 3d 3d 20 43 4b 46 5f 4f 53 5f 4c 4f 43  K) == CKF_OS_LOC
17630 4b 49 4e 47 5f 4f 4b 29 20 7b 0a 09 09 70 74 68  KING_OK) {...pth
17640 72 65 61 64 5f 6d 75 74 65 78 20 3d 20 6d 61 6c  read_mutex = mal
17650 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70 74 68 72  loc(sizeof(*pthr
17660 65 61 64 5f 6d 75 74 65 78 29 29 3b 0a 09 09 69  ead_mutex));...i
17670 66 20 28 21 70 74 68 72 65 61 64 5f 6d 75 74 65  f (!pthread_mute
17680 78 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  x) {....CACKEY_D
17690 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 61 69  EBUG_PRINTF("Fai
176a0 6c 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  led to allocate 
176b0 6d 65 6d 6f 72 79 2e 22 29 3b 0a 0a 09 09 09 72  memory.");.....r
176c0 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 0a  eturn(-1);...}..
176d0 09 09 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c  ..pthread_retval
176e0 20 3d 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78   = pthread_mutex
176f0 5f 69 6e 69 74 28 70 74 68 72 65 61 64 5f 6d 75  _init(pthread_mu
17700 74 65 78 2c 20 4e 55 4c 4c 29 3b 0a 09 09 69 66  tex, NULL);...if
17710 20 28 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c   (pthread_retval
17720 20 21 3d 20 30 29 20 7b 0a 09 09 09 43 41 43 4b   != 0) {....CACK
17730 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
17740 22 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 69  "pthread_mutex_i
17750 6e 69 74 28 29 20 72 65 74 75 72 6e 65 64 20 65  nit() returned e
17760 72 72 6f 72 20 28 25 69 29 2e 22 2c 20 70 74 68  rror (%i).", pth
17770 72 65 61 64 5f 72 65 74 76 61 6c 29 3b 0a 0a 09  read_retval);...
17780 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09  ..return(-1);...
17790 7d 0a 0a 09 09 2a 6d 75 74 65 78 20 3d 20 70 74  }....*mutex = pt
177a0 68 72 65 61 64 5f 6d 75 74 65 78 3b 0a 09 7d 20  hread_mutex;..} 
177b0 65 6c 73 65 20 7b 0a 09 09 69 66 20 28 63 61 63  else {...if (cac
177c0 6b 65 79 5f 61 72 67 73 2e 43 72 65 61 74 65 4d  key_args.CreateM
177d0 75 74 65 78 29 20 7b 0a 09 09 09 63 75 73 74 6f  utex) {....custo
177e0 6d 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  m_retval = cacke
177f0 79 5f 61 72 67 73 2e 43 72 65 61 74 65 4d 75 74  y_args.CreateMut
17800 65 78 28 6d 75 74 65 78 29 3b 0a 0a 09 09 09 69  ex(mutex);.....i
17810 66 20 28 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c  f (custom_retval
17820 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09   != CKR_OK) {...
17830 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
17840 52 49 4e 54 46 28 22 63 61 63 6b 65 79 5f 61 72  RINTF("cackey_ar
17850 67 73 2e 43 72 65 61 74 65 4d 75 74 65 78 28 29  gs.CreateMutex()
17860 20 72 65 74 75 72 6e 65 64 20 65 72 72 6f 72 20   returned error 
17870 28 25 6c 69 29 2e 22 2c 20 28 6c 6f 6e 67 29 20  (%li).", (long) 
17880 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 29 3b 0a  custom_retval);.
17890 0a 09 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b  .....return(-1);
178a0 0a 09 09 09 7d 0a 09 09 7d 0a 09 7d 0a 0a 09 43  ....}...}..}...C
178b0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
178c0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 73 75  TF("Returning su
178d0 63 65 73 73 66 75 6c 6c 79 20 28 30 29 22 29 3b  cessfully (0)");
178e0 0a 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a 7d 0a  ...return(0);.}.
178f0 0a 2f 2a 20 52 65 74 75 72 6e 73 20 30 20 6f 6e  ./* Returns 0 on
17900 20 73 75 63 63 65 73 73 20 2a 2f 0a 73 74 61 74   success */.stat
17910 69 63 20 69 6e 74 20 63 61 63 6b 65 79 5f 6d 75  ic int cackey_mu
17920 74 65 78 5f 6c 6f 63 6b 28 76 6f 69 64 20 2a 6d  tex_lock(void *m
17930 75 74 65 78 29 20 7b 0a 09 70 74 68 72 65 61 64  utex) {..pthread
17940 5f 6d 75 74 65 78 5f 74 20 2a 70 74 68 72 65 61  _mutex_t *pthrea
17950 64 5f 6d 75 74 65 78 3b 0a 09 69 6e 74 20 70 74  d_mutex;..int pt
17960 68 72 65 61 64 5f 72 65 74 76 61 6c 3b 0a 09 43  hread_retval;..C
17970 4b 5f 52 56 20 63 75 73 74 6f 6d 5f 72 65 74 76  K_RV custom_retv
17980 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  al;...CACKEY_DEB
17990 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
179a0 64 2e 22 29 3b 0a 0a 09 69 66 20 28 28 63 61 63  d.");...if ((cac
179b0 6b 65 79 5f 61 72 67 73 2e 66 6c 61 67 73 20 26  key_args.flags &
179c0 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f   CKF_OS_LOCKING_
179d0 4f 4b 29 20 3d 3d 20 43 4b 46 5f 4f 53 5f 4c 4f  OK) == CKF_OS_LO
179e0 43 4b 49 4e 47 5f 4f 4b 29 20 7b 0a 09 09 70 74  CKING_OK) {...pt
179f0 68 72 65 61 64 5f 6d 75 74 65 78 20 3d 20 6d 75  hread_mutex = mu
17a00 74 65 78 3b 0a 0a 09 09 70 74 68 72 65 61 64 5f  tex;....pthread_
17a10 72 65 74 76 61 6c 20 3d 20 70 74 68 72 65 61 64  retval = pthread
17a20 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 70 74 68 72  _mutex_lock(pthr
17a30 65 61 64 5f 6d 75 74 65 78 29 3b 0a 09 09 69 66  ead_mutex);...if
17a40 20 28 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c   (pthread_retval
17a50 20 21 3d 20 30 29 20 7b 0a 09 09 09 43 41 43 4b   != 0) {....CACK
17a60 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
17a70 22 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 6c  "pthread_mutex_l
17a80 6f 63 6b 28 29 20 72 65 74 75 72 6e 65 64 20 65  ock() returned e
17a90 72 72 6f 72 20 28 25 69 29 2e 22 2c 20 70 74 68  rror (%i).", pth
17aa0 72 65 61 64 5f 72 65 74 76 61 6c 29 3b 0a 0a 09  read_retval);...
17ab0 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09  ..return(-1);...
17ac0 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69 66  }..} else {...if
17ad0 20 28 63 61 63 6b 65 79 5f 61 72 67 73 2e 4c 6f   (cackey_args.Lo
17ae0 63 6b 4d 75 74 65 78 29 20 7b 0a 09 09 09 63 75  ckMutex) {....cu
17af0 73 74 6f 6d 5f 72 65 74 76 61 6c 20 3d 20 63 61  stom_retval = ca
17b00 63 6b 65 79 5f 61 72 67 73 2e 4c 6f 63 6b 4d 75  ckey_args.LockMu
17b10 74 65 78 28 6d 75 74 65 78 29 3b 0a 0a 09 09 09  tex(mutex);.....
17b20 69 66 20 28 63 75 73 74 6f 6d 5f 72 65 74 76 61  if (custom_retva
17b30 6c 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09  l != CKR_OK) {..
17b40 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
17b50 50 52 49 4e 54 46 28 22 63 61 63 6b 65 79 5f 61  PRINTF("cackey_a
17b60 72 67 73 2e 4c 6f 63 6b 4d 75 74 65 78 28 29 20  rgs.LockMutex() 
17b70 72 65 74 75 72 6e 65 64 20 65 72 72 6f 72 20 28  returned error (
17b80 25 6c 69 29 2e 22 2c 20 28 6c 6f 6e 67 29 20 63  %li).", (long) c
17b90 75 73 74 6f 6d 5f 72 65 74 76 61 6c 29 3b 0a 0a  ustom_retval);..
17ba0 09 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a  ....return(-1);.
17bb0 09 09 09 7d 0a 09 09 7d 0a 09 7d 0a 0a 09 43 41  ...}...}..}...CA
17bc0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
17bd0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 73 75 63  F("Returning suc
17be0 65 73 73 66 75 6c 6c 79 20 28 30 29 22 29 3b 0a  essfully (0)");.
17bf0 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a  ..return(0);.}..
17c00 2f 2a 20 52 65 74 75 72 6e 73 20 30 20 6f 6e 20  /* Returns 0 on 
17c10 73 75 63 63 65 73 73 20 2a 2f 0a 73 74 61 74 69  success */.stati
17c20 63 20 69 6e 74 20 63 61 63 6b 65 79 5f 6d 75 74  c int cackey_mut
17c30 65 78 5f 75 6e 6c 6f 63 6b 28 76 6f 69 64 20 2a  ex_unlock(void *
17c40 6d 75 74 65 78 29 20 7b 0a 09 70 74 68 72 65 61  mutex) {..pthrea
17c50 64 5f 6d 75 74 65 78 5f 74 20 2a 70 74 68 72 65  d_mutex_t *pthre
17c60 61 64 5f 6d 75 74 65 78 3b 0a 09 69 6e 74 20 70  ad_mutex;..int p
17c70 74 68 72 65 61 64 5f 72 65 74 76 61 6c 3b 0a 09  thread_retval;..
17c80 43 4b 5f 52 56 20 63 75 73 74 6f 6d 5f 72 65 74  CK_RV custom_ret
17c90 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  val;...CACKEY_DE
17ca0 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
17cb0 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 28 63 61  ed.");...if ((ca
17cc0 63 6b 65 79 5f 61 72 67 73 2e 66 6c 61 67 73 20  ckey_args.flags 
17cd0 26 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47  & CKF_OS_LOCKING
17ce0 5f 4f 4b 29 20 3d 3d 20 43 4b 46 5f 4f 53 5f 4c  _OK) == CKF_OS_L
17cf0 4f 43 4b 49 4e 47 5f 4f 4b 29 20 7b 0a 09 09 70  OCKING_OK) {...p
17d00 74 68 72 65 61 64 5f 6d 75 74 65 78 20 3d 20 6d  thread_mutex = m
17d10 75 74 65 78 3b 0a 0a 09 09 70 74 68 72 65 61 64  utex;....pthread
17d20 5f 72 65 74 76 61 6c 20 3d 20 70 74 68 72 65 61  _retval = pthrea
17d30 64 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 70  d_mutex_unlock(p
17d40 74 68 72 65 61 64 5f 6d 75 74 65 78 29 3b 0a 09  thread_mutex);..
17d50 09 69 66 20 28 70 74 68 72 65 61 64 5f 72 65 74  .if (pthread_ret
17d60 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 09 43  val != 0) {....C
17d70 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
17d80 54 46 28 22 70 74 68 72 65 61 64 5f 6d 75 74 65  TF("pthread_mute
17d90 78 5f 75 6e 6c 6f 63 6b 28 29 20 72 65 74 75 72  x_unlock() retur
17da0 6e 65 64 20 65 72 72 6f 72 20 28 25 69 29 2e 22  ned error (%i)."
17db0 2c 20 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c  , pthread_retval
17dc0 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 2d 31  );.....return(-1
17dd0 29 3b 0a 09 09 7d 0a 09 7d 20 65 6c 73 65 20 7b  );...}..} else {
17de0 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 61 72  ...if (cackey_ar
17df0 67 73 2e 55 6e 6c 6f 63 6b 4d 75 74 65 78 29 20  gs.UnlockMutex) 
17e00 7b 0a 09 09 09 63 75 73 74 6f 6d 5f 72 65 74 76  {....custom_retv
17e10 61 6c 20 3d 20 63 61 63 6b 65 79 5f 61 72 67 73  al = cackey_args
17e20 2e 55 6e 6c 6f 63 6b 4d 75 74 65 78 28 6d 75 74  .UnlockMutex(mut
17e30 65 78 29 3b 0a 0a 09 09 09 69 66 20 28 63 75 73  ex);.....if (cus
17e40 74 6f 6d 5f 72 65 74 76 61 6c 20 21 3d 20 43 4b  tom_retval != CK
17e50 52 5f 4f 4b 29 20 7b 0a 09 09 09 09 43 41 43 4b  R_OK) {.....CACK
17e60 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
17e70 22 63 61 63 6b 65 79 5f 61 72 67 73 2e 55 6e 6c  "cackey_args.Unl
17e80 6f 63 6b 4d 75 74 65 78 28 29 20 72 65 74 75 72  ockMutex() retur
17e90 6e 65 64 20 65 72 72 6f 72 20 28 25 6c 69 29 2e  ned error (%li).
17ea0 22 2c 20 28 6c 6f 6e 67 29 20 63 75 73 74 6f 6d  ", (long) custom
17eb0 5f 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09 09 72  _retval);......r
17ec0 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 09 7d 0a  eturn(-1);....}.
17ed0 09 09 7d 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  ..}..}...CACKEY_
17ee0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
17ef0 74 75 72 6e 69 6e 67 20 73 75 63 65 73 73 66 75  turning sucessfu
17f00 6c 6c 79 20 28 30 29 22 29 3b 0a 0a 09 72 65 74  lly (0)");...ret
17f10 75 72 6e 28 30 29 3b 0a 7d 0a 0a 73 74 61 74 69  urn(0);.}..stati
17f20 63 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50  c CK_ATTRIBUTE_P
17f30 54 52 20 63 61 63 6b 65 79 5f 67 65 74 5f 61 74  TR cackey_get_at
17f40 74 72 69 62 75 74 65 73 28 43 4b 5f 4f 42 4a 45  tributes(CK_OBJE
17f50 43 54 5f 43 4c 41 53 53 20 6f 62 6a 65 63 74 63  CT_CLASS objectc
17f60 6c 61 73 73 2c 20 73 74 72 75 63 74 20 63 61 63  lass, struct cac
17f70 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74  key_pcsc_identit
17f80 79 20 2a 69 64 65 6e 74 69 74 79 2c 20 75 6e 73  y *identity, uns
17f90 69 67 6e 65 64 20 6c 6f 6e 67 20 69 64 65 6e 74  igned long ident
17fa0 69 74 79 5f 6e 75 6d 2c 20 43 4b 5f 55 4c 4f 4e  ity_num, CK_ULON
17fb0 47 5f 50 54 52 20 70 75 6c 43 6f 75 6e 74 29 20  G_PTR pulCount) 
17fc0 7b 0a 09 73 74 61 74 69 63 20 43 4b 5f 42 42 4f  {..static CK_BBO
17fd0 4f 4c 20 63 6b 5f 74 72 75 65 20 3d 20 31 3b 0a  OL ck_true = 1;.
17fe0 09 73 74 61 74 69 63 20 43 4b 5f 42 42 4f 4f 4c  .static CK_BBOOL
17ff0 20 63 6b 5f 66 61 6c 73 65 20 3d 20 30 3b 0a 09   ck_false = 0;..
18000 73 74 61 74 69 63 20 43 4b 5f 54 52 55 53 54 20  static CK_TRUST 
18010 63 6b 5f 74 72 75 73 74 65 64 20 3d 20 43 4b 5f  ck_trusted = CK_
18020 54 52 55 53 54 45 44 5f 44 45 4c 45 47 41 54 4f  TRUSTED_DELEGATO
18030 52 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 6e 75 6d  R;..CK_ULONG num
18040 61 74 74 72 73 20 3d 20 30 2c 20 72 65 74 76 61  attrs = 0, retva
18050 6c 5f 63 6f 75 6e 74 3b 0a 09 43 4b 5f 41 54 54  l_count;..CK_ATT
18060 52 49 42 55 54 45 5f 54 59 50 45 20 63 75 72 72  RIBUTE_TYPE curr
18070 5f 61 74 74 72 5f 74 79 70 65 3b 0a 09 43 4b 5f  _attr_type;..CK_
18080 41 54 54 52 49 42 55 54 45 20 63 75 72 72 5f 61  ATTRIBUTE curr_a
18090 74 74 72 2c 20 2a 72 65 74 76 61 6c 3b 0a 09 43  ttr, *retval;..C
180a0 4b 5f 56 4f 49 44 5f 50 54 52 20 70 56 61 6c 75  K_VOID_PTR pValu
180b0 65 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 75 6c 56  e;..CK_ULONG ulV
180c0 61 6c 75 65 4c 65 6e 3b 0a 09 43 4b 5f 4f 42 4a  alueLen;..CK_OBJ
180d0 45 43 54 5f 43 4c 41 53 53 20 63 6b 5f 6f 62 6a  ECT_CLASS ck_obj
180e0 65 63 74 5f 63 6c 61 73 73 3b 0a 09 43 4b 5f 43  ect_class;..CK_C
180f0 45 52 54 49 46 49 43 41 54 45 5f 54 59 50 45 20  ERTIFICATE_TYPE 
18100 63 6b 5f 63 65 72 74 69 66 69 63 61 74 65 5f 74  ck_certificate_t
18110 79 70 65 3b 0a 09 43 4b 5f 4b 45 59 5f 54 59 50  ype;..CK_KEY_TYP
18120 45 20 63 6b 5f 6b 65 79 5f 74 79 70 65 3b 0a 09  E ck_key_type;..
18130 43 4b 5f 55 54 46 38 43 48 41 52 20 75 63 54 6d  CK_UTF8CHAR ucTm
18140 70 42 75 66 5b 31 30 32 34 5d 3b 0a 09 53 48 41  pBuf[1024];..SHA
18150 31 43 6f 6e 74 65 78 74 20 73 68 61 31 5f 63 74  1Context sha1_ct
18160 78 3b 0a 09 4d 44 35 5f 43 54 58 20 6d 64 35 5f  x;..MD5_CTX md5_
18170 63 74 78 3b 0a 09 75 69 6e 74 38 5f 74 20 73 68  ctx;..uint8_t sh
18180 61 31 5f 68 61 73 68 5b 53 48 41 31 48 61 73 68  a1_hash[SHA1Hash
18190 53 69 7a 65 5d 3b 0a 09 75 69 6e 74 38 5f 74 20  Size];..uint8_t 
181a0 6d 64 35 5f 68 61 73 68 5b 4d 44 35 48 61 73 68  md5_hash[MD5Hash
181b0 53 69 7a 65 5d 3b 0a 09 75 6e 73 69 67 6e 65 64  Size];..unsigned
181c0 20 63 68 61 72 20 2a 63 65 72 74 69 66 69 63 61   char *certifica
181d0 74 65 3b 0a 09 73 73 69 7a 65 5f 74 20 63 65 72  te;..ssize_t cer
181e0 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3d 20 2d  tificate_len = -
181f0 31 2c 20 78 35 30 39 5f 72 65 61 64 5f 72 65 74  1, x509_read_ret
18200 3b 0a 09 69 6e 74 20 70 56 61 6c 75 65 5f 66 72  ;..int pValue_fr
18210 65 65 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ee;...CACKEY_DEB
18220 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
18230 64 20 28 6f 62 6a 65 63 74 43 6c 61 73 73 20 3d  d (objectClass =
18240 20 25 6c 75 2c 20 69 64 65 6e 74 69 74 79 5f 6e   %lu, identity_n
18250 75 6d 20 3d 20 25 6c 75 29 2e 22 2c 20 28 75 6e  um = %lu).", (un
18260 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 6f 62 6a  signed long) obj
18270 65 63 74 63 6c 61 73 73 2c 20 69 64 65 6e 74 69  ectclass, identi
18280 74 79 5f 6e 75 6d 29 3b 0a 0a 09 2a 70 75 6c 43  ty_num);...*pulC
18290 6f 75 6e 74 20 3d 20 30 3b 0a 0a 09 69 66 20 28  ount = 0;...if (
182a0 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43  objectclass != C
182b0 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 45 20 26  KO_CERTIFICATE &
182c0 26 20 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d  & objectclass !=
182d0 20 43 4b 4f 5f 50 55 42 4c 49 43 5f 4b 45 59 20   CKO_PUBLIC_KEY 
182e0 26 26 20 6f 62 6a 65 63 74 63 6c 61 73 73 20 21  && objectclass !
182f0 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b 45  = CKO_PRIVATE_KE
18300 59 20 26 26 20 6f 62 6a 65 63 74 63 6c 61 73 73  Y && objectclass
18310 20 21 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45   != CKO_NETSCAPE
18320 5f 54 52 55 53 54 29 20 7b 0a 09 09 43 41 43 4b  _TRUST) {...CACK
18330 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
18340 22 52 65 74 75 72 6e 69 6e 67 20 30 20 6f 62 6a  "Returning 0 obj
18350 65 63 74 73 20 28 4e 55 4c 4c 29 2c 20 69 6e 76  ects (NULL), inv
18360 61 6c 69 64 20 6f 62 6a 65 63 74 20 63 6c 61 73  alid object clas
18370 73 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e  s");....return(N
18380 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 47 65  ULL);..}.../* Ge
18390 74 20 43 65 72 74 20 2a 2f 0a 09 69 66 20 28 69  t Cert */..if (i
183a0 64 65 6e 74 69 74 79 20 3d 3d 20 4e 55 4c 4c 29  dentity == NULL)
183b0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
183c0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
183d0 69 6e 67 20 30 20 6f 62 6a 65 63 74 73 20 28 4e  ing 0 objects (N
183e0 55 4c 4c 29 2c 20 69 6e 76 61 6c 69 64 20 69 64  ULL), invalid id
183f0 65 6e 74 69 79 20 70 72 6f 76 69 64 65 64 22 29  entiy provided")
18400 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c  ;....return(NULL
18410 29 3b 0a 09 7d 0a 0a 09 63 65 72 74 69 66 69 63  );..}...certific
18420 61 74 65 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e  ate = identity->
18430 63 65 72 74 69 66 69 63 61 74 65 3b 0a 09 63 65  certificate;..ce
18440 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3d 20  rtificate_len = 
18450 69 64 65 6e 74 69 74 79 2d 3e 63 65 72 74 69 66  identity->certif
18460 69 63 61 74 65 5f 6c 65 6e 3b 0a 0a 09 69 66 20  icate_len;...if 
18470 28 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e  (certificate_len
18480 20 3d 3d 20 2d 31 20 7c 7c 20 63 65 72 74 69 66   == -1 || certif
18490 69 63 61 74 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b  icate == NULL) {
184a0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
184b0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
184c0 67 20 30 20 6f 62 6a 65 63 74 73 20 28 4e 55 4c  g 0 objects (NUL
184d0 4c 29 2c 20 74 68 69 73 20 69 64 65 6e 74 69 74  L), this identit
184e0 79 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20  y does not have 
184f0 61 6e 20 58 2e 35 30 39 20 63 65 72 74 69 66 69  an X.509 certifi
18500 63 61 74 65 20 61 73 73 6f 63 69 61 74 65 64 20  cate associated 
18510 77 69 74 68 20 69 74 20 61 6e 64 20 77 69 6c 6c  with it and will
18520 20 6e 6f 74 20 77 6f 72 6b 22 29 3b 0a 0a 09 09   not work");....
18530 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d  return(NULL);..}
18540 0a 0a 09 2f 2a 20 56 65 72 69 66 79 20 74 68 61  .../* Verify tha
18550 74 20 63 65 72 74 69 66 69 63 61 74 65 20 69 73  t certificate is
18560 20 41 53 4e 2e 31 20 65 6e 63 6f 64 65 64 20 58   ASN.1 encoded X
18570 2e 35 30 39 20 63 65 72 74 69 66 69 63 61 74 65  .509 certificate
18580 20 2a 2f 0a 09 69 66 20 28 78 35 30 39 5f 74 6f   */..if (x509_to
18590 5f 73 65 72 69 61 6c 28 63 65 72 74 69 66 69 63  _serial(certific
185a0 61 74 65 2c 20 63 65 72 74 69 66 69 63 61 74 65  ate, certificate
185b0 5f 6c 65 6e 2c 20 4e 55 4c 4c 29 20 3c 20 30 29  _len, NULL) < 0)
185c0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
185d0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
185e0 69 6e 67 20 30 20 6f 62 6a 65 63 74 73 20 28 4e  ing 0 objects (N
185f0 55 4c 4c 29 2c 20 74 68 65 20 58 2e 35 30 39 20  ULL), the X.509 
18600 63 65 72 74 69 66 69 63 61 74 65 20 61 73 73 6f  certificate asso
18610 63 69 61 74 65 64 20 77 69 74 68 20 74 68 69 73  ciated with this
18620 20 69 64 65 6e 74 69 74 79 20 69 73 20 6e 6f 74   identity is not
18630 20 76 61 6c 69 64 22 29 3b 0a 0a 09 09 72 65 74   valid");....ret
18640 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09  urn(NULL);..}...
18650 72 65 74 76 61 6c 5f 63 6f 75 6e 74 20 3d 20 36  retval_count = 6
18660 34 3b 0a 09 72 65 74 76 61 6c 20 3d 20 6d 61 6c  4;..retval = mal
18670 6c 6f 63 28 72 65 74 76 61 6c 5f 63 6f 75 6e 74  loc(retval_count
18680 20 2a 20 73 69 7a 65 6f 66 28 2a 72 65 74 76 61   * sizeof(*retva
18690 6c 29 29 3b 0a 0a 09 66 6f 72 20 28 63 75 72 72  l));...for (curr
186a0 5f 61 74 74 72 5f 74 79 70 65 20 3d 20 30 3b 20  _attr_type = 0; 
186b0 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 20 3c  curr_attr_type <
186c0 20 30 78 63 65 35 33 36 33 62 66 3b 20 63 75 72   0xce5363bf; cur
186d0 72 5f 61 74 74 72 5f 74 79 70 65 2b 2b 29 20 7b  r_attr_type++) {
186e0 0a 09 09 69 66 20 28 63 75 72 72 5f 61 74 74 72  ...if (curr_attr
186f0 5f 74 79 70 65 20 3d 3d 20 30 78 38 30 30 29 20  _type == 0x800) 
18700 7b 0a 09 09 09 63 75 72 72 5f 61 74 74 72 5f 74  {....curr_attr_t
18710 79 70 65 20 3d 20 30 78 63 65 35 33 36 33 30 30  ype = 0xce536300
18720 3b 0a 09 09 7d 0a 0a 09 09 70 56 61 6c 75 65 5f  ;...}....pValue_
18730 66 72 65 65 20 3d 20 30 3b 0a 09 09 70 56 61 6c  free = 0;...pVal
18740 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 75 6c 56  ue = NULL;...ulV
18750 61 6c 75 65 4c 65 6e 20 3d 20 28 43 4b 5f 4c 4f  alueLen = (CK_LO
18760 4e 47 29 20 2d 31 3b 0a 0a 09 09 73 77 69 74 63  NG) -1;....switc
18770 68 20 28 63 75 72 72 5f 61 74 74 72 5f 74 79 70  h (curr_attr_typ
18780 65 29 20 7b 0a 09 09 09 63 61 73 65 20 43 4b 41  e) {....case CKA
18790 5f 43 4c 41 53 53 3a 0a 09 09 09 09 43 41 43 4b  _CLASS:.....CACK
187a0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
187b0 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72  "Requesting attr
187c0 69 62 75 74 65 20 43 4b 41 5f 43 4c 41 53 53 20  ibute CKA_CLASS 
187d0 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20  (0x%08lx) ...", 
187e0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
187f0 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b  curr_attr_type);
18800 0a 0a 09 09 09 09 63 6b 5f 6f 62 6a 65 63 74 5f  ......ck_object_
18810 63 6c 61 73 73 20 3d 20 6f 62 6a 65 63 74 63 6c  class = objectcl
18820 61 73 73 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65  ass;......pValue
18830 20 3d 20 26 63 6b 5f 6f 62 6a 65 63 74 5f 63 6c   = &ck_object_cl
18840 61 73 73 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65  ass;.....ulValue
18850 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f  Len = sizeof(ck_
18860 6f 62 6a 65 63 74 5f 63 6c 61 73 73 29 3b 0a 0a  object_class);..
18870 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
18880 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65  _PRINTF(" ... re
18890 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f  turning %lu (%p/
188a0 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64  %lu)", (unsigned
188b0 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 4f 42 4a   long) *((CK_OBJ
188c0 45 43 54 5f 43 4c 41 53 53 20 2a 29 20 70 56 61  ECT_CLASS *) pVa
188d0 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75  lue), pValue, (u
188e0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c  nsigned long) ul
188f0 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09  ValueLen);......
18900 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43  break;....case C
18910 4b 41 5f 54 4f 4b 45 4e 3a 0a 09 09 09 09 43 41  KA_TOKEN:.....CA
18920 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
18930 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74  F("Requesting at
18940 74 72 69 62 75 74 65 20 43 4b 41 5f 54 4f 4b 45  tribute CKA_TOKE
18950 4e 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22  N (0x%08lx) ..."
18960 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
18970 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65  ) curr_attr_type
18980 29 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d  );......pValue =
18990 20 26 63 6b 5f 74 72 75 65 3b 0a 09 09 09 09 75   &ck_true;.....u
189a0 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65  lValueLen = size
189b0 6f 66 28 63 6b 5f 74 72 75 65 29 3b 0a 0a 09 09  of(ck_true);....
189c0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
189d0 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75  RINTF(" ... retu
189e0 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c  rning %lu (%p/%l
189f0 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  u)", (unsigned l
18a00 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c  ong) *((CK_BBOOL
18a10 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61   *) pValue), pVa
18a20 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  lue, (unsigned l
18a30 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29  ong) ulValueLen)
18a40 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  ;......break;...
18a50 09 63 61 73 65 20 43 4b 41 5f 50 52 49 56 41 54  .case CKA_PRIVAT
18a60 45 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  E:.....CACKEY_DE
18a70 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75  BUG_PRINTF("Requ
18a80 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65  esting attribute
18a90 20 43 4b 41 5f 50 52 49 56 41 54 45 20 28 30 78   CKA_PRIVATE (0x
18aa0 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e  %08lx) ...", (un
18ab0 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72  signed long) cur
18ac0 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09  r_attr_type);...
18ad0 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61  ...if (objectcla
18ae0 73 73 20 21 3d 20 43 4b 4f 5f 4e 45 54 53 43 41  ss != CKO_NETSCA
18af0 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 09  PE_TRUST) {.....
18b00 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
18b10 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e  INTF(" ... but n
18b20 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65  ot getting it be
18b30 63 61 75 73 65 20 77 65 20 61 72 65 20 6e 6f 74  cause we are not
18b40 20 61 20 4e 65 74 73 63 61 70 65 20 74 72 75 73   a Netscape trus
18b50 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09  t object");.....
18b60 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a  ..break;.....}..
18b70 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b  ....pValue = &ck
18b80 5f 66 61 6c 73 65 3b 0a 09 09 09 09 75 6c 56 61  _false;.....ulVa
18b90 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28  lueLen = sizeof(
18ba0 63 6b 5f 66 61 6c 73 65 29 3b 0a 0a 09 09 09 09  ck_false);......
18bb0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
18bc0 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e  NTF(" ... return
18bd0 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29  ing %lu (%p/%lu)
18be0 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
18bf0 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a  g) *((CK_BBOOL *
18c00 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75  ) pValue), pValu
18c10 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  e, (unsigned lon
18c20 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a  g) ulValueLen);.
18c30 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
18c40 61 73 65 20 43 4b 41 5f 54 52 55 53 54 45 44 3a  ase CKA_TRUSTED:
18c50 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
18c60 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73  G_PRINTF("Reques
18c70 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43  ting attribute C
18c80 4b 41 5f 54 52 55 53 54 45 44 20 28 30 78 25 30  KA_TRUSTED (0x%0
18c90 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69  8lx) ...", (unsi
18ca0 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f  gned long) curr_
18cb0 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09  attr_type);.....
18cc0 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73  .if (objectclass
18cd0 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45   == CKO_NETSCAPE
18ce0 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 09 09 43  _TRUST) {......C
18cf0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
18d00 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74  TF(" ... but not
18d10 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 61   getting it beca
18d20 75 73 65 20 77 65 20 61 72 65 20 61 20 4e 65 74  use we are a Net
18d30 73 63 61 70 65 20 74 72 75 73 74 20 6f 62 6a 65  scape trust obje
18d40 63 74 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61  ct");.......brea
18d50 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 70 56  k;.....}......pV
18d60 61 6c 75 65 20 3d 20 26 63 6b 5f 74 72 75 65 3b  alue = &ck_true;
18d70 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20  .....ulValueLen 
18d80 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 74 72 75 65  = sizeof(ck_true
18d90 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  );......CACKEY_D
18da0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
18db0 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20  . returning %lu 
18dc0 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69  (%p/%lu)", (unsi
18dd0 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b  gned long) *((CK
18de0 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65  _BBOOL *) pValue
18df0 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69  ), pValue, (unsi
18e00 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c  gned long) ulVal
18e10 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65  ueLen);......bre
18e20 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f  ak;....case CKA_
18e30 4d 4f 44 49 46 49 41 42 4c 45 3a 0a 09 09 09 09  MODIFIABLE:.....
18e40 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
18e50 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20  NTF("Requesting 
18e60 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 4d 4f  attribute CKA_MO
18e70 44 49 46 49 41 42 4c 45 20 28 30 78 25 30 38 6c  DIFIABLE (0x%08l
18e80 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e  x) ...", (unsign
18e90 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74  ed long) curr_at
18ea0 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 70  tr_type);......p
18eb0 56 61 6c 75 65 20 3d 20 26 63 6b 5f 66 61 6c 73  Value = &ck_fals
18ec0 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65  e;.....ulValueLe
18ed0 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 66 61  n = sizeof(ck_fa
18ee0 6c 73 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45  lse);......CACKE
18ef0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
18f00 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25   ... returning %
18f10 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75  lu (%p/%lu)", (u
18f20 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28  nsigned long) *(
18f30 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61  (CK_BBOOL *) pVa
18f40 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75  lue), pValue, (u
18f50 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c  nsigned long) ul
18f60 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09  ValueLen);......
18f70 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43  break;....case C
18f80 4b 41 5f 4c 41 42 45 4c 3a 0a 09 09 09 09 43 41  KA_LABEL:.....CA
18f90 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
18fa0 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74  F("Requesting at
18fb0 74 72 69 62 75 74 65 20 43 4b 41 5f 4c 41 42 45  tribute CKA_LABE
18fc0 4c 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22  L (0x%08lx) ..."
18fd0 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
18fe0 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65  ) curr_attr_type
18ff0 29 3b 0a 0a 09 09 09 09 69 66 20 28 69 64 65 6e  );......if (iden
19000 74 69 74 79 2d 3e 69 64 5f 74 79 70 65 20 3d 3d  tity->id_type ==
19010 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f   CACKEY_ID_TYPE_
19020 50 49 56 29 20 7b 0a 09 09 09 09 09 70 56 61 6c  PIV) {......pVal
19030 75 65 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e 63  ue = identity->c
19040 61 72 64 2e 70 69 76 2e 6c 61 62 65 6c 3b 0a 09  ard.piv.label;..
19050 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ....ulValueLen =
19060 20 73 74 72 6c 65 6e 28 70 56 61 6c 75 65 29 3b   strlen(pValue);
19070 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  .....} else {...
19080 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  ...ulValueLen = 
19090 73 6e 70 72 69 6e 74 66 28 28 63 68 61 72 20 2a  snprintf((char *
190a0 29 20 75 63 54 6d 70 42 75 66 2c 20 73 69 7a 65  ) ucTmpBuf, size
190b0 6f 66 28 75 63 54 6d 70 42 75 66 29 2c 20 22 49  of(ucTmpBuf), "I
190c0 64 65 6e 74 69 74 79 20 23 25 6c 75 22 2c 20 28  dentity #%lu", (
190d0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 69  unsigned long) i
190e0 64 65 6e 74 69 74 79 5f 6e 75 6d 29 3b 0a 09 09  dentity_num);...
190f0 09 09 09 70 56 61 6c 75 65 20 3d 20 75 63 54 6d  ...pValue = ucTm
19100 70 42 75 66 3b 0a 0a 09 09 09 09 09 69 66 20 28  pBuf;.......if (
19110 75 6c 56 61 6c 75 65 4c 65 6e 20 3e 3d 20 73 69  ulValueLen >= si
19120 7a 65 6f 66 28 75 63 54 6d 70 42 75 66 29 29 20  zeof(ucTmpBuf)) 
19130 7b 0a 09 09 09 09 09 09 75 6c 56 61 6c 75 65 4c  {.......ulValueL
19140 65 6e 20 3d 20 30 3b 0a 09 09 09 09 09 09 70 56  en = 0;.......pV
19150 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09  alue = NULL;....
19160 09 09 7d 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43  ..}.....}......C
19170 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
19180 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69  TF(" ... returni
19190 6e 67 20 28 25 70 2f 25 6c 75 29 22 2c 20 70 56  ng (%p/%lu)", pV
191a0 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20  alue, (unsigned 
191b0 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e  long) ulValueLen
191c0 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  );......break;..
191d0 09 09 63 61 73 65 20 43 4b 41 5f 56 41 4c 55 45  ..case CKA_VALUE
191e0 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  :.....CACKEY_DEB
191f0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65  UG_PRINTF("Reque
19200 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20  sting attribute 
19210 43 4b 41 5f 56 41 4c 55 45 20 28 30 78 25 30 38  CKA_VALUE (0x%08
19220 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67  lx) ...", (unsig
19230 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61  ned long) curr_a
19240 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09  ttr_type);......
19250 73 77 69 74 63 68 20 28 6f 62 6a 65 63 74 63 6c  switch (objectcl
19260 61 73 73 29 20 7b 0a 09 09 09 09 09 63 61 73 65  ass) {......case
19270 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b 45 59   CKO_PRIVATE_KEY
19280 3a 0a 09 09 09 09 09 09 43 41 43 4b 45 59 5f 44  :.......CACKEY_D
19290 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
192a0 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e  . but not gettin
192b0 67 20 69 74 20 62 65 63 61 75 73 65 20 77 65 20  g it because we 
192c0 61 72 65 20 61 20 70 72 69 76 61 74 65 20 6b 65  are a private ke
192d0 79 2e 22 29 3b 0a 0a 09 09 09 09 09 09 62 72 65  y.");........bre
192e0 61 6b 3b 0a 09 09 09 09 09 63 61 73 65 20 43 4b  ak;......case CK
192f0 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54  O_NETSCAPE_TRUST
19300 3a 0a 09 09 09 09 09 09 43 41 43 4b 45 59 5f 44  :.......CACKEY_D
19310 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
19320 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e  . but not gettin
19330 67 20 69 74 20 62 65 63 61 75 73 65 20 77 65 20  g it because we 
19340 61 72 65 20 61 20 4e 65 74 73 63 61 70 65 20 74  are a Netscape t
19350 72 75 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a  rust object");..
19360 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
19370 09 09 63 61 73 65 20 43 4b 4f 5f 50 55 42 4c 49  ..case CKO_PUBLI
19380 43 5f 4b 45 59 3a 0a 09 09 09 09 09 09 69 66 20  C_KEY:.......if 
19390 28 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e  (certificate_len
193a0 20 3e 3d 20 30 29 20 7b 0a 09 09 09 09 09 09 09   >= 0) {........
193b0 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3d 20  x509_read_ret = 
193c0 78 35 30 39 5f 74 6f 5f 70 75 62 6b 65 79 28 63  x509_to_pubkey(c
193d0 65 72 74 69 66 69 63 61 74 65 2c 20 63 65 72 74  ertificate, cert
193e0 69 66 69 63 61 74 65 5f 6c 65 6e 2c 20 26 70 56  ificate_len, &pV
193f0 61 6c 75 65 29 3b 0a 09 09 09 09 09 09 09 69 66  alue);........if
19400 20 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20   (x509_read_ret 
19410 3c 20 30 29 20 7b 20 0a 09 09 09 09 09 09 09 09  < 0) { .........
19420 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09  pValue = NULL;..
19430 09 09 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09  ......} else {..
19440 09 09 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65  .......ulValueLe
19450 6e 20 3d 20 78 35 30 39 5f 72 65 61 64 5f 72 65  n = x509_read_re
19460 74 3b 0a 09 09 09 09 09 09 09 7d 0a 09 09 09 09  t;........}.....
19470 09 09 7d 0a 0a 09 09 09 09 09 09 62 72 65 61 6b  ..}........break
19480 3b 0a 09 09 09 09 09 63 61 73 65 20 43 4b 4f 5f  ;......case CKO_
19490 43 45 52 54 49 46 49 43 41 54 45 3a 0a 09 09 09  CERTIFICATE:....
194a0 09 09 09 70 56 61 6c 75 65 20 3d 20 63 65 72 74  ...pValue = cert
194b0 69 66 69 63 61 74 65 3b 0a 09 09 09 09 09 09 75  ificate;.......u
194c0 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 63 65 72 74  lValueLen = cert
194d0 69 66 69 63 61 74 65 5f 6c 65 6e 3b 0a 0a 09 09  ificate_len;....
194e0 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d  ....break;.....}
194f0 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
19500 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
19510 72 65 74 75 72 6e 69 6e 67 20 25 70 2f 25 6c 75  returning %p/%lu
19520 22 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69  ", pValue, (unsi
19530 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c  gned long) ulVal
19540 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65  ueLen);......bre
19550 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f  ak;....case CKA_
19560 49 53 53 55 45 52 3a 0a 09 09 09 09 43 41 43 4b  ISSUER:.....CACK
19570 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
19580 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72  "Requesting attr
19590 69 62 75 74 65 20 43 4b 41 5f 49 53 53 55 45 52  ibute CKA_ISSUER
195a0 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c   (0x%08lx) ...",
195b0 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
195c0 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29   curr_attr_type)
195d0 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63  ;......if (objec
195e0 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 43 45  tclass != CKO_CE
195f0 52 54 49 46 49 43 41 54 45 20 26 26 20 6f 62 6a  RTIFICATE && obj
19600 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f  ectclass != CKO_
19610 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54 29 20  NETSCAPE_TRUST) 
19620 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45  {......CACKEY_DE
19630 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
19640 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67   but not getting
19650 20 69 74 20 62 65 63 61 75 73 65 20 77 65 20 61   it because we a
19660 72 65 20 6e 6f 74 20 61 20 63 65 72 74 69 66 69  re not a certifi
19670 63 61 74 65 20 6f 72 20 4e 65 74 73 63 61 70 65  cate or Netscape
19680 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29 3b   trust object");
19690 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .......break;...
196a0 09 09 7d 0a 0a 09 09 09 09 69 66 20 28 63 65 72  ..}......if (cer
196b0 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3e 3d 20  tificate_len >= 
196c0 30 29 20 7b 0a 09 09 09 09 09 78 35 30 39 5f 72  0) {......x509_r
196d0 65 61 64 5f 72 65 74 20 3d 20 78 35 30 39 5f 74  ead_ret = x509_t
196e0 6f 5f 69 73 73 75 65 72 28 63 65 72 74 69 66 69  o_issuer(certifi
196f0 63 61 74 65 2c 20 63 65 72 74 69 66 69 63 61 74  cate, certificat
19700 65 5f 6c 65 6e 2c 20 26 70 56 61 6c 75 65 29 3b  e_len, &pValue);
19710 0a 09 09 09 09 09 69 66 20 28 78 35 30 39 5f 72  ......if (x509_r
19720 65 61 64 5f 72 65 74 20 3c 20 30 29 20 7b 0a 09  ead_ret < 0) {..
19730 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 4e 55  .....pValue = NU
19740 4c 4c 3b 0a 09 09 09 09 09 7d 20 65 6c 73 65 20  LL;......} else 
19750 7b 0a 09 09 09 09 09 09 75 6c 56 61 6c 75 65 4c  {.......ulValueL
19760 65 6e 20 3d 20 78 35 30 39 5f 72 65 61 64 5f 72  en = x509_read_r
19770 65 74 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d  et;......}.....}
19780 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
19790 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
197a0 72 65 74 75 72 6e 69 6e 67 20 25 70 2f 25 6c 75  returning %p/%lu
197b0 22 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69  ", pValue, (unsi
197c0 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c  gned long) ulVal
197d0 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65  ueLen);......bre
197e0 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f  ak;....case CKA_
197f0 53 45 52 49 41 4c 5f 4e 55 4d 42 45 52 3a 0a 09  SERIAL_NUMBER:..
19800 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
19810 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69  PRINTF("Requesti
19820 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41  ng attribute CKA
19830 5f 53 45 52 49 41 4c 5f 4e 55 4d 42 45 52 20 28  _SERIAL_NUMBER (
19840 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28  0x%08lx) ...", (
19850 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63  unsigned long) c
19860 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a  urr_attr_type);.
19870 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63  .....if (objectc
19880 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 43 45 52 54  lass != CKO_CERT
19890 49 46 49 43 41 54 45 20 26 26 20 6f 62 6a 65 63  IFICATE && objec
198a0 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 4e 45  tclass != CKO_NE
198b0 54 53 43 41 50 45 5f 54 52 55 53 54 29 20 7b 0a  TSCAPE_TRUST) {.
198c0 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
198d0 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62  G_PRINTF(" ... b
198e0 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69  ut not getting i
198f0 74 20 62 65 63 61 75 73 65 20 77 65 20 61 72 65  t because we are
19900 20 6e 6f 74 20 61 20 63 65 72 74 69 66 69 63 61   not a certifica
19910 74 65 20 6f 72 20 4e 65 74 73 63 61 70 65 20 74  te or Netscape t
19920 72 75 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a  rust object");..
19930 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09  .....break;.....
19940 7d 0a 0a 09 09 09 09 69 66 20 28 63 65 72 74 69  }......if (certi
19950 66 69 63 61 74 65 5f 6c 65 6e 20 3e 3d 20 30 29  ficate_len >= 0)
19960 20 7b 0a 09 09 09 09 09 78 35 30 39 5f 72 65 61   {......x509_rea
19970 64 5f 72 65 74 20 3d 20 78 35 30 39 5f 74 6f 5f  d_ret = x509_to_
19980 73 65 72 69 61 6c 28 63 65 72 74 69 66 69 63 61  serial(certifica
19990 74 65 2c 20 63 65 72 74 69 66 69 63 61 74 65 5f  te, certificate_
199a0 6c 65 6e 2c 20 26 70 56 61 6c 75 65 29 3b 0a 09  len, &pValue);..
199b0 09 09 09 09 69 66 20 28 78 35 30 39 5f 72 65 61  ....if (x509_rea
199c0 64 5f 72 65 74 20 3c 20 30 29 20 7b 0a 09 09 09  d_ret < 0) {....
199d0 09 09 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c  ...pValue = NULL
199e0 3b 0a 09 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a  ;......} else {.
199f0 09 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e  ......ulValueLen
19a00 20 3d 20 78 35 30 39 5f 72 65 61 64 5f 72 65 74   = x509_read_ret
19a10 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 0a  ;......}.....}..
19a20 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
19a30 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65  _PRINTF(" ... re
19a40 74 75 72 6e 69 6e 67 20 28 25 70 2f 25 6c 75 29  turning (%p/%lu)
19a50 22 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69  ", pValue, (unsi
19a60 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c  gned long) ulVal
19a70 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65  ueLen);......bre
19a80 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f  ak;....case CKA_
19a90 53 55 42 4a 45 43 54 3a 0a 09 09 09 09 43 41 43  SUBJECT:.....CAC
19aa0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
19ab0 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74  ("Requesting att
19ac0 72 69 62 75 74 65 20 43 4b 41 5f 53 55 42 4a 45  ribute CKA_SUBJE
19ad0 43 54 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e  CT (0x%08lx) ...
19ae0 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
19af0 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70  g) curr_attr_typ
19b00 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a  e);......if (obj
19b10 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f  ectclass != CKO_
19b20 43 45 52 54 49 46 49 43 41 54 45 29 20 7b 0a 09  CERTIFICATE) {..
19b30 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
19b40 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75  _PRINTF(" ... bu
19b50 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74  t not getting it
19b60 20 62 65 63 61 75 73 65 20 77 65 20 61 72 65 20   because we are 
19b70 6e 6f 74 20 61 20 63 65 72 74 69 66 69 63 61 74  not a certificat
19b80 65 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b  e");.......break
19b90 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69 66 20  ;.....}......if 
19ba0 28 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e  (certificate_len
19bb0 20 3e 3d 20 30 29 20 7b 0a 09 09 09 09 09 78 35   >= 0) {......x5
19bc0 30 39 5f 72 65 61 64 5f 72 65 74 20 3d 20 78 35  09_read_ret = x5
19bd0 30 39 5f 74 6f 5f 73 75 62 6a 65 63 74 28 63 65  09_to_subject(ce
19be0 72 74 69 66 69 63 61 74 65 2c 20 63 65 72 74 69  rtificate, certi
19bf0 66 69 63 61 74 65 5f 6c 65 6e 2c 20 26 70 56 61  ficate_len, &pVa
19c00 6c 75 65 29 3b 0a 09 09 09 09 09 69 66 20 28 78  lue);......if (x
19c10 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3c 20 30  509_read_ret < 0
19c20 29 20 7b 0a 09 09 09 09 09 09 70 56 61 6c 75 65  ) {.......pValue
19c30 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 7d 20   = NULL;......} 
19c40 65 6c 73 65 20 7b 0a 09 09 09 09 09 09 75 6c 56  else {.......ulV
19c50 61 6c 75 65 4c 65 6e 20 3d 20 78 35 30 39 5f 72  alueLen = x509_r
19c60 65 61 64 5f 72 65 74 3b 0a 09 09 09 09 09 7d 0a  ead_ret;......}.
19c70 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45  ....}......CACKE
19c80 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
19c90 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25   ... returning %
19ca0 70 2f 25 6c 75 22 2c 20 70 56 61 6c 75 65 2c 20  p/%lu", pValue, 
19cb0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
19cc0 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09  ulValueLen);....
19cd0 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
19ce0 20 43 4b 41 5f 49 44 3a 0a 09 09 09 09 43 41 43   CKA_ID:.....CAC
19cf0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
19d00 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74  ("Requesting att
19d10 72 69 62 75 74 65 20 43 4b 41 5f 49 44 20 28 30  ribute CKA_ID (0
19d20 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75  x%08lx) ...", (u
19d30 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75  nsigned long) cu
19d40 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a  rr_attr_type);..
19d50 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c  ....if (objectcl
19d60 61 73 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43  ass == CKO_NETSC
19d70 41 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09  APE_TRUST) {....
19d80 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
19d90 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20  RINTF(" ... but 
19da0 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 62  not getting it b
19db0 65 63 61 75 73 65 20 77 65 20 61 72 65 20 61 20  ecause we are a 
19dc0 4e 65 74 73 63 61 70 65 20 74 72 75 73 74 20 6f  Netscape trust o
19dd0 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62  bject");.......b
19de0 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09  reak;.....}.....
19df0 09 75 63 54 6d 70 42 75 66 5b 30 5d 20 3d 20 28  .ucTmpBuf[0] = (
19e00 28 69 64 65 6e 74 69 74 79 5f 6e 75 6d 20 2b 20  (identity_num + 
19e10 31 29 20 3e 3e 20 38 29 20 26 20 30 78 66 66 3b  1) >> 8) & 0xff;
19e20 0a 09 09 09 09 75 63 54 6d 70 42 75 66 5b 31 5d  .....ucTmpBuf[1]
19e30 20 3d 20 20 28 69 64 65 6e 74 69 74 79 5f 6e 75   =  (identity_nu
19e40 6d 20 2b 20 31 29 20 26 20 30 78 66 66 3b 0a 0a  m + 1) & 0xff;..
19e50 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 75 63  ....pValue = &uc
19e60 54 6d 70 42 75 66 3b 0a 09 09 09 09 75 6c 56 61  TmpBuf;.....ulVa
19e70 6c 75 65 4c 65 6e 20 3d 20 32 3b 0a 0a 09 09 09  lueLen = 2;.....
19e80 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
19e90 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72  INTF(" ... retur
19ea0 6e 69 6e 67 20 25 70 2f 25 6c 75 22 2c 20 70 56  ning %p/%lu", pV
19eb0 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20  alue, (unsigned 
19ec0 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e  long) ulValueLen
19ed0 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  );......break;..
19ee0 09 09 63 61 73 65 20 43 4b 41 5f 43 45 52 54 49  ..case CKA_CERTI
19ef0 46 49 43 41 54 45 5f 54 59 50 45 3a 0a 09 09 09  FICATE_TYPE:....
19f00 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
19f10 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67  INTF("Requesting
19f20 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 43   attribute CKA_C
19f30 45 52 54 49 46 49 43 41 54 45 5f 54 59 50 45 20  ERTIFICATE_TYPE 
19f40 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20  (0x%08lx) ...", 
19f50 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
19f60 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b  curr_attr_type);
19f70 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74  ......if (object
19f80 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 43 45 52  class != CKO_CER
19f90 54 49 46 49 43 41 54 45 29 20 7b 0a 09 09 09 09  TIFICATE) {.....
19fa0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
19fb0 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e  INTF(" ... but n
19fc0 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65  ot getting it be
19fd0 63 61 75 73 65 20 77 65 20 61 72 65 20 6e 6f 74  cause we are not
19fe0 20 61 20 63 65 72 74 69 66 69 63 61 74 65 2e 22   a certificate."
19ff0 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a  );.......break;.
1a000 09 09 09 09 7d 0a 0a 09 09 09 09 2f 2a 20 57 65  ....}....../* We
1a010 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 20 6f 6e   only support on
1a020 65 20 63 65 72 74 69 66 69 63 61 74 65 20 74 79  e certificate ty
1a030 70 65 20 2a 2f 0a 09 09 09 09 63 6b 5f 63 65 72  pe */.....ck_cer
1a040 74 69 66 69 63 61 74 65 5f 74 79 70 65 20 3d 20  tificate_type = 
1a050 43 4b 43 5f 58 5f 35 30 39 3b 0a 0a 09 09 09 09  CKC_X_509;......
1a060 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 63 65 72  pValue = &ck_cer
1a070 74 69 66 69 63 61 74 65 5f 74 79 70 65 3b 0a 09  tificate_type;..
1a080 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  ...ulValueLen = 
1a090 73 69 7a 65 6f 66 28 63 6b 5f 63 65 72 74 69 66  sizeof(ck_certif
1a0a0 69 63 61 74 65 5f 74 79 70 65 29 3b 0a 0a 09 09  icate_type);....
1a0b0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1a0c0 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75  RINTF(" ... retu
1a0d0 72 6e 69 6e 67 20 43 4b 43 5f 58 5f 35 30 39 20  rning CKC_X_509 
1a0e0 28 25 6c 75 29 20 28 25 70 2f 25 6c 75 29 22 2c  (%lu) (%p/%lu)",
1a0f0 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
1a100 20 2a 28 28 43 4b 5f 43 45 52 54 49 46 49 43 41   *((CK_CERTIFICA
1a110 54 45 5f 54 59 50 45 20 2a 29 20 70 56 61 6c 75  TE_TYPE *) pValu
1a120 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73  e), pValue, (uns
1a130 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61  igned long) ulVa
1a140 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72  lueLen);......br
1a150 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41  eak;....case CKA
1a160 5f 4b 45 59 5f 54 59 50 45 3a 0a 09 09 09 09 43  _KEY_TYPE:.....C
1a170 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1a180 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61  TF("Requesting a
1a190 74 74 72 69 62 75 74 65 20 43 4b 41 5f 4b 45 59  ttribute CKA_KEY
1a1a0 5f 54 59 50 45 20 28 30 78 25 30 38 6c 78 29 20  _TYPE (0x%08lx) 
1a1b0 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  ...", (unsigned 
1a1c0 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f  long) curr_attr_
1a1d0 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28  type);......if (
1a1e0 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43  objectclass != C
1a1f0 4b 4f 5f 50 52 49 56 41 54 45 5f 4b 45 59 20 26  KO_PRIVATE_KEY &
1a200 26 20 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d  & objectclass !=
1a210 20 43 4b 4f 5f 50 55 42 4c 49 43 5f 4b 45 59 29   CKO_PUBLIC_KEY)
1a220 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44   {......CACKEY_D
1a230 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
1a240 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e  . but not gettin
1a250 67 20 69 74 20 62 65 63 61 75 73 65 20 77 65 20  g it because we 
1a260 61 72 65 20 6e 6f 74 20 61 20 6b 65 79 2e 22 29  are not a key.")
1a270 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09  ;.......break;..
1a280 09 09 09 7d 0a 0a 09 09 09 09 2f 2a 20 57 65 20  ...}....../* We 
1a290 6f 6e 6c 79 20 73 75 70 70 6f 72 74 20 6f 6e 65  only support one
1a2a0 20 6b 65 79 20 74 79 70 65 20 2a 2f 0a 09 09 09   key type */....
1a2b0 09 63 6b 5f 6b 65 79 5f 74 79 70 65 20 3d 20 43  .ck_key_type = C
1a2c0 4b 4b 5f 52 53 41 3b 0a 0a 09 09 09 09 70 56 61  KK_RSA;......pVa
1a2d0 6c 75 65 20 3d 20 26 63 6b 5f 6b 65 79 5f 74 79  lue = &ck_key_ty
1a2e0 70 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c  pe;.....ulValueL
1a2f0 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 6b  en = sizeof(ck_k
1a300 65 79 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 43  ey_type);......C
1a310 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1a320 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69  TF(" ... returni
1a330 6e 67 20 43 4b 4b 5f 52 53 41 20 28 25 6c 75 29  ng CKK_RSA (%lu)
1a340 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73   (%p/%lu)", (uns
1a350 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43  igned long) *((C
1a360 4b 5f 43 45 52 54 49 46 49 43 41 54 45 5f 54 59  K_CERTIFICATE_TY
1a370 50 45 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70  PE *) pValue), p
1a380 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64  Value, (unsigned
1a390 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65   long) ulValueLe
1a3a0 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a  n);......break;.
1a3b0 09 09 09 63 61 73 65 20 43 4b 41 5f 53 49 47 4e  ...case CKA_SIGN
1a3c0 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  :.....CACKEY_DEB
1a3d0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65  UG_PRINTF("Reque
1a3e0 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20  sting attribute 
1a3f0 43 4b 41 5f 53 49 47 4e 20 28 30 78 25 30 38 6c  CKA_SIGN (0x%08l
1a400 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e  x) ...", (unsign
1a410 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74  ed long) curr_at
1a420 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69  tr_type);......i
1a430 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d  f (objectclass =
1a440 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54  = CKO_NETSCAPE_T
1a450 52 55 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43  RUST) {......CAC
1a460 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1a470 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67  (" ... but not g
1a480 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73  etting it becaus
1a490 65 20 77 65 20 61 72 65 20 61 20 4e 65 74 73 63  e we are a Netsc
1a4a0 61 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74  ape trust object
1a4b0 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b  ");.......break;
1a4c0 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69 66 20 28  .....}......if (
1a4d0 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43  objectclass == C
1a4e0 4b 4f 5f 50 52 49 56 41 54 45 5f 4b 45 59 29 20  KO_PRIVATE_KEY) 
1a4f0 7b 0a 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20  {......pValue = 
1a500 26 63 6b 5f 74 72 75 65 3b 0a 09 09 09 09 09 75  &ck_true;......u
1a510 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65  lValueLen = size
1a520 6f 66 28 63 6b 5f 74 72 75 65 29 3b 0a 09 09 09  of(ck_true);....
1a530 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 70  .} else {......p
1a540 56 61 6c 75 65 20 3d 20 26 63 6b 5f 66 61 6c 73  Value = &ck_fals
1a550 65 3b 0a 09 09 09 09 09 75 6c 56 61 6c 75 65 4c  e;......ulValueL
1a560 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 66  en = sizeof(ck_f
1a570 61 6c 73 65 29 3b 0a 09 09 09 09 7d 0a 0a 09 09  alse);.....}....
1a580 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1a590 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75  RINTF(" ... retu
1a5a0 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c  rning %lu (%p/%l
1a5b0 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  u)", (unsigned l
1a5c0 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c  ong) *((CK_BBOOL
1a5d0 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61   *) pValue), pVa
1a5e0 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  lue, (unsigned l
1a5f0 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29  ong) ulValueLen)
1a600 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  ;......break;...
1a610 09 63 61 73 65 20 43 4b 41 5f 53 49 47 4e 5f 52  .case CKA_SIGN_R
1a620 45 43 4f 56 45 52 3a 0a 09 09 09 09 43 41 43 4b  ECOVER:.....CACK
1a630 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1a640 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72  "Requesting attr
1a650 69 62 75 74 65 20 43 4b 41 5f 53 49 47 4e 5f 52  ibute CKA_SIGN_R
1a660 45 43 4f 56 45 52 20 28 30 78 25 30 38 6c 78 29  ECOVER (0x%08lx)
1a670 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64   ...", (unsigned
1a680 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72   long) curr_attr
1a690 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20  _type);......if 
1a6a0 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20  (objectclass == 
1a6b0 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55  CKO_NETSCAPE_TRU
1a6c0 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45  ST) {......CACKE
1a6d0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1a6e0 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74   ... but not get
1a6f0 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20  ting it because 
1a700 77 65 20 61 72 65 20 61 20 4e 65 74 73 63 61 70  we are a Netscap
1a710 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29  e trust object")
1a720 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09  ;.......break;..
1a730 09 09 09 7d 0a 0a 09 09 09 09 2f 2a 20 57 65 20  ...}....../* We 
1a740 63 75 72 72 65 6e 74 6c 79 20 6f 6e 6c 79 20 73  currently only s
1a750 75 70 70 6f 72 74 20 22 53 69 67 6e 20 77 69 74  upport "Sign wit
1a760 68 20 41 70 70 65 6e 64 69 78 22 20 2a 2f 0a 09  h Appendix" */..
1a770 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f  ...pValue = &ck_
1a780 66 61 6c 73 65 3b 0a 09 09 09 09 75 6c 56 61 6c  false;.....ulVal
1a790 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63  ueLen = sizeof(c
1a7a0 6b 5f 66 61 6c 73 65 29 3b 0a 0a 09 09 09 09 43  k_false);......C
1a7b0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1a7c0 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69  TF(" ... returni
1a7d0 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22  ng %lu (%p/%lu)"
1a7e0 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
1a7f0 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29  ) *((CK_BBOOL *)
1a800 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65   pValue), pValue
1a810 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
1a820 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a  ) ulValueLen);..
1a830 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61  ....break;....ca
1a840 73 65 20 43 4b 41 5f 44 45 43 52 59 50 54 3a 0a  se CKA_DECRYPT:.
1a850 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
1a860 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74  _PRINTF("Request
1a870 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b  ing attribute CK
1a880 41 5f 44 45 43 52 59 50 54 20 28 30 78 25 30 38  A_DECRYPT (0x%08
1a890 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67  lx) ...", (unsig
1a8a0 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61  ned long) curr_a
1a8b0 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09  ttr_type);......
1a8c0 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20  if (objectclass 
1a8d0 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f  == CKO_NETSCAPE_
1a8e0 54 52 55 53 54 29 20 7b 0a 09 09 09 09 09 43 41  TRUST) {......CA
1a8f0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1a900 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20  F(" ... but not 
1a910 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 75  getting it becau
1a920 73 65 20 77 65 20 61 72 65 20 61 20 4e 65 74 73  se we are a Nets
1a930 63 61 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63  cape trust objec
1a940 74 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b  t");.......break
1a950 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69 66 20  ;.....}......if 
1a960 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20  (objectclass == 
1a970 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b 45 59 20  CKO_PRIVATE_KEY 
1a980 7c 7c 20 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d  || objectclass =
1a990 3d 20 43 4b 4f 5f 50 55 42 4c 49 43 5f 4b 45 59  = CKO_PUBLIC_KEY
1a9a0 29 20 7b 0a 09 09 09 09 09 70 56 61 6c 75 65 20  ) {......pValue 
1a9b0 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09 09 09 09  = &ck_true;.....
1a9c0 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69  .ulValueLen = si
1a9d0 7a 65 6f 66 28 63 6b 5f 74 72 75 65 29 3b 0a 09  zeof(ck_true);..
1a9e0 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09  ...} else {.....
1a9f0 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 66 61  .pValue = &ck_fa
1aa00 6c 73 65 3b 0a 09 09 09 09 09 75 6c 56 61 6c 75  lse;......ulValu
1aa10 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b  eLen = sizeof(ck
1aa20 5f 66 61 6c 73 65 29 3b 0a 09 09 09 09 7d 0a 0a  _false);.....}..
1aa30 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
1aa40 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65  _PRINTF(" ... re
1aa50 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f  turning %lu (%p/
1aa60 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64  %lu)", (unsigned
1aa70 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f   long) *((CK_BBO
1aa80 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70  OL *) pValue), p
1aa90 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64  Value, (unsigned
1aaa0 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65   long) ulValueLe
1aab0 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a  n);......break;.
1aac0 09 09 09 63 61 73 65 20 43 4b 41 5f 53 45 4e 53  ...case CKA_SENS
1aad0 49 54 49 56 45 3a 0a 09 09 09 09 43 41 43 4b 45  ITIVE:.....CACKE
1aae0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1aaf0 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69  Requesting attri
1ab00 62 75 74 65 20 43 4b 41 5f 53 45 4e 53 49 54 49  bute CKA_SENSITI
1ab10 56 45 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e  VE (0x%08lx) ...
1ab20 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
1ab30 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70  g) curr_attr_typ
1ab40 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a  e);......if (obj
1ab50 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f  ectclass == CKO_
1ab60 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54 29 20  NETSCAPE_TRUST) 
1ab70 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45  {......CACKEY_DE
1ab80 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
1ab90 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67   but not getting
1aba0 20 69 74 20 62 65 63 61 75 73 65 20 77 65 20 61   it because we a
1abb0 72 65 20 61 20 4e 65 74 73 63 61 70 65 20 74 72  re a Netscape tr
1abc0 75 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09  ust object");...
1abd0 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d  ....break;.....}
1abe0 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74  ......if (object
1abf0 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 50 52 49  class == CKO_PRI
1ac00 56 41 54 45 5f 4b 45 59 29 20 7b 0a 09 09 09 09  VATE_KEY) {.....
1ac10 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 74 72  .pValue = &ck_tr
1ac20 75 65 3b 0a 09 09 09 09 09 75 6c 56 61 6c 75 65  ue;......ulValue
1ac30 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f  Len = sizeof(ck_
1ac40 74 72 75 65 29 3b 0a 09 09 09 09 7d 20 65 6c 73  true);.....} els
1ac50 65 20 7b 0a 09 09 09 09 09 70 56 61 6c 75 65 20  e {......pValue 
1ac60 3d 20 26 63 6b 5f 66 61 6c 73 65 3b 0a 09 09 09  = &ck_false;....
1ac70 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73  ..ulValueLen = s
1ac80 69 7a 65 6f 66 28 63 6b 5f 66 61 6c 73 65 29 3b  izeof(ck_false);
1ac90 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b  .....}......CACK
1aca0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1acb0 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20  " ... returning 
1acc0 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28  %lu (%p/%lu)", (
1acd0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a  unsigned long) *
1ace0 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56  ((CK_BBOOL *) pV
1acf0 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28  alue), pValue, (
1ad00 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75  unsigned long) u
1ad10 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09  lValueLen);.....
1ad20 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
1ad30 43 4b 41 5f 45 58 54 52 41 43 54 41 42 4c 45 3a  CKA_EXTRACTABLE:
1ad40 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
1ad50 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73  G_PRINTF("Reques
1ad60 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43  ting attribute C
1ad70 4b 41 5f 45 58 54 52 41 43 54 41 42 4c 45 20 28  KA_EXTRACTABLE (
1ad80 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28  0x%08lx) ...", (
1ad90 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63  unsigned long) c
1ada0 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a  urr_attr_type);.
1adb0 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63  .....if (objectc
1adc0 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53  lass == CKO_NETS
1add0 43 41 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 09  CAPE_TRUST) {...
1ade0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1adf0 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74  PRINTF(" ... but
1ae00 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20   not getting it 
1ae10 62 65 63 61 75 73 65 20 77 65 20 61 72 65 20 61  because we are a
1ae20 20 4e 65 74 73 63 61 70 65 20 74 72 75 73 74 20   Netscape trust 
1ae30 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09  object");.......
1ae40 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09  break;.....}....
1ae50 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73  ..if (objectclas
1ae60 73 20 3d 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45  s == CKO_PRIVATE
1ae70 5f 4b 45 59 29 20 7b 0a 09 09 09 09 09 70 56 61  _KEY) {......pVa
1ae80 6c 75 65 20 3d 20 26 63 6b 5f 66 61 6c 73 65 3b  lue = &ck_false;
1ae90 0a 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e  ......ulValueLen
1aea0 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 74 72 75   = sizeof(ck_tru
1aeb0 65 29 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b  e);.....} else {
1aec0 0a 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26  ......pValue = &
1aed0 63 6b 5f 74 72 75 65 3b 0a 09 09 09 09 09 75 6c  ck_true;......ul
1aee0 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f  ValueLen = sizeo
1aef0 66 28 63 6b 5f 66 61 6c 73 65 29 3b 0a 09 09 09  f(ck_false);....
1af00 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  .}......CACKEY_D
1af10 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
1af20 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20  . returning %lu 
1af30 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69  (%p/%lu)", (unsi
1af40 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b  gned long) *((CK
1af50 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65  _BBOOL *) pValue
1af60 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69  ), pValue, (unsi
1af70 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c  gned long) ulVal
1af80 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65  ueLen);......bre
1af90 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f  ak;....case CKA_
1afa0 4d 4f 44 55 4c 55 53 3a 0a 09 09 09 09 43 41 43  MODULUS:.....CAC
1afb0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1afc0 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74  ("Requesting att
1afd0 72 69 62 75 74 65 20 43 4b 41 5f 4d 4f 44 55 4c  ribute CKA_MODUL
1afe0 55 53 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e  US (0x%08lx) ...
1aff0 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
1b000 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70  g) curr_attr_typ
1b010 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a  e);......if (obj
1b020 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f  ectclass == CKO_
1b030 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54 29 20  NETSCAPE_TRUST) 
1b040 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45  {......CACKEY_DE
1b050 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
1b060 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67   but not getting
1b070 20 69 74 20 62 65 63 61 75 73 65 20 77 65 20 61   it because we a
1b080 72 65 20 61 20 4e 65 74 73 63 61 70 65 20 74 72  re a Netscape tr
1b090 75 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09  ust object");...
1b0a0 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d  ....break;.....}
1b0b0 0a 0a 09 09 09 09 69 66 20 28 63 65 72 74 69 66  ......if (certif
1b0c0 69 63 61 74 65 5f 6c 65 6e 20 3e 3d 20 30 29 20  icate_len >= 0) 
1b0d0 7b 0a 09 09 09 09 09 78 35 30 39 5f 72 65 61 64  {......x509_read
1b0e0 5f 72 65 74 20 3d 20 78 35 30 39 5f 74 6f 5f 6d  _ret = x509_to_m
1b0f0 6f 64 75 6c 75 73 28 63 65 72 74 69 66 69 63 61  odulus(certifica
1b100 74 65 2c 20 63 65 72 74 69 66 69 63 61 74 65 5f  te, certificate_
1b110 6c 65 6e 2c 20 26 70 56 61 6c 75 65 29 3b 0a 09  len, &pValue);..
1b120 09 09 09 09 69 66 20 28 78 35 30 39 5f 72 65 61  ....if (x509_rea
1b130 64 5f 72 65 74 20 3c 20 30 29 20 7b 0a 09 09 09  d_ret < 0) {....
1b140 09 09 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c  ...pValue = NULL
1b150 3b 0a 09 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a  ;......} else {.
1b160 09 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e  ......ulValueLen
1b170 20 3d 20 78 35 30 39 5f 72 65 61 64 5f 72 65 74   = x509_read_ret
1b180 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 0a  ;......}.....}..
1b190 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
1b1a0 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65  _PRINTF(" ... re
1b1b0 74 75 72 6e 69 6e 67 20 28 25 70 2f 25 6c 75 29  turning (%p/%lu)
1b1c0 22 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69  ", pValue, (unsi
1b1d0 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c  gned long) ulVal
1b1e0 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65  ueLen);......bre
1b1f0 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f  ak;....case CKA_
1b200 50 55 42 4c 49 43 5f 45 58 50 4f 4e 45 4e 54 3a  PUBLIC_EXPONENT:
1b210 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
1b220 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73  G_PRINTF("Reques
1b230 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43  ting attribute C
1b240 4b 41 5f 50 55 42 4c 49 43 5f 45 58 50 4f 4e 45  KA_PUBLIC_EXPONE
1b250 4e 54 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e  NT (0x%08lx) ...
1b260 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
1b270 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70  g) curr_attr_typ
1b280 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a  e);......if (obj
1b290 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f  ectclass == CKO_
1b2a0 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54 29 20  NETSCAPE_TRUST) 
1b2b0 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45  {......CACKEY_DE
1b2c0 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
1b2d0 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67   but not getting
1b2e0 20 69 74 20 62 65 63 61 75 73 65 20 77 65 20 61   it because we a
1b2f0 72 65 20 61 20 4e 65 74 73 63 61 70 65 20 74 72  re a Netscape tr
1b300 75 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09  ust object");...
1b310 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d  ....break;.....}
1b320 0a 0a 09 09 09 09 69 66 20 28 63 65 72 74 69 66  ......if (certif
1b330 69 63 61 74 65 5f 6c 65 6e 20 3e 3d 20 30 29 20  icate_len >= 0) 
1b340 7b 0a 09 09 09 09 09 78 35 30 39 5f 72 65 61 64  {......x509_read
1b350 5f 72 65 74 20 3d 20 78 35 30 39 5f 74 6f 5f 65  _ret = x509_to_e
1b360 78 70 6f 6e 65 6e 74 28 63 65 72 74 69 66 69 63  xponent(certific
1b370 61 74 65 2c 20 63 65 72 74 69 66 69 63 61 74 65  ate, certificate
1b380 5f 6c 65 6e 2c 20 26 70 56 61 6c 75 65 29 3b 0a  _len, &pValue);.
1b390 09 09 09 09 09 69 66 20 28 78 35 30 39 5f 72 65  .....if (x509_re
1b3a0 61 64 5f 72 65 74 20 3c 20 30 29 20 7b 0a 09 09  ad_ret < 0) {...
1b3b0 09 09 09 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c  ....pValue = NUL
1b3c0 4c 3b 0a 09 09 09 09 09 7d 20 65 6c 73 65 20 7b  L;......} else {
1b3d0 0a 09 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65  .......ulValueLe
1b3e0 6e 20 3d 20 78 35 30 39 5f 72 65 61 64 5f 72 65  n = x509_read_re
1b3f0 74 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a  t;......}.....}.
1b400 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
1b410 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72  G_PRINTF(" ... r
1b420 65 74 75 72 6e 69 6e 67 20 28 25 70 2f 25 6c 75  eturning (%p/%lu
1b430 29 22 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73  )", pValue, (uns
1b440 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61  igned long) ulVa
1b450 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72  lueLen);......br
1b460 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41  eak;....case CKA
1b470 5f 54 52 55 53 54 5f 44 49 47 49 54 41 4c 5f 53  _TRUST_DIGITAL_S
1b480 49 47 4e 41 54 55 52 45 3a 0a 09 09 09 63 61 73  IGNATURE:....cas
1b490 65 20 43 4b 41 5f 54 52 55 53 54 5f 4e 4f 4e 5f  e CKA_TRUST_NON_
1b4a0 52 45 50 55 44 49 41 54 49 4f 4e 3a 0a 09 09 09  REPUDIATION:....
1b4b0 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54 5f 4b  case CKA_TRUST_K
1b4c0 45 59 5f 45 4e 43 49 50 48 45 52 4d 45 4e 54 3a  EY_ENCIPHERMENT:
1b4d0 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 54 52 55  ....case CKA_TRU
1b4e0 53 54 5f 44 41 54 41 5f 45 4e 43 49 50 48 45 52  ST_DATA_ENCIPHER
1b4f0 4d 45 4e 54 3a 0a 09 09 09 63 61 73 65 20 43 4b  MENT:....case CK
1b500 41 5f 54 52 55 53 54 5f 4b 45 59 5f 41 47 52 45  A_TRUST_KEY_AGRE
1b510 45 4d 45 4e 54 3a 0a 09 09 09 63 61 73 65 20 43  EMENT:....case C
1b520 4b 41 5f 54 52 55 53 54 5f 4b 45 59 5f 43 45 52  KA_TRUST_KEY_CER
1b530 54 5f 53 49 47 4e 3a 0a 09 09 09 63 61 73 65 20  T_SIGN:....case 
1b540 43 4b 41 5f 54 52 55 53 54 5f 43 52 4c 5f 53 49  CKA_TRUST_CRL_SI
1b550 47 4e 3a 0a 09 09 09 63 61 73 65 20 43 4b 41 5f  GN:....case CKA_
1b560 54 52 55 53 54 5f 53 45 52 56 45 52 5f 41 55 54  TRUST_SERVER_AUT
1b570 48 3a 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 54  H:....case CKA_T
1b580 52 55 53 54 5f 43 4c 49 45 4e 54 5f 41 55 54 48  RUST_CLIENT_AUTH
1b590 3a 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 54 52  :....case CKA_TR
1b5a0 55 53 54 5f 43 4f 44 45 5f 53 49 47 4e 49 4e 47  UST_CODE_SIGNING
1b5b0 3a 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 54 52  :....case CKA_TR
1b5c0 55 53 54 5f 45 4d 41 49 4c 5f 50 52 4f 54 45 43  UST_EMAIL_PROTEC
1b5d0 54 49 4f 4e 3a 0a 09 09 09 09 43 41 43 4b 45 59  TION:.....CACKEY
1b5e0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
1b5f0 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62  equesting attrib
1b600 75 74 65 20 43 4b 41 5f 54 52 55 53 54 5f 2e 2e  ute CKA_TRUST_..
1b610 2e 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22  . (0x%08lx) ..."
1b620 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
1b630 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65  ) curr_attr_type
1b640 29 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d  );......pValue =
1b650 20 26 63 6b 5f 74 72 75 73 74 65 64 3b 0a 09 09   &ck_trusted;...
1b660 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73  ..ulValueLen = s
1b670 69 7a 65 6f 66 28 63 6b 5f 74 72 75 73 74 65 64  izeof(ck_trusted
1b680 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  );......CACKEY_D
1b690 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
1b6a0 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20  . returning %lu 
1b6b0 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69  (%p/%lu)", (unsi
1b6c0 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b  gned long) *((CK
1b6d0 5f 54 52 55 53 54 20 2a 29 20 70 56 61 6c 75 65  _TRUST *) pValue
1b6e0 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69  ), pValue, (unsi
1b6f0 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c  gned long) ulVal
1b700 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65  ueLen);......bre
1b710 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f  ak;....case CKA_
1b720 43 45 52 54 5f 53 48 41 31 5f 48 41 53 48 3a 0a  CERT_SHA1_HASH:.
1b730 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
1b740 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74  _PRINTF("Request
1b750 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b  ing attribute CK
1b760 41 5f 43 45 52 54 5f 53 48 41 31 5f 48 41 53 48  A_CERT_SHA1_HASH
1b770 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c   (0x%08lx) ...",
1b780 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
1b790 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29   curr_attr_type)
1b7a0 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63  ;......if (objec
1b7b0 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 4e 45  tclass != CKO_NE
1b7c0 54 53 43 41 50 45 5f 54 52 55 53 54 29 20 7b 0a  TSCAPE_TRUST) {.
1b7d0 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
1b7e0 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62  G_PRINTF(" ... b
1b7f0 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69  ut not getting i
1b800 74 20 62 65 63 61 75 73 65 20 77 65 20 61 72 65  t because we are
1b810 20 6e 6f 74 20 61 20 4e 65 74 73 63 61 70 65 20   not a Netscape 
1b820 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a  trust object");.
1b830 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
1b840 09 7d 0a 0a 09 09 09 09 53 48 41 31 52 65 73 65  .}......SHA1Rese
1b850 74 28 26 73 68 61 31 5f 63 74 78 29 3b 0a 09 09  t(&sha1_ctx);...
1b860 09 09 53 48 41 31 49 6e 70 75 74 28 26 73 68 61  ..SHA1Input(&sha
1b870 31 5f 63 74 78 2c 20 63 65 72 74 69 66 69 63 61  1_ctx, certifica
1b880 74 65 2c 20 63 65 72 74 69 66 69 63 61 74 65 5f  te, certificate_
1b890 6c 65 6e 29 3b 0a 09 09 09 09 53 48 41 31 52 65  len);.....SHA1Re
1b8a0 73 75 6c 74 28 26 73 68 61 31 5f 63 74 78 2c 20  sult(&sha1_ctx, 
1b8b0 73 68 61 31 5f 68 61 73 68 29 3b 0a 0a 09 09 09  sha1_hash);.....
1b8c0 09 70 56 61 6c 75 65 20 3d 20 73 68 61 31 5f 68  .pValue = sha1_h
1b8d0 61 73 68 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65  ash;.....ulValue
1b8e0 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 73 68 61  Len = sizeof(sha
1b8f0 31 5f 68 61 73 68 29 3b 0a 0a 09 09 09 09 43 41  1_hash);......CA
1b900 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1b910 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e  F(" ... returnin
1b920 67 20 25 70 2f 25 6c 75 22 2c 20 70 56 61 6c 75  g %p/%lu", pValu
1b930 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  e, (unsigned lon
1b940 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a  g) ulValueLen);.
1b950 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
1b960 61 73 65 20 43 4b 41 5f 43 45 52 54 5f 4d 44 35  ase CKA_CERT_MD5
1b970 5f 48 41 53 48 3a 0a 09 09 09 09 43 41 43 4b 45  _HASH:.....CACKE
1b980 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1b990 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69  Requesting attri
1b9a0 62 75 74 65 20 43 4b 41 5f 43 45 52 54 5f 4d 44  bute CKA_CERT_MD
1b9b0 35 5f 48 41 53 48 20 28 30 78 25 30 38 6c 78 29  5_HASH (0x%08lx)
1b9c0 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64   ...", (unsigned
1b9d0 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72   long) curr_attr
1b9e0 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20  _type);......if 
1b9f0 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20  (objectclass != 
1ba00 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55  CKO_NETSCAPE_TRU
1ba10 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45  ST) {......CACKE
1ba20 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1ba30 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74   ... but not get
1ba40 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20  ting it because 
1ba50 77 65 20 61 72 65 20 6e 6f 74 20 61 20 4e 65 74  we are not a Net
1ba60 73 63 61 70 65 20 74 72 75 73 74 20 6f 62 6a 65  scape trust obje
1ba70 63 74 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61  ct");.......brea
1ba80 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 4d 44  k;.....}......MD
1ba90 35 49 6e 69 74 28 26 6d 64 35 5f 63 74 78 29 3b  5Init(&md5_ctx);
1baa0 0a 09 09 09 09 4d 44 35 55 70 64 61 74 65 28 26  .....MD5Update(&
1bab0 6d 64 35 5f 63 74 78 2c 20 63 65 72 74 69 66 69  md5_ctx, certifi
1bac0 63 61 74 65 2c 20 63 65 72 74 69 66 69 63 61 74  cate, certificat
1bad0 65 5f 6c 65 6e 29 3b 0a 09 09 09 09 4d 44 35 46  e_len);.....MD5F
1bae0 69 6e 61 6c 28 6d 64 35 5f 68 61 73 68 2c 20 26  inal(md5_hash, &
1baf0 6d 64 35 5f 63 74 78 29 3b 0a 0a 09 09 09 09 70  md5_ctx);......p
1bb00 56 61 6c 75 65 20 3d 20 6d 64 35 5f 68 61 73 68  Value = md5_hash
1bb10 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e  ;.....ulValueLen
1bb20 20 3d 20 73 69 7a 65 6f 66 28 6d 64 35 5f 68 61   = sizeof(md5_ha
1bb30 73 68 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59  sh);......CACKEY
1bb40 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
1bb50 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 70  ... returning %p
1bb60 2f 25 6c 75 22 2c 20 70 56 61 6c 75 65 2c 20 28  /%lu", pValue, (
1bb70 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75  unsigned long) u
1bb80 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09  lValueLen);.....
1bb90 09 62 72 65 61 6b 3b 0a 09 09 09 64 65 66 61 75  .break;....defau
1bba0 6c 74 3a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d  lt:.....pValue =
1bbb0 20 4e 55 4c 4c 3b 0a 09 09 09 09 75 6c 56 61 6c   NULL;.....ulVal
1bbc0 75 65 4c 65 6e 20 3d 20 28 43 4b 5f 4c 4f 4e 47  ueLen = (CK_LONG
1bbd0 29 20 2d 31 3b 0a 09 09 09 09 62 72 65 61 6b 3b  ) -1;.....break;
1bbe0 0a 09 09 7d 0a 0a 09 09 69 66 20 28 28 28 43 4b  ...}....if (((CK
1bbf0 5f 4c 4f 4e 47 29 20 75 6c 56 61 6c 75 65 4c 65  _LONG) ulValueLe
1bc00 6e 29 20 21 3d 20 28 28 43 4b 5f 4c 4f 4e 47 29  n) != ((CK_LONG)
1bc10 20 2d 31 29 29 20 7b 0a 09 09 09 2f 2a 20 50 75   -1)) {..../* Pu
1bc20 73 68 20 63 75 72 72 5f 61 74 74 72 20 6f 6e 74  sh curr_attr ont
1bc30 6f 20 74 68 65 20 73 74 61 63 6b 20 2a 2f 0a 09  o the stack */..
1bc40 09 09 63 75 72 72 5f 61 74 74 72 2e 74 79 70 65  ..curr_attr.type
1bc50 20 3d 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70   = curr_attr_typ
1bc60 65 3b 0a 09 09 09 63 75 72 72 5f 61 74 74 72 2e  e;....curr_attr.
1bc70 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 75 6c 56  ulValueLen = ulV
1bc80 61 6c 75 65 4c 65 6e 3b 0a 0a 09 09 09 63 75 72  alueLen;.....cur
1bc90 72 5f 61 74 74 72 2e 70 56 61 6c 75 65 20 3d 20  r_attr.pValue = 
1bca0 6d 61 6c 6c 6f 63 28 63 75 72 72 5f 61 74 74 72  malloc(curr_attr
1bcb0 2e 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 09 09  .ulValueLen);...
1bcc0 09 6d 65 6d 63 70 79 28 63 75 72 72 5f 61 74 74  .memcpy(curr_att
1bcd0 72 2e 70 56 61 6c 75 65 2c 20 70 56 61 6c 75 65  r.pValue, pValue
1bce0 2c 20 63 75 72 72 5f 61 74 74 72 2e 75 6c 56 61  , curr_attr.ulVa
1bcf0 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 69 66 20  lueLen);.....if 
1bd00 28 70 56 61 6c 75 65 5f 66 72 65 65 20 26 26 20  (pValue_free && 
1bd10 70 56 61 6c 75 65 29 20 7b 0a 09 09 09 09 66 72  pValue) {.....fr
1bd20 65 65 28 70 56 61 6c 75 65 29 3b 0a 09 09 09 7d  ee(pValue);....}
1bd30 0a 0a 09 09 09 69 66 20 28 6e 75 6d 61 74 74 72  .....if (numattr
1bd40 73 20 3e 3d 20 72 65 74 76 61 6c 5f 63 6f 75 6e  s >= retval_coun
1bd50 74 29 20 7b 0a 09 09 09 09 72 65 74 76 61 6c 20  t) {.....retval 
1bd60 3d 20 72 65 61 6c 6c 6f 63 28 72 65 74 76 61 6c  = realloc(retval
1bd70 2c 20 72 65 74 76 61 6c 5f 63 6f 75 6e 74 20 2a  , retval_count *
1bd80 20 73 69 7a 65 6f 66 28 2a 72 65 74 76 61 6c 29   sizeof(*retval)
1bd90 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 6d 65 6d 63  );....}.....memc
1bda0 70 79 28 26 72 65 74 76 61 6c 5b 6e 75 6d 61 74  py(&retval[numat
1bdb0 74 72 73 5d 2c 20 26 63 75 72 72 5f 61 74 74 72  trs], &curr_attr
1bdc0 2c 20 73 69 7a 65 6f 66 28 63 75 72 72 5f 61 74  , sizeof(curr_at
1bdd0 74 72 29 29 3b 0a 09 09 09 6e 75 6d 61 74 74 72  tr));....numattr
1bde0 73 2b 2b 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66  s++;...}..}...if
1bdf0 20 28 6e 75 6d 61 74 74 72 73 20 21 3d 20 30 29   (numattrs != 0)
1be00 20 7b 0a 09 09 72 65 74 76 61 6c 5f 63 6f 75 6e   {...retval_coun
1be10 74 20 3d 20 6e 75 6d 61 74 74 72 73 3b 0a 09 09  t = numattrs;...
1be20 72 65 74 76 61 6c 20 3d 20 72 65 61 6c 6c 6f 63  retval = realloc
1be30 28 72 65 74 76 61 6c 2c 20 72 65 74 76 61 6c 5f  (retval, retval_
1be40 63 6f 75 6e 74 20 2a 20 73 69 7a 65 6f 66 28 2a  count * sizeof(*
1be50 72 65 74 76 61 6c 29 29 3b 0a 09 7d 20 65 6c 73  retval));..} els
1be60 65 20 7b 0a 09 09 66 72 65 65 28 72 65 74 76 61  e {...free(retva
1be70 6c 29 3b 0a 0a 09 09 72 65 74 76 61 6c 20 3d 20  l);....retval = 
1be80 4e 55 4c 4c 3b 0a 09 7d 0a 0a 09 2a 70 75 6c 43  NULL;..}...*pulC
1be90 6f 75 6e 74 20 3d 20 6e 75 6d 61 74 74 72 73 3b  ount = numattrs;
1bea0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1beb0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
1bec0 67 20 25 6c 75 20 6f 62 6a 65 63 74 73 20 28 25  g %lu objects (%
1bed0 70 29 2e 22 2c 20 6e 75 6d 61 74 74 72 73 2c 20  p).", numattrs, 
1bee0 28 76 6f 69 64 20 2a 29 20 72 65 74 76 61 6c 29  (void *) retval)
1bef0 3b 0a 0a 09 72 65 74 75 72 6e 28 72 65 74 76 61  ;...return(retva
1bf00 6c 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f  l);.}..static vo
1bf10 69 64 20 63 61 63 6b 65 79 5f 66 72 65 65 5f 69  id cackey_free_i
1bf20 64 65 6e 74 69 74 69 65 73 28 73 74 72 75 63 74  dentities(struct
1bf30 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79   cackey_identity
1bf40 20 2a 69 64 65 6e 74 69 74 69 65 73 2c 20 75 6e   *identities, un
1bf50 73 69 67 6e 65 64 20 6c 6f 6e 67 20 69 64 65 6e  signed long iden
1bf60 74 69 74 69 65 73 5f 63 6f 75 6e 74 29 20 7b 0a  tities_count) {.
1bf70 09 43 4b 5f 41 54 54 52 49 42 55 54 45 20 2a 63  .CK_ATTRIBUTE *c
1bf80 75 72 72 5f 61 74 74 72 3b 0a 09 75 6e 73 69 67  urr_attr;..unsig
1bf90 6e 65 64 20 6c 6f 6e 67 20 69 64 5f 69 64 78 2c  ned long id_idx,
1bfa0 20 61 74 74 72 5f 69 64 78 3b 0a 0a 09 69 66 20   attr_idx;...if 
1bfb0 28 69 64 65 6e 74 69 74 69 65 73 20 3d 3d 20 4e  (identities == N
1bfc0 55 4c 4c 20 7c 7c 20 69 64 65 6e 74 69 74 69 65  ULL || identitie
1bfd0 73 5f 63 6f 75 6e 74 20 3d 3d 20 30 29 20 7b 0a  s_count == 0) {.
1bfe0 09 09 72 65 74 75 72 6e 3b 0a 09 7d 0a 0a 09 66  ..return;..}...f
1bff0 6f 72 20 28 69 64 5f 69 64 78 20 3d 20 30 3b 20  or (id_idx = 0; 
1c000 69 64 5f 69 64 78 20 3c 20 69 64 65 6e 74 69 74  id_idx < identit
1c010 69 65 73 5f 63 6f 75 6e 74 3b 20 69 64 5f 69 64  ies_count; id_id
1c020 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28 69 64 65  x++) {...if (ide
1c030 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e  ntities[id_idx].
1c040 61 74 74 72 69 62 75 74 65 73 29 20 7b 0a 09 09  attributes) {...
1c050 09 66 6f 72 20 28 61 74 74 72 5f 69 64 78 20 3d  .for (attr_idx =
1c060 20 30 3b 20 61 74 74 72 5f 69 64 78 20 3c 20 69   0; attr_idx < i
1c070 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78  dentities[id_idx
1c080 5d 2e 61 74 74 72 69 62 75 74 65 73 5f 63 6f 75  ].attributes_cou
1c090 6e 74 3b 20 61 74 74 72 5f 69 64 78 2b 2b 29 20  nt; attr_idx++) 
1c0a0 7b 0a 09 09 09 09 63 75 72 72 5f 61 74 74 72 20  {.....curr_attr 
1c0b0 3d 20 26 69 64 65 6e 74 69 74 69 65 73 5b 69 64  = &identities[id
1c0c0 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73  _idx].attributes
1c0d0 5b 61 74 74 72 5f 69 64 78 5d 3b 0a 0a 09 09 09  [attr_idx];.....
1c0e0 09 69 66 20 28 63 75 72 72 5f 61 74 74 72 2d 3e  .if (curr_attr->
1c0f0 70 56 61 6c 75 65 29 20 7b 0a 09 09 09 09 09 66  pValue) {......f
1c100 72 65 65 28 63 75 72 72 5f 61 74 74 72 2d 3e 70  ree(curr_attr->p
1c110 56 61 6c 75 65 29 3b 0a 09 09 09 09 7d 0a 09 09  Value);.....}...
1c120 09 7d 0a 0a 09 09 09 69 66 20 28 69 64 65 6e 74  .}.....if (ident
1c130 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74  ities[id_idx].at
1c140 74 72 69 62 75 74 65 73 29 20 7b 0a 09 09 09 09  tributes) {.....
1c150 66 72 65 65 28 69 64 65 6e 74 69 74 69 65 73 5b  free(identities[
1c160 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74  id_idx].attribut
1c170 65 73 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 63 61  es);....}.....ca
1c180 63 6b 65 79 5f 66 72 65 65 5f 63 65 72 74 73 28  ckey_free_certs(
1c190 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64  identities[id_id
1c1a0 78 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69 74 79  x].pcsc_identity
1c1b0 2c 20 31 2c 20 31 29 3b 0a 09 09 7d 0a 09 7d 0a  , 1, 1);...}..}.
1c1c0 0a 09 66 72 65 65 28 69 64 65 6e 74 69 74 69 65  ..free(identitie
1c1d0 73 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 75 6e  s);.}..static un
1c1e0 73 69 67 6e 65 64 20 6c 6f 6e 67 20 63 61 63 6b  signed long cack
1c1f0 65 79 5f 72 65 61 64 5f 64 6f 64 5f 69 64 65 6e  ey_read_dod_iden
1c200 74 69 74 69 65 73 28 73 74 72 75 63 74 20 63 61  tities(struct ca
1c210 63 6b 65 79 5f 69 64 65 6e 74 69 74 79 20 2a 69  ckey_identity *i
1c220 64 65 6e 74 69 74 69 65 73 2c 20 75 6e 73 69 67  dentities, unsig
1c230 6e 65 64 20 6c 6f 6e 67 20 6e 75 6d 5f 64 6f 64  ned long num_dod
1c240 5f 63 65 72 74 73 29 20 7b 0a 09 75 6e 73 69 67  _certs) {..unsig
1c250 6e 65 64 20 6c 6f 6e 67 20 63 65 72 74 5f 69 64  ned long cert_id
1c260 78 2c 20 69 64 5f 69 64 78 20 3d 20 30 3b 0a 0a  x, id_idx = 0;..
1c270 09 69 66 20 28 69 64 65 6e 74 69 74 69 65 73 20  .if (identities 
1c280 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74  == NULL) {...ret
1c290 75 72 6e 28 6e 75 6d 5f 64 6f 64 5f 63 65 72 74  urn(num_dod_cert
1c2a0 73 20 2a 20 33 29 3b 0a 09 7d 0a 0a 09 66 6f 72  s * 3);..}...for
1c2b0 20 28 63 65 72 74 5f 69 64 78 20 3d 20 30 3b 20   (cert_idx = 0; 
1c2c0 63 65 72 74 5f 69 64 78 20 3c 20 6e 75 6d 5f 64  cert_idx < num_d
1c2d0 6f 64 5f 63 65 72 74 73 3b 20 63 65 72 74 5f 69  od_certs; cert_i
1c2e0 64 78 2b 2b 29 20 7b 0a 09 09 69 64 65 6e 74 69  dx++) {...identi
1c2f0 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73  ties[id_idx].pcs
1c300 63 5f 69 64 65 6e 74 69 74 79 20 3d 20 4e 55 4c  c_identity = NUL
1c310 4c 3b 0a 09 09 69 64 65 6e 74 69 74 69 65 73 5b  L;...identities[
1c320 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74  id_idx].attribut
1c330 65 73 20 3d 20 63 61 63 6b 65 79 5f 67 65 74 5f  es = cackey_get_
1c340 61 74 74 72 69 62 75 74 65 73 28 43 4b 4f 5f 43  attributes(CKO_C
1c350 45 52 54 49 46 49 43 41 54 45 2c 20 26 65 78 74  ERTIFICATE, &ext
1c360 72 61 5f 63 65 72 74 73 5b 63 65 72 74 5f 69 64  ra_certs[cert_id
1c370 78 5d 2c 20 30 78 66 30 30 30 20 7c 20 63 65 72  x], 0xf000 | cer
1c380 74 5f 69 64 78 2c 20 26 69 64 65 6e 74 69 74 69  t_idx, &identiti
1c390 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69  es[id_idx].attri
1c3a0 62 75 74 65 73 5f 63 6f 75 6e 74 29 3b 0a 09 09  butes_count);...
1c3b0 69 64 5f 69 64 78 2b 2b 3b 0a 0a 09 09 69 64 65  id_idx++;....ide
1c3c0 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e  ntities[id_idx].
1c3d0 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 3d 20  pcsc_identity = 
1c3e0 4e 55 4c 4c 3b 0a 09 09 69 64 65 6e 74 69 74 69  NULL;...identiti
1c3f0 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69  es[id_idx].attri
1c400 62 75 74 65 73 20 3d 20 63 61 63 6b 65 79 5f 67  butes = cackey_g
1c410 65 74 5f 61 74 74 72 69 62 75 74 65 73 28 43 4b  et_attributes(CK
1c420 4f 5f 50 55 42 4c 49 43 5f 4b 45 59 2c 20 26 65  O_PUBLIC_KEY, &e
1c430 78 74 72 61 5f 63 65 72 74 73 5b 63 65 72 74 5f  xtra_certs[cert_
1c440 69 64 78 5d 2c 20 30 78 66 30 30 30 20 7c 20 63  idx], 0xf000 | c
1c450 65 72 74 5f 69 64 78 2c 20 26 69 64 65 6e 74 69  ert_idx, &identi
1c460 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74  ties[id_idx].att
1c470 72 69 62 75 74 65 73 5f 63 6f 75 6e 74 29 3b 0a  ributes_count);.
1c480 09 09 69 64 5f 69 64 78 2b 2b 3b 0a 0a 09 09 69  ..id_idx++;....i
1c490 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78  dentities[id_idx
1c4a0 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20  ].pcsc_identity 
1c4b0 3d 20 4e 55 4c 4c 3b 0a 09 09 69 64 65 6e 74 69  = NULL;...identi
1c4c0 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74  ties[id_idx].att
1c4d0 72 69 62 75 74 65 73 20 3d 20 63 61 63 6b 65 79  ributes = cackey
1c4e0 5f 67 65 74 5f 61 74 74 72 69 62 75 74 65 73 28  _get_attributes(
1c4f0 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55  CKO_NETSCAPE_TRU
1c500 53 54 2c 20 26 65 78 74 72 61 5f 63 65 72 74 73  ST, &extra_certs
1c510 5b 63 65 72 74 5f 69 64 78 5d 2c 20 30 78 66 30  [cert_idx], 0xf0
1c520 30 30 20 7c 20 63 65 72 74 5f 69 64 78 2c 20 26  00 | cert_idx, &
1c530 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64  identities[id_id
1c540 78 5d 2e 61 74 74 72 69 62 75 74 65 73 5f 63 6f  x].attributes_co
1c550 75 6e 74 29 3b 0a 09 09 69 64 5f 69 64 78 2b 2b  unt);...id_idx++
1c560 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 69 64  ;..}...return(id
1c570 5f 69 64 78 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  _idx);.}..static
1c580 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69   struct cackey_i
1c590 64 65 6e 74 69 74 79 20 2a 63 61 63 6b 65 79 5f  dentity *cackey_
1c5a0 72 65 61 64 5f 69 64 65 6e 74 69 74 69 65 73 28  read_identities(
1c5b0 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c  struct cackey_sl
1c5c0 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e  ot *slot, unsign
1c5d0 65 64 20 6c 6f 6e 67 20 2a 69 64 73 5f 66 6f 75  ed long *ids_fou
1c5e0 6e 64 29 20 7b 0a 09 73 74 72 75 63 74 20 63 61  nd) {..struct ca
1c5f0 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69  ckey_pcsc_identi
1c600 74 79 20 2a 70 63 73 63 5f 69 64 65 6e 74 69 74  ty *pcsc_identit
1c610 69 65 73 3b 0a 09 73 74 72 75 63 74 20 63 61 63  ies;..struct cac
1c620 6b 65 79 5f 69 64 65 6e 74 69 74 79 20 2a 69 64  key_identity *id
1c630 65 6e 74 69 74 69 65 73 3b 0a 09 75 6e 73 69 67  entities;..unsig
1c640 6e 65 64 20 6c 6f 6e 67 20 6e 75 6d 5f 69 64 73  ned long num_ids
1c650 2c 20 69 64 5f 69 64 78 2c 20 63 75 72 72 5f 69  , id_idx, curr_i
1c660 64 5f 74 79 70 65 3b 0a 09 75 6e 73 69 67 6e 65  d_type;..unsigne
1c670 64 20 6c 6f 6e 67 20 6e 75 6d 5f 63 65 72 74 73  d long num_certs
1c680 2c 20 6e 75 6d 5f 64 6f 64 5f 63 65 72 74 73 2c  , num_dod_certs,
1c690 20 63 65 72 74 5f 69 64 78 3b 0a 09 69 6e 74 20   cert_idx;..int 
1c6a0 69 6e 63 6c 75 64 65 5f 65 78 74 72 61 5f 63 65  include_extra_ce
1c6b0 72 74 73 20 3d 20 30 2c 20 69 6e 63 6c 75 64 65  rts = 0, include
1c6c0 5f 64 6f 64 5f 63 65 72 74 73 3b 0a 0a 09 43 41  _dod_certs;...CA
1c6d0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1c6e0 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
1c6f0 69 66 20 28 69 64 73 5f 66 6f 75 6e 64 20 3d 3d  if (ids_found ==
1c700 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
1c710 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1c720 45 72 72 6f 72 2e 20 20 69 64 73 5f 66 6f 75 6e  Error.  ids_foun
1c730 64 20 69 73 20 4e 55 4c 4c 22 29 3b 0a 0a 09 09  d is NULL");....
1c740 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d  return(NULL);..}
1c750 0a 0a 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f  ..#ifdef CACKEY_
1c760 43 41 52 44 5f 53 4c 4f 54 5f 49 4e 43 4c 55 44  CARD_SLOT_INCLUD
1c770 45 5f 45 58 54 52 41 5f 43 45 52 54 53 0a 09 69  E_EXTRA_CERTS..i
1c780 6e 63 6c 75 64 65 5f 65 78 74 72 61 5f 63 65 72  nclude_extra_cer
1c790 74 73 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 0a  ts = 1;.#endif..
1c7a0 09 69 66 20 28 67 65 74 65 6e 76 28 22 43 41 43  .if (getenv("CAC
1c7b0 4b 45 59 5f 44 4f 44 5f 43 45 52 54 53 5f 4f 4e  KEY_DOD_CERTS_ON
1c7c0 5f 48 57 5f 53 4c 4f 54 53 22 29 20 21 3d 20 4e  _HW_SLOTS") != N
1c7d0 55 4c 4c 29 20 7b 0a 09 09 69 6e 63 6c 75 64 65  ULL) {...include
1c7e0 5f 65 78 74 72 61 5f 63 65 72 74 73 20 3d 20 31  _extra_certs = 1
1c7f0 3b 0a 09 7d 0a 0a 09 69 66 20 28 67 65 74 65 6e  ;..}...if (geten
1c800 76 28 22 43 41 43 4b 45 59 5f 4e 4f 5f 44 4f 44  v("CACKEY_NO_DOD
1c810 5f 43 45 52 54 53 5f 4f 4e 5f 48 57 5f 53 4c 4f  _CERTS_ON_HW_SLO
1c820 54 53 22 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  TS") != NULL) {.
1c830 09 09 69 6e 63 6c 75 64 65 5f 65 78 74 72 61 5f  ..include_extra_
1c840 63 65 72 74 73 20 3d 20 30 3b 0a 09 7d 0a 0a 23  certs = 0;..}..#
1c850 69 66 64 65 66 20 43 41 43 4b 45 59 5f 4e 4f 5f  ifdef CACKEY_NO_
1c860 45 58 54 52 41 5f 43 45 52 54 53 0a 09 69 66 20  EXTRA_CERTS..if 
1c870 28 67 65 74 65 6e 76 28 22 43 41 43 4b 45 59 5f  (getenv("CACKEY_
1c880 45 58 54 52 41 5f 43 45 52 54 53 22 29 20 21 3d  EXTRA_CERTS") !=
1c890 20 4e 55 4c 4c 29 20 7b 0a 09 09 69 6e 63 6c 75   NULL) {...inclu
1c8a0 64 65 5f 64 6f 64 5f 63 65 72 74 73 20 3d 20 31  de_dod_certs = 1
1c8b0 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69 6e  ;..} else {...in
1c8c0 63 6c 75 64 65 5f 64 6f 64 5f 63 65 72 74 73 20  clude_dod_certs 
1c8d0 3d 20 30 3b 0a 09 7d 0a 23 65 6c 73 65 0a 09 69  = 0;..}.#else..i
1c8e0 66 20 28 67 65 74 65 6e 76 28 22 43 41 43 4b 45  f (getenv("CACKE
1c8f0 59 5f 4e 4f 5f 45 58 54 52 41 5f 43 45 52 54 53  Y_NO_EXTRA_CERTS
1c900 22 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  ") != NULL) {...
1c910 69 6e 63 6c 75 64 65 5f 64 6f 64 5f 63 65 72 74  include_dod_cert
1c920 73 20 3d 20 30 3b 0a 09 7d 20 65 6c 73 65 20 7b  s = 0;..} else {
1c930 0a 09 09 69 6e 63 6c 75 64 65 5f 64 6f 64 5f 63  ...include_dod_c
1c940 65 72 74 73 20 3d 20 31 3b 0a 09 7d 0a 23 65 6e  erts = 1;..}.#en
1c950 64 69 66 0a 0a 09 69 66 20 28 69 6e 63 6c 75 64  dif...if (includ
1c960 65 5f 64 6f 64 5f 63 65 72 74 73 29 20 7b 0a 09  e_dod_certs) {..
1c970 09 6e 75 6d 5f 64 6f 64 5f 63 65 72 74 73 20 3d  .num_dod_certs =
1c980 20 73 69 7a 65 6f 66 28 65 78 74 72 61 5f 63 65   sizeof(extra_ce
1c990 72 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 65 78  rts) / sizeof(ex
1c9a0 74 72 61 5f 63 65 72 74 73 5b 30 5d 29 3b 0a 09  tra_certs[0]);..
1c9b0 7d 20 65 6c 73 65 20 7b 0a 09 09 6e 75 6d 5f 64  } else {...num_d
1c9c0 6f 64 5f 63 65 72 74 73 20 3d 20 30 3b 0a 09 7d  od_certs = 0;..}
1c9d0 0a 0a 09 69 66 20 28 73 6c 6f 74 2d 3e 69 6e 74  ...if (slot->int
1c9e0 65 72 6e 61 6c 29 20 7b 0a 09 09 6e 75 6d 5f 69  ernal) {...num_i
1c9f0 64 73 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64  ds = cackey_read
1ca00 5f 64 6f 64 5f 69 64 65 6e 74 69 74 69 65 73 28  _dod_identities(
1ca10 4e 55 4c 4c 2c 20 6e 75 6d 5f 64 6f 64 5f 63 65  NULL, num_dod_ce
1ca20 72 74 73 29 3b 0a 0a 09 09 69 66 20 28 6e 75 6d  rts);....if (num
1ca30 5f 69 64 73 20 21 3d 20 30 29 20 7b 0a 09 09 09  _ids != 0) {....
1ca40 69 64 65 6e 74 69 74 69 65 73 20 3d 20 6d 61 6c  identities = mal
1ca50 6c 6f 63 28 6e 75 6d 5f 69 64 73 20 2a 20 73 69  loc(num_ids * si
1ca60 7a 65 6f 66 28 2a 69 64 65 6e 74 69 74 69 65 73  zeof(*identities
1ca70 29 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 72  ));.....cackey_r
1ca80 65 61 64 5f 64 6f 64 5f 69 64 65 6e 74 69 74 69  ead_dod_identiti
1ca90 65 73 28 69 64 65 6e 74 69 74 69 65 73 2c 20 6e  es(identities, n
1caa0 75 6d 5f 64 6f 64 5f 63 65 72 74 73 29 3b 0a 09  um_dod_certs);..
1cab0 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 69 64 65  .} else {....ide
1cac0 6e 74 69 74 69 65 73 20 3d 20 4e 55 4c 4c 3b 0a  ntities = NULL;.
1cad0 09 09 7d 0a 0a 09 09 2a 69 64 73 5f 66 6f 75 6e  ..}....*ids_foun
1cae0 64 20 3d 20 6e 75 6d 5f 69 64 73 3b 0a 0a 09 09  d = num_ids;....
1caf0 72 65 74 75 72 6e 28 69 64 65 6e 74 69 74 69 65  return(identitie
1cb00 73 29 3b 0a 09 7d 0a 0a 09 70 63 73 63 5f 69 64  s);..}...pcsc_id
1cb10 65 6e 74 69 74 69 65 73 20 3d 20 63 61 63 6b 65  entities = cacke
1cb20 79 5f 72 65 61 64 5f 63 65 72 74 73 28 73 6c 6f  y_read_certs(slo
1cb30 74 2c 20 4e 55 4c 4c 2c 20 26 6e 75 6d 5f 63 65  t, NULL, &num_ce
1cb40 72 74 73 29 3b 0a 09 69 66 20 28 70 63 73 63 5f  rts);..if (pcsc_
1cb50 69 64 65 6e 74 69 74 69 65 73 20 21 3d 20 4e 55  identities != NU
1cb60 4c 4c 29 20 7b 0a 09 09 2f 2a 20 43 6f 6e 76 65  LL) {.../* Conve
1cb70 72 74 20 6e 75 6d 62 65 72 20 6f 66 20 43 65 72  rt number of Cer
1cb80 74 73 20 74 6f 20 6e 75 6d 62 65 72 20 6f 66 20  ts to number of 
1cb90 6f 62 6a 65 63 74 73 20 2a 2f 0a 09 09 6e 75 6d  objects */...num
1cba0 5f 69 64 73 20 3d 20 28 43 4b 4f 5f 50 52 49 56  _ids = (CKO_PRIV
1cbb0 41 54 45 5f 4b 45 59 20 2d 20 43 4b 4f 5f 43 45  ATE_KEY - CKO_CE
1cbc0 52 54 49 46 49 43 41 54 45 20 2b 20 31 29 20 2a  RTIFICATE + 1) *
1cbd0 20 6e 75 6d 5f 63 65 72 74 73 3b 0a 0a 09 09 69   num_certs;....i
1cbe0 66 20 28 69 6e 63 6c 75 64 65 5f 65 78 74 72 61  f (include_extra
1cbf0 5f 63 65 72 74 73 29 20 7b 0a 09 09 09 6e 75 6d  _certs) {....num
1cc00 5f 69 64 73 20 2b 3d 20 63 61 63 6b 65 79 5f 72  _ids += cackey_r
1cc10 65 61 64 5f 64 6f 64 5f 69 64 65 6e 74 69 74 69  ead_dod_identiti
1cc20 65 73 28 4e 55 4c 4c 2c 20 6e 75 6d 5f 64 6f 64  es(NULL, num_dod
1cc30 5f 63 65 72 74 73 29 3b 0a 09 09 7d 0a 0a 09 09  _certs);...}....
1cc40 69 64 65 6e 74 69 74 69 65 73 20 3d 20 6d 61 6c  identities = mal
1cc50 6c 6f 63 28 6e 75 6d 5f 69 64 73 20 2a 20 73 69  loc(num_ids * si
1cc60 7a 65 6f 66 28 2a 69 64 65 6e 74 69 74 69 65 73  zeof(*identities
1cc70 29 29 3b 0a 0a 09 09 2f 2a 20 41 64 64 20 63 65  ));..../* Add ce
1cc80 72 74 69 66 69 63 61 74 65 73 2c 20 70 75 62 6c  rtificates, publ
1cc90 69 63 20 6b 65 79 73 2c 20 61 6e 64 20 70 72 69  ic keys, and pri
1cca0 76 61 74 65 20 6b 65 79 73 20 66 72 6f 6d 20 74  vate keys from t
1ccb0 68 65 20 73 6d 61 72 74 63 61 72 64 20 2a 2f 0a  he smartcard */.
1ccc0 09 09 69 64 5f 69 64 78 20 3d 20 30 3b 0a 09 09  ..id_idx = 0;...
1ccd0 66 6f 72 20 28 63 65 72 74 5f 69 64 78 20 3d 20  for (cert_idx = 
1cce0 30 3b 20 63 65 72 74 5f 69 64 78 20 3c 20 6e 75  0; cert_idx < nu
1ccf0 6d 5f 63 65 72 74 73 3b 20 63 65 72 74 5f 69 64  m_certs; cert_id
1cd00 78 2b 2b 29 20 7b 0a 09 09 09 66 6f 72 20 28 63  x++) {....for (c
1cd10 75 72 72 5f 69 64 5f 74 79 70 65 20 3d 20 43 4b  urr_id_type = CK
1cd20 4f 5f 43 45 52 54 49 46 49 43 41 54 45 3b 20 63  O_CERTIFICATE; c
1cd30 75 72 72 5f 69 64 5f 74 79 70 65 20 3c 3d 20 43  urr_id_type <= C
1cd40 4b 4f 5f 50 52 49 56 41 54 45 5f 4b 45 59 3b 20  KO_PRIVATE_KEY; 
1cd50 63 75 72 72 5f 69 64 5f 74 79 70 65 2b 2b 29 20  curr_id_type++) 
1cd60 7b 0a 09 09 09 09 69 64 65 6e 74 69 74 69 65 73  {.....identities
1cd70 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75  [id_idx].attribu
1cd80 74 65 73 20 3d 20 63 61 63 6b 65 79 5f 67 65 74  tes = cackey_get
1cd90 5f 61 74 74 72 69 62 75 74 65 73 28 63 75 72 72  _attributes(curr
1cda0 5f 69 64 5f 74 79 70 65 2c 20 26 70 63 73 63 5f  _id_type, &pcsc_
1cdb0 69 64 65 6e 74 69 74 69 65 73 5b 63 65 72 74 5f  identities[cert_
1cdc0 69 64 78 5d 2c 20 63 65 72 74 5f 69 64 78 2c 20  idx], cert_idx, 
1cdd0 26 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69  &identities[id_i
1cde0 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73 5f 63  dx].attributes_c
1cdf0 6f 75 6e 74 29 3b 0a 0a 09 09 09 09 69 64 65 6e  ount);......iden
1ce00 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70  tities[id_idx].p
1ce10 63 73 63 5f 69 64 65 6e 74 69 74 79 20 3d 20 6d  csc_identity = m
1ce20 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 69 64  alloc(sizeof(*id
1ce30 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d  entities[id_idx]
1ce40 2e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 29 29  .pcsc_identity))
1ce50 3b 0a 09 09 09 09 6d 65 6d 63 70 79 28 69 64 65  ;.....memcpy(ide
1ce60 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e  ntities[id_idx].
1ce70 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2c 20 26  pcsc_identity, &
1ce80 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 5b  pcsc_identities[
1ce90 63 65 72 74 5f 69 64 78 5d 2c 20 73 69 7a 65 6f  cert_idx], sizeo
1cea0 66 28 2a 69 64 65 6e 74 69 74 69 65 73 5b 69 64  f(*identities[id
1ceb0 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e 74  _idx].pcsc_ident
1cec0 69 74 79 29 29 3b 0a 0a 09 09 09 09 69 64 65 6e  ity));......iden
1ced0 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70  tities[id_idx].p
1cee0 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 63 65  csc_identity->ce
1cef0 72 74 69 66 69 63 61 74 65 20 3d 20 6d 61 6c 6c  rtificate = mall
1cf00 6f 63 28 70 63 73 63 5f 69 64 65 6e 74 69 74 69  oc(pcsc_identiti
1cf10 65 73 5b 63 65 72 74 5f 69 64 78 5d 2e 63 65 72  es[cert_idx].cer
1cf20 74 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a 09  tificate_len);..
1cf30 09 09 09 6d 65 6d 63 70 79 28 69 64 65 6e 74 69  ...memcpy(identi
1cf40 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73  ties[id_idx].pcs
1cf50 63 5f 69 64 65 6e 74 69 74 79 2d 3e 63 65 72 74  c_identity->cert
1cf60 69 66 69 63 61 74 65 2c 20 70 63 73 63 5f 69 64  ificate, pcsc_id
1cf70 65 6e 74 69 74 69 65 73 5b 63 65 72 74 5f 69 64  entities[cert_id
1cf80 78 5d 2e 63 65 72 74 69 66 69 63 61 74 65 2c 20  x].certificate, 
1cf90 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 5b  pcsc_identities[
1cfa0 63 65 72 74 5f 69 64 78 5d 2e 63 65 72 74 69 66  cert_idx].certif
1cfb0 69 63 61 74 65 5f 6c 65 6e 29 3b 0a 0a 09 09 09  icate_len);.....
1cfc0 09 69 64 5f 69 64 78 2b 2b 3b 0a 09 09 09 7d 0a  .id_idx++;....}.
1cfd0 09 09 7d 0a 0a 09 09 69 66 20 28 69 6e 63 6c 75  ..}....if (inclu
1cfe0 64 65 5f 65 78 74 72 61 5f 63 65 72 74 73 29 20  de_extra_certs) 
1cff0 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
1d000 47 5f 50 52 49 4e 54 46 28 22 49 6e 63 6c 75 64  G_PRINTF("Includ
1d010 69 6e 67 20 55 53 20 47 6f 76 65 72 6e 6d 65 6e  ing US Governmen
1d020 74 20 43 65 72 74 69 66 69 63 61 74 65 73 20 6f  t Certificates o
1d030 6e 20 68 61 72 64 77 61 72 65 20 73 6c 6f 74 22  n hardware slot"
1d040 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 72 65  );.....cackey_re
1d050 61 64 5f 64 6f 64 5f 69 64 65 6e 74 69 74 69 65  ad_dod_identitie
1d060 73 28 69 64 65 6e 74 69 74 69 65 73 20 2b 20 69  s(identities + i
1d070 64 5f 69 64 78 2c 20 6e 75 6d 5f 64 6f 64 5f 63  d_idx, num_dod_c
1d080 65 72 74 73 29 3b 0a 09 09 7d 0a 0a 09 09 63 61  erts);...}....ca
1d090 63 6b 65 79 5f 66 72 65 65 5f 63 65 72 74 73 28  ckey_free_certs(
1d0a0 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 2c  pcsc_identities,
1d0b0 20 6e 75 6d 5f 63 65 72 74 73 2c 20 31 29 3b 0a   num_certs, 1);.
1d0c0 0a 09 09 2a 69 64 73 5f 66 6f 75 6e 64 20 3d 20  ...*ids_found = 
1d0d0 6e 75 6d 5f 69 64 73 3b 0a 0a 09 09 72 65 74 75  num_ids;....retu
1d0e0 72 6e 28 69 64 65 6e 74 69 74 69 65 73 29 3b 0a  rn(identities);.
1d0f0 09 7d 0a 0a 0a 09 2a 69 64 73 5f 66 6f 75 6e 64  .}....*ids_found
1d100 20 3d 20 30 3b 0a 09 72 65 74 75 72 6e 28 4e 55   = 0;..return(NU
1d110 4c 4c 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 63  LL);.}..static c
1d120 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79  ackey_ret cackey
1d130 5f 67 65 74 5f 70 69 6e 28 63 68 61 72 20 2a 70  _get_pin(char *p
1d140 69 6e 62 75 66 29 20 7b 0a 09 46 49 4c 45 20 2a  inbuf) {..FILE *
1d150 70 69 6e 66 64 3b 0a 09 63 68 61 72 20 2a 66 67  pinfd;..char *fg
1d160 65 74 73 5f 72 65 74 3b 0a 09 69 6e 74 20 70 63  ets_ret;..int pc
1d170 6c 6f 73 65 5f 72 65 74 3b 0a 0a 09 69 66 20 28  lose_ret;...if (
1d180 63 61 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61  cackey_pin_comma
1d190 6e 64 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  nd == NULL) {...
1d1a0 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
1d1b0 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09  SC_E_GENERIC);..
1d1c0 7d 0a 0a 09 69 66 20 28 70 69 6e 62 75 66 20 3d  }...if (pinbuf =
1d1d0 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75  = NULL) {...retu
1d1e0 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  rn(CACKEY_PCSC_E
1d1f0 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09  _GENERIC);..}...
1d200 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1d210 4e 54 46 28 22 43 41 43 4b 45 59 5f 50 49 4e 5f  NTF("CACKEY_PIN_
1d220 43 4f 4d 4d 41 4e 44 20 3d 20 25 73 22 2c 20 63  COMMAND = %s", c
1d230 61 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e  ackey_pin_comman
1d240 64 29 3b 0a 0a 09 70 69 6e 66 64 20 3d 20 70 6f  d);...pinfd = po
1d250 70 65 6e 28 63 61 63 6b 65 79 5f 70 69 6e 5f 63  pen(cackey_pin_c
1d260 6f 6d 6d 61 6e 64 2c 20 22 72 22 29 3b 0a 09 69  ommand, "r");..i
1d270 66 20 28 70 69 6e 66 64 20 3d 3d 20 4e 55 4c 4c  f (pinfd == NULL
1d280 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1d290 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1d2a0 2e 20 20 25 73 3a 20 55 6e 61 62 6c 65 20 74 6f  .  %s: Unable to
1d2b0 20 72 75 6e 22 2c 20 63 61 63 6b 65 79 5f 70 69   run", cackey_pi
1d2c0 6e 5f 63 6f 6d 6d 61 6e 64 29 3b 0a 0a 09 09 72  n_command);....r
1d2d0 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
1d2e0 43 5f 45 5f 42 41 44 50 49 4e 29 3b 0a 09 7d 0a  C_E_BADPIN);..}.
1d2f0 0a 09 66 67 65 74 73 5f 72 65 74 20 3d 20 66 67  ..fgets_ret = fg
1d300 65 74 73 28 70 69 6e 62 75 66 2c 20 33 32 2c 20  ets(pinbuf, 32, 
1d310 70 69 6e 66 64 29 3b 0a 09 69 66 20 28 66 67 65  pinfd);..if (fge
1d320 74 73 5f 72 65 74 20 3d 3d 20 4e 55 4c 4c 29 20  ts_ret == NULL) 
1d330 7b 0a 09 09 70 69 6e 62 75 66 5b 30 5d 20 3d 20  {...pinbuf[0] = 
1d340 27 5c 30 27 3b 0a 09 7d 0a 0a 09 70 63 6c 6f 73  '\0';..}...pclos
1d350 65 5f 72 65 74 20 3d 20 70 63 6c 6f 73 65 28 70  e_ret = pclose(p
1d360 69 6e 66 64 29 3b 0a 09 69 66 20 28 70 63 6c 6f  infd);..if (pclo
1d370 73 65 5f 72 65 74 20 3d 3d 20 2d 31 20 26 26 20  se_ret == -1 && 
1d380 65 72 72 6e 6f 20 3d 3d 20 45 43 48 49 4c 44 29  errno == ECHILD)
1d390 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1d3a0 47 5f 50 52 49 4e 54 46 28 22 4e 6f 74 69 63 65  G_PRINTF("Notice
1d3b0 2e 20 20 70 63 6c 6f 73 65 28 29 20 69 6e 64 69  .  pclose() indi
1d3c0 63 61 74 65 64 20 69 74 20 63 6f 75 6c 64 20 6e  cated it could n
1d3d0 6f 74 20 67 65 74 20 74 68 65 20 73 74 61 74 75  ot get the statu
1d3e0 73 20 6f 66 20 74 68 65 20 63 68 69 6c 64 2c 20  s of the child, 
1d3f0 61 73 73 75 6d 69 6e 67 20 69 74 20 73 75 63 63  assuming it succ
1d400 65 65 65 64 65 64 20 21 22 29 3b 0a 0a 09 09 70  eeeded !");....p
1d410 63 6c 6f 73 65 5f 72 65 74 20 3d 20 30 3b 0a 09  close_ret = 0;..
1d420 7d 0a 0a 09 69 66 20 28 70 63 6c 6f 73 65 5f 72  }...if (pclose_r
1d430 65 74 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  et != 0) {...CAC
1d440 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1d450 28 22 45 72 72 6f 72 2e 20 20 25 73 3a 20 65 78  ("Error.  %s: ex
1d460 69 74 65 64 20 77 69 74 68 20 6e 6f 6e 2d 7a 65  ited with non-ze
1d470 72 6f 20 73 74 61 74 75 73 20 6f 66 20 25 69 22  ro status of %i"
1d480 2c 20 63 61 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d  , cackey_pin_com
1d490 6d 61 6e 64 2c 20 70 63 6c 6f 73 65 5f 72 65 74  mand, pclose_ret
1d4a0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43  );....return(CAC
1d4b0 4b 45 59 5f 50 43 53 43 5f 45 5f 42 41 44 50 49  KEY_PCSC_E_BADPI
1d4c0 4e 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 74 72  N);..}...if (str
1d4d0 6c 65 6e 28 70 69 6e 62 75 66 29 20 3c 20 31 29  len(pinbuf) < 1)
1d4e0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1d4f0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1d500 20 20 25 73 3a 20 72 65 74 75 72 6e 65 64 20 6e    %s: returned n
1d510 6f 20 64 61 74 61 22 2c 20 63 61 63 6b 65 79 5f  o data", cackey_
1d520 70 69 6e 5f 63 6f 6d 6d 61 6e 64 29 3b 0a 0a 09  pin_command);...
1d530 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
1d540 43 53 43 5f 45 5f 42 41 44 50 49 4e 29 3b 0a 09  CSC_E_BADPIN);..
1d550 7d 0a 0a 09 69 66 20 28 70 69 6e 62 75 66 5b 73  }...if (pinbuf[s
1d560 74 72 6c 65 6e 28 70 69 6e 62 75 66 29 20 2d 20  trlen(pinbuf) - 
1d570 31 5d 20 3d 3d 20 27 5c 6e 27 29 20 7b 0a 09 09  1] == '\n') {...
1d580 70 69 6e 62 75 66 5b 73 74 72 6c 65 6e 28 70 69  pinbuf[strlen(pi
1d590 6e 62 75 66 29 20 2d 20 31 5d 20 3d 20 27 5c 30  nbuf) - 1] = '\0
1d5a0 27 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 43  ';..}...return(C
1d5b0 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29  ACKEY_PCSC_S_OK)
1d5c0 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
1d5d0 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
1d5e0 5f 49 6e 69 74 69 61 6c 69 7a 65 29 28 43 4b 5f  _Initialize)(CK_
1d5f0 56 4f 49 44 5f 50 54 52 20 70 49 6e 69 74 41 72  VOID_PTR pInitAr
1d600 67 73 29 20 7b 0a 09 43 4b 5f 43 5f 49 4e 49 54  gs) {..CK_C_INIT
1d610 49 41 4c 49 5a 45 5f 41 52 47 53 20 43 4b 5f 50  IALIZE_ARGS CK_P
1d620 54 52 20 61 72 67 73 3b 0a 09 75 69 6e 74 33 32  TR args;..uint32
1d630 5f 74 20 69 64 78 2c 20 68 69 67 68 65 73 74 5f  _t idx, highest_
1d640 73 6c 6f 74 3b 0a 09 69 6e 74 20 6d 75 74 65 78  slot;..int mutex
1d650 5f 69 6e 69 74 5f 72 65 74 3b 0a 09 69 6e 74 20  _init_ret;..int 
1d660 69 6e 63 6c 75 64 65 5f 64 6f 64 5f 63 65 72 74  include_dod_cert
1d670 73 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  s;...CACKEY_DEBU
1d680 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
1d690 2e 22 29 3b 0a 0a 09 69 66 20 28 63 61 63 6b 65  .");...if (cacke
1d6a0 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
1d6b0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1d6c0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
1d6d0 41 6c 72 65 61 64 79 20 69 6e 69 74 69 61 6c 69  Already initiali
1d6e0 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
1d6f0 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 41  n(CKR_CRYPTOKI_A
1d700 4c 52 45 41 44 59 5f 49 4e 49 54 49 41 4c 49 5a  LREADY_INITIALIZ
1d710 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 49  ED);..}...if (pI
1d720 6e 69 74 41 72 67 73 20 21 3d 20 4e 55 4c 4c 29  nitArgs != NULL)
1d730 20 7b 0a 09 09 61 72 67 73 20 3d 20 70 49 6e 69   {...args = pIni
1d740 74 41 72 67 73 3b 0a 09 09 6d 65 6d 63 70 79 28  tArgs;...memcpy(
1d750 26 63 61 63 6b 65 79 5f 61 72 67 73 2c 20 61 72  &cackey_args, ar
1d760 67 73 2c 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  gs, sizeof(cacke
1d770 79 5f 61 72 67 73 29 29 3b 0a 0a 09 09 69 66 20  y_args));....if 
1d780 28 61 72 67 73 2d 3e 43 72 65 61 74 65 4d 75 74  (args->CreateMut
1d790 65 78 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72  ex == NULL || ar
1d7a0 67 73 2d 3e 44 65 73 74 72 6f 79 4d 75 74 65 78  gs->DestroyMutex
1d7b0 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 73   == NULL || args
1d7c0 2d 3e 4c 6f 63 6b 4d 75 74 65 78 20 3d 3d 20 4e  ->LockMutex == N
1d7d0 55 4c 4c 20 7c 7c 20 61 72 67 73 2d 3e 55 6e 6c  ULL || args->Unl
1d7e0 6f 63 6b 4d 75 74 65 78 20 3d 3d 20 4e 55 4c 4c  ockMutex == NULL
1d7f0 29 20 7b 0a 09 09 09 69 66 20 28 61 72 67 73 2d  ) {....if (args-
1d800 3e 43 72 65 61 74 65 4d 75 74 65 78 20 21 3d 20  >CreateMutex != 
1d810 4e 55 4c 4c 20 7c 7c 20 61 72 67 73 2d 3e 44 65  NULL || args->De
1d820 73 74 72 6f 79 4d 75 74 65 78 20 21 3d 20 4e 55  stroyMutex != NU
1d830 4c 4c 20 7c 7c 20 61 72 67 73 2d 3e 4c 6f 63 6b  LL || args->Lock
1d840 4d 75 74 65 78 20 21 3d 20 4e 55 4c 4c 20 7c 7c  Mutex != NULL ||
1d850 20 61 72 67 73 2d 3e 55 6e 6c 6f 63 6b 4d 75 74   args->UnlockMut
1d860 65 78 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  ex != NULL) {...
1d870 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1d880 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 53 6f  RINTF("Error. So
1d890 6d 65 2c 20 62 75 74 20 6e 6f 74 20 41 6c 6c 20  me, but not All 
1d8a0 74 68 72 65 61 64 69 6e 67 20 70 72 69 6d 69 74  threading primit
1d8b0 69 76 65 73 20 70 72 6f 76 69 64 65 64 2e 22 29  ives provided.")
1d8c0 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
1d8d0 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29  R_ARGUMENTS_BAD)
1d8e0 3b 0a 09 09 09 7d 0a 09 09 7d 0a 09 7d 20 65 6c  ;....}...}..} el
1d8f0 73 65 20 7b 0a 09 09 63 61 63 6b 65 79 5f 61 72  se {...cackey_ar
1d900 67 73 2e 43 72 65 61 74 65 4d 75 74 65 78 20 3d  gs.CreateMutex =
1d910 20 4e 55 4c 4c 3b 0a 09 09 63 61 63 6b 65 79 5f   NULL;...cackey_
1d920 61 72 67 73 2e 44 65 73 74 72 6f 79 4d 75 74 65  args.DestroyMute
1d930 78 20 3d 20 4e 55 4c 4c 3b 0a 09 09 63 61 63 6b  x = NULL;...cack
1d940 65 79 5f 61 72 67 73 2e 4c 6f 63 6b 4d 75 74 65  ey_args.LockMute
1d950 78 20 3d 20 4e 55 4c 4c 3b 0a 09 09 63 61 63 6b  x = NULL;...cack
1d960 65 79 5f 61 72 67 73 2e 55 6e 6c 6f 63 6b 4d 75  ey_args.UnlockMu
1d970 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 09 09 63 61  tex = NULL;...ca
1d980 63 6b 65 79 5f 61 72 67 73 2e 66 6c 61 67 73 20  ckey_args.flags 
1d990 3d 20 30 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 69  = 0;..}...for (i
1d9a0 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 28 73  dx = 0; idx < (s
1d9b0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
1d9c0 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28  sions) / sizeof(
1d9d0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
1d9e0 30 5d 29 29 3b 20 69 64 78 2b 2b 29 20 7b 0a 09  0])); idx++) {..
1d9f0 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
1da00 5b 69 64 78 5d 2e 61 63 74 69 76 65 20 3d 20 30  [idx].active = 0
1da10 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 64 78 20  ;..}...for (idx 
1da20 3d 20 30 3b 20 69 64 78 20 3c 20 28 73 69 7a 65  = 0; idx < (size
1da30 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29  of(cackey_slots)
1da40 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
1da50 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b 20 69 64 78  _slots[0])); idx
1da60 2b 2b 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 73  ++) {...cackey_s
1da70 6c 6f 74 73 5b 69 64 78 5d 2e 61 63 74 69 76 65  lots[idx].active
1da80 20 3d 20 30 3b 0a 09 09 63 61 63 6b 65 79 5f 73   = 0;...cackey_s
1da90 6c 6f 74 73 5b 69 64 78 5d 2e 70 63 73 63 5f 72  lots[idx].pcsc_r
1daa0 65 61 64 65 72 20 3d 20 4e 55 4c 4c 3b 0a 09 09  eader = NULL;...
1dab0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78  cackey_slots[idx
1dac0 5d 2e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65  ].transaction_de
1dad0 70 74 68 20 3d 20 30 3b 0a 09 09 63 61 63 6b 65  pth = 0;...cacke
1dae0 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 74 72 61  y_slots[idx].tra
1daf0 6e 73 61 63 74 69 6f 6e 5f 6e 65 65 64 5f 68 77  nsaction_need_hw
1db00 5f 6c 6f 63 6b 20 3d 20 30 3b 0a 09 09 63 61 63  _lock = 0;...cac
1db10 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 73  key_slots[idx].s
1db20 6c 6f 74 5f 72 65 73 65 74 20 3d 20 30 3b 0a 09  lot_reset = 0;..
1db30 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64  .cackey_slots[id
1db40 78 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 3d  x].token_flags =
1db50 20 30 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f   0;...cackey_slo
1db60 74 73 5b 69 64 78 5d 2e 6c 61 62 65 6c 20 3d 20  ts[idx].label = 
1db70 4e 55 4c 4c 3b 0a 09 09 63 61 63 6b 65 79 5f 73  NULL;...cackey_s
1db80 6c 6f 74 73 5b 69 64 78 5d 2e 69 6e 74 65 72 6e  lots[idx].intern
1db90 61 6c 20 3d 20 30 3b 0a 09 7d 0a 0a 23 69 66 64  al = 0;..}..#ifd
1dba0 65 66 20 43 41 43 4b 45 59 5f 4e 4f 5f 45 58 54  ef CACKEY_NO_EXT
1dbb0 52 41 5f 43 45 52 54 53 0a 09 69 66 20 28 67 65  RA_CERTS..if (ge
1dbc0 74 65 6e 76 28 22 43 41 43 4b 45 59 5f 45 58 54  tenv("CACKEY_EXT
1dbd0 52 41 5f 43 45 52 54 53 22 29 20 21 3d 20 4e 55  RA_CERTS") != NU
1dbe0 4c 4c 29 20 7b 0a 09 09 69 6e 63 6c 75 64 65 5f  LL) {...include_
1dbf0 64 6f 64 5f 63 65 72 74 73 20 3d 20 31 3b 0a 09  dod_certs = 1;..
1dc00 7d 20 65 6c 73 65 20 7b 0a 09 09 69 6e 63 6c 75  } else {...inclu
1dc10 64 65 5f 64 6f 64 5f 63 65 72 74 73 20 3d 20 30  de_dod_certs = 0
1dc20 3b 0a 09 7d 0a 23 65 6c 73 65 0a 09 69 66 20 28  ;..}.#else..if (
1dc30 67 65 74 65 6e 76 28 22 43 41 43 4b 45 59 5f 4e  getenv("CACKEY_N
1dc40 4f 5f 45 58 54 52 41 5f 43 45 52 54 53 22 29 20  O_EXTRA_CERTS") 
1dc50 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 69 6e 63  != NULL) {...inc
1dc60 6c 75 64 65 5f 64 6f 64 5f 63 65 72 74 73 20 3d  lude_dod_certs =
1dc70 20 30 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09   0;..} else {...
1dc80 69 6e 63 6c 75 64 65 5f 64 6f 64 5f 63 65 72 74  include_dod_cert
1dc90 73 20 3d 20 31 3b 0a 09 7d 0a 23 65 6e 64 69 66  s = 1;..}.#endif
1dca0 0a 0a 09 69 66 20 28 69 6e 63 6c 75 64 65 5f 64  ...if (include_d
1dcb0 6f 64 5f 63 65 72 74 73 20 3d 3d 20 30 29 20 7b  od_certs == 0) {
1dcc0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1dcd0 50 52 49 4e 54 46 28 22 41 73 6b 65 64 20 6e 6f  PRINTF("Asked no
1dce0 74 20 74 6f 20 69 6e 63 6c 75 64 65 20 44 6f 44  t to include DoD
1dcf0 20 63 65 72 74 69 66 69 63 61 74 65 73 22 29 3b   certificates");
1dd00 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 68 69 67  ..} else {...hig
1dd10 68 65 73 74 5f 73 6c 6f 74 20 3d 20 28 73 69 7a  hest_slot = (siz
1dd20 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
1dd30 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
1dd40 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 20 2d 20 31  y_slots[0])) - 1
1dd50 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  ;....CACKEY_DEBU
1dd60 47 5f 50 52 49 4e 54 46 28 22 49 6e 63 6c 75 64  G_PRINTF("Includ
1dd70 69 6e 67 20 44 6f 44 20 63 65 72 74 73 20 69 6e  ing DoD certs in
1dd80 20 73 6c 6f 74 20 25 6c 75 22 2c 20 28 75 6e 73   slot %lu", (uns
1dd90 69 67 6e 65 64 20 6c 6f 6e 67 29 20 68 69 67 68  igned long) high
1dda0 65 73 74 5f 73 6c 6f 74 29 3b 0a 0a 09 09 63 61  est_slot);....ca
1ddb0 63 6b 65 79 5f 73 6c 6f 74 73 5b 68 69 67 68 65  ckey_slots[highe
1ddc0 73 74 5f 73 6c 6f 74 5d 2e 61 63 74 69 76 65 20  st_slot].active 
1ddd0 3d 20 31 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c  = 1;...cackey_sl
1dde0 6f 74 73 5b 68 69 67 68 65 73 74 5f 73 6c 6f 74  ots[highest_slot
1ddf0 5d 2e 69 6e 74 65 72 6e 61 6c 20 3d 20 31 3b 0a  ].internal = 1;.
1de00 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 68  ..cackey_slots[h
1de10 69 67 68 65 73 74 5f 73 6c 6f 74 5d 2e 6c 61 62  ighest_slot].lab
1de20 65 6c 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63  el = (unsigned c
1de30 68 61 72 20 2a 29 20 22 55 53 20 47 6f 76 65 72  har *) "US Gover
1de40 6e 6d 65 6e 74 20 43 65 72 74 69 66 69 63 61 74  nment Certificat
1de50 65 73 22 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c  es";...cackey_sl
1de60 6f 74 73 5b 68 69 67 68 65 73 74 5f 73 6c 6f 74  ots[highest_slot
1de70 5d 2e 70 63 73 63 5f 72 65 61 64 65 72 20 3d 20  ].pcsc_reader = 
1de80 22 43 41 43 4b 65 79 22 3b 0a 09 09 63 61 63 6b  "CACKey";...cack
1de90 65 79 5f 73 6c 6f 74 73 5b 68 69 67 68 65 73 74  ey_slots[highest
1dea0 5f 73 6c 6f 74 5d 2e 74 6f 6b 65 6e 5f 66 6c 61  _slot].token_fla
1deb0 67 73 20 3d 20 30 3b 0a 09 7d 0a 0a 09 63 61 63  gs = 0;..}...cac
1dec0 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 20  key_initialized 
1ded0 3d 20 31 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  = 1;...if (!cack
1dee0 65 79 5f 62 69 67 6c 6f 63 6b 5f 69 6e 69 74 29  ey_biglock_init)
1def0 20 7b 0a 09 09 6d 75 74 65 78 5f 69 6e 69 74 5f   {...mutex_init_
1df00 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  ret = cackey_mut
1df10 65 78 5f 63 72 65 61 74 65 28 26 63 61 63 6b 65  ex_create(&cacke
1df20 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 69  y_biglock);....i
1df30 66 20 28 6d 75 74 65 78 5f 69 6e 69 74 5f 72 65  f (mutex_init_re
1df40 74 20 21 3d 20 30 29 20 7b 0a 09 09 09 43 41 43  t != 0) {....CAC
1df50 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1df60 28 22 45 72 72 6f 72 2e 20 20 4d 75 74 65 78 20  ("Error.  Mutex 
1df70 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 66  initialization f
1df80 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 09 72 65  ailed.");.....re
1df90 74 75 72 6e 28 43 4b 52 5f 43 41 4e 54 5f 4c 4f  turn(CKR_CANT_LO
1dfa0 43 4b 29 3b 0a 09 09 7d 0a 0a 09 09 63 61 63 6b  CK);...}....cack
1dfb0 65 79 5f 62 69 67 6c 6f 63 6b 5f 69 6e 69 74 20  ey_biglock_init 
1dfc0 3d 20 31 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65 66  = 1;..}.../* Def
1dfd0 69 6e 65 20 61 20 63 6f 6d 6d 61 6e 64 20 74 6f  ine a command to
1dfe0 20 70 72 6f 6d 70 74 20 75 73 65 72 20 66 6f 72   prompt user for
1dff0 20 61 20 50 49 4e 20 2a 2f 0a 23 69 66 64 65 66   a PIN */.#ifdef
1e000 20 43 41 43 4b 45 59 5f 50 49 4e 5f 43 4f 4d 4d   CACKEY_PIN_COMM
1e010 41 4e 44 5f 44 45 46 41 55 4c 54 0a 09 63 61 63  AND_DEFAULT..cac
1e020 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20  key_pin_command 
1e030 3d 20 73 74 72 64 75 70 28 43 41 43 4b 45 59 5f  = strdup(CACKEY_
1e040 4d 41 43 52 4f 5f 44 45 46 41 55 4c 54 5f 58 53  MACRO_DEFAULT_XS
1e050 54 52 28 43 41 43 4b 45 59 5f 50 49 4e 5f 43 4f  TR(CACKEY_PIN_CO
1e060 4d 4d 41 4e 44 5f 44 45 46 41 55 4c 54 29 29 3b  MMAND_DEFAULT));
1e070 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
1e080 43 41 43 4b 45 59 5f 50 49 4e 5f 43 4f 4d 4d 41  CACKEY_PIN_COMMA
1e090 4e 44 5f 58 4f 4e 4c 59 5f 44 45 46 41 55 4c 54  ND_XONLY_DEFAULT
1e0a0 0a 09 69 66 20 28 67 65 74 65 6e 76 28 22 44 49  ..if (getenv("DI
1e0b0 53 50 4c 41 59 22 29 20 21 3d 20 4e 55 4c 4c 29  SPLAY") != NULL)
1e0c0 20 7b 0a 09 09 63 61 63 6b 65 79 5f 70 69 6e 5f   {...cackey_pin_
1e0d0 63 6f 6d 6d 61 6e 64 20 3d 20 73 74 72 64 75 70  command = strdup
1e0e0 28 43 41 43 4b 45 59 5f 4d 41 43 52 4f 5f 44 45  (CACKEY_MACRO_DE
1e0f0 46 41 55 4c 54 5f 58 53 54 52 28 43 41 43 4b 45  FAULT_XSTR(CACKE
1e100 59 5f 50 49 4e 5f 43 4f 4d 4d 41 4e 44 5f 58 4f  Y_PIN_COMMAND_XO
1e110 4e 4c 59 5f 44 45 46 41 55 4c 54 29 29 3b 0a 09  NLY_DEFAULT));..
1e120 7d 0a 23 65 6e 64 69 66 0a 0a 09 69 66 20 28 67  }.#endif...if (g
1e130 65 74 65 6e 76 28 22 43 41 43 4b 45 59 5f 50 49  etenv("CACKEY_PI
1e140 4e 5f 43 4f 4d 4d 41 4e 44 22 29 20 21 3d 20 4e  N_COMMAND") != N
1e150 55 4c 4c 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  ULL) {...cackey_
1e160 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20 3d 20 73 74  pin_command = st
1e170 72 64 75 70 28 67 65 74 65 6e 76 28 22 43 41 43  rdup(getenv("CAC
1e180 4b 45 59 5f 50 49 4e 5f 43 4f 4d 4d 41 4e 44 22  KEY_PIN_COMMAND"
1e190 29 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 67 65 74  ));..}...if (get
1e1a0 65 6e 76 28 22 43 41 43 4b 45 59 5f 50 49 4e 5f  env("CACKEY_PIN_
1e1b0 43 4f 4d 4d 41 4e 44 5f 58 4f 4e 4c 59 22 29 20  COMMAND_XONLY") 
1e1c0 21 3d 20 4e 55 4c 4c 20 26 26 20 67 65 74 65 6e  != NULL && geten
1e1d0 76 28 22 44 49 53 50 4c 41 59 22 29 20 21 3d 20  v("DISPLAY") != 
1e1e0 4e 55 4c 4c 29 20 7b 0a 09 09 63 61 63 6b 65 79  NULL) {...cackey
1e1f0 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20 3d 20 73  _pin_command = s
1e200 74 72 64 75 70 28 67 65 74 65 6e 76 28 22 43 41  trdup(getenv("CA
1e210 43 4b 45 59 5f 50 49 4e 5f 43 4f 4d 4d 41 4e 44  CKEY_PIN_COMMAND
1e220 5f 58 4f 4e 4c 59 22 29 29 3b 0a 09 7d 0a 0a 23  _XONLY"));..}..#
1e230 69 66 64 65 66 20 43 41 43 4b 45 59 5f 52 45 41  ifdef CACKEY_REA
1e240 44 45 52 53 5f 49 4e 43 4c 55 44 45 5f 4f 4e 4c  DERS_INCLUDE_ONL
1e250 59 5f 44 45 46 41 55 4c 54 0a 09 63 61 63 6b 65  Y_DEFAULT..cacke
1e260 79 5f 72 65 61 64 65 72 73 5f 69 6e 63 6c 75 64  y_readers_includ
1e270 65 5f 6f 6e 6c 79 20 3d 20 73 74 72 64 75 70 28  e_only = strdup(
1e280 43 41 43 4b 45 59 5f 4d 41 43 52 4f 5f 44 45 46  CACKEY_MACRO_DEF
1e290 41 55 4c 54 5f 58 53 54 52 28 43 41 43 4b 45 59  AULT_XSTR(CACKEY
1e2a0 5f 52 45 41 44 45 52 53 5f 49 4e 43 4c 55 44 45  _READERS_INCLUDE
1e2b0 5f 4f 4e 4c 59 5f 44 45 46 41 55 4c 54 29 29 3b  _ONLY_DEFAULT));
1e2c0 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
1e2d0 43 41 43 4b 45 59 5f 52 45 41 44 45 52 53 5f 45  CACKEY_READERS_E
1e2e0 58 43 4c 55 44 45 5f 44 45 46 41 55 4c 54 0a 09  XCLUDE_DEFAULT..
1e2f0 63 61 63 6b 65 79 5f 72 65 61 64 65 72 73 5f 65  cackey_readers_e
1e300 78 63 6c 75 64 65 20 3d 20 73 74 72 64 75 70 28  xclude = strdup(
1e310 43 41 43 4b 45 59 5f 4d 41 43 52 4f 5f 44 45 46  CACKEY_MACRO_DEF
1e320 41 55 4c 54 5f 58 53 54 52 28 43 41 43 4b 45 59  AULT_XSTR(CACKEY
1e330 5f 52 45 41 44 45 52 53 5f 45 58 43 4c 55 44 45  _READERS_EXCLUDE
1e340 5f 44 45 46 41 55 4c 54 29 29 3b 0a 23 65 6e 64  _DEFAULT));.#end
1e350 69 66 0a 0a 09 69 66 20 28 67 65 74 65 6e 76 28  if...if (getenv(
1e360 22 43 41 43 4b 45 59 5f 52 45 41 44 45 52 53 5f  "CACKEY_READERS_
1e370 49 4e 43 4c 55 44 45 5f 4f 4e 4c 59 22 29 20 21  INCLUDE_ONLY") !
1e380 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 63 61 63 6b  = NULL) {...cack
1e390 65 79 5f 72 65 61 64 65 72 73 5f 69 6e 63 6c 75  ey_readers_inclu
1e3a0 64 65 5f 6f 6e 6c 79 20 3d 20 73 74 72 64 75 70  de_only = strdup
1e3b0 28 67 65 74 65 6e 76 28 22 43 41 43 4b 45 59 5f  (getenv("CACKEY_
1e3c0 52 45 41 44 45 52 53 5f 49 4e 43 4c 55 44 45 5f  READERS_INCLUDE_
1e3d0 4f 4e 4c 59 22 29 29 3b 0a 0a 09 09 69 66 20 28  ONLY"));....if (
1e3e0 63 61 63 6b 65 79 5f 72 65 61 64 65 72 73 5f 69  cackey_readers_i
1e3f0 6e 63 6c 75 64 65 5f 6f 6e 6c 79 5b 30 5d 20 3d  nclude_only[0] =
1e400 3d 20 27 5c 30 27 29 20 7b 0a 09 09 09 66 72 65  = '\0') {....fre
1e410 65 28 63 61 63 6b 65 79 5f 72 65 61 64 65 72 73  e(cackey_readers
1e420 5f 69 6e 63 6c 75 64 65 5f 6f 6e 6c 79 29 3b 0a  _include_only);.
1e430 0a 09 09 09 63 61 63 6b 65 79 5f 72 65 61 64 65  ....cackey_reade
1e440 72 73 5f 69 6e 63 6c 75 64 65 5f 6f 6e 6c 79 20  rs_include_only 
1e450 3d 20 4e 55 4c 4c 3b 0a 09 09 7d 0a 09 7d 0a 0a  = NULL;...}..}..
1e460 09 69 66 20 28 67 65 74 65 6e 76 28 22 43 41 43  .if (getenv("CAC
1e470 4b 45 59 5f 52 45 41 44 45 52 53 5f 45 58 43 4c  KEY_READERS_EXCL
1e480 55 44 45 22 29 20 21 3d 20 4e 55 4c 4c 29 20 7b  UDE") != NULL) {
1e490 0a 09 09 63 61 63 6b 65 79 5f 72 65 61 64 65 72  ...cackey_reader
1e4a0 73 5f 65 78 63 6c 75 64 65 20 3d 20 73 74 72 64  s_exclude = strd
1e4b0 75 70 28 67 65 74 65 6e 76 28 22 43 41 43 4b 45  up(getenv("CACKE
1e4c0 59 5f 52 45 41 44 45 52 53 5f 45 58 43 4c 55 44  Y_READERS_EXCLUD
1e4d0 45 22 29 29 3b 0a 0a 09 09 69 66 20 28 63 61 63  E"));....if (cac
1e4e0 6b 65 79 5f 72 65 61 64 65 72 73 5f 65 78 63 6c  key_readers_excl
1e4f0 75 64 65 5b 30 5d 20 3d 3d 20 27 5c 30 27 29 20  ude[0] == '\0') 
1e500 7b 0a 09 09 09 66 72 65 65 28 63 61 63 6b 65 79  {....free(cackey
1e510 5f 72 65 61 64 65 72 73 5f 65 78 63 6c 75 64 65  _readers_exclude
1e520 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 72 65  );.....cackey_re
1e530 61 64 65 72 73 5f 65 78 63 6c 75 64 65 20 3d 20  aders_exclude = 
1e540 4e 55 4c 4c 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 43  NULL;...}..}...C
1e550 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1e560 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
1e570 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f  R_OK (%i)", CKR_
1e580 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  OK);...return(CK
1e590 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  R_OK);.}..CK_DEF
1e5a0 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
1e5b0 52 56 2c 20 43 5f 46 69 6e 61 6c 69 7a 65 29 28  RV, C_Finalize)(
1e5c0 43 4b 5f 56 4f 49 44 5f 50 54 52 20 70 52 65 73  CK_VOID_PTR pRes
1e5d0 65 72 76 65 64 29 20 7b 0a 09 75 69 6e 74 33 32  erved) {..uint32
1e5e0 5f 74 20 69 64 78 3b 0a 0a 09 43 41 43 4b 45 59  _t idx;...CACKEY
1e5f0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
1e600 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
1e610 70 52 65 73 65 72 76 65 64 20 21 3d 20 4e 55 4c  pReserved != NUL
1e620 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
1e630 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1e640 72 2e 20 70 52 65 73 65 72 76 65 64 20 69 73 20  r. pReserved is 
1e650 6e 6f 74 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09  not NULL.");....
1e660 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d  return(CKR_ARGUM
1e670 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09  ENTS_BAD);..}...
1e680 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
1e690 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
1e6a0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1e6b0 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
1e6c0 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
1e6d0 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
1e6e0 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
1e6f0 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 66 6f 72 20  IZED);..}...for 
1e700 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20  (idx = 0; idx < 
1e710 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
1e720 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f  essions) / sizeo
1e730 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
1e740 73 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29 20 7b  s[0])); idx++) {
1e750 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65  ...if (cackey_se
1e760 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 61 63 74 69  ssions[idx].acti
1e770 76 65 29 20 7b 0a 09 09 09 43 5f 43 6c 6f 73 65  ve) {....C_Close
1e780 53 65 73 73 69 6f 6e 28 69 64 78 29 3b 0a 09 09  Session(idx);...
1e790 7d 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 6c  }..}...cackey_sl
1e7a0 6f 74 73 5f 64 69 73 63 6f 6e 6e 65 63 74 5f 61  ots_disconnect_a
1e7b0 6c 6c 28 29 3b 0a 0a 09 66 6f 72 20 28 69 64 78  ll();...for (idx
1e7c0 20 3d 20 30 3b 20 69 64 78 20 3c 20 28 73 69 7a   = 0; idx < (siz
1e7d0 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
1e7e0 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
1e7f0 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b 20 69 64  y_slots[0])); id
1e800 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28 63 61 63  x++) {...if (cac
1e810 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 69  key_slots[idx].i
1e820 6e 74 65 72 6e 61 6c 29 20 7b 0a 09 09 09 63 6f  nternal) {....co
1e830 6e 74 69 6e 75 65 3b 0a 09 09 7d 0a 0a 09 09 69  ntinue;...}....i
1e840 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  f (cackey_slots[
1e850 69 64 78 5d 2e 70 63 73 63 5f 72 65 61 64 65 72  idx].pcsc_reader
1e860 29 20 7b 0a 09 09 09 66 72 65 65 28 63 61 63 6b  ) {....free(cack
1e870 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 70 63  ey_slots[idx].pc
1e880 73 63 5f 72 65 61 64 65 72 29 3b 0a 09 09 7d 0a  sc_reader);...}.
1e890 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c  ...if (cackey_sl
1e8a0 6f 74 73 5b 69 64 78 5d 2e 63 61 63 68 65 64 5f  ots[idx].cached_
1e8b0 63 65 72 74 73 29 20 7b 0a 09 09 09 63 61 63 6b  certs) {....cack
1e8c0 65 79 5f 66 72 65 65 5f 63 65 72 74 73 28 63 61  ey_free_certs(ca
1e8d0 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e  ckey_slots[idx].
1e8e0 63 61 63 68 65 64 5f 63 65 72 74 73 2c 20 63 61  cached_certs, ca
1e8f0 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e  ckey_slots[idx].
1e900 63 61 63 68 65 64 5f 63 65 72 74 73 5f 63 6f 75  cached_certs_cou
1e910 6e 74 2c 20 31 29 3b 0a 0a 09 09 09 63 61 63 6b  nt, 1);.....cack
1e920 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 63 61  ey_slots[idx].ca
1e930 63 68 65 64 5f 63 65 72 74 73 20 3d 20 4e 55 4c  ched_certs = NUL
1e940 4c 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 63 61 63 6b  L;...}..}...cack
1e950 65 79 5f 70 63 73 63 5f 64 69 73 63 6f 6e 6e 65  ey_pcsc_disconne
1e960 63 74 28 29 3b 0a 0a 09 69 66 20 28 63 61 63 6b  ct();...if (cack
1e970 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20 21  ey_pin_command !
1e980 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 66 72 65 65  = NULL) {...free
1e990 28 63 61 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d  (cackey_pin_comm
1e9a0 61 6e 64 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f  and);....cackey_
1e9b0 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20 3d 20 4e 55  pin_command = NU
1e9c0 4c 4c 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63  LL;..}...if (cac
1e9d0 6b 65 79 5f 72 65 61 64 65 72 73 5f 69 6e 63 6c  key_readers_incl
1e9e0 75 64 65 5f 6f 6e 6c 79 20 21 3d 20 4e 55 4c 4c  ude_only != NULL
1e9f0 29 20 7b 0a 09 09 66 72 65 65 28 63 61 63 6b 65  ) {...free(cacke
1ea00 79 5f 72 65 61 64 65 72 73 5f 69 6e 63 6c 75 64  y_readers_includ
1ea10 65 5f 6f 6e 6c 79 29 3b 0a 0a 09 09 63 61 63 6b  e_only);....cack
1ea20 65 79 5f 72 65 61 64 65 72 73 5f 69 6e 63 6c 75  ey_readers_inclu
1ea30 64 65 5f 6f 6e 6c 79 20 3d 20 4e 55 4c 4c 3b 0a  de_only = NULL;.
1ea40 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f  .}...if (cackey_
1ea50 72 65 61 64 65 72 73 5f 65 78 63 6c 75 64 65 20  readers_exclude 
1ea60 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 66 72 65  != NULL) {...fre
1ea70 65 28 63 61 63 6b 65 79 5f 72 65 61 64 65 72 73  e(cackey_readers
1ea80 5f 65 78 63 6c 75 64 65 29 3b 0a 0a 09 09 63 61  _exclude);....ca
1ea90 63 6b 65 79 5f 72 65 61 64 65 72 73 5f 65 78 63  ckey_readers_exc
1eaa0 6c 75 64 65 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a  lude = NULL;..}.
1eab0 0a 09 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  ..cackey_initial
1eac0 69 7a 65 64 20 3d 20 30 3b 0a 0a 09 43 41 43 4b  ized = 0;...CACK
1ead0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1eae0 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
1eaf0 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29  K (%i)", CKR_OK)
1eb00 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ;...return(CKR_O
1eb10 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  K);.}..CK_DEFINE
1eb20 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
1eb30 20 43 5f 47 65 74 49 6e 66 6f 29 28 43 4b 5f 49   C_GetInfo)(CK_I
1eb40 4e 46 4f 5f 50 54 52 20 70 49 6e 66 6f 29 20 7b  NFO_PTR pInfo) {
1eb50 0a 09 73 74 61 74 69 63 20 43 4b 5f 55 54 46 38  ..static CK_UTF8
1eb60 43 48 41 52 20 6d 61 6e 75 66 61 63 74 75 72 65  CHAR manufacture
1eb70 72 49 44 5b 5d 20 3d 20 22 55 2e 53 2e 20 47 6f  rID[] = "U.S. Go
1eb80 76 65 72 6e 6d 65 6e 74 22 3b 0a 09 73 74 61 74  vernment";..stat
1eb90 69 63 20 43 4b 5f 55 54 46 38 43 48 41 52 20 6c  ic CK_UTF8CHAR l
1eba0 69 62 72 61 72 79 44 65 73 63 72 69 70 74 69 6f  ibraryDescriptio
1ebb0 6e 5b 5d 20 3d 20 22 43 41 43 4b 65 79 22 3b 0a  n[] = "CACKey";.
1ebc0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1ebd0 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
1ebe0 3b 0a 0a 09 69 66 20 28 70 49 6e 66 6f 20 3d 3d  ;...if (pInfo ==
1ebf0 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
1ec00 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1ec10 45 72 72 6f 72 2e 20 70 49 6e 66 6f 20 69 73 20  Error. pInfo is 
1ec20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75  NULL.");....retu
1ec30 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53  rn(CKR_ARGUMENTS
1ec40 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  _BAD);..}...if (
1ec50 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
1ec60 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
1ec70 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1ec80 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
1ec90 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
1eca0 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
1ecb0 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
1ecc0 29 3b 0a 09 7d 0a 0a 09 70 49 6e 66 6f 2d 3e 63  );..}...pInfo->c
1ecd0 72 79 70 74 6f 6b 69 56 65 72 73 69 6f 6e 2e 6d  ryptokiVersion.m
1ece0 61 6a 6f 72 20 3d 20 28 28 43 41 43 4b 45 59 5f  ajor = ((CACKEY_
1ecf0 43 52 59 50 54 4f 4b 49 5f 56 45 52 53 49 4f 4e  CRYPTOKI_VERSION
1ed00 5f 43 4f 44 45 29 20 3e 3e 20 31 36 29 20 26 20  _CODE) >> 16) & 
1ed10 30 78 66 66 3b 0a 09 70 49 6e 66 6f 2d 3e 63 72  0xff;..pInfo->cr
1ed20 79 70 74 6f 6b 69 56 65 72 73 69 6f 6e 2e 6d 69  yptokiVersion.mi
1ed30 6e 6f 72 20 3d 20 28 28 43 41 43 4b 45 59 5f 43  nor = ((CACKEY_C
1ed40 52 59 50 54 4f 4b 49 5f 56 45 52 53 49 4f 4e 5f  RYPTOKI_VERSION_
1ed50 43 4f 44 45 29 20 3e 3e 20 38 29 20 26 20 30 78  CODE) >> 8) & 0x
1ed60 66 66 3b 0a 0a 09 6d 65 6d 73 65 74 28 70 49 6e  ff;...memset(pIn
1ed70 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 72  fo->manufacturer
1ed80 49 44 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 28  ID, ' ', sizeof(
1ed90 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75  pInfo->manufactu
1eda0 72 65 72 49 44 29 29 3b 0a 09 6d 65 6d 63 70 79  rerID));..memcpy
1edb0 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74  (pInfo->manufact
1edc0 75 72 65 72 49 44 2c 20 6d 61 6e 75 66 61 63 74  urerID, manufact
1edd0 75 72 65 72 49 44 2c 20 73 69 7a 65 6f 66 28 6d  urerID, sizeof(m
1ede0 61 6e 75 66 61 63 74 75 72 65 72 49 44 29 20 2d  anufacturerID) -
1edf0 20 31 29 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 66 6c   1);...pInfo->fl
1ee00 61 67 73 20 3d 20 30 78 30 30 3b 0a 0a 09 6d 65  ags = 0x00;...me
1ee10 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 6c 69 62 72  mset(pInfo->libr
1ee20 61 72 79 44 65 73 63 72 69 70 74 69 6f 6e 2c 20  aryDescription, 
1ee30 27 20 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66  ' ', sizeof(pInf
1ee40 6f 2d 3e 6c 69 62 72 61 72 79 44 65 73 63 72 69  o->libraryDescri
1ee50 70 74 69 6f 6e 29 29 3b 0a 09 6d 65 6d 63 70 79  ption));..memcpy
1ee60 28 70 49 6e 66 6f 2d 3e 6c 69 62 72 61 72 79 44  (pInfo->libraryD
1ee70 65 73 63 72 69 70 74 69 6f 6e 2c 20 6c 69 62 72  escription, libr
1ee80 61 72 79 44 65 73 63 72 69 70 74 69 6f 6e 2c 20  aryDescription, 
1ee90 73 69 7a 65 6f 66 28 6c 69 62 72 61 72 79 44 65  sizeof(libraryDe
1eea0 73 63 72 69 70 74 69 6f 6e 29 20 2d 20 31 29 3b  scription) - 1);
1eeb0 0a 0a 09 70 49 6e 66 6f 2d 3e 6c 69 62 72 61 72  ...pInfo->librar
1eec0 79 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d  yVersion.major =
1eed0 20 28 63 61 63 6b 65 79 5f 67 65 74 76 65 72 73   (cackey_getvers
1eee0 69 6f 6e 28 29 20 3e 3e 20 31 36 29 20 26 20 30  ion() >> 16) & 0
1eef0 78 66 66 3b 0a 09 70 49 6e 66 6f 2d 3e 6c 69 62  xff;..pInfo->lib
1ef00 72 61 72 79 56 65 72 73 69 6f 6e 2e 6d 69 6e 6f  raryVersion.mino
1ef10 72 20 3d 20 28 63 61 63 6b 65 79 5f 67 65 74 76  r = (cackey_getv
1ef20 65 72 73 69 6f 6e 28 29 20 3e 3e 20 38 29 20 26  ersion() >> 8) &
1ef30 20 30 78 66 66 3b 0a 0a 09 43 41 43 4b 45 59 5f   0xff;...CACKEY_
1ef40 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
1ef50 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28  turning CKR_OK (
1ef60 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a  %i)", CKR_OK);..
1ef70 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b  .return(CKR_OK);
1ef80 0a 7d 0a 0a 2f 2a 0a 20 2a 20 50 72 6f 63 65 73  .}../*. * Proces
1ef90 73 20 6c 69 73 74 20 6f 66 20 72 65 61 64 65 72  s list of reader
1efa0 73 2c 20 61 6e 64 20 63 72 65 61 74 65 20 6d 61  s, and create ma
1efb0 70 70 69 6e 67 20 62 65 74 77 65 65 6e 20 72 65  pping between re
1efc0 61 64 65 72 20 6e 61 6d 65 20 61 6e 64 20 73 6c  ader name and sl
1efd0 6f 74 20 49 44 0a 20 2a 2f 0a 43 4b 5f 44 45 46  ot ID. */.CK_DEF
1efe0 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
1eff0 52 56 2c 20 43 5f 47 65 74 53 6c 6f 74 4c 69 73  RV, C_GetSlotLis
1f000 74 29 28 43 4b 5f 42 42 4f 4f 4c 20 74 6f 6b 65  t)(CK_BBOOL toke
1f010 6e 50 72 65 73 65 6e 74 2c 20 43 4b 5f 53 4c 4f  nPresent, CK_SLO
1f020 54 5f 49 44 5f 50 54 52 20 70 53 6c 6f 74 4c 69  T_ID_PTR pSlotLi
1f030 73 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52  st, CK_ULONG_PTR
1f040 20 70 75 6c 43 6f 75 6e 74 29 20 7b 0a 09 73 74   pulCount) {..st
1f050 61 74 69 63 20 69 6e 74 20 66 69 72 73 74 5f 63  atic int first_c
1f060 61 6c 6c 20 3d 20 31 3b 0a 09 69 6e 74 20 6d 75  all = 1;..int mu
1f070 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09 69 6e 74  tex_retval;..int
1f080 20 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65   pcsc_connect_re
1f090 74 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 63 6f 75  t;..CK_ULONG cou
1f0a0 6e 74 2c 20 73 6c 6f 74 5f 63 6f 75 6e 74 20 3d  nt, slot_count =
1f0b0 20 30 2c 20 63 75 72 72 73 6c 6f 74 2c 20 73 6c   0, currslot, sl
1f0c0 6f 74 5f 69 64 78 3b 0a 09 63 68 61 72 20 2a 70  ot_idx;..char *p
1f0d0 63 73 63 5f 72 65 61 64 65 72 73 2c 20 2a 70 63  csc_readers, *pc
1f0e0 73 63 5f 72 65 61 64 65 72 73 5f 73 2c 20 2a 70  sc_readers_s, *p
1f0f0 63 73 63 5f 72 65 61 64 65 72 73 5f 65 3b 0a 09  csc_readers_e;..
1f100 63 68 61 72 20 2a 72 65 61 64 65 72 5f 63 68 65  char *reader_che
1f110 63 6b 5f 70 61 74 74 65 72 6e 3b 0a 09 44 57 4f  ck_pattern;..DWO
1f120 52 44 20 70 63 73 63 5f 72 65 61 64 65 72 73 5f  RD pcsc_readers_
1f130 6c 65 6e 3b 0a 09 4c 4f 4e 47 20 73 63 61 72 64  len;..LONG scard
1f140 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65 74  _listreaders_ret
1f150 3b 0a 09 73 69 7a 65 5f 74 20 63 75 72 72 5f 72  ;..size_t curr_r
1f160 65 61 64 65 72 5f 6c 65 6e 3b 0a 09 69 6e 74 20  eader_len;..int 
1f170 73 6c 6f 74 5f 72 65 73 65 74 3b 0a 09 69 6e 74  slot_reset;..int
1f180 20 69 6e 63 6c 75 64 65 5f 72 65 61 64 65 72 3b   include_reader;
1f190 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1f1a0 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
1f1b0 29 3b 0a 0a 09 69 66 20 28 70 75 6c 43 6f 75 6e  );...if (pulCoun
1f1c0 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  t == NULL) {...C
1f1d0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1f1e0 54 46 28 22 45 72 72 6f 72 2e 20 70 75 6c 43 6f  TF("Error. pulCo
1f1f0 75 6e 74 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a  unt is NULL.");.
1f200 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52  ...return(CKR_AR
1f210 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d  GUMENTS_BAD);..}
1f220 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
1f230 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
1f240 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1f250 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
1f260 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
1f270 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
1f280 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
1f290 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 6d  IALIZED);..}...m
1f2a0 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
1f2b0 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28  ckey_mutex_lock(
1f2c0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
1f2d0 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
1f2e0 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
1f2f0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1f300 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e  ("Error.  Lockin
1f310 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
1f320 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
1f330 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
1f340 2f 2a 20 43 6c 65 61 72 20 6c 69 73 74 20 6f 66  /* Clear list of
1f350 20 73 6c 6f 74 73 20 2a 2f 0a 09 73 6c 6f 74 5f   slots */..slot_
1f360 72 65 73 65 74 20 3d 20 30 3b 0a 09 69 66 20 28  reset = 0;..if (
1f370 70 53 6c 6f 74 4c 69 73 74 29 20 7b 0a 09 09 69  pSlotList) {...i
1f380 66 20 28 66 69 72 73 74 5f 63 61 6c 6c 29 20 7b  f (first_call) {
1f390 0a 09 09 09 66 69 72 73 74 5f 63 61 6c 6c 20 3d  ....first_call =
1f3a0 20 30 3b 0a 0a 09 09 09 73 6c 6f 74 5f 72 65 73   0;.....slot_res
1f3b0 65 74 20 3d 20 31 3b 0a 09 09 7d 0a 0a 09 09 2f  et = 1;...}..../
1f3c0 2a 20 49 66 20 61 6e 79 20 6f 66 20 74 68 65 20  * If any of the 
1f3d0 73 6c 6f 74 73 20 68 61 76 65 20 62 65 65 6e 20  slots have been 
1f3e0 72 65 73 65 74 20 74 68 65 6e 20 70 75 72 67 65  reset then purge
1f3f0 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   all information
1f400 20 61 6e 64 20 63 68 65 63 6b 20 61 67 61 69 6e   and check again
1f410 20 2a 2f 0a 09 09 66 6f 72 20 28 63 75 72 72 73   */...for (currs
1f420 6c 6f 74 20 3d 20 30 3b 20 63 75 72 72 73 6c 6f  lot = 0; currslo
1f430 74 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b  t < (sizeof(cack
1f440 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65  ey_slots) / size
1f450 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  of(cackey_slots[
1f460 30 5d 29 29 3b 20 63 75 72 72 73 6c 6f 74 2b 2b  0])); currslot++
1f470 29 20 7b 0a 09 09 09 69 66 20 28 63 61 63 6b 65  ) {....if (cacke
1f480 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74  y_slots[currslot
1f490 5d 2e 69 6e 74 65 72 6e 61 6c 29 20 7b 0a 09 09  ].internal) {...
1f4a0 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 7d  ..continue;....}
1f4b0 0a 0a 09 09 09 69 66 20 28 21 63 61 63 6b 65 79  .....if (!cackey
1f4c0 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d  _slots[currslot]
1f4d0 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 09 09 63  .active) {.....c
1f4e0 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a 09  ontinue;....}...
1f4f0 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f  ..if (cackey_slo
1f500 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 73 6c 6f  ts[currslot].slo
1f510 74 5f 72 65 73 65 74 29 20 7b 0a 09 09 09 09 73  t_reset) {.....s
1f520 6c 6f 74 5f 72 65 73 65 74 20 3d 20 31 3b 0a 0a  lot_reset = 1;..
1f530 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 7d 0a  ....break;....}.
1f540 09 09 7d 0a 0a 09 09 69 66 20 28 73 6c 6f 74 5f  ..}....if (slot_
1f550 72 65 73 65 74 29 20 7b 0a 09 09 09 43 41 43 4b  reset) {....CACK
1f560 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1f570 22 50 75 72 67 69 6e 67 20 61 6c 6c 20 73 6c 6f  "Purging all slo
1f580 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 22 29  t information.")
1f590 3b 0a 0a 09 09 09 2f 2a 20 4f 6e 6c 79 20 75 70  ;...../* Only up
1f5a0 64 61 74 65 20 74 68 65 20 6c 69 73 74 20 6f 66  date the list of
1f5b0 20 73 6c 6f 74 73 20 69 66 20 77 65 20 61 72 65   slots if we are
1f5c0 20 61 63 74 75 61 6c 6c 79 20 62 65 69 6e 67 20   actually being 
1f5d0 73 75 70 70 6c 79 20 74 68 65 20 73 6c 6f 74 20  supply the slot 
1f5e0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 09  information */..
1f5f0 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5f 64  ..cackey_slots_d
1f600 69 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28 29 3b  isconnect_all();
1f610 0a 0a 09 09 09 66 6f 72 20 28 63 75 72 72 73 6c  .....for (currsl
1f620 6f 74 20 3d 20 30 3b 20 63 75 72 72 73 6c 6f 74  ot = 0; currslot
1f630 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65   < (sizeof(cacke
1f640 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f  y_slots) / sizeo
1f650 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30  f(cackey_slots[0
1f660 5d 29 29 3b 20 63 75 72 72 73 6c 6f 74 2b 2b 29  ])); currslot++)
1f670 20 7b 0a 09 09 09 09 69 66 20 28 63 61 63 6b 65   {.....if (cacke
1f680 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74  y_slots[currslot
1f690 5d 2e 69 6e 74 65 72 6e 61 6c 29 20 7b 0a 09 09  ].internal) {...
1f6a0 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09  ...continue;....
1f6b0 09 7d 0a 0a 09 09 09 09 69 66 20 28 63 61 63 6b  .}......if (cack
1f6c0 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f  ey_slots[currslo
1f6d0 74 5d 2e 70 63 73 63 5f 72 65 61 64 65 72 29 20  t].pcsc_reader) 
1f6e0 7b 0a 09 09 09 09 09 66 72 65 65 28 63 61 63 6b  {......free(cack
1f6f0 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f  ey_slots[currslo
1f700 74 5d 2e 70 63 73 63 5f 72 65 61 64 65 72 29 3b  t].pcsc_reader);
1f710 0a 0a 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c  .......cackey_sl
1f720 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 70 63  ots[currslot].pc
1f730 73 63 5f 72 65 61 64 65 72 20 3d 20 4e 55 4c 4c  sc_reader = NULL
1f740 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69 66 20  ;.....}......if 
1f750 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75  (cackey_slots[cu
1f760 72 72 73 6c 6f 74 5d 2e 6c 61 62 65 6c 29 20 7b  rrslot].label) {
1f770 0a 09 09 09 09 09 66 72 65 65 28 63 61 63 6b 65  ......free(cacke
1f780 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74  y_slots[currslot
1f790 5d 2e 6c 61 62 65 6c 29 3b 0a 0a 09 09 09 09 09  ].label);.......
1f7a0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72  cackey_slots[cur
1f7b0 72 73 6c 6f 74 5d 2e 6c 61 62 65 6c 20 3d 20 4e  rslot].label = N
1f7c0 55 4c 4c 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09  ULL;.....}......
1f7d0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72  cackey_slots[cur
1f7e0 72 73 6c 6f 74 5d 2e 61 63 74 69 76 65 20 3d 20  rslot].active = 
1f7f0 30 3b 0a 09 09 09 7d 0a 09 09 7d 20 65 6c 73 65  0;....}...} else
1f800 20 7b 0a 09 09 09 0a 09 09 7d 0a 09 7d 0a 0a 09   {.......}..}...
1f810 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 6c 69 73  /* Determine lis
1f820 74 20 6f 66 20 72 65 61 64 65 72 73 20 2a 2f 0a  t of readers */.
1f830 09 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65  .pcsc_connect_re
1f840 74 20 3d 20 63 61 63 6b 65 79 5f 70 63 73 63 5f  t = cackey_pcsc_
1f850 63 6f 6e 6e 65 63 74 28 29 3b 0a 2f 2a 20 58 58  connect();./* XX
1f860 58 3a 20 43 41 4e 20 48 41 4e 47 20 48 45 52 45  X: CAN HANG HERE
1f870 20 21 20 2a 2f 0a 09 69 66 20 28 70 63 73 63 5f   ! */..if (pcsc_
1f880 63 6f 6e 6e 65 63 74 5f 72 65 74 20 21 3d 20 43  connect_ret != C
1f890 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29  ACKEY_PCSC_S_OK)
1f8a0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1f8b0 47 5f 50 52 49 4e 54 46 28 22 43 6f 6e 6e 65 63  G_PRINTF("Connec
1f8c0 74 69 6f 6e 20 74 6f 20 50 43 2f 53 43 20 66 61  tion to PC/SC fa
1f8d0 69 6c 65 64 2c 20 61 73 73 75 6d 69 6e 67 20 6e  iled, assuming n
1f8e0 6f 20 73 6c 6f 74 73 22 29 3b 0a 0a 09 09 73 6c  o slots");....sl
1f8f0 6f 74 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 09 7d  ot_count = 0;..}
1f900 20 65 6c 73 65 20 7b 0a 09 09 70 63 73 63 5f 72   else {...pcsc_r
1f910 65 61 64 65 72 73 5f 6c 65 6e 20 3d 20 30 3b 0a  eaders_len = 0;.
1f920 0a 09 09 73 63 61 72 64 5f 6c 69 73 74 72 65 61  ...scard_listrea
1f930 64 65 72 73 5f 72 65 74 20 3d 20 53 43 61 72 64  ders_ret = SCard
1f940 4c 69 73 74 52 65 61 64 65 72 73 28 2a 63 61 63  ListReaders(*cac
1f950 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c  key_pcsc_handle,
1f960 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 26 70 63   NULL, NULL, &pc
1f970 73 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e 29 3b  sc_readers_len);
1f980 0a 0a 09 09 69 66 20 28 73 63 61 72 64 5f 6c 69  ....if (scard_li
1f990 73 74 72 65 61 64 65 72 73 5f 72 65 74 20 3d 3d  streaders_ret ==
1f9a0 20 53 43 41 52 44 5f 46 5f 43 4f 4d 4d 5f 45 52   SCARD_F_COMM_ER
1f9b0 52 4f 52 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  ROR) {....CACKEY
1f9c0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1f9d0 72 72 6f 72 2e 20 53 43 61 72 64 4c 69 73 74 52  rror. SCardListR
1f9e0 65 61 64 65 72 73 28 29 20 72 65 74 75 72 6e 65  eaders() returne
1f9f0 64 20 53 43 41 52 44 5f 46 5f 43 4f 4d 4d 5f 45  d SCARD_F_COMM_E
1fa00 52 52 4f 52 2c 20 61 73 73 75 6d 69 6e 67 20 43  RROR, assuming C
1fa10 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 50 43 2f  onnection to PC/
1fa20 53 43 20 77 65 6e 74 20 61 77 61 79 2e 20 52 65  SC went away. Re
1fa30 63 6f 6e 6e 65 63 74 69 6e 67 2e 22 29 3b 0a 0a  connecting.");..
1fa40 09 09 09 63 61 63 6b 65 79 5f 70 63 73 63 5f 64  ...cackey_pcsc_d
1fa50 69 73 63 6f 6e 6e 65 63 74 28 29 3b 0a 09 09 09  isconnect();....
1fa60 63 61 63 6b 65 79 5f 70 63 73 63 5f 63 6f 6e 6e  cackey_pcsc_conn
1fa70 65 63 74 28 29 3b 0a 0a 09 09 09 43 41 43 4b 45  ect();.....CACKE
1fa80 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1fa90 54 72 79 69 6e 67 20 53 43 61 72 64 4c 69 73 74  Trying SCardList
1faa0 52 65 61 64 65 72 73 28 29 20 61 67 61 69 6e 22  Readers() again"
1fab0 29 3b 0a 09 09 09 73 63 61 72 64 5f 6c 69 73 74  );....scard_list
1fac0 72 65 61 64 65 72 73 5f 72 65 74 20 3d 20 53 43  readers_ret = SC
1fad0 61 72 64 4c 69 73 74 52 65 61 64 65 72 73 28 2a  ardListReaders(*
1fae0 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64  cackey_pcsc_hand
1faf0 6c 65 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20  le, NULL, NULL, 
1fb00 26 70 63 73 63 5f 72 65 61 64 65 72 73 5f 6c 65  &pcsc_readers_le
1fb10 6e 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 73  n);...}....if (s
1fb20 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73  card_listreaders
1fb30 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 53 5f  _ret == SCARD_S_
1fb40 53 55 43 43 45 53 53 20 26 26 20 70 63 73 63 5f  SUCCESS && pcsc_
1fb50 72 65 61 64 65 72 73 5f 6c 65 6e 20 21 3d 20 30  readers_len != 0
1fb60 29 20 7b 0a 09 09 09 70 63 73 63 5f 72 65 61 64  ) {....pcsc_read
1fb70 65 72 73 20 3d 20 6d 61 6c 6c 6f 63 28 70 63 73  ers = malloc(pcs
1fb80 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e 29 3b 0a  c_readers_len);.
1fb90 09 09 09 70 63 73 63 5f 72 65 61 64 65 72 73 5f  ...pcsc_readers_
1fba0 73 20 3d 20 70 63 73 63 5f 72 65 61 64 65 72 73  s = pcsc_readers
1fbb0 3b 0a 0a 09 09 09 73 63 61 72 64 5f 6c 69 73 74  ;.....scard_list
1fbc0 72 65 61 64 65 72 73 5f 72 65 74 20 3d 20 53 43  readers_ret = SC
1fbd0 61 72 64 4c 69 73 74 52 65 61 64 65 72 73 28 2a  ardListReaders(*
1fbe0 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64  cackey_pcsc_hand
1fbf0 6c 65 2c 20 4e 55 4c 4c 2c 20 70 63 73 63 5f 72  le, NULL, pcsc_r
1fc00 65 61 64 65 72 73 2c 20 26 70 63 73 63 5f 72 65  eaders, &pcsc_re
1fc10 61 64 65 72 73 5f 6c 65 6e 29 3b 0a 09 09 09 69  aders_len);....i
1fc20 66 20 28 73 63 61 72 64 5f 6c 69 73 74 72 65 61  f (scard_listrea
1fc30 64 65 72 73 5f 72 65 74 20 3d 3d 20 53 43 41 52  ders_ret == SCAR
1fc40 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09  D_S_SUCCESS) {..
1fc50 09 09 09 70 63 73 63 5f 72 65 61 64 65 72 73 5f  ...pcsc_readers_
1fc60 65 20 3d 20 70 63 73 63 5f 72 65 61 64 65 72 73  e = pcsc_readers
1fc70 20 2b 20 70 63 73 63 5f 72 65 61 64 65 72 73 5f   + pcsc_readers_
1fc80 6c 65 6e 3b 0a 0a 09 09 09 09 2f 2a 20 53 74 61  len;....../* Sta
1fc90 72 74 20 77 69 74 68 20 53 6c 6f 74 20 49 44 20  rt with Slot ID 
1fca0 31 2c 20 74 6f 20 61 76 6f 69 64 20 61 20 62 75  1, to avoid a bu
1fcb0 67 20 69 6e 20 47 44 4d 20 6f 6e 20 52 48 45 4c  g in GDM on RHEL
1fcc0 20 2a 2f 0a 09 09 09 09 2f 2a 20 42 75 67 20 35   */...../* Bug 5
1fcd0 39 34 39 31 31 3a 20 68 74 74 70 73 3a 2f 2f 62  94911: https://b
1fce0 75 67 7a 69 6c 6c 61 2e 72 65 64 68 61 74 2e 63  ugzilla.redhat.c
1fcf0 6f 6d 2f 73 68 6f 77 5f 62 75 67 2e 63 67 69 3f  om/show_bug.cgi?
1fd00 69 64 3d 35 39 34 39 31 31 20 2a 2f 0a 09 09 09  id=594911 */....
1fd10 09 63 75 72 72 73 6c 6f 74 20 3d 20 31 3b 0a 09  .currslot = 1;..
1fd20 09 09 09 73 6c 6f 74 5f 63 6f 75 6e 74 20 3d 20  ...slot_count = 
1fd30 30 3b 0a 09 09 09 09 77 68 69 6c 65 20 28 70 63  0;.....while (pc
1fd40 73 63 5f 72 65 61 64 65 72 73 20 3c 20 70 63 73  sc_readers < pcs
1fd50 63 5f 72 65 61 64 65 72 73 5f 65 29 20 7b 0a 09  c_readers_e) {..
1fd60 09 09 09 09 2f 2a 20 46 69 6e 64 20 6e 65 78 74  ..../* Find next
1fd70 20 61 76 61 69 6c 61 62 6c 65 20 73 6c 6f 74 20   available slot 
1fd80 2a 2f 0a 09 09 09 09 09 66 6f 72 20 28 3b 20 63  */......for (; c
1fd90 75 72 72 73 6c 6f 74 20 3c 20 28 73 69 7a 65 6f  urrslot < (sizeo
1fda0 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20  f(cackey_slots) 
1fdb0 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f  / sizeof(cackey_
1fdc0 73 6c 6f 74 73 5b 30 5d 29 29 3b 20 63 75 72 72  slots[0])); curr
1fdd0 73 6c 6f 74 2b 2b 29 20 7b 0a 09 09 09 09 09 09  slot++) {.......
1fde0 69 66 20 28 21 63 61 63 6b 65 79 5f 73 6c 6f 74  if (!cackey_slot
1fdf0 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 61 63 74 69  s[currslot].acti
1fe00 76 65 29 20 7b 0a 09 09 09 09 09 09 09 62 72 65  ve) {........bre
1fe10 61 6b 3b 0a 09 09 09 09 09 09 7d 0a 09 09 09 09  ak;.......}.....
1fe20 09 7d 0a 0a 09 09 09 09 09 63 75 72 72 5f 72 65  .}.......curr_re
1fe30 61 64 65 72 5f 6c 65 6e 20 3d 20 73 74 72 6c 65  ader_len = strle
1fe40 6e 28 70 63 73 63 5f 72 65 61 64 65 72 73 29 3b  n(pcsc_readers);
1fe50 0a 0a 09 09 09 09 09 69 66 20 28 28 70 63 73 63  .......if ((pcsc
1fe60 5f 72 65 61 64 65 72 73 20 2b 20 63 75 72 72 5f  _readers + curr_
1fe70 72 65 61 64 65 72 5f 6c 65 6e 29 20 3e 20 70 63  reader_len) > pc
1fe80 73 63 5f 72 65 61 64 65 72 73 5f 65 29 20 7b 0a  sc_readers_e) {.
1fe90 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
1fea0 09 09 7d 0a 0a 09 09 09 09 09 69 66 20 28 63 75  ..}.......if (cu
1feb0 72 72 5f 72 65 61 64 65 72 5f 6c 65 6e 20 3d 3d  rr_reader_len ==
1fec0 20 30 29 20 7b 0a 09 09 09 09 09 09 62 72 65 61   0) {.......brea
1fed0 6b 3b 0a 09 09 09 09 09 7d 0a 0a 09 09 09 09 09  k;......}.......
1fee0 69 66 20 28 63 75 72 72 73 6c 6f 74 20 3e 3d 20  if (currslot >= 
1fef0 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
1ff00 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  lots) / sizeof(c
1ff10 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29  ackey_slots[0]))
1ff20 29 20 7b 0a 09 09 09 09 09 09 43 41 43 4b 45 59  ) {.......CACKEY
1ff30 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46  _DEBUG_PRINTF("F
1ff40 6f 75 6e 64 20 6d 6f 72 65 20 72 65 61 64 65 72  ound more reader
1ff50 73 20 74 68 61 6e 20 73 6c 6f 74 73 20 61 72 65  s than slots are
1ff60 20 61 76 61 69 6c 61 62 6c 65 21 22 29 3b 0a 0a   available!");..
1ff70 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
1ff80 09 09 7d 0a 0a 09 09 09 09 09 43 41 43 4b 45 59  ..}.......CACKEY
1ff90 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46  _DEBUG_PRINTF("F
1ffa0 6f 75 6e 64 20 72 65 61 64 65 72 3a 20 25 73 20  ound reader: %s 
1ffb0 28 63 75 72 72 73 6c 6f 74 20 3d 20 25 6c 75 29  (currslot = %lu)
1ffc0 22 2c 20 70 63 73 63 5f 72 65 61 64 65 72 73 2c  ", pcsc_readers,
1ffd0 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
1ffe0 20 63 75 72 72 73 6c 6f 74 29 3b 0a 0a 09 09 09   currslot);.....
1fff0 09 09 69 66 20 28 63 61 63 6b 65 79 5f 72 65 61  ..if (cackey_rea
20000 64 65 72 73 5f 69 6e 63 6c 75 64 65 5f 6f 6e 6c  ders_include_onl
20010 79 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09  y != NULL) {....
20020 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
20030 50 52 49 4e 54 46 28 22 41 73 6b 65 64 20 74 6f  PRINTF("Asked to
20040 20 69 6e 63 6c 75 64 65 20 6f 6e 6c 79 20 72 65   include only re
20050 61 64 65 72 73 20 6d 61 74 63 68 69 6e 67 3a 20  aders matching: 
20060 25 73 22 2c 20 63 61 63 6b 65 79 5f 72 65 61 64  %s", cackey_read
20070 65 72 73 5f 69 6e 63 6c 75 64 65 5f 6f 6e 6c 79  ers_include_only
20080 29 3b 0a 0a 09 09 09 09 09 09 69 6e 63 6c 75 64  );........includ
20090 65 5f 72 65 61 64 65 72 20 3d 20 30 3b 0a 09 09  e_reader = 0;...
200a0 09 09 09 09 72 65 61 64 65 72 5f 63 68 65 63 6b  ....reader_check
200b0 5f 70 61 74 74 65 72 6e 20 3d 20 63 61 63 6b 65  _pattern = cacke
200c0 79 5f 72 65 61 64 65 72 73 5f 69 6e 63 6c 75 64  y_readers_includ
200d0 65 5f 6f 6e 6c 79 3b 0a 09 09 09 09 09 7d 20 65  e_only;......} e
200e0 6c 73 65 20 69 66 20 28 63 61 63 6b 65 79 5f 72  lse if (cackey_r
200f0 65 61 64 65 72 73 5f 65 78 63 6c 75 64 65 20 21  eaders_exclude !
20100 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 09 09  = NULL) {.......
20110 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
20120 4e 54 46 28 22 41 73 6b 65 64 20 74 6f 20 65 78  NTF("Asked to ex
20130 63 6c 75 64 65 20 72 65 61 64 65 72 73 20 6d 61  clude readers ma
20140 74 63 68 69 6e 67 3a 20 25 73 22 2c 20 63 61 63  tching: %s", cac
20150 6b 65 79 5f 72 65 61 64 65 72 73 5f 65 78 63 6c  key_readers_excl
20160 75 64 65 29 3b 0a 0a 09 09 09 09 09 09 69 6e 63  ude);........inc
20170 6c 75 64 65 5f 72 65 61 64 65 72 20 3d 20 31 3b  lude_reader = 1;
20180 0a 09 09 09 09 09 09 72 65 61 64 65 72 5f 63 68  .......reader_ch
20190 65 63 6b 5f 70 61 74 74 65 72 6e 20 3d 20 63 61  eck_pattern = ca
201a0 63 6b 65 79 5f 72 65 61 64 65 72 73 5f 65 78 63  ckey_readers_exc
201b0 6c 75 64 65 3b 0a 09 09 09 09 09 7d 20 65 6c 73  lude;......} els
201c0 65 20 7b 0a 09 09 09 09 09 09 69 6e 63 6c 75 64  e {.......includ
201d0 65 5f 72 65 61 64 65 72 20 3d 20 31 3b 0a 09 09  e_reader = 1;...
201e0 09 09 09 09 72 65 61 64 65 72 5f 63 68 65 63 6b  ....reader_check
201f0 5f 70 61 74 74 65 72 6e 20 3d 20 4e 55 4c 4c 3b  _pattern = NULL;
20200 0a 09 09 09 09 09 7d 0a 0a 09 09 09 09 09 69 66  ......}.......if
20210 20 28 72 65 61 64 65 72 5f 63 68 65 63 6b 5f 70   (reader_check_p
20220 61 74 74 65 72 6e 20 21 3d 20 4e 55 4c 4c 29 20  attern != NULL) 
20230 7b 0a 09 09 09 09 09 09 69 66 20 28 73 74 72 73  {.......if (strs
20240 74 72 28 70 63 73 63 5f 72 65 61 64 65 72 73 2c  tr(pcsc_readers,
20250 20 72 65 61 64 65 72 5f 63 68 65 63 6b 5f 70 61   reader_check_pa
20260 74 74 65 72 6e 29 20 21 3d 20 4e 55 4c 4c 29 20  ttern) != NULL) 
20270 7b 0a 09 09 09 09 09 09 09 43 41 43 4b 45 59 5f  {........CACKEY_
20280 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54 68  DEBUG_PRINTF("Th
20290 69 73 20 72 65 61 64 65 72 20 6d 61 74 63 68 65  is reader matche
202a0 64 20 74 68 65 20 70 61 74 74 65 72 6e 2e 22 29  d the pattern.")
202b0 3b 0a 09 09 09 09 09 09 0a 09 09 09 09 09 09 09  ;...............
202c0 69 6e 63 6c 75 64 65 5f 72 65 61 64 65 72 20 3d  include_reader =
202d0 20 21 69 6e 63 6c 75 64 65 5f 72 65 61 64 65 72   !include_reader
202e0 3b 0a 09 09 09 09 09 09 7d 0a 09 09 09 09 09 7d  ;.......}......}
202f0 0a 0a 09 09 09 09 09 69 66 20 28 69 6e 63 6c 75  .......if (inclu
20300 64 65 5f 72 65 61 64 65 72 20 21 3d 20 31 29 20  de_reader != 1) 
20310 7b 0a 09 09 09 09 09 09 43 41 43 4b 45 59 5f 44  {.......CACKEY_D
20320 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 6b 69  EBUG_PRINTF("Ski
20330 70 70 69 6e 67 20 74 68 69 73 20 72 65 61 64 65  pping this reade
20340 72 2e 22 29 3b 0a 0a 09 09 09 09 09 09 70 63 73  r.");........pcs
20350 63 5f 72 65 61 64 65 72 73 20 2b 3d 20 63 75 72  c_readers += cur
20360 72 5f 72 65 61 64 65 72 5f 6c 65 6e 20 2b 20 31  r_reader_len + 1
20370 3b 0a 0a 09 09 09 09 09 09 63 6f 6e 74 69 6e 75  ;........continu
20380 65 3b 0a 09 09 09 09 09 7d 0a 0a 09 09 09 09 09  e;......}.......
20390 2f 2a 20 4f 6e 6c 79 20 75 70 64 61 74 65 20 74  /* Only update t
203a0 68 65 20 6c 69 73 74 20 6f 66 20 73 6c 6f 74 73  he list of slots
203b0 20 69 66 20 77 65 20 61 72 65 20 61 63 74 75 61   if we are actua
203c0 6c 6c 79 20 62 65 69 6e 67 20 61 73 6b 65 64 20  lly being asked 
203d0 73 75 70 70 6c 79 20 74 68 65 20 73 6c 6f 74 20  supply the slot 
203e0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 09  information */..
203f0 09 09 09 09 69 66 20 28 70 53 6c 6f 74 4c 69 73  ....if (pSlotLis
20400 74 29 20 7b 0a 09 09 09 09 09 09 69 66 20 28 73  t) {.......if (s
20410 6c 6f 74 5f 72 65 73 65 74 29 20 7b 0a 09 09 09  lot_reset) {....
20420 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ....cackey_slots
20430 5b 63 75 72 72 73 6c 6f 74 5d 2e 61 63 74 69 76  [currslot].activ
20440 65 20 3d 20 31 3b 0a 09 09 09 09 09 09 09 63 61  e = 1;........ca
20450 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73  ckey_slots[currs
20460 6c 6f 74 5d 2e 69 6e 74 65 72 6e 61 6c 20 3d 20  lot].internal = 
20470 30 3b 0a 09 09 09 09 09 09 09 63 61 63 6b 65 79  0;........cackey
20480 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d  _slots[currslot]
20490 2e 70 63 73 63 5f 72 65 61 64 65 72 20 3d 20 73  .pcsc_reader = s
204a0 74 72 64 75 70 28 70 63 73 63 5f 72 65 61 64 65  trdup(pcsc_reade
204b0 72 73 29 3b 0a 09 09 09 09 09 09 09 63 61 63 6b  rs);........cack
204c0 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f  ey_slots[currslo
204d0 74 5d 2e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e  t].pcsc_card_con
204e0 6e 65 63 74 65 64 20 3d 20 30 3b 0a 09 09 09 09  nected = 0;.....
204f0 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ...cackey_slots[
20500 63 75 72 72 73 6c 6f 74 5d 2e 74 72 61 6e 73 61  currslot].transa
20510 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d 20 30 3b  ction_depth = 0;
20520 0a 09 09 09 09 09 09 09 63 61 63 6b 65 79 5f 73  ........cackey_s
20530 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 74  lots[currslot].t
20540 72 61 6e 73 61 63 74 69 6f 6e 5f 6e 65 65 64 5f  ransaction_need_
20550 68 77 5f 6c 6f 63 6b 20 3d 20 30 3b 0a 09 09 09  hw_lock = 0;....
20560 09 09 09 09 69 66 20 28 63 61 63 6b 65 79 5f 70  ....if (cackey_p
20570 69 6e 5f 63 6f 6d 6d 61 6e 64 20 3d 3d 20 4e 55  in_command == NU
20580 4c 4c 29 20 7b 0a 09 09 09 09 09 09 09 09 63 61  LL) {.........ca
20590 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73  ckey_slots[currs
205a0 6c 6f 74 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73  lot].token_flags
205b0 20 3d 20 43 4b 46 5f 4c 4f 47 49 4e 5f 52 45 51   = CKF_LOGIN_REQ
205c0 55 49 52 45 44 3b 0a 09 09 09 09 09 09 09 7d 20  UIRED;........} 
205d0 65 6c 73 65 20 7b 0a 09 09 09 09 09 09 09 09 63  else {.........c
205e0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72  ackey_slots[curr
205f0 73 6c 6f 74 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67  slot].token_flag
20600 73 20 3d 20 30 3b 0a 09 09 09 09 09 09 09 7d 0a  s = 0;........}.
20610 09 09 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c  .......cackey_sl
20620 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 6c 61  ots[currslot].la
20630 62 65 6c 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09  bel = NULL;.....
20640 09 09 09 09 63 61 63 6b 65 79 5f 6d 61 72 6b 5f  ....cackey_mark_
20650 73 6c 6f 74 5f 72 65 73 65 74 28 26 63 61 63 6b  slot_reset(&cack
20660 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f  ey_slots[currslo
20670 74 5d 29 3b 0a 09 09 09 09 09 09 7d 0a 09 09 09  t]);.......}....
20680 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09  ..} else {......
20690 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 6c 6f  .if (!cackey_slo
206a0 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 61 63 74  ts[currslot].act
206b0 69 76 65 29 20 7b 0a 09 09 09 09 09 09 09 2f 2a  ive) {......../*
206c0 20 41 72 74 69 66 69 63 69 61 6c 6c 79 20 69 6e   Artificially in
206d0 63 72 65 61 73 65 20 74 68 65 20 6e 75 6d 62 65  crease the numbe
206e0 72 20 6f 66 20 61 63 74 69 76 65 20 73 6c 6f 74  r of active slot
206f0 73 20 62 79 20 77 68 61 74 20 77 69 6c 6c 20 62  s by what will b
20700 65 63 6f 6d 65 20 61 63 74 69 76 65 20 2a 2f 0a  ecome active */.
20710 09 09 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45  .......CACKEY_DE
20720 42 55 47 5f 50 52 49 4e 54 46 28 22 46 6f 75 6e  BUG_PRINTF("Foun
20730 64 20 69 6e 2d 61 63 74 69 76 65 20 73 6c 6f 74  d in-active slot
20740 20 25 6c 75 2c 20 62 75 74 20 69 74 20 77 69 6c   %lu, but it wil
20750 6c 20 62 65 20 61 63 74 69 76 65 20 61 66 74 65  l be active afte
20760 72 20 61 20 72 65 73 65 74 20 2d 2d 20 6d 61 72  r a reset -- mar
20770 6b 69 6e 67 20 61 73 20 61 63 74 69 76 65 20 66  king as active f
20780 6f 72 20 61 63 63 6f 75 6e 74 69 6e 67 20 70 75  or accounting pu
20790 72 70 6f 73 65 73 22 2c 20 28 75 6e 73 69 67 6e  rposes", (unsign
207a0 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 73 6c 6f  ed long) currslo
207b0 74 29 3b 0a 0a 09 09 09 09 09 09 09 73 6c 6f 74  t);.........slot
207c0 5f 63 6f 75 6e 74 2b 2b 3b 0a 09 09 09 09 09 09  _count++;.......
207d0 7d 0a 09 09 09 09 09 7d 0a 09 09 09 09 09 63 75  }......}......cu
207e0 72 72 73 6c 6f 74 2b 2b 3b 0a 0a 09 09 09 09 09  rrslot++;.......
207f0 70 63 73 63 5f 72 65 61 64 65 72 73 20 2b 3d 20  pcsc_readers += 
20800 63 75 72 72 5f 72 65 61 64 65 72 5f 6c 65 6e 20  curr_reader_len 
20810 2b 20 31 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09  + 1;.....}......
20820 66 6f 72 20 28 63 75 72 72 73 6c 6f 74 20 3d 20  for (currslot = 
20830 30 3b 20 63 75 72 72 73 6c 6f 74 20 3c 20 28 73  0; currslot < (s
20840 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f  izeof(cackey_slo
20850 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63  ts) / sizeof(cac
20860 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b 20  key_slots[0])); 
20870 63 75 72 72 73 6c 6f 74 2b 2b 29 20 7b 0a 09 09  currslot++) {...
20880 09 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c  ...if (cackey_sl
20890 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 61 63  ots[currslot].ac
208a0 74 69 76 65 29 20 7b 0a 09 09 09 09 09 09 43 41  tive) {.......CA
208b0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
208c0 46 28 22 46 6f 75 6e 64 20 61 63 74 69 76 65 20  F("Found active 
208d0 73 6c 6f 74 20 25 6c 75 2c 20 72 65 61 64 65 72  slot %lu, reader
208e0 20 3d 20 25 73 22 2c 20 28 75 6e 73 69 67 6e 65   = %s", (unsigne
208f0 64 20 6c 6f 6e 67 29 20 63 75 72 72 73 6c 6f 74  d long) currslot
20900 2c 20 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63  , cackey_slots[c
20910 75 72 72 73 6c 6f 74 5d 2e 70 63 73 63 5f 72 65  urrslot].pcsc_re
20920 61 64 65 72 29 3b 0a 0a 09 09 09 09 09 09 73 6c  ader);........sl
20930 6f 74 5f 63 6f 75 6e 74 2b 2b 3b 0a 09 09 09 09  ot_count++;.....
20940 09 7d 0a 09 09 09 09 7d 0a 09 09 09 7d 20 65 6c  .}.....}....} el
20950 73 65 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f  se {.....CACKEY_
20960 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 65  DEBUG_PRINTF("Se
20970 63 6f 6e 64 20 63 61 6c 6c 20 74 6f 20 53 43 61  cond call to SCa
20980 72 64 4c 69 73 74 52 65 61 64 65 72 73 20 66 61  rdListReaders fa
20990 69 6c 65 64 2c 20 72 65 74 75 72 6e 20 25 73 2f  iled, return %s/
209a0 25 6c 69 22 2c 20 43 41 43 4b 45 59 5f 44 45 42  %li", CACKEY_DEB
209b0 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52  UG_FUNC_SCARDERR
209c0 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 5f 6c 69  _TO_STR(scard_li
209d0 73 74 72 65 61 64 65 72 73 5f 72 65 74 29 2c 20  streaders_ret), 
209e0 28 6c 6f 6e 67 29 20 73 63 61 72 64 5f 6c 69 73  (long) scard_lis
209f0 74 72 65 61 64 65 72 73 5f 72 65 74 29 3b 0a 09  treaders_ret);..
20a00 09 09 7d 0a 0a 09 09 09 66 72 65 65 28 70 63 73  ..}.....free(pcs
20a10 63 5f 72 65 61 64 65 72 73 5f 73 29 3b 0a 09 09  c_readers_s);...
20a20 7d 20 65 6c 73 65 20 7b 0a 09 09 09 43 41 43 4b  } else {....CACK
20a30 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
20a40 22 46 69 72 73 74 20 63 61 6c 6c 20 74 6f 20 53  "First call to S
20a50 43 61 72 64 4c 69 73 74 52 65 61 64 65 72 73 20  CardListReaders 
20a60 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 20 25  failed, return %
20a70 73 2f 25 6c 69 22 2c 20 43 41 43 4b 45 59 5f 44  s/%li", CACKEY_D
20a80 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45  EBUG_FUNC_SCARDE
20a90 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 5f  RR_TO_STR(scard_
20aa0 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65 74 29  listreaders_ret)
20ab0 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72 64 5f 6c  , (long) scard_l
20ac0 69 73 74 72 65 61 64 65 72 73 5f 72 65 74 29 3b  istreaders_ret);
20ad0 0a 09 09 7d 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f  ...}..}...mutex_
20ae0 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
20af0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
20b00 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
20b10 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
20b20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
20b30 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
20b40 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67  rror.  Unlocking
20b50 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
20b60 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
20b70 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69  L_ERROR);..}...i
20b80 66 20 28 70 53 6c 6f 74 4c 69 73 74 20 3d 3d 20  f (pSlotList == 
20b90 4e 55 4c 4c 29 20 7b 0a 09 09 2a 70 75 6c 43 6f  NULL) {...*pulCo
20ba0 75 6e 74 20 3d 20 73 6c 6f 74 5f 63 6f 75 6e 74  unt = slot_count
20bb0 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  ;....CACKEY_DEBU
20bc0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
20bd0 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 2e  ing CKR_OK (%i).
20be0 20 20 46 6f 75 6e 64 20 25 6c 75 20 72 65 61 64    Found %lu read
20bf0 65 72 73 2c 20 62 75 74 20 6e 6f 74 20 73 74 6f  ers, but not sto
20c00 72 69 6e 67 20 49 44 73 20 28 70 53 6c 6f 74 4c  ring IDs (pSlotL
20c10 69 73 74 20 3d 3d 20 4e 55 4c 4c 29 22 2c 20 43  ist == NULL)", C
20c20 4b 52 5f 4f 4b 2c 20 28 75 6e 73 69 67 6e 65 64  KR_OK, (unsigned
20c30 20 6c 6f 6e 67 29 20 73 6c 6f 74 5f 63 6f 75 6e   long) slot_coun
20c40 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  t);....return(CK
20c50 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 63 6f 75 6e  R_OK);..}...coun
20c60 74 20 3d 20 2a 70 75 6c 43 6f 75 6e 74 3b 0a 09  t = *pulCount;..
20c70 69 66 20 28 63 6f 75 6e 74 20 3c 20 73 6c 6f 74  if (count < slot
20c80 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 43 41 43 4b  _count) {...CACK
20c90 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
20ca0 22 45 72 72 6f 72 2e 20 55 73 65 72 20 61 6c 6c  "Error. User all
20cb0 6f 63 61 74 65 64 20 25 6c 75 20 65 6e 74 72 69  ocated %lu entri
20cc0 65 73 2c 20 62 75 74 20 77 65 20 68 61 76 65 20  es, but we have 
20cd0 25 6c 75 20 65 6e 74 72 69 65 73 2e 22 2c 20 63  %lu entries.", c
20ce0 6f 75 6e 74 2c 20 73 6c 6f 74 5f 63 6f 75 6e 74  ount, slot_count
20cf0 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  );....CACKEY_DEB
20d00 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
20d10 6e 69 6e 67 20 43 4b 52 5f 42 55 46 46 45 52 5f  ning CKR_BUFFER_
20d20 54 4f 4f 5f 53 4d 41 4c 4c 22 29 3b 0a 0a 09 09  TOO_SMALL");....
20d30 72 65 74 75 72 6e 28 43 4b 52 5f 42 55 46 46 45  return(CKR_BUFFE
20d40 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 3b 09 0a 09  R_TOO_SMALL);...
20d50 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  }...mutex_retval
20d60 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
20d70 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
20d80 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
20d90 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
20da0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
20db0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c  RINTF("Error.  L
20dc0 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
20dd0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
20de0 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
20df0 09 7d 0a 0a 09 73 6c 6f 74 5f 69 64 78 20 3d 20  .}...slot_idx = 
20e00 30 3b 0a 09 66 6f 72 20 28 63 75 72 72 73 6c 6f  0;..for (currslo
20e10 74 20 3d 20 30 3b 20 28 63 75 72 72 73 6c 6f 74  t = 0; (currslot
20e20 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65   < (sizeof(cacke
20e30 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f  y_slots) / sizeo
20e40 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30  f(cackey_slots[0
20e50 5d 29 29 29 3b 20 63 75 72 72 73 6c 6f 74 2b 2b  ]))); currslot++
20e60 29 20 7b 0a 09 09 69 66 20 28 21 63 61 63 6b 65  ) {...if (!cacke
20e70 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74  y_slots[currslot
20e80 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 09 63  ].active) {....c
20e90 6f 6e 74 69 6e 75 65 3b 0a 09 09 7d 0a 0a 09 09  ontinue;...}....
20ea0 69 66 20 28 73 6c 6f 74 5f 69 64 78 20 3e 3d 20  if (slot_idx >= 
20eb0 63 6f 75 6e 74 29 20 7b 0a 09 09 09 43 41 43 4b  count) {....CACK
20ec0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
20ed0 22 45 72 72 6f 72 2e 20 55 73 65 72 20 61 6c 6c  "Error. User all
20ee0 6f 63 61 74 65 64 20 25 6c 75 20 65 6e 74 72 69  ocated %lu entri
20ef0 65 73 2c 20 62 75 74 20 77 65 20 6a 75 73 74 20  es, but we just 
20f00 74 72 69 65 64 20 74 6f 20 77 72 69 74 65 20 74  tried to write t
20f10 6f 20 74 68 65 20 25 6c 75 20 69 6e 64 65 78 20  o the %lu index 
20f20 2d 2d 20 69 67 6e 6f 72 69 6e 67 22 2c 20 63 6f  -- ignoring", co
20f30 75 6e 74 2c 20 73 6c 6f 74 5f 69 64 78 29 3b 0a  unt, slot_idx);.
20f40 0a 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09  ....continue;...
20f50 7d 0a 0a 09 09 70 53 6c 6f 74 4c 69 73 74 5b 73  }....pSlotList[s
20f60 6c 6f 74 5f 69 64 78 5d 20 3d 20 63 75 72 72 73  lot_idx] = currs
20f70 6c 6f 74 3b 0a 09 09 73 6c 6f 74 5f 69 64 78 2b  lot;...slot_idx+
20f80 2b 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65  +;..}...mutex_re
20f90 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
20fa0 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
20fb0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
20fc0 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
20fd0 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
20fe0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
20ff0 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66  or.  Unlocking f
21000 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
21010 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
21020 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 2a 70 75  ERROR);..}...*pu
21030 6c 43 6f 75 6e 74 20 3d 20 73 6c 6f 74 5f 63 6f  lCount = slot_co
21040 75 6e 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  unt;...CACKEY_DE
21050 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
21060 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69  rning CKR_OK (%i
21070 29 2e 20 20 46 6f 75 6e 64 20 25 6c 75 20 72 65  ).  Found %lu re
21080 61 64 65 72 73 2e 22 2c 20 43 4b 52 5f 4f 4b 2c  aders.", CKR_OK,
21090 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
210a0 20 73 6c 6f 74 5f 63 6f 75 6e 74 29 3b 0a 0a 09   slot_count);...
210b0 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a  return(CKR_OK);.
210c0 0a 09 74 6f 6b 65 6e 50 72 65 73 65 6e 74 20 3d  ..tokenPresent =
210d0 20 74 6f 6b 65 6e 50 72 65 73 65 6e 74 3b 20 2f   tokenPresent; /
210e0 2a 20 53 75 70 72 65 73 73 20 75 6e 75 73 65 64  * Supress unused
210f0 20 76 61 72 69 61 62 6c 65 20 77 61 72 6e 69 6e   variable warnin
21100 67 20 2a 2f 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  g */.}..CK_DEFIN
21110 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
21120 2c 20 43 5f 47 65 74 53 6c 6f 74 49 6e 66 6f 29  , C_GetSlotInfo)
21130 28 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74  (CK_SLOT_ID slot
21140 49 44 2c 20 43 4b 5f 53 4c 4f 54 5f 49 4e 46 4f  ID, CK_SLOT_INFO
21150 5f 50 54 52 20 70 49 6e 66 6f 29 20 7b 0a 09 73  _PTR pInfo) {..s
21160 74 61 74 69 63 20 43 4b 5f 55 54 46 38 43 48 41  tatic CK_UTF8CHA
21170 52 20 73 6c 6f 74 44 65 73 63 72 69 70 74 69 6f  R slotDescriptio
21180 6e 5b 5d 20 3d 20 22 43 41 43 4b 65 79 20 53 6c  n[] = "CACKey Sl
21190 6f 74 22 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f  ot";..int mutex_
211a0 72 65 74 76 61 6c 3b 0a 09 69 6e 74 20 62 79 74  retval;..int byt
211b0 65 73 5f 74 6f 5f 63 6f 70 79 3b 0a 0a 09 43 41  es_to_copy;...CA
211c0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
211d0 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
211e0 69 66 20 28 70 49 6e 66 6f 20 3d 3d 20 4e 55 4c  if (pInfo == NUL
211f0 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
21200 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
21210 72 2e 20 70 49 6e 66 6f 20 69 73 20 4e 55 4c 4c  r. pInfo is NULL
21220 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
21230 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44  KR_ARGUMENTS_BAD
21240 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63  );..}...if (!cac
21250 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
21260 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
21270 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
21280 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
21290 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
212a0 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
212b0 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
212c0 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44 20 3c  }...if (slotID <
212d0 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20   0 || slotID >= 
212e0 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
212f0 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  lots) / sizeof(c
21300 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29  ackey_slots[0]))
21310 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
21320 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
21330 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72  . Invalid slot r
21340 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20  equested (%lu), 
21350 6f 75 74 73 69 64 65 20 6f 66 20 76 61 6c 69 64  outside of valid
21360 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29   range", slotID)
21370 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
21380 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29  SLOT_ID_INVALID)
21390 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74  ;..}...mutex_ret
213a0 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
213b0 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  ex_lock(cackey_b
213c0 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
213d0 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
213e0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
213f0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
21400 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64    Locking failed
21410 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
21420 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
21430 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b  );..}...if (cack
21440 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
21450 2e 61 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a  .active == 0) {.
21460 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
21470 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e  RINTF("Error. In
21480 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65  valid slot reque
21490 73 74 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74  sted (%lu), slot
214a0 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61   not currently a
214b0 63 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b  ctive", slotID);
214c0 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  ....cackey_mutex
214d0 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
214e0 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75  iglock);....retu
214f0 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49  rn(CKR_SLOT_ID_I
21500 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 70 49  NVALID);..}...pI
21510 6e 66 6f 2d 3e 66 6c 61 67 73 20 3d 20 43 4b 46  nfo->flags = CKF
21520 5f 48 57 5f 53 4c 4f 54 3b 0a 0a 09 69 66 20 28  _HW_SLOT;...if (
21530 21 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c  !cackey_slots[sl
21540 6f 74 49 44 5d 2e 69 6e 74 65 72 6e 61 6c 29 20  otID].internal) 
21550 7b 0a 09 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73  {...pInfo->flags
21560 20 7c 3d 20 43 4b 46 5f 52 45 4d 4f 56 41 42 4c   |= CKF_REMOVABL
21570 45 5f 44 45 56 49 43 45 3b 0a 09 7d 0a 0a 09 69  E_DEVICE;..}...i
21580 66 20 28 63 61 63 6b 65 79 5f 74 6f 6b 65 6e 5f  f (cackey_token_
21590 70 72 65 73 65 6e 74 28 26 63 61 63 6b 65 79 5f  present(&cackey_
215a0 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 29 20 3d  slots[slotID]) =
215b0 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  = CACKEY_PCSC_S_
215c0 54 4f 4b 45 4e 50 52 45 53 45 4e 54 29 20 7b 0a  TOKENPRESENT) {.
215d0 09 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20 7c  ..pInfo->flags |
215e0 3d 20 43 4b 46 5f 54 4f 4b 45 4e 5f 50 52 45 53  = CKF_TOKEN_PRES
215f0 45 4e 54 3b 0a 09 7d 0a 0a 09 62 79 74 65 73 5f  ENT;..}...bytes_
21600 74 6f 5f 63 6f 70 79 20 3d 20 73 74 72 6c 65 6e  to_copy = strlen
21610 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c  (cackey_slots[sl
21620 6f 74 49 44 5d 2e 70 63 73 63 5f 72 65 61 64 65  otID].pcsc_reade
21630 72 29 3b 0a 09 69 66 20 28 73 69 7a 65 6f 66 28  r);..if (sizeof(
21640 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75  pInfo->manufactu
21650 72 65 72 49 44 29 20 3c 20 62 79 74 65 73 5f 74  rerID) < bytes_t
21660 6f 5f 63 6f 70 79 29 20 7b 0a 09 09 62 79 74 65  o_copy) {...byte
21670 73 5f 74 6f 5f 63 6f 70 79 20 3d 20 73 69 7a 65  s_to_copy = size
21680 6f 66 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61  of(pInfo->manufa
21690 63 74 75 72 65 72 49 44 29 3b 0a 09 7d 0a 09 6d  cturerID);..}..m
216a0 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 6d 61 6e  emcpy(pInfo->man
216b0 75 66 61 63 74 75 72 65 72 49 44 2c 20 63 61 63  ufacturerID, cac
216c0 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44  key_slots[slotID
216d0 5d 2e 70 63 73 63 5f 72 65 61 64 65 72 2c 20 62  ].pcsc_reader, b
216e0 79 74 65 73 5f 74 6f 5f 63 6f 70 79 29 3b 0a 0a  ytes_to_copy);..
216f0 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
21700 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
21710 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
21720 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
21730 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
21740 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
21750 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e  INTF("Error.  Un
21760 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  locking failed."
21770 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
21780 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
21790 0a 09 7d 0a 0a 09 6d 65 6d 73 65 74 28 70 49 6e  ..}...memset(pIn
217a0 66 6f 2d 3e 73 6c 6f 74 44 65 73 63 72 69 70 74  fo->slotDescript
217b0 69 6f 6e 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66  ion, ' ', sizeof
217c0 28 70 49 6e 66 6f 2d 3e 73 6c 6f 74 44 65 73 63  (pInfo->slotDesc
217d0 72 69 70 74 69 6f 6e 29 29 3b 0a 09 6d 65 6d 63  ription));..memc
217e0 70 79 28 70 49 6e 66 6f 2d 3e 73 6c 6f 74 44 65  py(pInfo->slotDe
217f0 73 63 72 69 70 74 69 6f 6e 2c 20 73 6c 6f 74 44  scription, slotD
21800 65 73 63 72 69 70 74 69 6f 6e 2c 20 73 69 7a 65  escription, size
21810 6f 66 28 73 6c 6f 74 44 65 73 63 72 69 70 74 69  of(slotDescripti
21820 6f 6e 29 20 2d 20 31 29 3b 0a 0a 09 6d 65 6d 73  on) - 1);...mems
21830 65 74 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61  et(pInfo->manufa
21840 63 74 75 72 65 72 49 44 2c 20 27 20 27 2c 20 73  cturerID, ' ', s
21850 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d 61 6e  izeof(pInfo->man
21860 75 66 61 63 74 75 72 65 72 49 44 29 29 3b 0a 0a  ufacturerID));..
21870 09 70 49 6e 66 6f 2d 3e 68 61 72 64 77 61 72 65  .pInfo->hardware
21880 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20  Version.major = 
21890 28 63 61 63 6b 65 79 5f 67 65 74 76 65 72 73 69  (cackey_getversi
218a0 6f 6e 28 29 20 3e 3e 20 31 36 29 20 26 20 30 78  on() >> 16) & 0x
218b0 66 66 3b 0a 09 70 49 6e 66 6f 2d 3e 68 61 72 64  ff;..pInfo->hard
218c0 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d 69 6e 6f  wareVersion.mino
218d0 72 20 3d 20 28 63 61 63 6b 65 79 5f 67 65 74 76  r = (cackey_getv
218e0 65 72 73 69 6f 6e 28 29 20 3e 3e 20 38 29 20 26  ersion() >> 8) &
218f0 20 30 78 66 66 3b 0a 0a 09 70 49 6e 66 6f 2d 3e   0xff;...pInfo->
21900 66 69 72 6d 77 61 72 65 56 65 72 73 69 6f 6e 2e  firmwareVersion.
21910 6d 61 6a 6f 72 20 3d 20 30 78 30 30 3b 0a 09 70  major = 0x00;..p
21920 49 6e 66 6f 2d 3e 66 69 72 6d 77 61 72 65 56 65  Info->firmwareVe
21930 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 30 78  rsion.minor = 0x
21940 30 30 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  00;...CACKEY_DEB
21950 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
21960 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29  ning CKR_OK (%i)
21970 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65  ", CKR_OK);...re
21980 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a  turn(CKR_OK);.}.
21990 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
219a0 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74  ION(CK_RV, C_Get
219b0 54 6f 6b 65 6e 49 6e 66 6f 29 28 43 4b 5f 53 4c  TokenInfo)(CK_SL
219c0 4f 54 5f 49 44 20 73 6c 6f 74 49 44 2c 20 43 4b  OT_ID slotID, CK
219d0 5f 54 4f 4b 45 4e 5f 49 4e 46 4f 5f 50 54 52 20  _TOKEN_INFO_PTR 
219e0 70 49 6e 66 6f 29 20 7b 0a 09 73 74 61 74 69 63  pInfo) {..static
219f0 20 43 4b 5f 55 54 46 38 43 48 41 52 20 6d 61 6e   CK_UTF8CHAR man
21a00 75 66 61 63 74 75 72 65 72 49 44 5b 5d 20 3d 20  ufacturerID[] = 
21a10 22 55 2e 53 2e 20 47 6f 76 65 72 6e 6d 65 6e 74  "U.S. Government
21a20 22 3b 0a 09 73 74 61 74 69 63 20 43 4b 5f 55 54  ";..static CK_UT
21a30 46 38 43 48 41 52 20 64 65 66 61 75 6c 74 4c 61  F8CHAR defaultLa
21a40 62 65 6c 5b 5d 20 3d 20 22 55 6e 6b 6e 6f 77 6e  bel[] = "Unknown
21a50 20 54 6f 6b 65 6e 22 3b 0a 09 73 74 61 74 69 63   Token";..static
21a60 20 43 4b 5f 55 54 46 38 43 48 41 52 20 6d 6f 64   CK_UTF8CHAR mod
21a70 65 6c 5b 5d 20 3d 20 22 43 41 43 20 54 6f 6b 65  el[] = "CAC Toke
21a80 6e 22 3b 0a 09 73 74 72 75 63 74 20 63 61 63 6b  n";..struct cack
21a90 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79  ey_pcsc_identity
21aa0 20 2a 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65   *pcsc_identitie
21ab0 73 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  s;..unsigned lon
21ac0 67 20 6e 75 6d 5f 63 65 72 74 73 3b 0a 09 73 73  g num_certs;..ss
21ad0 69 7a 65 5f 74 20 6c 61 62 65 6c 5f 72 65 74 3b  ize_t label_ret;
21ae0 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76  ..int mutex_retv
21af0 61 6c 3b 0a 09 69 6e 74 20 75 73 65 5f 64 65 66  al;..int use_def
21b00 61 75 6c 74 5f 6c 61 62 65 6c 3b 0a 0a 09 43 41  ault_label;...CA
21b10 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
21b20 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
21b30 69 66 20 28 70 49 6e 66 6f 20 3d 3d 20 4e 55 4c  if (pInfo == NUL
21b40 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
21b50 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
21b60 72 2e 20 70 49 6e 66 6f 20 69 73 20 4e 55 4c 4c  r. pInfo is NULL
21b70 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
21b80 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44  KR_ARGUMENTS_BAD
21b90 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63  );..}...if (!cac
21ba0 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
21bb0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
21bc0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
21bd0 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
21be0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
21bf0 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
21c00 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
21c10 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44 20 3c  }...if (slotID <
21c20 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20   0 || slotID >= 
21c30 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
21c40 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  lots) / sizeof(c
21c50 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29  ackey_slots[0]))
21c60 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
21c70 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
21c80 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72  . Invalid slot r
21c90 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20  equested (%lu), 
21ca0 6f 75 74 73 69 64 65 20 6f 66 20 76 61 6c 69 64  outside of valid
21cb0 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29   range", slotID)
21cc0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
21cd0 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29  SLOT_ID_INVALID)
21ce0 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74  ;..}...mutex_ret
21cf0 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
21d00 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  ex_lock(cackey_b
21d10 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
21d20 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
21d30 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
21d40 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
21d50 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64    Locking failed
21d60 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
21d70 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
21d80 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b  );..}...if (cack
21d90 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
21da0 2e 61 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a  .active == 0) {.
21db0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
21dc0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e  RINTF("Error. In
21dd0 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65  valid slot reque
21de0 73 74 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74  sted (%lu), slot
21df0 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61   not currently a
21e00 63 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b  ctive", slotID);
21e10 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  ....cackey_mutex
21e20 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
21e30 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75  iglock);....retu
21e40 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49  rn(CKR_SLOT_ID_I
21e50 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66  NVALID);..}...if
21e60 20 28 63 61 63 6b 65 79 5f 74 6f 6b 65 6e 5f 70   (cackey_token_p
21e70 72 65 73 65 6e 74 28 26 63 61 63 6b 65 79 5f 73  resent(&cackey_s
21e80 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 29 20 21 3d  lots[slotID]) !=
21e90 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 54   CACKEY_PCSC_S_T
21ea0 4f 4b 45 4e 50 52 45 53 45 4e 54 29 20 7b 0a 09  OKENPRESENT) {..
21eb0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
21ec0 49 4e 54 46 28 22 4e 6f 20 74 6f 6b 65 6e 20 69  INTF("No token i
21ed0 73 20 70 72 65 73 65 6e 74 20 69 6e 20 73 6c 6f  s present in slo
21ee0 74 49 44 20 3d 20 25 6c 75 22 2c 20 73 6c 6f 74  tID = %lu", slot
21ef0 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d  ID);....cackey_m
21f00 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
21f10 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
21f20 72 65 74 75 72 6e 28 43 4b 52 5f 54 4f 4b 45 4e  return(CKR_TOKEN
21f30 5f 4e 4f 54 5f 50 52 45 53 45 4e 54 29 3b 0a 09  _NOT_PRESENT);..
21f40 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  }...mutex_retval
21f50 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
21f60 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
21f70 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
21f80 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
21f90 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
21fa0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
21fb0 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65   Unlocking faile
21fc0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
21fd0 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
21fe0 52 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74 65  R);..}.../* Dete
21ff0 72 6d 69 6e 65 20 74 6f 6b 65 6e 20 6c 61 62 65  rmine token labe
22000 6c 20 66 72 6f 6d 20 63 65 72 74 69 66 69 63 61  l from certifica
22010 74 65 73 20 2a 2f 0a 09 6d 65 6d 73 65 74 28 70  tes */..memset(p
22020 49 6e 66 6f 2d 3e 6c 61 62 65 6c 2c 20 27 20 27  Info->label, ' '
22030 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e  , sizeof(pInfo->
22040 6c 61 62 65 6c 29 29 3b 0a 09 75 73 65 5f 64 65  label));..use_de
22050 66 61 75 6c 74 5f 6c 61 62 65 6c 20 3d 20 31 3b  fault_label = 1;
22060 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c  ...if (cackey_sl
22070 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61 62 65  ots[slotID].labe
22080 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 70  l == NULL) {...p
22090 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 20 3d  csc_identities =
220a0 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 63 65 72   cackey_read_cer
220b0 74 73 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ts(&cackey_slots
220c0 5b 73 6c 6f 74 49 44 5d 2c 20 4e 55 4c 4c 2c 20  [slotID], NULL, 
220d0 26 6e 75 6d 5f 63 65 72 74 73 29 3b 0a 09 09 69  &num_certs);...i
220e0 66 20 28 70 63 73 63 5f 69 64 65 6e 74 69 74 69  f (pcsc_identiti
220f0 65 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  es != NULL) {...
22100 09 69 66 20 28 6e 75 6d 5f 63 65 72 74 73 20 3e  .if (num_certs >
22110 20 30 29 20 7b 0a 09 09 09 09 6c 61 62 65 6c 5f   0) {.....label_
22120 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 70 63 73  ret = cackey_pcs
22130 63 5f 69 64 65 6e 74 69 74 79 5f 74 6f 5f 6c 61  c_identity_to_la
22140 62 65 6c 28 70 63 73 63 5f 69 64 65 6e 74 69 74  bel(pcsc_identit
22150 69 65 73 2c 20 70 49 6e 66 6f 2d 3e 6c 61 62 65  ies, pInfo->labe
22160 6c 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d  l, sizeof(pInfo-
22170 3e 6c 61 62 65 6c 29 29 3b 0a 09 09 09 09 69 66  >label));.....if
22180 20 28 6c 61 62 65 6c 5f 72 65 74 20 3e 20 30 29   (label_ret > 0)
22190 20 7b 0a 09 09 09 09 09 75 73 65 5f 64 65 66 61   {......use_defa
221a0 75 6c 74 5f 6c 61 62 65 6c 20 3d 20 30 3b 0a 0a  ult_label = 0;..
221b0 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  .....cackey_slot
221c0 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61 62 65 6c 20  s[slotID].label 
221d0 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28  = malloc(sizeof(
221e0 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 29 29 3b 0a  pInfo->label));.
221f0 0a 09 09 09 09 09 6d 65 6d 63 70 79 28 63 61 63  ......memcpy(cac
22200 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44  key_slots[slotID
22210 5d 2e 6c 61 62 65 6c 2c 20 70 49 6e 66 6f 2d 3e  ].label, pInfo->
22220 6c 61 62 65 6c 2c 20 73 69 7a 65 6f 66 28 70 49  label, sizeof(pI
22230 6e 66 6f 2d 3e 6c 61 62 65 6c 29 29 3b 0a 09 09  nfo->label));...
22240 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 09 63 61 63  ..}....}.....cac
22250 6b 65 79 5f 66 72 65 65 5f 63 65 72 74 73 28 70  key_free_certs(p
22260 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 2c 20  csc_identities, 
22270 6e 75 6d 5f 63 65 72 74 73 2c 20 31 29 3b 0a 09  num_certs, 1);..
22280 09 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 6d  .}..} else {...m
22290 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 6c 61 62  emcpy(pInfo->lab
222a0 65 6c 2c 20 63 61 63 6b 65 79 5f 73 6c 6f 74 73  el, cackey_slots
222b0 5b 73 6c 6f 74 49 44 5d 2e 6c 61 62 65 6c 2c 20  [slotID].label, 
222c0 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6c 61  sizeof(pInfo->la
222d0 62 65 6c 29 29 3b 0a 0a 09 09 75 73 65 5f 64 65  bel));....use_de
222e0 66 61 75 6c 74 5f 6c 61 62 65 6c 20 3d 20 30 3b  fault_label = 0;
222f0 0a 09 7d 0a 0a 09 69 66 20 28 75 73 65 5f 64 65  ..}...if (use_de
22300 66 61 75 6c 74 5f 6c 61 62 65 6c 29 20 7b 0a 09  fault_label) {..
22310 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 6c  .memcpy(pInfo->l
22320 61 62 65 6c 2c 20 64 65 66 61 75 6c 74 4c 61 62  abel, defaultLab
22330 65 6c 2c 20 73 69 7a 65 6f 66 28 64 65 66 61 75  el, sizeof(defau
22340 6c 74 4c 61 62 65 6c 29 20 2d 20 31 29 3b 0a 09  ltLabel) - 1);..
22350 7d 0a 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f  }...memset(pInfo
22360 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44  ->manufacturerID
22370 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 28 70 49  , ' ', sizeof(pI
22380 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65  nfo->manufacture
22390 72 49 44 29 29 3b 0a 09 6d 65 6d 63 70 79 28 70  rID));..memcpy(p
223a0 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72  Info->manufactur
223b0 65 72 49 44 2c 20 6d 61 6e 75 66 61 63 74 75 72  erID, manufactur
223c0 65 72 49 44 2c 20 73 69 7a 65 6f 66 28 6d 61 6e  erID, sizeof(man
223d0 75 66 61 63 74 75 72 65 72 49 44 29 20 2d 20 31  ufacturerID) - 1
223e0 29 3b 0a 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66  );...memset(pInf
223f0 6f 2d 3e 6d 6f 64 65 6c 2c 20 27 20 27 2c 20 73  o->model, ' ', s
22400 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d 6f 64  izeof(pInfo->mod
22410 65 6c 29 29 3b 0a 09 6d 65 6d 63 70 79 28 70 49  el));..memcpy(pI
22420 6e 66 6f 2d 3e 6d 6f 64 65 6c 2c 20 6d 6f 64 65  nfo->model, mode
22430 6c 2c 20 73 69 7a 65 6f 66 28 6d 6f 64 65 6c 29  l, sizeof(model)
22440 20 2d 20 31 29 3b 0a 0a 09 6d 65 6d 73 65 74 28   - 1);...memset(
22450 70 49 6e 66 6f 2d 3e 73 65 72 69 61 6c 4e 75 6d  pInfo->serialNum
22460 62 65 72 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66  ber, ' ', sizeof
22470 28 70 49 6e 66 6f 2d 3e 73 65 72 69 61 6c 4e 75  (pInfo->serialNu
22480 6d 62 65 72 29 29 3b 0a 0a 09 6d 65 6d 73 65 74  mber));...memset
22490 28 70 49 6e 66 6f 2d 3e 75 74 63 54 69 6d 65 2c  (pInfo->utcTime,
224a0 20 27 20 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e   ' ', sizeof(pIn
224b0 66 6f 2d 3e 75 74 63 54 69 6d 65 29 29 3b 0a 0a  fo->utcTime));..
224c0 09 70 49 6e 66 6f 2d 3e 68 61 72 64 77 61 72 65  .pInfo->hardware
224d0 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20  Version.major = 
224e0 28 63 61 63 6b 65 79 5f 67 65 74 76 65 72 73 69  (cackey_getversi
224f0 6f 6e 28 29 20 3e 3e 20 31 36 29 20 26 20 30 78  on() >> 16) & 0x
22500 66 66 3b 0a 09 70 49 6e 66 6f 2d 3e 68 61 72 64  ff;..pInfo->hard
22510 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d 69 6e 6f  wareVersion.mino
22520 72 20 3d 20 28 63 61 63 6b 65 79 5f 67 65 74 76  r = (cackey_getv
22530 65 72 73 69 6f 6e 28 29 20 3e 3e 20 38 29 20 26  ersion() >> 8) &
22540 20 30 78 66 66 3b 0a 0a 09 70 49 6e 66 6f 2d 3e   0xff;...pInfo->
22550 66 69 72 6d 77 61 72 65 56 65 72 73 69 6f 6e 2e  firmwareVersion.
22560 6d 61 6a 6f 72 20 3d 20 30 78 30 30 3b 0a 09 70  major = 0x00;..p
22570 49 6e 66 6f 2d 3e 66 69 72 6d 77 61 72 65 56 65  Info->firmwareVe
22580 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 30 78  rsion.minor = 0x
22590 30 30 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 66 6c 61  00;...pInfo->fla
225a0 67 73 20 3d 20 43 4b 46 5f 57 52 49 54 45 5f 50  gs = CKF_WRITE_P
225b0 52 4f 54 45 43 54 45 44 20 7c 20 43 4b 46 5f 55  ROTECTED | CKF_U
225c0 53 45 52 5f 50 49 4e 5f 49 4e 49 54 49 41 4c 49  SER_PIN_INITIALI
225d0 5a 45 44 20 7c 20 43 4b 46 5f 54 4f 4b 45 4e 5f  ZED | CKF_TOKEN_
225e0 49 4e 49 54 49 41 4c 49 5a 45 44 20 7c 20 63 61  INITIALIZED | ca
225f0 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
22600 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 3b 0a  D].token_flags;.
22610 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 70 69 6e  ..if (cackey_pin
22620 5f 63 6f 6d 6d 61 6e 64 20 21 3d 20 4e 55 4c 4c  _command != NULL
22630 29 20 7b 0a 09 09 70 49 6e 66 6f 2d 3e 66 6c 61  ) {...pInfo->fla
22640 67 73 20 7c 3d 20 43 4b 46 5f 50 52 4f 54 45 43  gs |= CKF_PROTEC
22650 54 45 44 5f 41 55 54 48 45 4e 54 49 43 41 54 49  TED_AUTHENTICATI
22660 4f 4e 5f 50 41 54 48 3b 0a 09 7d 0a 0a 09 70 49  ON_PATH;..}...pI
22670 6e 66 6f 2d 3e 75 6c 4d 61 78 53 65 73 73 69 6f  nfo->ulMaxSessio
22680 6e 43 6f 75 6e 74 20 3d 20 28 73 69 7a 65 6f 66  nCount = (sizeof
22690 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
226a0 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
226b0 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 20  y_sessions[0])) 
226c0 2d 20 31 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 53  - 1;..pInfo->ulS
226d0 65 73 73 69 6f 6e 43 6f 75 6e 74 20 3d 20 43 4b  essionCount = CK
226e0 5f 55 4e 41 56 41 49 4c 41 42 4c 45 5f 49 4e 46  _UNAVAILABLE_INF
226f0 4f 52 4d 41 54 49 4f 4e 3b 0a 09 70 49 6e 66 6f  ORMATION;..pInfo
22700 2d 3e 75 6c 4d 61 78 52 77 53 65 73 73 69 6f 6e  ->ulMaxRwSession
22710 43 6f 75 6e 74 20 3d 20 30 3b 0a 09 70 49 6e 66  Count = 0;..pInf
22720 6f 2d 3e 75 6c 52 77 53 65 73 73 69 6f 6e 43 6f  o->ulRwSessionCo
22730 75 6e 74 20 3d 20 43 4b 5f 55 4e 41 56 41 49 4c  unt = CK_UNAVAIL
22740 41 42 4c 45 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e  ABLE_INFORMATION
22750 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 4d 61 78 50  ;..pInfo->ulMaxP
22760 69 6e 4c 65 6e 20 3d 20 31 32 38 3b 0a 09 70 49  inLen = 128;..pI
22770 6e 66 6f 2d 3e 75 6c 4d 69 6e 50 69 6e 4c 65 6e  nfo->ulMinPinLen
22780 20 3d 20 30 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c   = 0;..pInfo->ul
22790 54 6f 74 61 6c 50 75 62 6c 69 63 4d 65 6d 6f 72  TotalPublicMemor
227a0 79 20 3d 20 43 4b 5f 55 4e 41 56 41 49 4c 41 42  y = CK_UNAVAILAB
227b0 4c 45 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a  LE_INFORMATION;.
227c0 09 70 49 6e 66 6f 2d 3e 75 6c 46 72 65 65 50 75  .pInfo->ulFreePu
227d0 62 6c 69 63 4d 65 6d 6f 72 79 20 3d 20 43 4b 5f  blicMemory = CK_
227e0 55 4e 41 56 41 49 4c 41 42 4c 45 5f 49 4e 46 4f  UNAVAILABLE_INFO
227f0 52 4d 41 54 49 4f 4e 3b 0a 09 70 49 6e 66 6f 2d  RMATION;..pInfo-
22800 3e 75 6c 54 6f 74 61 6c 50 72 69 76 61 74 65 4d  >ulTotalPrivateM
22810 65 6d 6f 72 79 20 3d 20 43 4b 5f 55 4e 41 56 41  emory = CK_UNAVA
22820 49 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d 41 54 49  ILABLE_INFORMATI
22830 4f 4e 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 46 72  ON;..pInfo->ulFr
22840 65 65 50 72 69 76 61 74 65 4d 65 6d 6f 72 79 20  eePrivateMemory 
22850 3d 20 43 4b 5f 55 4e 41 56 41 49 4c 41 42 4c 45  = CK_UNAVAILABLE
22860 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a 0a 09  _INFORMATION;...
22870 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
22880 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
22890 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52  KR_OK (%i)", CKR
228a0 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  _OK);...return(C
228b0 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  KR_OK);.}..CK_DE
228c0 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
228d0 5f 52 56 2c 20 43 5f 57 61 69 74 46 6f 72 53 6c  _RV, C_WaitForSl
228e0 6f 74 45 76 65 6e 74 29 28 43 4b 5f 46 4c 41 47  otEvent)(CK_FLAG
228f0 53 20 66 6c 61 67 73 2c 20 43 4b 5f 53 4c 4f 54  S flags, CK_SLOT
22900 5f 49 44 5f 50 54 52 20 70 53 6c 6f 74 49 44 2c  _ID_PTR pSlotID,
22910 20 43 4b 5f 56 4f 49 44 5f 50 54 52 20 70 52 65   CK_VOID_PTR pRe
22920 73 65 72 76 65 64 29 20 7b 0a 09 43 41 43 4b 45  served) {..CACKE
22930 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
22940 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
22950 28 70 52 65 73 65 72 76 65 64 20 21 3d 20 4e 55  (pReserved != NU
22960 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
22970 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
22980 6f 72 2e 20 70 52 65 73 65 72 76 65 64 20 69 73  or. pReserved is
22990 20 6e 6f 74 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09   not NULL.");...
229a0 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55  .return(CKR_ARGU
229b0 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a  MENTS_BAD);..}..
229c0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
229d0 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
229e0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
229f0 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
22a00 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
22a10 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
22a20 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
22a30 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 2f 2a 20  LIZED);..}.../* 
22a40 58 58 58 3a 20 54 4f 44 4f 3a 20 49 6d 70 6c 65  XXX: TODO: Imple
22a50 6d 65 6e 74 20 74 68 69 73 2e 2e 2e 20 2a 2f 0a  ment this... */.
22a60 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
22a70 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
22a80 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
22a90 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
22aa0 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
22ab0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
22ac0 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
22ad0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
22ae0 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
22af0 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
22b00 2c 20 43 5f 47 65 74 4d 65 63 68 61 6e 69 73 6d  , C_GetMechanism
22b10 4c 69 73 74 29 28 43 4b 5f 53 4c 4f 54 5f 49 44  List)(CK_SLOT_ID
22b20 20 73 6c 6f 74 49 44 2c 20 43 4b 5f 4d 45 43 48   slotID, CK_MECH
22b30 41 4e 49 53 4d 5f 54 59 50 45 5f 50 54 52 20 70  ANISM_TYPE_PTR p
22b40 4d 65 63 68 61 6e 69 73 6d 4c 69 73 74 2c 20 43  MechanismList, C
22b50 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 43  K_ULONG_PTR pulC
22b60 6f 75 6e 74 29 20 7b 0a 09 43 41 43 4b 45 59 5f  ount) {..CACKEY_
22b70 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
22b80 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
22b90 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
22ba0 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
22bb0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
22bc0 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
22bd0 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
22be0 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
22bf0 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
22c00 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 75 6c 43 6f  ;..}...if (pulCo
22c10 75 6e 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  unt == NULL) {..
22c20 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
22c30 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 70 75  INTF("Error.  pu
22c40 6c 43 6f 75 6e 74 20 69 73 20 4e 55 4c 4c 2e 22  lCount is NULL."
22c50 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
22c60 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b  _ARGUMENTS_BAD);
22c70 0a 09 7d 0a 0a 09 69 66 20 28 70 4d 65 63 68 61  ..}...if (pMecha
22c80 6e 69 73 6d 4c 69 73 74 20 3d 3d 20 4e 55 4c 4c  nismList == NULL
22c90 29 20 7b 0a 09 09 2a 70 75 6c 43 6f 75 6e 74 20  ) {...*pulCount 
22ca0 3d 20 31 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  = 1;....CACKEY_D
22cb0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
22cc0 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25  urning CKR_OK (%
22cd0 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09  i)", CKR_OK);...
22ce0 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b  .return(CKR_OK);
22cf0 0a 09 7d 0a 0a 09 69 66 20 28 2a 70 75 6c 43 6f  ..}...if (*pulCo
22d00 75 6e 74 20 3c 20 31 29 20 7b 0a 09 09 43 41 43  unt < 1) {...CAC
22d10 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
22d20 28 22 45 72 72 6f 72 2e 20 20 42 75 66 66 65 72  ("Error.  Buffer
22d30 20 74 6f 6f 20 73 6d 61 6c 6c 2e 22 29 3b 0a 0a   too small.");..
22d40 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 42 55 46  ..return(CKR_BUF
22d50 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 3b 0a  FER_TOO_SMALL);.
22d60 09 7d 0a 0a 09 70 4d 65 63 68 61 6e 69 73 6d 4c  .}...pMechanismL
22d70 69 73 74 5b 30 5d 20 3d 20 43 4b 4d 5f 52 53 41  ist[0] = CKM_RSA
22d80 5f 50 4b 43 53 3b 0a 09 2a 70 75 6c 43 6f 75 6e  _PKCS;..*pulCoun
22d90 74 20 3d 20 31 3b 0a 0a 09 43 41 43 4b 45 59 5f  t = 1;...CACKEY_
22da0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
22db0 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28  turning CKR_OK (
22dc0 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a  %i)", CKR_OK);..
22dd0 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b  .return(CKR_OK);
22de0 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
22df0 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
22e00 47 65 74 4d 65 63 68 61 6e 69 73 6d 49 6e 66 6f  GetMechanismInfo
22e10 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f  )(CK_SLOT_ID slo
22e20 74 49 44 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53  tID, CK_MECHANIS
22e30 4d 5f 54 59 50 45 20 74 79 70 65 2c 20 43 4b 5f  M_TYPE type, CK_
22e40 4d 45 43 48 41 4e 49 53 4d 5f 49 4e 46 4f 5f 50  MECHANISM_INFO_P
22e50 54 52 20 70 49 6e 66 6f 29 20 7b 0a 09 69 6e 74  TR pInfo) {..int
22e60 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a   mutex_retval;..
22e70 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
22e80 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
22e90 0a 0a 09 69 66 20 28 70 49 6e 66 6f 20 3d 3d 20  ...if (pInfo == 
22ea0 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
22eb0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
22ec0 72 72 6f 72 2e 20 70 49 6e 66 6f 20 69 73 20 4e  rror. pInfo is N
22ed0 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  ULL.");....retur
22ee0 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f  n(CKR_ARGUMENTS_
22ef0 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21  BAD);..}...if (!
22f00 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
22f10 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
22f20 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
22f30 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
22f40 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
22f50 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
22f60 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
22f70 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 49  ;..}...if (slotI
22f80 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20  D < 0 || slotID 
22f90 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65  >= (sizeof(cacke
22fa0 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f  y_slots) / sizeo
22fb0 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30  f(cackey_slots[0
22fc0 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ]))) {...CACKEY_
22fd0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
22fe0 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f  ror. Invalid slo
22ff0 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75  t requested (%lu
23000 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 76 61  ), outside of va
23010 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74  lid range", slot
23020 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  ID);....return(C
23030 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c  KR_SLOT_ID_INVAL
23040 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f  ID);..}...mutex_
23050 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
23060 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65  mutex_lock(cacke
23070 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
23080 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
23090 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
230a0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
230b0 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69  or.  Locking fai
230c0 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
230d0 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
230e0 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63  ROR);..}...if (c
230f0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
23100 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 29  ID].active == 0)
23110 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
23120 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
23130 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65   Invalid slot re
23140 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 73  quested (%lu), s
23150 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c  lot not currentl
23160 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 49  y active", slotI
23170 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75  D);....cackey_mu
23180 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
23190 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72  y_biglock);....r
231a0 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49  eturn(CKR_SLOT_I
231b0 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  D_INVALID);..}..
231c0 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
231d0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
231e0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
231f0 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
23200 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
23210 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
23220 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e  INTF("Error.  Un
23230 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  locking failed."
23240 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
23250 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
23260 0a 09 7d 0a 0a 09 73 77 69 74 63 68 20 28 74 79  ..}...switch (ty
23270 70 65 29 20 7b 0a 09 09 63 61 73 65 20 43 4b 4d  pe) {...case CKM
23280 5f 52 53 41 5f 50 4b 43 53 3a 0a 09 09 09 70 49  _RSA_PKCS:....pI
23290 6e 66 6f 2d 3e 75 6c 4d 69 6e 4b 65 79 53 69 7a  nfo->ulMinKeySiz
232a0 65 20 3d 20 35 31 32 3b 0a 09 09 09 70 49 6e 66  e = 512;....pInf
232b0 6f 2d 3e 75 6c 4d 61 78 4b 65 79 53 69 7a 65 20  o->ulMaxKeySize 
232c0 3d 20 38 31 39 32 3b 0a 09 09 09 70 49 6e 66 6f  = 8192;....pInfo
232d0 2d 3e 66 6c 61 67 73 20 3d 20 43 4b 46 5f 48 57  ->flags = CKF_HW
232e0 20 7c 20 43 4b 46 5f 45 4e 43 52 59 50 54 20 7c   | CKF_ENCRYPT |
232f0 20 43 4b 46 5f 44 45 43 52 59 50 54 20 7c 20 43   CKF_DECRYPT | C
23300 4b 46 5f 53 49 47 4e 20 7c 20 43 4b 46 5f 56 45  KF_SIGN | CKF_VE
23310 52 49 46 59 3b 0a 09 09 09 62 72 65 61 6b 3b 0a  RIFY;....break;.
23320 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
23330 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
23340 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22  ing CKR_OK (%i)"
23350 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74  , CKR_OK);...ret
23360 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a  urn(CKR_OK);.}..
23370 2f 2a 20 57 65 20 64 6f 6e 27 74 20 73 75 70 70  /* We don't supp
23380 6f 72 74 20 74 68 69 73 20 6d 65 74 68 6f 64 2e  ort this method.
23390 20 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55   */.CK_DEFINE_FU
233a0 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
233b0 49 6e 69 74 54 6f 6b 65 6e 29 28 43 4b 5f 53 4c  InitToken)(CK_SL
233c0 4f 54 5f 49 44 20 73 6c 6f 74 49 44 2c 20 43 4b  OT_ID slotID, CK
233d0 5f 55 54 46 38 43 48 41 52 5f 50 54 52 20 70 50  _UTF8CHAR_PTR pP
233e0 69 6e 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50  in, CK_ULONG ulP
233f0 69 6e 4c 65 6e 2c 20 43 4b 5f 55 54 46 38 43 48  inLen, CK_UTF8CH
23400 41 52 5f 50 54 52 20 70 4c 61 62 65 6c 29 20 7b  AR_PTR pLabel) {
23410 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
23420 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
23430 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
23440 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
23450 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
23460 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
23470 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
23480 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
23490 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
234a0 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
234b0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
234c0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
234d0 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49 54 45 5f 50  KR_TOKEN_WRITE_P
234e0 52 4f 54 45 43 54 45 44 20 28 25 69 29 22 2c 20  ROTECTED (%i)", 
234f0 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49 54 45 5f  CKR_TOKEN_WRITE_
23500 50 52 4f 54 45 43 54 45 44 29 3b 0a 0a 09 72 65  PROTECTED);...re
23510 74 75 72 6e 28 43 4b 52 5f 54 4f 4b 45 4e 5f 57  turn(CKR_TOKEN_W
23520 52 49 54 45 5f 50 52 4f 54 45 43 54 45 44 29 3b  RITE_PROTECTED);
23530 0a 7d 0a 0a 2f 2a 20 57 65 20 64 6f 6e 27 74 20  .}../* We don't 
23540 73 75 70 70 6f 72 74 20 74 68 69 73 20 6d 65 74  support this met
23550 68 6f 64 2e 20 2a 2f 0a 43 4b 5f 44 45 46 49 4e  hod. */.CK_DEFIN
23560 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
23570 2c 20 43 5f 49 6e 69 74 50 49 4e 29 28 43 4b 5f  , C_InitPIN)(CK_
23580 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
23590 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 55 54 46 38  Session, CK_UTF8
235a0 43 48 41 52 5f 50 54 52 20 70 50 69 6e 2c 20 43  CHAR_PTR pPin, C
235b0 4b 5f 55 4c 4f 4e 47 20 75 6c 50 69 6e 4c 65 6e  K_ULONG ulPinLen
235c0 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
235d0 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
235e0 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
235f0 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
23600 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
23610 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
23620 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
23630 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
23640 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
23650 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
23660 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
23670 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
23680 67 20 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49 54  g CKR_TOKEN_WRIT
23690 45 5f 50 52 4f 54 45 43 54 45 44 20 28 25 69 29  E_PROTECTED (%i)
236a0 22 2c 20 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49  ", CKR_TOKEN_WRI
236b0 54 45 5f 50 52 4f 54 45 43 54 45 44 29 3b 0a 0a  TE_PROTECTED);..
236c0 09 72 65 74 75 72 6e 28 43 4b 52 5f 54 4f 4b 45  .return(CKR_TOKE
236d0 4e 5f 57 52 49 54 45 5f 50 52 4f 54 45 43 54 45  N_WRITE_PROTECTE
236e0 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
236f0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
23700 20 43 5f 53 65 74 50 49 4e 29 28 43 4b 5f 53 45   C_SetPIN)(CK_SE
23710 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
23720 73 73 69 6f 6e 2c 20 43 4b 5f 55 54 46 38 43 48  ssion, CK_UTF8CH
23730 41 52 5f 50 54 52 20 70 4f 6c 64 50 69 6e 2c 20  AR_PTR pOldPin, 
23740 43 4b 5f 55 4c 4f 4e 47 20 75 6c 4f 6c 64 50 69  CK_ULONG ulOldPi
23750 6e 4c 65 6e 2c 20 43 4b 5f 55 54 46 38 43 48 41  nLen, CK_UTF8CHA
23760 52 5f 50 54 52 20 70 4e 65 77 50 69 6e 2c 20 43  R_PTR pNewPin, C
23770 4b 5f 55 4c 4f 4e 47 20 75 6c 4e 65 77 50 69 6e  K_ULONG ulNewPin
23780 4c 65 6e 29 20 7b 0a 09 63 68 61 72 20 6f 6c 64  Len) {..char old
23790 70 69 6e 62 75 66 5b 36 34 5d 2c 20 6e 65 77 70  pinbuf[64], newp
237a0 69 6e 62 75 66 5b 36 34 5d 3b 0a 09 63 61 63 6b  inbuf[64];..cack
237b0 65 79 5f 72 65 74 20 73 65 74 5f 70 69 6e 5f 72  ey_ret set_pin_r
237c0 65 74 2c 20 67 65 74 5f 70 69 6e 5f 72 65 74 3b  et, get_pin_ret;
237d0 0a 09 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f  ..CK_SLOT_ID slo
237e0 74 49 44 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f  tID;..int mutex_
237f0 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59  retval;...CACKEY
23800 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
23810 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
23820 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
23830 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
23840 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
23850 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
23860 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
23870 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
23880 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
23890 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65  );..}...mutex_re
238a0 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
238b0 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  tex_lock(cackey_
238c0 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
238d0 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
238e0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
238f0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
23900 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65  .  Locking faile
23910 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
23920 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
23930 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61  R);..}...if (!ca
23940 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
23950 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20  ession].active) 
23960 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  {...cackey_mutex
23970 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
23980 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b  iglock);....CACK
23990 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
239a0 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e  "Error.  Session
239b0 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a   not active.");.
239c0 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
239d0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49  SESSION_HANDLE_I
239e0 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 73 6c  NVALID);..}...sl
239f0 6f 74 49 44 20 3d 20 63 61 63 6b 65 79 5f 73 65  otID = cackey_se
23a00 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
23a10 2e 73 6c 6f 74 49 44 3b 0a 0a 09 69 66 20 28 73  .slotID;...if (s
23a20 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f  lotID < 0 || slo
23a30 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63  tID >= (sizeof(c
23a40 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73  ackey_slots) / s
23a50 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f  izeof(cackey_slo
23a60 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43  ts[0]))) {...CAC
23a70 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
23a80 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64  ("Error. Invalid
23a90 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20   slot requested 
23aa0 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f  (%lu), outside o
23ab0 66 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20  f valid range", 
23ac0 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b  slotID);....cack
23ad0 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
23ae0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
23af0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
23b00 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
23b10 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73  }...if (cackey_s
23b20 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74  lots[slotID].act
23b30 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41  ive == 0) {...CA
23b40 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
23b50 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69  F("Error. Invali
23b60 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64  d slot requested
23b70 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74   (%lu), slot not
23b80 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76   currently activ
23b90 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09  e", slotID);....
23ba0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
23bb0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
23bc0 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  ck);....return(C
23bd0 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
23be0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b  );..}...if (cack
23bf0 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20 21  ey_pin_command !
23c00 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 2f 2a 20 47  = NULL) {.../* G
23c10 65 74 20 6f 6c 64 20 50 49 4e 20 2a 2f 0a 09 09  et old PIN */...
23c20 67 65 74 5f 70 69 6e 5f 72 65 74 20 3d 20 63 61  get_pin_ret = ca
23c30 63 6b 65 79 5f 67 65 74 5f 70 69 6e 28 6f 6c 64  ckey_get_pin(old
23c40 70 69 6e 62 75 66 29 3b 0a 0a 09 09 69 66 20 28  pinbuf);....if (
23c50 67 65 74 5f 70 69 6e 5f 72 65 74 20 21 3d 20 43  get_pin_ret != C
23c60 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29  ACKEY_PCSC_S_OK)
23c70 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
23c80 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
23c90 20 77 68 69 6c 65 20 67 65 74 74 69 6e 67 20 4f   while getting O
23ca0 6c 64 20 50 49 4e 2c 20 72 65 74 75 72 6e 69 6e  ld PIN, returnin
23cb0 67 20 43 4b 52 5f 50 49 4e 5f 49 4e 43 4f 52 52  g CKR_PIN_INCORR
23cc0 45 43 54 2e 22 29 3b 0a 0a 09 09 09 63 61 63 6b  ECT.");.....cack
23cd0 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
23ce0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
23cf0 0a 09 09 09 0a 09 09 09 72 65 74 75 72 6e 28 43  ........return(C
23d00 4b 52 5f 50 49 4e 5f 49 4e 43 4f 52 52 45 43 54  KR_PIN_INCORRECT
23d10 29 3b 0a 09 09 7d 0a 0a 09 09 70 4f 6c 64 50 69  );...}....pOldPi
23d20 6e 20 3d 20 28 43 4b 5f 55 54 46 38 43 48 41 52  n = (CK_UTF8CHAR
23d30 5f 50 54 52 29 20 6f 6c 64 70 69 6e 62 75 66 3b  _PTR) oldpinbuf;
23d40 0a 09 09 75 6c 4f 6c 64 50 69 6e 4c 65 6e 20 3d  ...ulOldPinLen =
23d50 20 73 74 72 6c 65 6e 28 6f 6c 64 70 69 6e 62 75   strlen(oldpinbu
23d60 66 29 3b 0a 0a 09 09 2f 2a 20 47 65 74 20 6e 65  f);..../* Get ne
23d70 77 20 50 49 4e 20 2a 2f 0a 09 09 67 65 74 5f 70  w PIN */...get_p
23d80 69 6e 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f  in_ret = cackey_
23d90 67 65 74 5f 70 69 6e 28 6e 65 77 70 69 6e 62 75  get_pin(newpinbu
23da0 66 29 3b 0a 0a 09 09 69 66 20 28 67 65 74 5f 70  f);....if (get_p
23db0 69 6e 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59  in_ret != CACKEY
23dc0 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09  _PCSC_S_OK) {...
23dd0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
23de0 49 4e 54 46 28 22 45 72 72 6f 72 20 77 68 69 6c  INTF("Error whil
23df0 65 20 67 65 74 74 69 6e 67 20 4e 65 77 20 50 49  e getting New PI
23e00 4e 2c 20 72 65 74 75 72 6e 69 6e 67 20 43 4b 52  N, returning CKR
23e10 5f 50 49 4e 5f 49 4e 56 41 4c 49 44 2e 22 29 3b  _PIN_INVALID.");
23e20 0a 0a 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65  .....cackey_mute
23e30 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
23e40 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 09 0a 09 09  biglock);.......
23e50 09 72 65 74 75 72 6e 28 43 4b 52 5f 50 49 4e 5f  .return(CKR_PIN_
23e60 49 4e 56 41 4c 49 44 29 3b 0a 09 09 7d 0a 0a 09  INVALID);...}...
23e70 09 70 4e 65 77 50 69 6e 20 3d 20 28 43 4b 5f 55  .pNewPin = (CK_U
23e80 54 46 38 43 48 41 52 5f 50 54 52 29 20 6e 65 77  TF8CHAR_PTR) new
23e90 70 69 6e 62 75 66 3b 0a 09 09 75 6c 4e 65 77 50  pinbuf;...ulNewP
23ea0 69 6e 4c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 6e  inLen = strlen(n
23eb0 65 77 70 69 6e 62 75 66 29 3b 0a 09 7d 0a 0a 09  ewpinbuf);..}...
23ec0 69 66 20 28 70 4f 6c 64 50 69 6e 20 3d 3d 20 4e  if (pOldPin == N
23ed0 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
23ee0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4f 6c  DEBUG_PRINTF("Ol
23ef0 64 20 50 49 4e 20 76 61 6c 75 65 20 69 73 20 77  d PIN value is w
23f00 72 6f 6e 67 20 28 6e 75 6c 6c 29 2e 22 29 3b 0a  rong (null).");.
23f10 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
23f20 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
23f30 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72  glock);....retur
23f40 6e 28 43 4b 52 5f 50 49 4e 5f 49 4e 43 4f 52 52  n(CKR_PIN_INCORR
23f50 45 43 54 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75  ECT);..}...if (u
23f60 6c 4f 6c 64 50 69 6e 4c 65 6e 20 3d 3d 20 30 20  lOldPinLen == 0 
23f70 7c 7c 20 75 6c 4f 6c 64 50 69 6e 4c 65 6e 20 3e  || ulOldPinLen >
23f80 20 38 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   8) {...CACKEY_D
23f90 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4f 6c 64  EBUG_PRINTF("Old
23fa0 20 50 49 4e 20 6c 65 6e 67 74 68 20 69 73 20 77   PIN length is w
23fb0 72 6f 6e 67 3a 20 25 6c 75 2e 22 2c 20 28 75 6e  rong: %lu.", (un
23fc0 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 4f  signed long) ulO
23fd0 6c 64 50 69 6e 4c 65 6e 29 3b 0a 0a 09 09 63 61  ldPinLen);....ca
23fe0 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
23ff0 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
24000 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
24010 5f 50 49 4e 5f 49 4e 43 4f 52 52 45 43 54 29 3b  _PIN_INCORRECT);
24020 0a 09 7d 0a 0a 09 69 66 20 28 70 4e 65 77 50 69  ..}...if (pNewPi
24030 6e 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  n == NULL) {...C
24040 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
24050 54 46 28 22 4e 65 77 20 50 49 4e 20 76 61 6c 75  TF("New PIN valu
24060 65 20 69 73 20 77 72 6f 6e 67 20 28 65 69 74 68  e is wrong (eith
24070 65 72 20 4e 55 4c 4c 2c 20 6f 72 20 74 6f 6f 20  er NULL, or too 
24080 6c 6f 6e 67 2f 73 68 6f 72 74 29 2e 22 29 3b 0a  long/short).");.
24090 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
240a0 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
240b0 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72  glock);....retur
240c0 6e 28 43 4b 52 5f 50 49 4e 5f 49 4e 56 41 4c 49  n(CKR_PIN_INVALI
240d0 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 6c 4e  D);..}...if (ulN
240e0 65 77 50 69 6e 4c 65 6e 20 3c 20 35 20 7c 7c 20  ewPinLen < 5 || 
240f0 75 6c 4e 65 77 50 69 6e 4c 65 6e 20 3e 20 38 29  ulNewPinLen > 8)
24100 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
24110 47 5f 50 52 49 4e 54 46 28 22 4e 65 77 20 50 49  G_PRINTF("New PI
24120 4e 20 6c 65 6e 67 74 68 20 69 73 20 77 72 6f 6e  N length is wron
24130 67 3a 20 25 6c 75 2c 20 6d 75 73 74 20 62 65 20  g: %lu, must be 
24140 61 74 6c 65 61 73 74 20 35 20 61 6e 64 20 6e 6f  atleast 5 and no
24150 20 6d 6f 72 65 20 74 68 61 6e 20 38 2e 22 2c 20   more than 8.", 
24160 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
24170 75 6c 4e 65 77 50 69 6e 4c 65 6e 29 3b 0a 0a 09  ulNewPinLen);...
24180 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
24190 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
241a0 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  ock);....return(
241b0 43 4b 52 5f 50 49 4e 5f 4c 45 4e 5f 52 41 4e 47  CKR_PIN_LEN_RANG
241c0 45 29 3b 0a 09 7d 0a 0a 09 73 65 74 5f 70 69 6e  E);..}...set_pin
241d0 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65  _ret = cackey_se
241e0 74 5f 70 69 6e 28 26 63 61 63 6b 65 79 5f 73 6c  t_pin(&cackey_sl
241f0 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c 20 70 4f 6c  ots[slotID], pOl
24200 64 50 69 6e 2c 20 75 6c 4f 6c 64 50 69 6e 4c 65  dPin, ulOldPinLe
24210 6e 2c 20 70 4e 65 77 50 69 6e 2c 20 75 6c 4e 65  n, pNewPin, ulNe
24220 77 50 69 6e 4c 65 6e 29 3b 0a 0a 09 69 66 20 28  wPinLen);...if (
24230 73 65 74 5f 70 69 6e 5f 72 65 74 20 21 3d 20 43  set_pin_ret != C
24240 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29  ACKEY_PCSC_S_OK)
24250 20 7b 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f   {...if (cackey_
24260 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20 3d 3d 20 4e  pin_command == N
24270 55 4c 4c 29 20 7b 0a 09 09 09 63 61 63 6b 65 79  ULL) {....cackey
24280 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 74  _slots[slotID].t
24290 6f 6b 65 6e 5f 66 6c 61 67 73 20 7c 3d 20 43 4b  oken_flags |= CK
242a0 46 5f 4c 4f 47 49 4e 5f 52 45 51 55 49 52 45 44  F_LOGIN_REQUIRED
242b0 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 73 65 74  ;...}....if (set
242c0 5f 70 69 6e 5f 72 65 74 20 3d 3d 20 43 41 43 4b  _pin_ret == CACK
242d0 45 59 5f 50 43 53 43 5f 45 5f 4c 4f 43 4b 45 44  EY_PCSC_E_LOCKED
242e0 29 20 7b 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c  ) {....cackey_sl
242f0 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 74 6f 6b 65  ots[slotID].toke
24300 6e 5f 66 6c 61 67 73 20 7c 3d 20 43 4b 46 5f 55  n_flags |= CKF_U
24310 53 45 52 5f 50 49 4e 5f 4c 4f 43 4b 45 44 3b 0a  SER_PIN_LOCKED;.
24320 09 09 7d 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  ..}..}...mutex_r
24330 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
24340 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
24350 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
24360 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
24370 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
24380 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
24390 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20  ror.  Unlocking 
243a0 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
243b0 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
243c0 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 73 77  _ERROR);..}...sw
243d0 69 74 63 68 20 28 73 65 74 5f 70 69 6e 5f 72 65  itch (set_pin_re
243e0 74 29 20 7b 0a 09 09 63 61 73 65 20 43 41 43 4b  t) {...case CACK
243f0 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 3a 0a 09 09  EY_PCSC_S_OK:...
24400 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
24410 49 4e 54 46 28 22 53 75 63 63 65 73 73 66 75 6c  INTF("Successful
24420 6c 79 20 73 65 74 20 50 49 4e 2e 22 29 3b 0a 0a  ly set PIN.");..
24430 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b  ...return(CKR_OK
24440 29 3b 0a 09 09 63 61 73 65 20 43 41 43 4b 45 59  );...case CACKEY
24450 5f 50 43 53 43 5f 45 5f 42 41 44 50 49 4e 3a 0a  _PCSC_E_BADPIN:.
24460 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
24470 50 52 49 4e 54 46 28 22 50 49 4e 20 77 61 73 20  PRINTF("PIN was 
24480 69 6e 76 61 6c 69 64 2e 22 29 3b 0a 0a 09 09 09  invalid.");.....
24490 72 65 74 75 72 6e 28 43 4b 52 5f 50 49 4e 5f 49  return(CKR_PIN_I
244a0 4e 56 41 4c 49 44 29 3b 0a 09 09 63 61 73 65 20  NVALID);...case 
244b0 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4c 4f  CACKEY_PCSC_E_LO
244c0 43 4b 45 44 3a 0a 09 09 09 43 41 43 4b 45 59 5f  CKED:....CACKEY_
244d0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54 6f  DEBUG_PRINTF("To
244e0 6b 65 6e 20 69 73 20 6c 6f 63 6b 65 64 20 6f 72  ken is locked or
244f0 20 74 68 69 73 20 63 68 61 6e 67 65 20 69 73 20   this change is 
24500 6e 6f 74 20 70 65 72 6d 69 74 74 65 64 2e 22 29  not permitted.")
24510 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 4b 52  ;.....return(CKR
24520 5f 50 49 4e 5f 4c 4f 43 4b 45 44 29 3b 0a 09 09  _PIN_LOCKED);...
24530 64 65 66 61 75 6c 74 3a 0a 09 09 09 43 41 43 4b  default:....CACK
24540 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
24550 22 53 6f 6d 65 74 68 69 6e 67 20 65 6c 73 65 20  "Something else 
24560 77 65 6e 74 20 77 72 6f 6e 67 20 63 68 61 6e 67  went wrong chang
24570 69 6e 67 20 74 68 65 20 50 49 4e 3a 20 25 69 22  ing the PIN: %i"
24580 2c 20 73 65 74 5f 70 69 6e 5f 72 65 74 29 3b 0a  , set_pin_ret);.
24590 0a 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
245a0 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
245b0 7d 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  }...return(CKR_G
245c0 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 7d  ENERAL_ERROR);.}
245d0 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
245e0 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 4f 70  TION(CK_RV, C_Op
245f0 65 6e 53 65 73 73 69 6f 6e 29 28 43 4b 5f 53 4c  enSession)(CK_SL
24600 4f 54 5f 49 44 20 73 6c 6f 74 49 44 2c 20 43 4b  OT_ID slotID, CK
24610 5f 46 4c 41 47 53 20 66 6c 61 67 73 2c 20 43 4b  _FLAGS flags, CK
24620 5f 56 4f 49 44 5f 50 54 52 20 70 41 70 70 6c 69  _VOID_PTR pAppli
24630 63 61 74 69 6f 6e 2c 20 43 4b 5f 4e 4f 54 49 46  cation, CK_NOTIF
24640 59 20 6e 6f 74 69 66 79 2c 20 43 4b 5f 53 45 53  Y notify, CK_SES
24650 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 50 54 52 20  SION_HANDLE_PTR 
24660 70 68 53 65 73 73 69 6f 6e 29 20 7b 0a 09 75 6e  phSession) {..un
24670 73 69 67 6e 65 64 20 6c 6f 6e 67 20 69 64 78 3b  signed long idx;
24680 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76  ..int mutex_retv
24690 61 6c 3b 0a 09 69 6e 74 20 66 6f 75 6e 64 5f 73  al;..int found_s
246a0 65 73 73 69 6f 6e 20 3d 20 30 3b 0a 0a 09 43 41  ession = 0;...CA
246b0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
246c0 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
246d0 69 66 20 28 28 66 6c 61 67 73 20 26 20 43 4b 46  if ((flags & CKF
246e0 5f 53 45 52 49 41 4c 5f 53 45 53 53 49 4f 4e 29  _SERIAL_SESSION)
246f0 20 21 3d 20 43 4b 46 5f 53 45 52 49 41 4c 5f 53   != CKF_SERIAL_S
24700 45 53 53 49 4f 4e 29 20 7b 0a 09 09 72 65 74 75  ESSION) {...retu
24710 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 50  rn(CKR_SESSION_P
24720 41 52 41 4c 4c 45 4c 5f 4e 4f 54 5f 53 55 50 50  ARALLEL_NOT_SUPP
24730 4f 52 54 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  ORTED);..}...if 
24740 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
24750 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
24760 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
24770 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
24780 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
24790 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
247a0 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
247b0 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f  D);..}...if (slo
247c0 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49  tID < 0 || slotI
247d0 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63  D >= (sizeof(cac
247e0 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a  key_slots) / siz
247f0 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
24800 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45  [0]))) {...CACKE
24810 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
24820 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73  Error. Invalid s
24830 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25  lot requested (%
24840 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20  lu), outside of 
24850 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c  valid range", sl
24860 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e  otID);....return
24870 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56  (CKR_SLOT_ID_INV
24880 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65  ALID);..}...mute
24890 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
248a0 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63  y_mutex_lock(cac
248b0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
248c0 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
248d0 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
248e0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
248f0 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66  rror.  Locking f
24900 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
24910 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
24920 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20  ERROR);..}...if 
24930 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c  (cackey_slots[sl
24940 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20  otID].active == 
24950 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
24960 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
24970 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20  r. Invalid slot 
24980 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c  requested (%lu),
24990 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e   slot not curren
249a0 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f  tly active", slo
249b0 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f  tID);....cackey_
249c0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
249d0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
249e0 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54  .return(CKR_SLOT
249f0 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  _ID_INVALID);..}
24a00 0a 0a 09 2f 2a 20 56 65 72 69 66 79 20 74 68 61  .../* Verify tha
24a10 74 20 74 68 65 20 63 61 72 64 20 69 73 20 61 63  t the card is ac
24a20 74 75 61 6c 6c 79 20 69 6e 20 74 68 65 20 73 6c  tually in the sl
24a30 6f 74 2e 20 2a 2f 0a 09 2f 2a 20 58 58 58 3a 20  ot. */../* XXX: 
24a40 43 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75  Check to make su
24a50 72 65 20 74 68 69 73 20 69 73 20 69 6e 20 74 68  re this is in th
24a60 65 20 50 4b 43 53 23 31 31 20 73 70 65 63 69 66  e PKCS#11 specif
24a70 69 63 61 74 69 6f 6e 20 2a 2f 0a 09 69 66 20 28  ication */..if (
24a80 63 61 63 6b 65 79 5f 74 6f 6b 65 6e 5f 70 72 65  cackey_token_pre
24a90 73 65 6e 74 28 26 63 61 63 6b 65 79 5f 73 6c 6f  sent(&cackey_slo
24aa0 74 73 5b 73 6c 6f 74 49 44 5d 29 20 21 3d 20 43  ts[slotID]) != C
24ab0 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 54 4f 4b  ACKEY_PCSC_S_TOK
24ac0 45 4e 50 52 45 53 45 4e 54 29 20 7b 0a 09 09 43  ENPRESENT) {...C
24ad0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
24ae0 54 46 28 22 45 72 72 6f 72 2e 20 20 43 61 72 64  TF("Error.  Card
24af0 20 6e 6f 74 20 70 72 65 73 65 6e 74 2e 20 20 52   not present.  R
24b00 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 44 45 56  eturning CKR_DEV
24b10 49 43 45 5f 52 45 4d 4f 56 45 44 22 29 3b 0a 0a  ICE_REMOVED");..
24b20 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
24b30 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
24b40 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e  lock);....return
24b50 28 43 4b 52 5f 44 45 56 49 43 45 5f 52 45 4d 4f  (CKR_DEVICE_REMO
24b60 56 45 44 29 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28  VED);..}...for (
24b70 69 64 78 20 3d 20 31 3b 20 69 64 78 20 3c 20 28  idx = 1; idx < (
24b80 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
24b90 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66  ssions) / sizeof
24ba0 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
24bb0 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29 20 7b 0a  [0])); idx++) {.
24bc0 09 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65  ..if (!cackey_se
24bd0 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 61 63 74 69  ssions[idx].acti
24be0 76 65 29 20 7b 0a 09 09 09 66 6f 75 6e 64 5f 73  ve) {....found_s
24bf0 65 73 73 69 6f 6e 20 3d 20 31 3b 0a 0a 09 09 09  ession = 1;.....
24c00 2a 70 68 53 65 73 73 69 6f 6e 20 3d 20 69 64 78  *phSession = idx
24c10 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73  ;.....cackey_ses
24c20 73 69 6f 6e 73 5b 69 64 78 5d 2e 61 63 74 69 76  sions[idx].activ
24c30 65 20 3d 20 31 3b 0a 09 09 09 63 61 63 6b 65 79  e = 1;....cackey
24c40 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 73  _sessions[idx].s
24c50 6c 6f 74 49 44 20 3d 20 73 6c 6f 74 49 44 3b 0a  lotID = slotID;.
24c60 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
24c70 6e 73 5b 69 64 78 5d 2e 73 74 61 74 65 20 3d 20  ns[idx].state = 
24c80 43 4b 53 5f 52 4f 5f 50 55 42 4c 49 43 5f 53 45  CKS_RO_PUBLIC_SE
24c90 53 53 49 4f 4e 3b 0a 09 09 09 63 61 63 6b 65 79  SSION;....cackey
24ca0 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 66  _sessions[idx].f
24cb0 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 09 09  lags = flags;...
24cc0 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
24cd0 5b 69 64 78 5d 2e 75 6c 44 65 76 69 63 65 45 72  [idx].ulDeviceEr
24ce0 72 6f 72 20 3d 20 30 3b 0a 09 09 09 63 61 63 6b  ror = 0;....cack
24cf0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d  ey_sessions[idx]
24d00 2e 70 41 70 70 6c 69 63 61 74 69 6f 6e 20 3d 20  .pApplication = 
24d10 70 41 70 70 6c 69 63 61 74 69 6f 6e 3b 0a 09 09  pApplication;...
24d20 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
24d30 5b 69 64 78 5d 2e 4e 6f 74 69 66 79 20 3d 20 6e  [idx].Notify = n
24d40 6f 74 69 66 79 3b 0a 0a 09 09 09 63 61 63 6b 65  otify;.....cacke
24d50 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e  y_sessions[idx].
24d60 69 64 65 6e 74 69 74 69 65 73 20 3d 20 4e 55 4c  identities = NUL
24d70 4c 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73  L;....cackey_ses
24d80 73 69 6f 6e 73 5b 69 64 78 5d 2e 69 64 65 6e 74  sions[idx].ident
24d90 69 74 69 65 73 5f 63 6f 75 6e 74 20 3d 20 30 3b  ities_count = 0;
24da0 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73  .....cackey_sess
24db0 69 6f 6e 73 5b 69 64 78 5d 2e 73 65 61 72 63 68  ions[idx].search
24dc0 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a 0a 09 09  _active = 0;....
24dd0 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
24de0 5b 69 64 78 5d 2e 73 69 67 6e 5f 61 63 74 69 76  [idx].sign_activ
24df0 65 20 3d 20 30 3b 0a 0a 09 09 09 63 61 63 6b 65  e = 0;.....cacke
24e00 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e  y_sessions[idx].
24e10 64 65 63 72 79 70 74 5f 61 63 74 69 76 65 20 3d  decrypt_active =
24e20 20 30 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73   0;.....cackey_s
24e30 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 69 64 65  essions[idx].ide
24e40 6e 74 69 74 69 65 73 20 3d 20 63 61 63 6b 65 79  ntities = cackey
24e50 5f 72 65 61 64 5f 69 64 65 6e 74 69 74 69 65 73  _read_identities
24e60 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73  (&cackey_slots[s
24e70 6c 6f 74 49 44 5d 2c 20 26 63 61 63 6b 65 79 5f  lotID], &cackey_
24e80 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 69 64  sessions[idx].id
24e90 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 29 3b  entities_count);
24ea0 0a 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d  ......break;...}
24eb0 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  ..}...mutex_retv
24ec0 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
24ed0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
24ee0 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
24ef0 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
24f00 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
24f10 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
24f20 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69  .  Unlocking fai
24f30 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
24f40 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
24f50 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21  ROR);..}...if (!
24f60 66 6f 75 6e 64 5f 73 65 73 73 69 6f 6e 29 20 7b  found_session) {
24f70 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
24f80 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
24f90 67 20 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 43 4f  g CKR_SESSION_CO
24fa0 55 4e 54 20 28 25 69 29 22 2c 20 43 4b 52 5f 53  UNT (%i)", CKR_S
24fb0 45 53 53 49 4f 4e 5f 43 4f 55 4e 54 29 3b 0a 0a  ESSION_COUNT);..
24fc0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53  ..return(CKR_SES
24fd0 53 49 4f 4e 5f 43 4f 55 4e 54 29 3b 0a 09 7d 0a  SION_COUNT);..}.
24fe0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
24ff0 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
25000 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43   CKR_OK (%i)", C
25010 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e  KR_OK);...return
25020 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f  (CKR_OK);.}..CK_
25030 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
25040 43 4b 5f 52 56 2c 20 43 5f 43 6c 6f 73 65 53 65  CK_RV, C_CloseSe
25050 73 73 69 6f 6e 29 28 43 4b 5f 53 45 53 53 49 4f  ssion)(CK_SESSIO
25060 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
25070 6e 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f  n) {..int mutex_
25080 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59  retval;...CACKEY
25090 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
250a0 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
250b0 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
250c0 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
250d0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
250e0 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
250f0 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
25100 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
25110 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
25120 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73  );..}...if (hSes
25130 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65  sion == 0 || hSe
25140 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66  ssion >= (sizeof
25150 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
25160 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
25170 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29  y_sessions[0])))
25180 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
25190 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
251a0 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66    Session out of
251b0 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09   range.");......
251c0 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
251d0 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  ON_HANDLE_INVALI
251e0 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  D);..}...mutex_r
251f0 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
25200 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79  utex_lock(cackey
25210 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
25220 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
25230 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
25240 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
25250 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c  r.  Locking fail
25260 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
25270 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
25280 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63  OR);..}...if (!c
25290 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
252a0 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29  Session].active)
252b0 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65   {...cackey_mute
252c0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
252d0 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43  biglock);....CAC
252e0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
252f0 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f  ("Error.  Sessio
25300 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b  n not active.");
25310 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
25320 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
25330 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 63  INVALID);..}...c
25340 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
25350 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 20  Session].active 
25360 3d 20 30 3b 0a 09 63 61 63 6b 65 79 5f 66 72 65  = 0;..cackey_fre
25370 65 5f 69 64 65 6e 74 69 74 69 65 73 28 63 61 63  e_identities(cac
25380 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
25390 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65  ssion].identitie
253a0 73 2c 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  s, cackey_sessio
253b0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65  ns[hSession].ide
253c0 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 29 3b 0a  ntities_count);.
253d0 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
253e0 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e   cackey_mutex_un
253f0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
25400 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
25410 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
25420 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
25430 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55  RINTF("Error.  U
25440 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e  nlocking failed.
25450 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
25460 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
25470 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
25480 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
25490 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69  rning CKR_OK (%i
254a0 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72  )", CKR_OK);...r
254b0 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d  eturn(CKR_OK);.}
254c0 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
254d0 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 43 6c  TION(CK_RV, C_Cl
254e0 6f 73 65 41 6c 6c 53 65 73 73 69 6f 6e 73 29 28  oseAllSessions)(
254f0 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49  CK_SLOT_ID slotI
25500 44 29 20 7b 0a 09 75 69 6e 74 33 32 5f 74 20 69  D) {..uint32_t i
25510 64 78 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72  dx;..int mutex_r
25520 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f  etval;...CACKEY_
25530 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
25540 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
25550 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
25560 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
25570 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
25580 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
25590 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
255a0 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
255b0 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
255c0 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 49  ;..}...if (slotI
255d0 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20  D < 0 || slotID 
255e0 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65  >= (sizeof(cacke
255f0 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f  y_slots) / sizeo
25600 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30  f(cackey_slots[0
25610 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ]))) {...CACKEY_
25620 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
25630 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f  ror. Invalid slo
25640 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75  t requested (%lu
25650 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 76 61  ), outside of va
25660 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74  lid range", slot
25670 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  ID);....return(C
25680 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c  KR_SLOT_ID_INVAL
25690 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f  ID);..}...mutex_
256a0 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
256b0 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65  mutex_lock(cacke
256c0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
256d0 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
256e0 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
256f0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
25700 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69  or.  Locking fai
25710 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
25720 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
25730 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63  ROR);..}...if (c
25740 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
25750 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 29  ID].active == 0)
25760 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
25770 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
25780 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65   Invalid slot re
25790 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 73  quested (%lu), s
257a0 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c  lot not currentl
257b0 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 49  y active", slotI
257c0 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75  D);....cackey_mu
257d0 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
257e0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72  y_biglock);....r
257f0 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49  eturn(CKR_SLOT_I
25800 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  D_INVALID);..}..
25810 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69  .for (idx = 0; i
25820 64 78 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63  dx < (sizeof(cac
25830 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20  key_sessions) / 
25840 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
25850 73 73 69 6f 6e 73 5b 30 5d 29 29 3b 20 69 64 78  ssions[0])); idx
25860 2b 2b 29 20 7b 0a 09 09 69 66 20 28 63 61 63 6b  ++) {...if (cack
25870 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d  ey_sessions[idx]
25880 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 09 69 66  .active) {....if
25890 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e   (cackey_session
258a0 73 5b 69 64 78 5d 2e 73 6c 6f 74 49 44 20 21 3d  s[idx].slotID !=
258b0 20 73 6c 6f 74 49 44 29 20 7b 0a 09 09 09 09 63   slotID) {.....c
258c0 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a 09  ontinue;....}...
258d0 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
258e0 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
258f0 6c 6f 63 6b 29 3b 0a 09 09 09 43 5f 43 6c 6f 73  lock);....C_Clos
25900 65 53 65 73 73 69 6f 6e 28 69 64 78 29 3b 0a 09  eSession(idx);..
25910 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c  ..cackey_mutex_l
25920 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
25930 63 6b 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 6d 75  ck);...}..}...mu
25940 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
25950 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
25960 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
25970 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
25980 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
25990 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
259a0 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63  F("Error.  Unloc
259b0 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
259c0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
259d0 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
259e0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
259f0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
25a00 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20  g CKR_OK (%i)", 
25a10 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72  CKR_OK);...retur
25a20 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b  n(CKR_OK);.}..CK
25a30 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
25a40 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 53 65 73  (CK_RV, C_GetSes
25a50 73 69 6f 6e 49 6e 66 6f 29 28 43 4b 5f 53 45 53  sionInfo)(CK_SES
25a60 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
25a70 73 69 6f 6e 2c 20 43 4b 5f 53 45 53 53 49 4f 4e  sion, CK_SESSION
25a80 5f 49 4e 46 4f 5f 50 54 52 20 70 49 6e 66 6f 29  _INFO_PTR pInfo)
25a90 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65   {..int mutex_re
25aa0 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  tval;...CACKEY_D
25ab0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
25ac0 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70 49  led.");...if (pI
25ad0 6e 66 6f 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  nfo == NULL) {..
25ae0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
25af0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 49 6e  INTF("Error. pIn
25b00 66 6f 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a  fo is NULL.");..
25b10 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47  ..return(CKR_ARG
25b20 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a  UMENTS_BAD);..}.
25b30 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
25b40 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
25b50 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
25b60 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
25b70 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
25b80 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
25b90 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
25ba0 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66  ALIZED);..}...if
25bb0 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20   (hSession == 0 
25bc0 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28  || hSession >= (
25bd0 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
25be0 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66  ssions) / sizeof
25bf0 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
25c00 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45  [0]))) {...CACKE
25c10 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
25c20 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20  Error.  Session 
25c30 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b  out of range.");
25c40 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
25c50 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
25c60 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d  INVALID);..}...m
25c70 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
25c80 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28  ckey_mutex_lock(
25c90 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
25ca0 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
25cb0 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
25cc0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
25cd0 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e  ("Error.  Lockin
25ce0 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
25cf0 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
25d00 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
25d10 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73  if (!cackey_sess
25d20 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61  ions[hSession].a
25d30 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65  ctive) {...cacke
25d40 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
25d50 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
25d60 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
25d70 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
25d80 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69  Session not acti
25d90 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ve.");......retu
25da0 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48  rn(CKR_SESSION_H
25db0 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a  ANDLE_INVALID);.
25dc0 09 7d 0a 0a 09 70 49 6e 66 6f 2d 3e 73 6c 6f 74  .}...pInfo->slot
25dd0 49 44 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73  ID = cackey_sess
25de0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
25df0 6c 6f 74 49 44 3b 0a 09 70 49 6e 66 6f 2d 3e 73  lotID;..pInfo->s
25e00 74 61 74 65 20 3d 20 63 61 63 6b 65 79 5f 73 65  tate = cackey_se
25e10 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
25e20 2e 73 74 61 74 65 3b 0a 09 70 49 6e 66 6f 2d 3e  .state;..pInfo->
25e30 66 6c 61 67 73 20 3d 20 63 61 63 6b 65 79 5f 73  flags = cackey_s
25e40 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
25e50 5d 2e 66 6c 61 67 73 3b 0a 09 70 49 6e 66 6f 2d  ].flags;..pInfo-
25e60 3e 75 6c 44 65 76 69 63 65 45 72 72 6f 72 20 3d  >ulDeviceError =
25e70 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73   cackey_sessions
25e80 5b 68 53 65 73 73 69 6f 6e 5d 2e 75 6c 44 65 76  [hSession].ulDev
25e90 69 63 65 45 72 72 6f 72 3b 0a 0a 09 6d 75 74 65  iceError;...mute
25ea0 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
25eb0 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
25ec0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
25ed0 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
25ee0 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
25ef0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
25f00 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69  "Error.  Unlocki
25f10 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
25f20 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
25f30 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
25f40 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
25f50 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
25f60 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b  CKR_OK (%i)", CK
25f70 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28  R_OK);...return(
25f80 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44  CKR_OK);.}..CK_D
25f90 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
25fa0 4b 5f 52 56 2c 20 43 5f 47 65 74 4f 70 65 72 61  K_RV, C_GetOpera
25fb0 74 69 6f 6e 53 74 61 74 65 29 28 43 4b 5f 53 45  tionState)(CK_SE
25fc0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
25fd0 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  ssion, CK_BYTE_P
25fe0 54 52 20 70 4f 70 65 72 61 74 69 6f 6e 53 74 61  TR pOperationSta
25ff0 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52  te, CK_ULONG_PTR
26000 20 70 75 6c 4f 70 65 72 61 74 69 6f 6e 53 74 61   pulOperationSta
26010 74 65 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59  teLen) {..CACKEY
26020 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
26030 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
26040 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
26050 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
26060 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
26070 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
26080 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
26090 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
260a0 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
260b0 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
260c0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
260d0 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
260e0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
260f0 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
26100 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
26110 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
26120 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
26130 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
26140 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
26150 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 65 74 4f 70  N(CK_RV, C_SetOp
26160 65 72 61 74 69 6f 6e 53 74 61 74 65 29 28 43 4b  erationState)(CK
26170 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
26180 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54  hSession, CK_BYT
26190 45 5f 50 54 52 20 70 4f 70 65 72 61 74 69 6f 6e  E_PTR pOperation
261a0 53 74 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20  State, CK_ULONG 
261b0 75 6c 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 65  ulOperationState
261c0 4c 65 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48  Len, CK_OBJECT_H
261d0 41 4e 44 4c 45 20 68 45 6e 63 72 79 70 74 69 6f  ANDLE hEncryptio
261e0 6e 4b 65 79 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f  nKey, CK_OBJECT_
261f0 48 41 4e 44 4c 45 20 68 41 75 74 68 65 6e 74 69  HANDLE hAuthenti
26200 63 61 74 69 6f 6e 4b 65 79 29 20 7b 0a 09 43 41  cationKey) {..CA
26210 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
26220 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
26230 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
26240 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
26250 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
26260 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
26270 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
26280 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
26290 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
262a0 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
262b0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
262c0 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
262d0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
262e0 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
262f0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
26300 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
26310 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
26320 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
26330 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
26340 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 5f 43 5f  CTION(CK_RV, _C_
26350 4c 6f 67 69 6e 4d 75 74 65 78 41 72 67 29 28 43  LoginMutexArg)(C
26360 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
26370 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 55 53   hSession, CK_US
26380 45 52 5f 54 59 50 45 20 75 73 65 72 54 79 70 65  ER_TYPE userType
26390 2c 20 43 4b 5f 55 54 46 38 43 48 41 52 5f 50 54  , CK_UTF8CHAR_PT
263a0 52 20 70 50 69 6e 2c 20 43 4b 5f 55 4c 4f 4e 47  R pPin, CK_ULONG
263b0 20 75 6c 50 69 6e 4c 65 6e 2c 20 69 6e 74 20 6c   ulPinLen, int l
263c0 6f 63 6b 5f 6d 75 74 65 78 29 20 7b 0a 09 43 4b  ock_mutex) {..CK
263d0 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 3b  _SLOT_ID slotID;
263e0 0a 09 63 61 63 6b 65 79 5f 72 65 74 20 67 65 74  ..cackey_ret get
263f0 5f 70 69 6e 5f 72 65 74 3b 0a 09 63 68 61 72 20  _pin_ret;..char 
26400 70 69 6e 62 75 66 5b 36 34 5d 3b 0a 09 69 6e 74  pinbuf[64];..int
26410 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09   mutex_retval;..
26420 69 6e 74 20 74 72 69 65 73 5f 72 65 6d 61 69 6e  int tries_remain
26430 69 6e 67 3b 0a 09 69 6e 74 20 6c 6f 67 69 6e 5f  ing;..int login_
26440 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ret;...CACKEY_DE
26450 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
26460 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
26470 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
26480 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
26490 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
264a0 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
264b0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
264c0 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
264d0 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
264e0 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f  .}...if (hSessio
264f0 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69  n == 0 || hSessi
26500 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61  on >= (sizeof(ca
26510 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f  ckey_sessions) /
26520 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73   sizeof(cackey_s
26530 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a  essions[0]))) {.
26540 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
26550 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
26560 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61  ession out of ra
26570 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  nge.");......ret
26580 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  urn(CKR_SESSION_
26590 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
265a0 0a 09 7d 0a 0a 09 69 66 20 28 75 73 65 72 54 79  ..}...if (userTy
265b0 70 65 20 21 3d 20 43 4b 55 5f 55 53 45 52 29 20  pe != CKU_USER) 
265c0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
265d0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
265e0 20 57 65 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74   We only support
265f0 20 55 53 45 52 20 6d 6f 64 65 2c 20 61 73 6b 65   USER mode, aske
26600 64 20 66 6f 72 20 25 6c 75 20 6d 6f 64 65 2e 22  d for %lu mode."
26610 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
26620 29 20 75 73 65 72 54 79 70 65 29 0a 0a 09 09 72  ) userType)....r
26630 65 74 75 72 6e 28 43 4b 52 5f 55 53 45 52 5f 54  eturn(CKR_USER_T
26640 59 50 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  YPE_INVALID);..}
26650 0a 0a 09 69 66 20 28 6c 6f 63 6b 5f 6d 75 74 65  ...if (lock_mute
26660 78 29 20 7b 0a 09 09 6d 75 74 65 78 5f 72 65 74  x) {...mutex_ret
26670 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
26680 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  ex_lock(cackey_b
26690 69 67 6c 6f 63 6b 29 3b 0a 09 09 69 66 20 28 6d  iglock);...if (m
266a0 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
266b0 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
266c0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
266d0 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c  r.  Locking fail
266e0 65 64 2e 22 29 3b 0a 0a 09 09 09 72 65 74 75 72  ed.");.....retur
266f0 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
26700 52 4f 52 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69  ROR);...}..}...i
26710 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69  f (!cackey_sessi
26720 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63  ons[hSession].ac
26730 74 69 76 65 29 20 7b 0a 09 09 69 66 20 28 6c 6f  tive) {...if (lo
26740 63 6b 5f 6d 75 74 65 78 29 20 7b 0a 09 09 09 63  ck_mutex) {....c
26750 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
26760 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
26770 6b 29 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45  k);...}....CACKE
26780 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
26790 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20  Error.  Session 
267a0 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09  not active.");..
267b0 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
267c0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e  ESSION_HANDLE_IN
267d0 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 73 6c 6f  VALID);..}...slo
267e0 74 49 44 20 3d 20 63 61 63 6b 65 79 5f 73 65 73  tID = cackey_ses
267f0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
26800 73 6c 6f 74 49 44 3b 0a 0a 09 69 66 20 28 73 6c  slotID;...if (sl
26810 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74  otID < 0 || slot
26820 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61  ID >= (sizeof(ca
26830 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69  ckey_slots) / si
26840 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
26850 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b  s[0]))) {...CACK
26860 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
26870 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20  "Error. Invalid 
26880 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28  slot requested (
26890 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66  %lu), outside of
268a0 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73   valid range", s
268b0 6c 6f 74 49 44 29 3b 0a 0a 09 09 69 66 20 28 6c  lotID);....if (l
268c0 6f 63 6b 5f 6d 75 74 65 78 29 20 7b 0a 09 09 09  ock_mutex) {....
268d0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
268e0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
268f0 63 6b 29 3b 0a 09 09 7d 0a 0a 09 09 72 65 74 75  ck);...}....retu
26900 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
26910 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  RROR);..}...if (
26920 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f  cackey_slots[slo
26930 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30  tID].active == 0
26940 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
26950 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
26960 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72  . Invalid slot r
26970 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20  equested (%lu), 
26980 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74  slot not current
26990 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74  ly active", slot
269a0 49 44 29 3b 0a 0a 09 09 69 66 20 28 6c 6f 63 6b  ID);....if (lock
269b0 5f 6d 75 74 65 78 29 20 7b 0a 09 09 09 63 61 63  _mutex) {....cac
269c0 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
269d0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
269e0 3b 0a 09 09 7d 0a 0a 09 09 72 65 74 75 72 6e 28  ;...}....return(
269f0 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
26a00 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63  R);..}...if (cac
26a10 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20  key_pin_command 
26a20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 69 66 20  != NULL) {...if 
26a30 28 70 50 69 6e 20 21 3d 20 4e 55 4c 4c 29 20 7b  (pPin != NULL) {
26a40 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
26a50 5f 50 52 49 4e 54 46 28 22 50 72 6f 74 65 63 74  _PRINTF("Protect
26a60 65 64 20 61 75 74 68 65 6e 74 69 63 61 74 69 6f  ed authenticatio
26a70 6e 20 70 61 74 68 20 69 6e 20 65 66 66 65 63 74  n path in effect
26a80 20 61 6e 64 20 50 49 4e 20 70 72 6f 76 69 64 65   and PIN provide
26a90 64 20 21 3f 22 29 3b 0a 09 09 7d 0a 0a 09 09 67  d !?");...}....g
26aa0 65 74 5f 70 69 6e 5f 72 65 74 20 3d 20 63 61 63  et_pin_ret = cac
26ab0 6b 65 79 5f 67 65 74 5f 70 69 6e 28 70 69 6e 62  key_get_pin(pinb
26ac0 75 66 29 3b 0a 0a 09 09 69 66 20 28 67 65 74 5f  uf);....if (get_
26ad0 70 69 6e 5f 72 65 74 20 21 3d 20 43 41 43 4b 45  pin_ret != CACKE
26ae0 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09  Y_PCSC_S_OK) {..
26af0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
26b00 52 49 4e 54 46 28 22 63 61 63 6b 65 79 5f 67 65  RINTF("cackey_ge
26b10 74 5f 70 69 6e 28 29 20 72 65 74 75 72 6e 65 64  t_pin() returned
26b20 20 69 6e 20 66 61 69 6c 75 72 65 2c 20 61 73 73   in failure, ass
26b30 75 6d 69 6e 67 20 74 68 65 20 50 49 4e 20 77 61  uming the PIN wa
26b40 73 20 69 6e 63 6f 72 72 65 63 74 2e 22 29 3b 0a  s incorrect.");.
26b50 0a 09 09 09 69 66 20 28 6c 6f 63 6b 5f 6d 75 74  ....if (lock_mut
26b60 65 78 29 20 7b 0a 09 09 09 09 63 61 63 6b 65 79  ex) {.....cackey
26b70 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
26b80 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
26b90 09 09 7d 0a 0a 09 09 09 72 65 74 75 72 6e 28 43  ..}.....return(C
26ba0 4b 52 5f 50 49 4e 5f 49 4e 43 4f 52 52 45 43 54  KR_PIN_INCORRECT
26bb0 29 3b 0a 09 09 7d 0a 0a 09 09 70 50 69 6e 20 3d  );...}....pPin =
26bc0 20 28 43 4b 5f 55 54 46 38 43 48 41 52 5f 50 54   (CK_UTF8CHAR_PT
26bd0 52 29 20 70 69 6e 62 75 66 3b 0a 09 09 75 6c 50  R) pinbuf;...ulP
26be0 69 6e 4c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 70  inLen = strlen(p
26bf0 69 6e 62 75 66 29 3b 0a 09 7d 0a 0a 09 6c 6f 67  inbuf);..}...log
26c00 69 6e 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f  in_ret = cackey_
26c10 6c 6f 67 69 6e 28 26 63 61 63 6b 65 79 5f 73 6c  login(&cackey_sl
26c20 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c 20 70 50 69  ots[slotID], pPi
26c30 6e 2c 20 75 6c 50 69 6e 4c 65 6e 2c 20 26 74 72  n, ulPinLen, &tr
26c40 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 2c 20 33  ies_remaining, 3
26c50 29 3b 0a 09 69 66 20 28 6c 6f 67 69 6e 5f 72 65  );..if (login_re
26c60 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43  t != CACKEY_PCSC
26c70 5f 53 5f 4f 4b 29 20 7b 0a 09 09 69 66 20 28 6c  _S_OK) {...if (l
26c80 6f 63 6b 5f 6d 75 74 65 78 29 20 7b 0a 09 09 09  ock_mutex) {....
26c90 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
26ca0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
26cb0 63 6b 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28  ck);...}....if (
26cc0 6c 6f 67 69 6e 5f 72 65 74 20 3d 3d 20 43 41 43  login_ret == CAC
26cd0 4b 45 59 5f 50 43 53 43 5f 45 5f 4c 4f 43 4b 45  KEY_PCSC_E_LOCKE
26ce0 44 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  D) {....CACKEY_D
26cf0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
26d00 6f 72 2e 20 20 54 6f 6b 65 6e 20 69 73 20 6c 6f  or.  Token is lo
26d10 63 6b 65 64 2e 22 29 3b 0a 0a 09 09 09 63 61 63  cked.");.....cac
26d20 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44  key_slots[slotID
26d30 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 7c 3d  ].token_flags |=
26d40 20 43 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 4c 4f   CKF_USER_PIN_LO
26d50 43 4b 45 44 3b 0a 0a 09 09 09 43 41 43 4b 45 59  CKED;.....CACKEY
26d60 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
26d70 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 50 49 4e  eturning CKR_PIN
26d80 5f 4c 4f 43 4b 45 44 20 28 25 69 29 22 2c 20 28  _LOCKED (%i)", (
26d90 69 6e 74 29 20 43 4b 52 5f 50 49 4e 5f 4c 4f 43  int) CKR_PIN_LOC
26da0 4b 45 44 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e  KED);.....return
26db0 28 43 4b 52 5f 50 49 4e 5f 4c 4f 43 4b 45 44 29  (CKR_PIN_LOCKED)
26dc0 3b 0a 09 09 7d 20 65 6c 73 65 20 69 66 20 28 6c  ;...} else if (l
26dd0 6f 67 69 6e 5f 72 65 74 20 3d 3d 20 43 41 43 4b  ogin_ret == CACK
26de0 45 59 5f 50 43 53 43 5f 45 5f 42 41 44 50 49 4e  EY_PCSC_E_BADPIN
26df0 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
26e00 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
26e10 72 2e 20 20 49 6e 76 61 6c 69 64 20 50 49 4e 2e  r.  Invalid PIN.
26e20 22 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73  ");.....cackey_s
26e30 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 74 6f 6b  lots[slotID].tok
26e40 65 6e 5f 66 6c 61 67 73 20 7c 3d 20 43 4b 46 5f  en_flags |= CKF_
26e50 55 53 45 52 5f 50 49 4e 5f 43 4f 55 4e 54 5f 4c  USER_PIN_COUNT_L
26e60 4f 57 3b 0a 0a 09 09 09 69 66 20 28 74 72 69 65  OW;.....if (trie
26e70 73 5f 72 65 6d 61 69 6e 69 6e 67 20 3d 3d 20 31  s_remaining == 1
26e80 29 20 7b 0a 09 09 09 09 63 61 63 6b 65 79 5f 73  ) {.....cackey_s
26e90 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 74 6f 6b  lots[slotID].tok
26ea0 65 6e 5f 66 6c 61 67 73 20 7c 3d 20 43 4b 46 5f  en_flags |= CKF_
26eb0 55 53 45 52 5f 50 49 4e 5f 46 49 4e 41 4c 5f 54  USER_PIN_FINAL_T
26ec0 52 59 3b 0a 09 09 09 7d 0a 0a 09 09 09 43 41 43  RY;....}.....CAC
26ed0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
26ee0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
26ef0 50 49 4e 5f 49 4e 43 4f 52 52 45 43 54 20 28 25  PIN_INCORRECT (%
26f00 69 29 22 2c 20 28 69 6e 74 29 20 43 4b 52 5f 50  i)", (int) CKR_P
26f10 49 4e 5f 49 4e 43 4f 52 52 45 43 54 29 3b 0a 0a  IN_INCORRECT);..
26f20 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 50 49  ...return(CKR_PI
26f30 4e 5f 49 4e 43 4f 52 52 45 43 54 29 3b 0a 09 09  N_INCORRECT);...
26f40 7d 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  }....CACKEY_DEBU
26f50 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
26f60 20 20 55 6e 6b 6e 6f 77 6e 20 65 72 72 6f 72 20    Unknown error 
26f70 72 65 74 75 72 6e 65 64 20 66 72 6f 6d 20 63 61  returned from ca
26f80 63 6b 65 79 5f 6c 6f 67 69 6e 28 29 20 28 25 69  ckey_login() (%i
26f90 29 22 2c 20 6c 6f 67 69 6e 5f 72 65 74 29 3b 0a  )", login_ret);.
26fa0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
26fb0 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
26fc0 0a 0a 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ...cackey_slots[
26fd0 73 6c 6f 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c  slotID].token_fl
26fe0 61 67 73 20 26 3d 20 7e 28 43 4b 46 5f 55 53 45  ags &= ~(CKF_USE
26ff0 52 5f 50 49 4e 5f 4c 4f 43 4b 45 44 20 7c 20 43  R_PIN_LOCKED | C
27000 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 43 4f 55 4e  KF_USER_PIN_COUN
27010 54 5f 4c 4f 57 20 7c 20 43 4b 46 5f 4c 4f 47 49  T_LOW | CKF_LOGI
27020 4e 5f 52 45 51 55 49 52 45 44 20 7c 20 43 4b 46  N_REQUIRED | CKF
27030 5f 55 53 45 52 5f 50 49 4e 5f 46 49 4e 41 4c 5f  _USER_PIN_FINAL_
27040 54 52 59 29 3b 0a 0a 09 63 61 63 6b 65 79 5f 73  TRY);...cackey_s
27050 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
27060 5d 2e 73 74 61 74 65 20 3d 20 43 4b 53 5f 52 4f  ].state = CKS_RO
27070 5f 55 53 45 52 5f 46 55 4e 43 54 49 4f 4e 53 3b  _USER_FUNCTIONS;
27080 0a 0a 09 69 66 20 28 6c 6f 63 6b 5f 6d 75 74 65  ...if (lock_mute
27090 78 29 20 7b 0a 09 09 6d 75 74 65 78 5f 72 65 74  x) {...mutex_ret
270a0 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
270b0 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
270c0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 69 66 20  _biglock);...if 
270d0 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
270e0 20 30 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f   0) {....CACKEY_
270f0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
27100 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20  ror.  Unlocking 
27110 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 09 72  failed.");.....r
27120 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
27130 4c 5f 45 52 52 4f 52 29 3b 0a 09 09 7d 0a 09 7d  L_ERROR);...}..}
27140 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
27150 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
27160 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20  g CKR_OK (%i)", 
27170 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72  CKR_OK);...retur
27180 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b  n(CKR_OK);.}..CK
27190 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
271a0 28 43 4b 5f 52 56 2c 20 43 5f 4c 6f 67 69 6e 29  (CK_RV, C_Login)
271b0 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
271c0 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
271d0 55 53 45 52 5f 54 59 50 45 20 75 73 65 72 54 79  USER_TYPE userTy
271e0 70 65 2c 20 43 4b 5f 55 54 46 38 43 48 41 52 5f  pe, CK_UTF8CHAR_
271f0 50 54 52 20 70 50 69 6e 2c 20 43 4b 5f 55 4c 4f  PTR pPin, CK_ULO
27200 4e 47 20 75 6c 50 69 6e 4c 65 6e 29 20 7b 0a 09  NG ulPinLen) {..
27210 72 65 74 75 72 6e 28 5f 43 5f 4c 6f 67 69 6e 4d  return(_C_LoginM
27220 75 74 65 78 41 72 67 28 68 53 65 73 73 69 6f 6e  utexArg(hSession
27230 2c 20 75 73 65 72 54 79 70 65 2c 20 70 50 69 6e  , userType, pPin
27240 2c 20 75 6c 50 69 6e 4c 65 6e 2c 20 31 29 29 3b  , ulPinLen, 1));
27250 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
27260 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
27270 4c 6f 67 6f 75 74 29 28 43 4b 5f 53 45 53 53 49  Logout)(CK_SESSI
27280 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
27290 6f 6e 29 20 7b 0a 09 43 4b 5f 53 4c 4f 54 5f 49  on) {..CK_SLOT_I
272a0 44 20 73 6c 6f 74 49 44 3b 0a 09 69 6e 74 20 6d  D slotID;..int m
272b0 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43  utex_retval;...C
272c0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
272d0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
272e0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
272f0 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
27300 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
27310 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
27320 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
27330 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
27340 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
27350 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  LIZED);..}...if 
27360 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c  (hSession == 0 |
27370 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73  | hSession >= (s
27380 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
27390 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28  sions) / sizeof(
273a0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
273b0 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59  0]))) {...CACKEY
273c0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
273d0 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f  rror.  Session o
273e0 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a  ut of range.");.
273f0 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
27400 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49  SESSION_HANDLE_I
27410 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75  NVALID);..}...mu
27420 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
27430 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63  key_mutex_lock(c
27440 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
27450 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
27460 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
27470 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
27480 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67  "Error.  Locking
27490 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
274a0 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
274b0 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69  L_ERROR);..}...i
274c0 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69  f (!cackey_sessi
274d0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63  ons[hSession].ac
274e0 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79  tive) {...cackey
274f0 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
27500 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
27510 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
27520 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
27530 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76  ession not activ
27540 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
27550 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41  n(CKR_SESSION_HA
27560 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
27570 7d 0a 0a 09 73 6c 6f 74 49 44 20 3d 20 63 61 63  }...slotID = cac
27580 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
27590 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44 3b 0a 0a  ssion].slotID;..
275a0 09 69 66 20 28 73 6c 6f 74 49 44 20 3c 20 30 20  .if (slotID < 0 
275b0 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69  || slotID >= (si
275c0 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
275d0 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
275e0 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b  ey_slots[0]))) {
275f0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
27600 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49  PRINTF("Error. I
27610 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75  nvalid slot requ
27620 65 73 74 65 64 20 28 25 6c 75 29 2c 20 6f 75 74  ested (%lu), out
27630 73 69 64 65 20 6f 66 20 76 61 6c 69 64 20 72 61  side of valid ra
27640 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a  nge", slotID);..
27650 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
27660 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
27670 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f  ..if (cackey_slo
27680 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76  ts[slotID].activ
27690 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  e == 0) {...CACK
276a0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
276b0 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20  "Error. Invalid 
276c0 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28  slot requested (
276d0 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63  %lu), slot not c
276e0 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 22  urrently active"
276f0 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61  , slotID);....ca
27700 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
27710 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
27720 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
27730 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
27740 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73  ..}...cackey_ses
27750 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
27760 73 74 61 74 65 20 3d 20 43 4b 53 5f 52 4f 5f 50  state = CKS_RO_P
27770 55 42 4c 49 43 5f 53 45 53 53 49 4f 4e 3b 0a 0a  UBLIC_SESSION;..
27780 09 69 66 20 28 63 61 63 6b 65 79 5f 70 69 6e 5f  .if (cackey_pin_
27790 63 6f 6d 6d 61 6e 64 20 3d 3d 20 4e 55 4c 4c 29  command == NULL)
277a0 20 7b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74   {...cackey_slot
277b0 73 5b 73 6c 6f 74 49 44 5d 2e 74 6f 6b 65 6e 5f  s[slotID].token_
277c0 66 6c 61 67 73 20 3d 20 43 4b 46 5f 4c 4f 47 49  flags = CKF_LOGI
277d0 4e 5f 52 45 51 55 49 52 45 44 3b 0a 09 7d 20 65  N_REQUIRED;..} e
277e0 6c 73 65 20 7b 0a 09 09 63 61 63 6b 65 79 5f 73  lse {...cackey_s
277f0 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 74 6f 6b  lots[slotID].tok
27800 65 6e 5f 66 6c 61 67 73 20 3d 20 30 3b 0a 09 7d  en_flags = 0;..}
27810 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
27820 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  = cackey_mutex_u
27830 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
27840 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
27850 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
27860 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
27870 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
27880 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64  Unlocking failed
27890 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
278a0 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
278b0 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
278c0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
278d0 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25  urning CKR_OK (%
278e0 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09  i)", CKR_OK);...
278f0 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a  return(CKR_OK);.
27900 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
27910 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 43  CTION(CK_RV, C_C
27920 72 65 61 74 65 4f 62 6a 65 63 74 29 28 43 4b 5f  reateObject)(CK_
27930 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
27940 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 41 54 54 52  Session, CK_ATTR
27950 49 42 55 54 45 5f 50 54 52 20 70 54 65 6d 70 6c  IBUTE_PTR pTempl
27960 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  ate, CK_ULONG ul
27970 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43 54  Count, CK_OBJECT
27980 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 4f 62  _HANDLE_PTR phOb
27990 6a 65 63 74 29 20 7b 0a 09 43 41 43 4b 45 59 5f  ject) {..CACKEY_
279a0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
279b0 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
279c0 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
279d0 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
279e0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
279f0 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
27a00 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
27a10 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
27a20 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
27a30 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
27a40 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
27a50 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
27a60 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
27a70 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
27a80 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
27a90 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
27aa0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
27ab0 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
27ac0 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
27ad0 28 43 4b 5f 52 56 2c 20 43 5f 43 6f 70 79 4f 62  (CK_RV, C_CopyOb
27ae0 6a 65 63 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e  ject)(CK_SESSION
27af0 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
27b00 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44  , CK_OBJECT_HAND
27b10 4c 45 20 68 4f 62 6a 65 63 74 2c 20 43 4b 5f 41  LE hObject, CK_A
27b20 54 54 52 49 42 55 54 45 5f 50 54 52 20 70 54 65  TTRIBUTE_PTR pTe
27b30 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47  mplate, CK_ULONG
27b40 20 75 6c 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a   ulCount, CK_OBJ
27b50 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70  ECT_HANDLE_PTR p
27b60 68 4e 65 77 4f 62 6a 65 63 74 29 20 7b 0a 09 43  hNewObject) {..C
27b70 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
27b80 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
27b90 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
27ba0 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
27bb0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
27bc0 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
27bd0 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
27be0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
27bf0 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
27c00 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
27c10 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
27c20 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
27c30 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
27c40 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
27c50 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
27c60 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
27c70 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
27c80 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
27c90 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
27ca0 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
27cb0 44 65 73 74 72 6f 79 4f 62 6a 65 63 74 29 28 43  DestroyObject)(C
27cc0 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
27cd0 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42   hSession, CK_OB
27ce0 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4f 62 6a  JECT_HANDLE hObj
27cf0 65 63 74 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  ect) {..CACKEY_D
27d00 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
27d10 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
27d20 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
27d30 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
27d40 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
27d50 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
27d60 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
27d70 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
27d80 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
27d90 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
27da0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
27db0 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
27dc0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
27dd0 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
27de0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
27df0 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
27e00 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
27e10 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
27e20 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
27e30 43 4b 5f 52 56 2c 20 43 5f 47 65 74 4f 62 6a 65  CK_RV, C_GetObje
27e40 63 74 53 69 7a 65 29 28 43 4b 5f 53 45 53 53 49  ctSize)(CK_SESSI
27e50 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
27e60 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41  on, CK_OBJECT_HA
27e70 4e 44 4c 45 20 68 4f 62 6a 65 63 74 2c 20 43 4b  NDLE hObject, CK
27e80 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 53 69  _ULONG_PTR pulSi
27e90 7a 65 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  ze) {..CACKEY_DE
27ea0 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
27eb0 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
27ec0 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
27ed0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
27ee0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
27ef0 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
27f00 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
27f10 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
27f20 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
27f30 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
27f40 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
27f50 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
27f60 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
27f70 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
27f80 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
27f90 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
27fa0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
27fb0 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
27fc0 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
27fd0 4b 5f 52 56 2c 20 43 5f 47 65 74 41 74 74 72 69  K_RV, C_GetAttri
27fe0 62 75 74 65 56 61 6c 75 65 29 28 43 4b 5f 53 45  buteValue)(CK_SE
27ff0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
28000 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54  ssion, CK_OBJECT
28010 5f 48 41 4e 44 4c 45 20 68 4f 62 6a 65 63 74 2c  _HANDLE hObject,
28020 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54   CK_ATTRIBUTE_PT
28030 52 20 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f  R pTemplate, CK_
28040 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e 74 29 20 7b  ULONG ulCount) {
28050 0a 09 43 4b 5f 41 54 54 52 49 42 55 54 45 20 2a  ..CK_ATTRIBUTE *
28060 63 75 72 72 5f 61 74 74 72 3b 0a 09 73 74 72 75  curr_attr;..stru
28070 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69  ct cackey_identi
28080 74 79 20 2a 69 64 65 6e 74 69 74 79 3b 0a 09 75  ty *identity;..u
28090 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 69 64 65  nsigned long ide
280a0 6e 74 69 74 79 5f 69 64 78 2c 20 61 74 74 72 5f  ntity_idx, attr_
280b0 69 64 78 2c 20 73 65 73 73 5f 61 74 74 72 5f 69  idx, sess_attr_i
280c0 64 78 2c 20 6e 75 6d 5f 69 64 73 3b 0a 09 69 6e  dx, num_ids;..in
280d0 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a  t mutex_retval;.
280e0 09 43 4b 5f 52 56 20 72 65 74 76 61 6c 20 3d 20  .CK_RV retval = 
280f0 43 4b 52 5f 4f 4b 3b 0a 09 43 4b 5f 56 4f 49 44  CKR_OK;..CK_VOID
28100 5f 50 54 52 20 70 56 61 6c 75 65 3b 0a 09 43 4b  _PTR pValue;..CK
28110 5f 55 4c 4f 4e 47 20 75 6c 56 61 6c 75 65 4c 65  _ULONG ulValueLe
28120 6e 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  n;...CACKEY_DEBU
28130 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
28140 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
28150 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
28160 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
28170 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
28180 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
28190 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
281a0 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
281b0 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
281c0 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20  ...if (hSession 
281d0 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e  == 0 || hSession
281e0 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b   >= (sizeof(cack
281f0 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73  ey_sessions) / s
28200 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
28210 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09  sions[0]))) {...
28220 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
28230 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73  NTF("Error.  Ses
28240 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67  sion out of rang
28250 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
28260 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41  n(CKR_SESSION_HA
28270 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
28280 7d 0a 0a 09 69 66 20 28 68 4f 62 6a 65 63 74 20  }...if (hObject 
28290 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  == 0) {...CACKEY
282a0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
282b0 72 72 6f 72 2e 20 20 4f 62 6a 65 63 74 20 68 61  rror.  Object ha
282c0 6e 64 6c 65 20 6f 75 74 20 6f 66 20 72 61 6e 67  ndle out of rang
282d0 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
282e0 6e 28 43 4b 52 5f 4f 42 4a 45 43 54 5f 48 41 4e  n(CKR_OBJECT_HAN
282f0 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  DLE_INVALID);..}
28300 0a 0a 09 69 66 20 28 75 6c 43 6f 75 6e 74 20 3d  ...if (ulCount =
28310 3d 20 30 29 20 7b 0a 09 09 2f 2a 20 53 68 6f 72  = 0) {.../* Shor
28320 74 20 63 69 72 63 75 69 74 2c 20 69 66 20 7a 65  t circuit, if ze
28330 72 6f 20 6f 62 6a 65 63 74 73 20 77 65 72 65 20  ro objects were 
28340 73 70 65 63 69 66 69 65 64 20 72 65 74 75 72 6e  specified return
28350 20 7a 65 72 6f 20 69 74 65 6d 73 20 69 6d 6d 65   zero items imme
28360 64 69 61 74 65 6c 79 20 2a 2f 0a 09 09 43 41 43  diately */...CAC
28370 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
28380 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
28390 4f 4b 20 28 25 69 29 20 28 73 68 6f 72 74 20 63  OK (%i) (short c
283a0 69 72 63 75 69 74 29 22 2c 20 43 4b 52 5f 4f 4b  ircuit)", CKR_OK
283b0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
283c0 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70  _OK);..}...if (p
283d0 54 65 6d 70 6c 61 74 65 20 3d 3d 20 4e 55 4c 4c  Template == NULL
283e0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
283f0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
28400 2e 20 20 70 54 65 6d 70 6c 61 74 65 20 69 73 20  .  pTemplate is 
28410 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75  NULL.");....retu
28420 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53  rn(CKR_ARGUMENTS
28430 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 64 65 6e  _BAD);..}...iden
28440 74 69 74 79 5f 69 64 78 20 3d 20 68 4f 62 6a 65  tity_idx = hObje
28450 63 74 20 2d 20 31 3b 0a 0a 09 6d 75 74 65 78 5f  ct - 1;...mutex_
28460 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
28470 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65  mutex_lock(cacke
28480 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
28490 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
284a0 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
284b0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
284c0 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69  or.  Locking fai
284d0 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
284e0 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
284f0 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21  ROR);..}...if (!
28500 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
28510 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65  hSession].active
28520 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  ) {...cackey_mut
28530 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
28540 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41  _biglock);....CA
28550 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
28560 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69  F("Error.  Sessi
28570 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29  on not active.")
28580 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
28590 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  R_SESSION_HANDLE
285a0 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
285b0 6e 75 6d 5f 69 64 73 20 3d 20 63 61 63 6b 65 79  num_ids = cackey
285c0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
285d0 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63  on].identities_c
285e0 6f 75 6e 74 3b 0a 0a 09 69 66 20 28 69 64 65 6e  ount;...if (iden
285f0 74 69 74 79 5f 69 64 78 20 3e 3d 20 6e 75 6d 5f  tity_idx >= num_
28600 69 64 73 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  ids) {...cackey_
28610 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
28620 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
28630 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
28640 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4f 62  INTF("Error.  Ob
28650 6a 65 63 74 20 68 61 6e 64 6c 65 20 6f 75 74 20  ject handle out 
28660 6f 66 20 72 61 6e 67 65 2e 20 20 69 64 65 6e 74  of range.  ident
28670 69 74 79 5f 69 64 78 20 3d 20 25 6c 75 2c 20 6e  ity_idx = %lu, n
28680 75 6d 5f 69 64 73 20 3d 20 25 6c 75 2e 22 2c 20  um_ids = %lu.", 
28690 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
286a0 69 64 65 6e 74 69 74 79 5f 69 64 78 2c 20 28 75  identity_idx, (u
286b0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 6e 75  nsigned long) nu
286c0 6d 5f 69 64 73 29 3b 0a 0a 09 09 72 65 74 75 72  m_ids);....retur
286d0 6e 28 43 4b 52 5f 4f 42 4a 45 43 54 5f 48 41 4e  n(CKR_OBJECT_HAN
286e0 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  DLE_INVALID);..}
286f0 0a 0a 09 69 64 65 6e 74 69 74 79 20 3d 20 26 63  ...identity = &c
28700 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
28710 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74  Session].identit
28720 69 65 73 5b 69 64 65 6e 74 69 74 79 5f 69 64 78  ies[identity_idx
28730 5d 3b 0a 0a 09 66 6f 72 20 28 61 74 74 72 5f 69  ];...for (attr_i
28740 64 78 20 3d 20 30 3b 20 61 74 74 72 5f 69 64 78  dx = 0; attr_idx
28750 20 3c 20 75 6c 43 6f 75 6e 74 3b 20 61 74 74 72   < ulCount; attr
28760 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 63 75 72 72  _idx++) {...curr
28770 5f 61 74 74 72 20 3d 20 26 70 54 65 6d 70 6c 61  _attr = &pTempla
28780 74 65 5b 61 74 74 72 5f 69 64 78 5d 3b 0a 0a 09  te[attr_idx];...
28790 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a  .pValue = NULL;.
287a0 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 28  ..ulValueLen = (
287b0 43 4b 5f 4c 4f 4e 47 29 20 2d 31 3b 0a 0a 09 09  CK_LONG) -1;....
287c0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
287d0 4e 54 46 28 22 4c 6f 6f 6b 69 6e 67 20 66 6f 72  NTF("Looking for
287e0 20 61 74 74 72 69 62 75 74 65 20 30 78 25 30 38   attribute 0x%08
287f0 6c 78 20 28 69 64 65 6e 74 69 74 79 3a 25 6c 75  lx (identity:%lu
28800 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65  ) ...", (unsigne
28810 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74  d long) curr_att
28820 72 2d 3e 74 79 70 65 2c 20 28 75 6e 73 69 67 6e  r->type, (unsign
28830 65 64 20 6c 6f 6e 67 29 20 69 64 65 6e 74 69 74  ed long) identit
28840 79 5f 69 64 78 29 3b 0a 0a 09 09 66 6f 72 20 28  y_idx);....for (
28850 73 65 73 73 5f 61 74 74 72 5f 69 64 78 20 3d 20  sess_attr_idx = 
28860 30 3b 20 73 65 73 73 5f 61 74 74 72 5f 69 64 78  0; sess_attr_idx
28870 20 3c 20 69 64 65 6e 74 69 74 79 2d 3e 61 74 74   < identity->att
28880 72 69 62 75 74 65 73 5f 63 6f 75 6e 74 3b 20 73  ributes_count; s
28890 65 73 73 5f 61 74 74 72 5f 69 64 78 2b 2b 29 20  ess_attr_idx++) 
288a0 7b 0a 09 09 09 69 66 20 28 69 64 65 6e 74 69 74  {....if (identit
288b0 79 2d 3e 61 74 74 72 69 62 75 74 65 73 5b 73 65  y->attributes[se
288c0 73 73 5f 61 74 74 72 5f 69 64 78 5d 2e 74 79 70  ss_attr_idx].typ
288d0 65 20 3d 3d 20 63 75 72 72 5f 61 74 74 72 2d 3e  e == curr_attr->
288e0 74 79 70 65 29 20 7b 0a 09 09 09 09 43 41 43 4b  type) {.....CACK
288f0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
28900 22 20 2e 2e 2e 20 66 6f 75 6e 64 20 69 74 2c 20  " ... found it, 
28910 70 56 61 6c 75 65 20 3d 20 25 70 2c 20 75 6c 56  pValue = %p, ulV
28920 61 6c 75 65 4c 65 6e 20 3d 20 25 6c 75 22 2c 20  alueLen = %lu", 
28930 69 64 65 6e 74 69 74 79 2d 3e 61 74 74 72 69 62  identity->attrib
28940 75 74 65 73 5b 73 65 73 73 5f 61 74 74 72 5f 69  utes[sess_attr_i
28950 64 78 5d 2e 70 56 61 6c 75 65 2c 20 69 64 65 6e  dx].pValue, iden
28960 74 69 74 79 2d 3e 61 74 74 72 69 62 75 74 65 73  tity->attributes
28970 5b 73 65 73 73 5f 61 74 74 72 5f 69 64 78 5d 2e  [sess_attr_idx].
28980 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 09 09 09  ulValueLen);....
28990 09 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 69  ......pValue = i
289a0 64 65 6e 74 69 74 79 2d 3e 61 74 74 72 69 62 75  dentity->attribu
289b0 74 65 73 5b 73 65 73 73 5f 61 74 74 72 5f 69 64  tes[sess_attr_id
289c0 78 5d 2e 70 56 61 6c 75 65 3b 0a 09 09 09 09 75  x].pValue;.....u
289d0 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 69 64 65 6e  lValueLen = iden
289e0 74 69 74 79 2d 3e 61 74 74 72 69 62 75 74 65 73  tity->attributes
289f0 5b 73 65 73 73 5f 61 74 74 72 5f 69 64 78 5d 2e  [sess_attr_idx].
28a00 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 09 09 09 7d  ulValueLen;....}
28a10 0a 09 09 7d 0a 0a 09 09 69 66 20 28 63 75 72 72  ...}....if (curr
28a20 5f 61 74 74 72 2d 3e 70 56 61 6c 75 65 20 26 26  _attr->pValue &&
28a30 20 70 56 61 6c 75 65 29 20 7b 0a 09 09 09 69 66   pValue) {....if
28a40 20 28 63 75 72 72 5f 61 74 74 72 2d 3e 75 6c 56   (curr_attr->ulV
28a50 61 6c 75 65 4c 65 6e 20 3e 3d 20 75 6c 56 61 6c  alueLen >= ulVal
28a60 75 65 4c 65 6e 29 20 7b 0a 09 09 09 09 6d 65 6d  ueLen) {.....mem
28a70 63 70 79 28 63 75 72 72 5f 61 74 74 72 2d 3e 70  cpy(curr_attr->p
28a80 56 61 6c 75 65 2c 20 70 56 61 6c 75 65 2c 20 75  Value, pValue, u
28a90 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 09 09 09 7d  lValueLen);....}
28aa0 20 65 6c 73 65 20 7b 0a 09 09 09 09 75 6c 56 61   else {.....ulVa
28ab0 6c 75 65 4c 65 6e 20 3d 20 28 43 4b 5f 4c 4f 4e  lueLen = (CK_LON
28ac0 47 29 20 2d 31 3b 0a 0a 09 09 09 09 72 65 74 76  G) -1;......retv
28ad0 61 6c 20 3d 20 43 4b 52 5f 42 55 46 46 45 52 5f  al = CKR_BUFFER_
28ae0 54 4f 4f 5f 53 4d 41 4c 4c 3b 0a 09 09 09 7d 0a  TOO_SMALL;....}.
28af0 09 09 7d 0a 0a 09 09 63 75 72 72 5f 61 74 74 72  ..}....curr_attr
28b00 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 75  ->ulValueLen = u
28b10 6c 56 61 6c 75 65 4c 65 6e 3b 0a 09 7d 0a 0a 09  lValueLen;..}...
28b20 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
28b30 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
28b40 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
28b50 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
28b60 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
28b70 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
28b80 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c  NTF("Error.  Unl
28b90 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
28ba0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
28bb0 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
28bc0 09 7d 0a 0a 09 69 66 20 28 72 65 74 76 61 6c 20  .}...if (retval 
28bd0 3d 3d 20 43 4b 52 5f 41 54 54 52 49 42 55 54 45  == CKR_ATTRIBUTE
28be0 5f 54 59 50 45 5f 49 4e 56 41 4c 49 44 29 20 7b  _TYPE_INVALID) {
28bf0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
28c00 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
28c10 67 20 43 4b 52 5f 41 54 54 52 49 42 55 54 45 5f  g CKR_ATTRIBUTE_
28c20 54 59 50 45 5f 49 4e 56 41 4c 49 44 20 28 25 69  TYPE_INVALID (%i
28c30 29 22 2c 20 28 69 6e 74 29 20 72 65 74 76 61 6c  )", (int) retval
28c40 29 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 72  );..} else if (r
28c50 65 74 76 61 6c 20 3d 3d 20 43 4b 52 5f 42 55 46  etval == CKR_BUF
28c60 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 20 7b  FER_TOO_SMALL) {
28c70 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
28c80 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
28c90 67 20 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f  g CKR_BUFFER_TOO
28ca0 5f 53 4d 41 4c 4c 20 28 25 69 29 22 2c 20 28 69  _SMALL (%i)", (i
28cb0 6e 74 29 20 72 65 74 76 61 6c 29 3b 0a 09 7d 20  nt) retval);..} 
28cc0 65 6c 73 65 20 69 66 20 28 72 65 74 76 61 6c 20  else if (retval 
28cd0 3d 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 43  == CKR_OK) {...C
28ce0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
28cf0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
28d00 52 5f 4f 4b 20 28 25 69 29 22 2c 20 28 69 6e 74  R_OK (%i)", (int
28d10 29 20 72 65 74 76 61 6c 29 3b 0a 09 7d 20 65 6c  ) retval);..} el
28d20 73 65 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  se {...CACKEY_DE
28d30 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
28d40 72 6e 69 6e 67 20 25 69 22 2c 20 28 69 6e 74 29  rning %i", (int)
28d50 20 72 65 74 76 61 6c 29 3b 0a 09 7d 0a 0a 09 72   retval);..}...r
28d60 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d  eturn(retval);.}
28d70 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
28d80 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 65  TION(CK_RV, C_Se
28d90 74 41 74 74 72 69 62 75 74 65 56 61 6c 75 65 29  tAttributeValue)
28da0 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
28db0 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
28dc0 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4f  OBJECT_HANDLE hO
28dd0 62 6a 65 63 74 2c 20 43 4b 5f 41 54 54 52 49 42  bject, CK_ATTRIB
28de0 55 54 45 5f 50 54 52 20 70 54 65 6d 70 6c 61 74  UTE_PTR pTemplat
28df0 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f  e, CK_ULONG ulCo
28e00 75 6e 74 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  unt) {..CACKEY_D
28e10 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
28e20 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
28e30 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
28e40 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
28e50 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
28e60 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
28e70 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
28e80 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
28e90 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
28ea0 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
28eb0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
28ec0 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
28ed0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
28ee0 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
28ef0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
28f00 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
28f10 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
28f20 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
28f30 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
28f40 43 4b 5f 52 56 2c 20 43 5f 46 69 6e 64 4f 62 6a  CK_RV, C_FindObj
28f50 65 63 74 73 49 6e 69 74 29 28 43 4b 5f 53 45 53  ectsInit)(CK_SES
28f60 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
28f70 73 69 6f 6e 2c 20 43 4b 5f 41 54 54 52 49 42 55  sion, CK_ATTRIBU
28f80 54 45 5f 50 54 52 20 70 54 65 6d 70 6c 61 74 65  TE_PTR pTemplate
28f90 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f 75  , CK_ULONG ulCou
28fa0 6e 74 29 20 7b 0a 09 43 4b 5f 53 4c 4f 54 5f 49  nt) {..CK_SLOT_I
28fb0 44 20 73 6c 6f 74 49 44 3b 0a 09 43 4b 5f 55 4c  D slotID;..CK_UL
28fc0 4f 4e 47 20 69 64 78 3b 0a 09 69 6e 74 20 6d 75  ONG idx;..int mu
28fd0 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41  tex_retval;...CA
28fe0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
28ff0 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
29000 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
29010 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
29020 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
29030 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
29040 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
29050 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
29060 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
29070 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  IZED);..}...if (
29080 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c  hSession == 0 ||
29090 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69   hSession >= (si
290a0 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
290b0 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  ions) / sizeof(c
290c0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30  ackey_sessions[0
290d0 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ]))) {...CACKEY_
290e0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
290f0 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75  ror.  Session ou
29100 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09  t of range.");..
29110 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
29120 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e  ESSION_HANDLE_IN
29130 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74  VALID);..}...mut
29140 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
29150 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61  ey_mutex_lock(ca
29160 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
29170 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
29180 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
29190 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
291a0 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20  Error.  Locking 
291b0 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
291c0 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
291d0 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66  _ERROR);..}...if
291e0 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   (!cackey_sessio
291f0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74  ns[hSession].act
29200 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  ive) {...cackey_
29210 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
29220 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
29230 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
29240 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65  INTF("Error.  Se
29250 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65  ssion not active
29260 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
29270 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  (CKR_SESSION_HAN
29280 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  DLE_INVALID);..}
29290 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65  ...if (cackey_se
292a0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
292b0 2e 73 65 61 72 63 68 5f 61 63 74 69 76 65 29 20  .search_active) 
292c0 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  {...cackey_mutex
292d0 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
292e0 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b  iglock);....CACK
292f0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
29300 22 45 72 72 6f 72 2e 20 20 53 65 61 72 63 68 20  "Error.  Search 
29310 61 6c 72 65 61 64 79 20 61 63 74 69 76 65 2e 22  already active."
29320 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
29330 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 41 43 54  KR_OPERATION_ACT
29340 49 56 45 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 49  IVE);..}...slotI
29350 44 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69  D = cackey_sessi
29360 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 6c  ons[hSession].sl
29370 6f 74 49 44 3b 0a 0a 09 69 66 20 28 73 6c 6f 74  otID;...if (slot
29380 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44  ID < 0 || slotID
29390 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b   >= (sizeof(cack
293a0 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65  ey_slots) / size
293b0 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  of(cackey_slots[
293c0 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59  0]))) {...CACKEY
293d0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
293e0 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c  rror. Invalid sl
293f0 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c  ot requested (%l
29400 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 76  u), outside of v
29410 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f  alid range", slo
29420 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  tID);....return(
29430 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
29440 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63  R);..}...if (cac
29450 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44  key_slots[slotID
29460 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 29 20 7b  ].active == 0) {
29470 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
29480 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49  PRINTF("Error. I
29490 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75  nvalid slot requ
294a0 65 73 74 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f  ested (%lu), slo
294b0 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20  t not currently 
294c0 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 29  active", slotID)
294d0 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65  ;....cackey_mute
294e0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
294f0 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74  biglock);....ret
29500 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
29510 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20  ERROR);..}...if 
29520 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c  (cackey_slots[sl
29530 6f 74 49 44 5d 2e 73 6c 6f 74 5f 72 65 73 65 74  otID].slot_reset
29540 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
29550 55 47 5f 50 52 49 4e 54 46 28 22 54 68 65 20 73  UG_PRINTF("The s
29560 6c 6f 74 20 68 61 73 20 62 65 65 6e 20 72 65 73  lot has been res
29570 65 74 20 73 69 6e 63 65 20 77 65 20 6c 61 73 74  et since we last
29580 20 6c 6f 6f 6b 65 64 20 66 6f 72 20 69 64 65 6e   looked for iden
29590 74 69 74 69 65 73 20 2d 2d 20 72 65 73 63 61 6e  tities -- rescan
295a0 6e 69 6e 67 22 29 3b 0a 0a 09 09 69 66 20 28 63  ning");....if (c
295b0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
295c0 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74  Session].identit
295d0 69 65 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ies != NULL) {..
295e0 09 09 63 61 63 6b 65 79 5f 66 72 65 65 5f 69 64  ..cackey_free_id
295f0 65 6e 74 69 74 69 65 73 28 63 61 63 6b 65 79 5f  entities(cackey_
29600 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
29610 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 2c 20 63  n].identities, c
29620 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
29630 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74  Session].identit
29640 69 65 73 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09 09  ies_count);.....
29650 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
29660 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69  hSession].identi
29670 74 69 65 73 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09  ties = NULL;....
29680 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
29690 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69  hSession].identi
296a0 74 69 65 73 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a  ties_count = 0;.
296b0 09 09 7d 0a 0a 09 09 69 66 20 28 63 61 63 6b 65  ..}....if (cacke
296c0 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e  y_slots[slotID].
296d0 6c 61 62 65 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b  label != NULL) {
296e0 0a 09 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f  ....free(cackey_
296f0 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61  slots[slotID].la
29700 62 65 6c 29 3b 0a 09 09 09 63 61 63 6b 65 79 5f  bel);....cackey_
29710 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61  slots[slotID].la
29720 62 65 6c 20 3d 20 4e 55 4c 4c 3b 0a 09 09 7d 0a  bel = NULL;...}.
29730 0a 09 09 63 61 63 6b 65 79 5f 6d 61 72 6b 5f 73  ...cackey_mark_s
29740 6c 6f 74 5f 72 65 73 65 74 28 26 63 61 63 6b 65  lot_reset(&cacke
29750 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 29  y_slots[slotID])
29760 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ;...cackey_slots
29770 5b 73 6c 6f 74 49 44 5d 2e 73 6c 6f 74 5f 72 65  [slotID].slot_re
29780 73 65 74 20 3d 20 30 3b 0a 09 7d 0a 0a 09 69 66  set = 0;..}...if
29790 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e   (cackey_session
297a0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e  s[hSession].iden
297b0 74 69 74 69 65 73 20 3d 3d 20 4e 55 4c 4c 29 20  tities == NULL) 
297c0 7b 0a 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69  {...cackey_sessi
297d0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64  ons[hSession].id
297e0 65 6e 74 69 74 69 65 73 20 3d 20 63 61 63 6b 65  entities = cacke
297f0 79 5f 72 65 61 64 5f 69 64 65 6e 74 69 74 69 65  y_read_identitie
29800 73 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  s(&cackey_slots[
29810 73 6c 6f 74 49 44 5d 2c 20 26 63 61 63 6b 65 79  slotID], &cackey
29820 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
29830 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63  on].identities_c
29840 6f 75 6e 74 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  ount);..}...if (
29850 70 54 65 6d 70 6c 61 74 65 20 21 3d 20 4e 55 4c  pTemplate != NUL
29860 4c 29 20 7b 0a 09 09 69 66 20 28 75 6c 43 6f 75  L) {...if (ulCou
29870 6e 74 20 21 3d 20 30 29 20 7b 0a 09 09 09 63 61  nt != 0) {....ca
29880 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
29890 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71  ession].search_q
298a0 75 65 72 79 5f 63 6f 75 6e 74 20 3d 20 75 6c 43  uery_count = ulC
298b0 6f 75 6e 74 3b 0a 09 09 09 63 61 63 6b 65 79 5f  ount;....cackey_
298c0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
298d0 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 20  n].search_query 
298e0 3d 20 6d 61 6c 6c 6f 63 28 75 6c 43 6f 75 6e 74  = malloc(ulCount
298f0 20 2a 20 73 69 7a 65 6f 66 28 2a 70 54 65 6d 70   * sizeof(*pTemp
29900 6c 61 74 65 29 29 3b 0a 0a 09 09 09 6d 65 6d 63  late));.....memc
29910 70 79 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  py(cackey_sessio
29920 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61  ns[hSession].sea
29930 72 63 68 5f 71 75 65 72 79 2c 20 70 54 65 6d 70  rch_query, pTemp
29940 6c 61 74 65 2c 20 75 6c 43 6f 75 6e 74 20 2a 20  late, ulCount * 
29950 73 69 7a 65 6f 66 28 2a 70 54 65 6d 70 6c 61 74  sizeof(*pTemplat
29960 65 29 29 3b 0a 09 09 09 66 6f 72 20 28 69 64 78  e));....for (idx
29970 20 3d 20 30 3b 20 69 64 78 20 3c 20 75 6c 43 6f   = 0; idx < ulCo
29980 75 6e 74 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09  unt; idx++) {...
29990 09 09 69 66 20 28 70 54 65 6d 70 6c 61 74 65 5b  ..if (pTemplate[
299a0 69 64 78 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e 20  idx].ulValueLen 
299b0 3d 3d 20 30 29 20 7b 0a 09 09 09 09 09 63 61 63  == 0) {......cac
299c0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
299d0 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75  ssion].search_qu
299e0 65 72 79 5b 69 64 78 5d 2e 70 56 61 6c 75 65 20  ery[idx].pValue 
299f0 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09 09 63 6f  = NULL;.......co
29a00 6e 74 69 6e 75 65 3b 0a 09 09 09 09 7d 0a 0a 09  ntinue;.....}...
29a10 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
29a20 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61  ns[hSession].sea
29a30 72 63 68 5f 71 75 65 72 79 5b 69 64 78 5d 2e 70  rch_query[idx].p
29a40 56 61 6c 75 65 20 3d 20 6d 61 6c 6c 6f 63 28 70  Value = malloc(p
29a50 54 65 6d 70 6c 61 74 65 5b 69 64 78 5d 2e 75 6c  Template[idx].ul
29a60 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09  ValueLen);......
29a70 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69  if (cackey_sessi
29a80 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65  ons[hSession].se
29a90 61 72 63 68 5f 71 75 65 72 79 5b 69 64 78 5d 2e  arch_query[idx].
29aa0 70 56 61 6c 75 65 29 20 7b 0a 09 09 09 09 09 6d  pValue) {......m
29ab0 65 6d 63 70 79 28 63 61 63 6b 65 79 5f 73 65 73  emcpy(cackey_ses
29ac0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
29ad0 73 65 61 72 63 68 5f 71 75 65 72 79 5b 69 64 78  search_query[idx
29ae0 5d 2e 70 56 61 6c 75 65 2c 20 70 54 65 6d 70 6c  ].pValue, pTempl
29af0 61 74 65 5b 69 64 78 5d 2e 70 56 61 6c 75 65 2c  ate[idx].pValue,
29b00 20 70 54 65 6d 70 6c 61 74 65 5b 69 64 78 5d 2e   pTemplate[idx].
29b10 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 09 09 09  ulValueLen);....
29b20 09 7d 0a 09 09 09 7d 0a 09 09 7d 20 65 6c 73 65  .}....}...} else
29b30 20 7b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73   {....cackey_ses
29b40 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
29b50 73 65 61 72 63 68 5f 71 75 65 72 79 5f 63 6f 75  search_query_cou
29b60 6e 74 20 3d 20 30 3b 0a 09 09 09 63 61 63 6b 65  nt = 0;....cacke
29b70 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
29b80 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72  ion].search_quer
29b90 79 20 3d 20 4e 55 4c 4c 3b 0a 09 09 7d 0a 09 7d  y = NULL;...}..}
29ba0 20 65 6c 73 65 20 7b 0a 09 09 69 66 20 28 75 6c   else {...if (ul
29bb0 43 6f 75 6e 74 20 21 3d 20 30 29 20 7b 0a 09 09  Count != 0) {...
29bc0 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
29bd0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
29be0 6f 63 6b 29 3b 0a 0a 09 09 09 43 41 43 4b 45 59  ock);.....CACKEY
29bf0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
29c00 72 72 6f 72 2e 20 20 53 65 61 72 63 68 20 71 75  rror.  Search qu
29c10 65 72 79 20 73 70 65 63 69 66 69 65 64 20 61 73  ery specified as
29c20 20 4e 55 4c 4c 2c 20 62 75 74 20 6e 75 6d 62 65   NULL, but numbe
29c30 72 20 6f 66 20 71 75 65 72 79 20 74 65 72 6d 73  r of query terms
29c40 20 6e 6f 74 20 73 70 65 63 69 66 69 65 64 20 61   not specified a
29c50 73 20 30 2e 22 29 3b 0a 0a 09 09 09 72 65 74 75  s 0.");.....retu
29c60 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53  rn(CKR_ARGUMENTS
29c70 5f 42 41 44 29 3b 0a 09 09 7d 0a 0a 09 09 63 61  _BAD);...}....ca
29c80 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
29c90 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71  ession].search_q
29ca0 75 65 72 79 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a  uery_count = 0;.
29cb0 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
29cc0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72  s[hSession].sear
29cd0 63 68 5f 71 75 65 72 79 20 3d 20 4e 55 4c 4c 3b  ch_query = NULL;
29ce0 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73  ..}...cackey_ses
29cf0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
29d00 73 65 61 72 63 68 5f 61 63 74 69 76 65 20 3d 20  search_active = 
29d10 31 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69  1;..cackey_sessi
29d20 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65  ons[hSession].se
29d30 61 72 63 68 5f 63 75 72 72 5f 69 64 20 3d 20 30  arch_curr_id = 0
29d40 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  ;...mutex_retval
29d50 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
29d60 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
29d70 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
29d80 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
29d90 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
29da0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
29db0 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65   Unlocking faile
29dc0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
29dd0 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
29de0 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  R);..}...CACKEY_
29df0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
29e00 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28  turning CKR_OK (
29e10 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a  %i)", CKR_OK);..
29e20 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b  .return(CKR_OK);
29e30 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .}..static int c
29e40 61 63 6b 65 79 5f 70 6b 63 73 31 31 5f 63 6f 6d  ackey_pkcs11_com
29e50 70 61 72 65 5f 61 74 74 72 69 62 75 74 65 73 28  pare_attributes(
29e60 43 4b 5f 41 54 54 52 49 42 55 54 45 20 2a 61 2c  CK_ATTRIBUTE *a,
29e70 20 43 4b 5f 41 54 54 52 49 42 55 54 45 20 2a 62   CK_ATTRIBUTE *b
29e80 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68  ) {..unsigned ch
29e90 61 72 20 2a 73 6d 61 6c 6c 62 75 66 2c 20 2a 6c  ar *smallbuf, *l
29ea0 61 72 67 65 62 75 66 3b 0a 09 73 69 7a 65 5f 74  argebuf;..size_t
29eb0 20 73 6d 61 6c 6c 62 75 66 5f 6c 65 6e 2c 20 6c   smallbuf_len, l
29ec0 61 72 67 65 62 75 66 5f 6c 65 6e 3b 0a 0a 09 69  argebuf_len;...i
29ed0 66 20 28 61 2d 3e 74 79 70 65 20 21 3d 20 62 2d  f (a->type != b-
29ee0 3e 74 79 70 65 29 20 7b 0a 09 09 72 65 74 75 72  >type) {...retur
29ef0 6e 28 30 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  n(0);..}...CACKE
29f00 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
29f10 20 20 20 20 2e 2e 2e 20 66 6f 75 6e 64 20 6d 61      ... found ma
29f20 74 63 68 69 6e 67 20 74 79 70 65 20 2e 2e 2e 22  tching type ..."
29f30 29 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  );...CACKEY_DEBU
29f40 47 5f 50 52 49 4e 54 42 55 46 28 22 20 20 20 20  G_PRINTBUF("    
29f50 2e 2e 2e 20 6f 75 72 20 76 61 6c 75 65 3a 22 2c  ... our value:",
29f60 20 61 2d 3e 70 56 61 6c 75 65 2c 20 61 2d 3e 75   a->pValue, a->u
29f70 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 69 66  lValueLen);...if
29f80 20 28 62 2d 3e 70 56 61 6c 75 65 20 3d 3d 20 4e   (b->pValue == N
29f90 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
29fa0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 20  DEBUG_PRINTF("  
29fb0 20 20 20 20 20 2e 2e 2e 20 66 6f 75 6e 64 20 77       ... found w
29fc0 69 6c 64 63 61 72 64 20 6d 61 74 63 68 22 29 3b  ildcard match");
29fd0 0a 0a 09 09 72 65 74 75 72 6e 28 31 29 3b 0a 09  ....return(1);..
29fe0 7d 0a 0a 09 69 66 20 28 61 2d 3e 70 56 61 6c 75  }...if (a->pValu
29ff0 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72  e == NULL) {...r
2a000 65 74 75 72 6e 28 30 29 3b 0a 09 7d 0a 0a 20 09  eturn(0);..}.. .
2a010 69 66 20 28 62 2d 3e 75 6c 56 61 6c 75 65 4c 65  if (b->ulValueLe
2a020 6e 20 3d 3d 20 61 2d 3e 75 6c 56 61 6c 75 65 4c  n == a->ulValueL
2a030 65 6e 20 26 26 20 6d 65 6d 63 6d 70 28 61 2d 3e  en && memcmp(a->
2a040 70 56 61 6c 75 65 2c 20 62 2d 3e 70 56 61 6c 75  pValue, b->pValu
2a050 65 2c 20 62 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e  e, b->ulValueLen
2a060 29 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  ) == 0) {...CACK
2a070 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2a080 22 20 20 20 20 20 20 20 2e 2e 2e 20 66 6f 75 6e  "       ... foun
2a090 64 20 65 78 61 63 74 20 6d 61 74 63 68 22 29 3b  d exact match");
2a0a0 0a 0a 09 09 72 65 74 75 72 6e 28 31 29 3b 0a 09  ....return(1);..
2a0b0 7d 0a 0a 09 73 77 69 74 63 68 20 28 61 2d 3e 74  }...switch (a->t
2a0c0 79 70 65 29 20 7b 0a 09 09 63 61 73 65 20 43 4b  ype) {...case CK
2a0d0 41 5f 4d 4f 44 55 4c 55 53 3a 0a 09 09 09 69 66  A_MODULUS:....if
2a0e0 20 28 61 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 20   (a->ulValueLen 
2a0f0 3d 3d 20 62 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e  == b->ulValueLen
2a100 29 20 7b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  ) {.....break;..
2a110 09 09 7d 0a 0a 09 09 09 69 66 20 28 61 2d 3e 75  ..}.....if (a->u
2a120 6c 56 61 6c 75 65 4c 65 6e 20 3e 20 62 2d 3e 75  lValueLen > b->u
2a130 6c 56 61 6c 75 65 4c 65 6e 29 20 7b 0a 09 09 09  lValueLen) {....
2a140 09 73 6d 61 6c 6c 62 75 66 20 3d 20 62 2d 3e 70  .smallbuf = b->p
2a150 56 61 6c 75 65 3b 0a 09 09 09 09 73 6d 61 6c 6c  Value;.....small
2a160 62 75 66 5f 6c 65 6e 20 3d 20 62 2d 3e 75 6c 56  buf_len = b->ulV
2a170 61 6c 75 65 4c 65 6e 3b 0a 0a 09 09 09 09 6c 61  alueLen;......la
2a180 72 67 65 62 75 66 20 3d 20 61 2d 3e 70 56 61 6c  rgebuf = a->pVal
2a190 75 65 3b 0a 09 09 09 09 6c 61 72 67 65 62 75 66  ue;.....largebuf
2a1a0 5f 6c 65 6e 20 3d 20 61 2d 3e 75 6c 56 61 6c 75  _len = a->ulValu
2a1b0 65 4c 65 6e 3b 0a 09 09 09 7d 20 65 6c 73 65 20  eLen;....} else 
2a1c0 7b 0a 09 09 09 09 73 6d 61 6c 6c 62 75 66 20 3d  {.....smallbuf =
2a1d0 20 61 2d 3e 70 56 61 6c 75 65 3b 0a 09 09 09 09   a->pValue;.....
2a1e0 73 6d 61 6c 6c 62 75 66 5f 6c 65 6e 20 3d 20 61  smallbuf_len = a
2a1f0 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 0a 09  ->ulValueLen;...
2a200 09 09 09 6c 61 72 67 65 62 75 66 20 3d 20 62 2d  ...largebuf = b-
2a210 3e 70 56 61 6c 75 65 3b 0a 09 09 09 09 6c 61 72  >pValue;.....lar
2a220 67 65 62 75 66 5f 6c 65 6e 20 3d 20 62 2d 3e 75  gebuf_len = b->u
2a230 6c 56 61 6c 75 65 4c 65 6e 3b 0a 09 09 09 7d 0a  lValueLen;....}.
2a240 0a 09 09 09 66 6f 72 20 28 3b 20 6c 61 72 67 65  ....for (; large
2a250 62 75 66 5f 6c 65 6e 20 21 3d 20 73 6d 61 6c 6c  buf_len != small
2a260 62 75 66 5f 6c 65 6e 3b 20 6c 61 72 67 65 62 75  buf_len; largebu
2a270 66 2b 2b 2c 6c 61 72 67 65 62 75 66 5f 6c 65 6e  f++,largebuf_len
2a280 2d 2d 29 20 7b 0a 09 09 09 09 69 66 20 28 6c 61  --) {.....if (la
2a290 72 67 65 62 75 66 5b 30 5d 20 21 3d 20 30 29 20  rgebuf[0] != 0) 
2a2a0 7b 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  {......break;...
2a2b0 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20  ..}....}.....if 
2a2c0 28 6c 61 72 67 65 62 75 66 5f 6c 65 6e 20 21 3d  (largebuf_len !=
2a2d0 20 73 6d 61 6c 6c 62 75 66 5f 6c 65 6e 29 20 7b   smallbuf_len) {
2a2e0 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 7d  .....break;....}
2a2f0 0a 0a 09 09 09 69 66 20 28 6d 65 6d 63 6d 70 28  .....if (memcmp(
2a300 6c 61 72 67 65 62 75 66 2c 20 73 6d 61 6c 6c 62  largebuf, smallb
2a310 75 66 2c 20 73 6d 61 6c 6c 62 75 66 5f 6c 65 6e  uf, smallbuf_len
2a320 29 20 3d 3d 20 30 29 20 7b 0a 09 09 09 09 43 41  ) == 0) {.....CA
2a330 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2a340 46 28 22 20 20 20 20 20 20 20 2e 2e 2e 20 66 6f  F("       ... fo
2a350 75 6e 64 20 61 70 70 72 6f 78 69 6d 61 74 65 20  und approximate 
2a360 6d 61 74 63 68 22 29 3b 0a 0a 09 09 09 09 72 65  match");......re
2a370 74 75 72 6e 28 31 29 3b 0a 09 09 09 7d 0a 0a 09  turn(1);....}...
2a380 09 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 72 65  ..break;..}...re
2a390 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a 43 4b 5f 44  turn(0);.}..CK_D
2a3a0 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
2a3b0 4b 5f 52 56 2c 20 43 5f 46 69 6e 64 4f 62 6a 65  K_RV, C_FindObje
2a3c0 63 74 73 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  cts)(CK_SESSION_
2a3d0 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
2a3e0 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c   CK_OBJECT_HANDL
2a3f0 45 5f 50 54 52 20 70 68 4f 62 6a 65 63 74 2c 20  E_PTR phObject, 
2a400 43 4b 5f 55 4c 4f 4e 47 20 75 6c 4d 61 78 4f 62  CK_ULONG ulMaxOb
2a410 6a 65 63 74 43 6f 75 6e 74 2c 20 43 4b 5f 55 4c  jectCount, CK_UL
2a420 4f 4e 47 5f 50 54 52 20 70 75 6c 4f 62 6a 65 63  ONG_PTR pulObjec
2a430 74 43 6f 75 6e 74 29 20 7b 0a 09 73 74 72 75 63  tCount) {..struc
2a440 74 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 74  t cackey_identit
2a450 79 20 2a 63 75 72 72 5f 69 64 3b 0a 09 43 4b 5f  y *curr_id;..CK_
2a460 41 54 54 52 49 42 55 54 45 20 2a 63 75 72 72 5f  ATTRIBUTE *curr_
2a470 61 74 74 72 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20  attr;..CK_ULONG 
2a480 63 75 72 72 5f 69 64 5f 69 64 78 2c 20 63 75 72  curr_id_idx, cur
2a490 72 5f 6f 75 74 5f 69 64 5f 69 64 78 2c 20 63 75  r_out_id_idx, cu
2a4a0 72 72 5f 61 74 74 72 5f 69 64 78 2c 20 73 65 73  rr_attr_idx, ses
2a4b0 73 5f 61 74 74 72 5f 69 64 78 3b 0a 09 43 4b 5f  s_attr_idx;..CK_
2a4c0 55 4c 4f 4e 47 20 6d 61 74 63 68 65 64 5f 63 6f  ULONG matched_co
2a4d0 75 6e 74 2c 20 70 72 65 76 5f 6d 61 74 63 68 65  unt, prev_matche
2a4e0 64 5f 63 6f 75 6e 74 3b 0a 09 69 6e 74 20 6d 75  d_count;..int mu
2a4f0 74 65 78 5f 72 65 74 76 61 6c 3b 0a 23 69 66 64  tex_retval;.#ifd
2a500 65 66 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ef CACKEY_DEBUG_
2a510 53 45 41 52 43 48 5f 53 50 45 45 44 54 45 53 54  SEARCH_SPEEDTEST
2a520 0a 09 73 74 72 75 63 74 20 74 69 6d 65 76 61 6c  ..struct timeval
2a530 20 73 74 61 72 74 2c 20 65 6e 64 3b 0a 09 75 69   start, end;..ui
2a540 6e 74 36 34 5f 74 20 73 74 61 72 74 5f 69 6e 74  nt64_t start_int
2a550 2c 20 65 6e 64 5f 69 6e 74 3b 0a 23 65 6e 64 69  , end_int;.#endi
2a560 66 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  f...CACKEY_DEBUG
2a570 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
2a580 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
2a590 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
2a5a0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2a5b0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
2a5c0 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
2a5d0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
2a5e0 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
2a5f0 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
2a600 0a 09 69 66 20 28 70 75 6c 4f 62 6a 65 63 74 43  ..if (pulObjectC
2a610 6f 75 6e 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  ount == NULL) {.
2a620 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2a630 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 70  RINTF("Error.  p
2a640 75 6c 4f 62 6a 65 63 74 43 6f 75 6e 74 20 69 73  ulObjectCount is
2a650 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74   NULL.");....ret
2a660 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54  urn(CKR_ARGUMENT
2a670 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  S_BAD);..}...if 
2a680 28 70 68 4f 62 6a 65 63 74 20 3d 3d 20 4e 55 4c  (phObject == NUL
2a690 4c 20 26 26 20 75 6c 4d 61 78 4f 62 6a 65 63 74  L && ulMaxObject
2a6a0 43 6f 75 6e 74 20 3d 3d 20 30 29 20 7b 0a 09 09  Count == 0) {...
2a6b0 2f 2a 20 53 68 6f 72 74 20 63 69 72 63 75 69 74  /* Short circuit
2a6c0 2c 20 69 66 20 7a 65 72 6f 20 6f 62 6a 65 63 74  , if zero object
2a6d0 73 20 77 65 72 65 20 73 70 65 63 69 66 69 65 64  s were specified
2a6e0 20 72 65 74 75 72 6e 20 7a 65 72 6f 20 69 74 65   return zero ite
2a6f0 6d 73 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 2a  ms immediately *
2a700 2f 0a 09 09 2a 70 75 6c 4f 62 6a 65 63 74 43 6f  /...*pulObjectCo
2a710 75 6e 74 20 3d 20 30 3b 0a 0a 09 09 43 41 43 4b  unt = 0;....CACK
2a720 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2a730 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
2a740 4b 20 28 25 69 29 20 28 73 68 6f 72 74 20 63 69  K (%i) (short ci
2a750 72 63 75 69 74 29 22 2c 20 43 4b 52 5f 4f 4b 29  rcuit)", CKR_OK)
2a760 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
2a770 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 68  OK);..}...if (ph
2a780 4f 62 6a 65 63 74 20 3d 3d 20 4e 55 4c 4c 29 20  Object == NULL) 
2a790 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
2a7a0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2a7b0 20 70 68 4f 62 6a 65 63 74 20 69 73 20 4e 55 4c   phObject is NUL
2a7c0 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  L.");....return(
2a7d0 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41  CKR_ARGUMENTS_BA
2a7e0 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 6c 4d  D);..}...if (ulM
2a7f0 61 78 4f 62 6a 65 63 74 43 6f 75 6e 74 20 3d 3d  axObjectCount ==
2a800 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
2a810 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2a820 6f 72 2e 20 20 4d 61 78 69 6d 75 6d 20 6e 75 6d  or.  Maximum num
2a830 62 65 72 20 6f 66 20 6f 62 6a 65 63 74 73 20 73  ber of objects s
2a840 70 65 63 69 66 69 65 64 20 61 73 20 7a 65 72 6f  pecified as zero
2a850 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
2a860 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44  KR_ARGUMENTS_BAD
2a870 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73  );..}...if (hSes
2a880 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65  sion == 0 || hSe
2a890 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66  ssion >= (sizeof
2a8a0 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
2a8b0 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
2a8c0 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29  y_sessions[0])))
2a8d0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
2a8e0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2a8f0 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66    Session out of
2a900 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09   range.");......
2a910 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
2a920 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  ON_HANDLE_INVALI
2a930 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  D);..}...mutex_r
2a940 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
2a950 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79  utex_lock(cackey
2a960 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
2a970 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
2a980 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
2a990 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2a9a0 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c  r.  Locking fail
2a9b0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
2a9c0 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
2a9d0 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63  OR);..}...if (!c
2a9e0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
2a9f0 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29  Session].active)
2aa00 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65   {...cackey_mute
2aa10 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
2aa20 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43  biglock);....CAC
2aa30 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2aa40 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f  ("Error.  Sessio
2aa50 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b  n not active.");
2aa60 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
2aa70 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
2aa80 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69  INVALID);..}...i
2aa90 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69  f (!cackey_sessi
2aaa0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65  ons[hSession].se
2aab0 61 72 63 68 5f 61 63 74 69 76 65 29 20 7b 0a 09  arch_active) {..
2aac0 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
2aad0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
2aae0 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f  ock);....CACKEY_
2aaf0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2ab00 72 6f 72 2e 20 20 53 65 61 72 63 68 20 6e 6f 74  ror.  Search not
2ab10 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09   active.");.....
2ab20 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52  .return(CKR_OPER
2ab30 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41  ATION_NOT_INITIA
2ab40 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 23 69 66 64  LIZED);..}..#ifd
2ab50 65 66 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ef CACKEY_DEBUG_
2ab60 53 45 41 52 43 48 5f 53 50 45 45 44 54 45 53 54  SEARCH_SPEEDTEST
2ab70 0a 09 67 65 74 74 69 6d 65 6f 66 64 61 79 28 26  ..gettimeofday(&
2ab80 73 74 61 72 74 2c 20 4e 55 4c 4c 29 3b 0a 23 65  start, NULL);.#e
2ab90 6e 64 69 66 0a 0a 09 63 75 72 72 5f 6f 75 74 5f  ndif...curr_out_
2aba0 69 64 5f 69 64 78 20 3d 20 30 3b 0a 09 66 6f 72  id_idx = 0;..for
2abb0 20 28 63 75 72 72 5f 69 64 5f 69 64 78 20 3d 20   (curr_id_idx = 
2abc0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2abd0 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68  hSession].search
2abe0 5f 63 75 72 72 5f 69 64 3b 20 63 75 72 72 5f 69  _curr_id; curr_i
2abf0 64 5f 69 64 78 20 3c 20 63 61 63 6b 65 79 5f 73  d_idx < cackey_s
2ac00 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
2ac10 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75  ].identities_cou
2ac20 6e 74 20 26 26 20 75 6c 4d 61 78 4f 62 6a 65 63  nt && ulMaxObjec
2ac30 74 43 6f 75 6e 74 3b 20 63 75 72 72 5f 69 64 5f  tCount; curr_id_
2ac40 69 64 78 2b 2b 29 20 7b 0a 09 09 63 75 72 72 5f  idx++) {...curr_
2ac50 69 64 20 3d 20 26 63 61 63 6b 65 79 5f 73 65 73  id = &cackey_ses
2ac60 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
2ac70 69 64 65 6e 74 69 74 69 65 73 5b 63 75 72 72 5f  identities[curr_
2ac80 69 64 5f 69 64 78 5d 3b 0a 0a 09 09 43 41 43 4b  id_idx];....CACK
2ac90 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2aca0 22 50 72 6f 63 65 73 73 69 6e 67 20 69 64 65 6e  "Processing iden
2acb0 74 69 74 79 3a 25 6c 75 22 2c 20 28 75 6e 73 69  tity:%lu", (unsi
2acc0 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f  gned long) curr_
2acd0 69 64 5f 69 64 78 29 3b 0a 0a 09 09 6d 61 74 63  id_idx);....matc
2ace0 68 65 64 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 0a  hed_count = 0;..
2acf0 09 09 66 6f 72 20 28 63 75 72 72 5f 61 74 74 72  ..for (curr_attr
2ad00 5f 69 64 78 20 3d 20 30 3b 20 63 75 72 72 5f 61  _idx = 0; curr_a
2ad10 74 74 72 5f 69 64 78 20 3c 20 63 61 63 6b 65 79  ttr_idx < cackey
2ad20 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
2ad30 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79  on].search_query
2ad40 5f 63 6f 75 6e 74 3b 20 63 75 72 72 5f 61 74 74  _count; curr_att
2ad50 72 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 09 70 72  r_idx++) {....pr
2ad60 65 76 5f 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74  ev_matched_count
2ad70 20 3d 20 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74   = matched_count
2ad80 3b 0a 0a 09 09 09 63 75 72 72 5f 61 74 74 72 20  ;.....curr_attr 
2ad90 3d 20 26 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  = &cackey_sessio
2ada0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61  ns[hSession].sea
2adb0 72 63 68 5f 71 75 65 72 79 5b 63 75 72 72 5f 61  rch_query[curr_a
2adc0 74 74 72 5f 69 64 78 5d 3b 0a 0a 09 09 09 43 41  ttr_idx];.....CA
2add0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2ade0 46 28 22 20 20 43 68 65 63 6b 69 6e 67 20 66 6f  F("  Checking fo
2adf0 72 20 61 74 74 72 69 62 75 74 65 20 25 73 20 28  r attribute %s (
2ae00 30 78 25 30 38 6c 78 29 20 69 6e 20 69 64 65 6e  0x%08lx) in iden
2ae10 74 69 74 79 3a 25 69 2e 2e 2e 22 2c 20 43 41 43  tity:%i...", CAC
2ae20 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 41  KEY_DEBUG_FUNC_A
2ae30 54 54 52 49 42 55 54 45 5f 54 4f 5f 53 54 52 28  TTRIBUTE_TO_STR(
2ae40 63 75 72 72 5f 61 74 74 72 2d 3e 74 79 70 65 29  curr_attr->type)
2ae50 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
2ae60 29 20 63 75 72 72 5f 61 74 74 72 2d 3e 74 79 70  ) curr_attr->typ
2ae70 65 2c 20 28 69 6e 74 29 20 63 75 72 72 5f 69 64  e, (int) curr_id
2ae80 5f 69 64 78 29 3b 0a 09 09 09 43 41 43 4b 45 59  _idx);....CACKEY
2ae90 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28  _DEBUG_PRINTBUF(
2aea0 22 20 20 20 20 56 61 6c 75 65 20 6c 6f 6f 6b 69  "    Value looki
2aeb0 6e 67 20 66 6f 72 3a 22 2c 20 63 75 72 72 5f 61  ng for:", curr_a
2aec0 74 74 72 2d 3e 70 56 61 6c 75 65 2c 20 63 75 72  ttr->pValue, cur
2aed0 72 5f 61 74 74 72 2d 3e 75 6c 56 61 6c 75 65 4c  r_attr->ulValueL
2aee0 65 6e 29 3b 0a 0a 09 09 09 66 6f 72 20 28 73 65  en);.....for (se
2aef0 73 73 5f 61 74 74 72 5f 69 64 78 20 3d 20 30 3b  ss_attr_idx = 0;
2af00 20 73 65 73 73 5f 61 74 74 72 5f 69 64 78 20 3c   sess_attr_idx <
2af10 20 63 75 72 72 5f 69 64 2d 3e 61 74 74 72 69 62   curr_id->attrib
2af20 75 74 65 73 5f 63 6f 75 6e 74 3b 20 73 65 73 73  utes_count; sess
2af30 5f 61 74 74 72 5f 69 64 78 2b 2b 29 20 7b 0a 09  _attr_idx++) {..
2af40 09 09 09 69 66 20 28 63 61 63 6b 65 79 5f 70 6b  ...if (cackey_pk
2af50 63 73 31 31 5f 63 6f 6d 70 61 72 65 5f 61 74 74  cs11_compare_att
2af60 72 69 62 75 74 65 73 28 26 63 75 72 72 5f 69 64  ributes(&curr_id
2af70 2d 3e 61 74 74 72 69 62 75 74 65 73 5b 73 65 73  ->attributes[ses
2af80 73 5f 61 74 74 72 5f 69 64 78 5d 2c 20 63 75 72  s_attr_idx], cur
2af90 72 5f 61 74 74 72 29 29 20 7b 0a 09 09 09 09 09  r_attr)) {......
2afa0 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 2b 2b 3b  matched_count++;
2afb0 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .......break;...
2afc0 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 09 2f 2a 20  ..}....}...../* 
2afd0 49 66 20 74 68 65 20 61 74 74 72 69 62 75 74 65  If the attribute
2afe0 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 6d 61   could not be ma
2aff0 74 63 68 65 64 2c 20 64 6f 20 6e 6f 74 20 74 72  tched, do not tr
2b000 79 20 74 6f 20 6d 61 74 63 68 20 61 64 64 69 74  y to match addit
2b010 69 6f 6e 61 6c 20 61 74 74 72 69 62 75 74 65 73  ional attributes
2b020 20 2a 2f 0a 09 09 09 69 66 20 28 70 72 65 76 5f   */....if (prev_
2b030 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 20 3d 3d  matched_count ==
2b040 20 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 29 20   matched_count) 
2b050 7b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  {.....break;....
2b060 7d 0a 09 09 7d 0a 0a 09 09 69 66 20 28 6d 61 74  }...}....if (mat
2b070 63 68 65 64 5f 63 6f 75 6e 74 20 3d 3d 20 63 61  ched_count == ca
2b080 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
2b090 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71  ession].search_q
2b0a0 75 65 72 79 5f 63 6f 75 6e 74 29 20 7b 0a 09 09  uery_count) {...
2b0b0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2b0c0 49 4e 54 46 28 22 20 20 2e 2e 2e 20 41 6c 6c 20  INTF("  ... All 
2b0d0 25 69 20 61 74 74 72 69 62 75 74 65 73 20 63 68  %i attributes ch
2b0e0 65 63 6b 65 64 20 66 6f 72 20 66 6f 75 6e 64 2c  ecked for found,
2b0f0 20 61 64 64 69 6e 67 20 69 64 65 6e 74 69 74 79   adding identity
2b100 3a 25 69 20 74 6f 20 72 65 74 75 72 6e 65 64 20  :%i to returned 
2b110 6c 69 73 74 22 2c 20 28 69 6e 74 29 20 63 61 63  list", (int) cac
2b120 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
2b130 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75  ssion].search_qu
2b140 65 72 79 5f 63 6f 75 6e 74 2c 20 28 69 6e 74 29  ery_count, (int)
2b150 20 63 75 72 72 5f 69 64 5f 69 64 78 29 3b 0a 0a   curr_id_idx);..
2b160 09 09 09 70 68 4f 62 6a 65 63 74 5b 63 75 72 72  ...phObject[curr
2b170 5f 6f 75 74 5f 69 64 5f 69 64 78 5d 20 3d 20 63  _out_id_idx] = c
2b180 75 72 72 5f 69 64 5f 69 64 78 20 2b 20 31 3b 0a  urr_id_idx + 1;.
2b190 0a 09 09 09 75 6c 4d 61 78 4f 62 6a 65 63 74 43  ....ulMaxObjectC
2b1a0 6f 75 6e 74 2d 2d 3b 0a 0a 09 09 09 63 75 72 72  ount--;.....curr
2b1b0 5f 6f 75 74 5f 69 64 5f 69 64 78 2b 2b 3b 0a 09  _out_id_idx++;..
2b1c0 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 43 41 43  .} else {....CAC
2b1d0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2b1e0 28 22 20 20 2e 2e 2e 20 4e 6f 74 20 61 6c 6c 20  ("  ... Not all 
2b1f0 25 69 20 28 6f 6e 6c 79 20 66 6f 75 6e 64 20 25  %i (only found %
2b200 69 29 20 61 74 74 72 69 62 75 74 65 73 20 63 68  i) attributes ch
2b210 65 63 6b 65 64 20 66 6f 72 20 66 6f 75 6e 64 2c  ecked for found,
2b220 20 6e 6f 74 20 61 64 64 69 6e 67 20 69 64 65 6e   not adding iden
2b230 74 69 74 79 3a 25 69 22 2c 20 28 69 6e 74 29 20  tity:%i", (int) 
2b240 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2b250 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68  hSession].search
2b260 5f 71 75 65 72 79 5f 63 6f 75 6e 74 2c 20 28 69  _query_count, (i
2b270 6e 74 29 20 6d 61 74 63 68 65 64 5f 63 6f 75 6e  nt) matched_coun
2b280 74 2c 20 28 69 6e 74 29 20 63 75 72 72 5f 69 64  t, (int) curr_id
2b290 5f 69 64 78 29 3b 0a 09 09 7d 0a 09 7d 0a 09 63  _idx);...}..}..c
2b2a0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
2b2b0 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f  Session].search_
2b2c0 63 75 72 72 5f 69 64 20 3d 20 63 75 72 72 5f 69  curr_id = curr_i
2b2d0 64 5f 69 64 78 3b 0a 09 2a 70 75 6c 4f 62 6a 65  d_idx;..*pulObje
2b2e0 63 74 43 6f 75 6e 74 20 3d 20 63 75 72 72 5f 6f  ctCount = curr_o
2b2f0 75 74 5f 69 64 5f 69 64 78 3b 0a 0a 23 69 66 64  ut_id_idx;..#ifd
2b300 65 66 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ef CACKEY_DEBUG_
2b310 53 45 41 52 43 48 5f 53 50 45 45 44 54 45 53 54  SEARCH_SPEEDTEST
2b320 0a 09 67 65 74 74 69 6d 65 6f 66 64 61 79 28 26  ..gettimeofday(&
2b330 65 6e 64 2c 20 4e 55 4c 4c 29 3b 0a 09 73 74 61  end, NULL);..sta
2b340 72 74 5f 69 6e 74 20 3d 20 28 73 74 61 72 74 2e  rt_int = (start.
2b350 74 76 5f 73 65 63 20 2a 20 31 30 30 30 30 30 30  tv_sec * 1000000
2b360 29 20 2b 20 73 74 61 72 74 2e 74 76 5f 75 73 65  ) + start.tv_use
2b370 63 3b 0a 09 65 6e 64 5f 69 6e 74 20 3d 20 28 65  c;..end_int = (e
2b380 6e 64 2e 74 76 5f 73 65 63 20 2a 20 31 30 30 30  nd.tv_sec * 1000
2b390 30 30 30 29 20 2b 20 65 6e 64 2e 74 76 5f 75 73  000) + end.tv_us
2b3a0 65 63 3b 0a 09 66 70 72 69 6e 74 66 28 73 74 64  ec;..fprintf(std
2b3b0 65 72 72 2c 20 22 53 65 61 72 63 68 20 74 6f 6f  err, "Search too
2b3c0 6b 20 25 6c 75 20 6d 69 63 72 6f 73 65 63 6f 6e  k %lu microsecon
2b3d0 64 73 5c 6e 22 2c 20 28 75 6e 73 69 67 6e 65 64  ds\n", (unsigned
2b3e0 20 6c 6f 6e 67 29 20 28 65 6e 64 5f 69 6e 74 20   long) (end_int 
2b3f0 2d 20 73 74 61 72 74 5f 69 6e 74 29 29 3b 0a 23  - start_int));.#
2b400 65 6e 64 69 66 0a 0a 09 6d 75 74 65 78 5f 72 65  endif...mutex_re
2b410 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
2b420 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
2b430 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
2b440 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
2b450 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
2b460 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2b470 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66  or.  Unlocking f
2b480 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
2b490 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
2b4a0 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43  ERROR);..}...CAC
2b4b0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2b4c0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
2b4d0 4f 4b 20 28 25 69 29 2c 20 6e 75 6d 20 6f 62 6a  OK (%i), num obj
2b4e0 65 63 74 73 20 3d 20 25 6c 75 22 2c 20 43 4b 52  ects = %lu", CKR
2b4f0 5f 4f 4b 2c 20 2a 70 75 6c 4f 62 6a 65 63 74 43  _OK, *pulObjectC
2b500 6f 75 6e 74 29 3b 0a 0a 09 72 65 74 75 72 6e 28  ount);...return(
2b510 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44  CKR_OK);.}..CK_D
2b520 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
2b530 4b 5f 52 56 2c 20 43 5f 46 69 6e 64 4f 62 6a 65  K_RV, C_FindObje
2b540 63 74 73 46 69 6e 61 6c 29 28 43 4b 5f 53 45 53  ctsFinal)(CK_SES
2b550 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
2b560 73 69 6f 6e 29 20 7b 0a 09 43 4b 5f 55 4c 4f 4e  sion) {..CK_ULON
2b570 47 20 69 64 78 3b 0a 09 69 6e 74 20 6d 75 74 65  G idx;..int mute
2b580 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b  x_retval;...CACK
2b590 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2b5a0 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
2b5b0 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
2b5c0 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
2b5d0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2b5e0 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
2b5f0 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
2b600 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
2b610 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
2b620 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53  ED);..}...if (hS
2b630 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68  ession == 0 || h
2b640 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65  Session >= (size
2b650 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
2b660 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63  ns) / sizeof(cac
2b670 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29  key_sessions[0])
2b680 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  )) {...CACKEY_DE
2b690 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2b6a0 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20  r.  Session out 
2b6b0 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a  of range.");....
2b6c0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53  ..return(CKR_SES
2b6d0 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41  SION_HANDLE_INVA
2b6e0 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78  LID);..}...mutex
2b6f0 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
2b700 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b  _mutex_lock(cack
2b710 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
2b720 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
2b730 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
2b740 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2b750 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61  ror.  Locking fa
2b760 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
2b770 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
2b780 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  RROR);..}...if (
2b790 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  !cackey_sessions
2b7a0 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76  [hSession].activ
2b7b0 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75  e) {...cackey_mu
2b7c0 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
2b7d0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43  y_biglock);....C
2b7e0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2b7f0 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73  TF("Error.  Sess
2b800 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22  ion not active."
2b810 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
2b820 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  KR_SESSION_HANDL
2b830 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
2b840 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73  .if (!cackey_ses
2b850 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
2b860 73 65 61 72 63 68 5f 61 63 74 69 76 65 29 20 7b  search_active) {
2b870 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
2b880 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
2b890 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45  glock);....CACKE
2b8a0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2b8b0 45 72 72 6f 72 2e 20 20 53 65 61 72 63 68 20 6e  Error.  Search n
2b8c0 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09  ot active.");...
2b8d0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50  ...return(CKR_OP
2b8e0 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54  ERATION_NOT_INIT
2b8f0 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 63  IALIZED);..}...c
2b900 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
2b910 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f  Session].search_
2b920 61 63 74 69 76 65 20 3d 20 30 3b 0a 0a 09 66 6f  active = 0;...fo
2b930 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20  r (idx = 0; idx 
2b940 3c 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  < cackey_session
2b950 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72  s[hSession].sear
2b960 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74 3b 20  ch_query_count; 
2b970 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28 63  idx++) {...if (c
2b980 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
2b990 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f  Session].search_
2b9a0 71 75 65 72 79 5b 69 64 78 5d 2e 70 56 61 6c 75  query[idx].pValu
2b9b0 65 29 20 7b 0a 09 09 09 66 72 65 65 28 63 61 63  e) {....free(cac
2b9c0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
2b9d0 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75  ssion].search_qu
2b9e0 65 72 79 5b 69 64 78 5d 2e 70 56 61 6c 75 65 29  ery[idx].pValue)
2b9f0 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28 63  ;...}..}...if (c
2ba00 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
2ba10 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f  Session].search_
2ba20 71 75 65 72 79 29 20 7b 0a 09 09 66 72 65 65 28  query) {...free(
2ba30 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2ba40 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68  hSession].search
2ba50 5f 71 75 65 72 79 29 3b 0a 09 7d 0a 0a 09 6d 75  _query);..}...mu
2ba60 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
2ba70 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
2ba80 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
2ba90 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
2baa0 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
2bab0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2bac0 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63  F("Error.  Unloc
2bad0 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
2bae0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
2baf0 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
2bb00 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2bb10 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
2bb20 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20  g CKR_OK (%i)", 
2bb30 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72  CKR_OK);...retur
2bb40 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b  n(CKR_OK);.}..CK
2bb50 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
2bb60 28 43 4b 5f 52 56 2c 20 43 5f 45 6e 63 72 79 70  (CK_RV, C_Encryp
2bb70 74 49 6e 69 74 29 28 43 4b 5f 53 45 53 53 49 4f  tInit)(CK_SESSIO
2bb80 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
2bb90 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f  n, CK_MECHANISM_
2bba0 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20  PTR pMechanism, 
2bbb0 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45  CK_OBJECT_HANDLE
2bbc0 20 68 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59   hKey) {..CACKEY
2bbd0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
2bbe0 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
2bbf0 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
2bc00 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
2bc10 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2bc20 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
2bc30 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
2bc40 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
2bc50 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
2bc60 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
2bc70 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
2bc80 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
2bc90 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
2bca0 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
2bcb0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
2bcc0 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
2bcd0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
2bce0 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
2bcf0 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
2bd00 4e 28 43 4b 5f 52 56 2c 20 43 5f 45 6e 63 72 79  N(CK_RV, C_Encry
2bd10 70 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  pt)(CK_SESSION_H
2bd20 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
2bd30 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 44 61 74  CK_BYTE_PTR pDat
2bd40 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 44 61  a, CK_ULONG ulDa
2bd50 74 61 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  taLen, CK_BYTE_P
2bd60 54 52 20 70 45 6e 63 72 79 70 74 65 64 44 61 74  TR pEncryptedDat
2bd70 61 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20  a, CK_ULONG_PTR 
2bd80 70 75 6c 45 6e 63 72 79 70 74 65 64 44 61 74 61  pulEncryptedData
2bd90 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  Len) {..CACKEY_D
2bda0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
2bdb0 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
2bdc0 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
2bdd0 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
2bde0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2bdf0 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
2be00 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
2be10 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
2be20 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
2be30 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
2be40 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
2be50 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
2be60 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
2be70 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
2be80 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
2be90 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
2bea0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
2beb0 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
2bec0 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
2bed0 43 4b 5f 52 56 2c 20 43 5f 45 6e 63 72 79 70 74  CK_RV, C_Encrypt
2bee0 55 70 64 61 74 65 29 28 43 4b 5f 53 45 53 53 49  Update)(CK_SESSI
2bef0 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
2bf00 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  on, CK_BYTE_PTR 
2bf10 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20  pPart, CK_ULONG 
2bf20 75 6c 50 61 72 74 4c 65 6e 2c 20 43 4b 5f 42 59  ulPartLen, CK_BY
2bf30 54 45 5f 50 54 52 20 70 45 6e 63 72 79 70 74 65  TE_PTR pEncrypte
2bf40 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f  dPart, CK_ULONG_
2bf50 50 54 52 20 70 75 6c 45 6e 63 72 79 70 74 65 64  PTR pulEncrypted
2bf60 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b  PartLen) {..CACK
2bf70 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2bf80 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
2bf90 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
2bfa0 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
2bfb0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2bfc0 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
2bfd0 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
2bfe0 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
2bff0 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
2c000 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
2c010 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
2c020 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
2c030 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
2c040 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
2c050 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
2c060 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
2c070 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
2c080 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
2c090 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
2c0a0 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 45 6e 63  ION(CK_RV, C_Enc
2c0b0 72 79 70 74 46 69 6e 61 6c 29 28 43 4b 5f 53 45  ryptFinal)(CK_SE
2c0c0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
2c0d0 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  ssion, CK_BYTE_P
2c0e0 54 52 20 70 4c 61 73 74 45 6e 63 72 79 70 74 65  TR pLastEncrypte
2c0f0 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f  dPart, CK_ULONG_
2c100 50 54 52 20 70 75 6c 4c 61 73 74 45 6e 63 72 79  PTR pulLastEncry
2c110 70 74 65 64 50 61 72 74 4c 65 6e 29 20 7b 0a 09  ptedPartLen) {..
2c120 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2c130 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
2c140 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
2c150 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
2c160 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2c170 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
2c180 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
2c190 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
2c1a0 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
2c1b0 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
2c1c0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2c1d0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
2c1e0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
2c1f0 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
2c200 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
2c210 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
2c220 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
2c230 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
2c240 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
2c250 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
2c260 5f 44 65 63 72 79 70 74 49 6e 69 74 29 28 43 4b  _DecryptInit)(CK
2c270 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
2c280 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43  hSession, CK_MEC
2c290 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68  HANISM_PTR pMech
2c2a0 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54  anism, CK_OBJECT
2c2b0 5f 48 41 4e 44 4c 45 20 68 4b 65 79 29 20 7b 0a  _HANDLE hKey) {.
2c2c0 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61  .int mutex_retva
2c2d0 6c 3b 0a 0a 09 68 4b 65 79 2d 2d 3b 0a 0a 09 43  l;...hKey--;...C
2c2e0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2c2f0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
2c300 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
2c310 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
2c320 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2c330 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
2c340 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
2c350 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
2c360 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
2c370 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  LIZED);..}...if 
2c380 28 70 4d 65 63 68 61 6e 69 73 6d 20 3d 3d 20 4e  (pMechanism == N
2c390 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
2c3a0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2c3b0 72 6f 72 2e 20 70 4d 65 63 68 61 6e 69 73 6d 20  ror. pMechanism 
2c3c0 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72  is NULL.");....r
2c3d0 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45  eturn(CKR_ARGUME
2c3e0 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69  NTS_BAD);..}...i
2c3f0 66 20 28 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d  f (pMechanism->m
2c400 65 63 68 61 6e 69 73 6d 20 21 3d 20 43 4b 4d 5f  echanism != CKM_
2c410 52 53 41 5f 50 4b 43 53 29 20 7b 0a 09 09 43 41  RSA_PKCS) {...CA
2c420 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2c430 46 28 22 45 72 72 6f 72 2e 20 70 4d 65 63 68 61  F("Error. pMecha
2c440 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d 20  nism->mechanism 
2c450 6e 6f 74 20 73 70 65 63 69 66 69 65 64 20 61 73  not specified as
2c460 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 22 29 3b   CKM_RSA_PKCS");
2c470 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4d  ....return(CKR_M
2c480 45 43 48 41 4e 49 53 4d 5f 50 41 52 41 4d 5f 49  ECHANISM_PARAM_I
2c490 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66  NVALID);..}...if
2c4a0 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20   (hSession == 0 
2c4b0 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28  || hSession >= (
2c4c0 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
2c4d0 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66  ssions) / sizeof
2c4e0 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
2c4f0 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45  [0]))) {...CACKE
2c500 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2c510 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20  Error.  Session 
2c520 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b  out of range.");
2c530 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
2c540 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
2c550 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d  INVALID);..}...m
2c560 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
2c570 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28  ckey_mutex_lock(
2c580 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
2c590 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
2c5a0 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
2c5b0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2c5c0 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e  ("Error.  Lockin
2c5d0 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
2c5e0 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
2c5f0 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
2c600 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73  if (!cackey_sess
2c610 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61  ions[hSession].a
2c620 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65  ctive) {...cacke
2c630 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
2c640 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
2c650 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2c660 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
2c670 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69  Session not acti
2c680 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ve.");......retu
2c690 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48  rn(CKR_SESSION_H
2c6a0 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a  ANDLE_INVALID);.
2c6b0 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f  .}...if (cackey_
2c6c0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
2c6d0 6e 5d 2e 64 65 63 72 79 70 74 5f 61 63 74 69 76  n].decrypt_activ
2c6e0 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75  e) {...cackey_mu
2c6f0 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
2c700 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43  y_biglock);....C
2c710 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2c720 54 46 28 22 45 72 72 6f 72 2e 20 20 44 65 63 72  TF("Error.  Decr
2c730 79 70 74 20 61 6c 72 65 61 64 79 20 69 6e 20 70  ypt already in p
2c740 72 6f 67 72 65 73 73 2e 22 29 3b 0a 09 09 0a 09  rogress.");.....
2c750 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52  .return(CKR_OPER
2c760 41 54 49 4f 4e 5f 41 43 54 49 56 45 29 3b 0a 09  ATION_ACTIVE);..
2c770 7d 0a 0a 09 69 66 20 28 68 4b 65 79 20 3e 3d 20  }...if (hKey >= 
2c780 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2c790 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69  hSession].identi
2c7a0 74 69 65 73 5f 63 6f 75 6e 74 29 20 7b 0a 09 09  ties_count) {...
2c7b0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
2c7c0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
2c7d0 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ck);....CACKEY_D
2c7e0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2c7f0 6f 72 2e 20 20 4b 65 79 20 68 61 6e 64 6c 65 20  or.  Key handle 
2c800 6f 75 74 20 6f 66 20 72 61 6e 67 65 20 28 72 65  out of range (re
2c810 71 75 65 73 74 65 64 20 6b 65 79 20 25 6c 75 2c  quested key %lu,
2c820 20 6f 6e 6c 79 20 25 6c 75 20 69 64 65 6e 74 69   only %lu identi
2c830 74 69 65 73 20 61 76 61 69 6c 61 62 6c 65 29 2e  ties available).
2c840 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
2c850 67 29 20 68 4b 65 79 2c 20 28 75 6e 73 69 67 6e  g) hKey, (unsign
2c860 65 64 20 6c 6f 6e 67 29 20 63 61 63 6b 65 79 5f  ed long) cackey_
2c870 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
2c880 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 6f  n].identities_co
2c890 75 6e 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  unt);....return(
2c8a0 43 4b 52 5f 4b 45 59 5f 48 41 4e 44 4c 45 5f 49  CKR_KEY_HANDLE_I
2c8b0 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 63 61  NVALID);..}...ca
2c8c0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
2c8d0 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f  ession].decrypt_
2c8e0 61 63 74 69 76 65 20 3d 20 31 3b 0a 0a 09 63 61  active = 1;...ca
2c8f0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
2c900 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f  ession].decrypt_
2c910 6d 65 63 68 61 6e 69 73 6d 20 3d 20 70 4d 65 63  mechanism = pMec
2c920 68 61 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e 69 73  hanism->mechanis
2c930 6d 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69  m;..cackey_sessi
2c940 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65  ons[hSession].de
2c950 63 72 79 70 74 5f 6d 65 63 68 5f 70 61 72 6d 20  crypt_mech_parm 
2c960 3d 20 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 70 50  = pMechanism->pP
2c970 61 72 61 6d 65 74 65 72 3b 0a 09 63 61 63 6b 65  arameter;..cacke
2c980 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
2c990 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 6d 65 63  ion].decrypt_mec
2c9a0 68 5f 70 61 72 6d 6c 65 6e 20 3d 20 70 4d 65 63  h_parmlen = pMec
2c9b0 68 61 6e 69 73 6d 2d 3e 75 6c 50 61 72 61 6d 65  hanism->ulParame
2c9c0 74 65 72 4c 65 6e 3b 0a 09 63 61 63 6b 65 79 5f  terLen;..cackey_
2c9d0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
2c9e0 6e 5d 2e 64 65 63 72 79 70 74 5f 69 64 65 6e 74  n].decrypt_ident
2c9f0 69 74 79 20 3d 20 26 63 61 63 6b 65 79 5f 73 65  ity = &cackey_se
2ca00 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
2ca10 2e 69 64 65 6e 74 69 74 69 65 73 5b 68 4b 65 79  .identities[hKey
2ca20 5d 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  ];...mutex_retva
2ca30 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
2ca40 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
2ca50 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
2ca60 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
2ca70 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
2ca80 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2ca90 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c    Unlocking fail
2caa0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
2cab0 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
2cac0 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  OR);..}...CACKEY
2cad0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
2cae0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20  eturning CKR_OK 
2caf0 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a  (%i)", CKR_OK);.
2cb00 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29  ..return(CKR_OK)
2cb10 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
2cb20 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
2cb30 5f 44 65 63 72 79 70 74 29 28 43 4b 5f 53 45 53  _Decrypt)(CK_SES
2cb40 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
2cb50 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  sion, CK_BYTE_PT
2cb60 52 20 70 45 6e 63 72 79 70 74 65 64 44 61 74 61  R pEncryptedData
2cb70 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 45 6e 63  , CK_ULONG ulEnc
2cb80 72 79 70 74 65 64 44 61 74 61 4c 65 6e 2c 20 43  ryptedDataLen, C
2cb90 4b 5f 42 59 54 45 5f 50 54 52 20 70 44 61 74 61  K_BYTE_PTR pData
2cba0 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70  , CK_ULONG_PTR p
2cbb0 75 6c 44 61 74 61 4c 65 6e 29 20 7b 0a 09 43 4b  ulDataLen) {..CK
2cbc0 5f 55 4c 4f 4e 47 20 64 61 74 61 6c 65 6e 5f 75  _ULONG datalen_u
2cbd0 70 64 61 74 65 2c 20 64 61 74 61 6c 65 6e 5f 66  pdate, datalen_f
2cbe0 69 6e 61 6c 3b 0a 09 43 4b 5f 52 56 20 64 65 63  inal;..CK_RV dec
2cbf0 72 79 70 74 5f 72 65 74 3b 0a 09 69 6e 74 20 6d  rypt_ret;..int m
2cc00 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43  utex_retval;...C
2cc10 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2cc20 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
2cc30 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
2cc40 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
2cc50 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2cc60 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
2cc70 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
2cc80 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
2cc90 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
2cca0 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  LIZED);..}...if 
2ccb0 28 70 75 6c 44 61 74 61 4c 65 6e 20 3d 3d 20 4e  (pulDataLen == N
2ccc0 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
2ccd0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2cce0 72 6f 72 2e 20 70 75 6c 44 61 74 61 4c 65 6e 20  ror. pulDataLen 
2ccf0 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72  is NULL.");....r
2cd00 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45  eturn(CKR_ARGUME
2cd10 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 64  NTS_BAD);..}...d
2cd20 61 74 61 6c 65 6e 5f 75 70 64 61 74 65 20 3d 20  atalen_update = 
2cd30 2a 70 75 6c 44 61 74 61 4c 65 6e 3b 0a 0a 09 64  *pulDataLen;...d
2cd40 65 63 72 79 70 74 5f 72 65 74 20 3d 20 43 5f 44  ecrypt_ret = C_D
2cd50 65 63 72 79 70 74 55 70 64 61 74 65 28 68 53 65  ecryptUpdate(hSe
2cd60 73 73 69 6f 6e 2c 20 70 45 6e 63 72 79 70 74 65  ssion, pEncrypte
2cd70 64 44 61 74 61 2c 20 75 6c 45 6e 63 72 79 70 74  dData, ulEncrypt
2cd80 65 64 44 61 74 61 4c 65 6e 2c 20 70 44 61 74 61  edDataLen, pData
2cd90 2c 20 26 64 61 74 61 6c 65 6e 5f 75 70 64 61 74  , &datalen_updat
2cda0 65 29 3b 0a 09 69 66 20 28 64 65 63 72 79 70 74  e);..if (decrypt
2cdb0 5f 72 65 74 20 21 3d 20 43 4b 52 5f 4f 4b 29 20  _ret != CKR_OK) 
2cdc0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
2cdd0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2cde0 20 44 65 63 72 79 70 74 55 70 64 61 74 65 28 29   DecryptUpdate()
2cdf0 20 72 65 74 75 72 6e 65 64 20 66 61 69 6c 75 72   returned failur
2ce00 65 20 28 72 76 20 3d 20 25 6c 75 29 2e 22 2c 20  e (rv = %lu).", 
2ce10 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
2ce20 64 65 63 72 79 70 74 5f 72 65 74 29 3b 0a 0a 09  decrypt_ret);...
2ce30 09 69 66 20 28 64 65 63 72 79 70 74 5f 72 65 74  .if (decrypt_ret
2ce40 20 21 3d 20 43 4b 52 5f 42 55 46 46 45 52 5f 54   != CKR_BUFFER_T
2ce50 4f 4f 5f 53 4d 41 4c 4c 29 20 7b 0a 09 09 09 2f  OO_SMALL) {..../
2ce60 2a 20 54 65 72 6d 69 6e 61 74 65 20 64 65 63 72  * Terminate decr
2ce70 79 70 74 69 6f 6e 20 6f 70 65 72 61 74 69 6f 6e  yption operation
2ce80 20 2a 2f 0a 0a 09 09 09 6d 75 74 65 78 5f 72 65   */.....mutex_re
2ce90 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
2cea0 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  tex_lock(cackey_
2ceb0 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 09 69 66 20  biglock);....if 
2cec0 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
2ced0 20 30 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59   0) {.....CACKEY
2cee0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2cef0 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66  rror.  Locking f
2cf00 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 09 09 72  ailed.");......r
2cf10 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
2cf20 4c 5f 45 52 52 4f 52 29 3b 0a 09 09 09 7d 0a 0a  L_ERROR);....}..
2cf30 09 09 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73  ...if (!cackey_s
2cf40 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
2cf50 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 09 09  ].active) {.....
2cf60 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
2cf70 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
2cf80 63 6b 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59  ck);......CACKEY
2cf90 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2cfa0 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e  rror.  Session n
2cfb0 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09  ot active.");...
2cfc0 0a 09 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
2cfd0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49  SESSION_HANDLE_I
2cfe0 4e 56 41 4c 49 44 29 3b 0a 09 09 09 7d 0a 0a 09  NVALID);....}...
2cff0 09 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65  ..if (!cackey_se
2d000 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
2d010 2e 64 65 63 72 79 70 74 5f 61 63 74 69 76 65 29  .decrypt_active)
2d020 20 7b 0a 09 09 09 09 63 61 63 6b 65 79 5f 6d 75   {.....cackey_mu
2d030 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
2d040 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 09  y_biglock);.....
2d050 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2d060 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 44 65  INTF("Error.  De
2d070 63 72 79 70 74 20 6e 6f 74 20 61 63 74 69 76 65  crypt not active
2d080 2e 22 29 3b 0a 09 09 0a 09 09 09 09 72 65 74 75  .");........retu
2d090 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e  rn(CKR_OPERATION
2d0a0 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
2d0b0 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 63 61 63 6b  );....}.....cack
2d0c0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
2d0d0 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 61 63  sion].decrypt_ac
2d0e0 74 69 76 65 20 3d 20 30 3b 0a 0a 09 09 09 6d 75  tive = 0;.....mu
2d0f0 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
2d100 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
2d110 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
2d120 3b 0a 09 09 09 69 66 20 28 6d 75 74 65 78 5f 72  ;....if (mutex_r
2d130 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
2d140 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2d150 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55  RINTF("Error.  U
2d160 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e  nlocking failed.
2d170 22 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28  ");......return(
2d180 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
2d190 52 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09  R);....}...}....
2d1a0 72 65 74 75 72 6e 28 64 65 63 72 79 70 74 5f 72  return(decrypt_r
2d1b0 65 74 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 44  et);..}...if (pD
2d1c0 61 74 61 29 20 7b 0a 09 09 70 44 61 74 61 20 2b  ata) {...pData +
2d1d0 3d 20 64 61 74 61 6c 65 6e 5f 75 70 64 61 74 65  = datalen_update
2d1e0 3b 0a 09 7d 0a 09 64 61 74 61 6c 65 6e 5f 66 69  ;..}..datalen_fi
2d1f0 6e 61 6c 20 3d 20 2a 70 75 6c 44 61 74 61 4c 65  nal = *pulDataLe
2d200 6e 20 2d 20 64 61 74 61 6c 65 6e 5f 75 70 64 61  n - datalen_upda
2d210 74 65 3b 0a 0a 09 64 65 63 72 79 70 74 5f 72 65  te;...decrypt_re
2d220 74 20 3d 20 43 5f 44 65 63 72 79 70 74 46 69 6e  t = C_DecryptFin
2d230 61 6c 28 68 53 65 73 73 69 6f 6e 2c 20 70 44 61  al(hSession, pDa
2d240 74 61 2c 20 26 64 61 74 61 6c 65 6e 5f 66 69 6e  ta, &datalen_fin
2d250 61 6c 29 3b 0a 09 69 66 20 28 64 65 63 72 79 70  al);..if (decryp
2d260 74 5f 72 65 74 20 21 3d 20 43 4b 52 5f 4f 4b 29  t_ret != CKR_OK)
2d270 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
2d280 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2d290 20 20 44 65 63 72 79 70 74 46 69 6e 61 6c 28 29    DecryptFinal()
2d2a0 20 72 65 74 75 72 6e 65 64 20 66 61 69 6c 75 72   returned failur
2d2b0 65 20 28 72 76 20 3d 20 25 6c 75 29 2e 22 2c 20  e (rv = %lu).", 
2d2c0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
2d2d0 64 65 63 72 79 70 74 5f 72 65 74 29 3b 0a 0a 09  decrypt_ret);...
2d2e0 09 72 65 74 75 72 6e 28 64 65 63 72 79 70 74 5f  .return(decrypt_
2d2f0 72 65 74 29 3b 0a 09 7d 0a 0a 09 2a 70 75 6c 44  ret);..}...*pulD
2d300 61 74 61 4c 65 6e 20 3d 20 64 61 74 61 6c 65 6e  ataLen = datalen
2d310 5f 75 70 64 61 74 65 20 2b 20 64 61 74 61 6c 65  _update + datale
2d320 6e 5f 66 69 6e 61 6c 3b 0a 0a 09 43 41 43 4b 45  n_final;...CACKE
2d330 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2d340 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b  Returning CKR_OK
2d350 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b   (%i)", CKR_OK);
2d360 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b  ...return(CKR_OK
2d370 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
2d380 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
2d390 43 5f 44 65 63 72 79 70 74 55 70 64 61 74 65 29  C_DecryptUpdate)
2d3a0 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
2d3b0 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
2d3c0 42 59 54 45 5f 50 54 52 20 70 45 6e 63 72 79 70  BYTE_PTR pEncryp
2d3d0 74 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e  tedPart, CK_ULON
2d3e0 47 20 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72  G ulEncryptedPar
2d3f0 74 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  tLen, CK_BYTE_PT
2d400 52 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e  R pPart, CK_ULON
2d410 47 5f 50 54 52 20 70 75 6c 50 61 72 74 4c 65 6e  G_PTR pulPartLen
2d420 29 20 7b 0a 09 73 74 61 74 69 63 20 43 4b 5f 42  ) {..static CK_B
2d430 59 54 45 20 62 75 66 5b 31 36 33 38 34 5d 3b 0a  YTE buf[16384];.
2d440 09 73 73 69 7a 65 5f 74 20 62 75 66 6c 65 6e 3b  .ssize_t buflen;
2d450 0a 09 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f  ..CK_SLOT_ID slo
2d460 74 49 44 3b 0a 09 43 4b 5f 52 56 20 72 65 74 76  tID;..CK_RV retv
2d470 61 6c 20 3d 20 43 4b 52 5f 47 45 4e 45 52 41 4c  al = CKR_GENERAL
2d480 5f 45 52 52 4f 52 3b 0a 09 69 6e 74 20 6d 75 74  _ERROR;..int mut
2d490 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43  ex_retval;...CAC
2d4a0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2d4b0 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
2d4c0 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
2d4d0 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
2d4e0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2d4f0 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
2d500 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
2d510 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
2d520 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
2d530 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68  ZED);..}...if (h
2d540 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20  Session == 0 || 
2d550 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a  hSession >= (siz
2d560 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
2d570 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ons) / sizeof(ca
2d580 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d  ckey_sessions[0]
2d590 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ))) {...CACKEY_D
2d5a0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2d5b0 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74  or.  Session out
2d5c0 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09   of range.");...
2d5d0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
2d5e0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56  SSION_HANDLE_INV
2d5f0 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  ALID);..}...if (
2d600 70 45 6e 63 72 79 70 74 65 64 50 61 72 74 20 3d  pEncryptedPart =
2d610 3d 20 4e 55 4c 4c 20 26 26 20 75 6c 45 6e 63 72  = NULL && ulEncr
2d620 79 70 74 65 64 50 61 72 74 4c 65 6e 20 3d 3d 20  yptedPartLen == 
2d630 30 29 20 7b 0a 09 09 2f 2a 20 53 68 6f 72 74 20  0) {.../* Short 
2d640 63 69 72 63 75 69 74 20 69 66 20 77 65 20 61 72  circuit if we ar
2d650 65 20 61 73 6b 65 64 20 74 6f 20 64 65 63 72 79  e asked to decry
2d660 70 74 20 6e 6f 74 68 69 6e 67 2e 2e 2e 20 2a 2f  pt nothing... */
2d670 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2d680 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
2d690 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 20 28 73  g CKR_OK (%i) (s
2d6a0 68 6f 72 74 20 63 69 72 63 75 69 74 29 22 2c 20  hort circuit)", 
2d6b0 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74 75  CKR_OK);....retu
2d6c0 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a  rn(CKR_OK);..}..
2d6d0 09 69 66 20 28 70 45 6e 63 72 79 70 74 65 64 50  .if (pEncryptedP
2d6e0 61 72 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  art == NULL) {..
2d6f0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2d700 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 45 6e  INTF("Error. pEn
2d710 63 72 79 70 74 65 64 50 61 72 74 20 69 73 20 4e  cryptedPart is N
2d720 55 4c 4c 2c 20 62 75 74 20 75 6c 45 6e 63 72 79  ULL, but ulEncry
2d730 70 74 65 64 50 61 72 74 4c 65 6e 20 69 73 20 6e  ptedPartLen is n
2d740 6f 74 20 30 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ot 0.");....retu
2d750 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53  rn(CKR_ARGUMENTS
2d760 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  _BAD);..}...if (
2d770 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c  ulEncryptedPartL
2d780 65 6e 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43  en == 0) {...CAC
2d790 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2d7a0 28 22 45 72 72 6f 72 2e 20 75 6c 45 6e 63 72 79  ("Error. ulEncry
2d7b0 70 74 65 64 50 61 72 74 4c 65 6e 20 69 73 20 30  ptedPartLen is 0
2d7c0 2c 20 62 75 74 20 70 50 61 72 74 20 69 73 20 6e  , but pPart is n
2d7d0 6f 74 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72  ot NULL.");....r
2d7e0 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45  eturn(CKR_ARGUME
2d7f0 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69  NTS_BAD);..}...i
2d800 66 20 28 70 75 6c 50 61 72 74 4c 65 6e 20 3d 3d  f (pulPartLen ==
2d810 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
2d820 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2d830 45 72 72 6f 72 2e 20 70 75 6c 50 61 72 74 4c 65  Error. pulPartLe
2d840 6e 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09  n is NULL.");...
2d850 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55  .return(CKR_ARGU
2d860 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a  MENTS_BAD);..}..
2d870 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
2d880 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63  cackey_mutex_loc
2d890 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
2d8a0 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
2d8b0 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
2d8c0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2d8d0 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b  TF("Error.  Lock
2d8e0 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
2d8f0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
2d900 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
2d910 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65  ..if (!cackey_se
2d920 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
2d930 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63  .active) {...cac
2d940 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
2d950 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
2d960 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  ;....CACKEY_DEBU
2d970 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2d980 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63    Session not ac
2d990 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  tive.");......re
2d9a0 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e  turn(CKR_SESSION
2d9b0 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29  _HANDLE_INVALID)
2d9c0 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b  ;..}...if (!cack
2d9d0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
2d9e0 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 61 63  sion].decrypt_ac
2d9f0 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79  tive) {...cackey
2da00 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
2da10 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
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 20 44  RINTF("Error.  D
2da40 65 63 72 79 70 74 20 6e 6f 74 20 61 63 74 69 76  ecrypt not activ
2da50 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
2da60 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f  n(CKR_OPERATION_
2da70 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
2da80 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 49 44 20 3d 20  ;..}...slotID = 
2da90 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2daa0 68 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44  hSession].slotID
2dab0 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44 20 3c  ;...if (slotID <
2dac0 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20   0 || slotID >= 
2dad0 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
2dae0 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  lots) / sizeof(c
2daf0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29  ackey_slots[0]))
2db00 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
2db10 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2db20 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72  . Invalid slot r
2db30 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20  equested (%lu), 
2db40 6f 75 74 73 69 64 65 20 6f 66 20 76 61 6c 69 64  outside of valid
2db50 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29   range", slotID)
2db60 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
2db70 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
2db80 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f  .}...if (cackey_
2db90 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63  slots[slotID].ac
2dba0 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43  tive == 0) {...C
2dbb0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2dbc0 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c  TF("Error. Inval
2dbd0 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65  id slot requeste
2dbe0 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f  d (%lu), slot no
2dbf0 74 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69  t currently acti
2dc00 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09  ve", slotID);...
2dc10 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
2dc20 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
2dc30 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  ock);....return(
2dc40 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
2dc50 52 29 3b 0a 09 7d 0a 0a 09 73 77 69 74 63 68 20  R);..}...switch 
2dc60 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
2dc70 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79  [hSession].decry
2dc80 70 74 5f 6d 65 63 68 61 6e 69 73 6d 29 20 7b 0a  pt_mechanism) {.
2dc90 09 09 63 61 73 65 20 43 4b 4d 5f 52 53 41 5f 50  ..case CKM_RSA_P
2dca0 4b 43 53 3a 0a 09 09 09 2f 2a 20 41 73 6b 20 63  KCS:..../* Ask c
2dcb0 61 72 64 20 74 6f 20 64 65 63 72 79 70 74 20 2a  ard to decrypt *
2dcc0 2f 0a 09 09 09 62 75 66 6c 65 6e 20 3d 20 63 61  /....buflen = ca
2dcd0 63 6b 65 79 5f 73 69 67 6e 64 65 63 72 79 70 74  ckey_signdecrypt
2dce0 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73  (&cackey_slots[s
2dcf0 6c 6f 74 49 44 5d 2c 20 63 61 63 6b 65 79 5f 73  lotID], cackey_s
2dd00 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
2dd10 5d 2e 64 65 63 72 79 70 74 5f 69 64 65 6e 74 69  ].decrypt_identi
2dd20 74 79 2c 20 70 45 6e 63 72 79 70 74 65 64 50 61  ty, pEncryptedPa
2dd30 72 74 2c 20 75 6c 45 6e 63 72 79 70 74 65 64 50  rt, ulEncryptedP
2dd40 61 72 74 4c 65 6e 2c 20 62 75 66 2c 20 73 69 7a  artLen, buf, siz
2dd50 65 6f 66 28 62 75 66 29 2c 20 30 2c 20 31 29 3b  eof(buf), 0, 1);
2dd60 0a 0a 09 09 09 69 66 20 28 62 75 66 6c 65 6e 20  .....if (buflen 
2dd70 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  == CACKEY_PCSC_E
2dd80 5f 4e 45 45 44 4c 4f 47 49 4e 20 26 26 20 63 61  _NEEDLOGIN && ca
2dd90 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64  ckey_pin_command
2dda0 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09   != NULL) {.....
2ddb0 69 66 20 28 5f 43 5f 4c 6f 67 69 6e 4d 75 74 65  if (_C_LoginMute
2ddc0 78 41 72 67 28 68 53 65 73 73 69 6f 6e 2c 20 43  xArg(hSession, C
2ddd0 4b 55 5f 55 53 45 52 2c 20 4e 55 4c 4c 2c 20 30  KU_USER, NULL, 0
2dde0 2c 20 30 29 20 3d 3d 20 43 4b 52 5f 4f 4b 29 20  , 0) == CKR_OK) 
2ddf0 7b 0a 09 09 09 09 09 62 75 66 6c 65 6e 20 3d 20  {......buflen = 
2de00 63 61 63 6b 65 79 5f 73 69 67 6e 64 65 63 72 79  cackey_signdecry
2de10 70 74 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73  pt(&cackey_slots
2de20 5b 73 6c 6f 74 49 44 5d 2c 20 63 61 63 6b 65 79  [slotID], cackey
2de30 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
2de40 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 69 64 65 6e  on].decrypt_iden
2de50 74 69 74 79 2c 20 70 45 6e 63 72 79 70 74 65 64  tity, pEncrypted
2de60 50 61 72 74 2c 20 75 6c 45 6e 63 72 79 70 74 65  Part, ulEncrypte
2de70 64 50 61 72 74 4c 65 6e 2c 20 62 75 66 2c 20 73  dPartLen, buf, s
2de80 69 7a 65 6f 66 28 62 75 66 29 2c 20 30 2c 20 31  izeof(buf), 0, 1
2de90 29 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09  );.....}....}...
2dea0 09 09 69 66 20 28 62 75 66 6c 65 6e 20 3c 20 30  ..if (buflen < 0
2deb0 29 20 7b 0a 09 09 09 09 2f 2a 20 44 65 63 72 79  ) {...../* Decry
2dec0 70 74 69 6f 6e 20 66 61 69 6c 65 64 2e 20 2a 2f  ption failed. */
2ded0 0a 09 09 09 09 69 66 20 28 62 75 66 6c 65 6e 20  .....if (buflen 
2dee0 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  == CACKEY_PCSC_E
2def0 5f 4e 45 45 44 4c 4f 47 49 4e 29 20 7b 0a 09 09  _NEEDLOGIN) {...
2df00 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f  ...retval = CKR_
2df10 55 53 45 52 5f 4e 4f 54 5f 4c 4f 47 47 45 44 5f  USER_NOT_LOGGED_
2df20 49 4e 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 69  IN;.....} else i
2df30 66 20 28 62 75 66 6c 65 6e 20 3d 3d 20 43 41 43  f (buflen == CAC
2df40 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e  KEY_PCSC_E_TOKEN
2df50 41 42 53 45 4e 54 29 20 7b 0a 09 09 09 09 09 72  ABSENT) {......r
2df60 65 74 76 61 6c 20 3d 20 43 4b 52 5f 44 45 56 49  etval = CKR_DEVI
2df70 43 45 5f 52 45 4d 4f 56 45 44 3b 0a 09 09 09 09  CE_REMOVED;.....
2df80 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 43 41  } else {......CA
2df90 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2dfa0 46 28 22 46 61 69 6c 65 64 20 74 6f 20 73 65 6e  F("Failed to sen
2dfb0 64 20 41 50 44 55 2c 20 65 72 72 6f 72 20 3d 20  d APDU, error = 
2dfc0 25 6c 69 22 2c 20 28 6c 6f 6e 67 20 69 6e 74 29  %li", (long int)
2dfd0 20 62 75 66 6c 65 6e 29 3b 0a 0a 09 09 09 09 09   buflen);.......
2dfe0 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 47 45 4e  retval = CKR_GEN
2dff0 45 52 41 4c 5f 45 52 52 4f 52 3b 0a 09 09 09 09  ERAL_ERROR;.....
2e000 7d 0a 09 09 09 7d 20 65 6c 73 65 20 69 66 20 28  }....} else if (
2e010 28 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29  ((unsigned long)
2e020 20 62 75 66 6c 65 6e 29 20 3e 20 2a 70 75 6c 50   buflen) > *pulP
2e030 61 72 74 4c 65 6e 20 26 26 20 70 50 61 72 74 29  artLen && pPart)
2e040 20 7b 0a 09 09 09 09 2f 2a 20 44 65 63 72 79 70   {...../* Decryp
2e050 74 65 64 20 64 61 74 61 20 74 6f 6f 20 6c 61 72  ted data too lar
2e060 67 65 20 2a 2f 0a 09 09 09 09 72 65 74 76 61 6c  ge */.....retval
2e070 20 3d 20 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f   = CKR_BUFFER_TO
2e080 4f 5f 53 4d 41 4c 4c 3b 0a 09 09 09 7d 20 65 6c  O_SMALL;....} el
2e090 73 65 20 7b 0a 09 09 09 09 69 66 20 28 70 50 61  se {.....if (pPa
2e0a0 72 74 29 20 7b 0a 09 09 09 09 09 6d 65 6d 63 70  rt) {......memcp
2e0b0 79 28 70 50 61 72 74 2c 20 62 75 66 2c 20 62 75  y(pPart, buf, bu
2e0c0 66 6c 65 6e 29 3b 0a 09 09 09 09 7d 0a 0a 09 09  flen);.....}....
2e0d0 09 09 2a 70 75 6c 50 61 72 74 4c 65 6e 20 3d 20  ..*pulPartLen = 
2e0e0 62 75 66 6c 65 6e 3b 0a 0a 09 09 09 09 72 65 74  buflen;......ret
2e0f0 76 61 6c 20 3d 20 43 4b 52 5f 4f 4b 3b 0a 09 09  val = CKR_OK;...
2e100 09 7d 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 7d  .}.....break;..}
2e110 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
2e120 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  = cackey_mutex_u
2e130 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
2e140 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
2e150 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
2e160 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2e170 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
2e180 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64  Unlocking failed
2e190 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
2e1a0 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
2e1b0 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
2e1c0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
2e1d0 75 72 6e 69 6e 67 20 25 69 22 2c 20 28 69 6e 74  urning %i", (int
2e1e0 29 20 72 65 74 76 61 6c 29 3b 0a 0a 09 72 65 74  ) retval);...ret
2e1f0 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a  urn(retval);.}..
2e200 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
2e210 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65 63 72  ON(CK_RV, C_Decr
2e220 79 70 74 46 69 6e 61 6c 29 28 43 4b 5f 53 45 53  yptFinal)(CK_SES
2e230 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
2e240 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  sion, CK_BYTE_PT
2e250 52 20 70 4c 61 73 74 50 61 72 74 2c 20 43 4b 5f  R pLastPart, CK_
2e260 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 4c 61 73  ULONG_PTR pulLas
2e270 74 50 61 72 74 4c 65 6e 29 20 7b 0a 09 69 6e 74  tPartLen) {..int
2e280 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09   mutex_retval;..
2e290 69 6e 74 20 74 65 72 6d 69 6e 61 74 65 5f 64 65  int terminate_de
2e2a0 63 72 79 70 74 20 3d 20 31 3b 0a 0a 09 43 41 43  crypt = 1;...CAC
2e2b0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2e2c0 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
2e2d0 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
2e2e0 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
2e2f0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2e300 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
2e310 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
2e320 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
2e330 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
2e340 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68  ZED);..}...if (h
2e350 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20  Session == 0 || 
2e360 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a  hSession >= (siz
2e370 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
2e380 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ons) / sizeof(ca
2e390 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d  ckey_sessions[0]
2e3a0 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ))) {...CACKEY_D
2e3b0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2e3c0 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74  or.  Session out
2e3d0 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09   of range.");...
2e3e0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
2e3f0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56  SSION_HANDLE_INV
2e400 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  ALID);..}...if (
2e410 70 75 6c 4c 61 73 74 50 61 72 74 4c 65 6e 20 3d  pulLastPartLen =
2e420 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
2e430 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2e440 22 45 72 72 6f 72 2e 20 70 75 6c 4c 61 73 74 50  "Error. pulLastP
2e450 61 72 74 4c 65 6e 20 69 73 20 4e 55 4c 4c 2e 22  artLen is NULL."
2e460 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
2e470 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b  _ARGUMENTS_BAD);
2e480 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  ..}...mutex_retv
2e490 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
2e4a0 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  x_lock(cackey_bi
2e4b0 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
2e4c0 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
2e4d0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
2e4e0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2e4f0 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e   Locking failed.
2e500 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
2e510 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
2e520 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b  ;..}...if (!cack
2e530 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
2e540 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a  sion].active) {.
2e550 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
2e560 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
2e570 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59  lock);....CACKEY
2e580 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2e590 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e  rror.  Session n
2e5a0 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09  ot active.");...
2e5b0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
2e5c0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56  SSION_HANDLE_INV
2e5d0 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  ALID);..}...if (
2e5e0 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  !cackey_sessions
2e5f0 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79  [hSession].decry
2e600 70 74 5f 61 63 74 69 76 65 29 20 7b 0a 09 09 63  pt_active) {...c
2e610 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
2e620 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
2e630 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  k);....CACKEY_DE
2e640 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2e650 72 2e 20 20 44 65 63 72 79 70 74 20 6e 6f 74 20  r.  Decrypt not 
2e660 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09  active.");......
2e670 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41  return(CKR_OPERA
2e680 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TION_NOT_INITIAL
2e690 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 2a 70 75 6c  IZED);..}...*pul
2e6a0 4c 61 73 74 50 61 72 74 4c 65 6e 20 3d 20 30 3b  LastPartLen = 0;
2e6b0 0a 0a 09 69 66 20 28 70 4c 61 73 74 50 61 72 74  ...if (pLastPart
2e6c0 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 74 65   == NULL) {...te
2e6d0 72 6d 69 6e 61 74 65 5f 64 65 63 72 79 70 74 20  rminate_decrypt 
2e6e0 3d 20 30 3b 0a 09 7d 0a 0a 09 69 66 20 28 74 65  = 0;..}...if (te
2e6f0 72 6d 69 6e 61 74 65 5f 64 65 63 72 79 70 74 29  rminate_decrypt)
2e700 20 7b 0a 09 09 63 61 63 6b 65 79 5f 73 65 73 73   {...cackey_sess
2e710 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64  ions[hSession].d
2e720 65 63 72 79 70 74 5f 61 63 74 69 76 65 20 3d 20  ecrypt_active = 
2e730 30 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65  0;..}...mutex_re
2e740 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
2e750 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
2e760 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
2e770 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
2e780 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
2e790 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2e7a0 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66  or.  Unlocking f
2e7b0 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
2e7c0 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
2e7d0 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43  ERROR);..}...CAC
2e7e0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2e7f0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
2e800 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b  OK (%i)", CKR_OK
2e810 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
2e820 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  OK);.}..CK_DEFIN
2e830 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
2e840 2c 20 43 5f 44 69 67 65 73 74 49 6e 69 74 29 28  , C_DigestInit)(
2e850 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
2e860 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d  E hSession, CK_M
2e870 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65  ECHANISM_PTR pMe
2e880 63 68 61 6e 69 73 6d 29 20 7b 0a 09 43 41 43 4b  chanism) {..CACK
2e890 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2e8a0 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
2e8b0 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
2e8c0 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
2e8d0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2e8e0 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
2e8f0 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
2e900 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
2e910 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
2e920 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
2e930 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
2e940 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
2e950 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
2e960 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
2e970 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
2e980 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
2e990 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
2e9a0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
2e9b0 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
2e9c0 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 69 67  ION(CK_RV, C_Dig
2e9d0 65 73 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  est)(CK_SESSION_
2e9e0 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
2e9f0 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 44 61   CK_BYTE_PTR pDa
2ea00 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 44  ta, CK_ULONG ulD
2ea10 61 74 61 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f  ataLen, CK_BYTE_
2ea20 50 54 52 20 70 44 69 67 65 73 74 2c 20 43 4b 5f  PTR pDigest, CK_
2ea30 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 44 69 67  ULONG_PTR pulDig
2ea40 65 73 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45  estLen) {..CACKE
2ea50 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2ea60 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
2ea70 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
2ea80 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
2ea90 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2eaa0 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
2eab0 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
2eac0 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
2ead0 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
2eae0 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
2eaf0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
2eb00 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
2eb10 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
2eb20 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
2eb30 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
2eb40 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
2eb50 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
2eb60 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
2eb70 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
2eb80 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 69 67 65  ON(CK_RV, C_Dige
2eb90 73 74 55 70 64 61 74 65 29 28 43 4b 5f 53 45 53  stUpdate)(CK_SES
2eba0 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
2ebb0 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  sion, CK_BYTE_PT
2ebc0 52 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e  R pPart, CK_ULON
2ebd0 47 20 75 6c 50 61 72 74 4c 65 6e 29 20 7b 0a 09  G ulPartLen) {..
2ebe0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2ebf0 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
2ec00 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
2ec10 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
2ec20 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2ec30 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
2ec40 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
2ec50 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
2ec60 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
2ec70 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
2ec80 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2ec90 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
2eca0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
2ecb0 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
2ecc0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
2ecd0 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
2ece0 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
2ecf0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
2ed00 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
2ed10 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
2ed20 5f 44 69 67 65 73 74 4b 65 79 29 28 43 4b 5f 53  _DigestKey)(CK_S
2ed30 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
2ed40 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43  ession, CK_OBJEC
2ed50 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79 29 20 7b  T_HANDLE hKey) {
2ed60 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2ed70 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
2ed80 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
2ed90 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
2eda0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2edb0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
2edc0 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
2edd0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
2ede0 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
2edf0 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
2ee00 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2ee10 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
2ee20 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
2ee30 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
2ee40 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
2ee50 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
2ee60 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
2ee70 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
2ee80 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
2ee90 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
2eea0 20 43 5f 44 69 67 65 73 74 46 69 6e 61 6c 29 28   C_DigestFinal)(
2eeb0 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
2eec0 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42  E hSession, CK_B
2eed0 59 54 45 5f 50 54 52 20 70 44 69 67 65 73 74 2c  YTE_PTR pDigest,
2eee0 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75   CK_ULONG_PTR pu
2eef0 6c 44 69 67 65 73 74 4c 65 6e 29 20 7b 0a 09 43  lDigestLen) {..C
2ef00 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2ef10 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
2ef20 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
2ef30 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
2ef40 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2ef50 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
2ef60 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
2ef70 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
2ef80 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
2ef90 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
2efa0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2efb0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
2efc0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
2efd0 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
2efe0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2eff0 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
2f000 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
2f010 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
2f020 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
2f030 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
2f040 53 69 67 6e 49 6e 69 74 29 28 43 4b 5f 53 45 53  SignInit)(CK_SES
2f050 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
2f060 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49  sion, CK_MECHANI
2f070 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73  SM_PTR pMechanis
2f080 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e  m, CK_OBJECT_HAN
2f090 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09 69 6e 74  DLE hKey) {..int
2f0a0 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a   mutex_retval;..
2f0b0 09 68 4b 65 79 2d 2d 3b 0a 0a 09 43 41 43 4b 45  .hKey--;...CACKE
2f0c0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2f0d0 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
2f0e0 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
2f0f0 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
2f100 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2f110 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
2f120 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
2f130 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
2f140 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
2f150 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 4d 65  D);..}...if (pMe
2f160 63 68 61 6e 69 73 6d 20 3d 3d 20 4e 55 4c 4c 29  chanism == NULL)
2f170 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
2f180 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2f190 20 70 4d 65 63 68 61 6e 69 73 6d 20 69 73 20 4e   pMechanism is N
2f1a0 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  ULL.");....retur
2f1b0 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f  n(CKR_ARGUMENTS_
2f1c0 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70  BAD);..}...if (p
2f1d0 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d 65 63 68 61  Mechanism->mecha
2f1e0 6e 69 73 6d 20 21 3d 20 43 4b 4d 5f 52 53 41 5f  nism != CKM_RSA_
2f1f0 50 4b 43 53 29 20 7b 0a 09 09 43 41 43 4b 45 59  PKCS) {...CACKEY
2f200 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2f210 72 72 6f 72 2e 20 70 4d 65 63 68 61 6e 69 73 6d  rror. pMechanism
2f220 2d 3e 6d 65 63 68 61 6e 69 73 6d 20 6e 6f 74 20  ->mechanism not 
2f230 73 70 65 63 69 66 69 65 64 20 61 73 20 43 4b 4d  specified as CKM
2f240 5f 52 53 41 5f 50 4b 43 53 22 29 3b 0a 0a 09 09  _RSA_PKCS");....
2f250 72 65 74 75 72 6e 28 43 4b 52 5f 4d 45 43 48 41  return(CKR_MECHA
2f260 4e 49 53 4d 5f 50 41 52 41 4d 5f 49 4e 56 41 4c  NISM_PARAM_INVAL
2f270 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53  ID);..}...if (hS
2f280 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68  ession == 0 || h
2f290 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65  Session >= (size
2f2a0 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
2f2b0 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63  ns) / sizeof(cac
2f2c0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29  key_sessions[0])
2f2d0 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  )) {...CACKEY_DE
2f2e0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2f2f0 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20  r.  Session out 
2f300 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a  of range.");....
2f310 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53  ..return(CKR_SES
2f320 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41  SION_HANDLE_INVA
2f330 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78  LID);..}...mutex
2f340 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
2f350 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b  _mutex_lock(cack
2f360 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
2f370 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
2f380 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
2f390 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2f3a0 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61  ror.  Locking fa
2f3b0 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
2f3c0 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
2f3d0 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  RROR);..}...if (
2f3e0 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  !cackey_sessions
2f3f0 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76  [hSession].activ
2f400 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75  e) {...cackey_mu
2f410 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
2f420 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43  y_biglock);....C
2f430 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2f440 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73  TF("Error.  Sess
2f450 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22  ion not active."
2f460 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
2f470 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  KR_SESSION_HANDL
2f480 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
2f490 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73  .if (cackey_sess
2f4a0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
2f4b0 69 67 6e 5f 61 63 74 69 76 65 29 20 7b 0a 09 09  ign_active) {...
2f4c0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
2f4d0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
2f4e0 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ck);....CACKEY_D
2f4f0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2f500 6f 72 2e 20 20 53 69 67 6e 20 61 6c 72 65 61 64  or.  Sign alread
2f510 79 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 22 29  y in progress.")
2f520 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
2f530 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 41 43 54 49  R_OPERATION_ACTI
2f540 56 45 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 4b  VE);..}...if (hK
2f550 65 79 20 3e 3d 20 63 61 63 6b 65 79 5f 73 65 73  ey >= cackey_ses
2f560 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
2f570 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74  identities_count
2f580 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  ) {...cackey_mut
2f590 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
2f5a0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41  _biglock);....CA
2f5b0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2f5c0 46 28 22 45 72 72 6f 72 2e 20 20 4b 65 79 20 68  F("Error.  Key h
2f5d0 61 6e 64 6c 65 20 6f 75 74 20 6f 66 20 72 61 6e  andle out of ran
2f5e0 67 65 20 28 72 65 71 75 65 73 74 65 64 20 6b 65  ge (requested ke
2f5f0 79 20 25 6c 75 2c 20 6f 6e 6c 79 20 25 6c 75 20  y %lu, only %lu 
2f600 69 64 65 6e 74 69 74 69 65 73 20 61 76 61 69 6c  identities avail
2f610 61 62 6c 65 29 2e 22 2c 20 28 75 6e 73 69 67 6e  able).", (unsign
2f620 65 64 20 6c 6f 6e 67 29 20 68 4b 65 79 2c 20 28  ed long) hKey, (
2f630 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63  unsigned long) c
2f640 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
2f650 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74  Session].identit
2f660 69 65 73 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09 72  ies_count);....r
2f670 65 74 75 72 6e 28 43 4b 52 5f 4b 45 59 5f 48 41  eturn(CKR_KEY_HA
2f680 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
2f690 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69  }...cackey_sessi
2f6a0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
2f6b0 67 6e 5f 61 63 74 69 76 65 20 3d 20 31 3b 0a 0a  gn_active = 1;..
2f6c0 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
2f6d0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
2f6e0 6d 65 63 68 61 6e 69 73 6d 20 3d 20 70 4d 65 63  mechanism = pMec
2f6f0 68 61 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e 69 73  hanism->mechanis
2f700 6d 3b 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73  m;...cackey_sess
2f710 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
2f720 69 67 6e 5f 62 75 66 6c 65 6e 20 3d 20 31 32 38  ign_buflen = 128
2f730 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ;..cackey_sessio
2f740 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
2f750 6e 5f 62 75 66 75 73 65 64 20 3d 20 30 3b 0a 09  n_bufused = 0;..
2f760 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2f770 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62  hSession].sign_b
2f780 75 66 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65  uf = malloc(size
2f790 6f 66 28 2a 63 61 63 6b 65 79 5f 73 65 73 73 69  of(*cackey_sessi
2f7a0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
2f7b0 67 6e 5f 62 75 66 29 20 2a 20 63 61 63 6b 65 79  gn_buf) * cackey
2f7c0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
2f7d0 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 6c 65 6e 29  on].sign_buflen)
2f7e0 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
2f7f0 5f 50 52 49 4e 54 46 28 22 53 65 73 73 69 6f 6e  _PRINTF("Session
2f800 20 25 6c 75 20 73 69 67 6e 5f 69 64 65 6e 74 69   %lu sign_identi
2f810 74 79 20 69 73 20 25 70 20 28 69 64 65 6e 74 69  ty is %p (identi
2f820 74 79 20 23 25 6c 75 29 22 2c 20 28 75 6e 73 69  ty #%lu)", (unsi
2f830 67 6e 65 64 20 6c 6f 6e 67 29 20 68 53 65 73 73  gned long) hSess
2f840 69 6f 6e 2c 20 28 76 6f 69 64 20 2a 29 20 26 63  ion, (void *) &c
2f850 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
2f860 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74  Session].identit
2f870 69 65 73 5b 68 4b 65 79 5d 2c 20 28 75 6e 73 69  ies[hKey], (unsi
2f880 67 6e 65 64 20 6c 6f 6e 67 29 20 68 4b 65 79 29  gned long) hKey)
2f890 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ;..cackey_sessio
2f8a0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
2f8b0 6e 5f 69 64 65 6e 74 69 74 79 20 3d 20 26 63 61  n_identity = &ca
2f8c0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
2f8d0 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69  ession].identiti
2f8e0 65 73 5b 68 4b 65 79 5d 3b 0a 0a 09 6d 75 74 65  es[hKey];...mute
2f8f0 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
2f900 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
2f910 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
2f920 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
2f930 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
2f940 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2f950 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69  "Error.  Unlocki
2f960 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
2f970 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
2f980 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
2f990 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2f9a0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
2f9b0 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b  CKR_OK (%i)", CK
2f9c0 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28  R_OK);...return(
2f9d0 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44  CKR_OK);.}..CK_D
2f9e0 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
2f9f0 4b 5f 52 56 2c 20 43 5f 53 69 67 6e 29 28 43 4b  K_RV, C_Sign)(CK
2fa00 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
2fa10 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54  hSession, CK_BYT
2fa20 45 5f 50 54 52 20 70 44 61 74 61 2c 20 43 4b 5f  E_PTR pData, CK_
2fa30 55 4c 4f 4e 47 20 75 6c 44 61 74 61 4c 65 6e 2c  ULONG ulDataLen,
2fa40 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 53 69   CK_BYTE_PTR pSi
2fa50 67 6e 61 74 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e  gnature, CK_ULON
2fa60 47 5f 50 54 52 20 70 75 6c 53 69 67 6e 61 74 75  G_PTR pulSignatu
2fa70 72 65 4c 65 6e 29 20 7b 0a 09 75 6e 73 69 67 6e  reLen) {..unsign
2fa80 65 64 20 6c 6f 6e 67 20 73 74 61 72 74 5f 73 69  ed long start_si
2fa90 67 6e 5f 62 75 66 75 73 65 64 3b 0a 09 43 4b 5f  gn_bufused;..CK_
2faa0 52 56 20 73 69 67 6e 5f 72 65 74 3b 0a 09 69 6e  RV sign_ret;..in
2fab0 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a  t mutex_retval;.
2fac0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2fad0 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
2fae0 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
2faf0 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
2fb00 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2fb10 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
2fb20 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
2fb30 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
2fb40 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
2fb50 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
2fb60 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20  if (hSession == 
2fb70 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d  0 || hSession >=
2fb80 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
2fb90 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65  sessions) / size
2fba0 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
2fbb0 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43  ns[0]))) {...CAC
2fbc0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2fbd0 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f  ("Error.  Sessio
2fbe0 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22  n out of range."
2fbf0 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
2fc00 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  KR_SESSION_HANDL
2fc10 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
2fc20 09 73 74 61 72 74 5f 73 69 67 6e 5f 62 75 66 75  .start_sign_bufu
2fc30 73 65 64 20 3d 20 63 61 63 6b 65 79 5f 73 65 73  sed = cackey_ses
2fc40 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
2fc50 73 69 67 6e 5f 62 75 66 75 73 65 64 3b 0a 0a 09  sign_bufused;...
2fc60 73 69 67 6e 5f 72 65 74 20 3d 20 43 5f 53 69 67  sign_ret = C_Sig
2fc70 6e 55 70 64 61 74 65 28 68 53 65 73 73 69 6f 6e  nUpdate(hSession
2fc80 2c 20 70 44 61 74 61 2c 20 75 6c 44 61 74 61 4c  , pData, ulDataL
2fc90 65 6e 29 3b 0a 09 69 66 20 28 73 69 67 6e 5f 72  en);..if (sign_r
2fca0 65 74 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a  et != CKR_OK) {.
2fcb0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2fcc0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
2fcd0 69 67 6e 55 70 64 61 74 65 28 29 20 72 65 74 75  ignUpdate() retu
2fce0 72 6e 65 64 20 66 61 69 6c 75 72 65 20 28 72 76  rned failure (rv
2fcf0 20 3d 20 25 6c 75 29 2e 22 2c 20 28 75 6e 73 69   = %lu).", (unsi
2fd00 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69 67 6e 5f  gned long) sign_
2fd10 72 65 74 29 3b 0a 0a 09 09 69 66 20 28 73 69 67  ret);....if (sig
2fd20 6e 5f 72 65 74 20 21 3d 20 43 4b 52 5f 42 55 46  n_ret != CKR_BUF
2fd30 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 20 7b  FER_TOO_SMALL) {
2fd40 0a 09 09 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  ....mutex_retval
2fd50 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
2fd60 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
2fd70 6f 63 6b 29 3b 0a 09 09 09 69 66 20 28 6d 75 74  ock);....if (mut
2fd80 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
2fd90 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  {.....CACKEY_DEB
2fda0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2fdb0 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65  .  Locking faile
2fdc0 64 2e 22 29 3b 0a 0a 09 09 09 09 72 65 74 75 72  d.");......retur
2fdd0 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
2fde0 52 4f 52 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 69  ROR);....}.....i
2fdf0 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69  f (!cackey_sessi
2fe00 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63  ons[hSession].ac
2fe10 74 69 76 65 29 20 7b 0a 09 09 09 09 63 61 63 6b  tive) {.....cack
2fe20 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
2fe30 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
2fe40 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
2fe50 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2fe60 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61  .  Session not a
2fe70 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 09  ctive.");.......
2fe80 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
2fe90 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
2fea0 49 44 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66  ID);....}.....if
2feb0 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   (!cackey_sessio
2fec0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
2fed0 6e 5f 61 63 74 69 76 65 29 20 7b 0a 09 09 09 09  n_active) {.....
2fee0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
2fef0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
2ff00 63 6b 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59  ck);......CACKEY
2ff10 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2ff20 72 72 6f 72 2e 20 20 53 69 67 6e 20 6e 6f 74 20  rror.  Sign not 
2ff30 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09  active.");......
2ff40 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45  ..return(CKR_OPE
2ff50 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49  RATION_NOT_INITI
2ff60 41 4c 49 5a 45 44 29 3b 0a 09 09 09 7d 0a 0a 09  ALIZED);....}...
2ff70 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
2ff80 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
2ff90 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a 0a 09 09  _active = 0;....
2ffa0 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
2ffb0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
2ffc0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
2ffd0 63 6b 29 3b 0a 09 09 09 69 66 20 28 6d 75 74 65  ck);....if (mute
2ffe0 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
2fff0 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
30000 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
30010 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c    Unlocking fail
30020 65 64 2e 22 29 3b 0a 0a 09 09 09 09 72 65 74 75  ed.");......retu
30030 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
30040 52 52 4f 52 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a  RROR);....}...}.
30050 0a 09 09 72 65 74 75 72 6e 28 73 69 67 6e 5f 72  ...return(sign_r
30060 65 74 29 3b 0a 09 7d 0a 0a 09 73 69 67 6e 5f 72  et);..}...sign_r
30070 65 74 20 3d 20 43 5f 53 69 67 6e 46 69 6e 61 6c  et = C_SignFinal
30080 28 68 53 65 73 73 69 6f 6e 2c 20 70 53 69 67 6e  (hSession, pSign
30090 61 74 75 72 65 2c 20 70 75 6c 53 69 67 6e 61 74  ature, pulSignat
300a0 75 72 65 4c 65 6e 29 3b 0a 09 69 66 20 28 73 69  ureLen);..if (si
300b0 67 6e 5f 72 65 74 20 21 3d 20 43 4b 52 5f 4f 4b  gn_ret != CKR_OK
300c0 29 20 7b 0a 09 09 69 66 20 28 73 69 67 6e 5f 72  ) {...if (sign_r
300d0 65 74 20 3d 3d 20 43 4b 52 5f 42 55 46 46 45 52  et == CKR_BUFFER
300e0 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 20 7b 0a 09 09  _TOO_SMALL) {...
300f0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
30100 49 4e 54 46 28 22 53 69 67 6e 46 69 6e 61 6c 28  INTF("SignFinal(
30110 29 20 72 65 74 75 72 6e 65 64 20 43 4b 52 5f 42  ) returned CKR_B
30120 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 20  UFFER_TOO_SMALL 
30130 28 72 76 20 3d 20 25 6c 75 29 2c 20 75 6e 64 6f  (rv = %lu), undo
30140 69 6e 67 20 43 5f 53 69 67 6e 55 70 64 61 74 65  ing C_SignUpdate
30150 28 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ()", (unsigned l
30160 6f 6e 67 29 20 73 69 67 6e 5f 72 65 74 29 3b 0a  ong) sign_ret);.
30170 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ....cackey_sessi
30180 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
30190 67 6e 5f 62 75 66 75 73 65 64 20 3d 20 73 74 61  gn_bufused = sta
301a0 72 74 5f 73 69 67 6e 5f 62 75 66 75 73 65 64 3b  rt_sign_bufused;
301b0 0a 0a 09 09 09 72 65 74 75 72 6e 28 73 69 67 6e  .....return(sign
301c0 5f 72 65 74 29 3b 0a 09 09 7d 0a 0a 09 09 43 41  _ret);...}....CA
301d0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
301e0 46 28 22 45 72 72 6f 72 2e 20 20 53 69 67 6e 46  F("Error.  SignF
301f0 69 6e 61 6c 28 29 20 72 65 74 75 72 6e 65 64 20  inal() returned 
30200 66 61 69 6c 75 72 65 20 28 72 76 20 3d 20 25 6c  failure (rv = %l
30210 75 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  u).", (unsigned 
30220 6c 6f 6e 67 29 20 73 69 67 6e 5f 72 65 74 29 3b  long) sign_ret);
30230 0a 0a 09 09 72 65 74 75 72 6e 28 73 69 67 6e 5f  ....return(sign_
30240 72 65 74 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70  ret);..}...if (p
30250 53 69 67 6e 61 74 75 72 65 20 3d 3d 20 4e 55 4c  Signature == NUL
30260 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
30270 42 55 47 5f 50 52 49 4e 54 46 28 22 70 53 69 67  BUG_PRINTF("pSig
30280 6e 61 74 75 72 65 20 73 70 65 63 69 66 69 65 64  nature specified
30290 20 61 73 20 4e 55 4c 4c 2c 20 75 6e 64 6f 69 6e   as NULL, undoin
302a0 67 20 43 5f 53 69 67 6e 55 70 64 61 74 65 28 29  g C_SignUpdate()
302b0 22 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 73 65  ");....cackey_se
302c0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
302d0 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 20 3d 20  .sign_bufused = 
302e0 73 74 61 72 74 5f 73 69 67 6e 5f 62 75 66 75 73  start_sign_bufus
302f0 65 64 3b 0a 0a 09 09 72 65 74 75 72 6e 28 73 69  ed;....return(si
30300 67 6e 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09 43 41  gn_ret);..}...CA
30310 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
30320 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
30330 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f  _OK (%i)", CKR_O
30340 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  K);...return(CKR
30350 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  _OK);.}..CK_DEFI
30360 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
30370 56 2c 20 43 5f 53 69 67 6e 55 70 64 61 74 65 29  V, C_SignUpdate)
30380 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
30390 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
303a0 42 59 54 45 5f 50 54 52 20 70 50 61 72 74 2c 20  BYTE_PTR pPart, 
303b0 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 61 72 74 4c  CK_ULONG ulPartL
303c0 65 6e 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78  en) {..int mutex
303d0 5f 72 65 74 76 61 6c 3b 0a 09 69 6e 74 20 72 65  _retval;..int re
303e0 73 69 7a 65 52 65 74 72 79 3b 0a 09 69 6e 74 20  sizeRetry;..int 
303f0 6e 65 65 64 52 65 73 69 7a 65 3b 0a 0a 09 43 41  needResize;...CA
30400 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
30410 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
30420 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
30430 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
30440 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
30450 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
30460 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
30470 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
30480 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
30490 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  IZED);..}...if (
304a0 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c  hSession == 0 ||
304b0 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69   hSession >= (si
304c0 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
304d0 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  ions) / sizeof(c
304e0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30  ackey_sessions[0
304f0 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ]))) {...CACKEY_
30500 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
30510 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75  ror.  Session ou
30520 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09  t of range.");..
30530 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
30540 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e  ESSION_HANDLE_IN
30550 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  VALID);..}...if 
30560 28 70 50 61 72 74 20 3d 3d 20 4e 55 4c 4c 20 26  (pPart == NULL &
30570 26 20 75 6c 50 61 72 74 4c 65 6e 20 3d 3d 20 30  & ulPartLen == 0
30580 29 20 7b 0a 09 09 2f 2a 20 53 68 6f 72 74 20 63  ) {.../* Short c
30590 69 72 63 75 69 74 20 69 66 20 77 65 20 61 72 65  ircuit if we are
305a0 20 61 73 6b 65 64 20 74 6f 20 73 69 67 6e 20 6e   asked to sign n
305b0 6f 74 68 69 6e 67 2e 2e 2e 20 2a 2f 0a 09 09 43  othing... */...C
305c0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
305d0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
305e0 52 5f 4f 4b 20 28 25 69 29 20 28 73 68 6f 72 74  R_OK (%i) (short
305f0 20 63 69 72 63 75 69 74 29 22 2c 20 43 4b 52 5f   circuit)", CKR_
30600 4f 4b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  OK);....return(C
30610 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66 20  KR_OK);..}...if 
30620 28 70 50 61 72 74 20 3d 3d 20 4e 55 4c 4c 29 20  (pPart == NULL) 
30630 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
30640 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
30650 70 50 61 72 74 20 69 73 20 4e 55 4c 4c 2c 20 62  pPart is NULL, b
30660 75 74 20 75 6c 50 61 72 74 4c 65 6e 20 69 73 20  ut ulPartLen is 
30670 6e 6f 74 20 30 2e 22 29 3b 0a 0a 09 09 72 65 74  not 0.");....ret
30680 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54  urn(CKR_ARGUMENT
30690 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  S_BAD);..}...if 
306a0 28 75 6c 50 61 72 74 4c 65 6e 20 3d 3d 20 30 29  (ulPartLen == 0)
306b0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
306c0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
306d0 20 75 6c 50 61 72 74 4c 65 6e 20 69 73 20 30 2c   ulPartLen is 0,
306e0 20 62 75 74 20 70 50 61 72 74 20 69 73 20 6e 6f   but pPart is no
306f0 74 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65  t NULL.");....re
30700 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e  turn(CKR_ARGUMEN
30710 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 6d 75  TS_BAD);..}...mu
30720 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
30730 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63  key_mutex_lock(c
30740 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
30750 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
30760 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
30770 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
30780 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67  "Error.  Locking
30790 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
307a0 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
307b0 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69  L_ERROR);..}...i
307c0 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69  f (!cackey_sessi
307d0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63  ons[hSession].ac
307e0 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79  tive) {...cackey
307f0 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
30800 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
30810 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
30820 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
30830 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76  ession not activ
30840 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
30850 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41  n(CKR_SESSION_HA
30860 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
30870 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  }...if (!cackey_
30880 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
30890 6e 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65 29 20  n].sign_active) 
308a0 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  {...cackey_mutex
308b0 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
308c0 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b  iglock);....CACK
308d0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
308e0 22 45 72 72 6f 72 2e 20 20 53 69 67 6e 20 6e 6f  "Error.  Sign no
308f0 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a  t active.");....
30900 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45  ..return(CKR_OPE
30910 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49  RATION_NOT_INITI
30920 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 73 77  ALIZED);..}...sw
30930 69 74 63 68 20 28 63 61 63 6b 65 79 5f 73 65 73  itch (cackey_ses
30940 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
30950 73 69 67 6e 5f 6d 65 63 68 61 6e 69 73 6d 29 20  sign_mechanism) 
30960 7b 0a 09 09 63 61 73 65 20 43 4b 4d 5f 52 53 41  {...case CKM_RSA
30970 5f 50 4b 43 53 3a 0a 09 09 09 2f 2a 20 41 63 63  _PKCS:..../* Acc
30980 75 6d 75 6c 61 74 65 20 64 69 72 65 63 74 6c 79  umulate directly
30990 20 2a 2f 0a 09 09 09 66 6f 72 20 28 72 65 73 69   */....for (resi
309a0 7a 65 52 65 74 72 79 20 3d 20 30 3b 20 72 65 73  zeRetry = 0; res
309b0 69 7a 65 52 65 74 72 79 20 3c 20 31 31 3b 20 72  izeRetry < 11; r
309c0 65 73 69 7a 65 52 65 74 72 79 2b 2b 29 20 7b 0a  esizeRetry++) {.
309d0 09 09 09 09 6e 65 65 64 52 65 73 69 7a 65 20 3d  ....needResize =
309e0 20 30 3b 0a 09 09 09 09 69 66 20 28 28 63 61 63   0;.....if ((cac
309f0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
30a00 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75  ssion].sign_bufu
30a10 73 65 64 20 2b 20 75 6c 50 61 72 74 4c 65 6e 29  sed + ulPartLen)
30a20 20 3e 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   > cackey_sessio
30a30 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
30a40 6e 5f 62 75 66 6c 65 6e 29 20 7b 0a 09 09 09 09  n_buflen) {.....
30a50 09 6e 65 65 64 52 65 73 69 7a 65 20 3d 20 31 3b  .needResize = 1;
30a60 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69 66 20 28  .....}......if (
30a70 21 6e 65 65 64 52 65 73 69 7a 65 29 20 7b 0a 09  !needResize) {..
30a80 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d  ....break;.....}
30a90 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
30aa0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 73 69 7a  UG_PRINTF("Resiz
30ab0 69 6e 67 20 73 69 67 6e 69 6e 67 20 62 75 66 66  ing signing buff
30ac0 65 72 20 28 74 72 79 20 23 25 69 20 6f 66 20 31  er (try #%i of 1
30ad0 30 20 2d 2d 20 31 31 74 68 20 69 73 20 66 61 74  0 -- 11th is fat
30ae0 61 6c 29 22 2c 20 72 65 73 69 7a 65 52 65 74 72  al)", resizeRetr
30af0 79 29 3b 0a 0a 09 09 09 09 69 66 20 28 72 65 73  y);......if (res
30b00 69 7a 65 52 65 74 72 79 20 3d 3d 20 31 30 29 20  izeRetry == 10) 
30b10 7b 0a 09 09 09 09 09 66 72 65 65 28 63 61 63 6b  {......free(cack
30b20 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
30b30 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 29 3b  sion].sign_buf);
30b40 0a 0a 09 09 09 09 09 63 61 63 6b 65 79 5f 73 65  .......cackey_se
30b50 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
30b60 2e 73 69 67 6e 5f 62 75 66 6c 65 6e 20 3d 20 30  .sign_buflen = 0
30b70 3b 0a 09 09 09 09 09 63 61 63 6b 65 79 5f 73 65  ;......cackey_se
30b80 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
30b90 2e 73 69 67 6e 5f 62 75 66 20 3d 20 4e 55 4c 4c  .sign_buf = NULL
30ba0 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09  ;.......break;..
30bb0 09 09 09 7d 0a 0a 09 09 09 09 63 61 63 6b 65 79  ...}......cackey
30bc0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
30bd0 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 6c 65 6e 20  on].sign_buflen 
30be0 2a 3d 20 32 3b 0a 0a 09 09 09 09 63 61 63 6b 65  *= 2;......cacke
30bf0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
30c00 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 20 3d 20  ion].sign_buf = 
30c10 72 65 61 6c 6c 6f 63 28 63 61 63 6b 65 79 5f 73  realloc(cackey_s
30c20 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
30c30 5d 2e 73 69 67 6e 5f 62 75 66 2c 20 73 69 7a 65  ].sign_buf, size
30c40 6f 66 28 2a 63 61 63 6b 65 79 5f 73 65 73 73 69  of(*cackey_sessi
30c50 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
30c60 67 6e 5f 62 75 66 29 20 2a 20 63 61 63 6b 65 79  gn_buf) * cackey
30c70 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
30c80 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 6c 65 6e 29  on].sign_buflen)
30c90 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 63  ;....}.....if (c
30ca0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
30cb0 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75  Session].sign_bu
30cc0 66 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09  f == NULL) {....
30cd0 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
30ce0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
30cf0 6f 63 6b 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45  ock);......CACKE
30d00 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
30d10 45 72 72 6f 72 2e 20 20 53 69 67 6e 69 6e 67 20  Error.  Signing 
30d20 62 75 66 66 65 72 20 69 73 20 4e 55 4c 4c 2e 22  buffer is NULL."
30d30 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 43  );......return(C
30d40 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
30d50 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 6d 65 6d 63  );....}.....memc
30d60 70 79 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  py(cackey_sessio
30d70 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
30d80 6e 5f 62 75 66 20 2b 20 63 61 63 6b 65 79 5f 73  n_buf + cackey_s
30d90 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
30da0 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 2c 20  ].sign_bufused, 
30db0 70 50 61 72 74 2c 20 75 6c 50 61 72 74 4c 65 6e  pPart, ulPartLen
30dc0 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65  );.....cackey_se
30dd0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
30de0 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 20 2b 3d  .sign_bufused +=
30df0 20 75 6c 50 61 72 74 4c 65 6e 3b 0a 0a 09 09 09   ulPartLen;.....
30e00 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 6d 75 74 65  break;..}...mute
30e10 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
30e20 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
30e30 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
30e40 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
30e50 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
30e60 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
30e70 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69  "Error.  Unlocki
30e80 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
30e90 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
30ea0 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
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 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
30ed0 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b  CKR_OK (%i)", CK
30ee0 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28  R_OK);...return(
30ef0 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44  CKR_OK);.}..CK_D
30f00 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
30f10 4b 5f 52 56 2c 20 43 5f 53 69 67 6e 46 69 6e 61  K_RV, C_SignFina
30f20 6c 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  l)(CK_SESSION_HA
30f30 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
30f40 4b 5f 42 59 54 45 5f 50 54 52 20 70 53 69 67 6e  K_BYTE_PTR pSign
30f50 61 74 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47 5f  ature, CK_ULONG_
30f60 50 54 52 20 70 75 6c 53 69 67 6e 61 74 75 72 65  PTR pulSignature
30f70 4c 65 6e 29 20 7b 0a 09 73 74 61 74 69 63 20 43  Len) {..static C
30f80 4b 5f 42 59 54 45 20 73 69 67 62 75 66 5b 31 30  K_BYTE sigbuf[10
30f90 32 34 5d 3b 0a 09 73 73 69 7a 65 5f 74 20 73 69  24];..ssize_t si
30fa0 67 62 75 66 6c 65 6e 3b 0a 09 43 4b 5f 53 4c 4f  gbuflen;..CK_SLO
30fb0 54 5f 49 44 20 73 6c 6f 74 49 44 3b 0a 09 43 4b  T_ID slotID;..CK
30fc0 5f 52 56 20 72 65 74 76 61 6c 20 3d 20 43 4b 52  _RV retval = CKR
30fd0 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 3b 0a  _GENERAL_ERROR;.
30fe0 09 69 6e 74 20 74 65 72 6d 69 6e 61 74 65 5f 73  .int terminate_s
30ff0 69 67 6e 20 3d 20 31 3b 0a 09 69 6e 74 20 6d 75  ign = 1;..int mu
31000 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41  tex_retval;...CA
31010 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
31020 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
31030 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
31040 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
31050 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
31060 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
31070 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
31080 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
31090 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
310a0 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  IZED);..}...if (
310b0 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 20  pulSignatureLen 
310c0 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43  == NULL) {...CAC
310d0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
310e0 28 22 45 72 72 6f 72 2e 20 70 75 6c 53 69 67 6e  ("Error. pulSign
310f0 61 74 75 72 65 4c 65 6e 20 69 73 20 4e 55 4c 4c  atureLen is NULL
31100 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
31110 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44  KR_ARGUMENTS_BAD
31120 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73  );..}...if (hSes
31130 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65  sion == 0 || hSe
31140 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66  ssion >= (sizeof
31150 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
31160 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
31170 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29  y_sessions[0])))
31180 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
31190 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
311a0 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66    Session out of
311b0 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09   range.");......
311c0 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
311d0 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  ON_HANDLE_INVALI
311e0 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  D);..}...mutex_r
311f0 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
31200 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79  utex_lock(cackey
31210 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
31220 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
31230 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
31240 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
31250 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c  r.  Locking fail
31260 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
31270 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
31280 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63  OR);..}...if (!c
31290 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
312a0 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29  Session].active)
312b0 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65   {...cackey_mute
312c0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
312d0 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43  biglock);....CAC
312e0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
312f0 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f  ("Error.  Sessio
31300 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b  n not active.");
31310 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
31320 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
31330 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69  INVALID);..}...i
31340 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69  f (!cackey_sessi
31350 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
31360 67 6e 5f 61 63 74 69 76 65 29 20 7b 0a 09 09 63  gn_active) {...c
31370 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
31380 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
31390 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  k);....CACKEY_DE
313a0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
313b0 72 2e 20 20 53 69 67 6e 20 6e 6f 74 20 61 63 74  r.  Sign not act
313c0 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  ive.");......ret
313d0 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f  urn(CKR_OPERATIO
313e0 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  N_NOT_INITIALIZE
313f0 44 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 49 44 20  D);..}...slotID 
31400 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  = cackey_session
31410 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74  s[hSession].slot
31420 49 44 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44  ID;...if (slotID
31430 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e   < 0 || slotID >
31440 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  = (sizeof(cackey
31450 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66  _slots) / sizeof
31460 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d  (cackey_slots[0]
31470 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ))) {...CACKEY_D
31480 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
31490 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74  or. Invalid slot
314a0 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29   requested (%lu)
314b0 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 76 61 6c  , outside of val
314c0 69 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49  id range", slotI
314d0 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  D);....return(CK
314e0 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
314f0 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65  ;..}...if (cacke
31500 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e  y_slots[slotID].
31510 61 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09  active == 0) {..
31520 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
31530 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76  INTF("Error. Inv
31540 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73  alid slot reques
31550 74 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20  ted (%lu), slot 
31560 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61 63  not currently ac
31570 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a  tive", slotID);.
31580 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
31590 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
315a0 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72  glock);....retur
315b0 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
315c0 52 4f 52 29 3b 0a 09 7d 0a 0a 09 73 77 69 74 63  ROR);..}...switc
315d0 68 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  h (cackey_sessio
315e0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
315f0 6e 5f 6d 65 63 68 61 6e 69 73 6d 29 20 7b 0a 09  n_mechanism) {..
31600 09 63 61 73 65 20 43 4b 4d 5f 52 53 41 5f 50 4b  .case CKM_RSA_PK
31610 43 53 3a 0a 09 09 09 2f 2a 20 41 73 6b 20 63 61  CS:..../* Ask ca
31620 72 64 20 74 6f 20 73 69 67 6e 20 2a 2f 0a 09 09  rd to sign */...
31630 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
31640 49 4e 54 46 28 22 41 73 6b 69 6e 67 20 74 6f 20  INTF("Asking to 
31650 73 69 67 6e 20 66 72 6f 6d 20 69 64 65 6e 74 69  sign from identi
31660 74 79 20 25 70 20 69 6e 20 73 65 73 73 69 6f 6e  ty %p in session
31670 20 25 6c 75 22 2c 20 28 76 6f 69 64 20 2a 29 20   %lu", (void *) 
31680 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
31690 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 69  hSession].sign_i
316a0 64 65 6e 74 69 74 79 2c 20 28 75 6e 73 69 67 6e  dentity, (unsign
316b0 65 64 20 6c 6f 6e 67 29 20 68 53 65 73 73 69 6f  ed long) hSessio
316c0 6e 29 3b 0a 09 09 09 73 69 67 62 75 66 6c 65 6e  n);....sigbuflen
316d0 20 3d 20 63 61 63 6b 65 79 5f 73 69 67 6e 64 65   = cackey_signde
316e0 63 72 79 70 74 28 26 63 61 63 6b 65 79 5f 73 6c  crypt(&cackey_sl
316f0 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c 20 63 61 63  ots[slotID], cac
31700 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
31710 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 69 64 65 6e  ssion].sign_iden
31720 74 69 74 79 2c 20 63 61 63 6b 65 79 5f 73 65 73  tity, cackey_ses
31730 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
31740 73 69 67 6e 5f 62 75 66 2c 20 63 61 63 6b 65 79  sign_buf, cackey
31750 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
31760 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65 64  on].sign_bufused
31770 2c 20 73 69 67 62 75 66 2c 20 73 69 7a 65 6f 66  , sigbuf, sizeof
31780 28 73 69 67 62 75 66 29 2c 20 31 2c 20 30 29 3b  (sigbuf), 1, 0);
31790 0a 0a 09 09 09 69 66 20 28 73 69 67 62 75 66 6c  .....if (sigbufl
317a0 65 6e 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53  en == CACKEY_PCS
317b0 43 5f 45 5f 4e 45 45 44 4c 4f 47 49 4e 20 26 26  C_E_NEEDLOGIN &&
317c0 20 63 61 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d   cackey_pin_comm
317d0 61 6e 64 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  and != NULL) {..
317e0 09 09 09 69 66 20 28 5f 43 5f 4c 6f 67 69 6e 4d  ...if (_C_LoginM
317f0 75 74 65 78 41 72 67 28 68 53 65 73 73 69 6f 6e  utexArg(hSession
31800 2c 20 43 4b 55 5f 55 53 45 52 2c 20 4e 55 4c 4c  , CKU_USER, NULL
31810 2c 20 30 2c 20 30 29 20 3d 3d 20 43 4b 52 5f 4f  , 0, 0) == CKR_O
31820 4b 29 20 7b 0a 09 09 09 09 09 73 69 67 62 75 66  K) {......sigbuf
31830 6c 65 6e 20 3d 20 63 61 63 6b 65 79 5f 73 69 67  len = cackey_sig
31840 6e 64 65 63 72 79 70 74 28 26 63 61 63 6b 65 79  ndecrypt(&cackey
31850 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c 20  _slots[slotID], 
31860 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
31870 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 69  hSession].sign_i
31880 64 65 6e 74 69 74 79 2c 20 63 61 63 6b 65 79 5f  dentity, cackey_
31890 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
318a0 6e 5d 2e 73 69 67 6e 5f 62 75 66 2c 20 63 61 63  n].sign_buf, cac
318b0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
318c0 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75  ssion].sign_bufu
318d0 73 65 64 2c 20 73 69 67 62 75 66 2c 20 73 69 7a  sed, sigbuf, siz
318e0 65 6f 66 28 73 69 67 62 75 66 29 2c 20 31 2c 20  eof(sigbuf), 1, 
318f0 30 29 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a  0);.....}....}..
31900 09 09 09 69 66 20 28 73 69 67 62 75 66 6c 65 6e  ...if (sigbuflen
31910 20 3c 20 30 29 20 7b 0a 09 09 09 09 2f 2a 20 53   < 0) {...../* S
31920 69 67 6e 69 6e 67 20 66 61 69 6c 65 64 2e 20 2a  igning failed. *
31930 2f 0a 09 09 09 09 69 66 20 28 73 69 67 62 75 66  /.....if (sigbuf
31940 6c 65 6e 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43  len == CACKEY_PC
31950 53 43 5f 45 5f 4e 45 45 44 4c 4f 47 49 4e 29 20  SC_E_NEEDLOGIN) 
31960 7b 0a 09 09 09 09 09 72 65 74 76 61 6c 20 3d 20  {......retval = 
31970 43 4b 52 5f 55 53 45 52 5f 4e 4f 54 5f 4c 4f 47  CKR_USER_NOT_LOG
31980 47 45 44 5f 49 4e 3b 0a 09 09 09 09 7d 20 65 6c  GED_IN;.....} el
31990 73 65 20 69 66 20 28 73 69 67 62 75 66 6c 65 6e  se if (sigbuflen
319a0 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f   == CACKEY_PCSC_
319b0 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 20 7b  E_TOKENABSENT) {
319c0 0a 09 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43  ......retval = C
319d0 4b 52 5f 44 45 56 49 43 45 5f 52 45 4d 4f 56 45  KR_DEVICE_REMOVE
319e0 44 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a  D;.....} else {.
319f0 09 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b  .....retval = CK
31a00 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 3b  R_GENERAL_ERROR;
31a10 0a 09 09 09 09 7d 0a 09 09 09 7d 20 65 6c 73 65  .....}....} else
31a20 20 69 66 20 28 28 28 75 6e 73 69 67 6e 65 64 20   if (((unsigned 
31a30 6c 6f 6e 67 29 20 73 69 67 62 75 66 6c 65 6e 29  long) sigbuflen)
31a40 20 3e 20 2a 70 75 6c 53 69 67 6e 61 74 75 72 65   > *pulSignature
31a50 4c 65 6e 20 26 26 20 70 53 69 67 6e 61 74 75 72  Len && pSignatur
31a60 65 29 20 7b 0a 09 09 09 09 2f 2a 20 53 69 67 6e  e) {...../* Sign
31a70 65 64 20 64 61 74 61 20 74 6f 6f 20 6c 61 72 67  ed data too larg
31a80 65 20 2a 2f 0a 09 09 09 09 43 41 43 4b 45 59 5f  e */.....CACKEY_
31a90 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 72 65  DEBUG_PRINTF("re
31aa0 74 76 61 6c 20 3d 20 43 4b 52 5f 42 55 46 46 45  tval = CKR_BUFFE
31ab0 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 3b 20 20 73 69  R_TOO_SMALL;  si
31ac0 67 62 75 66 6c 65 6e 20 3d 20 25 6c 75 2c 20 70  gbuflen = %lu, p
31ad0 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 20 3d  ulSignatureLen =
31ae0 20 25 6c 75 22 2c 20 28 75 6e 73 69 67 6e 65 64   %lu", (unsigned
31af0 20 6c 6f 6e 67 29 20 73 69 67 62 75 66 6c 65 6e   long) sigbuflen
31b00 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
31b10 29 20 2a 70 75 6c 53 69 67 6e 61 74 75 72 65 4c  ) *pulSignatureL
31b20 65 6e 29 3b 0a 0a 09 09 09 09 72 65 74 76 61 6c  en);......retval
31b30 20 3d 20 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f   = CKR_BUFFER_TO
31b40 4f 5f 53 4d 41 4c 4c 3b 0a 0a 09 09 09 09 74 65  O_SMALL;......te
31b50 72 6d 69 6e 61 74 65 5f 73 69 67 6e 20 3d 20 30  rminate_sign = 0
31b60 3b 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  ;....} else {...
31b70 09 09 74 65 72 6d 69 6e 61 74 65 5f 73 69 67 6e  ..terminate_sign
31b80 20 3d 20 30 3b 0a 0a 09 09 09 09 69 66 20 28 70   = 0;......if (p
31b90 53 69 67 6e 61 74 75 72 65 29 20 7b 0a 09 09 09  Signature) {....
31ba0 09 09 6d 65 6d 63 70 79 28 70 53 69 67 6e 61 74  ..memcpy(pSignat
31bb0 75 72 65 2c 20 73 69 67 62 75 66 2c 20 73 69 67  ure, sigbuf, sig
31bc0 62 75 66 6c 65 6e 29 3b 0a 0a 09 09 09 09 09 74  buflen);.......t
31bd0 65 72 6d 69 6e 61 74 65 5f 73 69 67 6e 20 3d 20  erminate_sign = 
31be0 31 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 2a 70  1;.....}......*p
31bf0 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 20 3d  ulSignatureLen =
31c00 20 73 69 67 62 75 66 6c 65 6e 3b 0a 0a 09 09 09   sigbuflen;.....
31c10 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 4f 4b  .retval = CKR_OK
31c20 3b 0a 09 09 09 7d 0a 0a 09 09 09 62 72 65 61 6b  ;....}.....break
31c30 3b 0a 09 7d 0a 0a 09 69 66 20 28 74 65 72 6d 69  ;..}...if (termi
31c40 6e 61 74 65 5f 73 69 67 6e 29 20 7b 0a 09 09 69  nate_sign) {...i
31c50 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  f (cackey_sessio
31c60 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
31c70 6e 5f 62 75 66 29 20 7b 0a 09 09 09 66 72 65 65  n_buf) {....free
31c80 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
31c90 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
31ca0 62 75 66 29 3b 0a 09 09 7d 0a 0a 09 09 63 61 63  buf);...}....cac
31cb0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
31cc0 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 61 63 74 69  ssion].sign_acti
31cd0 76 65 20 3d 20 30 3b 0a 09 7d 0a 0a 09 6d 75 74  ve = 0;..}...mut
31ce0 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
31cf0 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
31d00 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
31d10 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
31d20 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
31d30 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
31d40 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b  ("Error.  Unlock
31d50 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
31d60 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
31d70 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
31d80 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
31d90 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
31da0 20 25 69 22 2c 20 28 69 6e 74 29 20 72 65 74 76   %i", (int) retv
31db0 61 6c 29 3b 0a 0a 09 72 65 74 75 72 6e 28 72 65  al);...return(re
31dc0 74 76 61 6c 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  tval);.}..CK_DEF
31dd0 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
31de0 52 56 2c 20 43 5f 53 69 67 6e 52 65 63 6f 76 65  RV, C_SignRecove
31df0 72 49 6e 69 74 29 28 43 4b 5f 53 45 53 53 49 4f  rInit)(CK_SESSIO
31e00 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
31e10 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f  n, CK_MECHANISM_
31e20 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20  PTR pMechanism, 
31e30 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45  CK_OBJECT_HANDLE
31e40 20 68 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59   hKey) {..CACKEY
31e50 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
31e60 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
31e70 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
31e80 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
31e90 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
31ea0 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
31eb0 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
31ec0 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
31ed0 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
31ee0 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
31ef0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
31f00 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
31f10 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
31f20 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
31f30 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
31f40 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
31f50 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
31f60 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
31f70 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
31f80 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 69 67 6e 52  N(CK_RV, C_SignR
31f90 65 63 6f 76 65 72 29 28 43 4b 5f 53 45 53 53 49  ecover)(CK_SESSI
31fa0 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
31fb0 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  on, CK_BYTE_PTR 
31fc0 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20  pData, CK_ULONG 
31fd0 75 6c 44 61 74 61 4c 65 6e 2c 20 43 4b 5f 42 59  ulDataLen, CK_BY
31fe0 54 45 5f 50 54 52 20 70 53 69 67 6e 61 74 75 72  TE_PTR pSignatur
31ff0 65 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20  e, CK_ULONG_PTR 
32000 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 29  pulSignatureLen)
32010 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
32020 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
32030 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
32040 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
32050 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
32060 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
32070 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
32080 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
32090 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
320a0 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
320b0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
320c0 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
320d0 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
320e0 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
320f0 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
32100 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
32110 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
32120 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
32130 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  TED);.}..CK_DEFI
32140 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
32150 56 2c 20 43 5f 56 65 72 69 66 79 49 6e 69 74 29  V, C_VerifyInit)
32160 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
32170 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
32180 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d  MECHANISM_PTR pM
32190 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a  echanism, CK_OBJ
321a0 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79 29  ECT_HANDLE hKey)
321b0 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
321c0 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
321d0 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
321e0 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
321f0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
32200 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
32210 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
32220 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
32230 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
32240 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
32250 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
32260 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
32270 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
32280 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
32290 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
322a0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
322b0 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
322c0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
322d0 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  TED);.}..CK_DEFI
322e0 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
322f0 56 2c 20 43 5f 56 65 72 69 66 79 29 28 43 4b 5f  V, C_Verify)(CK_
32300 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
32310 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45  Session, CK_BYTE
32320 5f 50 54 52 20 70 44 61 74 61 2c 20 43 4b 5f 55  _PTR pData, CK_U
32330 4c 4f 4e 47 20 75 6c 44 61 74 61 4c 65 6e 2c 20  LONG ulDataLen, 
32340 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 53 69 67  CK_BYTE_PTR pSig
32350 6e 61 74 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47  nature, CK_ULONG
32360 20 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 29   ulSignatureLen)
32370 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
32380 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
32390 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
323a0 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
323b0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
323c0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
323d0 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
323e0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
323f0 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
32400 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
32410 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
32420 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
32430 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
32440 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
32450 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
32460 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
32470 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
32480 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
32490 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  TED);.}..CK_DEFI
324a0 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
324b0 56 2c 20 43 5f 56 65 72 69 66 79 55 70 64 61 74  V, C_VerifyUpdat
324c0 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  e)(CK_SESSION_HA
324d0 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
324e0 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 61 72 74  K_BYTE_PTR pPart
324f0 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 61 72  , CK_ULONG ulPar
32500 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f  tLen) {..CACKEY_
32510 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
32520 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
32530 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
32540 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
32550 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
32560 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
32570 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
32580 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
32590 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
325a0 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
325b0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
325c0 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
325d0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
325e0 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
325f0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
32600 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
32610 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
32620 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
32630 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
32640 28 43 4b 5f 52 56 2c 20 43 5f 56 65 72 69 66 79  (CK_RV, C_Verify
32650 46 69 6e 61 6c 29 28 43 4b 5f 53 45 53 53 49 4f  Final)(CK_SESSIO
32660 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
32670 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
32680 53 69 67 6e 61 74 75 72 65 2c 20 43 4b 5f 55 4c  Signature, CK_UL
32690 4f 4e 47 20 75 6c 53 69 67 6e 61 74 75 72 65 4c  ONG ulSignatureL
326a0 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  en) {..CACKEY_DE
326b0 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
326c0 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
326d0 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
326e0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
326f0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
32700 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
32710 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
32720 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
32730 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
32740 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
32750 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
32760 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
32770 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
32780 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
32790 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
327a0 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
327b0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
327c0 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
327d0 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
327e0 4b 5f 52 56 2c 20 43 5f 56 65 72 69 66 79 52 65  K_RV, C_VerifyRe
327f0 63 6f 76 65 72 49 6e 69 74 29 28 43 4b 5f 53 45  coverInit)(CK_SE
32800 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
32810 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e  ssion, CK_MECHAN
32820 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69  ISM_PTR pMechani
32830 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41  sm, CK_OBJECT_HA
32840 4e 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09 43 41  NDLE hKey) {..CA
32850 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
32860 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
32870 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
32880 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
32890 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
328a0 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
328b0 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
328c0 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
328d0 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
328e0 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
328f0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
32900 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
32910 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
32920 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
32930 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
32940 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
32950 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
32960 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
32970 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
32980 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 56  CTION(CK_RV, C_V
32990 65 72 69 66 79 52 65 63 6f 76 65 72 29 28 43 4b  erifyRecover)(CK
329a0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
329b0 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54  hSession, CK_BYT
329c0 45 5f 50 54 52 20 70 53 69 67 6e 61 74 75 72 65  E_PTR pSignature
329d0 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 53 69 67  , CK_ULONG ulSig
329e0 6e 61 74 75 72 65 4c 65 6e 2c 20 43 4b 5f 42 59  natureLen, CK_BY
329f0 54 45 5f 50 54 52 20 70 44 61 74 61 2c 20 43 4b  TE_PTR pData, CK
32a00 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 44 61  _ULONG_PTR pulDa
32a10 74 61 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59  taLen) {..CACKEY
32a20 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
32a30 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
32a40 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
32a50 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
32a60 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
32a70 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
32a80 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
32a90 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
32aa0 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
32ab0 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
32ac0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
32ad0 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
32ae0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
32af0 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
32b00 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
32b10 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
32b20 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
32b30 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
32b40 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
32b50 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 69 67 65 73  N(CK_RV, C_Diges
32b60 74 45 6e 63 72 79 70 74 55 70 64 61 74 65 29 28  tEncryptUpdate)(
32b70 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
32b80 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42  E hSession, CK_B
32b90 59 54 45 5f 50 54 52 20 70 50 61 72 74 2c 20 43  YTE_PTR pPart, C
32ba0 4b 5f 55 4c 4f 4e 47 20 75 6c 50 61 72 74 4c 65  K_ULONG ulPartLe
32bb0 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
32bc0 45 6e 63 72 79 70 74 65 64 50 61 72 74 2c 20 43  EncryptedPart, C
32bd0 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 45  K_ULONG_PTR pulE
32be0 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e 29  ncryptedPartLen)
32bf0 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
32c00 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
32c10 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
32c20 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
32c30 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
32c40 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
32c50 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
32c60 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
32c70 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
32c80 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
32c90 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
32ca0 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
32cb0 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
32cc0 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
32cd0 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
32ce0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
32cf0 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
32d00 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
32d10 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  TED);.}..CK_DEFI
32d20 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
32d30 56 2c 20 43 5f 44 65 63 72 79 70 74 44 69 67 65  V, C_DecryptDige
32d40 73 74 55 70 64 61 74 65 29 28 43 4b 5f 53 45 53  stUpdate)(CK_SES
32d50 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
32d60 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  sion, CK_BYTE_PT
32d70 52 20 70 45 6e 63 72 79 70 74 65 64 50 61 72 74  R pEncryptedPart
32d80 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 45 6e 63  , CK_ULONG ulEnc
32d90 72 79 70 74 65 64 50 61 72 74 4c 65 6e 2c 20 43  ryptedPartLen, C
32da0 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 61 72 74  K_BYTE_PTR pPart
32db0 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70  , CK_ULONG_PTR p
32dc0 75 6c 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41  ulPartLen) {..CA
32dd0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
32de0 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
32df0 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
32e00 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
32e10 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
32e20 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
32e30 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
32e40 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
32e50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
32e60 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
32e70 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
32e80 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
32e90 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
32ea0 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
32eb0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
32ec0 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
32ed0 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
32ee0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
32ef0 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
32f00 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53  CTION(CK_RV, C_S
32f10 69 67 6e 45 6e 63 72 79 70 74 55 70 64 61 74 65  ignEncryptUpdate
32f20 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
32f30 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
32f40 5f 42 59 54 45 5f 50 54 52 20 70 50 61 72 74 2c  _BYTE_PTR pPart,
32f50 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 61 72 74   CK_ULONG ulPart
32f60 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  Len, CK_BYTE_PTR
32f70 20 70 45 6e 63 72 79 70 74 65 64 50 61 72 74 2c   pEncryptedPart,
32f80 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75   CK_ULONG_PTR pu
32f90 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65  lEncryptedPartLe
32fa0 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  n) {..CACKEY_DEB
32fb0 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
32fc0 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
32fd0 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
32fe0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
32ff0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
33000 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
33010 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
33020 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
33030 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
33040 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
33050 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
33060 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
33070 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
33080 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
33090 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
330a0 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
330b0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
330c0 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  ORTED);.}..CK_DE
330d0 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
330e0 5f 52 56 2c 20 43 5f 44 65 63 72 79 70 74 56 65  _RV, C_DecryptVe
330f0 72 69 66 79 55 70 64 61 74 65 29 28 43 4b 5f 53  rifyUpdate)(CK_S
33100 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
33110 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f  ession, CK_BYTE_
33120 50 54 52 20 70 45 6e 63 72 79 70 74 65 64 50 61  PTR pEncryptedPa
33130 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 45  rt, CK_ULONG ulE
33140 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e 2c  ncryptedPartLen,
33150 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 61   CK_BYTE_PTR pPa
33160 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52  rt, CK_ULONG_PTR
33170 20 70 75 6c 50 61 72 74 4c 65 6e 29 20 7b 0a 09   pulPartLen) {..
33180 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
33190 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
331a0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
331b0 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
331c0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
331d0 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
331e0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
331f0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
33200 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
33210 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
33220 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
33230 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
33240 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
33250 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
33260 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
33270 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
33280 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
33290 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
332a0 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
332b0 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
332c0 5f 47 65 6e 65 72 61 74 65 4b 65 79 29 28 43 4b  _GenerateKey)(CK
332d0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
332e0 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43  hSession, CK_MEC
332f0 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68  HANISM_PTR pMech
33300 61 6e 69 73 6d 2c 20 43 4b 5f 41 54 54 52 49 42  anism, CK_ATTRIB
33310 55 54 45 5f 50 54 52 20 70 54 65 6d 70 6c 61 74  UTE_PTR pTemplat
33320 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f  e, CK_ULONG ulCo
33330 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48  unt, CK_OBJECT_H
33340 41 4e 44 4c 45 5f 50 54 52 20 70 68 4b 65 79 29  ANDLE_PTR phKey)
33350 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
33360 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
33370 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
33380 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
33390 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
333a0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
333b0 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
333c0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
333d0 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
333e0 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
333f0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
33400 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
33410 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
33420 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
33430 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
33440 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
33450 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
33460 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
33470 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  TED);.}..CK_DEFI
33480 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
33490 56 2c 20 43 5f 47 65 6e 65 72 61 74 65 4b 65 79  V, C_GenerateKey
334a0 50 61 69 72 29 28 43 4b 5f 53 45 53 53 49 4f 4e  Pair)(CK_SESSION
334b0 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
334c0 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50  , CK_MECHANISM_P
334d0 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43  TR pMechanism, C
334e0 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52 20  K_ATTRIBUTE_PTR 
334f0 70 50 75 62 6c 69 63 4b 65 79 54 65 6d 70 6c 61  pPublicKeyTempla
33500 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50  te, CK_ULONG ulP
33510 75 62 6c 69 63 4b 65 79 41 74 74 72 69 62 75 74  ublicKeyAttribut
33520 65 43 6f 75 6e 74 2c 20 43 4b 5f 41 54 54 52 49  eCount, CK_ATTRI
33530 42 55 54 45 5f 50 54 52 20 70 50 72 69 76 61 74  BUTE_PTR pPrivat
33540 65 4b 65 79 54 65 6d 70 6c 61 74 65 2c 20 43 4b  eKeyTemplate, CK
33550 5f 55 4c 4f 4e 47 20 75 6c 50 72 69 76 61 74 65  _ULONG ulPrivate
33560 4b 65 79 41 74 74 72 69 62 75 74 65 43 6f 75 6e  KeyAttributeCoun
33570 74 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e  t, CK_OBJECT_HAN
33580 44 4c 45 5f 50 54 52 20 70 68 50 75 62 6c 69 63  DLE_PTR phPublic
33590 4b 65 79 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48  Key, CK_OBJECT_H
335a0 41 4e 44 4c 45 5f 50 54 52 20 70 68 50 72 69 76  ANDLE_PTR phPriv
335b0 61 74 65 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45  ateKey) {..CACKE
335c0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
335d0 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
335e0 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
335f0 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
33600 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
33610 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
33620 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
33630 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
33640 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
33650 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
33660 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
33670 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
33680 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
33690 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
336a0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
336b0 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
336c0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
336d0 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
336e0 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
336f0 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 57 72 61 70  ON(CK_RV, C_Wrap
33700 4b 65 79 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  Key)(CK_SESSION_
33710 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
33720 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54   CK_MECHANISM_PT
33730 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b  R pMechanism, CK
33740 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68  _OBJECT_HANDLE h
33750 57 72 61 70 70 69 6e 67 4b 65 79 2c 20 43 4b 5f  WrappingKey, CK_
33760 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b  OBJECT_HANDLE hK
33770 65 79 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  ey, CK_BYTE_PTR 
33780 70 57 72 61 70 70 65 64 4b 65 79 2c 20 43 4b 5f  pWrappedKey, CK_
33790 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 57 72 61  ULONG_PTR pulWra
337a0 70 70 65 64 4b 65 79 4c 65 6e 29 20 7b 0a 09 43  ppedKeyLen) {..C
337b0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
337c0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
337d0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
337e0 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
337f0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
33800 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
33810 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
33820 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
33830 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
33840 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
33850 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
33860 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
33870 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
33880 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
33890 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
338a0 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
338b0 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
338c0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
338d0 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
338e0 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
338f0 55 6e 77 72 61 70 4b 65 79 29 28 43 4b 5f 53 45  UnwrapKey)(CK_SE
33900 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
33910 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e  ssion, CK_MECHAN
33920 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69  ISM_PTR pMechani
33930 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41  sm, CK_OBJECT_HA
33940 4e 44 4c 45 20 68 55 6e 77 72 61 70 70 69 6e 67  NDLE hUnwrapping
33950 4b 65 79 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  Key, CK_BYTE_PTR
33960 20 70 57 72 61 70 70 65 64 4b 65 79 2c 20 43 4b   pWrappedKey, CK
33970 5f 55 4c 4f 4e 47 20 75 6c 57 72 61 70 70 65 64  _ULONG ulWrapped
33980 4b 65 79 4c 65 6e 2c 20 43 4b 5f 41 54 54 52 49  KeyLen, CK_ATTRI
33990 42 55 54 45 5f 50 54 52 20 70 54 65 6d 70 6c 61  BUTE_PTR pTempla
339a0 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 41  te, CK_ULONG ulA
339b0 74 74 72 69 62 75 74 65 43 6f 75 6e 74 2c 20 43  ttributeCount, C
339c0 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f  K_OBJECT_HANDLE_
339d0 50 54 52 20 70 68 4b 65 79 29 20 7b 0a 09 43 41  PTR phKey) {..CA
339e0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
339f0 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
33a00 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
33a10 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
33a20 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
33a30 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
33a40 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
33a50 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
33a60 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
33a70 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
33a80 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
33a90 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
33aa0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
33ab0 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
33ac0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
33ad0 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
33ae0 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
33af0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
33b00 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
33b10 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44  CTION(CK_RV, C_D
33b20 65 72 69 76 65 4b 65 79 29 28 43 4b 5f 53 45 53  eriveKey)(CK_SES
33b30 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
33b40 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49  sion, CK_MECHANI
33b50 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73  SM_PTR pMechanis
33b60 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e  m, CK_OBJECT_HAN
33b70 44 4c 45 20 68 42 61 73 65 4b 65 79 2c 20 43 4b  DLE hBaseKey, CK
33b80 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52 20 70  _ATTRIBUTE_PTR p
33b90 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f  Template, CK_ULO
33ba0 4e 47 20 75 6c 41 74 74 72 69 62 75 74 65 43 6f  NG ulAttributeCo
33bb0 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48  unt, CK_OBJECT_H
33bc0 41 4e 44 4c 45 5f 50 54 52 20 70 68 4b 65 79 29  ANDLE_PTR phKey)
33bd0 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
33be0 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
33bf0 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
33c00 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
33c10 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
33c20 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
33c30 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
33c40 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
33c50 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
33c60 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
33c70 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
33c80 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
33c90 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
33ca0 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
33cb0 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
33cc0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
33cd0 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
33ce0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
33cf0 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  TED);.}..CK_DEFI
33d00 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
33d10 56 2c 20 43 5f 53 65 65 64 52 61 6e 64 6f 6d 29  V, C_SeedRandom)
33d20 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
33d30 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
33d40 42 59 54 45 5f 50 54 52 20 70 53 65 65 64 2c 20  BYTE_PTR pSeed, 
33d50 43 4b 5f 55 4c 4f 4e 47 20 75 6c 53 65 65 64 4c  CK_ULONG ulSeedL
33d60 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  en) {..CACKEY_DE
33d70 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
33d80 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
33d90 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
33da0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
33db0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
33dc0 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
33dd0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
33de0 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
33df0 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
33e00 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
33e10 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
33e20 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
33e30 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
33e40 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
33e50 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
33e60 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
33e70 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
33e80 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
33e90 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
33ea0 4b 5f 52 56 2c 20 43 5f 47 65 6e 65 72 61 74 65  K_RV, C_Generate
33eb0 52 61 6e 64 6f 6d 29 28 43 4b 5f 53 45 53 53 49  Random)(CK_SESSI
33ec0 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
33ed0 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  on, CK_BYTE_PTR 
33ee0 70 52 61 6e 64 6f 6d 44 61 74 61 2c 20 43 4b 5f  pRandomData, CK_
33ef0 55 4c 4f 4e 47 20 75 6c 52 61 6e 64 6f 6d 4c 65  ULONG ulRandomLe
33f00 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  n) {..CACKEY_DEB
33f10 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
33f20 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
33f30 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
33f40 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
33f50 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
33f60 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
33f70 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
33f80 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
33f90 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
33fa0 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
33fb0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
33fc0 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
33fd0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
33fe0 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
33ff0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
34000 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
34010 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
34020 4f 52 54 45 44 29 3b 0a 7d 0a 0a 2f 2a 20 44 65  ORTED);.}../* De
34030 70 72 65 63 61 74 65 64 20 46 75 6e 63 74 69 6f  precated Functio
34040 6e 20 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  n */.CK_DEFINE_F
34050 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
34060 5f 47 65 74 46 75 6e 63 74 69 6f 6e 53 74 61 74  _GetFunctionStat
34070 75 73 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  us)(CK_SESSION_H
34080 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 29 20  ANDLE hSession) 
34090 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
340a0 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
340b0 29 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  );...CACKEY_DEBU
340c0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
340d0 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
340e0 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c 20 28 25  _NOT_PARALLEL (%
340f0 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
34100 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c 29 3b  N_NOT_PARALLEL);
34110 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
34120 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c  NCTION_NOT_PARAL
34130 4c 45 4c 29 3b 0a 0a 09 68 53 65 73 73 69 6f 6e  LEL);...hSession
34140 20 3d 20 68 53 65 73 73 69 6f 6e 3b 20 2f 2a 20   = hSession; /* 
34150 53 75 70 72 65 73 73 20 75 6e 75 73 65 64 20 76  Supress unused v
34160 61 72 69 61 62 6c 65 20 77 61 72 6e 69 6e 67 20  ariable warning 
34170 2a 2f 0a 7d 0a 0a 2f 2a 20 44 65 70 72 65 63 61  */.}../* Depreca
34180 74 65 64 20 46 75 6e 63 74 69 6f 6e 20 2a 2f 0a  ted Function */.
34190 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
341a0 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 43 61 6e 63  ON(CK_RV, C_Canc
341b0 65 6c 46 75 6e 63 74 69 6f 6e 29 28 43 4b 5f 53  elFunction)(CK_S
341c0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
341d0 65 73 73 69 6f 6e 29 20 7b 0a 09 43 41 43 4b 45  ession) {..CACKE
341e0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
341f0 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 43 41 43  Called.");...CAC
34200 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
34210 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
34220 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 50 41 52  FUNCTION_NOT_PAR
34230 41 4c 4c 45 4c 20 28 25 69 29 22 2c 20 43 4b 52  ALLEL (%i)", CKR
34240 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 50 41  _FUNCTION_NOT_PA
34250 52 41 4c 4c 45 4c 29 3b 0a 0a 09 72 65 74 75 72  RALLEL);...retur
34260 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
34270 4f 54 5f 50 41 52 41 4c 4c 45 4c 29 3b 0a 0a 09  OT_PARALLEL);...
34280 68 53 65 73 73 69 6f 6e 20 3d 20 68 53 65 73 73  hSession = hSess
34290 69 6f 6e 3b 20 2f 2a 20 53 75 70 72 65 73 73 20  ion; /* Supress 
342a0 75 6e 75 73 65 64 20 76 61 72 69 61 62 6c 65 20  unused variable 
342b0 77 61 72 6e 69 6e 67 20 2a 2f 0a 7d 0a 0a 43 4b  warning */.}..CK
342c0 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
342d0 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 46 75 6e  (CK_RV, C_GetFun
342e0 63 74 69 6f 6e 4c 69 73 74 29 28 43 4b 5f 46 55  ctionList)(CK_FU
342f0 4e 43 54 49 4f 4e 5f 4c 49 53 54 5f 50 54 52 5f  NCTION_LIST_PTR_
34300 50 54 52 20 70 70 46 75 6e 63 74 69 6f 6e 4c 69  PTR ppFunctionLi
34310 73 74 29 20 7b 0a 09 73 74 61 74 69 63 20 43 4b  st) {..static CK
34320 5f 46 55 4e 43 54 49 4f 4e 5f 4c 49 53 54 5f 50  _FUNCTION_LIST_P
34330 54 52 20 73 70 46 75 6e 63 74 69 6f 6e 4c 69 73  TR spFunctionLis
34340 74 20 3d 20 4e 55 4c 4c 3b 0a 09 43 4b 5f 46 55  t = NULL;..CK_FU
34350 4e 43 54 49 4f 4e 5f 4c 49 53 54 5f 50 54 52 20  NCTION_LIST_PTR 
34360 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 3b 0a 0a  pFunctionList;..
34370 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
34380 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
34390 0a 0a 09 69 66 20 28 70 70 46 75 6e 63 74 69 6f  ...if (ppFunctio
343a0 6e 4c 69 73 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b  nList == NULL) {
343b0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
343c0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70  PRINTF("Error. p
343d0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 20 69 73  pFunctionList is
343e0 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74   NULL.");....ret
343f0 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54  urn(CKR_ARGUMENT
34400 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  S_BAD);..}...if 
34410 28 73 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 20  (spFunctionList 
34420 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 2a 70 70  != NULL) {...*pp
34430 46 75 6e 63 74 69 6f 6e 4c 69 73 74 20 3d 20 73  FunctionList = s
34440 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 3b 0a 0a  pFunctionList;..
34450 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
34460 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
34470 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43   CKR_OK (%i)", C
34480 4b 52 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74 75 72  KR_OK);....retur
34490 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09  n(CKR_OK);..}...
344a0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 20 3d 20  pFunctionList = 
344b0 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70  malloc(sizeof(*p
344c0 46 75 6e 63 74 69 6f 6e 4c 69 73 74 29 29 3b 0a  FunctionList));.
344d0 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
344e0 3e 76 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d  >version.major =
344f0 20 28 28 43 41 43 4b 45 59 5f 43 52 59 50 54 4f   ((CACKEY_CRYPTO
34500 4b 49 5f 56 45 52 53 49 4f 4e 5f 43 4f 44 45 29  KI_VERSION_CODE)
34510 20 3e 3e 20 31 36 29 20 26 20 30 78 66 66 3b 0a   >> 16) & 0xff;.
34520 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
34530 76 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20  version.minor = 
34540 28 28 43 41 43 4b 45 59 5f 43 52 59 50 54 4f 4b  ((CACKEY_CRYPTOK
34550 49 5f 56 45 52 53 49 4f 4e 5f 43 4f 44 45 29 20  I_VERSION_CODE) 
34560 3e 3e 20 38 29 20 26 20 30 78 66 66 3b 0a 0a 09  >> 8) & 0xff;...
34570 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
34580 5f 49 6e 69 74 69 61 6c 69 7a 65 20 3d 20 43 5f  _Initialize = C_
34590 49 6e 69 74 69 61 6c 69 7a 65 3b 0a 09 70 46 75  Initialize;..pFu
345a0 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 46 69  nctionList->C_Fi
345b0 6e 61 6c 69 7a 65 20 3d 20 43 5f 46 69 6e 61 6c  nalize = C_Final
345c0 69 7a 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  ize;..pFunctionL
345d0 69 73 74 2d 3e 43 5f 47 65 74 49 6e 66 6f 20 3d  ist->C_GetInfo =
345e0 20 43 5f 47 65 74 49 6e 66 6f 3b 0a 09 70 46 75   C_GetInfo;..pFu
345f0 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65  nctionList->C_Ge
34600 74 53 6c 6f 74 4c 69 73 74 20 3d 20 43 5f 47 65  tSlotList = C_Ge
34610 74 53 6c 6f 74 4c 69 73 74 3b 0a 09 70 46 75 6e  tSlotList;..pFun
34620 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74  ctionList->C_Get
34630 53 6c 6f 74 49 6e 66 6f 20 3d 20 43 5f 47 65 74  SlotInfo = C_Get
34640 53 6c 6f 74 49 6e 66 6f 3b 0a 09 70 46 75 6e 63  SlotInfo;..pFunc
34650 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 54  tionList->C_GetT
34660 6f 6b 65 6e 49 6e 66 6f 20 3d 20 43 5f 47 65 74  okenInfo = C_Get
34670 54 6f 6b 65 6e 49 6e 66 6f 3b 0a 09 70 46 75 6e  TokenInfo;..pFun
34680 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 57 61 69  ctionList->C_Wai
34690 74 46 6f 72 53 6c 6f 74 45 76 65 6e 74 20 3d 20  tForSlotEvent = 
346a0 43 5f 57 61 69 74 46 6f 72 53 6c 6f 74 45 76 65  C_WaitForSlotEve
346b0 6e 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  nt;..pFunctionLi
346c0 73 74 2d 3e 43 5f 47 65 74 4d 65 63 68 61 6e 69  st->C_GetMechani
346d0 73 6d 4c 69 73 74 20 3d 20 43 5f 47 65 74 4d 65  smList = C_GetMe
346e0 63 68 61 6e 69 73 6d 4c 69 73 74 3b 0a 09 70 46  chanismList;..pF
346f0 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47  unctionList->C_G
34700 65 74 4d 65 63 68 61 6e 69 73 6d 49 6e 66 6f 20  etMechanismInfo 
34710 3d 20 43 5f 47 65 74 4d 65 63 68 61 6e 69 73 6d  = C_GetMechanism
34720 49 6e 66 6f 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  Info;..pFunction
34730 4c 69 73 74 2d 3e 43 5f 49 6e 69 74 54 6f 6b 65  List->C_InitToke
34740 6e 20 3d 20 43 5f 49 6e 69 74 54 6f 6b 65 6e 3b  n = C_InitToken;
34750 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
34760 3e 43 5f 49 6e 69 74 50 49 4e 20 3d 20 43 5f 49  >C_InitPIN = C_I
34770 6e 69 74 50 49 4e 3b 0a 09 70 46 75 6e 63 74 69  nitPIN;..pFuncti
34780 6f 6e 4c 69 73 74 2d 3e 43 5f 53 65 74 50 49 4e  onList->C_SetPIN
34790 20 3d 20 43 5f 53 65 74 50 49 4e 3b 0a 09 70 46   = C_SetPIN;..pF
347a0 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 4f  unctionList->C_O
347b0 70 65 6e 53 65 73 73 69 6f 6e 20 3d 20 43 5f 4f  penSession = C_O
347c0 70 65 6e 53 65 73 73 69 6f 6e 3b 0a 09 70 46 75  penSession;..pFu
347d0 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 43 6c  nctionList->C_Cl
347e0 6f 73 65 53 65 73 73 69 6f 6e 20 3d 20 43 5f 43  oseSession = C_C
347f0 6c 6f 73 65 53 65 73 73 69 6f 6e 3b 0a 09 70 46  loseSession;..pF
34800 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 43  unctionList->C_C
34810 6c 6f 73 65 41 6c 6c 53 65 73 73 69 6f 6e 73 20  loseAllSessions 
34820 3d 20 43 5f 43 6c 6f 73 65 41 6c 6c 53 65 73 73  = C_CloseAllSess
34830 69 6f 6e 73 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  ions;..pFunction
34840 4c 69 73 74 2d 3e 43 5f 47 65 74 53 65 73 73 69  List->C_GetSessi
34850 6f 6e 49 6e 66 6f 20 3d 20 43 5f 47 65 74 53 65  onInfo = C_GetSe
34860 73 73 69 6f 6e 49 6e 66 6f 3b 0a 09 70 46 75 6e  ssionInfo;..pFun
34870 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74  ctionList->C_Get
34880 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 65 20 3d  OperationState =
34890 20 43 5f 47 65 74 4f 70 65 72 61 74 69 6f 6e 53   C_GetOperationS
348a0 74 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  tate;..pFunction
348b0 4c 69 73 74 2d 3e 43 5f 53 65 74 4f 70 65 72 61  List->C_SetOpera
348c0 74 69 6f 6e 53 74 61 74 65 20 3d 20 43 5f 53 65  tionState = C_Se
348d0 74 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 65 3b  tOperationState;
348e0 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
348f0 3e 43 5f 4c 6f 67 69 6e 20 3d 20 43 5f 4c 6f 67  >C_Login = C_Log
34900 69 6e 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  in;..pFunctionLi
34910 73 74 2d 3e 43 5f 4c 6f 67 6f 75 74 20 3d 20 43  st->C_Logout = C
34920 5f 4c 6f 67 6f 75 74 3b 0a 09 70 46 75 6e 63 74  _Logout;..pFunct
34930 69 6f 6e 4c 69 73 74 2d 3e 43 5f 43 72 65 61 74  ionList->C_Creat
34940 65 4f 62 6a 65 63 74 20 3d 20 43 5f 43 72 65 61  eObject = C_Crea
34950 74 65 4f 62 6a 65 63 74 3b 0a 09 70 46 75 6e 63  teObject;..pFunc
34960 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 43 6f 70 79  tionList->C_Copy
34970 4f 62 6a 65 63 74 20 3d 20 43 5f 43 6f 70 79 4f  Object = C_CopyO
34980 62 6a 65 63 74 3b 0a 09 70 46 75 6e 63 74 69 6f  bject;..pFunctio
34990 6e 4c 69 73 74 2d 3e 43 5f 44 65 73 74 72 6f 79  nList->C_Destroy
349a0 4f 62 6a 65 63 74 20 3d 20 43 5f 44 65 73 74 72  Object = C_Destr
349b0 6f 79 4f 62 6a 65 63 74 3b 0a 09 70 46 75 6e 63  oyObject;..pFunc
349c0 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 4f  tionList->C_GetO
349d0 62 6a 65 63 74 53 69 7a 65 20 3d 20 43 5f 47 65  bjectSize = C_Ge
349e0 74 4f 62 6a 65 63 74 53 69 7a 65 3b 0a 09 70 46  tObjectSize;..pF
349f0 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47  unctionList->C_G
34a00 65 74 41 74 74 72 69 62 75 74 65 56 61 6c 75 65  etAttributeValue
34a10 20 3d 20 43 5f 47 65 74 41 74 74 72 69 62 75 74   = C_GetAttribut
34a20 65 56 61 6c 75 65 3b 0a 09 70 46 75 6e 63 74 69  eValue;..pFuncti
34a30 6f 6e 4c 69 73 74 2d 3e 43 5f 53 65 74 41 74 74  onList->C_SetAtt
34a40 72 69 62 75 74 65 56 61 6c 75 65 20 3d 20 43 5f  ributeValue = C_
34a50 53 65 74 41 74 74 72 69 62 75 74 65 56 61 6c 75  SetAttributeValu
34a60 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  e;..pFunctionLis
34a70 74 2d 3e 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73  t->C_FindObjects
34a80 49 6e 69 74 20 3d 20 43 5f 46 69 6e 64 4f 62 6a  Init = C_FindObj
34a90 65 63 74 73 49 6e 69 74 3b 0a 09 70 46 75 6e 63  ectsInit;..pFunc
34aa0 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 46 69 6e 64  tionList->C_Find
34ab0 4f 62 6a 65 63 74 73 20 3d 20 43 5f 46 69 6e 64  Objects = C_Find
34ac0 4f 62 6a 65 63 74 73 3b 0a 09 70 46 75 6e 63 74  Objects;..pFunct
34ad0 69 6f 6e 4c 69 73 74 2d 3e 43 5f 46 69 6e 64 4f  ionList->C_FindO
34ae0 62 6a 65 63 74 73 46 69 6e 61 6c 20 3d 20 43 5f  bjectsFinal = C_
34af0 46 69 6e 64 4f 62 6a 65 63 74 73 46 69 6e 61 6c  FindObjectsFinal
34b00 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
34b10 2d 3e 43 5f 45 6e 63 72 79 70 74 49 6e 69 74 20  ->C_EncryptInit 
34b20 3d 20 43 5f 45 6e 63 72 79 70 74 49 6e 69 74 3b  = C_EncryptInit;
34b30 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
34b40 3e 43 5f 45 6e 63 72 79 70 74 20 3d 20 43 5f 45  >C_Encrypt = C_E
34b50 6e 63 72 79 70 74 3b 0a 09 70 46 75 6e 63 74 69  ncrypt;..pFuncti
34b60 6f 6e 4c 69 73 74 2d 3e 43 5f 45 6e 63 72 79 70  onList->C_Encryp
34b70 74 55 70 64 61 74 65 20 3d 20 43 5f 45 6e 63 72  tUpdate = C_Encr
34b80 79 70 74 55 70 64 61 74 65 3b 0a 09 70 46 75 6e  yptUpdate;..pFun
34b90 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 45 6e 63  ctionList->C_Enc
34ba0 72 79 70 74 46 69 6e 61 6c 20 3d 20 43 5f 45 6e  ryptFinal = C_En
34bb0 63 72 79 70 74 46 69 6e 61 6c 3b 0a 09 70 46 75  cryptFinal;..pFu
34bc0 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65  nctionList->C_De
34bd0 63 72 79 70 74 49 6e 69 74 20 3d 20 43 5f 44 65  cryptInit = C_De
34be0 63 72 79 70 74 49 6e 69 74 3b 0a 09 70 46 75 6e  cryptInit;..pFun
34bf0 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65 63  ctionList->C_Dec
34c00 72 79 70 74 20 3d 20 43 5f 44 65 63 72 79 70 74  rypt = C_Decrypt
34c10 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
34c20 2d 3e 43 5f 44 65 63 72 79 70 74 55 70 64 61 74  ->C_DecryptUpdat
34c30 65 20 3d 20 43 5f 44 65 63 72 79 70 74 55 70 64  e = C_DecryptUpd
34c40 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  ate;..pFunctionL
34c50 69 73 74 2d 3e 43 5f 44 65 63 72 79 70 74 46 69  ist->C_DecryptFi
34c60 6e 61 6c 20 3d 20 43 5f 44 65 63 72 79 70 74 46  nal = C_DecryptF
34c70 69 6e 61 6c 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  inal;..pFunction
34c80 4c 69 73 74 2d 3e 43 5f 44 69 67 65 73 74 49 6e  List->C_DigestIn
34c90 69 74 20 3d 20 43 5f 44 69 67 65 73 74 49 6e 69  it = C_DigestIni
34ca0 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  t;..pFunctionLis
34cb0 74 2d 3e 43 5f 44 69 67 65 73 74 20 3d 20 43 5f  t->C_Digest = C_
34cc0 44 69 67 65 73 74 3b 0a 09 70 46 75 6e 63 74 69  Digest;..pFuncti
34cd0 6f 6e 4c 69 73 74 2d 3e 43 5f 44 69 67 65 73 74  onList->C_Digest
34ce0 55 70 64 61 74 65 20 3d 20 43 5f 44 69 67 65 73  Update = C_Diges
34cf0 74 55 70 64 61 74 65 3b 0a 09 70 46 75 6e 63 74  tUpdate;..pFunct
34d00 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 69 67 65 73  ionList->C_Diges
34d10 74 4b 65 79 20 3d 20 43 5f 44 69 67 65 73 74 4b  tKey = C_DigestK
34d20 65 79 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  ey;..pFunctionLi
34d30 73 74 2d 3e 43 5f 44 69 67 65 73 74 46 69 6e 61  st->C_DigestFina
34d40 6c 20 3d 20 43 5f 44 69 67 65 73 74 46 69 6e 61  l = C_DigestFina
34d50 6c 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  l;..pFunctionLis
34d60 74 2d 3e 43 5f 53 69 67 6e 49 6e 69 74 20 3d 20  t->C_SignInit = 
34d70 43 5f 53 69 67 6e 49 6e 69 74 3b 0a 09 70 46 75  C_SignInit;..pFu
34d80 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69  nctionList->C_Si
34d90 67 6e 20 3d 20 43 5f 53 69 67 6e 3b 0a 09 70 46  gn = C_Sign;..pF
34da0 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53  unctionList->C_S
34db0 69 67 6e 55 70 64 61 74 65 20 3d 20 43 5f 53 69  ignUpdate = C_Si
34dc0 67 6e 55 70 64 61 74 65 3b 0a 09 70 46 75 6e 63  gnUpdate;..pFunc
34dd0 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 6e  tionList->C_Sign
34de0 46 69 6e 61 6c 20 3d 20 43 5f 53 69 67 6e 46 69  Final = C_SignFi
34df0 6e 61 6c 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  nal;..pFunctionL
34e00 69 73 74 2d 3e 43 5f 53 69 67 6e 52 65 63 6f 76  ist->C_SignRecov
34e10 65 72 49 6e 69 74 20 3d 20 43 5f 53 69 67 6e 52  erInit = C_SignR
34e20 65 63 6f 76 65 72 49 6e 69 74 3b 0a 09 70 46 75  ecoverInit;..pFu
34e30 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69  nctionList->C_Si
34e40 67 6e 52 65 63 6f 76 65 72 20 3d 20 43 5f 53 69  gnRecover = C_Si
34e50 67 6e 52 65 63 6f 76 65 72 3b 0a 09 70 46 75 6e  gnRecover;..pFun
34e60 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65 72  ctionList->C_Ver
34e70 69 66 79 49 6e 69 74 20 3d 20 43 5f 56 65 72 69  ifyInit = C_Veri
34e80 66 79 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69  fyInit;..pFuncti
34e90 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65 72 69 66 79  onList->C_Verify
34ea0 20 3d 20 43 5f 56 65 72 69 66 79 3b 0a 09 70 46   = C_Verify;..pF
34eb0 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 56  unctionList->C_V
34ec0 65 72 69 66 79 55 70 64 61 74 65 20 3d 20 43 5f  erifyUpdate = C_
34ed0 56 65 72 69 66 79 55 70 64 61 74 65 3b 0a 09 70  VerifyUpdate;..p
34ee0 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
34ef0 56 65 72 69 66 79 46 69 6e 61 6c 20 3d 20 43 5f  VerifyFinal = C_
34f00 56 65 72 69 66 79 46 69 6e 61 6c 3b 0a 09 70 46  VerifyFinal;..pF
34f10 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 56  unctionList->C_V
34f20 65 72 69 66 79 52 65 63 6f 76 65 72 49 6e 69 74  erifyRecoverInit
34f30 20 3d 20 43 5f 56 65 72 69 66 79 52 65 63 6f 76   = C_VerifyRecov
34f40 65 72 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69  erInit;..pFuncti
34f50 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65 72 69 66 79  onList->C_Verify
34f60 52 65 63 6f 76 65 72 20 3d 20 43 5f 56 65 72 69  Recover = C_Veri
34f70 66 79 52 65 63 6f 76 65 72 3b 0a 09 70 46 75 6e  fyRecover;..pFun
34f80 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 69 67  ctionList->C_Dig
34f90 65 73 74 45 6e 63 72 79 70 74 55 70 64 61 74 65  estEncryptUpdate
34fa0 20 3d 20 43 5f 44 69 67 65 73 74 45 6e 63 72 79   = C_DigestEncry
34fb0 70 74 55 70 64 61 74 65 3b 0a 09 70 46 75 6e 63  ptUpdate;..pFunc
34fc0 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65 63 72  tionList->C_Decr
34fd0 79 70 74 44 69 67 65 73 74 55 70 64 61 74 65 20  yptDigestUpdate 
34fe0 3d 20 43 5f 44 65 63 72 79 70 74 44 69 67 65 73  = C_DecryptDiges
34ff0 74 55 70 64 61 74 65 3b 0a 09 70 46 75 6e 63 74  tUpdate;..pFunct
35000 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 45  ionList->C_SignE
35010 6e 63 72 79 70 74 55 70 64 61 74 65 20 3d 20 43  ncryptUpdate = C
35020 5f 53 69 67 6e 45 6e 63 72 79 70 74 55 70 64 61  _SignEncryptUpda
35030 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  te;..pFunctionLi
35040 73 74 2d 3e 43 5f 44 65 63 72 79 70 74 56 65 72  st->C_DecryptVer
35050 69 66 79 55 70 64 61 74 65 20 3d 20 43 5f 44 65  ifyUpdate = C_De
35060 63 72 79 70 74 56 65 72 69 66 79 55 70 64 61 74  cryptVerifyUpdat
35070 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  e;..pFunctionLis
35080 74 2d 3e 43 5f 47 65 6e 65 72 61 74 65 4b 65 79  t->C_GenerateKey
35090 20 3d 20 43 5f 47 65 6e 65 72 61 74 65 4b 65 79   = C_GenerateKey
350a0 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
350b0 2d 3e 43 5f 47 65 6e 65 72 61 74 65 4b 65 79 50  ->C_GenerateKeyP
350c0 61 69 72 20 3d 20 43 5f 47 65 6e 65 72 61 74 65  air = C_Generate
350d0 4b 65 79 50 61 69 72 3b 0a 09 70 46 75 6e 63 74  KeyPair;..pFunct
350e0 69 6f 6e 4c 69 73 74 2d 3e 43 5f 57 72 61 70 4b  ionList->C_WrapK
350f0 65 79 20 3d 20 43 5f 57 72 61 70 4b 65 79 3b 0a  ey = C_WrapKey;.
35100 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
35110 43 5f 55 6e 77 72 61 70 4b 65 79 20 3d 20 43 5f  C_UnwrapKey = C_
35120 55 6e 77 72 61 70 4b 65 79 3b 0a 09 70 46 75 6e  UnwrapKey;..pFun
35130 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65 72  ctionList->C_Der
35140 69 76 65 4b 65 79 20 3d 20 43 5f 44 65 72 69 76  iveKey = C_Deriv
35150 65 4b 65 79 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  eKey;..pFunction
35160 4c 69 73 74 2d 3e 43 5f 53 65 65 64 52 61 6e 64  List->C_SeedRand
35170 6f 6d 20 3d 20 43 5f 53 65 65 64 52 61 6e 64 6f  om = C_SeedRando
35180 6d 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  m;..pFunctionLis
35190 74 2d 3e 43 5f 47 65 6e 65 72 61 74 65 52 61 6e  t->C_GenerateRan
351a0 64 6f 6d 20 3d 20 43 5f 47 65 6e 65 72 61 74 65  dom = C_Generate
351b0 52 61 6e 64 6f 6d 3b 0a 09 70 46 75 6e 63 74 69  Random;..pFuncti
351c0 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 46 75 6e  onList->C_GetFun
351d0 63 74 69 6f 6e 53 74 61 74 75 73 20 3d 20 43 5f  ctionStatus = C_
351e0 47 65 74 46 75 6e 63 74 69 6f 6e 53 74 61 74 75  GetFunctionStatu
351f0 73 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  s;..pFunctionLis
35200 74 2d 3e 43 5f 43 61 6e 63 65 6c 46 75 6e 63 74  t->C_CancelFunct
35210 69 6f 6e 20 3d 20 43 5f 43 61 6e 63 65 6c 46 75  ion = C_CancelFu
35220 6e 63 74 69 6f 6e 3b 0a 09 70 46 75 6e 63 74 69  nction;..pFuncti
35230 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 46 75 6e  onList->C_GetFun
35240 63 74 69 6f 6e 4c 69 73 74 20 3d 20 43 5f 47 65  ctionList = C_Ge
35250 74 46 75 6e 63 74 69 6f 6e 4c 69 73 74 3b 0a 0a  tFunctionList;..
35260 09 73 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 20  .spFunctionList 
35270 20 3d 20 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74   = pFunctionList
35280 3b 0a 09 2a 70 70 46 75 6e 63 74 69 6f 6e 4c 69  ;..*ppFunctionLi
35290 73 74 20 3d 20 70 46 75 6e 63 74 69 6f 6e 4c 69  st = pFunctionLi
352a0 73 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  st;...CACKEY_DEB
352b0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
352c0 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29  ning CKR_OK (%i)
352d0 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65  ", CKR_OK);...re
352e0 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a  turn(CKR_OK);.}.