Hex Artifact Content

Artifact fd4f0feee51f67ccc767a1498ad3663968d4ff2c:


0000: 23 69 66 64 65 66 20 48 41 56 45 5f 43 4f 4e 46  #ifdef HAVE_CONF
0010: 49 47 5f 48 0a 23 69 6e 63 6c 75 64 65 20 22 63  IG_H.#include "c
0020: 6f 6e 66 69 67 2e 68 22 0a 23 65 6e 64 69 66 0a  onfig.h".#endif.
0030: 0a 23 69 66 64 65 66 20 48 41 56 45 5f 57 49 4e  .#ifdef HAVE_WIN
0040: 54 59 50 45 53 5f 48 0a 23 20 20 69 6e 63 6c 75  TYPES_H.#  inclu
0050: 64 65 20 3c 77 69 6e 74 79 70 65 73 2e 68 3e 0a  de <wintypes.h>.
0060: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 48 41  #endif.#ifdef HA
0070: 56 45 5f 50 43 53 43 4c 49 54 45 5f 48 0a 23 20  VE_PCSCLITE_H.# 
0080: 20 69 6e 63 6c 75 64 65 20 3c 70 63 73 63 6c 69   include <pcscli
0090: 74 65 2e 68 3e 0a 23 65 6e 64 69 66 0a 23 69 66  te.h>.#endif.#if
00a0: 64 65 66 20 48 41 56 45 5f 57 49 4e 53 43 41 52  def HAVE_WINSCAR
00b0: 44 5f 48 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c  D_H.#  include <
00c0: 77 69 6e 73 63 61 72 64 2e 68 3e 0a 23 65 6e 64  winscard.h>.#end
00d0: 69 66 0a 23 69 66 64 65 66 20 48 41 56 45 5f 53  if.#ifdef HAVE_S
00e0: 54 44 49 4e 54 5f 48 0a 23 20 20 69 6e 63 6c 75  TDINT_H.#  inclu
00f0: 64 65 20 3c 73 74 64 69 6e 74 2e 68 3e 0a 23 65  de <stdint.h>.#e
0100: 6e 64 69 66 0a 23 69 66 64 65 66 20 48 41 56 45  ndif.#ifdef HAVE
0110: 5f 49 4e 54 54 59 50 45 53 5f 48 0a 23 20 20 69  _INTTYPES_H.#  i
0120: 6e 63 6c 75 64 65 20 3c 69 6e 74 74 79 70 65 73  nclude <inttypes
0130: 2e 68 3e 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  .h>.#endif.#ifde
0140: 66 20 48 41 56 45 5f 53 54 44 4c 49 42 5f 48 0a  f HAVE_STDLIB_H.
0150: 23 20 20 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c  #  include <stdl
0160: 69 62 2e 68 3e 0a 23 65 6e 64 69 66 0a 23 69 66  ib.h>.#endif.#if
0170: 64 65 66 20 48 41 56 45 5f 55 4e 49 53 54 44 5f  def HAVE_UNISTD_
0180: 48 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 75 6e  H.#  include <un
0190: 69 73 74 64 2e 68 3e 0a 23 65 6e 64 69 66 0a 23  istd.h>.#endif.#
01a0: 69 66 64 65 66 20 48 41 56 45 5f 53 54 52 49 4e  ifdef HAVE_STRIN
01b0: 47 5f 48 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c  G_H.#  include <
01c0: 73 74 72 69 6e 67 2e 68 3e 0a 23 65 6e 64 69 66  string.h>.#endif
01d0: 0a 23 69 66 64 65 66 20 48 41 56 45 5f 50 54 48  .#ifdef HAVE_PTH
01e0: 52 45 41 44 5f 48 0a 23 20 20 69 6e 63 6c 75 64  READ_H.#  includ
01f0: 65 20 3c 70 74 68 72 65 61 64 2e 68 3e 0a 23 65  e <pthread.h>.#e
0200: 6e 64 69 66 0a 23 69 66 64 65 66 20 48 41 56 45  ndif.#ifdef HAVE
0210: 5f 4c 49 4d 49 54 53 5f 48 0a 23 20 20 69 6e 63  _LIMITS_H.#  inc
0220: 6c 75 64 65 20 3c 6c 69 6d 69 74 73 2e 68 3e 0a  lude <limits.h>.
0230: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 48 41  #endif.#ifdef HA
0240: 56 45 5f 53 54 44 49 4f 5f 48 0a 23 20 20 69 6e  VE_STDIO_H.#  in
0250: 63 6c 75 64 65 20 3c 73 74 64 69 6f 2e 68 3e 0a  clude <stdio.h>.
0260: 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 48  #endif.#define H
0270: 41 56 45 5f 45 52 52 4e 4f 5f 48 20 31 0a 23 69  AVE_ERRNO_H 1.#i
0280: 66 64 65 66 20 48 41 56 45 5f 45 52 52 4e 4f 5f  fdef HAVE_ERRNO_
0290: 48 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 65 72  H.#  include <er
02a0: 72 6e 6f 2e 68 3e 0a 23 65 6e 64 69 66 0a 23 69  rno.h>.#endif.#i
02b0: 66 64 65 66 20 48 41 56 45 5f 5a 4c 49 42 5f 48  fdef HAVE_ZLIB_H
02c0: 0a 23 20 20 69 66 64 65 66 20 48 41 56 45 5f 4c  .#  ifdef HAVE_L
02d0: 49 42 5a 0a 23 20 20 20 20 69 6e 63 6c 75 64 65  IBZ.#    include
02e0: 20 3c 7a 6c 69 62 2e 68 3e 0a 23 20 20 65 6e 64   <zlib.h>.#  end
02f0: 69 66 0a 23 65 6c 73 65 0a 23 20 20 69 66 64 65  if.#else.#  ifde
0300: 66 20 48 41 56 45 5f 4c 49 42 5a 0a 23 20 20 20  f HAVE_LIBZ.#   
0310: 20 75 6e 64 65 66 20 48 41 56 45 5f 4c 49 42 5a   undef HAVE_LIBZ
0320: 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69 66  .#  endif.#endif
0330: 0a 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f 44  .#ifdef CACKEY_D
0340: 45 42 55 47 5f 53 45 41 52 43 48 5f 53 50 45 45  EBUG_SEARCH_SPEE
0350: 44 54 45 53 54 0a 23 20 20 69 6e 63 6c 75 64 65  DTEST.#  include
0360: 20 3c 73 79 73 2f 74 69 6d 65 2e 68 3e 0a 23 65   <sys/time.h>.#e
0370: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 43 4b  ndif..#define CK
0380: 5f 50 54 52 20 2a 0a 23 64 65 66 69 6e 65 20 43  _PTR *.#define C
0390: 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
03a0: 4e 28 72 65 74 75 72 6e 54 79 70 65 2c 20 6e 61  N(returnType, na
03b0: 6d 65 29 20 72 65 74 75 72 6e 54 79 70 65 20 6e  me) returnType n
03c0: 61 6d 65 0a 23 64 65 66 69 6e 65 20 43 4b 5f 44  ame.#define CK_D
03d0: 45 43 4c 41 52 45 5f 46 55 4e 43 54 49 4f 4e 28  ECLARE_FUNCTION(
03e0: 72 65 74 75 72 6e 54 79 70 65 2c 20 6e 61 6d 65  returnType, name
03f0: 29 20 72 65 74 75 72 6e 54 79 70 65 20 6e 61 6d  ) returnType nam
0400: 65 0a 23 64 65 66 69 6e 65 20 43 4b 5f 44 45 43  e.#define CK_DEC
0410: 4c 41 52 45 5f 46 55 4e 43 54 49 4f 4e 5f 50 4f  LARE_FUNCTION_PO
0420: 49 4e 54 45 52 28 72 65 74 75 72 6e 54 79 70 65  INTER(returnType
0430: 2c 20 6e 61 6d 65 29 20 72 65 74 75 72 6e 54 79  , name) returnTy
0440: 70 65 20 28 2a 20 6e 61 6d 65 29 0a 23 64 65 66  pe (* name).#def
0450: 69 6e 65 20 43 4b 5f 43 41 4c 4c 42 41 43 4b 5f  ine CK_CALLBACK_
0460: 46 55 4e 43 54 49 4f 4e 28 72 65 74 75 72 6e 54  FUNCTION(returnT
0470: 79 70 65 2c 20 6e 61 6d 65 29 20 72 65 74 75 72  ype, name) retur
0480: 6e 54 79 70 65 20 28 2a 20 6e 61 6d 65 29 0a 23  nType (* name).#
0490: 69 66 6e 64 65 66 20 4e 55 4c 4c 5f 50 54 52 0a  ifndef NULL_PTR.
04a0: 23 20 20 64 65 66 69 6e 65 20 4e 55 4c 4c 5f 50  #  define NULL_P
04b0: 54 52 20 30 0a 23 65 6e 64 69 66 0a 0a 23 69 6e  TR 0.#endif..#in
04c0: 63 6c 75 64 65 20 22 70 6b 63 73 31 31 2e 68 22  clude "pkcs11.h"
04d0: 0a 23 69 6e 63 6c 75 64 65 20 22 70 6b 63 73 31  .#include "pkcs1
04e0: 31 6e 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22  1n.h".#include "
04f0: 61 73 6e 31 2d 78 35 30 39 2e 68 22 0a 23 69 6e  asn1-x509.h".#in
0500: 63 6c 75 64 65 20 22 73 68 61 31 2e 68 22 0a 23  clude "sha1.h".#
0510: 69 6e 63 6c 75 64 65 20 22 6d 64 35 2e 68 22 0a  include "md5.h".
0520: 0a 23 69 66 6e 64 65 66 20 43 41 43 4b 45 59 5f  .#ifndef CACKEY_
0530: 43 52 59 50 54 4f 4b 49 5f 56 45 52 53 49 4f 4e  CRYPTOKI_VERSION
0540: 5f 43 4f 44 45 0a 23 20 20 64 65 66 69 6e 65 20  _CODE.#  define 
0550: 43 41 43 4b 45 59 5f 43 52 59 50 54 4f 4b 49 5f  CACKEY_CRYPTOKI_
0560: 56 45 52 53 49 4f 4e 5f 43 4f 44 45 20 30 78 30  VERSION_CODE 0x0
0570: 32 31 65 30 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a  21e00.#endif../*
0580: 20 47 53 43 2d 49 53 20 76 32 2e 31 20 44 65 66   GSC-IS v2.1 Def
0590: 69 6e 69 74 69 6f 6e 73 20 2a 2f 0a 2f 2a 2a 20  initions */./** 
05a0: 43 6c 61 73 73 65 73 20 2a 2a 2f 0a 23 64 65 66  Classes **/.#def
05b0: 69 6e 65 20 47 53 43 49 53 5f 43 4c 41 53 53 5f  ine GSCIS_CLASS_
05c0: 49 53 4f 37 38 31 36 20 20 20 20 20 20 20 20 20  ISO7816         
05d0: 20 20 30 78 30 30 0a 23 64 65 66 69 6e 65 20 47    0x00.#define G
05e0: 53 43 49 53 5f 43 4c 41 53 53 5f 47 4c 4f 42 41  SCIS_CLASS_GLOBA
05f0: 4c 5f 50 4c 41 54 46 4f 52 4d 20 20 20 30 78 38  L_PLATFORM   0x8
0600: 30 0a 0a 2f 2a 2a 20 49 6e 73 74 72 75 63 74 69  0../** Instructi
0610: 6f 6e 73 20 2a 2a 2f 0a 23 64 65 66 69 6e 65 20  ons **/.#define 
0620: 47 53 43 49 53 5f 49 4e 53 54 52 5f 47 45 54 5f  GSCIS_INSTR_GET_
0630: 52 45 53 50 4f 4e 53 45 20 20 20 20 20 20 30 78  RESPONSE      0x
0640: 43 30 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53  C0.#define GSCIS
0650: 5f 49 4e 53 54 52 5f 52 45 41 44 5f 42 49 4e 41  _INSTR_READ_BINA
0660: 52 59 20 20 20 20 20 20 20 30 78 42 30 0a 23 64  RY       0xB0.#d
0670: 65 66 69 6e 65 20 47 53 43 49 53 5f 49 4e 53 54  efine GSCIS_INST
0680: 52 5f 55 50 44 41 54 45 5f 42 49 4e 41 52 59 20  R_UPDATE_BINARY 
0690: 20 20 20 20 30 78 44 36 0a 23 64 65 66 69 6e 65      0xD6.#define
06a0: 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 53 45 4c   GSCIS_INSTR_SEL
06b0: 45 43 54 20 20 20 20 20 20 20 20 20 20 20 20 30  ECT            0
06c0: 78 41 34 0a 23 64 65 66 69 6e 65 20 47 53 43 49  xA4.#define GSCI
06d0: 53 5f 49 4e 53 54 52 5f 45 58 54 45 52 4e 41 4c  S_INSTR_EXTERNAL
06e0: 5f 41 55 54 48 20 20 20 20 20 30 78 38 32 0a 23  _AUTH     0x82.#
06f0: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 49 4e 53  define GSCIS_INS
0700: 54 52 5f 47 45 54 5f 43 48 41 4c 4c 45 4e 47 45  TR_GET_CHALLENGE
0710: 20 20 20 20 20 30 78 38 34 0a 23 64 65 66 69 6e       0x84.#defin
0720: 65 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 49 4e  e GSCIS_INSTR_IN
0730: 54 45 52 4e 41 4c 5f 41 55 54 48 20 20 20 20 20  TERNAL_AUTH     
0740: 30 78 38 38 0a 23 64 65 66 69 6e 65 20 47 53 43  0x88.#define GSC
0750: 49 53 5f 49 4e 53 54 52 5f 56 45 52 49 46 59 20  IS_INSTR_VERIFY 
0760: 20 20 20 20 20 20 20 20 20 20 20 30 78 32 30 0a             0x20.
0770: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 49 4e  #define GSCIS_IN
0780: 53 54 52 5f 43 48 41 4e 47 45 5f 52 45 46 45 52  STR_CHANGE_REFER
0790: 45 4e 43 45 20 20 30 78 32 34 0a 23 64 65 66 69  ENCE  0x24.#defi
07a0: 6e 65 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 53  ne GSCIS_INSTR_S
07b0: 49 47 4e 20 20 20 20 20 20 20 20 20 20 20 20 20  IGN             
07c0: 20 30 78 32 41 0a 23 64 65 66 69 6e 65 20 47 53   0x2A.#define GS
07d0: 43 49 53 5f 49 4e 53 54 52 5f 47 45 54 5f 50 52  CIS_INSTR_GET_PR
07e0: 4f 50 20 20 20 20 20 20 20 20 20 20 30 78 35 36  OP          0x56
07f0: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 49  .#define GSCIS_I
0800: 4e 53 54 52 5f 47 45 54 5f 41 43 52 20 20 20 20  NSTR_GET_ACR    
0810: 20 20 20 20 20 20 20 30 78 34 43 0a 23 64 65 66         0x4C.#def
0820: 69 6e 65 20 47 53 43 49 53 5f 49 4e 53 54 52 5f  ine GSCIS_INSTR_
0830: 52 45 41 44 5f 42 55 46 46 45 52 20 20 20 20 20  READ_BUFFER     
0840: 20 20 30 78 35 32 0a 23 64 65 66 69 6e 65 20 47    0x52.#define G
0850: 53 43 49 53 5f 49 4e 53 54 52 5f 53 49 47 4e 44  SCIS_INSTR_SIGND
0860: 45 43 52 59 50 54 20 20 20 20 20 20 20 30 78 34  ECRYPT       0x4
0870: 32 0a 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53  2..#define GSCIS
0880: 5f 50 41 52 41 4d 5f 53 45 4c 45 43 54 5f 41 50  _PARAM_SELECT_AP
0890: 50 4c 45 54 20 20 20 20 20 30 78 30 34 0a 0a 2f  PLET     0x04../
08a0: 2a 2a 20 54 61 67 73 20 2a 2a 2f 0a 2f 2a 2a 2a  ** Tags **/./***
08b0: 20 43 43 43 20 54 61 67 73 20 2a 2a 2a 2f 0a 23   CCC Tags ***/.#
08c0: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47  define GSCIS_TAG
08d0: 5f 43 41 52 44 49 44 20 20 20 20 20 20 20 20 20  _CARDID         
08e0: 20 20 20 20 20 30 78 46 30 0a 23 64 65 66 69 6e       0xF0.#defin
08f0: 65 20 47 53 43 49 53 5f 54 41 47 5f 43 43 43 5f  e GSCIS_TAG_CCC_
0900: 56 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20  VER             
0910: 30 78 46 31 0a 23 64 65 66 69 6e 65 20 47 53 43  0xF1.#define GSC
0920: 49 53 5f 54 41 47 5f 43 43 47 5f 56 45 52 20 20  IS_TAG_CCG_VER  
0930: 20 20 20 20 20 20 20 20 20 20 20 30 78 46 32 0a             0xF2.
0940: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
0950: 47 5f 43 41 52 44 55 52 4c 20 20 20 20 20 20 20  G_CARDURL       
0960: 20 20 20 20 20 20 30 78 46 33 0a 23 64 65 66 69        0xF3.#defi
0970: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 50 4b 43  ne GSCIS_TAG_PKC
0980: 53 31 35 20 20 20 20 20 20 20 20 20 20 20 20 20  S15             
0990: 20 30 78 46 34 0a 23 64 65 66 69 6e 65 20 47 53   0xF4.#define GS
09a0: 43 49 53 5f 54 41 47 5f 52 45 47 5f 44 41 54 41  CIS_TAG_REG_DATA
09b0: 5f 4d 4f 44 45 4c 20 20 20 20 20 20 30 78 46 35  _MODEL      0xF5
09c0: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54  .#define GSCIS_T
09d0: 41 47 5f 41 43 52 5f 54 41 42 4c 45 20 20 20 20  AG_ACR_TABLE    
09e0: 20 20 20 20 20 20 20 30 78 46 36 0a 23 64 65 66         0xF6.#def
09f0: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 43 41  ine GSCIS_TAG_CA
0a00: 52 44 5f 41 50 44 55 20 20 20 20 20 20 20 20 20  RD_APDU         
0a10: 20 20 30 78 46 37 0a 23 64 65 66 69 6e 65 20 47    0xF7.#define G
0a20: 53 43 49 53 5f 54 41 47 5f 52 45 44 49 52 45 43  SCIS_TAG_REDIREC
0a30: 54 49 4f 4e 20 20 20 20 20 20 20 20 20 30 78 46  TION         0xF
0a40: 41 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f  A.#define GSCIS_
0a50: 54 41 47 5f 43 54 20 20 20 20 20 20 20 20 20 20  TAG_CT          
0a60: 20 20 20 20 20 20 20 20 30 78 46 42 0a 23 64 65          0xFB.#de
0a70: 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 53  fine GSCIS_TAG_S
0a80: 54 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  T               
0a90: 20 20 20 30 78 46 43 0a 23 64 65 66 69 6e 65 20     0xFC.#define 
0aa0: 47 53 43 49 53 5f 54 41 47 5f 4e 45 58 54 43 43  GSCIS_TAG_NEXTCC
0ab0: 43 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78  C             0x
0ac0: 46 44 0a 0a 2f 2a 2a 2a 20 47 65 6e 65 72 61 6c  FD../*** General
0ad0: 20 2d 20 45 46 20 32 32 30 30 20 2a 2a 2a 2f 0a   - EF 2200 ***/.
0ae0: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
0af0: 47 5f 46 4e 41 4d 45 20 20 20 20 20 20 20 20 20  G_FNAME         
0b00: 20 20 20 20 20 20 30 78 30 31 0a 23 64 65 66 69        0x01.#defi
0b10: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 4d 4e 41  ne GSCIS_TAG_MNA
0b20: 4d 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ME              
0b30: 20 30 78 30 32 0a 23 64 65 66 69 6e 65 20 47 53   0x02.#define GS
0b40: 43 49 53 5f 54 41 47 5f 4c 4e 41 4d 45 20 20 20  CIS_TAG_LNAME   
0b50: 20 20 20 20 20 20 20 20 20 20 20 20 30 78 30 33              0x03
0b60: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54  .#define GSCIS_T
0b70: 41 47 5f 53 55 46 46 49 58 20 20 20 20 20 20 20  AG_SUFFIX       
0b80: 20 20 20 20 20 20 20 30 78 30 34 0a 23 64 65 66         0x04.#def
0b90: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 47 4f  ine GSCIS_TAG_GO
0ba0: 56 54 5f 41 47 45 4e 43 59 20 20 20 20 20 20 20  VT_AGENCY       
0bb0: 20 20 30 78 30 35 0a 23 64 65 66 69 6e 65 20 47    0x05.#define G
0bc0: 53 43 49 53 5f 54 41 47 5f 42 55 52 45 41 55 20  SCIS_TAG_BUREAU 
0bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78 30               0x0
0be0: 36 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f  6.#define GSCIS_
0bf0: 54 41 47 5f 42 55 52 45 41 55 5f 43 4f 44 45 20  TAG_BUREAU_CODE 
0c00: 20 20 20 20 20 20 20 20 30 78 30 37 0a 23 64 65          0x07.#de
0c10: 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 44  fine GSCIS_TAG_D
0c20: 45 50 54 5f 43 4f 44 45 20 20 20 20 20 20 20 20  EPT_CODE        
0c30: 20 20 20 30 78 30 38 0a 23 64 65 66 69 6e 65 20     0x08.#define 
0c40: 47 53 43 49 53 5f 54 41 47 5f 54 49 54 4c 45 20  GSCIS_TAG_TITLE 
0c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78                0x
0c60: 30 39 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53  09.#define GSCIS
0c70: 5f 54 41 47 5f 42 55 49 4c 44 49 4e 47 20 20 20  _TAG_BUILDING   
0c80: 20 20 20 20 20 20 20 20 20 30 78 31 30 0a 23 64           0x10.#d
0c90: 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f  efine GSCIS_TAG_
0ca0: 4f 46 46 49 43 45 5f 41 44 44 52 31 20 20 20 20  OFFICE_ADDR1    
0cb0: 20 20 20 20 30 78 31 31 0a 23 64 65 66 69 6e 65      0x11.#define
0cc0: 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43   GSCIS_TAG_OFFIC
0cd0: 45 5f 41 44 44 52 32 20 20 20 20 20 20 20 20 30  E_ADDR2        0
0ce0: 78 31 32 0a 23 64 65 66 69 6e 65 20 47 53 43 49  x12.#define GSCI
0cf0: 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 43 49 54  S_TAG_OFFICE_CIT
0d00: 59 20 20 20 20 20 20 20 20 20 30 78 31 33 0a 23  Y         0x13.#
0d10: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47  define GSCIS_TAG
0d20: 5f 4f 46 46 49 43 45 5f 53 54 41 54 45 20 20 20  _OFFICE_STATE   
0d30: 20 20 20 20 20 30 78 31 34 0a 23 64 65 66 69 6e       0x14.#defin
0d40: 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49  e GSCIS_TAG_OFFI
0d50: 43 45 5f 5a 49 50 20 20 20 20 20 20 20 20 20 20  CE_ZIP          
0d60: 30 78 31 35 0a 23 64 65 66 69 6e 65 20 47 53 43  0x15.#define GSC
0d70: 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 43 4f  IS_TAG_OFFICE_CO
0d80: 55 4e 54 52 59 20 20 20 20 20 20 30 78 31 36 0a  UNTRY      0x16.
0d90: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
0da0: 47 5f 4f 46 46 49 43 45 5f 50 48 4f 4e 45 20 20  G_OFFICE_PHONE  
0db0: 20 20 20 20 20 20 30 78 31 37 0a 23 64 65 66 69        0x17.#defi
0dc0: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46  ne GSCIS_TAG_OFF
0dd0: 49 43 45 5f 50 48 4f 4e 45 5f 45 58 54 20 20 20  ICE_PHONE_EXT   
0de0: 20 30 78 31 38 0a 23 64 65 66 69 6e 65 20 47 53   0x18.#define GS
0df0: 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 46  CIS_TAG_OFFICE_F
0e00: 41 58 20 20 20 20 20 20 20 20 20 20 30 78 31 39  AX          0x19
0e10: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54  .#define GSCIS_T
0e20: 41 47 5f 4f 46 46 49 43 45 5f 45 4d 41 49 4c 20  AG_OFFICE_EMAIL 
0e30: 20 20 20 20 20 20 20 30 78 31 41 0a 23 64 65 66         0x1A.#def
0e40: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46  ine GSCIS_TAG_OF
0e50: 46 49 43 45 5f 52 4f 4f 4d 20 20 20 20 20 20 20  FICE_ROOM       
0e60: 20 20 30 78 31 42 0a 23 64 65 66 69 6e 65 20 47    0x1B.#define G
0e70: 53 43 49 53 5f 54 41 47 5f 4e 4f 4e 47 4f 56 5f  SCIS_TAG_NONGOV_
0e80: 41 47 45 4e 43 59 20 20 20 20 20 20 20 30 78 31  AGENCY       0x1
0e90: 43 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f  C.#define GSCIS_
0ea0: 54 41 47 5f 53 53 4e 5f 44 45 53 49 47 4e 41 54  TAG_SSN_DESIGNAT
0eb0: 4f 52 20 20 20 20 20 20 30 78 31 44 0a 0a 2f 2a  OR      0x1D../*
0ec0: 2a 2a 20 50 49 49 20 2d 20 45 46 20 32 31 30 30  ** PII - EF 2100
0ed0: 20 2a 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 47 53   ***/.#define GS
0ee0: 43 49 53 5f 54 41 47 5f 53 53 4e 20 20 20 20 20  CIS_TAG_SSN     
0ef0: 20 20 20 20 20 20 20 20 20 20 20 20 30 78 32 30              0x20
0f00: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54  .#define GSCIS_T
0f10: 41 47 5f 44 4f 42 20 20 20 20 20 20 20 20 20 20  AG_DOB          
0f20: 20 20 20 20 20 20 20 30 78 32 31 0a 23 64 65 66         0x21.#def
0f30: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 47 45  ine GSCIS_TAG_GE
0f40: 4e 44 45 52 20 20 20 20 20 20 20 20 20 20 20 20  NDER            
0f50: 20 20 30 78 32 32 0a 0a 2f 2a 2a 2a 20 4c 6f 67    0x22../*** Log
0f60: 69 6e 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d  in Information -
0f70: 20 45 46 20 34 30 30 30 20 2a 2a 2a 2f 0a 23 64   EF 4000 ***/.#d
0f80: 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f  efine GSCIS_TAG_
0f90: 55 53 45 52 49 44 20 20 20 20 20 20 20 20 20 20  USERID          
0fa0: 20 20 20 20 30 78 34 30 0a 23 64 65 66 69 6e 65      0x40.#define
0fb0: 20 47 53 43 49 53 5f 54 41 47 5f 44 4f 4d 41 49   GSCIS_TAG_DOMAI
0fc0: 4e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30  N              0
0fd0: 78 34 31 0a 23 64 65 66 69 6e 65 20 47 53 43 49  x41.#define GSCI
0fe0: 53 5f 54 41 47 5f 50 41 53 53 57 4f 52 44 20 20  S_TAG_PASSWORD  
0ff0: 20 20 20 20 20 20 20 20 20 20 30 78 34 32 0a 0a            0x42..
1000: 2f 2a 2a 2a 20 43 61 72 64 20 49 6e 66 6f 72 6d  /*** Card Inform
1010: 61 74 69 6f 6e 20 2d 20 45 46 20 35 30 30 30 20  ation - EF 5000 
1020: 2a 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 47 53 43  ***/.#define GSC
1030: 49 53 5f 54 41 47 5f 49 53 53 55 45 52 49 44 20  IS_TAG_ISSUERID 
1040: 20 20 20 20 20 20 20 20 20 20 20 30 78 35 30 0a             0x50.
1050: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
1060: 47 5f 53 45 52 4e 4f 20 20 20 20 20 20 20 20 20  G_SERNO         
1070: 20 20 20 20 20 20 30 78 35 31 0a 23 64 65 66 69        0x51.#defi
1080: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 49 53 53  ne GSCIS_TAG_ISS
1090: 55 45 5f 44 41 54 45 20 20 20 20 20 20 20 20 20  UE_DATE         
10a0: 20 30 78 35 32 0a 23 64 65 66 69 6e 65 20 47 53   0x52.#define GS
10b0: 43 49 53 5f 54 41 47 5f 45 58 50 49 52 45 5f 44  CIS_TAG_EXPIRE_D
10c0: 41 54 45 20 20 20 20 20 20 20 20 20 30 78 35 33  ATE         0x53
10d0: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54  .#define GSCIS_T
10e0: 41 47 5f 43 41 52 44 5f 54 59 50 45 20 20 20 20  AG_CARD_TYPE    
10f0: 20 20 20 20 20 20 20 30 78 35 34 0a 23 64 65 66         0x54.#def
1100: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 53 45  ine GSCIS_TAG_SE
1110: 43 55 52 49 54 59 5f 43 4f 44 45 20 20 20 20 20  CURITY_CODE     
1120: 20 20 30 78 35 37 0a 23 64 65 66 69 6e 65 20 47    0x57.#define G
1130: 53 43 49 53 5f 54 41 47 5f 43 41 52 44 49 44 5f  SCIS_TAG_CARDID_
1140: 41 49 44 20 20 20 20 20 20 20 20 20 20 30 78 35  AID          0x5
1150: 38 0a 0a 2f 2a 2a 2a 20 50 49 56 20 43 6f 64 65  8../*** PIV Code
1160: 73 20 2a 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e  s ***/.#define N
1170: 49 53 54 53 50 38 30 30 5f 37 33 5f 33 5f 49 4e  ISTSP800_73_3_IN
1180: 53 54 52 5f 47 45 54 5f 44 41 54 41 20 30 78 43  STR_GET_DATA 0xC
1190: 42 0a 23 64 65 66 69 6e 65 20 4e 49 53 54 53 50  B.#define NISTSP
11a0: 38 30 30 5f 37 33 5f 33 5f 49 4e 53 54 52 5f 47  800_73_3_INSTR_G
11b0: 45 4e 41 55 54 48 20 20 30 78 38 37 0a 0a 2f 2a  ENAUTH  0x87../*
11c0: 2a 2a 20 50 4b 49 20 49 6e 66 6f 72 6d 61 74 69  ** PKI Informati
11d0: 6f 6e 20 2d 20 45 46 20 37 30 30 30 20 2a 2a 2a  on - EF 7000 ***
11e0: 2f 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f  /.#define GSCIS_
11f0: 54 41 47 5f 43 45 52 54 49 46 49 43 41 54 45 20  TAG_CERTIFICATE 
1200: 20 20 20 20 20 20 20 20 30 78 37 30 0a 23 64 65          0x70.#de
1210: 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 43  fine GSCIS_TAG_C
1220: 45 52 54 5f 49 53 53 55 45 5f 44 41 54 45 20 20  ERT_ISSUE_DATE  
1230: 20 20 20 30 78 37 31 0a 23 64 65 66 69 6e 65 20     0x71.#define 
1240: 47 53 43 49 53 5f 54 41 47 5f 43 45 52 54 5f 45  GSCIS_TAG_CERT_E
1250: 58 50 49 52 45 5f 44 41 54 45 20 20 20 20 30 78  XPIRE_DATE    0x
1260: 37 32 0a 0a 2f 2a 2a 20 41 70 70 6c 65 74 20 49  72../** Applet I
1270: 44 73 20 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 47  Ds **/.#define G
1280: 53 43 49 53 5f 41 49 44 5f 43 43 43 20 20 20 20  SCIS_AID_CCC    
1290: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78 41               0xA
12a0: 30 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30  0, 0x00, 0x00, 0
12b0: 78 30 31 2c 20 30 78 31 36 2c 20 30 78 44 42 2c  x01, 0x16, 0xDB,
12c0: 20 30 78 30 30 0a 23 64 65 66 69 6e 65 20 4e 49   0x00.#define NI
12d0: 53 54 53 50 38 30 30 5f 37 33 5f 33 5f 50 49 56  STSP800_73_3_PIV
12e0: 5f 41 49 44 20 20 20 20 20 20 20 20 30 78 41 30  _AID        0xA0
12f0: 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78  , 0x00, 0x00, 0x
1300: 30 33 2c 20 30 78 30 38 2c 20 30 78 30 30 2c 20  03, 0x08, 0x00, 
1310: 30 78 30 30 2c 20 30 78 31 30 2c 20 30 78 30 30  0x00, 0x10, 0x00
1320: 2c 20 30 78 30 31 2c 20 30 78 30 30 0a 0a 2f 2a  , 0x01, 0x00../*
1330: 20 50 49 56 20 49 44 73 20 2a 2f 0a 2f 2a 2a 20   PIV IDs */./** 
1340: 4b 65 79 20 49 64 65 6e 74 69 66 69 65 72 73 20  Key Identifiers 
1350: 28 4e 49 53 54 20 53 50 20 38 30 30 2d 37 38 2d  (NIST SP 800-78-
1360: 33 2c 20 54 61 62 6c 65 20 36 2d 31 20 2a 2a 2f  3, Table 6-1 **/
1370: 0a 23 64 65 66 69 6e 65 20 4e 49 53 54 53 50 38  .#define NISTSP8
1380: 30 30 5f 37 38 5f 33 5f 4b 45 59 5f 50 49 56 41  00_78_3_KEY_PIVA
1390: 55 54 48 20 20 20 30 78 39 41 0a 23 64 65 66 69  UTH   0x9A.#defi
13a0: 6e 65 20 4e 49 53 54 53 50 38 30 30 5f 37 38 5f  ne NISTSP800_78_
13b0: 33 5f 4b 45 59 5f 53 49 47 4e 41 54 55 52 45 20  3_KEY_SIGNATURE 
13c0: 30 78 39 43 0a 23 64 65 66 69 6e 65 20 4e 49 53  0x9C.#define NIS
13d0: 54 53 50 38 30 30 5f 37 38 5f 33 5f 4b 45 59 5f  TSP800_78_3_KEY_
13e0: 4b 45 59 4d 47 54 20 20 20 20 30 78 39 44 0a 23  KEYMGT    0x9D.#
13f0: 64 65 66 69 6e 65 20 4e 49 53 54 53 50 38 30 30  define NISTSP800
1400: 5f 37 38 5f 33 5f 4b 45 59 5f 43 41 52 44 41 55  _78_3_KEY_CARDAU
1410: 54 48 20 20 30 78 39 45 0a 0a 2f 2a 2a 20 41 6c  TH  0x9E../** Al
1420: 67 6f 72 69 74 68 6d 20 49 64 65 6e 74 69 66 69  gorithm Identifi
1430: 65 72 73 20 28 4e 49 53 54 20 53 50 20 38 30 30  ers (NIST SP 800
1440: 2d 37 38 2d 33 2c 20 54 61 62 6c 65 20 36 2d 32  -78-3, Table 6-2
1450: 20 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 49 53   **/.#define NIS
1460: 54 53 50 38 30 30 5f 37 38 5f 33 5f 41 4c 47 4f  TSP800_78_3_ALGO
1470: 5f 52 53 41 31 30 32 34 20 20 30 78 30 36 0a 23  _RSA1024  0x06.#
1480: 64 65 66 69 6e 65 20 4e 49 53 54 53 50 38 30 30  define NISTSP800
1490: 5f 37 38 5f 33 5f 41 4c 47 4f 5f 52 53 41 32 30  _78_3_ALGO_RSA20
14a0: 34 38 20 20 30 78 30 37 0a 0a 2f 2a 2a 20 4f 62  48  0x07../** Ob
14b0: 6a 65 63 74 20 49 64 65 6e 74 69 66 69 65 72 73  ject Identifiers
14c0: 20 28 4e 49 53 54 20 53 50 20 38 30 30 2d 37 33   (NIST SP 800-73
14d0: 2d 33 20 50 61 72 74 20 31 2c 20 54 61 62 6c 65  -3 Part 1, Table
14e0: 20 32 29 20 2a 2a 2f 0a 23 64 65 66 69 6e 65 20   2) **/.#define 
14f0: 4e 49 53 54 53 50 38 30 30 5f 37 33 5f 33 5f 4f  NISTSP800_73_3_O
1500: 49 44 5f 50 49 56 41 55 54 48 20 20 20 30 78 35  ID_PIVAUTH   0x5
1510: 46 2c 20 30 78 43 31 2c 20 30 78 30 35 0a 23 64  F, 0xC1, 0x05.#d
1520: 65 66 69 6e 65 20 4e 49 53 54 53 50 38 30 30 5f  efine NISTSP800_
1530: 37 33 5f 33 5f 4f 49 44 5f 53 49 47 4e 41 54 55  73_3_OID_SIGNATU
1540: 52 45 20 30 78 35 46 2c 20 30 78 43 31 2c 20 30  RE 0x5F, 0xC1, 0
1550: 78 30 41 0a 23 64 65 66 69 6e 65 20 4e 49 53 54  x0A.#define NIST
1560: 53 50 38 30 30 5f 37 33 5f 33 5f 4f 49 44 5f 4b  SP800_73_3_OID_K
1570: 45 59 4d 47 54 20 20 20 20 30 78 35 46 2c 20 30  EYMGT    0x5F, 0
1580: 78 43 31 2c 20 30 78 30 42 0a 23 64 65 66 69 6e  xC1, 0x0B.#defin
1590: 65 20 4e 49 53 54 53 50 38 30 30 5f 37 33 5f 33  e NISTSP800_73_3
15a0: 5f 4f 49 44 5f 43 41 52 44 41 55 54 48 20 20 30  _OID_CARDAUTH  0
15b0: 78 35 46 2c 20 30 78 43 31 2c 20 30 78 30 31 0a  x5F, 0xC1, 0x01.
15c0: 0a 2f 2a 20 4d 61 78 69 6d 75 6d 20 73 69 7a 65  ./* Maximum size
15d0: 20 6f 66 20 64 61 74 61 20 70 6f 72 74 69 6f 6e   of data portion
15e0: 20 6f 66 20 41 50 44 55 73 20 2a 2f 0a 2f 2a 2a   of APDUs */./**
15f0: 20 44 6f 20 6e 6f 74 20 73 65 74 20 74 68 69 73   Do not set this
1600: 20 61 62 6f 76 65 20 32 35 30 20 2a 2a 2f 0a 23   above 250 **/.#
1610: 64 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 41 50  define CACKEY_AP
1620: 44 55 5f 4d 54 55 20 20 20 20 20 20 20 20 20 20  DU_MTU          
1630: 20 20 20 20 20 32 35 30 0a 0a 2f 2a 20 41 54 52       250../* ATR
1640: 20 49 66 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c   If not availabl
1650: 65 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4d 41 58  e */.#ifndef MAX
1660: 5f 41 54 52 5f 53 49 5a 45 0a 23 64 65 66 69 6e  _ATR_SIZE.#defin
1670: 65 20 4d 41 58 5f 41 54 52 5f 53 49 5a 45 20 31  e MAX_ATR_SIZE 1
1680: 30 32 34 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64  024.#endif..#ifd
1690: 65 66 20 43 41 43 4b 45 59 5f 44 45 42 55 47 0a  ef CACKEY_DEBUG.
16a0: 23 20 20 69 66 64 65 66 20 48 41 56 45 5f 54 49  #  ifdef HAVE_TI
16b0: 4d 45 5f 48 0a 23 20 20 20 20 69 6e 63 6c 75 64  ME_H.#    includ
16c0: 65 20 3c 74 69 6d 65 2e 68 3e 0a 73 74 61 74 69  e <time.h>.stati
16d0: 63 20 74 69 6d 65 5f 74 20 63 61 63 6b 65 79 5f  c time_t cackey_
16e0: 64 65 62 75 67 5f 73 74 61 72 74 5f 74 69 6d 65  debug_start_time
16f0: 20 3d 20 30 3b 0a 73 74 61 74 69 63 20 75 6e 73   = 0;.static uns
1700: 69 67 6e 65 64 20 6c 6f 6e 67 20 43 41 43 4b 45  igned long CACKE
1710: 59 5f 44 45 42 55 47 5f 47 45 54 54 49 4d 45 28  Y_DEBUG_GETTIME(
1720: 76 6f 69 64 29 20 7b 0a 09 69 66 20 28 63 61 63  void) {..if (cac
1730: 6b 65 79 5f 64 65 62 75 67 5f 73 74 61 72 74 5f  key_debug_start_
1740: 74 69 6d 65 20 3d 3d 20 30 29 20 7b 0a 09 09 63  time == 0) {...c
1750: 61 63 6b 65 79 5f 64 65 62 75 67 5f 73 74 61 72  ackey_debug_star
1760: 74 5f 74 69 6d 65 20 3d 20 74 69 6d 65 28 4e 55  t_time = time(NU
1770: 4c 4c 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e  LL);..}...return
1780: 28 74 69 6d 65 28 4e 55 4c 4c 29 20 2d 20 63 61  (time(NULL) - ca
1790: 63 6b 65 79 5f 64 65 62 75 67 5f 73 74 61 72 74  ckey_debug_start
17a0: 5f 74 69 6d 65 29 3b 0a 7d 0a 23 20 20 65 6c 73  _time);.}.#  els
17b0: 65 0a 73 74 61 74 69 63 20 75 6e 73 69 67 6e 65  e.static unsigne
17c0: 64 20 6c 6f 6e 67 20 43 41 43 4b 45 59 5f 44 45  d long CACKEY_DE
17d0: 42 55 47 5f 47 45 54 54 49 4d 45 28 76 6f 69 64  BUG_GETTIME(void
17e0: 29 20 7b 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a  ) {..return(0);.
17f0: 7d 0a 23 20 20 65 6e 64 69 66 0a 0a 23 20 20 64  }.#  endif..#  d
1800: 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 44 45 42  efine CACKEY_DEB
1810: 55 47 5f 50 52 49 4e 54 46 28 78 2e 2e 2e 29 20  UG_PRINTF(x...) 
1820: 7b 20 5c 0a 09 73 74 61 74 69 63 20 63 68 61 72  { \..static char
1830: 20 62 75 66 5f 75 73 65 72 5b 34 30 39 36 5d 20   buf_user[4096] 
1840: 3d 20 7b 30 7d 3b 20 5c 0a 09 73 6e 70 72 69 6e  = {0}; \..snprin
1850: 74 66 28 62 75 66 5f 75 73 65 72 2c 20 73 69 7a  tf(buf_user, siz
1860: 65 6f 66 28 62 75 66 5f 75 73 65 72 29 2c 20 78  eof(buf_user), x
1870: 29 3b 20 5c 0a 09 62 75 66 5f 75 73 65 72 5b 73  ); \..buf_user[s
1880: 69 7a 65 6f 66 28 62 75 66 5f 75 73 65 72 29 20  izeof(buf_user) 
1890: 2d 20 31 5d 20 3d 20 27 5c 30 27 3b 20 5c 0a 09  - 1] = '\0'; \..
18a0: 66 70 72 69 6e 74 66 28 63 61 63 6b 65 79 5f 64  fprintf(cackey_d
18b0: 65 62 75 67 5f 66 64 28 29 2c 20 22 5b 25 6c 75  ebug_fd(), "[%lu
18c0: 5d 3a 20 25 73 28 29 3a 25 69 3a 20 25 73 5c 6e  ]: %s():%i: %s\n
18d0: 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ", CACKEY_DEBUG_
18e0: 47 45 54 54 49 4d 45 28 29 2c 20 5f 5f 66 75 6e  GETTIME(), __fun
18f0: 63 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f 5f 2c 20 62  c__, __LINE__, b
1900: 75 66 5f 75 73 65 72 29 3b 20 5c 0a 09 66 66 6c  uf_user); \..ffl
1910: 75 73 68 28 63 61 63 6b 65 79 5f 64 65 62 75 67  ush(cackey_debug
1920: 5f 66 64 28 29 29 3b 20 5c 0a 7d 0a 23 20 20 64  _fd()); \.}.#  d
1930: 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 44 45 42  efine CACKEY_DEB
1940: 55 47 5f 50 52 49 4e 54 42 55 46 28 66 2c 20 78  UG_PRINTBUF(f, x
1950: 2c 20 79 29 20 7b 20 5c 0a 09 73 74 61 74 69 63  , y) { \..static
1960: 20 63 68 61 72 20 62 75 66 5f 75 73 65 72 5b 34   char buf_user[4
1970: 30 39 36 5d 20 3d 20 7b 30 7d 2c 20 2a 62 75 66  096] = {0}, *buf
1980: 5f 75 73 65 72 5f 70 3b 20 5c 0a 09 75 6e 73 69  _user_p; \..unsi
1990: 67 6e 65 64 20 6c 6f 6e 67 20 62 75 66 5f 75 73  gned long buf_us
19a0: 65 72 5f 73 69 7a 65 3b 20 5c 0a 09 75 6e 73 69  er_size; \..unsi
19b0: 67 6e 65 64 20 63 68 61 72 20 2a 54 4d 50 42 55  gned char *TMPBU
19c0: 46 3b 20 5c 0a 09 75 6e 73 69 67 6e 65 64 20 6c  F; \..unsigned l
19d0: 6f 6e 67 20 69 64 78 3b 20 5c 0a 09 69 6e 74 20  ong idx; \..int 
19e0: 73 6e 70 72 69 6e 74 66 5f 72 65 74 3b 20 5c 0a  snprintf_ret; \.
19f0: 09 54 4d 50 42 55 46 20 3d 20 28 75 6e 73 69 67  .TMPBUF = (unsig
1a00: 6e 65 64 20 63 68 61 72 20 2a 29 20 28 78 29 3b  ned char *) (x);
1a10: 20 5c 0a 09 62 75 66 5f 75 73 65 72 5b 30 5d 20   \..buf_user[0] 
1a20: 3d 20 30 3b 20 5c 0a 09 62 75 66 5f 75 73 65 72  = 0; \..buf_user
1a30: 5f 70 20 3d 20 62 75 66 5f 75 73 65 72 3b 20 5c  _p = buf_user; \
1a40: 0a 09 62 75 66 5f 75 73 65 72 5f 73 69 7a 65 20  ..buf_user_size 
1a50: 3d 20 73 69 7a 65 6f 66 28 62 75 66 5f 75 73 65  = sizeof(buf_use
1a60: 72 29 3b 20 5c 0a 09 66 6f 72 20 28 69 64 78 20  r); \..for (idx 
1a70: 3d 20 31 3b 20 69 64 78 20 3c 20 28 79 29 3b 20  = 1; idx < (y); 
1a80: 69 64 78 2b 2b 29 20 7b 20 5c 0a 09 09 69 66 20  idx++) { \...if 
1a90: 28 62 75 66 5f 75 73 65 72 5f 73 69 7a 65 20 3c  (buf_user_size <
1aa0: 3d 20 30 29 20 7b 20 5c 0a 09 09 09 62 72 65 61  = 0) { \....brea
1ab0: 6b 3b 20 5c 0a 09 09 7d 3b 20 5c 0a 09 09 73 6e  k; \...}; \...sn
1ac0: 70 72 69 6e 74 66 5f 72 65 74 20 3d 20 73 6e 70  printf_ret = snp
1ad0: 72 69 6e 74 66 28 62 75 66 5f 75 73 65 72 5f 70  rintf(buf_user_p
1ae0: 2c 20 62 75 66 5f 75 73 65 72 5f 73 69 7a 65 2c  , buf_user_size,
1af0: 20 22 2c 20 25 30 32 78 22 2c 20 54 4d 50 42 55   ", %02x", TMPBU
1b00: 46 5b 69 64 78 5d 29 3b 20 5c 0a 09 09 69 66 20  F[idx]); \...if 
1b10: 28 73 6e 70 72 69 6e 74 66 5f 72 65 74 20 3c 3d  (snprintf_ret <=
1b20: 20 30 29 20 7b 20 5c 0a 09 09 09 62 72 65 61 6b   0) { \....break
1b30: 3b 20 5c 0a 09 09 7d 3b 20 5c 0a 09 09 62 75 66  ; \...}; \...buf
1b40: 5f 75 73 65 72 5f 70 20 2b 3d 20 73 6e 70 72 69  _user_p += snpri
1b50: 6e 74 66 5f 72 65 74 3b 20 5c 0a 09 09 62 75 66  ntf_ret; \...buf
1b60: 5f 75 73 65 72 5f 73 69 7a 65 20 2d 3d 20 73 6e  _user_size -= sn
1b70: 70 72 69 6e 74 66 5f 72 65 74 3b 20 5c 0a 09 7d  printf_ret; \..}
1b80: 3b 20 5c 0a 09 62 75 66 5f 75 73 65 72 5b 73 69  ; \..buf_user[si
1b90: 7a 65 6f 66 28 62 75 66 5f 75 73 65 72 29 20 2d  zeof(buf_user) -
1ba0: 20 31 5d 20 3d 20 27 5c 30 27 3b 20 5c 0a 09 66   1] = '\0'; \..f
1bb0: 70 72 69 6e 74 66 28 63 61 63 6b 65 79 5f 64 65  printf(cackey_de
1bc0: 62 75 67 5f 66 64 28 29 2c 20 22 5b 25 6c 75 5d  bug_fd(), "[%lu]
1bd0: 3a 20 25 73 28 29 3a 25 69 3a 20 25 73 20 20 28  : %s():%i: %s  (
1be0: 25 73 2f 25 6c 75 20 3d 20 7b 25 30 32 78 25 73  %s/%lu = {%02x%s
1bf0: 7d 29 5c 6e 22 2c 20 43 41 43 4b 45 59 5f 44 45  })\n", CACKEY_DE
1c00: 42 55 47 5f 47 45 54 54 49 4d 45 28 29 2c 20 5f  BUG_GETTIME(), _
1c10: 5f 66 75 6e 63 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f  _func__, __LINE_
1c20: 5f 2c 20 66 2c 20 23 78 2c 20 28 75 6e 73 69 67  _, f, #x, (unsig
1c30: 6e 65 64 20 6c 6f 6e 67 29 20 28 79 29 2c 20 54  ned long) (y), T
1c40: 4d 50 42 55 46 5b 30 5d 2c 20 62 75 66 5f 75 73  MPBUF[0], buf_us
1c50: 65 72 29 3b 20 5c 0a 09 66 66 6c 75 73 68 28 63  er); \..fflush(c
1c60: 61 63 6b 65 79 5f 64 65 62 75 67 5f 66 64 28 29  ackey_debug_fd()
1c70: 29 3b 20 5c 0a 7d 0a 23 20 20 64 65 66 69 6e 65  ); \.}.#  define
1c80: 20 66 72 65 65 28 78 29 20 7b 20 43 41 43 4b 45   free(x) { CACKE
1c90: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1ca0: 46 52 45 45 28 25 70 29 20 28 25 73 29 22 2c 20  FREE(%p) (%s)", 
1cb0: 28 76 6f 69 64 20 2a 29 20 78 2c 20 23 78 29 3b  (void *) x, #x);
1cc0: 20 66 72 65 65 28 78 29 3b 20 7d 0a 0a 73 74 61   free(x); }..sta
1cd0: 74 69 63 20 46 49 4c 45 20 2a 63 61 63 6b 65 79  tic FILE *cackey
1ce0: 5f 64 65 62 75 67 5f 66 64 28 76 6f 69 64 29 20  _debug_fd(void) 
1cf0: 7b 0a 09 73 74 61 74 69 63 20 46 49 4c 45 20 2a  {..static FILE *
1d00: 66 64 20 3d 20 4e 55 4c 4c 3b 0a 09 63 68 61 72  fd = NULL;..char
1d10: 20 2a 6c 6f 67 66 69 6c 65 3b 0a 0a 09 69 66 20   *logfile;...if 
1d20: 28 66 64 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  (fd != NULL) {..
1d30: 09 72 65 74 75 72 6e 28 66 64 29 3b 0a 09 7d 0a  .return(fd);..}.
1d40: 0a 09 2f 2a 0a 09 20 2a 20 4c 6f 67 20 74 6f 20  ../*.. * Log to 
1d50: 73 74 64 65 72 72 20 69 6e 69 74 69 61 6c 6c 79  stderr initially
1d60: 20 73 6f 20 77 65 20 63 61 6e 20 75 73 65 20 64   so we can use d
1d70: 65 62 75 67 67 69 6e 67 20 77 69 74 68 69 6e 0a  ebugging within.
1d80: 09 20 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f  . * this functio
1d90: 6e 20 77 69 74 68 6f 75 74 20 67 65 74 74 69 6e  n without gettin
1da0: 67 20 69 6e 74 6f 20 61 6e 20 69 6e 66 69 6e 69  g into an infini
1db0: 74 65 20 6c 6f 6f 70 0a 09 20 2a 2f 0a 09 66 64  te loop.. */..fd
1dc0: 20 3d 20 73 74 64 65 72 72 3b 0a 0a 09 6c 6f 67   = stderr;...log
1dd0: 66 69 6c 65 20 3d 20 67 65 74 65 6e 76 28 22 43  file = getenv("C
1de0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 4c 4f 47 46  ACKEY_DEBUG_LOGF
1df0: 49 4c 45 22 29 3b 0a 09 69 66 20 28 6c 6f 67 66  ILE");..if (logf
1e00: 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ile != NULL) {..
1e10: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1e20: 49 4e 54 46 28 22 46 6f 75 6e 64 20 65 6e 76 69  INTF("Found envi
1e30: 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65  ronment variable
1e40: 3a 20 25 73 22 2c 20 6c 6f 67 66 69 6c 65 29 3b  : %s", logfile);
1e50: 0a 0a 09 09 6c 6f 67 66 69 6c 65 20 3d 20 73 74  ....logfile = st
1e60: 72 63 68 72 28 6c 6f 67 66 69 6c 65 2c 20 27 3d  rchr(logfile, '=
1e70: 27 29 3b 0a 09 09 69 66 20 28 6c 6f 67 66 69 6c  ');...if (logfil
1e80: 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09  e == NULL) {....
1e90: 6c 6f 67 66 69 6c 65 20 3d 20 67 65 74 65 6e 76  logfile = getenv
1ea0: 28 22 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 4c  ("CACKEY_DEBUG_L
1eb0: 4f 47 46 49 4c 45 22 29 3b 0a 09 09 7d 20 65 6c  OGFILE");...} el
1ec0: 73 65 20 7b 0a 09 09 09 6c 6f 67 66 69 6c 65 2b  se {....logfile+
1ed0: 2b 3b 0a 09 09 7d 0a 09 7d 0a 0a 23 69 66 64 65  +;...}..}..#ifde
1ee0: 66 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 4c  f CACKEY_DEBUG_L
1ef0: 4f 47 46 49 4c 45 0a 09 69 66 20 28 6c 6f 67 66  OGFILE..if (logf
1f00: 69 6c 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ile == NULL) {..
1f10: 09 6c 6f 67 66 69 6c 65 20 3d 20 43 41 43 4b 45  .logfile = CACKE
1f20: 59 5f 44 45 42 55 47 5f 4c 4f 47 46 49 4c 45 3b  Y_DEBUG_LOGFILE;
1f30: 0a 09 7d 0a 23 65 6e 64 69 66 0a 0a 09 69 66 20  ..}.#endif...if 
1f40: 28 6c 6f 67 66 69 6c 65 20 21 3d 20 4e 55 4c 4c  (logfile != NULL
1f50: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1f60: 55 47 5f 50 52 49 4e 54 46 28 22 46 6f 75 6e 64  UG_PRINTF("Found
1f70: 20 6c 6f 67 20 66 69 6c 65 3a 20 25 73 22 2c 20   log file: %s", 
1f80: 6c 6f 67 66 69 6c 65 29 3b 0a 0a 09 09 66 64 20  logfile);....fd 
1f90: 3d 20 66 6f 70 65 6e 28 6c 6f 67 66 69 6c 65 2c  = fopen(logfile,
1fa0: 20 22 61 22 29 3b 0a 09 7d 0a 0a 09 69 66 20 28   "a");..}...if (
1fb0: 66 64 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  fd == NULL) {...
1fc0: 66 64 20 3d 20 73 74 64 65 72 72 3b 0a 09 7d 0a  fd = stderr;..}.
1fd0: 0a 09 69 66 20 28 66 64 20 3d 3d 20 73 74 64 65  ..if (fd == stde
1fe0: 72 72 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  rr) {...CACKEY_D
1ff0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
2000: 75 72 6e 69 6e 67 20 73 74 64 65 72 72 22 29 3b  urning stderr");
2010: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 43 41 43  ..} else {...CAC
2020: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2030: 28 22 52 65 74 75 72 6e 69 6e 67 20 25 70 22 2c  ("Returning %p",
2040: 20 28 76 6f 69 64 20 2a 29 20 66 64 29 3b 0a 09   (void *) fd);..
2050: 7d 0a 0a 09 72 65 74 75 72 6e 28 66 64 29 3b 0a  }...return(fd);.
2060: 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a  }..static void *
2070: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e  CACKEY_DEBUG_FUN
2080: 43 5f 4d 41 4c 4c 4f 43 28 73 69 7a 65 5f 74 20  C_MALLOC(size_t 
2090: 73 69 7a 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  size, const char
20a0: 20 2a 66 75 6e 63 2c 20 69 6e 74 20 6c 69 6e 65   *func, int line
20b0: 29 20 7b 0a 09 76 6f 69 64 20 2a 72 65 74 76 61  ) {..void *retva
20c0: 6c 3b 0a 0a 09 72 65 74 76 61 6c 20 3d 20 6d 61  l;...retval = ma
20d0: 6c 6c 6f 63 28 73 69 7a 65 29 3b 0a 0a 09 66 70  lloc(size);...fp
20e0: 72 69 6e 74 66 28 63 61 63 6b 65 79 5f 64 65 62  rintf(cackey_deb
20f0: 75 67 5f 66 64 28 29 2c 20 22 5b 25 6c 75 5d 3a  ug_fd(), "[%lu]:
2100: 20 25 73 28 29 3a 25 69 3a 20 4d 41 4c 4c 4f 43   %s():%i: MALLOC
2110: 28 29 20 3d 20 25 70 5c 6e 22 2c 20 43 41 43 4b  () = %p\n", CACK
2120: 45 59 5f 44 45 42 55 47 5f 47 45 54 54 49 4d 45  EY_DEBUG_GETTIME
2130: 28 29 2c 20 66 75 6e 63 2c 20 6c 69 6e 65 2c 20  (), func, line, 
2140: 72 65 74 76 61 6c 29 3b 0a 09 66 66 6c 75 73 68  retval);..fflush
2150: 28 63 61 63 6b 65 79 5f 64 65 62 75 67 5f 66 64  (cackey_debug_fd
2160: 28 29 29 3b 0a 0a 09 72 65 74 75 72 6e 28 72 65  ());...return(re
2170: 74 76 61 6c 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  tval);.}..static
2180: 20 76 6f 69 64 20 2a 43 41 43 4b 45 59 5f 44 45   void *CACKEY_DE
2190: 42 55 47 5f 46 55 4e 43 5f 52 45 41 4c 4c 4f 43  BUG_FUNC_REALLOC
21a0: 28 76 6f 69 64 20 2a 70 74 72 2c 20 73 69 7a 65  (void *ptr, size
21b0: 5f 74 20 73 69 7a 65 2c 20 63 6f 6e 73 74 20 63  _t size, const c
21c0: 68 61 72 20 2a 66 75 6e 63 2c 20 69 6e 74 20 6c  har *func, int l
21d0: 69 6e 65 29 20 7b 0a 09 76 6f 69 64 20 2a 72 65  ine) {..void *re
21e0: 74 76 61 6c 3b 0a 0a 09 72 65 74 76 61 6c 20 3d  tval;...retval =
21f0: 20 72 65 61 6c 6c 6f 63 28 70 74 72 2c 20 73 69   realloc(ptr, si
2200: 7a 65 29 3b 0a 0a 09 69 66 20 28 72 65 74 76 61  ze);...if (retva
2210: 6c 20 21 3d 20 70 74 72 29 20 7b 0a 09 09 66 70  l != ptr) {...fp
2220: 72 69 6e 74 66 28 63 61 63 6b 65 79 5f 64 65 62  rintf(cackey_deb
2230: 75 67 5f 66 64 28 29 2c 20 22 5b 25 6c 75 5d 3a  ug_fd(), "[%lu]:
2240: 20 25 73 28 29 3a 25 69 3a 20 52 45 41 4c 4c 4f   %s():%i: REALLO
2250: 43 28 25 70 29 20 3d 20 25 70 5c 6e 22 2c 20 43  C(%p) = %p\n", C
2260: 41 43 4b 45 59 5f 44 45 42 55 47 5f 47 45 54 54  ACKEY_DEBUG_GETT
2270: 49 4d 45 28 29 2c 20 66 75 6e 63 2c 20 6c 69 6e  IME(), func, lin
2280: 65 2c 20 70 74 72 2c 20 72 65 74 76 61 6c 29 3b  e, ptr, retval);
2290: 0a 09 09 66 66 6c 75 73 68 28 63 61 63 6b 65 79  ...fflush(cackey
22a0: 5f 64 65 62 75 67 5f 66 64 28 29 29 3b 0a 09 7d  _debug_fd());..}
22b0: 0a 0a 09 69 66 20 28 72 65 74 76 61 6c 20 3d 3d  ...if (retval ==
22c0: 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
22d0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
22e0: 20 2a 2a 2a 20 45 52 52 4f 52 20 2a 2a 2a 20 72   *** ERROR *** r
22f0: 65 61 6c 6c 6f 63 20 72 65 74 75 72 6e 65 64 20  ealloc returned 
2300: 4e 55 4c 4c 20 28 73 69 7a 65 20 3d 20 25 6c 75  NULL (size = %lu
2310: 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  )", (unsigned lo
2320: 6e 67 29 20 73 69 7a 65 29 3b 0a 09 7d 0a 0a 09  ng) size);..}...
2330: 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a  return(retval);.
2340: 7d 0a 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  }..static char *
2350: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e  CACKEY_DEBUG_FUN
2360: 43 5f 53 54 52 44 55 50 28 63 6f 6e 73 74 20 63  C_STRDUP(const c
2370: 68 61 72 20 2a 70 74 72 2c 20 63 6f 6e 73 74 20  har *ptr, const 
2380: 63 68 61 72 20 2a 66 75 6e 63 2c 20 69 6e 74 20  char *func, int 
2390: 6c 69 6e 65 29 20 7b 0a 09 63 68 61 72 20 2a 72  line) {..char *r
23a0: 65 74 76 61 6c 3b 0a 0a 09 72 65 74 76 61 6c 20  etval;...retval 
23b0: 3d 20 73 74 72 64 75 70 28 70 74 72 29 3b 0a 0a  = strdup(ptr);..
23c0: 09 66 70 72 69 6e 74 66 28 63 61 63 6b 65 79 5f  .fprintf(cackey_
23d0: 64 65 62 75 67 5f 66 64 28 29 2c 20 22 5b 25 6c  debug_fd(), "[%l
23e0: 75 5d 3a 20 25 73 28 29 3a 25 69 3a 20 53 54 52  u]: %s():%i: STR
23f0: 44 55 50 5f 4d 41 4c 4c 4f 43 28 29 20 3d 20 25  DUP_MALLOC() = %
2400: 70 5c 6e 22 2c 20 43 41 43 4b 45 59 5f 44 45 42  p\n", CACKEY_DEB
2410: 55 47 5f 47 45 54 54 49 4d 45 28 29 2c 20 66 75  UG_GETTIME(), fu
2420: 6e 63 2c 20 6c 69 6e 65 2c 20 72 65 74 76 61 6c  nc, line, retval
2430: 29 3b 0a 09 66 66 6c 75 73 68 28 63 61 63 6b 65  );..fflush(cacke
2440: 79 5f 64 65 62 75 67 5f 66 64 28 29 29 3b 0a 0a  y_debug_fd());..
2450: 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b  .return(retval);
2460: 0a 7d 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .}..static const
2470: 20 63 68 61 72 20 2a 43 41 43 4b 45 59 5f 44 45   char *CACKEY_DE
2480: 42 55 47 5f 46 55 4e 43 5f 54 41 47 5f 54 4f 5f  BUG_FUNC_TAG_TO_
2490: 53 54 52 28 75 6e 73 69 67 6e 65 64 20 63 68 61  STR(unsigned cha
24a0: 72 20 74 61 67 29 20 7b 0a 09 73 77 69 74 63 68  r tag) {..switch
24b0: 20 28 74 61 67 29 20 7b 0a 09 09 63 61 73 65 20   (tag) {...case 
24c0: 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44 49 44  GSCIS_TAG_CARDID
24d0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
24e0: 49 53 5f 54 41 47 5f 43 41 52 44 49 44 22 29 3b  IS_TAG_CARDID");
24f0: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
2500: 47 5f 43 43 43 5f 56 45 52 3a 0a 09 09 09 72 65  G_CCC_VER:....re
2510: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
2520: 43 43 43 5f 56 45 52 22 29 3b 0a 09 09 63 61 73  CCC_VER");...cas
2530: 65 20 47 53 43 49 53 5f 54 41 47 5f 43 43 47 5f  e GSCIS_TAG_CCG_
2540: 56 45 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  VER:....return("
2550: 47 53 43 49 53 5f 54 41 47 5f 43 43 47 5f 56 45  GSCIS_TAG_CCG_VE
2560: 52 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  R");...case GSCI
2570: 53 5f 54 41 47 5f 43 41 52 44 55 52 4c 3a 0a 09  S_TAG_CARDURL:..
2580: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
2590: 54 41 47 5f 43 41 52 44 55 52 4c 22 29 3b 0a 09  TAG_CARDURL");..
25a0: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
25b0: 50 4b 43 53 31 35 3a 0a 09 09 09 72 65 74 75 72  PKCS15:....retur
25c0: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 50 4b 43  n("GSCIS_TAG_PKC
25d0: 53 31 35 22 29 3b 0a 09 09 63 61 73 65 20 47 53  S15");...case GS
25e0: 43 49 53 5f 54 41 47 5f 52 45 47 5f 44 41 54 41  CIS_TAG_REG_DATA
25f0: 5f 4d 4f 44 45 4c 3a 0a 09 09 09 72 65 74 75 72  _MODEL:....retur
2600: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 52 45 47  n("GSCIS_TAG_REG
2610: 5f 44 41 54 41 5f 4d 4f 44 45 4c 22 29 3b 0a 09  _DATA_MODEL");..
2620: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
2630: 41 43 52 5f 54 41 42 4c 45 3a 0a 09 09 09 72 65  ACR_TABLE:....re
2640: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
2650: 41 43 52 5f 54 41 42 4c 45 22 29 3b 0a 09 09 63  ACR_TABLE");...c
2660: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43 41  ase GSCIS_TAG_CA
2670: 52 44 5f 41 50 44 55 3a 0a 09 09 09 72 65 74 75  RD_APDU:....retu
2680: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 43 41  rn("GSCIS_TAG_CA
2690: 52 44 5f 41 50 44 55 22 29 3b 0a 09 09 63 61 73  RD_APDU");...cas
26a0: 65 20 47 53 43 49 53 5f 54 41 47 5f 52 45 44 49  e GSCIS_TAG_REDI
26b0: 52 45 43 54 49 4f 4e 3a 0a 09 09 09 72 65 74 75  RECTION:....retu
26c0: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 52 45  rn("GSCIS_TAG_RE
26d0: 44 49 52 45 43 54 49 4f 4e 22 29 3b 0a 09 09 63  DIRECTION");...c
26e0: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43 54  ase GSCIS_TAG_CT
26f0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
2700: 49 53 5f 54 41 47 5f 43 54 22 29 3b 0a 09 09 63  IS_TAG_CT");...c
2710: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 53 54  ase GSCIS_TAG_ST
2720: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
2730: 49 53 5f 54 41 47 5f 53 54 22 29 3b 0a 09 09 63  IS_TAG_ST");...c
2740: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4e 45  ase GSCIS_TAG_NE
2750: 58 54 43 43 43 3a 0a 09 09 09 72 65 74 75 72 6e  XTCCC:....return
2760: 28 22 47 53 43 49 53 5f 54 41 47 5f 4e 45 58 54  ("GSCIS_TAG_NEXT
2770: 43 43 43 22 29 3b 0a 09 09 63 61 73 65 20 47 53  CCC");...case GS
2780: 43 49 53 5f 54 41 47 5f 46 4e 41 4d 45 3a 0a 09  CIS_TAG_FNAME:..
2790: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
27a0: 54 41 47 5f 46 4e 41 4d 45 22 29 3b 0a 09 09 63  TAG_FNAME");...c
27b0: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4d 4e  ase GSCIS_TAG_MN
27c0: 41 4d 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  AME:....return("
27d0: 47 53 43 49 53 5f 54 41 47 5f 4d 4e 41 4d 45 22  GSCIS_TAG_MNAME"
27e0: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
27f0: 54 41 47 5f 4c 4e 41 4d 45 3a 0a 09 09 09 72 65  TAG_LNAME:....re
2800: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
2810: 4c 4e 41 4d 45 22 29 3b 0a 09 09 63 61 73 65 20  LNAME");...case 
2820: 47 53 43 49 53 5f 54 41 47 5f 53 55 46 46 49 58  GSCIS_TAG_SUFFIX
2830: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
2840: 49 53 5f 54 41 47 5f 53 55 46 46 49 58 22 29 3b  IS_TAG_SUFFIX");
2850: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
2860: 47 5f 47 4f 56 54 5f 41 47 45 4e 43 59 3a 0a 09  G_GOVT_AGENCY:..
2870: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
2880: 54 41 47 5f 47 4f 56 54 5f 41 47 45 4e 43 59 22  TAG_GOVT_AGENCY"
2890: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
28a0: 54 41 47 5f 42 55 52 45 41 55 3a 0a 09 09 09 72  TAG_BUREAU:....r
28b0: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
28c0: 5f 42 55 52 45 41 55 22 29 3b 0a 09 09 63 61 73  _BUREAU");...cas
28d0: 65 20 47 53 43 49 53 5f 54 41 47 5f 42 55 52 45  e GSCIS_TAG_BURE
28e0: 41 55 5f 43 4f 44 45 3a 0a 09 09 09 72 65 74 75  AU_CODE:....retu
28f0: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 42 55  rn("GSCIS_TAG_BU
2900: 52 45 41 55 5f 43 4f 44 45 22 29 3b 0a 09 09 63  REAU_CODE");...c
2910: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 44 45  ase GSCIS_TAG_DE
2920: 50 54 5f 43 4f 44 45 3a 0a 09 09 09 72 65 74 75  PT_CODE:....retu
2930: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 44 45  rn("GSCIS_TAG_DE
2940: 50 54 5f 43 4f 44 45 22 29 3b 0a 09 09 63 61 73  PT_CODE");...cas
2950: 65 20 47 53 43 49 53 5f 54 41 47 5f 54 49 54 4c  e GSCIS_TAG_TITL
2960: 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  E:....return("GS
2970: 43 49 53 5f 54 41 47 5f 54 49 54 4c 45 22 29 3b  CIS_TAG_TITLE");
2980: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
2990: 47 5f 42 55 49 4c 44 49 4e 47 3a 0a 09 09 09 72  G_BUILDING:....r
29a0: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
29b0: 5f 42 55 49 4c 44 49 4e 47 22 29 3b 0a 09 09 63  _BUILDING");...c
29c0: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46  ase GSCIS_TAG_OF
29d0: 46 49 43 45 5f 41 44 44 52 31 3a 0a 09 09 09 72  FICE_ADDR1:....r
29e0: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
29f0: 5f 4f 46 46 49 43 45 5f 41 44 44 52 31 22 29 3b  _OFFICE_ADDR1");
2a00: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
2a10: 47 5f 4f 46 46 49 43 45 5f 41 44 44 52 32 3a 0a  G_OFFICE_ADDR2:.
2a20: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
2a30: 5f 54 41 47 5f 4f 46 46 49 43 45 5f 41 44 44 52  _TAG_OFFICE_ADDR
2a40: 32 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  2");...case GSCI
2a50: 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 43 49 54  S_TAG_OFFICE_CIT
2a60: 59 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  Y:....return("GS
2a70: 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 43  CIS_TAG_OFFICE_C
2a80: 49 54 59 22 29 3b 0a 09 09 63 61 73 65 20 47 53  ITY");...case GS
2a90: 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 53  CIS_TAG_OFFICE_S
2aa0: 54 41 54 45 3a 0a 09 09 09 72 65 74 75 72 6e 28  TATE:....return(
2ab0: 22 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43  "GSCIS_TAG_OFFIC
2ac0: 45 5f 53 54 41 54 45 22 29 3b 0a 09 09 63 61 73  E_STATE");...cas
2ad0: 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49  e GSCIS_TAG_OFFI
2ae0: 43 45 5f 5a 49 50 3a 0a 09 09 09 72 65 74 75 72  CE_ZIP:....retur
2af0: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4f 46 46  n("GSCIS_TAG_OFF
2b00: 49 43 45 5f 5a 49 50 22 29 3b 0a 09 09 63 61 73  ICE_ZIP");...cas
2b10: 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49  e GSCIS_TAG_OFFI
2b20: 43 45 5f 43 4f 55 4e 54 52 59 3a 0a 09 09 09 72  CE_COUNTRY:....r
2b30: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
2b40: 5f 4f 46 46 49 43 45 5f 43 4f 55 4e 54 52 59 22  _OFFICE_COUNTRY"
2b50: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
2b60: 54 41 47 5f 4f 46 46 49 43 45 5f 50 48 4f 4e 45  TAG_OFFICE_PHONE
2b70: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
2b80: 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 50 48  IS_TAG_OFFICE_PH
2b90: 4f 4e 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53  ONE");...case GS
2ba0: 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 50  CIS_TAG_OFFICE_P
2bb0: 48 4f 4e 45 5f 45 58 54 3a 0a 09 09 09 72 65 74  HONE_EXT:....ret
2bc0: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4f  urn("GSCIS_TAG_O
2bd0: 46 46 49 43 45 5f 50 48 4f 4e 45 5f 45 58 54 22  FFICE_PHONE_EXT"
2be0: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
2bf0: 54 41 47 5f 4f 46 46 49 43 45 5f 46 41 58 3a 0a  TAG_OFFICE_FAX:.
2c00: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
2c10: 5f 54 41 47 5f 4f 46 46 49 43 45 5f 46 41 58 22  _TAG_OFFICE_FAX"
2c20: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
2c30: 54 41 47 5f 4f 46 46 49 43 45 5f 45 4d 41 49 4c  TAG_OFFICE_EMAIL
2c40: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
2c50: 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 45 4d  IS_TAG_OFFICE_EM
2c60: 41 49 4c 22 29 3b 0a 09 09 63 61 73 65 20 47 53  AIL");...case GS
2c70: 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 52  CIS_TAG_OFFICE_R
2c80: 4f 4f 4d 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  OOM:....return("
2c90: 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45  GSCIS_TAG_OFFICE
2ca0: 5f 52 4f 4f 4d 22 29 3b 0a 09 09 63 61 73 65 20  _ROOM");...case 
2cb0: 47 53 43 49 53 5f 54 41 47 5f 4e 4f 4e 47 4f 56  GSCIS_TAG_NONGOV
2cc0: 5f 41 47 45 4e 43 59 3a 0a 09 09 09 72 65 74 75  _AGENCY:....retu
2cd0: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4e 4f  rn("GSCIS_TAG_NO
2ce0: 4e 47 4f 56 5f 41 47 45 4e 43 59 22 29 3b 0a 09  NGOV_AGENCY");..
2cf0: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
2d00: 53 53 4e 5f 44 45 53 49 47 4e 41 54 4f 52 3a 0a  SSN_DESIGNATOR:.
2d10: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
2d20: 5f 54 41 47 5f 53 53 4e 5f 44 45 53 49 47 4e 41  _TAG_SSN_DESIGNA
2d30: 54 4f 52 22 29 3b 0a 09 09 63 61 73 65 20 47 53  TOR");...case GS
2d40: 43 49 53 5f 54 41 47 5f 53 53 4e 3a 0a 09 09 09  CIS_TAG_SSN:....
2d50: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
2d60: 47 5f 53 53 4e 22 29 3b 0a 09 09 63 61 73 65 20  G_SSN");...case 
2d70: 47 53 43 49 53 5f 54 41 47 5f 44 4f 42 3a 0a 09  GSCIS_TAG_DOB:..
2d80: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
2d90: 54 41 47 5f 44 4f 42 22 29 3b 0a 09 09 63 61 73  TAG_DOB");...cas
2da0: 65 20 47 53 43 49 53 5f 54 41 47 5f 47 45 4e 44  e GSCIS_TAG_GEND
2db0: 45 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47  ER:....return("G
2dc0: 53 43 49 53 5f 54 41 47 5f 47 45 4e 44 45 52 22  SCIS_TAG_GENDER"
2dd0: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
2de0: 54 41 47 5f 55 53 45 52 49 44 3a 0a 09 09 09 72  TAG_USERID:....r
2df0: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
2e00: 5f 55 53 45 52 49 44 22 29 3b 0a 09 09 63 61 73  _USERID");...cas
2e10: 65 20 47 53 43 49 53 5f 54 41 47 5f 44 4f 4d 41  e GSCIS_TAG_DOMA
2e20: 49 4e 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47  IN:....return("G
2e30: 53 43 49 53 5f 54 41 47 5f 44 4f 4d 41 49 4e 22  SCIS_TAG_DOMAIN"
2e40: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
2e50: 54 41 47 5f 50 41 53 53 57 4f 52 44 3a 0a 09 09  TAG_PASSWORD:...
2e60: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
2e70: 41 47 5f 50 41 53 53 57 4f 52 44 22 29 3b 0a 09  AG_PASSWORD");..
2e80: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
2e90: 49 53 53 55 45 52 49 44 3a 0a 09 09 09 72 65 74  ISSUERID:....ret
2ea0: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 49  urn("GSCIS_TAG_I
2eb0: 53 53 55 45 52 49 44 22 29 3b 0a 09 09 63 61 73  SSUERID");...cas
2ec0: 65 20 47 53 43 49 53 5f 54 41 47 5f 53 45 52 4e  e GSCIS_TAG_SERN
2ed0: 4f 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  O:....return("GS
2ee0: 43 49 53 5f 54 41 47 5f 53 45 52 4e 4f 22 29 3b  CIS_TAG_SERNO");
2ef0: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
2f00: 47 5f 49 53 53 55 45 5f 44 41 54 45 3a 0a 09 09  G_ISSUE_DATE:...
2f10: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
2f20: 41 47 5f 49 53 53 55 45 5f 44 41 54 45 22 29 3b  AG_ISSUE_DATE");
2f30: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
2f40: 47 5f 45 58 50 49 52 45 5f 44 41 54 45 3a 0a 09  G_EXPIRE_DATE:..
2f50: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
2f60: 54 41 47 5f 45 58 50 49 52 45 5f 44 41 54 45 22  TAG_EXPIRE_DATE"
2f70: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
2f80: 54 41 47 5f 43 41 52 44 5f 54 59 50 45 3a 0a 09  TAG_CARD_TYPE:..
2f90: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
2fa0: 54 41 47 5f 43 41 52 44 5f 54 59 50 45 22 29 3b  TAG_CARD_TYPE");
2fb0: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
2fc0: 47 5f 53 45 43 55 52 49 54 59 5f 43 4f 44 45 3a  G_SECURITY_CODE:
2fd0: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49  ....return("GSCI
2fe0: 53 5f 54 41 47 5f 53 45 43 55 52 49 54 59 5f 43  S_TAG_SECURITY_C
2ff0: 4f 44 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53  ODE");...case GS
3000: 43 49 53 5f 54 41 47 5f 43 41 52 44 49 44 5f 41  CIS_TAG_CARDID_A
3010: 49 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47  ID:....return("G
3020: 53 43 49 53 5f 54 41 47 5f 43 41 52 44 49 44 5f  SCIS_TAG_CARDID_
3030: 41 49 44 22 29 3b 0a 09 09 63 61 73 65 20 47 53  AID");...case GS
3040: 43 49 53 5f 54 41 47 5f 43 45 52 54 49 46 49 43  CIS_TAG_CERTIFIC
3050: 41 54 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ATE:....return("
3060: 47 53 43 49 53 5f 54 41 47 5f 43 45 52 54 49 46  GSCIS_TAG_CERTIF
3070: 49 43 41 54 45 22 29 3b 0a 09 09 63 61 73 65 20  ICATE");...case 
3080: 47 53 43 49 53 5f 54 41 47 5f 43 45 52 54 5f 49  GSCIS_TAG_CERT_I
3090: 53 53 55 45 5f 44 41 54 45 3a 0a 09 09 09 72 65  SSUE_DATE:....re
30a0: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
30b0: 43 45 52 54 5f 49 53 53 55 45 5f 44 41 54 45 22  CERT_ISSUE_DATE"
30c0: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
30d0: 54 41 47 5f 43 45 52 54 5f 45 58 50 49 52 45 5f  TAG_CERT_EXPIRE_
30e0: 44 41 54 45 3a 0a 09 09 09 72 65 74 75 72 6e 28  DATE:....return(
30f0: 22 47 53 43 49 53 5f 54 41 47 5f 43 45 52 54 5f  "GSCIS_TAG_CERT_
3100: 45 58 50 49 52 45 5f 44 41 54 45 22 29 3b 0a 09  EXPIRE_DATE");..
3110: 7d 0a 0a 09 72 65 74 75 72 6e 28 22 55 4e 4b 4e  }...return("UNKN
3120: 4f 57 4e 22 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  OWN");.}..static
3130: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 43 41 43   const char *CAC
3140: 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53  KEY_DEBUG_FUNC_S
3150: 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 4c  CARDERR_TO_STR(L
3160: 4f 4e 47 20 72 65 74 63 6f 64 65 29 20 7b 0a 09  ONG retcode) {..
3170: 73 77 69 74 63 68 20 28 72 65 74 63 6f 64 65 29  switch (retcode)
3180: 20 7b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f   {...case SCARD_
3190: 53 5f 53 55 43 43 45 53 53 3a 0a 09 09 09 72 65  S_SUCCESS:....re
31a0: 74 75 72 6e 28 22 53 43 41 52 44 5f 53 5f 53 55  turn("SCARD_S_SU
31b0: 43 43 45 53 53 22 29 3b 0a 09 09 63 61 73 65 20  CCESS");...case 
31c0: 53 43 41 52 44 5f 45 5f 43 41 4e 43 45 4c 4c 45  SCARD_E_CANCELLE
31d0: 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43  D:....return("SC
31e0: 41 52 44 5f 45 5f 43 41 4e 43 45 4c 4c 45 44 22  ARD_E_CANCELLED"
31f0: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  );...case SCARD_
3200: 45 5f 43 41 4e 54 5f 44 49 53 50 4f 53 45 3a 0a  E_CANT_DISPOSE:.
3210: 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44  ...return("SCARD
3220: 5f 45 5f 43 41 4e 54 5f 44 49 53 50 4f 53 45 22  _E_CANT_DISPOSE"
3230: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  );...case SCARD_
3240: 45 5f 49 4e 53 55 46 46 49 43 49 45 4e 54 5f 42  E_INSUFFICIENT_B
3250: 55 46 46 45 52 3a 0a 09 09 09 72 65 74 75 72 6e  UFFER:....return
3260: 28 22 53 43 41 52 44 5f 45 5f 49 4e 53 55 46 46  ("SCARD_E_INSUFF
3270: 49 43 49 45 4e 54 5f 42 55 46 46 45 52 22 29 3b  ICIENT_BUFFER");
3280: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
3290: 49 4e 56 41 4c 49 44 5f 41 54 52 3a 0a 09 09 09  INVALID_ATR:....
32a0: 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f  return("SCARD_E_
32b0: 49 4e 56 41 4c 49 44 5f 41 54 52 22 29 3b 0a 09  INVALID_ATR");..
32c0: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 49 4e  .case SCARD_E_IN
32d0: 56 41 4c 49 44 5f 48 41 4e 44 4c 45 3a 0a 09 09  VALID_HANDLE:...
32e0: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45  .return("SCARD_E
32f0: 5f 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 22  _INVALID_HANDLE"
3300: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  );...case SCARD_
3310: 45 5f 49 4e 56 41 4c 49 44 5f 50 41 52 41 4d 45  E_INVALID_PARAME
3320: 54 45 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  TER:....return("
3330: 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f  SCARD_E_INVALID_
3340: 50 41 52 41 4d 45 54 45 52 22 29 3b 0a 09 09 63  PARAMETER");...c
3350: 61 73 65 20 53 43 41 52 44 5f 45 5f 49 4e 56 41  ase SCARD_E_INVA
3360: 4c 49 44 5f 54 41 52 47 45 54 3a 0a 09 09 09 72  LID_TARGET:....r
3370: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 49  eturn("SCARD_E_I
3380: 4e 56 41 4c 49 44 5f 54 41 52 47 45 54 22 29 3b  NVALID_TARGET");
3390: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
33a0: 49 4e 56 41 4c 49 44 5f 56 41 4c 55 45 3a 0a 09  INVALID_VALUE:..
33b0: 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f  ..return("SCARD_
33c0: 45 5f 49 4e 56 41 4c 49 44 5f 56 41 4c 55 45 22  E_INVALID_VALUE"
33d0: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  );...case SCARD_
33e0: 45 5f 4e 4f 5f 4d 45 4d 4f 52 59 3a 0a 09 09 09  E_NO_MEMORY:....
33f0: 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f  return("SCARD_E_
3400: 4e 4f 5f 4d 45 4d 4f 52 59 22 29 3b 0a 09 09 63  NO_MEMORY");...c
3410: 61 73 65 20 53 43 41 52 44 5f 45 5f 55 4e 4b 4e  ase SCARD_E_UNKN
3420: 4f 57 4e 5f 52 45 41 44 45 52 3a 0a 09 09 09 72  OWN_READER:....r
3430: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 55  eturn("SCARD_E_U
3440: 4e 4b 4e 4f 57 4e 5f 52 45 41 44 45 52 22 29 3b  NKNOWN_READER");
3450: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
3460: 54 49 4d 45 4f 55 54 3a 0a 09 09 09 72 65 74 75  TIMEOUT:....retu
3470: 72 6e 28 22 53 43 41 52 44 5f 45 5f 54 49 4d 45  rn("SCARD_E_TIME
3480: 4f 55 54 22 29 3b 0a 09 09 63 61 73 65 20 53 43  OUT");...case SC
3490: 41 52 44 5f 45 5f 53 48 41 52 49 4e 47 5f 56 49  ARD_E_SHARING_VI
34a0: 4f 4c 41 54 49 4f 4e 3a 0a 09 09 09 72 65 74 75  OLATION:....retu
34b0: 72 6e 28 22 53 43 41 52 44 5f 45 5f 53 48 41 52  rn("SCARD_E_SHAR
34c0: 49 4e 47 5f 56 49 4f 4c 41 54 49 4f 4e 22 29 3b  ING_VIOLATION");
34d0: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
34e0: 4e 4f 5f 53 4d 41 52 54 43 41 52 44 3a 0a 09 09  NO_SMARTCARD:...
34f0: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45  .return("SCARD_E
3500: 5f 4e 4f 5f 53 4d 41 52 54 43 41 52 44 22 29 3b  _NO_SMARTCARD");
3510: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
3520: 55 4e 4b 4e 4f 57 4e 5f 43 41 52 44 3a 0a 09 09  UNKNOWN_CARD:...
3530: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45  .return("SCARD_E
3540: 5f 55 4e 4b 4e 4f 57 4e 5f 43 41 52 44 22 29 3b  _UNKNOWN_CARD");
3550: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
3560: 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 3a 0a  PROTO_MISMATCH:.
3570: 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44  ...return("SCARD
3580: 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43  _E_PROTO_MISMATC
3590: 48 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52  H");...case SCAR
35a0: 44 5f 45 5f 4e 4f 54 5f 52 45 41 44 59 3a 0a 09  D_E_NOT_READY:..
35b0: 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f  ..return("SCARD_
35c0: 45 5f 4e 4f 54 5f 52 45 41 44 59 22 29 3b 0a 09  E_NOT_READY");..
35d0: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 53 59  .case SCARD_E_SY
35e0: 53 54 45 4d 5f 43 41 4e 43 45 4c 4c 45 44 3a 0a  STEM_CANCELLED:.
35f0: 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44  ...return("SCARD
3600: 5f 45 5f 53 59 53 54 45 4d 5f 43 41 4e 43 45 4c  _E_SYSTEM_CANCEL
3610: 4c 45 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43  LED");...case SC
3620: 41 52 44 5f 45 5f 4e 4f 54 5f 54 52 41 4e 53 41  ARD_E_NOT_TRANSA
3630: 43 54 45 44 3a 0a 09 09 09 72 65 74 75 72 6e 28  CTED:....return(
3640: 22 53 43 41 52 44 5f 45 5f 4e 4f 54 5f 54 52 41  "SCARD_E_NOT_TRA
3650: 4e 53 41 43 54 45 44 22 29 3b 0a 09 09 63 61 73  NSACTED");...cas
3660: 65 20 53 43 41 52 44 5f 45 5f 52 45 41 44 45 52  e SCARD_E_READER
3670: 5f 55 4e 41 56 41 49 4c 41 42 4c 45 3a 0a 09 09  _UNAVAILABLE:...
3680: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45  .return("SCARD_E
3690: 5f 52 45 41 44 45 52 5f 55 4e 41 56 41 49 4c 41  _READER_UNAVAILA
36a0: 42 4c 45 22 29 3b 0a 09 09 63 61 73 65 20 53 43  BLE");...case SC
36b0: 41 52 44 5f 57 5f 55 4e 53 55 50 50 4f 52 54 45  ARD_W_UNSUPPORTE
36c0: 44 5f 43 41 52 44 3a 0a 09 09 09 72 65 74 75 72  D_CARD:....retur
36d0: 6e 28 22 53 43 41 52 44 5f 57 5f 55 4e 53 55 50  n("SCARD_W_UNSUP
36e0: 50 4f 52 54 45 44 5f 43 41 52 44 22 29 3b 0a 09  PORTED_CARD");..
36f0: 09 63 61 73 65 20 53 43 41 52 44 5f 57 5f 55 4e  .case SCARD_W_UN
3700: 52 45 53 50 4f 4e 53 49 56 45 5f 43 41 52 44 3a  RESPONSIVE_CARD:
3710: 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52  ....return("SCAR
3720: 44 5f 57 5f 55 4e 52 45 53 50 4f 4e 53 49 56 45  D_W_UNRESPONSIVE
3730: 5f 43 41 52 44 22 29 3b 0a 09 09 63 61 73 65 20  _CARD");...case 
3740: 53 43 41 52 44 5f 57 5f 55 4e 50 4f 57 45 52 45  SCARD_W_UNPOWERE
3750: 44 5f 43 41 52 44 3a 0a 09 09 09 72 65 74 75 72  D_CARD:....retur
3760: 6e 28 22 53 43 41 52 44 5f 57 5f 55 4e 50 4f 57  n("SCARD_W_UNPOW
3770: 45 52 45 44 5f 43 41 52 44 22 29 3b 0a 09 09 63  ERED_CARD");...c
3780: 61 73 65 20 53 43 41 52 44 5f 57 5f 52 45 53 45  ase SCARD_W_RESE
3790: 54 5f 43 41 52 44 3a 0a 09 09 09 72 65 74 75 72  T_CARD:....retur
37a0: 6e 28 22 53 43 41 52 44 5f 57 5f 52 45 53 45 54  n("SCARD_W_RESET
37b0: 5f 43 41 52 44 22 29 3b 0a 09 09 63 61 73 65 20  _CARD");...case 
37c0: 53 43 41 52 44 5f 57 5f 52 45 4d 4f 56 45 44 5f  SCARD_W_REMOVED_
37d0: 43 41 52 44 3a 0a 09 09 09 72 65 74 75 72 6e 28  CARD:....return(
37e0: 22 53 43 41 52 44 5f 57 5f 52 45 4d 4f 56 45 44  "SCARD_W_REMOVED
37f0: 5f 43 41 52 44 22 29 3b 0a 09 09 63 61 73 65 20  _CARD");...case 
3800: 53 43 41 52 44 5f 45 5f 50 43 49 5f 54 4f 4f 5f  SCARD_E_PCI_TOO_
3810: 53 4d 41 4c 4c 3a 0a 09 09 09 72 65 74 75 72 6e  SMALL:....return
3820: 28 22 53 43 41 52 44 5f 45 5f 50 43 49 5f 54 4f  ("SCARD_E_PCI_TO
3830: 4f 5f 53 4d 41 4c 4c 22 29 3b 0a 09 09 63 61 73  O_SMALL");...cas
3840: 65 20 53 43 41 52 44 5f 45 5f 52 45 41 44 45 52  e SCARD_E_READER
3850: 5f 55 4e 53 55 50 50 4f 52 54 45 44 3a 0a 09 09  _UNSUPPORTED:...
3860: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45  .return("SCARD_E
3870: 5f 52 45 41 44 45 52 5f 55 4e 53 55 50 50 4f 52  _READER_UNSUPPOR
3880: 54 45 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43  TED");...case SC
3890: 41 52 44 5f 45 5f 44 55 50 4c 49 43 41 54 45 5f  ARD_E_DUPLICATE_
38a0: 52 45 41 44 45 52 3a 0a 09 09 09 72 65 74 75 72  READER:....retur
38b0: 6e 28 22 53 43 41 52 44 5f 45 5f 44 55 50 4c 49  n("SCARD_E_DUPLI
38c0: 43 41 54 45 5f 52 45 41 44 45 52 22 29 3b 0a 09  CATE_READER");..
38d0: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 43 41  .case SCARD_E_CA
38e0: 52 44 5f 55 4e 53 55 50 50 4f 52 54 45 44 3a 0a  RD_UNSUPPORTED:.
38f0: 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44  ...return("SCARD
3900: 5f 45 5f 43 41 52 44 5f 55 4e 53 55 50 50 4f 52  _E_CARD_UNSUPPOR
3910: 54 45 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43  TED");...case SC
3920: 41 52 44 5f 45 5f 4e 4f 5f 53 45 52 56 49 43 45  ARD_E_NO_SERVICE
3930: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41  :....return("SCA
3940: 52 44 5f 45 5f 4e 4f 5f 53 45 52 56 49 43 45 22  RD_E_NO_SERVICE"
3950: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  );...case SCARD_
3960: 45 5f 53 45 52 56 49 43 45 5f 53 54 4f 50 50 45  E_SERVICE_STOPPE
3970: 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43  D:....return("SC
3980: 41 52 44 5f 45 5f 53 45 52 56 49 43 45 5f 53 54  ARD_E_SERVICE_ST
3990: 4f 50 50 45 44 22 29 3b 0a 09 09 63 61 73 65 20  OPPED");...case 
39a0: 53 43 41 52 44 5f 45 5f 55 4e 53 55 50 50 4f 52  SCARD_E_UNSUPPOR
39b0: 54 45 44 5f 46 45 41 54 55 52 45 3a 0a 09 09 09  TED_FEATURE:....
39c0: 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f  return("SCARD_E_
39d0: 55 4e 53 55 50 50 4f 52 54 45 44 5f 46 45 41 54  UNSUPPORTED_FEAT
39e0: 55 52 45 22 29 3b 0a 23 69 66 64 65 66 20 53 43  URE");.#ifdef SC
39f0: 41 52 44 5f 57 5f 49 4e 53 45 52 54 45 44 5f 43  ARD_W_INSERTED_C
3a00: 41 52 44 0a 09 09 63 61 73 65 20 53 43 41 52 44  ARD...case SCARD
3a10: 5f 57 5f 49 4e 53 45 52 54 45 44 5f 43 41 52 44  _W_INSERTED_CARD
3a20: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41  :....return("SCA
3a30: 52 44 5f 57 5f 49 4e 53 45 52 54 45 44 5f 43 41  RD_W_INSERTED_CA
3a40: 52 44 22 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  RD");.#endif.#if
3a50: 64 65 66 20 53 43 41 52 44 5f 45 5f 4e 4f 5f 52  def SCARD_E_NO_R
3a60: 45 41 44 45 52 53 5f 41 56 41 49 4c 41 42 4c 45  EADERS_AVAILABLE
3a70: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
3a80: 4e 4f 5f 52 45 41 44 45 52 53 5f 41 56 41 49 4c  NO_READERS_AVAIL
3a90: 41 42 4c 45 3a 0a 09 09 09 72 65 74 75 72 6e 28  ABLE:....return(
3aa0: 22 53 43 41 52 44 5f 45 5f 4e 4f 5f 52 45 41 44  "SCARD_E_NO_READ
3ab0: 45 52 53 5f 41 56 41 49 4c 41 42 4c 45 22 29 3b  ERS_AVAILABLE");
3ac0: 0a 23 65 6e 64 69 66 0a 09 7d 0a 0a 09 72 65 74  .#endif..}...ret
3ad0: 75 72 6e 28 22 55 4e 4b 4e 4f 57 4e 22 29 3b 0a  urn("UNKNOWN");.
3ae0: 7d 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  }..static const 
3af0: 63 68 61 72 20 2a 43 41 43 4b 45 59 5f 44 45 42  char *CACKEY_DEB
3b00: 55 47 5f 46 55 4e 43 5f 4f 42 4a 49 44 5f 54 4f  UG_FUNC_OBJID_TO
3b10: 5f 53 54 52 28 75 69 6e 74 31 36 5f 74 20 6f 62  _STR(uint16_t ob
3b20: 6a 69 64 29 20 7b 0a 09 73 77 69 74 63 68 20 28  jid) {..switch (
3b30: 6f 62 6a 69 64 29 20 7b 0a 09 09 63 61 73 65 20  objid) {...case 
3b40: 30 78 32 30 30 30 3a 0a 09 09 09 72 65 74 75 72  0x2000:....retur
3b50: 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42  n("CACKEY_TLV_OB
3b60: 4a 49 44 5f 47 45 4e 45 52 41 4c 49 4e 46 4f 22  JID_GENERALINFO"
3b70: 29 3b 0a 09 09 63 61 73 65 20 30 78 32 31 30 30  );...case 0x2100
3b80: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43  :....return("CAC
3b90: 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 50 52  KEY_TLV_OBJID_PR
3ba0: 4f 50 45 52 53 4f 4e 41 4c 49 4e 46 4f 22 29 3b  OPERSONALINFO");
3bb0: 0a 09 09 63 61 73 65 20 30 78 33 30 30 30 3a 0a  ...case 0x3000:.
3bc0: 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45  ...return("CACKE
3bd0: 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 41 43 43 45  Y_TLV_OBJID_ACCE
3be0: 53 53 43 4f 4e 54 52 4f 4c 22 29 3b 0a 09 09 63  SSCONTROL");...c
3bf0: 61 73 65 20 30 78 34 30 30 30 3a 0a 09 09 09 72  ase 0x4000:....r
3c00: 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c  eturn("CACKEY_TL
3c10: 56 5f 4f 42 4a 49 44 5f 4c 4f 47 49 4e 22 29 3b  V_OBJID_LOGIN");
3c20: 0a 09 09 63 61 73 65 20 30 78 35 30 30 30 3a 0a  ...case 0x5000:.
3c30: 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45  ...return("CACKE
3c40: 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 52 44  Y_TLV_OBJID_CARD
3c50: 49 4e 46 4f 22 29 3b 0a 09 09 63 61 73 65 20 30  INFO");...case 0
3c60: 78 36 30 30 30 3a 0a 09 09 09 72 65 74 75 72 6e  x6000:....return
3c70: 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a  ("CACKEY_TLV_OBJ
3c80: 49 44 5f 42 49 4f 4d 45 54 52 49 43 53 22 29 3b  ID_BIOMETRICS");
3c90: 0a 09 09 63 61 73 65 20 30 78 37 30 30 30 3a 0a  ...case 0x7000:.
3ca0: 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45  ...return("CACKE
3cb0: 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 44 49 47 49  Y_TLV_OBJID_DIGI
3cc0: 54 41 4c 53 49 47 43 45 52 54 22 29 3b 0a 09 09  TALSIGCERT");...
3cd0: 63 61 73 65 20 30 78 30 32 30 30 3a 0a 09 09 09  case 0x0200:....
3ce0: 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54  return("CACKEY_T
3cf0: 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 50 45 52  LV_OBJID_CAC_PER
3d00: 53 4f 4e 22 29 3b 0a 09 09 63 61 73 65 20 30 78  SON");...case 0x
3d10: 30 32 30 32 3a 0a 09 09 09 72 65 74 75 72 6e 28  0202:....return(
3d20: 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49  "CACKEY_TLV_OBJI
3d30: 44 5f 43 41 43 5f 42 45 4e 45 46 49 54 53 22 29  D_CAC_BENEFITS")
3d40: 3b 0a 09 09 63 61 73 65 20 30 78 30 32 30 33 3a  ;...case 0x0203:
3d50: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b  ....return("CACK
3d60: 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43  EY_TLV_OBJID_CAC
3d70: 5f 4f 54 48 45 52 42 45 4e 45 46 49 54 53 22 29  _OTHERBENEFITS")
3d80: 3b 0a 09 09 63 61 73 65 20 30 78 30 32 30 31 3a  ;...case 0x0201:
3d90: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b  ....return("CACK
3da0: 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43  EY_TLV_OBJID_CAC
3db0: 5f 50 45 52 53 4f 4e 4e 45 4c 22 29 3b 0a 09 09  _PERSONNEL");...
3dc0: 63 61 73 65 20 30 78 30 32 46 45 3a 0a 09 09 09  case 0x02FE:....
3dd0: 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54  return("CACKEY_T
3de0: 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 50 4b 49  LV_OBJID_CAC_PKI
3df0: 43 45 52 54 22 29 3b 0a 09 7d 0a 09 0a 09 72 65  CERT");..}....re
3e00: 74 75 72 6e 28 22 55 4e 4b 4e 4f 57 4e 22 29 3b  turn("UNKNOWN");
3e10: 0a 7d 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .}..static const
3e20: 20 63 68 61 72 20 2a 43 41 43 4b 45 59 5f 44 45   char *CACKEY_DE
3e30: 42 55 47 5f 46 55 4e 43 5f 41 50 50 54 59 50 45  BUG_FUNC_APPTYPE
3e40: 5f 54 4f 5f 53 54 52 28 75 69 6e 74 38 5f 74 20  _TO_STR(uint8_t 
3e50: 61 70 70 74 79 70 65 29 20 7b 0a 09 73 77 69 74  apptype) {..swit
3e60: 63 68 20 28 61 70 70 74 79 70 65 29 20 7b 0a 09  ch (apptype) {..
3e70: 09 63 61 73 65 20 30 78 30 30 3a 0a 09 09 09 72  .case 0x00:....r
3e80: 65 74 75 72 6e 28 22 4e 4f 4e 45 22 29 3b 0a 09  eturn("NONE");..
3e90: 09 63 61 73 65 20 30 78 30 31 3a 0a 09 09 09 72  .case 0x01:....r
3ea0: 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c  eturn("CACKEY_TL
3eb0: 56 5f 41 50 50 5f 47 45 4e 45 52 49 43 22 29 3b  V_APP_GENERIC");
3ec0: 0a 09 09 63 61 73 65 20 30 78 30 32 3a 0a 09 09  ...case 0x02:...
3ed0: 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f  .return("CACKEY_
3ee0: 54 4c 56 5f 41 50 50 5f 53 4b 49 22 29 3b 0a 09  TLV_APP_SKI");..
3ef0: 09 63 61 73 65 20 30 78 30 33 3a 0a 09 09 09 72  .case 0x03:....r
3f00: 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c  eturn("CACKEY_TL
3f10: 56 5f 41 50 50 5f 47 45 4e 45 52 49 43 20 7c 20  V_APP_GENERIC | 
3f20: 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 53  CACKEY_TLV_APP_S
3f30: 4b 49 22 29 3b 0a 09 09 63 61 73 65 20 30 78 30  KI");...case 0x0
3f40: 34 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41  4:....return("CA
3f50: 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 50 4b 49  CKEY_TLV_APP_PKI
3f60: 22 29 3b 0a 09 09 63 61 73 65 20 30 78 30 35 3a  ");...case 0x05:
3f70: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b  ....return("CACK
3f80: 45 59 5f 54 4c 56 5f 41 50 50 5f 47 45 4e 45 52  EY_TLV_APP_GENER
3f90: 49 43 20 7c 20 43 41 43 4b 45 59 5f 54 4c 56 5f  IC | CACKEY_TLV_
3fa0: 41 50 50 5f 50 4b 49 22 29 3b 0a 09 09 63 61 73  APP_PKI");...cas
3fb0: 65 20 30 78 30 36 3a 0a 09 09 09 72 65 74 75 72  e 0x06:....retur
3fc0: 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50  n("CACKEY_TLV_AP
3fd0: 50 5f 53 4b 49 20 7c 20 43 41 43 4b 45 59 5f 54  P_SKI | CACKEY_T
3fe0: 4c 56 5f 41 50 50 5f 50 4b 49 22 29 3b 0a 09 09  LV_APP_PKI");...
3ff0: 63 61 73 65 20 30 78 30 37 3a 0a 09 09 09 72 65  case 0x07:....re
4000: 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56  turn("CACKEY_TLV
4010: 5f 41 50 50 5f 47 45 4e 45 52 49 43 20 7c 20 43  _APP_GENERIC | C
4020: 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 53 4b  ACKEY_TLV_APP_SK
4030: 49 20 7c 20 43 41 43 4b 45 59 5f 54 4c 56 5f 41  I | CACKEY_TLV_A
4040: 50 50 5f 50 4b 49 22 29 3b 0a 09 7d 0a 0a 09 72  PP_PKI");..}...r
4050: 65 74 75 72 6e 28 22 49 4e 56 41 4c 49 44 22 29  eturn("INVALID")
4060: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73  ;.}..static cons
4070: 74 20 63 68 61 72 20 2a 43 41 43 4b 45 59 5f 44  t char *CACKEY_D
4080: 45 42 55 47 5f 46 55 4e 43 5f 41 54 54 52 49 42  EBUG_FUNC_ATTRIB
4090: 55 54 45 5f 54 4f 5f 53 54 52 28 43 4b 5f 41 54  UTE_TO_STR(CK_AT
40a0: 54 52 49 42 55 54 45 5f 54 59 50 45 20 61 74 74  TRIBUTE_TYPE att
40b0: 72 29 20 7b 0a 09 73 77 69 74 63 68 20 28 61 74  r) {..switch (at
40c0: 74 72 29 20 7b 0a 09 09 63 61 73 65 20 43 4b 41  tr) {...case CKA
40d0: 5f 43 4c 41 53 53 3a 0a 09 09 09 72 65 74 75 72  _CLASS:....retur
40e0: 6e 28 22 43 4b 41 5f 43 4c 41 53 53 22 29 3b 0a  n("CKA_CLASS");.
40f0: 09 09 63 61 73 65 20 43 4b 41 5f 54 4f 4b 45 4e  ..case CKA_TOKEN
4100: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41  :....return("CKA
4110: 5f 54 4f 4b 45 4e 22 29 3b 0a 09 09 63 61 73 65  _TOKEN");...case
4120: 20 43 4b 41 5f 50 52 49 56 41 54 45 3a 0a 09 09   CKA_PRIVATE:...
4130: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 50 52 49  .return("CKA_PRI
4140: 56 41 54 45 22 29 3b 0a 09 09 63 61 73 65 20 43  VATE");...case C
4150: 4b 41 5f 4c 41 42 45 4c 3a 0a 09 09 09 72 65 74  KA_LABEL:....ret
4160: 75 72 6e 28 22 43 4b 41 5f 4c 41 42 45 4c 22 29  urn("CKA_LABEL")
4170: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 41 50 50  ;...case CKA_APP
4180: 4c 49 43 41 54 49 4f 4e 3a 0a 09 09 09 72 65 74  LICATION:....ret
4190: 75 72 6e 28 22 43 4b 41 5f 41 50 50 4c 49 43 41  urn("CKA_APPLICA
41a0: 54 49 4f 4e 22 29 3b 0a 09 09 63 61 73 65 20 43  TION");...case C
41b0: 4b 41 5f 56 41 4c 55 45 3a 0a 09 09 09 72 65 74  KA_VALUE:....ret
41c0: 75 72 6e 28 22 43 4b 41 5f 56 41 4c 55 45 22 29  urn("CKA_VALUE")
41d0: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 4f 42 4a  ;...case CKA_OBJ
41e0: 45 43 54 5f 49 44 3a 0a 09 09 09 72 65 74 75 72  ECT_ID:....retur
41f0: 6e 28 22 43 4b 41 5f 4f 42 4a 45 43 54 5f 49 44  n("CKA_OBJECT_ID
4200: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 43  ");...case CKA_C
4210: 45 52 54 49 46 49 43 41 54 45 5f 54 59 50 45 3a  ERTIFICATE_TYPE:
4220: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f  ....return("CKA_
4230: 43 45 52 54 49 46 49 43 41 54 45 5f 54 59 50 45  CERTIFICATE_TYPE
4240: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 49  ");...case CKA_I
4250: 53 53 55 45 52 3a 0a 09 09 09 72 65 74 75 72 6e  SSUER:....return
4260: 28 22 43 4b 41 5f 49 53 53 55 45 52 22 29 3b 0a  ("CKA_ISSUER");.
4270: 09 09 63 61 73 65 20 43 4b 41 5f 53 45 52 49 41  ..case CKA_SERIA
4280: 4c 5f 4e 55 4d 42 45 52 3a 0a 09 09 09 72 65 74  L_NUMBER:....ret
4290: 75 72 6e 28 22 43 4b 41 5f 53 45 52 49 41 4c 5f  urn("CKA_SERIAL_
42a0: 4e 55 4d 42 45 52 22 29 3b 0a 09 09 63 61 73 65  NUMBER");...case
42b0: 20 43 4b 41 5f 41 43 5f 49 53 53 55 45 52 3a 0a   CKA_AC_ISSUER:.
42c0: 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 41  ...return("CKA_A
42d0: 43 5f 49 53 53 55 45 52 22 29 3b 0a 09 09 63 61  C_ISSUER");...ca
42e0: 73 65 20 43 4b 41 5f 4f 57 4e 45 52 3a 0a 09 09  se CKA_OWNER:...
42f0: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 4f 57 4e  .return("CKA_OWN
4300: 45 52 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  ER");...case CKA
4310: 5f 41 54 54 52 5f 54 59 50 45 53 3a 0a 09 09 09  _ATTR_TYPES:....
4320: 72 65 74 75 72 6e 28 22 43 4b 41 5f 41 54 54 52  return("CKA_ATTR
4330: 5f 54 59 50 45 53 22 29 3b 0a 09 09 63 61 73 65  _TYPES");...case
4340: 20 43 4b 41 5f 54 52 55 53 54 45 44 3a 0a 09 09   CKA_TRUSTED:...
4350: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 54 52 55  .return("CKA_TRU
4360: 53 54 45 44 22 29 3b 0a 09 09 63 61 73 65 20 43  STED");...case C
4370: 4b 41 5f 4b 45 59 5f 54 59 50 45 3a 0a 09 09 09  KA_KEY_TYPE:....
4380: 72 65 74 75 72 6e 28 22 43 4b 41 5f 4b 45 59 5f  return("CKA_KEY_
4390: 54 59 50 45 22 29 3b 0a 09 09 63 61 73 65 20 43  TYPE");...case C
43a0: 4b 41 5f 53 55 42 4a 45 43 54 3a 0a 09 09 09 72  KA_SUBJECT:....r
43b0: 65 74 75 72 6e 28 22 43 4b 41 5f 53 55 42 4a 45  eturn("CKA_SUBJE
43c0: 43 54 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  CT");...case CKA
43d0: 5f 49 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  _ID:....return("
43e0: 43 4b 41 5f 49 44 22 29 3b 0a 09 09 63 61 73 65  CKA_ID");...case
43f0: 20 43 4b 41 5f 53 45 4e 53 49 54 49 56 45 3a 0a   CKA_SENSITIVE:.
4400: 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 53  ...return("CKA_S
4410: 45 4e 53 49 54 49 56 45 22 29 3b 0a 09 09 63 61  ENSITIVE");...ca
4420: 73 65 20 43 4b 41 5f 45 4e 43 52 59 50 54 3a 0a  se CKA_ENCRYPT:.
4430: 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 45  ...return("CKA_E
4440: 4e 43 52 59 50 54 22 29 3b 0a 09 09 63 61 73 65  NCRYPT");...case
4450: 20 43 4b 41 5f 44 45 43 52 59 50 54 3a 0a 09 09   CKA_DECRYPT:...
4460: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 44 45 43  .return("CKA_DEC
4470: 52 59 50 54 22 29 3b 0a 09 09 63 61 73 65 20 43  RYPT");...case C
4480: 4b 41 5f 57 52 41 50 3a 0a 09 09 09 72 65 74 75  KA_WRAP:....retu
4490: 72 6e 28 22 43 4b 41 5f 57 52 41 50 22 29 3b 0a  rn("CKA_WRAP");.
44a0: 09 09 63 61 73 65 20 43 4b 41 5f 55 4e 57 52 41  ..case CKA_UNWRA
44b0: 50 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b  P:....return("CK
44c0: 41 5f 55 4e 57 52 41 50 22 29 3b 0a 09 09 63 61  A_UNWRAP");...ca
44d0: 73 65 20 43 4b 41 5f 53 49 47 4e 3a 0a 09 09 09  se CKA_SIGN:....
44e0: 72 65 74 75 72 6e 28 22 43 4b 41 5f 53 49 47 4e  return("CKA_SIGN
44f0: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 53  ");...case CKA_S
4500: 49 47 4e 5f 52 45 43 4f 56 45 52 3a 0a 09 09 09  IGN_RECOVER:....
4510: 72 65 74 75 72 6e 28 22 43 4b 41 5f 53 49 47 4e  return("CKA_SIGN
4520: 5f 52 45 43 4f 56 45 52 22 29 3b 0a 09 09 63 61  _RECOVER");...ca
4530: 73 65 20 43 4b 41 5f 56 45 52 49 46 59 3a 0a 09  se CKA_VERIFY:..
4540: 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 56 45  ..return("CKA_VE
4550: 52 49 46 59 22 29 3b 0a 09 09 63 61 73 65 20 43  RIFY");...case C
4560: 4b 41 5f 56 45 52 49 46 59 5f 52 45 43 4f 56 45  KA_VERIFY_RECOVE
4570: 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b  R:....return("CK
4580: 41 5f 56 45 52 49 46 59 5f 52 45 43 4f 56 45 52  A_VERIFY_RECOVER
4590: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 44  ");...case CKA_D
45a0: 45 52 49 56 45 3a 0a 09 09 09 72 65 74 75 72 6e  ERIVE:....return
45b0: 28 22 43 4b 41 5f 44 45 52 49 56 45 22 29 3b 0a  ("CKA_DERIVE");.
45c0: 09 09 63 61 73 65 20 43 4b 41 5f 53 54 41 52 54  ..case CKA_START
45d0: 5f 44 41 54 45 3a 0a 09 09 09 72 65 74 75 72 6e  _DATE:....return
45e0: 28 22 43 4b 41 5f 53 54 41 52 54 5f 44 41 54 45  ("CKA_START_DATE
45f0: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 45  ");...case CKA_E
4600: 4e 44 5f 44 41 54 45 3a 0a 09 09 09 72 65 74 75  ND_DATE:....retu
4610: 72 6e 28 22 43 4b 41 5f 45 4e 44 5f 44 41 54 45  rn("CKA_END_DATE
4620: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 4d  ");...case CKA_M
4630: 4f 44 55 4c 55 53 3a 0a 09 09 09 72 65 74 75 72  ODULUS:....retur
4640: 6e 28 22 43 4b 41 5f 4d 4f 44 55 4c 55 53 22 29  n("CKA_MODULUS")
4650: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 4d 4f 44  ;...case CKA_MOD
4660: 55 4c 55 53 5f 42 49 54 53 3a 0a 09 09 09 72 65  ULUS_BITS:....re
4670: 74 75 72 6e 28 22 43 4b 41 5f 4d 4f 44 55 4c 55  turn("CKA_MODULU
4680: 53 5f 42 49 54 53 22 29 3b 0a 09 09 63 61 73 65  S_BITS");...case
4690: 20 43 4b 41 5f 50 55 42 4c 49 43 5f 45 58 50 4f   CKA_PUBLIC_EXPO
46a0: 4e 45 4e 54 3a 0a 09 09 09 72 65 74 75 72 6e 28  NENT:....return(
46b0: 22 43 4b 41 5f 50 55 42 4c 49 43 5f 45 58 50 4f  "CKA_PUBLIC_EXPO
46c0: 4e 45 4e 54 22 29 3b 0a 09 09 63 61 73 65 20 43  NENT");...case C
46d0: 4b 41 5f 50 52 49 56 41 54 45 5f 45 58 50 4f 4e  KA_PRIVATE_EXPON
46e0: 45 4e 54 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ENT:....return("
46f0: 43 4b 41 5f 50 52 49 56 41 54 45 5f 45 58 50 4f  CKA_PRIVATE_EXPO
4700: 4e 45 4e 54 22 29 3b 0a 09 09 63 61 73 65 20 43  NENT");...case C
4710: 4b 41 5f 50 52 49 4d 45 5f 31 3a 0a 09 09 09 72  KA_PRIME_1:....r
4720: 65 74 75 72 6e 28 22 43 4b 41 5f 50 52 49 4d 45  eturn("CKA_PRIME
4730: 5f 31 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  _1");...case CKA
4740: 5f 50 52 49 4d 45 5f 32 3a 0a 09 09 09 72 65 74  _PRIME_2:....ret
4750: 75 72 6e 28 22 43 4b 41 5f 50 52 49 4d 45 5f 32  urn("CKA_PRIME_2
4760: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 45  ");...case CKA_E
4770: 58 50 4f 4e 45 4e 54 5f 31 3a 0a 09 09 09 72 65  XPONENT_1:....re
4780: 74 75 72 6e 28 22 43 4b 41 5f 45 58 50 4f 4e 45  turn("CKA_EXPONE
4790: 4e 54 5f 31 22 29 3b 0a 09 09 63 61 73 65 20 43  NT_1");...case C
47a0: 4b 41 5f 45 58 50 4f 4e 45 4e 54 5f 32 3a 0a 09  KA_EXPONENT_2:..
47b0: 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 45 58  ..return("CKA_EX
47c0: 50 4f 4e 45 4e 54 5f 32 22 29 3b 0a 09 09 63 61  PONENT_2");...ca
47d0: 73 65 20 43 4b 41 5f 43 4f 45 46 46 49 43 49 45  se CKA_COEFFICIE
47e0: 4e 54 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  NT:....return("C
47f0: 4b 41 5f 43 4f 45 46 46 49 43 49 45 4e 54 22 29  KA_COEFFICIENT")
4800: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 50 52 49  ;...case CKA_PRI
4810: 4d 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  ME:....return("C
4820: 4b 41 5f 50 52 49 4d 45 22 29 3b 0a 09 09 63 61  KA_PRIME");...ca
4830: 73 65 20 43 4b 41 5f 53 55 42 50 52 49 4d 45 3a  se CKA_SUBPRIME:
4840: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f  ....return("CKA_
4850: 53 55 42 50 52 49 4d 45 22 29 3b 0a 09 09 63 61  SUBPRIME");...ca
4860: 73 65 20 43 4b 41 5f 42 41 53 45 3a 0a 09 09 09  se CKA_BASE:....
4870: 72 65 74 75 72 6e 28 22 43 4b 41 5f 42 41 53 45  return("CKA_BASE
4880: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 50  ");...case CKA_P
4890: 52 49 4d 45 5f 42 49 54 53 3a 0a 09 09 09 72 65  RIME_BITS:....re
48a0: 74 75 72 6e 28 22 43 4b 41 5f 50 52 49 4d 45 5f  turn("CKA_PRIME_
48b0: 42 49 54 53 22 29 3b 0a 09 09 63 61 73 65 20 43  BITS");...case C
48c0: 4b 41 5f 53 55 42 5f 50 52 49 4d 45 5f 42 49 54  KA_SUB_PRIME_BIT
48d0: 53 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b  S:....return("CK
48e0: 41 5f 53 55 42 5f 50 52 49 4d 45 5f 42 49 54 53  A_SUB_PRIME_BITS
48f0: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 56  ");...case CKA_V
4900: 41 4c 55 45 5f 42 49 54 53 3a 0a 09 09 09 72 65  ALUE_BITS:....re
4910: 74 75 72 6e 28 22 43 4b 41 5f 56 41 4c 55 45 5f  turn("CKA_VALUE_
4920: 42 49 54 53 22 29 3b 0a 09 09 63 61 73 65 20 43  BITS");...case C
4930: 4b 41 5f 56 41 4c 55 45 5f 4c 45 4e 3a 0a 09 09  KA_VALUE_LEN:...
4940: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 56 41 4c  .return("CKA_VAL
4950: 55 45 5f 4c 45 4e 22 29 3b 0a 09 09 63 61 73 65  UE_LEN");...case
4960: 20 43 4b 41 5f 45 58 54 52 41 43 54 41 42 4c 45   CKA_EXTRACTABLE
4970: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41  :....return("CKA
4980: 5f 45 58 54 52 41 43 54 41 42 4c 45 22 29 3b 0a  _EXTRACTABLE");.
4990: 09 09 63 61 73 65 20 43 4b 41 5f 4c 4f 43 41 4c  ..case CKA_LOCAL
49a0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41  :....return("CKA
49b0: 5f 4c 4f 43 41 4c 22 29 3b 0a 09 09 63 61 73 65  _LOCAL");...case
49c0: 20 43 4b 41 5f 4e 45 56 45 52 5f 45 58 54 52 41   CKA_NEVER_EXTRA
49d0: 43 54 41 42 4c 45 3a 0a 09 09 09 72 65 74 75 72  CTABLE:....retur
49e0: 6e 28 22 43 4b 41 5f 4e 45 56 45 52 5f 45 58 54  n("CKA_NEVER_EXT
49f0: 52 41 43 54 41 42 4c 45 22 29 3b 0a 09 09 63 61  RACTABLE");...ca
4a00: 73 65 20 43 4b 41 5f 41 4c 57 41 59 53 5f 53 45  se CKA_ALWAYS_SE
4a10: 4e 53 49 54 49 56 45 3a 0a 09 09 09 72 65 74 75  NSITIVE:....retu
4a20: 72 6e 28 22 43 4b 41 5f 41 4c 57 41 59 53 5f 53  rn("CKA_ALWAYS_S
4a30: 45 4e 53 49 54 49 56 45 22 29 3b 0a 09 09 63 61  ENSITIVE");...ca
4a40: 73 65 20 43 4b 41 5f 4b 45 59 5f 47 45 4e 5f 4d  se CKA_KEY_GEN_M
4a50: 45 43 48 41 4e 49 53 4d 3a 0a 09 09 09 72 65 74  ECHANISM:....ret
4a60: 75 72 6e 28 22 43 4b 41 5f 4b 45 59 5f 47 45 4e  urn("CKA_KEY_GEN
4a70: 5f 4d 45 43 48 41 4e 49 53 4d 22 29 3b 0a 09 09  _MECHANISM");...
4a80: 63 61 73 65 20 43 4b 41 5f 4d 4f 44 49 46 49 41  case CKA_MODIFIA
4a90: 42 4c 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  BLE:....return("
4aa0: 43 4b 41 5f 4d 4f 44 49 46 49 41 42 4c 45 22 29  CKA_MODIFIABLE")
4ab0: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 45 43 44  ;...case CKA_ECD
4ac0: 53 41 5f 50 41 52 41 4d 53 3a 0a 09 09 09 72 65  SA_PARAMS:....re
4ad0: 74 75 72 6e 28 22 43 4b 41 5f 45 43 44 53 41 5f  turn("CKA_ECDSA_
4ae0: 50 41 52 41 4d 53 22 29 3b 0a 09 09 63 61 73 65  PARAMS");...case
4af0: 20 43 4b 41 5f 45 43 5f 50 4f 49 4e 54 3a 0a 09   CKA_EC_POINT:..
4b00: 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 45 43  ..return("CKA_EC
4b10: 5f 50 4f 49 4e 54 22 29 3b 0a 09 09 63 61 73 65  _POINT");...case
4b20: 20 43 4b 41 5f 53 45 43 4f 4e 44 41 52 59 5f 41   CKA_SECONDARY_A
4b30: 55 54 48 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  UTH:....return("
4b40: 43 4b 41 5f 53 45 43 4f 4e 44 41 52 59 5f 41 55  CKA_SECONDARY_AU
4b50: 54 48 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  TH");...case CKA
4b60: 5f 41 55 54 48 5f 50 49 4e 5f 46 4c 41 47 53 3a  _AUTH_PIN_FLAGS:
4b70: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f  ....return("CKA_
4b80: 41 55 54 48 5f 50 49 4e 5f 46 4c 41 47 53 22 29  AUTH_PIN_FLAGS")
4b90: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 48 57 5f  ;...case CKA_HW_
4ba0: 46 45 41 54 55 52 45 5f 54 59 50 45 3a 0a 09 09  FEATURE_TYPE:...
4bb0: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 48 57 5f  .return("CKA_HW_
4bc0: 46 45 41 54 55 52 45 5f 54 59 50 45 22 29 3b 0a  FEATURE_TYPE");.
4bd0: 09 09 63 61 73 65 20 43 4b 41 5f 52 45 53 45 54  ..case CKA_RESET
4be0: 5f 4f 4e 5f 49 4e 49 54 3a 0a 09 09 09 72 65 74  _ON_INIT:....ret
4bf0: 75 72 6e 28 22 43 4b 41 5f 52 45 53 45 54 5f 4f  urn("CKA_RESET_O
4c00: 4e 5f 49 4e 49 54 22 29 3b 0a 09 09 63 61 73 65  N_INIT");...case
4c10: 20 43 4b 41 5f 48 41 53 5f 52 45 53 45 54 3a 0a   CKA_HAS_RESET:.
4c20: 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 48  ...return("CKA_H
4c30: 41 53 5f 52 45 53 45 54 22 29 3b 0a 09 09 63 61  AS_RESET");...ca
4c40: 73 65 20 43 4b 41 5f 56 45 4e 44 4f 52 5f 44 45  se CKA_VENDOR_DE
4c50: 46 49 4e 45 44 3a 0a 09 09 09 72 65 74 75 72 6e  FINED:....return
4c60: 28 22 43 4b 41 5f 56 45 4e 44 4f 52 5f 44 45 46  ("CKA_VENDOR_DEF
4c70: 49 4e 45 44 22 29 3b 0a 09 7d 0a 0a 09 72 65 74  INED");..}...ret
4c80: 75 72 6e 28 22 55 4e 4b 4e 4f 57 4e 22 29 3b 0a  urn("UNKNOWN");.
4c90: 7d 0a 0a 23 20 20 64 65 66 69 6e 65 20 6d 61 6c  }..#  define mal
4ca0: 6c 6f 63 28 78 29 20 43 41 43 4b 45 59 5f 44 45  loc(x) CACKEY_DE
4cb0: 42 55 47 5f 46 55 4e 43 5f 4d 41 4c 4c 4f 43 28  BUG_FUNC_MALLOC(
4cc0: 78 2c 20 5f 5f 66 75 6e 63 5f 5f 2c 20 5f 5f 4c  x, __func__, __L
4cd0: 49 4e 45 5f 5f 29 0a 23 20 20 64 65 66 69 6e 65  INE__).#  define
4ce0: 20 72 65 61 6c 6c 6f 63 28 78 2c 20 79 29 20 43   realloc(x, y) C
4cf0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43  ACKEY_DEBUG_FUNC
4d00: 5f 52 45 41 4c 4c 4f 43 28 78 2c 20 79 2c 20 5f  _REALLOC(x, y, _
4d10: 5f 66 75 6e 63 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f  _func__, __LINE_
4d20: 5f 29 0a 23 20 20 69 66 64 65 66 20 73 74 72 64  _).#  ifdef strd
4d30: 75 70 0a 23 20 20 20 20 75 6e 64 65 66 20 73 74  up.#    undef st
4d40: 72 64 75 70 0a 23 20 20 65 6e 64 69 66 0a 23 20  rdup.#  endif.# 
4d50: 20 64 65 66 69 6e 65 20 73 74 72 64 75 70 28 78   define strdup(x
4d60: 29 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46  ) CACKEY_DEBUG_F
4d70: 55 4e 43 5f 53 54 52 44 55 50 28 78 2c 20 5f 5f  UNC_STRDUP(x, __
4d80: 66 75 6e 63 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f 5f  func__, __LINE__
4d90: 29 0a 23 65 6c 73 65 0a 23 20 20 64 65 66 69 6e  ).#else.#  defin
4da0: 65 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  e CACKEY_DEBUG_P
4db0: 52 49 4e 54 46 28 78 2e 2e 2e 29 20 2f 2a 2a 2f  RINTF(x...) /**/
4dc0: 0a 23 20 20 64 65 66 69 6e 65 20 43 41 43 4b 45  .#  define CACKE
4dd0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46  Y_DEBUG_PRINTBUF
4de0: 28 66 2c 20 78 2c 20 79 29 20 2f 2a 2a 2f 0a 23  (f, x, y) /**/.#
4df0: 20 20 64 65 66 69 6e 65 20 43 41 43 4b 45 59 5f    define CACKEY_
4e00: 44 45 42 55 47 5f 46 55 4e 43 5f 54 41 47 5f 54  DEBUG_FUNC_TAG_T
4e10: 4f 5f 53 54 52 28 78 29 20 22 44 45 42 55 47 5f  O_STR(x) "DEBUG_
4e20: 44 49 53 41 42 4c 45 44 22 0a 23 20 20 64 65 66  DISABLED".#  def
4e30: 69 6e 65 20 43 41 43 4b 45 59 5f 44 45 42 55 47  ine CACKEY_DEBUG
4e40: 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54  _FUNC_SCARDERR_T
4e50: 4f 5f 53 54 52 28 78 29 20 22 44 45 42 55 47 5f  O_STR(x) "DEBUG_
4e60: 44 49 53 41 42 4c 45 44 22 0a 23 20 20 64 65 66  DISABLED".#  def
4e70: 69 6e 65 20 43 41 43 4b 45 59 5f 44 45 42 55 47  ine CACKEY_DEBUG
4e80: 5f 46 55 4e 43 5f 4f 42 4a 49 44 5f 54 4f 5f 53  _FUNC_OBJID_TO_S
4e90: 54 52 28 78 29 20 22 44 45 42 55 47 5f 44 49 53  TR(x) "DEBUG_DIS
4ea0: 41 42 4c 45 44 22 0a 23 20 20 64 65 66 69 6e 65  ABLED".#  define
4eb0: 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55   CACKEY_DEBUG_FU
4ec0: 4e 43 5f 41 50 50 54 59 50 45 5f 54 4f 5f 53 54  NC_APPTYPE_TO_ST
4ed0: 52 28 78 29 20 22 44 45 42 55 47 5f 44 49 53 41  R(x) "DEBUG_DISA
4ee0: 42 4c 45 44 22 0a 23 20 20 64 65 66 69 6e 65 20  BLED".#  define 
4ef0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e  CACKEY_DEBUG_FUN
4f00: 43 5f 41 54 54 52 49 42 55 54 45 5f 54 4f 5f 53  C_ATTRIBUTE_TO_S
4f10: 54 52 28 78 29 20 22 44 45 42 55 47 5f 44 49 53  TR(x) "DEBUG_DIS
4f20: 41 42 4c 45 44 22 0a 23 65 6e 64 69 66 0a 0a 2f  ABLED".#endif../
4f30: 2a 0a 20 2a 20 49 6e 63 6c 75 64 65 20 74 68 65  *. * Include the
4f40: 73 65 20 73 6f 75 72 63 65 20 66 69 6c 65 73 20  se source files 
4f50: 69 6e 20 74 68 69 73 20 74 72 61 6e 73 6c 61 74  in this translat
4f60: 69 6f 6e 20 75 6e 69 74 20 73 6f 20 74 68 61 74  ion unit so that
4f70: 20 77 65 20 63 61 6e 20 62 69 6e 64 20 74 6f 0a   we can bind to.
4f80: 20 2a 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64   * functions and
4f90: 20 6e 6f 74 20 69 6e 63 6c 75 64 65 20 61 6e 79   not include any
4fa0: 20 73 79 6d 62 6f 6c 73 20 69 6e 20 74 68 65 20   symbols in the 
4fb0: 6f 75 74 70 75 74 20 73 68 61 72 65 64 20 6f 62  output shared ob
4fc0: 6a 65 63 74 2e 0a 20 2a 2f 0a 23 69 6e 63 6c 75  ject.. */.#inclu
4fd0: 64 65 20 22 61 73 6e 31 2d 78 35 30 39 2e 63 22  de "asn1-x509.c"
4fe0: 0a 23 69 6e 63 6c 75 64 65 20 22 73 68 61 31 2e  .#include "sha1.
4ff0: 63 22 0a 23 69 6e 63 6c 75 64 65 20 22 6d 64 35  c".#include "md5
5000: 2e 63 22 0a 0a 74 79 70 65 64 65 66 20 65 6e 75  .c"..typedef enu
5010: 6d 20 7b 0a 09 43 41 43 4b 45 59 5f 49 44 5f 54  m {..CACKEY_ID_T
5020: 59 50 45 5f 43 41 43 2c 0a 09 43 41 43 4b 45 59  YPE_CAC,..CACKEY
5030: 5f 49 44 5f 54 59 50 45 5f 50 49 56 2c 0a 09 43  _ID_TYPE_PIV,..C
5040: 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43 45  ACKEY_ID_TYPE_CE
5050: 52 54 5f 4f 4e 4c 59 0a 7d 20 63 61 63 6b 65 79  RT_ONLY.} cackey
5060: 5f 70 63 73 63 5f 69 64 5f 74 79 70 65 3b 0a 0a  _pcsc_id_type;..
5070: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63  struct cackey_pc
5080: 73 63 5f 69 64 65 6e 74 69 74 79 20 7b 0a 09 63  sc_identity {..c
5090: 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 5f 74 79  ackey_pcsc_id_ty
50a0: 70 65 20 69 64 5f 74 79 70 65 3b 0a 0a 09 73 69  pe id_type;...si
50b0: 7a 65 5f 74 20 63 65 72 74 69 66 69 63 61 74 65  ze_t certificate
50c0: 5f 6c 65 6e 3b 0a 09 75 6e 73 69 67 6e 65 64 20  _len;..unsigned 
50d0: 63 68 61 72 20 2a 63 65 72 74 69 66 69 63 61 74  char *certificat
50e0: 65 3b 0a 0a 09 73 73 69 7a 65 5f 74 20 6b 65 79  e;...ssize_t key
50f0: 73 69 7a 65 3b 0a 0a 09 75 6e 69 6f 6e 20 7b 0a  size;...union {.
5100: 09 09 73 74 72 75 63 74 20 7b 0a 09 09 09 75 6e  ..struct {....un
5110: 73 69 67 6e 65 64 20 63 68 61 72 20 61 70 70 6c  signed char appl
5120: 65 74 5b 37 5d 3b 0a 09 09 09 75 69 6e 74 31 36  et[7];....uint16
5130: 5f 74 20 66 69 6c 65 3b 0a 09 09 7d 20 63 61 63  _t file;...} cac
5140: 3b 0a 0a 09 09 73 74 72 75 63 74 20 7b 0a 09 09  ;....struct {...
5150: 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6b  .unsigned char k
5160: 65 79 5f 69 64 3b 0a 09 09 09 63 68 61 72 20 6c  ey_id;....char l
5170: 61 62 65 6c 5b 33 32 5d 3b 0a 09 09 7d 20 70 69  abel[32];...} pi
5180: 76 3b 0a 09 7d 20 63 61 72 64 3b 0a 7d 3b 0a 0a  v;..} card;.};..
5190: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69 64  struct cackey_id
51a0: 65 6e 74 69 74 79 20 7b 0a 09 73 74 72 75 63 74  entity {..struct
51b0: 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65   cackey_pcsc_ide
51c0: 6e 74 69 74 79 20 2a 70 63 73 63 5f 69 64 65 6e  ntity *pcsc_iden
51d0: 74 69 74 79 3b 0a 0a 09 43 4b 5f 41 54 54 52 49  tity;...CK_ATTRI
51e0: 42 55 54 45 20 2a 61 74 74 72 69 62 75 74 65 73  BUTE *attributes
51f0: 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 61 74 74 72  ;..CK_ULONG attr
5200: 69 62 75 74 65 73 5f 63 6f 75 6e 74 3b 0a 7d 3b  ibutes_count;.};
5210: 0a 0a 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  ..struct cackey_
5220: 73 65 73 73 69 6f 6e 20 7b 0a 09 69 6e 74 20 61  session {..int a
5230: 63 74 69 76 65 3b 0a 0a 09 43 4b 5f 53 4c 4f 54  ctive;...CK_SLOT
5240: 5f 49 44 20 73 6c 6f 74 49 44 3b 0a 0a 09 43 4b  _ID slotID;...CK
5250: 5f 53 54 41 54 45 20 73 74 61 74 65 3b 0a 09 43  _STATE state;..C
5260: 4b 5f 46 4c 41 47 53 20 66 6c 61 67 73 3b 0a 09  K_FLAGS flags;..
5270: 43 4b 5f 55 4c 4f 4e 47 20 75 6c 44 65 76 69 63  CK_ULONG ulDevic
5280: 65 45 72 72 6f 72 3b 0a 09 43 4b 5f 56 4f 49 44  eError;..CK_VOID
5290: 5f 50 54 52 20 70 41 70 70 6c 69 63 61 74 69 6f  _PTR pApplicatio
52a0: 6e 3b 0a 09 43 4b 5f 4e 4f 54 49 46 59 20 4e 6f  n;..CK_NOTIFY No
52b0: 74 69 66 79 3b 0a 0a 09 73 74 72 75 63 74 20 63  tify;...struct c
52c0: 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79 20 2a  ackey_identity *
52d0: 69 64 65 6e 74 69 74 69 65 73 3b 0a 09 75 6e 73  identities;..uns
52e0: 69 67 6e 65 64 20 6c 6f 6e 67 20 69 64 65 6e 74  igned long ident
52f0: 69 74 69 65 73 5f 63 6f 75 6e 74 3b 0a 0a 09 69  ities_count;...i
5300: 6e 74 20 73 65 61 72 63 68 5f 61 63 74 69 76 65  nt search_active
5310: 3b 0a 09 43 4b 5f 41 54 54 52 49 42 55 54 45 5f  ;..CK_ATTRIBUTE_
5320: 50 54 52 20 73 65 61 72 63 68 5f 71 75 65 72 79  PTR search_query
5330: 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 73 65 61 72  ;..CK_ULONG sear
5340: 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74 3b 0a  ch_query_count;.
5350: 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 73  .unsigned long s
5360: 65 61 72 63 68 5f 63 75 72 72 5f 69 64 3b 0a 0a  earch_curr_id;..
5370: 09 69 6e 74 20 73 69 67 6e 5f 61 63 74 69 76 65  .int sign_active
5380: 3b 0a 09 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f  ;..CK_MECHANISM_
5390: 54 59 50 45 20 73 69 67 6e 5f 6d 65 63 68 61 6e  TYPE sign_mechan
53a0: 69 73 6d 3b 0a 09 43 4b 5f 42 59 54 45 5f 50 54  ism;..CK_BYTE_PT
53b0: 52 20 73 69 67 6e 5f 62 75 66 3b 0a 09 75 6e 73  R sign_buf;..uns
53c0: 69 67 6e 65 64 20 6c 6f 6e 67 20 73 69 67 6e 5f  igned long sign_
53d0: 62 75 66 6c 65 6e 3b 0a 09 75 6e 73 69 67 6e 65  buflen;..unsigne
53e0: 64 20 6c 6f 6e 67 20 73 69 67 6e 5f 62 75 66 75  d long sign_bufu
53f0: 73 65 64 3b 0a 09 73 74 72 75 63 74 20 63 61 63  sed;..struct cac
5400: 6b 65 79 5f 69 64 65 6e 74 69 74 79 20 2a 73 69  key_identity *si
5410: 67 6e 5f 69 64 65 6e 74 69 74 79 3b 0a 0a 09 69  gn_identity;...i
5420: 6e 74 20 64 65 63 72 79 70 74 5f 61 63 74 69 76  nt decrypt_activ
5430: 65 3b 0a 09 43 4b 5f 4d 45 43 48 41 4e 49 53 4d  e;..CK_MECHANISM
5440: 5f 54 59 50 45 20 64 65 63 72 79 70 74 5f 6d 65  _TYPE decrypt_me
5450: 63 68 61 6e 69 73 6d 3b 0a 09 43 4b 5f 56 4f 49  chanism;..CK_VOI
5460: 44 5f 50 54 52 20 64 65 63 72 79 70 74 5f 6d 65  D_PTR decrypt_me
5470: 63 68 5f 70 61 72 6d 3b 0a 09 43 4b 5f 55 4c 4f  ch_parm;..CK_ULO
5480: 4e 47 20 64 65 63 72 79 70 74 5f 6d 65 63 68 5f  NG decrypt_mech_
5490: 70 61 72 6d 6c 65 6e 3b 0a 09 73 74 72 75 63 74  parmlen;..struct
54a0: 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79   cackey_identity
54b0: 20 2a 64 65 63 72 79 70 74 5f 69 64 65 6e 74 69   *decrypt_identi
54c0: 74 79 3b 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 63  ty;.};..struct c
54d0: 61 63 6b 65 79 5f 73 6c 6f 74 20 7b 0a 09 69 6e  ackey_slot {..in
54e0: 74 20 61 63 74 69 76 65 3b 0a 09 69 6e 74 20 69  t active;..int i
54f0: 6e 74 65 72 6e 61 6c 3b 0a 0a 09 63 68 61 72 20  nternal;...char 
5500: 2a 70 63 73 63 5f 72 65 61 64 65 72 3b 0a 0a 09  *pcsc_reader;...
5510: 69 6e 74 20 70 63 73 63 5f 63 61 72 64 5f 63 6f  int pcsc_card_co
5520: 6e 6e 65 63 74 65 64 3b 0a 09 53 43 41 52 44 48  nnected;..SCARDH
5530: 41 4e 44 4c 45 20 70 63 73 63 5f 63 61 72 64 3b  ANDLE pcsc_card;
5540: 0a 0a 09 69 6e 74 20 74 72 61 6e 73 61 63 74 69  ...int transacti
5550: 6f 6e 5f 64 65 70 74 68 3b 0a 09 69 6e 74 20 74  on_depth;..int t
5560: 72 61 6e 73 61 63 74 69 6f 6e 5f 6e 65 65 64 5f  ransaction_need_
5570: 68 77 5f 6c 6f 63 6b 3b 0a 0a 09 69 6e 74 20 73  hw_lock;...int s
5580: 6c 6f 74 5f 72 65 73 65 74 3b 0a 0a 09 43 4b 5f  lot_reset;...CK_
5590: 46 4c 41 47 53 20 74 6f 6b 65 6e 5f 66 6c 61 67  FLAGS token_flag
55a0: 73 3b 0a 0a 09 75 6e 73 69 67 6e 65 64 20 63 68  s;...unsigned ch
55b0: 61 72 20 2a 6c 61 62 65 6c 3b 0a 0a 09 44 57 4f  ar *label;...DWO
55c0: 52 44 20 70 72 6f 74 6f 63 6f 6c 3b 0a 0a 09 75  RD protocol;...u
55d0: 6e 73 69 67 6e 65 64 20 69 6e 74 20 63 61 63 68  nsigned int cach
55e0: 65 64 5f 63 65 72 74 73 5f 63 6f 75 6e 74 3b 0a  ed_certs_count;.
55f0: 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70  .struct cackey_p
5600: 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 63 61  csc_identity *ca
5610: 63 68 65 64 5f 63 65 72 74 73 3b 0a 7d 3b 0a 0a  ched_certs;.};..
5620: 74 79 70 65 64 65 66 20 65 6e 75 6d 20 7b 0a 09  typedef enum {..
5630: 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 47  CACKEY_TLV_APP_G
5640: 45 4e 45 52 49 43 20 3d 20 30 78 30 31 2c 0a 09  ENERIC = 0x01,..
5650: 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 53  CACKEY_TLV_APP_S
5660: 4b 49 20 20 20 20 20 3d 20 30 78 30 32 2c 0a 09  KI     = 0x02,..
5670: 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 50  CACKEY_TLV_APP_P
5680: 4b 49 20 20 20 20 20 3d 20 30 78 30 34 0a 7d 20  KI     = 0x04.} 
5690: 63 61 63 6b 65 79 5f 74 6c 76 5f 61 70 70 74 79  cackey_tlv_appty
56a0: 70 65 3b 0a 0a 74 79 70 65 64 65 66 20 65 6e 75  pe;..typedef enu
56b0: 6d 20 7b 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f  m {..CACKEY_TLV_
56c0: 4f 42 4a 49 44 5f 47 45 4e 45 52 41 4c 49 4e 46  OBJID_GENERALINF
56d0: 4f 20 20 20 20 20 20 20 3d 20 30 78 32 30 30 30  O       = 0x2000
56e0: 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42  ,..CACKEY_TLV_OB
56f0: 4a 49 44 5f 50 52 4f 50 45 52 53 4f 4e 41 4c 49  JID_PROPERSONALI
5700: 4e 46 4f 20 20 20 3d 20 30 78 32 31 30 30 2c 0a  NFO   = 0x2100,.
5710: 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49  .CACKEY_TLV_OBJI
5720: 44 5f 41 43 43 45 53 53 43 4f 4e 54 52 4f 4c 20  D_ACCESSCONTROL 
5730: 20 20 20 20 3d 20 30 78 33 30 30 30 2c 0a 09 43      = 0x3000,..C
5740: 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f  ACKEY_TLV_OBJID_
5750: 4c 4f 47 49 4e 20 20 20 20 20 20 20 20 20 20 20  LOGIN           
5760: 20 20 3d 20 30 78 34 30 30 30 2c 0a 09 43 41 43    = 0x4000,..CAC
5770: 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41  KEY_TLV_OBJID_CA
5780: 52 44 49 4e 46 4f 20 20 20 20 20 20 20 20 20 20  RDINFO          
5790: 3d 20 30 78 35 30 30 30 2c 0a 09 43 41 43 4b 45  = 0x5000,..CACKE
57a0: 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 42 49 4f 4d  Y_TLV_OBJID_BIOM
57b0: 45 54 52 49 43 53 20 20 20 20 20 20 20 20 3d 20  ETRICS        = 
57c0: 30 78 36 30 30 30 2c 0a 09 43 41 43 4b 45 59 5f  0x6000,..CACKEY_
57d0: 54 4c 56 5f 4f 42 4a 49 44 5f 44 49 47 49 54 41  TLV_OBJID_DIGITA
57e0: 4c 53 49 47 43 45 52 54 20 20 20 20 3d 20 30 78  LSIGCERT    = 0x
57f0: 37 30 30 30 2c 0a 09 43 41 43 4b 45 59 5f 54 4c  7000,..CACKEY_TL
5800: 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 50 45 52 53  V_OBJID_CAC_PERS
5810: 4f 4e 20 20 20 20 20 20 20 20 3d 20 30 78 30 32  ON        = 0x02
5820: 30 30 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f  00,..CACKEY_TLV_
5830: 4f 42 4a 49 44 5f 43 41 43 5f 42 45 4e 45 46 49  OBJID_CAC_BENEFI
5840: 54 53 20 20 20 20 20 20 3d 20 30 78 30 32 30 32  TS      = 0x0202
5850: 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42  ,..CACKEY_TLV_OB
5860: 4a 49 44 5f 43 41 43 5f 4f 54 48 45 52 42 45 4e  JID_CAC_OTHERBEN
5870: 45 46 49 54 53 20 3d 20 30 78 30 32 30 33 2c 0a  EFITS = 0x0203,.
5880: 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49  .CACKEY_TLV_OBJI
5890: 44 5f 43 41 43 5f 50 45 52 53 4f 4e 4e 45 4c 20  D_CAC_PERSONNEL 
58a0: 20 20 20 20 3d 20 30 78 30 32 30 31 2c 0a 09 43      = 0x0201,..C
58b0: 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f  ACKEY_TLV_OBJID_
58c0: 43 41 43 5f 50 4b 49 43 45 52 54 20 20 20 20 20  CAC_PKICERT     
58d0: 20 20 3d 20 30 78 30 32 46 45 0a 7d 20 63 61 63    = 0x02FE.} cac
58e0: 6b 65 79 5f 74 6c 76 5f 6f 62 6a 65 63 74 69 64  key_tlv_objectid
58f0: 3b 0a 0a 74 79 70 65 64 65 66 20 65 6e 75 6d 20  ;..typedef enum 
5900: 7b 0a 09 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  {..CACKEY_PCSC_S
5910: 5f 54 4f 4b 45 4e 50 52 45 53 45 4e 54 20 20 20  _TOKENPRESENT   
5920: 20 3d 20 31 2c 0a 09 43 41 43 4b 45 59 5f 50 43   = 1,..CACKEY_PC
5930: 53 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 20  SC_S_OK         
5940: 20 20 20 20 20 3d 20 30 2c 0a 09 43 41 43 4b 45       = 0,..CACKE
5950: 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43  Y_PCSC_E_GENERIC
5960: 20 20 20 20 20 20 20 20 20 3d 20 2d 31 2c 0a 09           = -1,..
5970: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 42 41  CACKEY_PCSC_E_BA
5980: 44 50 49 4e 20 20 20 20 20 20 20 20 20 20 3d 20  DPIN          = 
5990: 2d 32 2c 0a 09 43 41 43 4b 45 59 5f 50 43 53 43  -2,..CACKEY_PCSC
59a0: 5f 45 5f 4c 4f 43 4b 45 44 20 20 20 20 20 20 20  _E_LOCKED       
59b0: 20 20 20 3d 20 2d 33 2c 0a 09 43 41 43 4b 45 59     = -3,..CACKEY
59c0: 5f 50 43 53 43 5f 45 5f 4e 45 45 44 4c 4f 47 49  _PCSC_E_NEEDLOGI
59d0: 4e 20 20 20 20 20 20 20 3d 20 2d 34 2c 0a 09 43  N       = -4,..C
59e0: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b  ACKEY_PCSC_E_TOK
59f0: 45 4e 41 42 53 45 4e 54 20 20 20 20 20 3d 20 2d  ENABSENT     = -
5a00: 36 2c 0a 09 43 41 43 4b 45 59 5f 50 43 53 43 5f  6,..CACKEY_PCSC_
5a10: 45 5f 52 45 54 52 59 20 20 20 20 20 20 20 20 20  E_RETRY         
5a20: 20 20 3d 20 2d 37 0a 7d 20 63 61 63 6b 65 79 5f    = -7.} cackey_
5a30: 72 65 74 3b 0a 0a 73 74 72 75 63 74 20 63 61 63  ret;..struct cac
5a40: 6b 65 79 5f 74 6c 76 5f 63 61 72 64 75 72 6c 20  key_tlv_cardurl 
5a50: 7b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72  {..unsigned char
5a60: 20 20 20 20 20 20 20 20 72 69 64 5b 35 5d 3b 0a          rid[5];.
5a70: 09 63 61 63 6b 65 79 5f 74 6c 76 5f 61 70 70 74  .cackey_tlv_appt
5a80: 79 70 65 20 20 20 61 70 70 74 79 70 65 3b 0a 09  ype   apptype;..
5a90: 63 61 63 6b 65 79 5f 74 6c 76 5f 6f 62 6a 65 63  cackey_tlv_objec
5aa0: 74 69 64 20 20 6f 62 6a 65 63 74 69 64 3b 0a 09  tid  objectid;..
5ab0: 63 61 63 6b 65 79 5f 74 6c 76 5f 6f 62 6a 65 63  cackey_tlv_objec
5ac0: 74 69 64 20 20 61 70 70 69 64 3b 0a 09 75 6e 73  tid  appid;..uns
5ad0: 69 67 6e 65 64 20 63 68 61 72 20 20 20 20 20 20  igned char      
5ae0: 20 20 70 69 6e 69 64 3b 0a 7d 3b 0a 0a 73 74 72    pinid;.};..str
5af0: 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65  uct cackey_tlv_e
5b00: 6e 74 69 74 79 3b 0a 73 74 72 75 63 74 20 63 61  ntity;.struct ca
5b10: 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20  ckey_tlv_entity 
5b20: 7b 0a 09 75 69 6e 74 38 5f 74 20 74 61 67 3b 0a  {..uint8_t tag;.
5b30: 09 73 69 7a 65 5f 74 20 6c 65 6e 67 74 68 3b 0a  .size_t length;.
5b40: 0a 09 75 6e 69 6f 6e 20 7b 0a 09 09 76 6f 69 64  ..union {...void
5b50: 20 2a 76 61 6c 75 65 3b 0a 09 09 73 74 72 75 63   *value;...struc
5b60: 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 63 61 72  t cackey_tlv_car
5b70: 64 75 72 6c 20 2a 76 61 6c 75 65 5f 63 61 72 64  durl *value_card
5b80: 75 72 6c 3b 0a 09 09 75 69 6e 74 38 5f 74 20 76  url;...uint8_t v
5b90: 61 6c 75 65 5f 62 79 74 65 3b 0a 09 7d 3b 0a 0a  alue_byte;..};..
5ba0: 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74  .struct cackey_t
5bb0: 6c 76 5f 65 6e 74 69 74 79 20 2a 5f 6e 65 78 74  lv_entity *_next
5bc0: 3b 0a 7d 3b 0a 0a 2f 2a 20 43 41 43 4b 45 59 20  ;.};../* CACKEY 
5bd0: 47 6c 6f 62 61 6c 20 48 61 6e 64 6c 65 73 20 2a  Global Handles *
5be0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 63  /.static void *c
5bf0: 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 20 3d 20  ackey_biglock = 
5c00: 4e 55 4c 4c 3b 0a 73 74 61 74 69 63 20 73 74 72  NULL;.static str
5c10: 75 63 74 20 63 61 63 6b 65 79 5f 73 65 73 73 69  uct cackey_sessi
5c20: 6f 6e 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  on cackey_sessio
5c30: 6e 73 5b 31 32 38 5d 3b 0a 73 74 61 74 69 63 20  ns[128];.static 
5c40: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c  struct cackey_sl
5c50: 6f 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ot cackey_slots[
5c60: 31 32 38 5d 3b 0a 73 74 61 74 69 63 20 69 6e 74  128];.static int
5c70: 20 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69   cackey_initiali
5c80: 7a 65 64 20 3d 20 30 3b 0a 73 74 61 74 69 63 20  zed = 0;.static 
5c90: 69 6e 74 20 63 61 63 6b 65 79 5f 62 69 67 6c 6f  int cackey_biglo
5ca0: 63 6b 5f 69 6e 69 74 20 3d 20 30 3b 0a 43 4b 5f  ck_init = 0;.CK_
5cb0: 43 5f 49 4e 49 54 49 41 4c 49 5a 45 5f 41 52 47  C_INITIALIZE_ARG
5cc0: 53 20 63 61 63 6b 65 79 5f 61 72 67 73 3b 0a 0a  S cackey_args;..
5cd0: 2f 2a 2a 20 45 78 74 72 61 20 63 65 72 74 69 66  /** Extra certif
5ce0: 69 63 61 74 65 73 20 74 6f 20 69 6e 63 6c 75 64  icates to includ
5cf0: 65 20 69 6e 20 74 6f 6b 65 6e 20 2a 2a 2f 0a 73  e in token **/.s
5d00: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73  truct cackey_pcs
5d10: 63 5f 69 64 65 6e 74 69 74 79 20 65 78 74 72 61  c_identity extra
5d20: 5f 63 65 72 74 73 5b 5d 20 3d 20 7b 0a 23 69 6e  _certs[] = {.#in
5d30: 63 6c 75 64 65 20 22 63 61 63 6b 65 79 5f 62 75  clude "cackey_bu
5d40: 69 6c 74 69 6e 5f 63 65 72 74 73 2e 68 22 0a 7d  iltin_certs.h".}
5d50: 3b 0a 0a 23 64 65 66 69 6e 65 20 43 41 43 4b 45  ;..#define CACKE
5d60: 59 5f 4d 41 43 52 4f 5f 44 45 46 41 55 4c 54 5f  Y_MACRO_DEFAULT_
5d70: 58 53 54 52 28 73 74 72 29 20 43 41 43 4b 45 59  XSTR(str) CACKEY
5d80: 5f 4d 41 43 52 4f 5f 44 45 46 41 55 4c 54 5f 53  _MACRO_DEFAULT_S
5d90: 54 52 28 73 74 72 29 0a 23 64 65 66 69 6e 65 20  TR(str).#define 
5da0: 43 41 43 4b 45 59 5f 4d 41 43 52 4f 5f 44 45 46  CACKEY_MACRO_DEF
5db0: 41 55 4c 54 5f 53 54 52 28 73 74 72 29 20 23 73  AULT_STR(str) #s
5dc0: 74 72 0a 0a 2f 2a 20 50 72 6f 74 65 63 74 65 64  tr../* Protected
5dd0: 20 41 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 20   Authentication 
5de0: 50 61 74 68 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  Path command */.
5df0: 73 74 61 74 69 63 20 63 68 61 72 20 2a 63 61 63  static char *cac
5e00: 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20  key_pin_command 
5e10: 3d 20 4e 55 4c 4c 3b 0a 0a 2f 2a 20 52 65 61 64  = NULL;../* Read
5e20: 65 72 20 45 78 63 6c 75 73 69 6f 6e 20 6f 72 20  er Exclusion or 
5e30: 49 6e 63 6c 75 64 65 2d 6f 6e 6c 79 20 2a 2f 0a  Include-only */.
5e40: 73 74 61 74 69 63 20 63 68 61 72 20 2a 63 61 63  static char *cac
5e50: 6b 65 79 5f 72 65 61 64 65 72 73 5f 69 6e 63 6c  key_readers_incl
5e60: 75 64 65 5f 6f 6e 6c 79 20 3d 20 4e 55 4c 4c 3b  ude_only = NULL;
5e70: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 63 61  .static char *ca
5e80: 63 6b 65 79 5f 72 65 61 64 65 72 73 5f 65 78 63  ckey_readers_exc
5e90: 6c 75 64 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 2f 2a  lude = NULL;../*
5ea0: 20 50 43 53 43 20 47 6c 6f 62 61 6c 20 48 61 6e   PCSC Global Han
5eb0: 64 6c 65 73 20 2a 2f 0a 73 74 61 74 69 63 20 4c  dles */.static L
5ec0: 50 53 43 41 52 44 43 4f 4e 54 45 58 54 20 63 61  PSCARDCONTEXT ca
5ed0: 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65  ckey_pcsc_handle
5ee0: 20 3d 20 4e 55 4c 4c 3b 0a 0a 73 74 61 74 69 63   = NULL;..static
5ef0: 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 63   unsigned long c
5f00: 61 63 6b 65 79 5f 67 65 74 76 65 72 73 69 6f 6e  ackey_getversion
5f10: 28 76 6f 69 64 29 20 7b 0a 09 73 74 61 74 69 63  (void) {..static
5f20: 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 72   unsigned long r
5f30: 65 74 76 61 6c 20 3d 20 32 35 35 3b 0a 09 75 6e  etval = 255;..un
5f40: 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6d 61 6a 6f  signed long majo
5f50: 72 20 3d 20 30 3b 0a 09 75 6e 73 69 67 6e 65 64  r = 0;..unsigned
5f60: 20 6c 6f 6e 67 20 6d 69 6e 6f 72 20 3d 20 30 3b   long minor = 0;
5f70: 0a 09 63 68 61 72 20 2a 6d 61 6a 6f 72 5f 73 74  ..char *major_st
5f80: 72 20 3d 20 4e 55 4c 4c 3b 0a 09 63 68 61 72 20  r = NULL;..char 
5f90: 2a 6d 69 6e 6f 72 5f 73 74 72 20 3d 20 4e 55 4c  *minor_str = NUL
5fa0: 4c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  L;...CACKEY_DEBU
5fb0: 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
5fc0: 2e 22 29 3b 0a 0a 09 69 66 20 28 72 65 74 76 61  .");...if (retva
5fd0: 6c 20 21 3d 20 32 35 35 29 20 7b 0a 09 09 43 41  l != 255) {...CA
5fe0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
5ff0: 46 28 22 52 65 74 75 72 6e 69 6e 67 20 30 78 25  F("Returning 0x%
6000: 6c 78 20 28 63 61 63 68 65 64 29 2e 22 2c 20 72  lx (cached).", r
6010: 65 74 76 61 6c 29 3b 0a 0a 09 09 72 65 74 75 72  etval);....retur
6020: 6e 28 72 65 74 76 61 6c 29 3b 0a 09 7d 0a 0a 09  n(retval);..}...
6030: 72 65 74 76 61 6c 20 3d 20 30 3b 0a 0a 23 69 66  retval = 0;..#if
6040: 64 65 66 20 50 41 43 4b 41 47 45 5f 56 45 52 53  def PACKAGE_VERS
6050: 49 4f 4e 0a 20 20 20 20 20 20 20 20 6d 61 6a 6f  ION.        majo
6060: 72 5f 73 74 72 20 3d 20 50 41 43 4b 41 47 45 5f  r_str = PACKAGE_
6070: 56 45 52 53 49 4f 4e 3b 0a 09 69 66 20 28 6d 61  VERSION;..if (ma
6080: 6a 6f 72 5f 73 74 72 29 20 7b 0a 09 20 20 20 20  jor_str) {..    
6090: 20 20 20 20 6d 61 6a 6f 72 20 3d 20 73 74 72 74      major = strt
60a0: 6f 75 6c 28 6d 61 6a 6f 72 5f 73 74 72 2c 20 26  oul(major_str, &
60b0: 6d 69 6e 6f 72 5f 73 74 72 2c 20 31 30 29 3b 0a  minor_str, 10);.
60c0: 0a 09 09 69 66 20 28 6d 69 6e 6f 72 5f 73 74 72  ...if (minor_str
60d0: 29 20 7b 0a 09 09 09 6d 69 6e 6f 72 20 3d 20 73  ) {....minor = s
60e0: 74 72 74 6f 75 6c 28 6d 69 6e 6f 72 5f 73 74 72  trtoul(minor_str
60f0: 20 2b 20 31 2c 20 4e 55 4c 4c 2c 20 31 30 29 3b   + 1, NULL, 10);
6100: 0a 09 09 7d 0a 09 7d 0a 0a 09 72 65 74 76 61 6c  ...}..}...retval
6110: 20 3d 20 28 6d 61 6a 6f 72 20 3c 3c 20 31 36 29   = (major << 16)
6120: 20 7c 20 28 6d 69 6e 6f 72 20 3c 3c 20 38 29 3b   | (minor << 8);
6130: 0a 23 65 6e 64 69 66 0a 0a 09 43 41 43 4b 45 59  .#endif...CACKEY
6140: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
6150: 65 74 75 72 6e 69 6e 67 20 30 78 25 6c 78 22 2c  eturning 0x%lx",
6160: 20 72 65 74 76 61 6c 29 3b 0a 0a 09 72 65 74 75   retval);...retu
6170: 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 2f  rn(retval);.}../
6180: 2a 20 50 43 2f 53 43 20 52 65 6c 61 74 65 64 20  * PC/SC Related 
6190: 46 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 2f 2a 0a  Functions */./*.
61a0: 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20   * SYNPOSIS. *  
61b0: 20 20 20 76 6f 69 64 20 63 61 63 6b 65 79 5f 73     void cackey_s
61c0: 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e 65 63 74 5f  lots_disconnect_
61d0: 61 6c 6c 28 76 6f 69 64 29 3b 0a 20 2a 0a 20 2a  all(void);. *. *
61e0: 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20   ARGUMENTS. *   
61f0: 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 52 45 54    None. *. * RET
6200: 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20  URN VALUE. *    
6210: 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 4e 4f 54 45   None. *. * NOTE
6220: 53 0a 20 2a 20 20 20 20 20 54 68 69 73 20 66 75  S. *     This fu
6230: 6e 63 74 69 6f 6e 20 64 69 73 63 6f 6e 6e 65 63  nction disconnec
6240: 74 73 20 66 72 6f 6d 20 61 6c 6c 20 63 61 72 64  ts from all card
6250: 73 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63  s.. *. */.static
6260: 20 76 6f 69 64 20 63 61 63 6b 65 79 5f 73 6c 6f   void cackey_slo
6270: 74 73 5f 64 69 73 63 6f 6e 6e 65 63 74 5f 61 6c  ts_disconnect_al
6280: 6c 28 76 6f 69 64 29 20 7b 0a 09 75 69 6e 74 33  l(void) {..uint3
6290: 32 5f 74 20 69 64 78 3b 0a 0a 09 43 41 43 4b 45  2_t idx;...CACKE
62a0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
62b0: 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 66 6f 72  Called.");...for
62c0: 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c   (idx = 0; idx <
62d0: 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
62e0: 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28  slots) / sizeof(
62f0: 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29  cackey_slots[0])
6300: 29 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66  ); idx++) {...if
6310: 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69   (cackey_slots[i
6320: 64 78 5d 2e 69 6e 74 65 72 6e 61 6c 29 20 7b 0a  dx].internal) {.
6330: 09 09 09 2f 2a 20 53 6b 69 70 20 69 6e 74 65 72  .../* Skip inter
6340: 6e 61 6c 20 73 6c 6f 74 73 20 2a 2f 0a 09 09 09  nal slots */....
6350: 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 7d 0a 0a 09  continue;...}...
6360: 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74  .if (cackey_slot
6370: 73 5b 69 64 78 5d 2e 70 63 73 63 5f 63 61 72 64  s[idx].pcsc_card
6380: 5f 63 6f 6e 6e 65 63 74 65 64 29 20 7b 0a 09 09  _connected) {...
6390: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
63a0: 49 4e 54 46 28 22 53 43 61 72 64 44 69 73 63 6f  INTF("SCardDisco
63b0: 6e 6e 65 63 74 28 25 6c 75 29 20 63 61 6c 6c 65  nnect(%lu) calle
63c0: 64 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  d", (unsigned lo
63d0: 6e 67 29 20 69 64 78 29 3b 0a 0a 09 09 09 53 43  ng) idx);.....SC
63e0: 61 72 64 44 69 73 63 6f 6e 6e 65 63 74 28 63 61  ardDisconnect(ca
63f0: 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e  ckey_slots[idx].
6400: 70 63 73 63 5f 63 61 72 64 2c 20 53 43 41 52 44  pcsc_card, SCARD
6410: 5f 4c 45 41 56 45 5f 43 41 52 44 29 3b 0a 09 09  _LEAVE_CARD);...
6420: 7d 0a 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f  }....if (cackey_
6430: 73 6c 6f 74 73 5b 69 64 78 5d 2e 6c 61 62 65 6c  slots[idx].label
6440: 29 20 7b 0a 09 09 09 66 72 65 65 28 63 61 63 6b  ) {....free(cack
6450: 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 6c 61  ey_slots[idx].la
6460: 62 65 6c 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79  bel);.....cackey
6470: 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 6c 61 62 65  _slots[idx].labe
6480: 6c 20 3d 20 4e 55 4c 4c 3b 0a 09 09 7d 0a 0a 09  l = NULL;...}...
6490: 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64  .cackey_slots[id
64a0: 78 5d 2e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e  x].pcsc_card_con
64b0: 6e 65 63 74 65 64 20 3d 20 30 3b 0a 09 09 63 61  nected = 0;...ca
64c0: 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e  ckey_slots[idx].
64d0: 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74  transaction_dept
64e0: 68 20 3d 20 30 3b 0a 09 09 63 61 63 6b 65 79 5f  h = 0;...cackey_
64f0: 73 6c 6f 74 73 5b 69 64 78 5d 2e 74 72 61 6e 73  slots[idx].trans
6500: 61 63 74 69 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c  action_need_hw_l
6510: 6f 63 6b 20 3d 20 30 3b 0a 0a 09 09 69 66 20 28  ock = 0;....if (
6520: 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78  cackey_slots[idx
6530: 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 09 43  ].active) {....C
6540: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
6550: 54 46 28 22 4d 61 72 6b 69 6e 67 20 61 63 74 69  TF("Marking acti
6560: 76 65 20 73 6c 6f 74 20 25 6c 75 20 61 73 20 62  ve slot %lu as b
6570: 65 69 6e 67 20 72 65 73 65 74 22 2c 20 28 75 6e  eing reset", (un
6580: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 69 64 78  signed long) idx
6590: 29 3b 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79  );...}....cackey
65a0: 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 73 6c 6f 74  _slots[idx].slot
65b0: 5f 72 65 73 65 74 20 3d 20 31 3b 0a 09 7d 0a 0a  _reset = 1;..}..
65c0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
65d0: 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 22  INTF("Returning"
65e0: 29 3b 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a  );...return;.}..
65f0: 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20  /*. * SYNPOSIS. 
6600: 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 72 65 74  *     cackey_ret
6610: 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 63 6f 6e   cackey_pcsc_con
6620: 6e 65 63 74 28 76 6f 69 64 29 3b 0a 20 2a 0a 20  nect(void);. *. 
6630: 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20  * ARGUMENTS. *  
6640: 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 52 45     None. *. * RE
6650: 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20  TURN VALUE. *   
6660: 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f    CACKEY_PCSC_S_
6670: 4f 4b 20 20 20 20 20 20 20 20 20 4f 6e 20 73 75  OK         On su
6680: 63 63 65 73 73 0a 20 2a 20 20 20 20 20 43 41 43  ccess. *     CAC
6690: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52  KEY_PCSC_E_GENER
66a0: 49 43 20 20 20 20 4f 6e 20 65 72 72 6f 72 0a 20  IC    On error. 
66b0: 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20  *. * NOTES. *   
66c0: 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20    This function 
66d0: 63 6f 6e 6e 65 63 74 73 20 74 6f 20 74 68 65 20  connects to the 
66e0: 50 43 2f 53 43 20 43 6f 6e 6e 65 63 74 69 6f 6e  PC/SC Connection
66f0: 20 4d 61 6e 61 67 65 72 20 61 6e 64 20 75 70 64   Manager and upd
6700: 61 74 65 73 20 74 68 65 0a 20 2a 20 20 20 20 20  ates the. *     
6710: 67 6c 6f 62 61 6c 20 68 61 6e 64 6c 65 2e 0a 20  global handle.. 
6720: 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 61 63  *. */.static cac
6730: 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 70  key_ret cackey_p
6740: 63 73 63 5f 63 6f 6e 6e 65 63 74 28 76 6f 69 64  csc_connect(void
6750: 29 20 7b 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f  ) {..LONG scard_
6760: 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74 3b  est_context_ret;
6770: 0a 23 69 66 64 65 66 20 48 41 56 45 5f 53 43 41  .#ifdef HAVE_SCA
6780: 52 44 49 53 56 41 4c 49 44 43 4f 4e 54 45 58 54  RDISVALIDCONTEXT
6790: 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f 69 73 76  ..LONG scard_isv
67a0: 61 6c 69 64 5f 72 65 74 3b 0a 23 65 6e 64 69 66  alid_ret;.#endif
67b0: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
67c0: 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
67d0: 29 3b 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f  );...if (cackey_
67e0: 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d 3d 20 4e  pcsc_handle == N
67f0: 55 4c 4c 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  ULL) {...cackey_
6800: 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d 20 6d 61  pcsc_handle = ma
6810: 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63 61 63  lloc(sizeof(*cac
6820: 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 29  key_pcsc_handle)
6830: 29 3b 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f  );...if (cackey_
6840: 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d 3d 20 4e  pcsc_handle == N
6850: 55 4c 4c 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  ULL) {....CACKEY
6860: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
6870: 61 6c 6c 20 74 6f 20 6d 61 6c 6c 6f 63 28 29 20  all to malloc() 
6880: 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 69 6e  failed, returnin
6890: 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a  g in failure");.
68a0: 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ....cackey_slots
68b0: 5f 64 69 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28  _disconnect_all(
68c0: 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 41  );.....return(CA
68d0: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45  CKEY_PCSC_E_GENE
68e0: 52 49 43 29 3b 0a 09 09 7d 0a 0a 09 09 43 41 43  RIC);...}....CAC
68f0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
6900: 28 22 53 43 61 72 64 45 73 74 61 62 6c 69 73 68  ("SCardEstablish
6910: 43 6f 6e 74 65 78 74 28 29 20 63 61 6c 6c 65 64  Context() called
6920: 22 29 3b 0a 09 09 73 63 61 72 64 5f 65 73 74 5f  ");...scard_est_
6930: 63 6f 6e 74 65 78 74 5f 72 65 74 20 3d 20 53 43  context_ret = SC
6940: 61 72 64 45 73 74 61 62 6c 69 73 68 43 6f 6e 74  ardEstablishCont
6950: 65 78 74 28 53 43 41 52 44 5f 53 43 4f 50 45 5f  ext(SCARD_SCOPE_
6960: 53 59 53 54 45 4d 2c 20 4e 55 4c 4c 2c 20 4e 55  SYSTEM, NULL, NU
6970: 4c 4c 2c 20 63 61 63 6b 65 79 5f 70 63 73 63 5f  LL, cackey_pcsc_
6980: 68 61 6e 64 6c 65 29 3b 0a 09 09 69 66 20 28 73  handle);...if (s
6990: 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74  card_est_context
69a0: 5f 72 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f  _ret != SCARD_S_
69b0: 53 55 43 43 45 53 53 29 20 7b 0a 09 09 09 43 41  SUCCESS) {....CA
69c0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
69d0: 46 28 22 43 61 6c 6c 20 74 6f 20 53 43 61 72 64  F("Call to SCard
69e0: 45 73 74 61 62 6c 69 73 68 43 6f 6e 74 65 78 74  EstablishContext
69f0: 20 66 61 69 6c 65 64 20 28 72 65 74 75 72 6e 65   failed (returne
6a00: 64 20 25 73 2f 25 6c 69 29 2c 20 72 65 74 75 72  d %s/%li), retur
6a10: 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22  ning in failure"
6a20: 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46  , CACKEY_DEBUG_F
6a30: 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f  UNC_SCARDERR_TO_
6a40: 53 54 52 28 73 63 61 72 64 5f 65 73 74 5f 63 6f  STR(scard_est_co
6a50: 6e 74 65 78 74 5f 72 65 74 29 2c 20 28 6c 6f 6e  ntext_ret), (lon
6a60: 67 29 20 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e  g) scard_est_con
6a70: 74 65 78 74 5f 72 65 74 29 3b 0a 0a 09 09 09 66  text_ret);.....f
6a80: 72 65 65 28 63 61 63 6b 65 79 5f 70 63 73 63 5f  ree(cackey_pcsc_
6a90: 68 61 6e 64 6c 65 29 3b 0a 09 09 09 63 61 63 6b  handle);....cack
6aa0: 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d  ey_pcsc_handle =
6ab0: 20 4e 55 4c 4c 3b 0a 0a 09 09 09 63 61 63 6b 65   NULL;.....cacke
6ac0: 79 5f 73 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e 65  y_slots_disconne
6ad0: 63 74 5f 61 6c 6c 28 29 3b 0a 0a 09 09 09 72 65  ct_all();.....re
6ae0: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
6af0: 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 09 7d  _E_GENERIC);...}
6b00: 0a 09 7d 0a 0a 23 69 66 64 65 66 20 48 41 56 45  ..}..#ifdef HAVE
6b10: 5f 53 43 41 52 44 49 53 56 41 4c 49 44 43 4f 4e  _SCARDISVALIDCON
6b20: 54 45 58 54 0a 09 43 41 43 4b 45 59 5f 44 45 42  TEXT..CACKEY_DEB
6b30: 55 47 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64  UG_PRINTF("SCard
6b40: 49 73 56 61 6c 69 64 43 6f 6e 74 65 78 74 28 29  IsValidContext()
6b50: 20 63 61 6c 6c 65 64 22 29 3b 0a 09 73 63 61 72   called");..scar
6b60: 64 5f 69 73 76 61 6c 69 64 5f 72 65 74 20 3d 20  d_isvalid_ret = 
6b70: 53 43 61 72 64 49 73 56 61 6c 69 64 43 6f 6e 74  SCardIsValidCont
6b80: 65 78 74 28 2a 63 61 63 6b 65 79 5f 70 63 73 63  ext(*cackey_pcsc
6b90: 5f 68 61 6e 64 6c 65 29 3b 0a 09 69 66 20 28 73  _handle);..if (s
6ba0: 63 61 72 64 5f 69 73 76 61 6c 69 64 5f 72 65 74  card_isvalid_ret
6bb0: 20 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43   != SCARD_S_SUCC
6bc0: 45 53 53 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ESS) {...CACKEY_
6bd0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 48 61  DEBUG_PRINTF("Ha
6be0: 6e 64 6c 65 20 68 61 73 20 62 65 63 6f 6d 65 20  ndle has become 
6bf0: 69 6e 76 61 6c 69 64 20 28 53 43 61 72 64 49 73  invalid (SCardIs
6c00: 56 61 6c 69 64 43 6f 6e 74 65 78 74 20 3d 20 25  ValidContext = %
6c10: 73 2f 25 6c 69 29 2c 20 74 72 79 69 6e 67 20 74  s/%li), trying t
6c20: 6f 20 72 65 2d 65 73 74 61 62 6c 69 73 68 2e 2e  o re-establish..
6c30: 2e 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47  .", CACKEY_DEBUG
6c40: 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54  _FUNC_SCARDERR_T
6c50: 4f 5f 53 54 52 28 73 63 61 72 64 5f 69 73 76 61  O_STR(scard_isva
6c60: 6c 69 64 5f 72 65 74 29 2c 20 28 6c 6f 6e 67 29  lid_ret), (long)
6c70: 20 73 63 61 72 64 5f 69 73 76 61 6c 69 64 5f 72   scard_isvalid_r
6c80: 65 74 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  et);....CACKEY_D
6c90: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43 61  EBUG_PRINTF("SCa
6ca0: 72 64 45 73 74 61 62 6c 69 73 68 43 6f 6e 74 65  rdEstablishConte
6cb0: 78 74 28 29 20 63 61 6c 6c 65 64 22 29 3b 0a 09  xt() called");..
6cc0: 09 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65  .scard_est_conte
6cd0: 78 74 5f 72 65 74 20 3d 20 53 43 61 72 64 45 73  xt_ret = SCardEs
6ce0: 74 61 62 6c 69 73 68 43 6f 6e 74 65 78 74 28 53  tablishContext(S
6cf0: 43 41 52 44 5f 53 43 4f 50 45 5f 53 59 53 54 45  CARD_SCOPE_SYSTE
6d00: 4d 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 63  M, NULL, NULL, c
6d10: 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c  ackey_pcsc_handl
6d20: 65 29 3b 0a 09 09 69 66 20 28 73 63 61 72 64 5f  e);...if (scard_
6d30: 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74 20  est_context_ret 
6d40: 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45  != SCARD_S_SUCCE
6d50: 53 53 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  SS) {....CACKEY_
6d60: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
6d70: 6c 6c 20 74 6f 20 53 43 61 72 64 45 73 74 61 62  ll to SCardEstab
6d80: 6c 69 73 68 43 6f 6e 74 65 78 74 20 66 61 69 6c  lishContext fail
6d90: 65 64 20 28 72 65 74 75 72 6e 65 64 20 25 73 2f  ed (returned %s/
6da0: 25 6c 69 29 2c 20 72 65 74 75 72 6e 69 6e 67 20  %li), returning 
6db0: 69 6e 20 66 61 69 6c 75 72 65 22 2c 20 43 41 43  in failure", CAC
6dc0: 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53  KEY_DEBUG_FUNC_S
6dd0: 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73  CARDERR_TO_STR(s
6de0: 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74  card_est_context
6df0: 5f 72 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63  _ret), (long) sc
6e00: 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f  ard_est_context_
6e10: 72 65 74 29 3b 0a 0a 09 09 09 66 72 65 65 28 63  ret);.....free(c
6e20: 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c  ackey_pcsc_handl
6e30: 65 29 3b 0a 09 09 09 63 61 63 6b 65 79 5f 70 63  e);....cackey_pc
6e40: 73 63 5f 68 61 6e 64 6c 65 20 3d 20 4e 55 4c 4c  sc_handle = NULL
6e50: 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f  ;.....cackey_slo
6e60: 74 73 5f 64 69 73 63 6f 6e 6e 65 63 74 5f 61 6c  ts_disconnect_al
6e70: 6c 28 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28  l();.....return(
6e80: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45  CACKEY_PCSC_E_GE
6e90: 4e 45 52 49 43 29 3b 0a 09 09 7d 0a 0a 09 09 43  NERIC);...}....C
6ea0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
6eb0: 54 46 28 22 48 61 6e 64 6c 65 20 68 61 73 20 62  TF("Handle has b
6ec0: 65 65 6e 20 72 65 2d 65 73 74 61 62 6c 69 73 68  een re-establish
6ed0: 65 64 22 29 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a  ed");..}.#endif.
6ee0: 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
6ef0: 52 49 4e 54 46 28 22 53 75 63 65 73 73 66 75 6c  RINTF("Sucessful
6f00: 6c 79 20 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20  ly connected to 
6f10: 50 43 2f 53 43 2c 20 72 65 74 75 72 6e 69 6e 67  PC/SC, returning
6f20: 20 69 6e 20 73 75 63 63 65 73 73 22 29 3b 0a 0a   in success");..
6f30: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
6f40: 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a  CSC_S_OK);.}../*
6f50: 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20  . * SYNPOSIS. * 
6f60: 20 20 20 20 63 61 63 6b 65 79 5f 72 65 74 20 63      cackey_ret c
6f70: 61 63 6b 65 79 5f 70 63 73 63 5f 64 69 73 63 6f  ackey_pcsc_disco
6f80: 6e 6e 65 63 74 28 76 6f 69 64 29 3b 0a 20 2a 0a  nnect(void);. *.
6f90: 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20   * ARGUMENTS. * 
6fa0: 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 52      None. *. * R
6fb0: 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20  ETURN VALUE. *  
6fc0: 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53     CACKEY_PCSC_S
6fd0: 5f 4f 4b 20 20 20 20 20 20 20 20 20 4f 6e 20 73  _OK         On s
6fe0: 75 63 63 65 73 73 0a 20 2a 20 20 20 20 20 43 41  uccess. *     CA
6ff0: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45  CKEY_PCSC_E_GENE
7000: 52 49 43 20 20 20 20 4f 6e 20 65 72 72 6f 72 0a  RIC    On error.
7010: 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20   *. * NOTES. *  
7020: 20 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e     This function
7030: 20 64 69 73 63 6f 6e 6e 65 63 74 73 20 66 72 6f   disconnects fro
7040: 6d 20 74 68 65 20 50 43 2f 53 43 20 43 6f 6e 6e  m the PC/SC Conn
7050: 65 63 74 69 6f 6e 20 6d 61 6e 61 67 65 72 20 61  ection manager a
7060: 6e 64 20 75 70 64 61 74 65 73 0a 20 2a 20 20 20  nd updates. *   
7070: 20 20 74 68 65 20 67 6c 6f 62 61 6c 20 68 61 6e    the global han
7080: 64 6c 65 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74  dle.. *. */.stat
7090: 69 63 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61  ic cackey_ret ca
70a0: 63 6b 65 79 5f 70 63 73 63 5f 64 69 73 63 6f 6e  ckey_pcsc_discon
70b0: 6e 65 63 74 28 76 6f 69 64 29 20 7b 0a 09 4c 4f  nect(void) {..LO
70c0: 4e 47 20 73 63 61 72 64 5f 72 65 6c 5f 63 6f 6e  NG scard_rel_con
70d0: 74 65 78 74 5f 72 65 74 3b 0a 0a 09 43 41 43 4b  text_ret;...CACK
70e0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
70f0: 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
7100: 20 28 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61   (cackey_pcsc_ha
7110: 6e 64 6c 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  ndle == NULL) {.
7120: 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
7130: 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 09 7d 0a 0a  PCSC_S_OK);..}..
7140: 09 73 63 61 72 64 5f 72 65 6c 5f 63 6f 6e 74 65  .scard_rel_conte
7150: 78 74 5f 72 65 74 20 3d 20 53 43 61 72 64 52 65  xt_ret = SCardRe
7160: 6c 65 61 73 65 43 6f 6e 74 65 78 74 28 2a 63 61  leaseContext(*ca
7170: 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65  ckey_pcsc_handle
7180: 29 3b 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f  );...if (cackey_
7190: 70 63 73 63 5f 68 61 6e 64 6c 65 29 20 7b 0a 09  pcsc_handle) {..
71a0: 09 66 72 65 65 28 63 61 63 6b 65 79 5f 70 63 73  .free(cackey_pcs
71b0: 63 5f 68 61 6e 64 6c 65 29 3b 0a 09 0a 09 09 63  c_handle);.....c
71c0: 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c  ackey_pcsc_handl
71d0: 65 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 0a 09 69  e = NULL;..}...i
71e0: 66 20 28 73 63 61 72 64 5f 72 65 6c 5f 63 6f 6e  f (scard_rel_con
71f0: 74 65 78 74 5f 72 65 74 20 21 3d 20 53 43 41 52  text_ret != SCAR
7200: 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09  D_S_SUCCESS) {..
7210: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
7220: 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a  CSC_E_GENERIC);.
7230: 09 7d 0a 0a 09 72 65 74 75 72 6e 28 43 41 43 4b  .}...return(CACK
7240: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d  EY_PCSC_S_OK);.}
7250: 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53  ../*. * SYNPOSIS
7260: 0a 20 2a 20 20 20 20 20 76 6f 69 64 20 63 61 63  . *     void cac
7270: 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65  key_mark_slot_re
7280: 73 65 74 28 73 74 72 75 63 74 20 63 61 63 6b 65  set(struct cacke
7290: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 3b 0a 20  y_slot *slot);. 
72a0: 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20  *. * ARGUMENTS. 
72b0: 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a  *     None. *. *
72c0: 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a   RETURN VALUE. *
72d0: 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 20       None. *. * 
72e0: 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 54 68 69  NOTES. *     Thi
72f0: 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 72 6b 73  s function marks
7300: 20 61 20 73 6c 6f 74 20 68 61 73 20 68 61 76 69   a slot has havi
7310: 6e 67 20 62 65 65 6e 20 72 65 73 65 74 2c 20 74  ng been reset, t
7320: 6f 20 6c 61 74 65 72 20 62 65 20 63 6c 65 61 6e  o later be clean
7330: 65 64 20 75 70 2e 0a 20 2a 20 20 20 20 20 43 6c  ed up.. *     Cl
7340: 65 61 6e 75 70 20 6f 6e 6c 79 20 68 61 70 70 65  eanup only happe
7350: 6e 73 20 77 68 65 6e 20 61 20 50 4b 43 53 23 31  ns when a PKCS#1
7360: 31 20 63 6c 69 65 6e 74 20 63 61 6c 6c 73 20 43  1 client calls C
7370: 5f 46 69 6e 64 4f 62 6a 65 63 74 73 49 6e 69 74  _FindObjectsInit
7380: 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20  .. *. */.static 
7390: 76 6f 69 64 20 63 61 63 6b 65 79 5f 6d 61 72 6b  void cackey_mark
73a0: 5f 73 6c 6f 74 5f 72 65 73 65 74 28 73 74 72 75  _slot_reset(stru
73b0: 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a  ct cackey_slot *
73c0: 73 6c 6f 74 29 20 7b 0a 09 69 66 20 28 73 6c 6f  slot) {..if (slo
73d0: 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72  t == NULL) {...r
73e0: 65 74 75 72 6e 3b 0a 09 7d 0a 0a 09 43 41 43 4b  eturn;..}...CACK
73f0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
7400: 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
7410: 20 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72   (slot->pcsc_car
7420: 64 5f 63 6f 6e 6e 65 63 74 65 64 29 20 7b 0a 09  d_connected) {..
7430: 09 53 43 61 72 64 44 69 73 63 6f 6e 6e 65 63 74  .SCardDisconnect
7440: 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64  (slot->pcsc_card
7450: 2c 20 53 43 41 52 44 5f 4c 45 41 56 45 5f 43 41  , SCARD_LEAVE_CA
7460: 52 44 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 2d 3e  RD);..}...slot->
7470: 73 6c 6f 74 5f 72 65 73 65 74 20 3d 20 31 3b 0a  slot_reset = 1;.
7480: 09 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64  .slot->pcsc_card
7490: 5f 63 6f 6e 6e 65 63 74 65 64 20 3d 20 30 3b 0a  _connected = 0;.
74a0: 09 69 66 20 28 63 61 63 6b 65 79 5f 70 69 6e 5f  .if (cackey_pin_
74b0: 63 6f 6d 6d 61 6e 64 20 3d 3d 20 4e 55 4c 4c 29  command == NULL)
74c0: 20 7b 0a 09 09 73 6c 6f 74 2d 3e 74 6f 6b 65 6e   {...slot->token
74d0: 5f 66 6c 61 67 73 20 3d 20 43 4b 46 5f 4c 4f 47  _flags = CKF_LOG
74e0: 49 4e 5f 52 45 51 55 49 52 45 44 3b 0a 09 7d 20  IN_REQUIRED;..} 
74f0: 65 6c 73 65 20 7b 0a 09 09 73 6c 6f 74 2d 3e 74  else {...slot->t
7500: 6f 6b 65 6e 5f 66 6c 61 67 73 20 3d 20 30 3b 0a  oken_flags = 0;.
7510: 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
7520: 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
7530: 69 6e 67 2e 22 29 3b 0a 0a 09 72 65 74 75 72 6e  ing.");...return
7540: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f  ;.}../*. * SYNPO
7550: 53 49 53 0a 20 2a 20 20 20 20 20 4c 4f 4e 47 20  SIS. *     LONG 
7560: 63 61 63 6b 65 79 5f 72 65 63 6f 6e 6e 65 63 74  cackey_reconnect
7570: 5f 63 61 72 64 28 73 74 72 75 63 74 20 63 61 63  _card(struct cac
7580: 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20  key_slot *slot, 
7590: 44 57 4f 52 44 20 64 65 66 61 75 6c 74 5f 70 72  DWORD default_pr
75a0: 6f 74 6f 63 6f 6c 29 3b 0a 20 2a 0a 20 2a 20 41  otocol);. *. * A
75b0: 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20  RGUMENTS. *     
75c0: 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f  cackey_slot *slo
75d0: 74 0a 20 2a 20 20 20 20 20 20 20 20 20 53 6c 6f  t. *         Slo
75e0: 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d 6d 61 6e  t to send comman
75f0: 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 20 20 20 20  ds to. *. *     
7600: 44 57 4f 52 44 20 64 65 66 61 75 6c 74 5f 70 72  DWORD default_pr
7610: 6f 74 6f 63 6f 6c 0a 20 2a 20 20 20 20 20 20 20  otocol. *       
7620: 20 20 50 72 6f 74 6f 63 6f 6c 20 74 6f 20 61 74    Protocol to at
7630: 74 65 6d 70 74 20 66 69 72 73 74 0a 20 2a 0a 20  tempt first. *. 
7640: 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20  * RETURN VALUE. 
7650: 2a 20 20 20 20 20 54 68 65 20 72 65 74 75 72 6e  *     The return
7660: 20 76 61 6c 75 65 20 66 72 6f 6d 20 53 43 61 72   value from SCar
7670: 64 52 65 63 6f 6e 6e 65 63 74 28 29 0a 20 2a 0a  dReconnect(). *.
7680: 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20   * NOTES. *     
7690: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
76a0: 20 61 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e   a wrapper aroun
76b0: 64 20 53 43 61 72 64 52 65 63 6f 6e 6e 65 63 74  d SCardReconnect
76c0: 28 29 0a 20 2a 0a 20 2a 20 20 20 20 20 54 68 65  (). *. *     The
76d0: 20 53 43 61 72 64 52 65 63 6f 6e 6e 65 63 74 28   SCardReconnect(
76e0: 29 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20  ) function call 
76f0: 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 66  will be called f
7700: 69 72 73 74 20 77 69 74 68 20 74 68 65 0a 20 2a  irst with the. *
7710: 20 20 20 20 20 64 77 50 72 65 66 65 72 72 65 64       dwPreferred
7720: 50 72 6f 74 6f 63 6f 6c 73 20 6f 66 20 22 64 65  Protocols of "de
7730: 66 61 75 6c 74 5f 70 72 6f 74 6f 63 6f 6c 22 2e  fault_protocol".
7740: 20 20 49 66 20 74 68 61 74 20 63 61 6c 6c 20 72    If that call r
7750: 65 74 75 72 6e 73 0a 20 2a 20 20 20 20 20 53 43  eturns. *     SC
7760: 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d  ARD_E_PROTO_MISM
7770: 41 54 43 48 20 74 72 79 20 61 67 61 69 6e 20 77  ATCH try again w
7780: 69 74 68 20 61 20 70 72 6f 74 6f 63 6f 6c 20 6f  ith a protocol o
7790: 66 20 54 3d 30 2c 20 61 6e 64 20 66 61 69 6c 69  f T=0, and faili
77a0: 6e 67 0a 20 2a 20 20 20 20 20 74 68 61 74 20 54  ng. *     that T
77b0: 3d 31 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69  =1.. *. */.stati
77c0: 63 20 4c 4f 4e 47 20 63 61 63 6b 65 79 5f 72 65  c LONG cackey_re
77d0: 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73 74 72  connect_card(str
77e0: 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20  uct cackey_slot 
77f0: 2a 73 6c 6f 74 2c 20 44 57 4f 52 44 20 64 65 66  *slot, DWORD def
7800: 61 75 6c 74 5f 70 72 6f 74 6f 63 6f 6c 29 20 7b  ault_protocol) {
7810: 0a 09 44 57 4f 52 44 20 73 65 6c 65 63 74 65 64  ..DWORD selected
7820: 5f 70 72 6f 74 6f 63 6f 6c 3b 0a 09 4c 4f 4e 47  _protocol;..LONG
7830: 20 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 3b   scard_conn_ret;
7840: 0a 0a 09 73 65 6c 65 63 74 65 64 5f 70 72 6f 74  ...selected_prot
7850: 6f 63 6f 6c 20 3d 20 30 3b 0a 0a 09 73 63 61 72  ocol = 0;...scar
7860: 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 53 43 61  d_conn_ret = SCa
7870: 72 64 52 65 63 6f 6e 6e 65 63 74 28 73 6c 6f 74  rdReconnect(slot
7880: 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 53 43 41  ->pcsc_card, SCA
7890: 52 44 5f 53 48 41 52 45 5f 53 48 41 52 45 44 2c  RD_SHARE_SHARED,
78a0: 20 64 65 66 61 75 6c 74 5f 70 72 6f 74 6f 63 6f   default_protoco
78b0: 6c 2c 20 53 43 41 52 44 5f 52 45 53 45 54 5f 43  l, SCARD_RESET_C
78c0: 41 52 44 2c 20 26 73 65 6c 65 63 74 65 64 5f 70  ARD, &selected_p
78d0: 72 6f 74 6f 63 6f 6c 29 3b 0a 0a 09 69 66 20 28  rotocol);...if (
78e0: 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d  scard_conn_ret =
78f0: 3d 20 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f  = SCARD_E_PROTO_
7900: 4d 49 53 4d 41 54 43 48 29 20 7b 0a 09 09 43 41  MISMATCH) {...CA
7910: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
7920: 46 28 22 53 43 61 72 64 52 65 63 6f 6e 6e 65 63  F("SCardReconnec
7930: 74 28 29 20 72 65 74 75 72 6e 65 64 20 53 43 41  t() returned SCA
7940: 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41  RD_E_PROTO_MISMA
7950: 54 43 48 2c 20 74 72 79 69 6e 67 20 77 69 74 68  TCH, trying with
7960: 20 6a 75 73 74 20 54 3d 30 22 29 0a 09 09 73 63   just T=0")...sc
7970: 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 53  ard_conn_ret = S
7980: 43 61 72 64 52 65 63 6f 6e 6e 65 63 74 28 73 6c  CardReconnect(sl
7990: 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 53  ot->pcsc_card, S
79a0: 43 41 52 44 5f 53 48 41 52 45 5f 53 48 41 52 45  CARD_SHARE_SHARE
79b0: 44 2c 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f  D, SCARD_PROTOCO
79c0: 4c 5f 54 30 2c 20 53 43 41 52 44 5f 52 45 53 45  L_T0, SCARD_RESE
79d0: 54 5f 43 41 52 44 2c 20 26 73 65 6c 65 63 74 65  T_CARD, &selecte
79e0: 64 5f 70 72 6f 74 6f 63 6f 6c 29 3b 0a 0a 09 09  d_protocol);....
79f0: 69 66 20 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72  if (scard_conn_r
7a00: 65 74 20 3d 3d 20 53 43 41 52 44 5f 45 5f 50 52  et == SCARD_E_PR
7a10: 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 29 20 7b 0a  OTO_MISMATCH) {.
7a20: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
7a30: 50 52 49 4e 54 46 28 22 53 43 61 72 64 52 65 63  PRINTF("SCardRec
7a40: 6f 6e 6e 65 63 74 28 29 20 72 65 74 75 72 6e 65  onnect() returne
7a50: 64 20 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f  d SCARD_E_PROTO_
7a60: 4d 49 53 4d 41 54 43 48 2c 20 74 72 79 69 6e 67  MISMATCH, trying
7a70: 20 77 69 74 68 20 6a 75 73 74 20 54 3d 31 22 29   with just T=1")
7a80: 0a 09 09 09 73 63 61 72 64 5f 63 6f 6e 6e 5f 72  ....scard_conn_r
7a90: 65 74 20 3d 20 53 43 61 72 64 52 65 63 6f 6e 6e  et = SCardReconn
7aa0: 65 63 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63  ect(slot->pcsc_c
7ab0: 61 72 64 2c 20 53 43 41 52 44 5f 53 48 41 52 45  ard, SCARD_SHARE
7ac0: 5f 53 48 41 52 45 44 2c 20 53 43 41 52 44 5f 50  _SHARED, SCARD_P
7ad0: 52 4f 54 4f 43 4f 4c 5f 54 31 2c 20 53 43 41 52  ROTOCOL_T1, SCAR
7ae0: 44 5f 52 45 53 45 54 5f 43 41 52 44 2c 20 26 73  D_RESET_CARD, &s
7af0: 65 6c 65 63 74 65 64 5f 70 72 6f 74 6f 63 6f 6c  elected_protocol
7b00: 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28  );...}..}...if (
7b10: 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d  scard_conn_ret =
7b20: 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53  = SCARD_S_SUCCES
7b30: 53 29 20 7b 0a 09 09 73 6c 6f 74 2d 3e 70 72 6f  S) {...slot->pro
7b40: 74 6f 63 6f 6c 20 3d 20 73 65 6c 65 63 74 65 64  tocol = selected
7b50: 5f 70 72 6f 74 6f 63 6f 6c 3b 0a 09 7d 0a 0a 09  _protocol;..}...
7b60: 72 65 74 75 72 6e 28 73 63 61 72 64 5f 63 6f 6e  return(scard_con
7b70: 6e 5f 72 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a  n_ret);.}../*. *
7b80: 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20   SYNPOSIS. *    
7b90: 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b   cackey_ret cack
7ba0: 65 79 5f 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28  ey_connect_card(
7bb0: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c  struct cackey_sl
7bc0: 6f 74 20 2a 73 6c 6f 74 29 3b 0a 20 2a 0a 20 2a  ot *slot);. *. *
7bd0: 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20   ARGUMENTS. *   
7be0: 20 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73    cackey_slot *s
7bf0: 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20 53  lot. *         S
7c00: 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d 6d  lot to send comm
7c10: 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 52 45  ands to. *. * RE
7c20: 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20  TURN VALUE. *   
7c30: 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f    CACKEY_PCSC_S_
7c40: 4f 4b 20 20 20 20 20 20 20 20 20 4f 6e 20 73 75  OK         On su
7c50: 63 63 65 73 73 0a 20 2a 20 20 20 20 20 43 41 43  ccess. *     CAC
7c60: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52  KEY_PCSC_E_GENER
7c70: 49 43 20 20 20 20 4f 6e 20 65 72 72 6f 72 0a 20  IC    On error. 
7c80: 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20  *. * NOTES. *   
7c90: 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 2f 0a 73 74    None. *. */.st
7ca0: 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74 20  atic cackey_ret 
7cb0: 63 61 63 6b 65 79 5f 63 6f 6e 6e 65 63 74 5f 63  cackey_connect_c
7cc0: 61 72 64 28 73 74 72 75 63 74 20 63 61 63 6b 65  ard(struct cacke
7cd0: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 20 7b 0a  y_slot *slot) {.
7ce0: 09 63 61 63 6b 65 79 5f 72 65 74 20 70 63 73 63  .cackey_ret pcsc
7cf0: 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 3b 0a 09 44  _connect_ret;..D
7d00: 57 4f 52 44 20 70 72 6f 74 6f 63 6f 6c 3b 0a 09  WORD protocol;..
7d10: 4c 4f 4e 47 20 73 63 61 72 64 5f 63 6f 6e 6e 5f  LONG scard_conn_
7d20: 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ret;...CACKEY_DE
7d30: 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
7d40: 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 73 6c  ed.");...if (!sl
7d50: 6f 74 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ot) {...CACKEY_D
7d60: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 49 6e 76  EBUG_PRINTF("Inv
7d70: 61 6c 69 64 20 73 6c 6f 74 20 73 70 65 63 69 66  alid slot specif
7d80: 69 65 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69  ied, returning i
7d90: 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09  n failure");....
7da0: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
7db0: 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09  SC_E_GENERIC);..
7dc0: 7d 0a 0a 09 70 63 73 63 5f 63 6f 6e 6e 65 63 74  }...pcsc_connect
7dd0: 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 70 63  _ret = cackey_pc
7de0: 73 63 5f 63 6f 6e 6e 65 63 74 28 29 3b 0a 09 69  sc_connect();..i
7df0: 66 20 28 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f  f (pcsc_connect_
7e00: 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43  ret != CACKEY_PC
7e10: 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43  SC_S_OK) {...CAC
7e20: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
7e30: 28 22 43 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  ("Connection to 
7e40: 50 43 2f 53 43 20 66 61 69 6c 65 64 2c 20 72 65  PC/SC failed, re
7e50: 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
7e60: 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  re");....return(
7e70: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45  CACKEY_PCSC_E_GE
7e80: 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 2f 2a 20  NERIC);..}.../* 
7e90: 43 6f 6e 6e 65 63 74 20 74 6f 20 72 65 61 64 65  Connect to reade
7ea0: 72 2c 20 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a  r, if needed */.
7eb0: 09 69 66 20 28 21 73 6c 6f 74 2d 3e 70 63 73 63  .if (!slot->pcsc
7ec0: 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 29  _card_connected)
7ed0: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
7ee0: 47 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64 43  G_PRINTF("SCardC
7ef0: 6f 6e 6e 65 63 74 28 25 73 29 20 63 61 6c 6c 65  onnect(%s) calle
7f00: 64 20 66 6f 72 20 73 6c 6f 74 20 25 70 22 2c 20  d for slot %p", 
7f10: 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64 65  slot->pcsc_reade
7f20: 72 2c 20 73 6c 6f 74 29 3b 0a 09 09 73 63 61 72  r, slot);...scar
7f30: 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 53 43 61  d_conn_ret = SCa
7f40: 72 64 43 6f 6e 6e 65 63 74 28 2a 63 61 63 6b 65  rdConnect(*cacke
7f50: 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20 73  y_pcsc_handle, s
7f60: 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64 65 72  lot->pcsc_reader
7f70: 2c 20 53 43 41 52 44 5f 53 48 41 52 45 5f 53 48  , SCARD_SHARE_SH
7f80: 41 52 45 44 2c 20 53 43 41 52 44 5f 50 52 4f 54  ARED, SCARD_PROT
7f90: 4f 43 4f 4c 5f 54 30 20 7c 20 53 43 41 52 44 5f  OCOL_T0 | SCARD_
7fa0: 50 52 4f 54 4f 43 4f 4c 5f 54 31 2c 20 26 73 6c  PROTOCOL_T1, &sl
7fb0: 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 26  ot->pcsc_card, &
7fc0: 70 72 6f 74 6f 63 6f 6c 29 3b 0a 0a 09 09 69 66  protocol);....if
7fd0: 20 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74   (scard_conn_ret
7fe0: 20 3d 3d 20 53 43 41 52 44 5f 45 5f 50 52 4f 54   == SCARD_E_PROT
7ff0: 4f 5f 4d 49 53 4d 41 54 43 48 29 20 7b 0a 09 09  O_MISMATCH) {...
8000: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
8010: 49 4e 54 46 28 22 53 43 61 72 64 43 6f 6e 6e 65  INTF("SCardConne
8020: 63 74 28 29 20 72 65 74 75 72 6e 65 64 20 53 43  ct() returned SC
8030: 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d  ARD_E_PROTO_MISM
8040: 41 54 43 48 2c 20 74 72 79 69 6e 67 20 77 69 74  ATCH, trying wit
8050: 68 20 6a 75 73 74 20 54 3d 30 22 29 0a 09 09 09  h just T=0")....
8060: 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d  scard_conn_ret =
8070: 20 53 43 61 72 64 43 6f 6e 6e 65 63 74 28 2a 63   SCardConnect(*c
8080: 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c  ackey_pcsc_handl
8090: 65 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 65  e, slot->pcsc_re
80a0: 61 64 65 72 2c 20 53 43 41 52 44 5f 53 48 41 52  ader, SCARD_SHAR
80b0: 45 5f 53 48 41 52 45 44 2c 20 53 43 41 52 44 5f  E_SHARED, SCARD_
80c0: 50 52 4f 54 4f 43 4f 4c 5f 54 30 2c 20 26 73 6c  PROTOCOL_T0, &sl
80d0: 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 26  ot->pcsc_card, &
80e0: 70 72 6f 74 6f 63 6f 6c 29 3b 0a 0a 09 09 09 69  protocol);.....i
80f0: 66 20 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65  f (scard_conn_re
8100: 74 20 3d 3d 20 53 43 41 52 44 5f 45 5f 50 52 4f  t == SCARD_E_PRO
8110: 54 4f 5f 4d 49 53 4d 41 54 43 48 29 20 7b 0a 09  TO_MISMATCH) {..
8120: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
8130: 50 52 49 4e 54 46 28 22 53 43 61 72 64 43 6f 6e  PRINTF("SCardCon
8140: 6e 65 63 74 28 29 20 72 65 74 75 72 6e 65 64 20  nect() returned 
8150: 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49  SCARD_E_PROTO_MI
8160: 53 4d 41 54 43 48 2c 20 74 72 79 69 6e 67 20 77  SMATCH, trying w
8170: 69 74 68 20 6a 75 73 74 20 54 3d 31 22 29 0a 09  ith just T=1")..
8180: 09 09 09 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65  ...scard_conn_re
8190: 74 20 3d 20 53 43 61 72 64 43 6f 6e 6e 65 63 74  t = SCardConnect
81a0: 28 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61  (*cackey_pcsc_ha
81b0: 6e 64 6c 65 2c 20 73 6c 6f 74 2d 3e 70 63 73 63  ndle, slot->pcsc
81c0: 5f 72 65 61 64 65 72 2c 20 53 43 41 52 44 5f 53  _reader, SCARD_S
81d0: 48 41 52 45 5f 53 48 41 52 45 44 2c 20 53 43 41  HARE_SHARED, SCA
81e0: 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31 2c 20  RD_PROTOCOL_T1, 
81f0: 26 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64  &slot->pcsc_card
8200: 2c 20 26 70 72 6f 74 6f 63 6f 6c 29 3b 0a 09 09  , &protocol);...
8210: 09 7d 0a 09 09 7d 0a 0a 09 09 69 66 20 28 73 63  .}...}....if (sc
8220: 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20  ard_conn_ret == 
8230: 53 43 41 52 44 5f 57 5f 55 4e 50 4f 57 45 52 45  SCARD_W_UNPOWERE
8240: 44 5f 43 41 52 44 29 20 7b 0a 09 09 09 43 41 43  D_CARD) {....CAC
8250: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
8260: 28 22 53 43 61 72 64 43 6f 6e 6e 65 63 74 28 29  ("SCardConnect()
8270: 20 72 65 74 75 72 6e 65 64 20 53 43 41 52 44 5f   returned SCARD_
8280: 57 5f 55 4e 50 4f 57 45 52 45 44 5f 43 41 52 44  W_UNPOWERED_CARD
8290: 2c 20 74 72 79 69 6e 67 20 74 6f 20 72 65 2d 63  , trying to re-c
82a0: 6f 6e 6e 65 63 74 2e 2e 2e 22 29 3b 0a 0a 09 09  onnect...");....
82b0: 09 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20  .scard_conn_ret 
82c0: 3d 20 53 43 61 72 64 43 6f 6e 6e 65 63 74 28 2a  = SCardConnect(*
82d0: 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64  cackey_pcsc_hand
82e0: 6c 65 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72  le, slot->pcsc_r
82f0: 65 61 64 65 72 2c 20 53 43 41 52 44 5f 53 48 41  eader, SCARD_SHA
8300: 52 45 5f 44 49 52 45 43 54 2c 20 53 43 41 52 44  RE_DIRECT, SCARD
8310: 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 20 7c 20 53  _PROTOCOL_T0 | S
8320: 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31  CARD_PROTOCOL_T1
8330: 2c 20 26 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61  , &slot->pcsc_ca
8340: 72 64 2c 20 26 70 72 6f 74 6f 63 6f 6c 29 3b 0a  rd, &protocol);.
8350: 0a 09 09 09 69 66 20 28 73 63 61 72 64 5f 63 6f  ....if (scard_co
8360: 6e 6e 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f  nn_ret == SCARD_
8370: 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48  E_PROTO_MISMATCH
8380: 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  ) {.....CACKEY_D
8390: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43 61  EBUG_PRINTF("SCa
83a0: 72 64 43 6f 6e 6e 65 63 74 28 29 20 72 65 74 75  rdConnect() retu
83b0: 72 6e 65 64 20 53 43 41 52 44 5f 45 5f 50 52 4f  rned SCARD_E_PRO
83c0: 54 4f 5f 4d 49 53 4d 41 54 43 48 2c 20 74 72 79  TO_MISMATCH, try
83d0: 69 6e 67 20 77 69 74 68 20 6a 75 73 74 20 54 3d  ing with just T=
83e0: 30 22 29 0a 09 09 09 09 73 63 61 72 64 5f 63 6f  0").....scard_co
83f0: 6e 6e 5f 72 65 74 20 3d 20 53 43 61 72 64 43 6f  nn_ret = SCardCo
8400: 6e 6e 65 63 74 28 2a 63 61 63 6b 65 79 5f 70 63  nnect(*cackey_pc
8410: 73 63 5f 68 61 6e 64 6c 65 2c 20 73 6c 6f 74 2d  sc_handle, slot-
8420: 3e 70 63 73 63 5f 72 65 61 64 65 72 2c 20 53 43  >pcsc_reader, SC
8430: 41 52 44 5f 53 48 41 52 45 5f 53 48 41 52 45 44  ARD_SHARE_SHARED
8440: 2c 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c  , SCARD_PROTOCOL
8450: 5f 54 30 2c 20 26 73 6c 6f 74 2d 3e 70 63 73 63  _T0, &slot->pcsc
8460: 5f 63 61 72 64 2c 20 26 70 72 6f 74 6f 63 6f 6c  _card, &protocol
8470: 29 3b 0a 0a 09 09 09 09 69 66 20 28 73 63 61 72  );......if (scar
8480: 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53 43  d_conn_ret == SC
8490: 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d  ARD_E_PROTO_MISM
84a0: 41 54 43 48 29 20 7b 0a 09 09 09 09 09 43 41 43  ATCH) {......CAC
84b0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
84c0: 28 22 53 43 61 72 64 43 6f 6e 6e 65 63 74 28 29  ("SCardConnect()
84d0: 20 72 65 74 75 72 6e 65 64 20 53 43 41 52 44 5f   returned SCARD_
84e0: 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48  E_PROTO_MISMATCH
84f0: 2c 20 74 72 79 69 6e 67 20 77 69 74 68 20 6a 75  , trying with ju
8500: 73 74 20 54 3d 31 22 29 0a 09 09 09 09 09 73 63  st T=1")......sc
8510: 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 53  ard_conn_ret = S
8520: 43 61 72 64 43 6f 6e 6e 65 63 74 28 2a 63 61 63  CardConnect(*cac
8530: 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c  key_pcsc_handle,
8540: 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64   slot->pcsc_read
8550: 65 72 2c 20 53 43 41 52 44 5f 53 48 41 52 45 5f  er, SCARD_SHARE_
8560: 53 48 41 52 45 44 2c 20 53 43 41 52 44 5f 50 52  SHARED, SCARD_PR
8570: 4f 54 4f 43 4f 4c 5f 54 31 2c 20 26 73 6c 6f 74  OTOCOL_T1, &slot
8580: 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 26 70 72  ->pcsc_card, &pr
8590: 6f 74 6f 63 6f 6c 29 3b 0a 09 09 09 09 7d 0a 09  otocol);.....}..
85a0: 09 09 7d 0a 0a 09 09 09 73 63 61 72 64 5f 63 6f  ..}.....scard_co
85b0: 6e 6e 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f  nn_ret = cackey_
85c0: 72 65 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73  reconnect_card(s
85d0: 6c 6f 74 2c 20 70 72 6f 74 6f 63 6f 6c 29 3b 0a  lot, protocol);.
85e0: 09 09 7d 0a 0a 09 09 69 66 20 28 73 63 61 72 64  ..}....if (scard
85f0: 5f 63 6f 6e 6e 5f 72 65 74 20 21 3d 20 53 43 41  _conn_ret != SCA
8600: 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a  RD_S_SUCCESS) {.
8610: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
8620: 50 52 49 4e 54 46 28 22 43 6f 6e 6e 65 63 74 69  PRINTF("Connecti
8630: 6f 6e 20 74 6f 20 63 61 72 64 20 66 61 69 6c 65  on to card faile
8640: 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20  d, returning in 
8650: 66 61 69 6c 75 72 65 20 28 53 43 61 72 64 43 6f  failure (SCardCo
8660: 6e 6e 65 63 74 28 29 20 3d 20 25 73 2f 25 6c 69  nnect() = %s/%li
8670: 29 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47  )", CACKEY_DEBUG
8680: 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54  _FUNC_SCARDERR_T
8690: 4f 5f 53 54 52 28 73 63 61 72 64 5f 63 6f 6e 6e  O_STR(scard_conn
86a0: 5f 72 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63  _ret), (long) sc
86b0: 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 29 3b 0a 0a  ard_conn_ret);..
86c0: 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
86d0: 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29  _PCSC_E_GENERIC)
86e0: 3b 0a 09 09 7d 0a 0a 09 09 73 6c 6f 74 2d 3e 70  ;...}....slot->p
86f0: 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74  csc_card_connect
8700: 65 64 20 3d 20 31 3b 0a 09 09 73 6c 6f 74 2d 3e  ed = 1;...slot->
8710: 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74  transaction_dept
8720: 68 20 3d 20 30 3b 0a 09 09 73 6c 6f 74 2d 3e 74  h = 0;...slot->t
8730: 72 61 6e 73 61 63 74 69 6f 6e 5f 6e 65 65 64 5f  ransaction_need_
8740: 68 77 5f 6c 6f 63 6b 20 3d 20 30 3b 0a 09 09 73  hw_lock = 0;...s
8750: 6c 6f 74 2d 3e 70 72 6f 74 6f 63 6f 6c 20 3d 20  lot->protocol = 
8760: 70 72 6f 74 6f 63 6f 6c 3b 0a 09 7d 0a 0a 09 43  protocol;..}...C
8770: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
8780: 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e  TF("Returning in
8790: 20 73 75 63 63 65 73 73 22 29 3b 0a 0a 09 72 65   success");...re
87a0: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
87b0: 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a  _S_OK);.}../*. *
87c0: 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20   SYNPOSIS. *    
87d0: 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b   cackey_ret cack
87e0: 65 79 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 63  ey_begin_transac
87f0: 74 69 6f 6e 28 73 74 72 75 63 74 20 63 61 63 6b  tion(struct cack
8800: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 3b 0a  ey_slot *slot);.
8810: 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a   *. * ARGUMENTS.
8820: 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 73 6c   *     cackey_sl
8830: 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20  ot *slot. *     
8840: 20 20 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64      Slot to send
8850: 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a   commands to. *.
8860: 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a   * RETURN VALUE.
8870: 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43   *     CACKEY_PC
8880: 53 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 20  SC_S_OK         
8890: 4f 6e 20 73 75 63 63 65 73 73 0a 20 2a 20 20 20  On success. *   
88a0: 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f    CACKEY_PCSC_E_
88b0: 47 45 4e 45 52 49 43 20 20 20 20 4f 6e 20 65 72  GENERIC    On er
88c0: 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a  ror. *. * NOTES.
88d0: 20 2a 20 20 20 20 20 54 68 65 20 74 72 61 6e 73   *     The trans
88e0: 61 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65  action should be
88f0: 20 74 65 72 6d 69 6e 61 74 65 64 20 75 73 69 6e   terminated usin
8900: 67 20 22 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72  g "cackey_end_tr
8910: 61 6e 73 61 63 74 69 6f 6e 22 0a 20 2a 0a 20 2a  ansaction". *. *
8920: 2f 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f  /.static cackey_
8930: 72 65 74 20 63 61 63 6b 65 79 5f 62 65 67 69 6e  ret cackey_begin
8940: 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 74 72  _transaction(str
8950: 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20  uct cackey_slot 
8960: 2a 73 6c 6f 74 29 20 7b 0a 09 63 61 63 6b 65 79  *slot) {..cackey
8970: 5f 72 65 74 20 63 61 63 6b 65 79 5f 63 6f 6e 6e  _ret cackey_conn
8980: 5f 72 65 74 3b 0a 09 4c 4f 4e 47 20 73 63 61 72  _ret;..LONG scar
8990: 64 5f 74 72 61 6e 73 5f 72 65 74 3b 0a 0a 09 43  d_trans_ret;...C
89a0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
89b0: 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
89c0: 09 63 61 63 6b 65 79 5f 63 6f 6e 6e 5f 72 65 74  .cackey_conn_ret
89d0: 20 3d 20 63 61 63 6b 65 79 5f 63 6f 6e 6e 65 63   = cackey_connec
89e0: 74 5f 63 61 72 64 28 73 6c 6f 74 29 3b 0a 09 69  t_card(slot);..i
89f0: 66 20 28 63 61 63 6b 65 79 5f 63 6f 6e 6e 5f 72  f (cackey_conn_r
8a00: 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53  et != CACKEY_PCS
8a10: 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b  C_S_OK) {...CACK
8a20: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
8a30: 22 55 6e 61 62 6c 65 20 74 6f 20 63 6f 6e 6e 65  "Unable to conne
8a40: 63 74 20 74 6f 20 63 61 72 64 2c 20 72 65 74 75  ct to card, retu
8a50: 72 6e 69 6e 67 20 69 6e 20 65 72 72 6f 72 22 29  rning in error")
8a60: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b  ;....return(CACK
8a70: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49  EY_PCSC_E_GENERI
8a80: 43 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 2d 3e 74  C);..}...slot->t
8a90: 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68  ransaction_depth
8aa0: 2b 2b 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 2d 3e  ++;...if (slot->
8ab0: 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74  transaction_dept
8ac0: 68 20 3e 20 31 20 26 26 20 21 73 6c 6f 74 2d 3e  h > 1 && !slot->
8ad0: 74 72 61 6e 73 61 63 74 69 6f 6e 5f 6e 65 65 64  transaction_need
8ae0: 5f 68 77 5f 6c 6f 63 6b 29 20 7b 0a 09 09 43 41  _hw_lock) {...CA
8af0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
8b00: 46 28 22 41 6c 72 65 61 64 79 20 69 6e 20 61 20  F("Already in a 
8b10: 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 70 65 72  transaction, per
8b20: 66 6f 72 6d 69 6e 67 20 6e 6f 20 61 63 74 69 6f  forming no actio
8b30: 6e 20 28 6e 65 77 20 64 65 70 74 68 20 3d 20 25  n (new depth = %
8b40: 69 29 22 2c 20 73 6c 6f 74 2d 3e 74 72 61 6e 73  i)", slot->trans
8b50: 61 63 74 69 6f 6e 5f 64 65 70 74 68 29 3b 0a 0a  action_depth);..
8b60: 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
8b70: 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 09 7d 0a 0a  PCSC_S_OK);..}..
8b80: 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69  .slot->transacti
8b90: 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b 20  on_need_hw_lock 
8ba0: 3d 20 30 3b 0a 0a 09 73 63 61 72 64 5f 74 72 61  = 0;...scard_tra
8bb0: 6e 73 5f 72 65 74 20 3d 20 53 43 61 72 64 42 65  ns_ret = SCardBe
8bc0: 67 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 28 73  ginTransaction(s
8bd0: 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 29 3b  lot->pcsc_card);
8be0: 0a 09 69 66 20 28 73 63 61 72 64 5f 74 72 61 6e  ..if (scard_tran
8bf0: 73 5f 72 65 74 20 21 3d 20 53 43 41 52 44 5f 53  s_ret != SCARD_S
8c00: 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09 43 41  _SUCCESS) {...CA
8c10: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
8c20: 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 62 65 67  F("Unable to beg
8c30: 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  in transaction, 
8c40: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 65 72 72  returning in err
8c50: 6f 72 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  or");....return(
8c60: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45  CACKEY_PCSC_E_GE
8c70: 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 43 41 43  NERIC);..}...CAC
8c80: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
8c90: 28 22 53 75 63 65 73 73 66 75 6c 6c 79 20 62 65  ("Sucessfully be
8ca0: 67 61 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  gan transaction 
8cb0: 6f 6e 20 73 6c 6f 74 20 28 25 73 29 22 2c 20 73  on slot (%s)", s
8cc0: 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64 65 72  lot->pcsc_reader
8cd0: 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41 43 4b  );...return(CACK
8ce0: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d  EY_PCSC_S_OK);.}
8cf0: 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53  ../*. * SYNPOSIS
8d00: 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 72  . *     cackey_r
8d10: 65 74 20 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72  et cackey_end_tr
8d20: 61 6e 73 61 63 74 69 6f 6e 28 73 74 72 75 63 74  ansaction(struct
8d30: 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c   cackey_slot *sl
8d40: 6f 74 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d  ot);. *. * ARGUM
8d50: 45 4e 54 53 0a 20 2a 20 20 20 20 20 63 61 63 6b  ENTS. *     cack
8d60: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a  ey_slot *slot. *
8d70: 20 20 20 20 20 20 20 20 20 53 6c 6f 74 20 74 6f           Slot to
8d80: 20 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74   send commands t
8d90: 6f 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56  o. *. * RETURN V
8da0: 41 4c 55 45 0a 20 2a 20 20 20 20 20 43 41 43 4b  ALUE. *     CACK
8db0: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20 20  EY_PCSC_S_OK    
8dc0: 20 20 20 20 20 4f 6e 20 73 75 63 63 65 73 73 0a       On success.
8dd0: 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43   *     CACKEY_PC
8de0: 53 43 5f 45 5f 47 45 4e 45 52 49 43 20 20 20 20  SC_E_GENERIC    
8df0: 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a 20 2a 20 4e  On error. *. * N
8e00: 4f 54 45 53 0a 20 2a 20 20 20 20 20 54 68 69 73  OTES. *     This
8e10: 20 66 75 6e 63 74 69 6f 6e 20 72 65 71 75 69 72   function requir
8e20: 65 73 20 22 63 61 63 6b 65 79 5f 62 65 67 69 6e  es "cackey_begin
8e30: 5f 74 72 61 6e 73 61 63 74 69 6f 6e 22 20 74 6f  _transaction" to
8e40: 20 62 65 20 63 61 6c 6c 65 64 20 66 69 72 73 74   be called first
8e50: 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63  . *. */.static c
8e60: 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79  ackey_ret cackey
8e70: 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
8e80: 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73  (struct cackey_s
8e90: 6c 6f 74 20 2a 73 6c 6f 74 29 20 7b 0a 09 4c 4f  lot *slot) {..LO
8ea0: 4e 47 20 73 63 61 72 64 5f 74 72 61 6e 73 5f 72  NG scard_trans_r
8eb0: 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  et;...CACKEY_DEB
8ec0: 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
8ed0: 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 73 6c 6f  d.");...if (!slo
8ee0: 74 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e  t->pcsc_card_con
8ef0: 6e 65 63 74 65 64 29 20 7b 0a 09 09 43 41 43 4b  nected) {...CACK
8f00: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
8f10: 22 43 61 72 64 20 69 73 20 6e 6f 74 20 63 6f 6e  "Card is not con
8f20: 6e 65 63 74 65 64 2c 20 75 6e 61 62 6c 65 20 74  nected, unable t
8f30: 6f 20 65 6e 64 20 74 72 61 6e 73 61 63 74 69 6f  o end transactio
8f40: 6e 20 6f 6e 20 63 61 72 64 22 29 3b 0a 0a 09 09  n on card");....
8f50: 69 66 20 28 73 6c 6f 74 2d 3e 74 72 61 6e 73 61  if (slot->transa
8f60: 63 74 69 6f 6e 5f 64 65 70 74 68 20 3e 20 30 29  ction_depth > 0)
8f70: 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
8f80: 55 47 5f 50 52 49 4e 54 46 28 22 44 65 63 72 65  UG_PRINTF("Decre
8f90: 61 73 69 6e 67 20 74 72 61 6e 73 61 63 74 69 6f  asing transactio
8fa0: 6e 20 64 65 70 74 68 20 61 6e 64 20 61 73 6b 69  n depth and aski
8fb0: 6e 67 20 66 6f 72 20 61 20 68 61 72 64 77 61 72  ng for a hardwar
8fc0: 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6e 65  e lock on the ne
8fd0: 78 74 20 62 65 67 69 6e 20 74 72 61 6e 73 61 63  xt begin transac
8fe0: 74 69 6f 6e 20 28 63 75 72 72 65 6e 74 20 64 65  tion (current de
8ff0: 70 74 68 20 3d 20 25 69 29 22 2c 20 73 6c 6f 74  pth = %i)", slot
9000: 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65  ->transaction_de
9010: 70 74 68 29 3b 0a 0a 09 09 09 73 6c 6f 74 2d 3e  pth);.....slot->
9020: 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74  transaction_dept
9030: 68 2d 2d 3b 0a 0a 09 09 09 69 66 20 28 73 6c 6f  h--;.....if (slo
9040: 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64  t->transaction_d
9050: 65 70 74 68 20 3e 20 30 29 20 7b 0a 09 09 09 09  epth > 0) {.....
9060: 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f  slot->transactio
9070: 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b 20 3d  n_need_hw_lock =
9080: 20 31 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09   1;....}...}....
9090: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
90a0: 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09  SC_E_GENERIC);..
90b0: 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 2d 3e 74 72  }...if (slot->tr
90c0: 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20  ansaction_depth 
90d0: 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  == 0) {...CACKEY
90e0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54  _DEBUG_PRINTF("T
90f0: 65 72 6d 69 6e 61 74 69 6e 67 20 61 20 74 72 61  erminating a tra
9100: 6e 73 61 63 74 69 6f 6e 20 74 68 61 74 20 68 61  nsaction that ha
9110: 73 20 6e 6f 74 20 62 65 67 75 6e 21 22 29 3b 0a  s not begun!");.
9120: 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
9130: 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29  _PCSC_E_GENERIC)
9140: 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 2d 3e 74 72 61  ;..}...slot->tra
9150: 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 2d 2d  nsaction_depth--
9160: 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 2d 3e 74 72  ;...if (slot->tr
9170: 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20  ansaction_depth 
9180: 3e 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  > 0) {...CACKEY_
9190: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54 72  DEBUG_PRINTF("Tr
91a0: 61 6e 73 61 63 74 69 6f 6e 73 20 73 74 69 6c 6c  ansactions still
91b0: 20 69 6e 20 70 72 6f 67 72 65 73 73 2c 20 6e 6f   in progress, no
91c0: 74 20 74 65 72 6d 69 6e 61 74 69 6e 67 20 6f 6e  t terminating on
91d0: 2d 63 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f  -card Transactio
91e0: 6e 20 28 63 75 72 72 65 6e 74 20 64 65 70 74 68  n (current depth
91f0: 20 3d 20 25 69 29 22 2c 20 73 6c 6f 74 2d 3e 74   = %i)", slot->t
9200: 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68  ransaction_depth
9210: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43  );....return(CAC
9220: 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a  KEY_PCSC_S_OK);.
9230: 09 7d 0a 0a 09 73 63 61 72 64 5f 74 72 61 6e 73  .}...scard_trans
9240: 5f 72 65 74 20 3d 20 53 43 61 72 64 45 6e 64 54  _ret = SCardEndT
9250: 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 2d  ransaction(slot-
9260: 3e 70 63 73 63 5f 63 61 72 64 2c 20 53 43 41 52  >pcsc_card, SCAR
9270: 44 5f 4c 45 41 56 45 5f 43 41 52 44 29 3b 0a 09  D_LEAVE_CARD);..
9280: 69 66 20 28 73 63 61 72 64 5f 74 72 61 6e 73 5f  if (scard_trans_
9290: 72 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f 53  ret != SCARD_S_S
92a0: 55 43 43 45 53 53 29 20 7b 0a 09 09 43 41 43 4b  UCCESS) {...CACK
92b0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
92c0: 22 55 6e 61 62 6c 65 20 74 6f 20 65 6e 64 20 74  "Unable to end t
92d0: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 72 65 74 75  ransaction, retu
92e0: 72 6e 69 6e 67 20 69 6e 20 65 72 72 6f 72 22 29  rning in error")
92f0: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b  ;....return(CACK
9300: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49  EY_PCSC_E_GENERI
9310: 43 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  C);..}...CACKEY_
9320: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 75  DEBUG_PRINTF("Su
9330: 63 65 73 73 66 75 6c 6c 79 20 74 65 72 6d 69 6e  cessfully termin
9340: 61 74 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e  ated transaction
9350: 20 6f 6e 20 73 6c 6f 74 20 28 25 73 29 22 2c 20   on slot (%s)", 
9360: 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64 65  slot->pcsc_reade
9370: 72 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41 43  r);...return(CAC
9380: 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a  KEY_PCSC_S_OK);.
9390: 7d 0a 0a 2f 2a 20 41 50 44 55 20 52 65 6c 61 74  }../* APDU Relat
93a0: 65 64 20 46 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a  ed Functions */.
93b0: 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20  /*. * SYNPOSIS. 
93c0: 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 72 65 74  *     cackey_ret
93d0: 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64   cackey_send_apd
93e0: 75 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  u(struct cackey_
93f0: 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69  slot *slot, unsi
9400: 67 6e 65 64 20 63 68 61 72 20 63 6c 61 73 73 2c  gned char class,
9410: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 69   unsigned char i
9420: 6e 73 74 72 75 63 74 69 6f 6e 2c 20 75 6e 73 69  nstruction, unsi
9430: 67 6e 65 64 20 63 68 61 72 20 70 31 2c 20 75 6e  gned char p1, un
9440: 73 69 67 6e 65 64 20 63 68 61 72 20 70 32 2c 20  signed char p2, 
9450: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6c 63  unsigned char lc
9460: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
9470: 2a 64 61 74 61 2c 20 75 6e 73 69 67 6e 65 64 20  *data, unsigned 
9480: 63 68 61 72 20 6c 65 2c 20 75 69 6e 74 31 36 5f  char le, uint16_
9490: 74 20 2a 72 65 73 70 63 6f 64 65 2c 20 75 6e 73  t *respcode, uns
94a0: 69 67 6e 65 64 20 63 68 61 72 20 2a 72 65 73 70  igned char *resp
94b0: 64 61 74 61 2c 20 73 69 7a 65 5f 74 20 2a 72 65  data, size_t *re
94c0: 73 70 64 61 74 61 5f 6c 65 6e 29 3b 0a 20 2a 0a  spdata_len);. *.
94d0: 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20   * ARGUMENTS. * 
94e0: 20 20 20 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20      cackey_slot 
94f0: 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20 20  *slot. *        
9500: 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f   Slot to send co
9510: 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20  mmands to. *. * 
9520: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
9530: 72 20 63 6c 61 73 73 0a 20 2a 20 20 20 20 20 20  r class. *      
9540: 20 20 20 41 50 44 55 20 43 6c 61 73 73 20 28 47     APDU Class (G
9550: 53 43 49 53 5f 43 4c 41 53 53 5f 49 53 4f 37 38  SCIS_CLASS_ISO78
9560: 31 36 20 6f 72 20 47 53 43 49 53 5f 43 4c 41 53  16 or GSCIS_CLAS
9570: 53 5f 47 4c 4f 42 41 4c 5f 50 4c 41 54 46 4f 52  S_GLOBAL_PLATFOR
9580: 4d 0a 20 2a 20 20 20 20 20 20 20 20 20 75 73 75  M. *         usu
9590: 61 6c 6c 79 29 2c 20 28 43 4c 41 29 0a 20 2a 0a  ally), (CLA). *.
95a0: 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20   *     unsigned 
95b0: 63 68 61 72 20 69 6e 73 74 72 75 63 74 69 6f 6e  char instruction
95c0: 0a 20 2a 20 20 20 20 20 20 20 20 20 41 50 44 55  . *         APDU
95d0: 20 49 6e 73 74 72 75 63 74 69 6f 6e 20 28 49 4e   Instruction (IN
95e0: 53 29 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73  S). *. *     uns
95f0: 69 67 6e 65 64 20 63 68 61 72 20 70 31 0a 20 2a  igned char p1. *
9600: 20 20 20 20 20 20 20 20 20 41 50 44 55 20 50 61           APDU Pa
9610: 72 61 6d 65 74 65 72 20 31 20 28 50 31 29 0a 20  rameter 1 (P1). 
9620: 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65  *. *     unsigne
9630: 64 20 63 68 61 72 20 70 32 0a 20 2a 20 20 20 20  d char p2. *    
9640: 20 20 20 20 20 41 50 44 55 20 50 61 72 61 6d 65       APDU Parame
9650: 74 65 72 20 32 20 28 50 32 29 0a 20 2a 0a 20 2a  ter 2 (P2). *. *
9660: 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68       unsigned ch
9670: 61 72 20 6c 63 0a 20 2a 20 20 20 20 20 20 20 20  ar lc. *        
9680: 20 41 50 44 55 20 4c 65 6e 67 74 68 20 6f 66 20   APDU Length of 
9690: 43 6f 6e 74 65 6e 74 20 28 4c 63 29 20 2d 2d 20  Content (Lc) -- 
96a0: 74 68 69 73 20 69 73 20 74 68 65 20 6c 65 6e 67  this is the leng
96b0: 74 68 20 6f 66 20 22 64 61 74 61 22 0a 20 2a 20  th of "data". * 
96c0: 20 20 20 20 20 20 20 20 70 61 72 61 6d 65 74 65          paramete
96d0: 72 2e 20 20 49 66 20 22 64 61 74 61 22 20 69 73  r.  If "data" is
96e0: 20 73 70 65 63 69 66 69 65 64 20 61 73 20 4e 55   specified as NU
96f0: 4c 4c 2c 20 74 68 69 73 20 70 61 72 61 6d 65 74  LL, this paramet
9700: 65 72 20 77 69 6c 6c 0a 20 2a 20 20 20 20 20 20  er will. *      
9710: 20 20 20 62 65 20 69 67 6e 6f 72 65 64 2e 0a 20     be ignored.. 
9720: 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65  *. *     unsigne
9730: 64 20 63 68 61 72 20 2a 64 61 74 61 0a 20 2a 20  d char *data. * 
9740: 20 20 20 20 20 20 20 20 50 6f 69 6e 74 65 72 20          Pointer 
9750: 74 6f 20 62 75 66 66 65 72 20 74 6f 20 73 65 6e  to buffer to sen
9760: 64 2e 20 20 49 74 20 73 68 6f 75 6c 64 20 62 65  d.  It should be
9770: 20 22 4c 63 22 20 62 79 74 65 73 20 6c 6f 6e 67   "Lc" bytes long
9780: 2e 20 20 49 66 0a 20 2a 20 20 20 20 20 20 20 20  .  If. *        
9790: 20 73 70 65 63 69 66 69 65 64 20 61 73 20 4e 55   specified as NU
97a0: 4c 4c 2c 20 22 4c 63 22 20 77 69 6c 6c 20 6e 6f  LL, "Lc" will no
97b0: 74 20 62 65 20 73 65 6e 74 2c 20 61 6e 64 20 74  t be sent, and t
97c0: 68 69 73 20 62 75 66 66 65 72 20 77 69 6c 6c 20  his buffer will 
97d0: 62 65 0a 20 2a 20 20 20 20 20 20 20 20 20 69 67  be. *         ig
97e0: 6e 6f 72 65 64 2e 0a 20 2a 0a 20 2a 20 20 20 20  nored.. *. *    
97f0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6c   unsigned char l
9800: 65 0a 20 2a 20 20 20 20 20 20 20 20 20 41 50 44  e. *         APD
9810: 55 20 4c 65 6e 67 74 68 20 6f 66 20 45 78 70 65  U Length of Expe
9820: 63 74 61 74 69 6f 6e 20 28 4c 65 29 20 2d 2d 20  ctation (Le) -- 
9830: 74 68 69 73 20 69 73 20 74 68 65 20 6c 65 6e 67  this is the leng
9840: 74 68 20 6f 66 20 74 68 65 0a 20 2a 20 20 20 20  th of the. *    
9850: 20 20 20 20 20 65 78 70 65 63 74 65 64 20 72 65       expected re
9860: 70 6c 79 2e 20 20 49 66 20 74 68 69 73 20 69 73  ply.  If this is
9870: 20 73 70 65 63 69 66 69 65 64 20 61 73 20 30 20   specified as 0 
9880: 74 68 65 6e 20 69 74 20 77 69 6c 6c 20 6e 6f 74  then it will not
9890: 0a 20 2a 20 20 20 20 20 20 20 20 20 62 65 20 73  . *         be s
98a0: 65 6e 74 2e 0a 20 2a 0a 20 2a 20 20 20 20 20 75  ent.. *. *     u
98b0: 69 6e 74 31 36 5f 74 20 2a 72 65 73 70 63 6f 64  int16_t *respcod
98c0: 65 0a 20 2a 20 20 20 20 20 20 20 20 20 5b 4f 55  e. *         [OU
98d0: 54 5d 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 74  T] Pointer to st
98e0: 6f 72 61 67 65 20 6f 66 20 41 50 44 55 20 72 65  orage of APDU re
98f0: 73 70 6f 6e 73 65 20 63 6f 64 65 2e 20 20 49 66  sponse code.  If
9900: 20 74 68 69 73 20 69 73 0a 20 2a 20 20 20 20 20   this is. *     
9910: 20 20 20 20 73 70 65 63 69 66 69 65 64 20 61 73      specified as
9920: 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65 73 70 6f   NULL, the respo
9930: 6e 73 65 20 63 6f 64 65 20 77 69 6c 6c 20 62 65  nse code will be
9940: 20 64 69 73 63 61 72 64 65 64 2e 0a 20 2a 0a 20   discarded.. *. 
9950: 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63  *     unsigned c
9960: 68 61 72 20 2a 72 65 73 70 64 61 74 61 0a 20 2a  har *respdata. *
9970: 20 20 20 20 20 20 20 20 20 5b 4f 55 54 5d 20 50           [OUT] P
9980: 6f 69 6e 74 65 72 20 74 6f 20 73 74 6f 72 61 67  ointer to storag
9990: 65 20 6f 66 20 41 50 44 55 20 72 65 73 70 6f 6e  e of APDU respon
99a0: 73 65 20 64 61 74 61 2e 20 20 49 66 20 74 68 69  se data.  If thi
99b0: 73 20 69 73 0a 20 2a 20 20 20 20 20 20 20 20 20  s is. *         
99c0: 73 70 65 63 69 66 69 65 64 20 61 73 20 4e 55 4c  specified as NUL
99d0: 4c 2c 20 74 68 65 20 72 65 73 70 6f 6e 73 65 20  L, the response 
99e0: 64 61 74 61 20 77 69 6c 6c 20 62 65 20 64 69 73  data will be dis
99f0: 63 61 72 64 65 64 2e 20 20 49 66 0a 20 2a 20 20  carded.  If. *  
9a00: 20 20 20 20 20 20 20 74 68 65 20 22 72 65 73 70         the "resp
9a10: 64 61 74 61 5f 6c 65 6e 22 20 70 61 72 61 6d 65  data_len" parame
9a20: 74 65 72 20 69 73 20 73 70 65 63 69 66 69 65 64  ter is specified
9a30: 20 61 73 20 4e 55 4c 4c 2c 20 74 68 69 73 20 62   as NULL, this b
9a40: 75 66 66 65 72 0a 20 2a 20 20 20 20 20 20 20 20  uffer. *        
9a50: 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75 70 64   will not be upd
9a60: 61 74 65 64 2e 0a 20 2a 0a 20 2a 20 20 20 20 20  ated.. *. *     
9a70: 73 69 7a 65 5f 74 20 2a 72 65 73 70 64 61 74 61  size_t *respdata
9a80: 5f 6c 65 6e 0a 20 2a 20 20 20 20 20 20 20 20 20  _len. *         
9a90: 5b 49 4e 2c 20 4f 55 54 5d 20 50 6f 69 6e 74 65  [IN, OUT] Pointe
9aa0: 72 20 69 6e 69 74 69 61 6c 69 6e 67 20 63 6f 6e  r initialing con
9ab0: 74 61 69 6e 69 6e 67 20 74 68 65 20 73 69 7a 65  taining the size
9ac0: 20 6f 66 20 74 68 65 20 22 72 65 73 70 64 61 74   of the "respdat
9ad0: 61 22 0a 20 2a 20 20 20 20 20 20 20 20 20 62 75  a". *         bu
9ae0: 66 66 65 72 2e 20 20 42 65 66 6f 72 65 20 72 65  ffer.  Before re
9af0: 74 75 72 6e 69 6e 67 2c 20 74 68 65 20 70 6f 69  turning, the poi
9b00: 6e 74 65 64 20 74 6f 20 76 61 6c 75 65 20 69 73  nted to value is
9b10: 20 75 70 64 61 74 65 64 20 74 6f 20 74 68 65 0a   updated to the.
9b20: 20 2a 20 20 20 20 20 20 20 20 20 6e 75 6d 62 65   *         numbe
9b30: 72 20 6f 66 20 62 79 74 65 73 20 77 72 69 74 74  r of bytes writt
9b40: 65 6e 20 74 6f 20 74 68 65 20 62 75 66 66 65 72  en to the buffer
9b50: 2e 20 20 49 66 20 74 68 69 73 20 69 73 20 73 70  .  If this is sp
9b60: 65 63 69 66 69 65 64 20 61 73 0a 20 2a 20 20 20  ecified as. *   
9b70: 20 20 20 20 20 20 4e 55 4c 4c 2c 20 69 74 20 77        NULL, it w
9b80: 69 6c 6c 20 6e 6f 74 20 62 65 20 75 70 64 61 74  ill not be updat
9b90: 65 64 2c 20 61 6e 64 20 22 72 65 73 70 64 61 74  ed, and "respdat
9ba0: 61 22 20 77 69 6c 6c 20 62 65 20 69 67 6e 6f 72  a" will be ignor
9bb0: 65 64 20 63 61 75 73 69 6e 67 0a 20 2a 20 20 20  ed causing. *   
9bc0: 20 20 20 20 20 20 74 68 65 20 72 65 73 70 6f 6e        the respon
9bd0: 73 65 20 64 61 74 61 20 74 6f 20 62 65 20 64 69  se data to be di
9be0: 73 63 61 72 64 65 64 2e 0a 20 2a 0a 20 2a 20 52  scarded.. *. * R
9bf0: 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20  ETURN VALUE. *  
9c00: 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53     CACKEY_PCSC_S
9c10: 5f 4f 4b 20 20 20 20 20 20 20 20 20 20 20 4f 6e  _OK           On
9c20: 20 73 75 63 63 65 73 73 0a 20 2a 20 20 20 20 20   success. *     
9c30: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45  CACKEY_PCSC_E_GE
9c40: 4e 45 52 49 43 20 20 20 20 20 20 4f 6e 20 65 72  NERIC      On er
9c50: 72 6f 72 0a 20 2a 20 20 20 20 20 43 41 43 4b 45  ror. *     CACKE
9c60: 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42  Y_PCSC_E_TOKENAB
9c70: 53 45 4e 54 20 20 49 66 20 74 68 65 20 73 65 6e  SENT  If the sen
9c80: 64 69 6e 67 20 66 61 69 6c 65 64 20 62 65 63 61  ding failed beca
9c90: 75 73 65 20 74 68 65 20 74 6f 6b 65 6e 20 69 73  use the token is
9ca0: 0a 20 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  . *             
9cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9cc0: 20 20 20 61 62 73 65 6e 74 0a 20 2a 0a 20 2a 20     absent. *. * 
9cd0: 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 54 68 69  NOTES. *     Thi
9ce0: 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20  s function will 
9cf0: 63 6f 6e 6e 65 63 74 20 74 6f 20 74 68 65 20 50  connect to the P
9d00: 43 2f 53 43 20 43 6f 6e 6e 65 63 74 69 6f 6e 20  C/SC Connection 
9d10: 4d 61 6e 61 67 65 72 20 76 69 61 0a 20 2a 20 20  Manager via. *  
9d20: 20 20 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 63     cackey_pcsc_c
9d30: 6f 6e 6e 65 63 74 28 29 20 69 66 20 6e 65 65 64  onnect() if need
9d40: 65 64 2e 0a 20 2a 0a 20 2a 20 20 20 20 20 49 74  ed.. *. *     It
9d50: 20 77 69 6c 6c 20 63 6f 6e 6e 65 63 74 20 74 6f   will connect to
9d60: 20 74 68 65 20 63 61 72 64 20 69 6e 20 74 68 65   the card in the
9d70: 20 72 65 61 64 65 72 20 61 74 74 61 63 68 65 64   reader attached
9d80: 20 74 6f 20 74 68 65 20 73 6c 6f 74 0a 20 2a 20   to the slot. * 
9d90: 20 20 20 20 73 70 65 63 69 66 69 65 64 2e 20 20      specified.  
9da0: 49 74 20 77 69 6c 6c 20 72 65 63 6f 6e 6e 65 63  It will reconnec
9db0: 74 20 74 6f 20 74 68 65 20 63 61 72 64 20 69 66  t to the card if
9dc0: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a   the connection.
9dd0: 20 2a 20 20 20 20 20 67 6f 65 73 20 61 77 61 79   *     goes away
9de0: 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20  .. *. */.static 
9df0: 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65  cackey_ret cacke
9e00: 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 74 72 75  y_send_apdu(stru
9e10: 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a  ct cackey_slot *
9e20: 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20 63  slot, unsigned c
9e30: 68 61 72 20 63 6c 61 73 73 2c 20 75 6e 73 69 67  har class, unsig
9e40: 6e 65 64 20 63 68 61 72 20 69 6e 73 74 72 75 63  ned char instruc
9e50: 74 69 6f 6e 2c 20 75 6e 73 69 67 6e 65 64 20 63  tion, unsigned c
9e60: 68 61 72 20 70 31 2c 20 75 6e 73 69 67 6e 65 64  har p1, unsigned
9e70: 20 63 68 61 72 20 70 32 2c 20 75 6e 73 69 67 6e   char p2, unsign
9e80: 65 64 20 69 6e 74 20 6c 63 2c 20 75 6e 73 69 67  ed int lc, unsig
9e90: 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 2c 20  ned char *data, 
9ea0: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 6c 65 2c  unsigned int le,
9eb0: 20 75 69 6e 74 31 36 5f 74 20 2a 72 65 73 70 63   uint16_t *respc
9ec0: 6f 64 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  ode, unsigned ch
9ed0: 61 72 20 2a 72 65 73 70 64 61 74 61 2c 20 73 69  ar *respdata, si
9ee0: 7a 65 5f 74 20 2a 72 65 73 70 64 61 74 61 5f 6c  ze_t *respdata_l
9ef0: 65 6e 29 20 7b 0a 09 75 69 6e 74 38 5f 74 20 6d  en) {..uint8_t m
9f00: 61 6a 6f 72 5f 72 63 2c 20 6d 69 6e 6f 72 5f 72  ajor_rc, minor_r
9f10: 63 3b 0a 09 73 69 7a 65 5f 74 20 62 79 74 65 73  c;..size_t bytes
9f20: 5f 74 6f 5f 63 6f 70 79 2c 20 74 6d 70 5f 72 65  _to_copy, tmp_re
9f30: 73 70 64 61 74 61 5f 6c 65 6e 3b 0a 09 4c 50 43  spdata_len;..LPC
9f40: 53 43 41 52 44 5f 49 4f 5f 52 45 51 55 45 53 54  SCARD_IO_REQUEST
9f50: 20 70 69 6f 53 65 6e 64 50 63 69 3b 0a 09 44 57   pioSendPci;..DW
9f60: 4f 52 44 20 78 6d 69 74 5f 6c 65 6e 2c 20 72 65  ORD xmit_len, re
9f70: 63 76 5f 6c 65 6e 3b 0a 09 4c 4f 4e 47 20 73 63  cv_len;..LONG sc
9f80: 61 72 64 5f 78 6d 69 74 5f 72 65 74 2c 20 73 63  ard_xmit_ret, sc
9f90: 61 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 74 3b 0a  ard_reconn_ret;.
9fa0: 09 42 59 54 45 20 78 6d 69 74 5f 62 75 66 5b 31  .BYTE xmit_buf[1
9fb0: 30 32 34 5d 2c 20 72 65 63 76 5f 62 75 66 5b 31  024], recv_buf[1
9fc0: 30 32 34 5d 3b 0a 09 69 6e 74 20 70 63 73 63 5f  024];..int pcsc_
9fd0: 63 6f 6e 6e 65 63 74 5f 72 65 74 2c 20 70 63 73  connect_ret, pcs
9fe0: 63 5f 67 65 74 72 65 73 70 5f 72 65 74 3b 0a 09  c_getresp_ret;..
9ff0: 69 6e 74 20 69 64 78 3b 0a 0a 09 43 41 43 4b 45  int idx;...CACKE
a000: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
a010: 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
a020: 28 21 73 6c 6f 74 29 20 7b 0a 09 09 43 41 43 4b  (!slot) {...CACK
a030: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
a040: 22 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 73 70  "Invalid slot sp
a050: 65 63 69 66 69 65 64 2e 22 29 3b 0a 0a 09 09 72  ecified.");....r
a060: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
a070: 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d  C_E_GENERIC);..}
a080: 0a 0a 09 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f  ...pcsc_connect_
a090: 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 63 6f 6e  ret = cackey_con
a0a0: 6e 65 63 74 5f 63 61 72 64 28 73 6c 6f 74 29 3b  nect_card(slot);
a0b0: 0a 09 69 66 20 28 70 63 73 63 5f 63 6f 6e 6e 65  ..if (pcsc_conne
a0c0: 63 74 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59  ct_ret != CACKEY
a0d0: 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09  _PCSC_S_OK) {...
a0e0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
a0f0: 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 63  NTF("Unable to c
a100: 6f 6e 6e 65 63 74 20 74 6f 20 63 61 72 64 2c 20  onnect to card, 
a110: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  returning in fai
a120: 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72  lure");....retur
a130: 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  n(CACKEY_PCSC_E_
a140: 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 2f  GENERIC);..}.../
a150: 2a 20 44 65 74 65 72 6d 69 6e 65 20 77 68 69 63  * Determine whic
a160: 68 20 70 72 6f 74 6f 63 6f 6c 20 74 6f 20 73 65  h protocol to se
a170: 6e 64 20 75 73 69 6e 67 20 2a 2f 0a 09 73 77 69  nd using */..swi
a180: 74 63 68 20 28 73 6c 6f 74 2d 3e 70 72 6f 74 6f  tch (slot->proto
a190: 63 6f 6c 29 20 7b 0a 09 09 63 61 73 65 20 53 43  col) {...case SC
a1a0: 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 3a  ARD_PROTOCOL_T0:
a1b0: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
a1c0: 5f 50 52 49 4e 54 46 28 22 50 72 6f 74 6f 63 6f  _PRINTF("Protoco
a1d0: 6c 20 74 6f 20 73 65 6e 64 20 64 61 74 61 67 72  l to send datagr
a1e0: 61 6d 20 69 73 20 54 3d 30 22 29 3b 0a 0a 09 09  am is T=0");....
a1f0: 09 70 69 6f 53 65 6e 64 50 63 69 20 3d 20 53 43  .pioSendPci = SC
a200: 41 52 44 5f 50 43 49 5f 54 30 3b 0a 0a 09 09 09  ARD_PCI_T0;.....
a210: 62 72 65 61 6b 3b 0a 09 09 63 61 73 65 20 53 43  break;...case SC
a220: 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31 3a  ARD_PROTOCOL_T1:
a230: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
a240: 5f 50 52 49 4e 54 46 28 22 50 72 6f 74 6f 63 6f  _PRINTF("Protoco
a250: 6c 20 74 6f 20 73 65 6e 64 20 64 61 74 61 67 72  l to send datagr
a260: 61 6d 20 69 73 20 54 3d 31 22 29 3b 0a 0a 09 09  am is T=1");....
a270: 09 70 69 6f 53 65 6e 64 50 63 69 20 3d 20 53 43  .pioSendPci = SC
a280: 41 52 44 5f 50 43 49 5f 54 31 3b 0a 0a 09 09 09  ARD_PCI_T1;.....
a290: 62 72 65 61 6b 3b 0a 09 09 64 65 66 61 75 6c 74  break;...default
a2a0: 3a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  :....CACKEY_DEBU
a2b0: 47 5f 50 52 49 4e 54 46 28 22 49 6e 76 61 6c 69  G_PRINTF("Invali
a2c0: 64 20 70 72 6f 74 6f 63 6f 6c 20 66 6f 75 6e 64  d protocol found
a2d0: 2c 20 61 62 6f 72 74 69 6e 67 2e 22 29 3b 0a 0a  , aborting.");..
a2e0: 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
a2f0: 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29  _PCSC_E_GENERIC)
a300: 3b 0a 09 7d 0a 0a 09 2f 2a 20 54 72 61 6e 73 6d  ;..}.../* Transm
a310: 69 74 20 2a 2f 0a 09 78 6d 69 74 5f 6c 65 6e 20  it */..xmit_len 
a320: 3d 20 30 3b 0a 09 78 6d 69 74 5f 62 75 66 5b 78  = 0;..xmit_buf[x
a330: 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 63 6c 61  mit_len++] = cla
a340: 73 73 3b 0a 09 78 6d 69 74 5f 62 75 66 5b 78 6d  ss;..xmit_buf[xm
a350: 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 69 6e 73 74  it_len++] = inst
a360: 72 75 63 74 69 6f 6e 3b 0a 09 78 6d 69 74 5f 62  ruction;..xmit_b
a370: 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d  uf[xmit_len++] =
a380: 20 70 31 3b 0a 09 78 6d 69 74 5f 62 75 66 5b 78   p1;..xmit_buf[x
a390: 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 70 32 3b  mit_len++] = p2;
a3a0: 0a 09 69 66 20 28 64 61 74 61 29 20 7b 0a 09 09  ..if (data) {...
a3b0: 69 66 20 28 6c 63 20 3e 20 32 35 35 29 20 7b 0a  if (lc > 255) {.
a3c0: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
a3d0: 50 52 49 4e 54 46 28 22 43 41 55 54 49 4f 4e 21  PRINTF("CAUTION!
a3e0: 20 20 55 73 69 6e 67 20 61 6e 20 4c 63 20 67 72    Using an Lc gr
a3f0: 65 61 74 65 72 20 74 68 61 6e 20 32 35 35 20 69  eater than 255 i
a400: 73 20 75 6e 74 65 73 74 65 64 2e 20 20 4c 63 20  s untested.  Lc 
a410: 3d 20 25 75 22 2c 20 6c 63 29 3b 0a 0a 09 09 09  = %u", lc);.....
a420: 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c 65  xmit_buf[xmit_le
a430: 6e 2b 2b 5d 20 3d 20 30 78 38 32 3b 20 2f 2a 20  n++] = 0x82; /* 
a440: 58 58 58 20 55 4e 54 45 53 54 45 44 20 2a 2f 0a  XXX UNTESTED */.
a450: 09 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74  ...xmit_buf[xmit
a460: 5f 6c 65 6e 2b 2b 5d 20 3d 20 28 6c 63 20 26 20  _len++] = (lc & 
a470: 30 78 66 66 30 30 29 20 3e 3e 20 38 3b 0a 09 09  0xff00) >> 8;...
a480: 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c  .xmit_buf[xmit_l
a490: 65 6e 2b 2b 5d 20 3d 20 6c 63 20 26 20 30 78 66  en++] = lc & 0xf
a4a0: 66 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  f;...} else {...
a4b0: 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c  .xmit_buf[xmit_l
a4c0: 65 6e 2b 2b 5d 20 3d 20 6c 63 3b 0a 09 09 7d 0a  en++] = lc;...}.
a4d0: 09 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20  ..for (idx = 0; 
a4e0: 69 64 78 20 3c 20 6c 63 3b 20 69 64 78 2b 2b 29  idx < lc; idx++)
a4f0: 20 7b 0a 09 09 09 78 6d 69 74 5f 62 75 66 5b 78   {....xmit_buf[x
a500: 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 64 61 74  mit_len++] = dat
a510: 61 5b 69 64 78 5d 3b 0a 09 09 7d 0a 09 7d 0a 0a  a[idx];...}..}..
a520: 09 69 66 20 28 6c 65 20 21 3d 20 30 78 30 30 29  .if (le != 0x00)
a530: 20 7b 0a 09 09 69 66 20 28 6c 65 20 3e 20 32 35   {...if (le > 25
a540: 36 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  6) {....CACKEY_D
a550: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 41 55  EBUG_PRINTF("CAU
a560: 54 49 4f 4e 21 20 20 55 73 69 6e 67 20 61 6e 20  TION!  Using an 
a570: 4c 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  Le greater than 
a580: 32 35 36 20 69 73 20 75 6e 74 65 73 74 65 64 2e  256 is untested.
a590: 20 20 4c 65 20 3d 20 25 75 22 2c 20 6c 65 29 3b    Le = %u", le);
a5a0: 0a 0a 09 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d  .....xmit_buf[xm
a5b0: 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 30 78 38 32  it_len++] = 0x82
a5c0: 3b 20 2f 2a 20 58 58 58 20 55 4e 54 45 53 54 45  ; /* XXX UNTESTE
a5d0: 44 20 2a 2f 0a 09 09 09 78 6d 69 74 5f 62 75 66  D */....xmit_buf
a5e0: 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 28  [xmit_len++] = (
a5f0: 6c 65 20 26 20 30 78 66 66 30 30 29 20 3e 3e 20  le & 0xff00) >> 
a600: 38 3b 0a 09 09 09 78 6d 69 74 5f 62 75 66 5b 78  8;....xmit_buf[x
a610: 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 6c 65 20  mit_len++] = le 
a620: 26 20 30 78 66 66 3b 0a 09 09 7d 20 65 6c 73 65  & 0xff;...} else
a630: 20 69 66 20 28 6c 65 20 3d 3d 20 32 35 36 29 20   if (le == 256) 
a640: 7b 0a 09 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d  {....xmit_buf[xm
a650: 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 30 78 30 30  it_len++] = 0x00
a660: 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ;...} else {....
a670: 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c 65  xmit_buf[xmit_le
a680: 6e 2b 2b 5d 20 3d 20 6c 65 3b 0a 09 09 7d 0a 09  n++] = le;...}..
a690: 7d 0a 0a 09 2f 2a 20 42 65 67 69 6e 20 53 6d 61  }.../* Begin Sma
a6a0: 72 74 63 61 72 64 20 54 72 61 6e 73 61 63 74 69  rtcard Transacti
a6b0: 6f 6e 20 2a 2f 0a 09 63 61 63 6b 65 79 5f 62 65  on */..cackey_be
a6c0: 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  gin_transaction(
a6d0: 73 6c 6f 74 29 3b 0a 0a 09 69 66 20 28 63 6c 61  slot);...if (cla
a6e0: 73 73 20 3d 3d 20 47 53 43 49 53 5f 43 4c 41 53  ss == GSCIS_CLAS
a6f0: 53 5f 49 53 4f 37 38 31 36 20 26 26 20 28 69 6e  S_ISO7816 && (in
a700: 73 74 72 75 63 74 69 6f 6e 20 3d 3d 20 47 53 43  struction == GSC
a710: 49 53 5f 49 4e 53 54 52 5f 56 45 52 49 46 59 20  IS_INSTR_VERIFY 
a720: 7c 7c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 3d  || instruction =
a730: 3d 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 43 48  = GSCIS_INSTR_CH
a740: 41 4e 47 45 5f 52 45 46 45 52 45 4e 43 45 29 20  ANGE_REFERENCE) 
a750: 26 26 20 70 31 20 3d 3d 20 30 78 30 30 29 20 7b  && p1 == 0x00) {
a760: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
a770: 50 52 49 4e 54 46 28 22 53 65 6e 64 69 6e 67 20  PRINTF("Sending 
a780: 41 50 44 55 3a 20 3c 3c 63 65 6e 73 6f 72 65 64  APDU: <<censored
a790: 3e 3e 22 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a  >>");..} else {.
a7a0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
a7b0: 52 49 4e 54 42 55 46 28 22 53 65 6e 64 69 6e 67  RINTBUF("Sending
a7c0: 20 41 50 44 55 3a 22 2c 20 78 6d 69 74 5f 62 75   APDU:", xmit_bu
a7d0: 66 2c 20 78 6d 69 74 5f 6c 65 6e 29 3b 0a 09 7d  f, xmit_len);..}
a7e0: 0a 0a 09 72 65 63 76 5f 6c 65 6e 20 3d 20 73 69  ...recv_len = si
a7f0: 7a 65 6f 66 28 72 65 63 76 5f 62 75 66 29 3b 0a  zeof(recv_buf);.
a800: 09 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 20  .scard_xmit_ret 
a810: 3d 20 53 43 61 72 64 54 72 61 6e 73 6d 69 74 28  = SCardTransmit(
a820: 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c  slot->pcsc_card,
a830: 20 70 69 6f 53 65 6e 64 50 63 69 2c 20 78 6d 69   pioSendPci, xmi
a840: 74 5f 62 75 66 2c 20 78 6d 69 74 5f 6c 65 6e 2c  t_buf, xmit_len,
a850: 20 4e 55 4c 4c 2c 20 72 65 63 76 5f 62 75 66 2c   NULL, recv_buf,
a860: 20 26 72 65 63 76 5f 6c 65 6e 29 3b 0a 0a 09 69   &recv_len);...i
a870: 66 20 28 73 63 61 72 64 5f 78 6d 69 74 5f 72 65  f (scard_xmit_re
a880: 74 20 3d 3d 20 53 43 41 52 44 5f 45 5f 4e 4f 54  t == SCARD_E_NOT
a890: 5f 54 52 41 4e 53 41 43 54 45 44 29 20 7b 0a 09  _TRANSACTED) {..
a8a0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
a8b0: 49 4e 54 46 28 22 46 61 69 6c 65 64 20 74 6f 20  INTF("Failed to 
a8c0: 73 65 6e 64 20 41 50 44 55 20 74 6f 20 63 61 72  send APDU to car
a8d0: 64 20 28 53 43 61 72 64 54 72 61 6e 73 6d 69 74  d (SCardTransmit
a8e0: 28 29 20 3d 20 25 73 2f 25 6c 78 29 2c 20 77 69  () = %s/%lx), wi
a8f0: 6c 6c 20 61 73 6b 20 63 61 6c 6c 69 6e 67 20 66  ll ask calling f
a900: 75 6e 63 74 69 6f 6e 20 74 6f 20 72 65 74 72 79  unction to retry
a910: 20 28 6e 6f 74 20 72 65 73 65 74 74 69 6e 67 20   (not resetting 
a920: 63 61 72 64 29 2e 2e 2e 22 2c 20 43 41 43 4b 45  card)...", CACKE
a930: 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41  Y_DEBUG_FUNC_SCA
a940: 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61  RDERR_TO_STR(sca
a950: 72 64 5f 78 6d 69 74 5f 72 65 74 29 2c 20 28 75  rd_xmit_ret), (u
a960: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 63  nsigned long) sc
a970: 61 72 64 5f 78 6d 69 74 5f 72 65 74 29 3b 0a 0a  ard_xmit_ret);..
a980: 09 09 2f 2a 20 42 65 67 69 6e 20 53 6d 61 72 74  ../* Begin Smart
a990: 63 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e  card Transaction
a9a0: 20 2a 2f 0a 09 09 63 61 63 6b 65 79 5f 65 6e 64   */...cackey_end
a9b0: 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f  _transaction(slo
a9c0: 74 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 72 65  t);....cackey_re
a9d0: 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73 6c 6f  connect_card(slo
a9e0: 74 2c 20 73 6c 6f 74 2d 3e 70 72 6f 74 6f 63 6f  t, slot->protoco
a9f0: 6c 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41  l);....return(CA
aa00: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 52 45 54 52  CKEY_PCSC_E_RETR
aa10: 59 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 63 61  Y);..}...if (sca
aa20: 72 64 5f 78 6d 69 74 5f 72 65 74 20 21 3d 20 53  rd_xmit_ret != S
aa30: 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20  CARD_S_SUCCESS) 
aa40: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
aa50: 5f 50 52 49 4e 54 46 28 22 46 61 69 6c 65 64 20  _PRINTF("Failed 
aa60: 74 6f 20 73 65 6e 64 20 41 50 44 55 20 74 6f 20  to send APDU to 
aa70: 63 61 72 64 20 28 53 43 61 72 64 54 72 61 6e 73  card (SCardTrans
aa80: 6d 69 74 28 29 20 3d 20 25 73 2f 25 6c 78 29 22  mit() = %s/%lx)"
aa90: 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46  , CACKEY_DEBUG_F
aaa0: 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f  UNC_SCARDERR_TO_
aab0: 53 54 52 28 73 63 61 72 64 5f 78 6d 69 74 5f 72  STR(scard_xmit_r
aac0: 65 74 29 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  et), (unsigned l
aad0: 6f 6e 67 29 20 73 63 61 72 64 5f 78 6d 69 74 5f  ong) scard_xmit_
aae0: 72 65 74 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f  ret);....CACKEY_
aaf0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4d 61  DEBUG_PRINTF("Ma
ab00: 72 6b 69 6e 67 20 73 6c 6f 74 20 61 73 20 68 61  rking slot as ha
ab10: 76 69 6e 67 20 62 65 65 6e 20 72 65 73 65 74 22  ving been reset"
ab20: 29 3b 0a 09 09 63 61 63 6b 65 79 5f 6d 61 72 6b  );...cackey_mark
ab30: 5f 73 6c 6f 74 5f 72 65 73 65 74 28 73 6c 6f 74  _slot_reset(slot
ab40: 29 3b 0a 0a 09 09 69 66 20 28 73 63 61 72 64 5f  );....if (scard_
ab50: 78 6d 69 74 5f 72 65 74 20 3d 3d 20 53 43 41 52  xmit_ret == SCAR
ab60: 44 5f 57 5f 52 45 53 45 54 5f 43 41 52 44 29 20  D_W_RESET_CARD) 
ab70: 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
ab80: 47 5f 50 52 49 4e 54 46 28 22 52 65 73 65 74 20  G_PRINTF("Reset 
ab90: 72 65 71 75 69 72 65 64 2c 20 70 6c 65 61 73 65  required, please
aba0: 20 68 6f 6c 64 2e 2e 2e 22 29 3b 0a 0a 09 09 09   hold...");.....
abb0: 73 63 61 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 74  scard_reconn_ret
abc0: 20 3d 20 63 61 63 6b 65 79 5f 72 65 63 6f 6e 6e   = cackey_reconn
abd0: 65 63 74 5f 63 61 72 64 28 73 6c 6f 74 2c 20 53  ect_card(slot, S
abe0: 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30  CARD_PROTOCOL_T0
abf0: 20 7c 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f   | SCARD_PROTOCO
ac00: 4c 5f 54 31 29 3b 0a 0a 09 09 09 69 66 20 28 73  L_T1);.....if (s
ac10: 63 61 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 74 20  card_reconn_ret 
ac20: 3d 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45  == SCARD_S_SUCCE
ac30: 53 53 29 20 7b 0a 09 09 09 09 73 77 69 74 63 68  SS) {.....switch
ac40: 20 28 73 6c 6f 74 2d 3e 70 72 6f 74 6f 63 6f 6c   (slot->protocol
ac50: 29 20 7b 0a 09 09 09 09 09 63 61 73 65 20 53 43  ) {......case SC
ac60: 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 3a  ARD_PROTOCOL_T0:
ac70: 0a 09 09 09 09 09 09 70 69 6f 53 65 6e 64 50 63  .......pioSendPc
ac80: 69 20 3d 20 53 43 41 52 44 5f 50 43 49 5f 54 30  i = SCARD_PCI_T0
ac90: 3b 0a 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a  ;........break;.
aca0: 09 09 09 09 09 63 61 73 65 20 53 43 41 52 44 5f  .....case SCARD_
acb0: 50 52 4f 54 4f 43 4f 4c 5f 54 31 3a 0a 09 09 09  PROTOCOL_T1:....
acc0: 09 09 09 70 69 6f 53 65 6e 64 50 63 69 20 3d 20  ...pioSendPci = 
acd0: 53 43 41 52 44 5f 50 43 49 5f 54 31 3b 0a 0a 09  SCARD_PCI_T1;...
ace0: 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09  .....break;.....
acf0: 09 64 65 66 61 75 6c 74 3a 0a 09 09 09 09 09 09  .default:.......
ad00: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
ad10: 4e 54 46 28 22 49 6e 76 61 6c 69 64 20 70 72 6f  NTF("Invalid pro
ad20: 74 6f 63 6f 6c 20 66 6f 75 6e 64 2c 20 62 75 74  tocol found, but
ad30: 20 74 6f 6f 20 6c 61 74 65 20 74 6f 20 64 6f 20   too late to do 
ad40: 61 6e 79 74 68 69 6e 67 20 61 62 6f 75 74 20 69  anything about i
ad50: 74 20 6e 6f 77 20 2d 2d 20 74 72 79 69 6e 67 20  t now -- trying 
ad60: 61 6e 79 77 61 79 2e 22 29 3b 0a 0a 09 09 09 09  anyway.");......
ad70: 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a  ..break;.....}..
ad80: 09 09 09 09 2f 2a 20 52 65 2d 65 73 74 61 62 6c  ..../* Re-establ
ad90: 69 73 68 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ish transaction,
ada0: 20 69 66 20 69 74 20 77 61 73 20 70 72 65 73 65   if it was prese
adb0: 6e 74 20 2a 2f 0a 09 09 09 09 69 66 20 28 73 6c  nt */.....if (sl
adc0: 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f  ot->transaction_
add0: 64 65 70 74 68 20 3e 20 30 29 20 7b 0a 09 09 09  depth > 0) {....
ade0: 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74  ..slot->transact
adf0: 69 6f 6e 5f 64 65 70 74 68 2d 2d 3b 0a 09 09 09  ion_depth--;....
ae00: 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74  ..slot->transact
ae10: 69 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b  ion_need_hw_lock
ae20: 20 3d 20 31 3b 0a 09 09 09 09 09 63 61 63 6b 65   = 1;......cacke
ae30: 79 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74  y_begin_transact
ae40: 69 6f 6e 28 73 6c 6f 74 29 3b 0a 09 09 09 09 7d  ion(slot);.....}
ae50: 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
ae60: 55 47 5f 50 52 49 4e 54 46 28 22 52 65 73 65 74  UG_PRINTF("Reset
ae70: 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74   successful, ret
ae80: 72 61 6e 73 6d 69 74 74 69 6e 67 22 29 3b 0a 0a  ransmitting");..
ae90: 09 09 09 09 72 65 63 76 5f 6c 65 6e 20 3d 20 73  ....recv_len = s
aea0: 69 7a 65 6f 66 28 72 65 63 76 5f 62 75 66 29 3b  izeof(recv_buf);
aeb0: 0a 09 09 09 09 73 63 61 72 64 5f 78 6d 69 74 5f  .....scard_xmit_
aec0: 72 65 74 20 3d 20 53 43 61 72 64 54 72 61 6e 73  ret = SCardTrans
aed0: 6d 69 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63  mit(slot->pcsc_c
aee0: 61 72 64 2c 20 70 69 6f 53 65 6e 64 50 63 69 2c  ard, pioSendPci,
aef0: 20 78 6d 69 74 5f 62 75 66 2c 20 78 6d 69 74 5f   xmit_buf, xmit_
af00: 6c 65 6e 2c 20 4e 55 4c 4c 2c 20 72 65 63 76 5f  len, NULL, recv_
af10: 62 75 66 2c 20 26 72 65 63 76 5f 6c 65 6e 29 3b  buf, &recv_len);
af20: 0a 0a 09 09 09 09 69 66 20 28 73 63 61 72 64 5f  ......if (scard_
af30: 78 6d 69 74 5f 72 65 74 20 21 3d 20 53 43 41 52  xmit_ret != SCAR
af40: 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09  D_S_SUCCESS) {..
af50: 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
af60: 5f 50 52 49 4e 54 46 28 22 52 65 74 72 61 6e 73  _PRINTF("Retrans
af70: 6d 69 74 20 66 61 69 6c 65 64 2c 20 72 65 74 75  mit failed, retu
af80: 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65  rning in failure
af90: 20 61 66 74 65 72 20 64 69 73 63 6f 6e 6e 65 63   after disconnec
afa0: 74 69 6e 67 20 74 68 65 20 63 61 72 64 20 28 53  ting the card (S
afb0: 43 61 72 64 54 72 61 6e 73 6d 69 74 20 3d 20 25  CardTransmit = %
afc0: 73 2f 25 6c 69 29 22 2c 20 43 41 43 4b 45 59 5f  s/%li)", CACKEY_
afd0: 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44  DEBUG_FUNC_SCARD
afe0: 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64  ERR_TO_STR(scard
aff0: 5f 78 6d 69 74 5f 72 65 74 29 2c 20 28 6c 6f 6e  _xmit_ret), (lon
b000: 67 29 20 73 63 61 72 64 5f 78 6d 69 74 5f 72 65  g) scard_xmit_re
b010: 74 29 3b 0a 0a 09 09 09 09 09 53 43 61 72 64 44  t);.......SCardD
b020: 69 73 63 6f 6e 6e 65 63 74 28 73 6c 6f 74 2d 3e  isconnect(slot->
b030: 70 63 73 63 5f 63 61 72 64 2c 20 53 43 41 52 44  pcsc_card, SCARD
b040: 5f 4c 45 41 56 45 5f 43 41 52 44 29 3b 0a 09 09  _LEAVE_CARD);...
b050: 09 09 09 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61  ...slot->pcsc_ca
b060: 72 64 5f 63 6f 6e 6e 65 63 74 65 64 20 3d 20 30  rd_connected = 0
b070: 3b 0a 0a 09 09 09 09 09 2f 2a 20 45 6e 64 20 53  ;......./* End S
b080: 6d 61 72 74 63 61 72 64 20 54 72 61 6e 73 61 63  martcard Transac
b090: 74 69 6f 6e 20 2a 2f 0a 09 09 09 09 09 73 6c 6f  tion */......slo
b0a0: 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64  t->transaction_d
b0b0: 65 70 74 68 20 3d 20 31 3b 0a 09 09 09 09 09 63  epth = 1;......c
b0c0: 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61  ackey_end_transa
b0d0: 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09  ction(slot);....
b0e0: 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
b0f0: 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53  _PCSC_E_TOKENABS
b100: 45 4e 54 29 3b 0a 09 09 09 09 7d 0a 09 09 09 7d  ENT);.....}....}
b110: 20 65 6c 73 65 20 7b 0a 09 09 09 09 43 41 43 4b   else {.....CACK
b120: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
b130: 22 44 69 73 63 6f 6e 6e 65 63 74 69 6e 67 20 63  "Disconnecting c
b140: 61 72 64 22 29 3b 0a 0a 09 09 09 09 53 43 61 72  ard");......SCar
b150: 64 44 69 73 63 6f 6e 6e 65 63 74 28 73 6c 6f 74  dDisconnect(slot
b160: 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 53 43 41  ->pcsc_card, SCA
b170: 52 44 5f 4c 45 41 56 45 5f 43 41 52 44 29 3b 0a  RD_LEAVE_CARD);.
b180: 09 09 09 09 73 6c 6f 74 2d 3e 70 63 73 63 5f 63  ....slot->pcsc_c
b190: 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 20 3d 20  ard_connected = 
b1a0: 30 3b 0a 0a 09 09 09 09 2f 2a 20 45 6e 64 20 53  0;....../* End S
b1b0: 6d 61 72 74 63 61 72 64 20 54 72 61 6e 73 61 63  martcard Transac
b1c0: 74 69 6f 6e 20 2a 2f 0a 09 09 09 09 73 6c 6f 74  tion */.....slot
b1d0: 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65  ->transaction_de
b1e0: 70 74 68 20 3d 20 31 3b 0a 09 09 09 09 63 61 63  pth = 1;.....cac
b1f0: 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  key_end_transact
b200: 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 09 09  ion(slot);......
b210: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
b220: 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 69  NTF("Returning i
b230: 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 09 09 09  n failure");....
b240: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
b250: 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e  CSC_E_TOKENABSEN
b260: 54 29 3b 0a 09 09 09 7d 0a 09 09 7d 20 65 6c 73  T);....}...} els
b270: 65 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  e {....CACKEY_DE
b280: 42 55 47 5f 50 52 49 4e 54 46 28 22 44 69 73 63  BUG_PRINTF("Disc
b290: 6f 6e 6e 65 63 74 69 6e 67 20 63 61 72 64 22 29  onnecting card")
b2a0: 3b 0a 0a 09 09 09 53 43 61 72 64 44 69 73 63 6f  ;.....SCardDisco
b2b0: 6e 6e 65 63 74 28 73 6c 6f 74 2d 3e 70 63 73 63  nnect(slot->pcsc
b2c0: 5f 63 61 72 64 2c 20 53 43 41 52 44 5f 4c 45 41  _card, SCARD_LEA
b2d0: 56 45 5f 43 41 52 44 29 3b 0a 09 09 09 73 6c 6f  VE_CARD);....slo
b2e0: 74 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e  t->pcsc_card_con
b2f0: 6e 65 63 74 65 64 20 3d 20 30 3b 0a 0a 09 09 09  nected = 0;.....
b300: 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63 61 72 64  /* End Smartcard
b310: 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a   Transaction */.
b320: 09 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63  ...slot->transac
b330: 74 69 6f 6e 5f 64 65 70 74 68 20 3d 20 31 3b 0a  tion_depth = 1;.
b340: 09 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72  ...cackey_end_tr
b350: 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b  ansaction(slot);
b360: 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
b370: 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
b380: 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29  ing in failure")
b390: 3b 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b  ;....return(CACK
b3a0: 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41  EY_PCSC_E_TOKENA
b3b0: 42 53 45 4e 54 29 3b 0a 09 09 7d 0a 09 7d 0a 0a  BSENT);...}..}..
b3c0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
b3d0: 49 4e 54 42 55 46 28 22 52 65 74 75 72 6e 65 64  INTBUF("Returned
b3e0: 20 56 61 6c 75 65 3a 22 2c 20 72 65 63 76 5f 62   Value:", recv_b
b3f0: 75 66 2c 20 72 65 63 76 5f 6c 65 6e 29 3b 0a 0a  uf, recv_len);..
b400: 09 69 66 20 28 72 65 63 76 5f 6c 65 6e 20 3c 20  .if (recv_len < 
b410: 32 29 20 7b 0a 09 09 2f 2a 20 4d 69 6e 69 6d 61  2) {.../* Minima
b420: 6c 20 72 65 73 70 6f 6e 73 65 20 6c 65 6e 67 74  l response lengt
b430: 68 20 69 73 20 32 20 62 79 74 65 73 2c 20 72 65  h is 2 bytes, re
b440: 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
b450: 72 65 20 2a 2f 0a 09 09 43 41 43 4b 45 59 5f 44  re */...CACKEY_D
b460: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 73  EBUG_PRINTF("Res
b470: 70 6f 6e 73 65 20 74 6f 6f 20 73 6d 61 6c 6c 2c  ponse too small,
b480: 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61   returning in fa
b490: 69 6c 75 72 65 20 28 72 65 63 76 5f 6c 65 6e 20  ilure (recv_len 
b4a0: 3d 20 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e  = %lu)", (unsign
b4b0: 65 64 20 6c 6f 6e 67 29 20 72 65 63 76 5f 6c 65  ed long) recv_le
b4c0: 6e 29 3b 0a 0a 09 09 2f 2a 20 45 6e 64 20 53 6d  n);..../* End Sm
b4d0: 61 72 74 63 61 72 64 20 54 72 61 6e 73 61 63 74  artcard Transact
b4e0: 69 6f 6e 20 2a 2f 0a 09 09 63 61 63 6b 65 79 5f  ion */...cackey_
b4f0: 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
b500: 73 6c 6f 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e  slot);....return
b510: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47  (CACKEY_PCSC_E_G
b520: 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 2f 2a  ENERIC);..}.../*
b530: 20 44 65 74 65 72 6d 69 6e 65 20 72 65 73 75 6c   Determine resul
b540: 74 20 63 6f 64 65 20 2a 2f 0a 09 6d 61 6a 6f 72  t code */..major
b550: 5f 72 63 20 3d 20 72 65 63 76 5f 62 75 66 5b 72  _rc = recv_buf[r
b560: 65 63 76 5f 6c 65 6e 20 2d 20 32 5d 3b 0a 09 6d  ecv_len - 2];..m
b570: 69 6e 6f 72 5f 72 63 20 3d 20 72 65 63 76 5f 62  inor_rc = recv_b
b580: 75 66 5b 72 65 63 76 5f 6c 65 6e 20 2d 20 31 5d  uf[recv_len - 1]
b590: 3b 0a 09 69 66 20 28 72 65 73 70 63 6f 64 65 29  ;..if (respcode)
b5a0: 20 7b 0a 09 09 2a 72 65 73 70 63 6f 64 65 20 3d   {...*respcode =
b5b0: 20 28 6d 61 6a 6f 72 5f 72 63 20 3c 3c 20 38 29   (major_rc << 8)
b5c0: 20 7c 20 6d 69 6e 6f 72 5f 72 63 3b 0a 09 7d 0a   | minor_rc;..}.
b5d0: 0a 09 2f 2a 20 41 64 6a 75 73 74 20 6d 65 73 73  ../* Adjust mess
b5e0: 61 67 65 20 62 75 66 66 65 72 20 2a 2f 0a 09 72  age buffer */..r
b5f0: 65 63 76 5f 6c 65 6e 20 2d 3d 20 32 3b 0a 0a 09  ecv_len -= 2;...
b600: 2f 2a 20 41 64 64 20 62 79 74 65 73 20 74 6f 20  /* Add bytes to 
b610: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a  return value */.
b620: 09 74 6d 70 5f 72 65 73 70 64 61 74 61 5f 6c 65  .tmp_respdata_le
b630: 6e 20 3d 20 30 3b 0a 09 69 66 20 28 72 65 73 70  n = 0;..if (resp
b640: 64 61 74 61 20 26 26 20 72 65 73 70 64 61 74 61  data && respdata
b650: 5f 6c 65 6e 29 20 7b 0a 09 09 74 6d 70 5f 72 65  _len) {...tmp_re
b660: 73 70 64 61 74 61 5f 6c 65 6e 20 3d 20 2a 72 65  spdata_len = *re
b670: 73 70 64 61 74 61 5f 6c 65 6e 3b 0a 0a 09 09 62  spdata_len;....b
b680: 79 74 65 73 5f 74 6f 5f 63 6f 70 79 20 3d 20 2a  ytes_to_copy = *
b690: 72 65 73 70 64 61 74 61 5f 6c 65 6e 3b 0a 0a 09  respdata_len;...
b6a0: 09 69 66 20 28 72 65 63 76 5f 6c 65 6e 20 3c 20  .if (recv_len < 
b6b0: 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 29 20 7b  bytes_to_copy) {
b6c0: 0a 09 09 09 62 79 74 65 73 5f 74 6f 5f 63 6f 70  ....bytes_to_cop
b6d0: 79 20 3d 20 72 65 63 76 5f 6c 65 6e 3b 0a 09 09  y = recv_len;...
b6e0: 7d 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  }....CACKEY_DEBU
b6f0: 47 5f 50 52 49 4e 54 46 28 22 43 6f 70 79 69 6e  G_PRINTF("Copyin
b700: 67 20 25 6c 75 20 62 79 74 65 73 20 74 6f 20 74  g %lu bytes to t
b710: 68 65 20 62 75 66 66 65 72 20 28 72 65 63 76 27  he buffer (recv'
b720: 64 20 25 6c 75 20 62 79 74 65 73 2c 20 62 75 74  d %lu bytes, but
b730: 20 6f 6e 6c 79 20 25 6c 75 20 62 79 74 65 73 20   only %lu bytes 
b740: 6c 65 66 74 20 69 6e 20 6f 75 72 20 62 75 66 66  left in our buff
b750: 65 72 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  er)", (unsigned 
b760: 6c 6f 6e 67 29 20 62 79 74 65 73 5f 74 6f 5f 63  long) bytes_to_c
b770: 6f 70 79 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  opy, (unsigned l
b780: 6f 6e 67 29 20 72 65 63 76 5f 6c 65 6e 2c 20 28  ong) recv_len, (
b790: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a  unsigned long) *
b7a0: 72 65 73 70 64 61 74 61 5f 6c 65 6e 29 3b 0a 0a  respdata_len);..
b7b0: 09 09 6d 65 6d 63 70 79 28 72 65 73 70 64 61 74  ..memcpy(respdat
b7c0: 61 2c 20 72 65 63 76 5f 62 75 66 2c 20 62 79 74  a, recv_buf, byt
b7d0: 65 73 5f 74 6f 5f 63 6f 70 79 29 3b 0a 09 09 72  es_to_copy);...r
b7e0: 65 73 70 64 61 74 61 20 2b 3d 20 62 79 74 65 73  espdata += bytes
b7f0: 5f 74 6f 5f 63 6f 70 79 3b 0a 0a 09 09 2a 72 65  _to_copy;....*re
b800: 73 70 64 61 74 61 5f 6c 65 6e 20 3d 20 62 79 74  spdata_len = byt
b810: 65 73 5f 74 6f 5f 63 6f 70 79 3b 0a 09 09 74 6d  es_to_copy;...tm
b820: 70 5f 72 65 73 70 64 61 74 61 5f 6c 65 6e 20 2d  p_respdata_len -
b830: 3d 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 3b  = bytes_to_copy;
b840: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69 66 20  ..} else {...if 
b850: 28 72 65 63 76 5f 6c 65 6e 20 21 3d 20 30 29 20  (recv_len != 0) 
b860: 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
b870: 47 5f 50 52 49 4e 54 46 28 22 54 68 72 6f 77 69  G_PRINTF("Throwi
b880: 6e 67 20 61 77 61 79 20 25 6c 75 20 62 79 74 65  ng away %lu byte
b890: 73 2c 20 6e 6f 77 68 65 72 65 20 74 6f 20 70 75  s, nowhere to pu
b8a0: 74 20 74 68 65 6d 21 22 2c 20 28 75 6e 73 69 67  t them!", (unsig
b8b0: 6e 65 64 20 6c 6f 6e 67 29 20 72 65 63 76 5f 6c  ned long) recv_l
b8c0: 65 6e 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66  en);...}..}...if
b8d0: 20 28 6d 61 6a 6f 72 5f 72 63 20 3d 3d 20 30 78   (major_rc == 0x
b8e0: 36 31 29 20 7b 0a 09 09 2f 2a 20 57 65 20 6e 65  61) {.../* We ne
b8f0: 65 64 20 74 6f 20 52 45 41 44 20 2a 2f 0a 09 09  ed to READ */...
b900: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
b910: 4e 54 46 28 22 42 75 66 66 65 72 20 72 65 61 64  NTF("Buffer read
b920: 20 72 65 71 75 69 72 65 64 22 29 3b 0a 0a 09 09   required");....
b930: 69 66 20 28 6d 69 6e 6f 72 5f 72 63 20 3d 3d 20  if (minor_rc == 
b940: 30 78 30 30 29 20 7b 0a 09 09 09 6d 69 6e 6f 72  0x00) {....minor
b950: 5f 72 63 20 3d 20 43 41 43 4b 45 59 5f 41 50 44  _rc = CACKEY_APD
b960: 55 5f 4d 54 55 3b 0a 09 09 7d 0a 0a 09 09 70 63  U_MTU;...}....pc
b970: 73 63 5f 67 65 74 72 65 73 70 5f 72 65 74 20 3d  sc_getresp_ret =
b980: 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64   cackey_send_apd
b990: 75 28 73 6c 6f 74 2c 20 47 53 43 49 53 5f 43 4c  u(slot, GSCIS_CL
b9a0: 41 53 53 5f 49 53 4f 37 38 31 36 2c 20 47 53 43  ASS_ISO7816, GSC
b9b0: 49 53 5f 49 4e 53 54 52 5f 47 45 54 5f 52 45 53  IS_INSTR_GET_RES
b9c0: 50 4f 4e 53 45 2c 20 30 78 30 30 2c 20 30 78 30  PONSE, 0x00, 0x0
b9d0: 30 2c 20 30 2c 20 4e 55 4c 4c 2c 20 6d 69 6e 6f  0, 0, NULL, mino
b9e0: 72 5f 72 63 2c 20 72 65 73 70 63 6f 64 65 2c 20  r_rc, respcode, 
b9f0: 72 65 73 70 64 61 74 61 2c 20 26 74 6d 70 5f 72  respdata, &tmp_r
ba00: 65 73 70 64 61 74 61 5f 6c 65 6e 29 3b 0a 0a 09  espdata_len);...
ba10: 09 69 66 20 28 70 63 73 63 5f 67 65 74 72 65 73  .if (pcsc_getres
ba20: 70 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f  p_ret != CACKEY_
ba30: 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09  PCSC_S_OK) {....
ba40: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
ba50: 4e 54 46 28 22 42 75 66 66 65 72 20 72 65 61 64  NTF("Buffer read
ba60: 20 66 61 69 6c 65 64 21 20 20 52 65 74 75 72 6e   failed!  Return
ba70: 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29  ing in failure")
ba80: 3b 0a 0a 09 09 09 2f 2a 20 45 6e 64 20 53 6d 61  ;...../* End Sma
ba90: 72 74 63 61 72 64 20 54 72 61 6e 73 61 63 74 69  rtcard Transacti
baa0: 6f 6e 20 2a 2f 0a 09 09 09 63 61 63 6b 65 79 5f  on */....cackey_
bab0: 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
bac0: 73 6c 6f 74 29 3b 0a 0a 09 09 09 69 66 20 28 70  slot);.....if (p
bad0: 63 73 63 5f 67 65 74 72 65 73 70 5f 72 65 74 20  csc_getresp_ret 
bae0: 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  == CACKEY_PCSC_E
baf0: 5f 52 45 54 52 59 29 20 7b 0a 09 09 09 09 72 65  _RETRY) {.....re
bb00: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
bb10: 5f 45 5f 52 45 54 52 59 29 3b 0a 09 09 09 7d 0a  _E_RETRY);....}.
bb20: 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ....return(CACKE
bb30: 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43  Y_PCSC_E_GENERIC
bb40: 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 72 65  );...}....if (re
bb50: 73 70 64 61 74 61 5f 6c 65 6e 29 20 7b 0a 09 09  spdata_len) {...
bb60: 09 2a 72 65 73 70 64 61 74 61 5f 6c 65 6e 20 2b  .*respdata_len +
bb70: 3d 20 74 6d 70 5f 72 65 73 70 64 61 74 61 5f 6c  = tmp_respdata_l
bb80: 65 6e 3b 0a 09 09 7d 0a 0a 09 09 2f 2a 20 45 6e  en;...}..../* En
bb90: 64 20 53 6d 61 72 74 63 61 72 64 20 54 72 61 6e  d Smartcard Tran
bba0: 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 09 63 61 63  saction */...cac
bbb0: 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  key_end_transact
bbc0: 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 43 41  ion(slot);....CA
bbd0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
bbe0: 46 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e 20  F("Returning in 
bbf0: 73 75 63 63 65 73 73 20 28 62 75 66 66 65 72 20  success (buffer 
bc00: 72 65 61 64 20 63 6f 6d 70 6c 65 74 65 29 22 29  read complete)")
bc10: 3b 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ;...return(CACKE
bc20: 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 09 7d  Y_PCSC_S_OK);..}
bc30: 0a 0a 09 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63  .../* End Smartc
bc40: 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20  ard Transaction 
bc50: 2a 2f 0a 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74  */..cackey_end_t
bc60: 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29  ransaction(slot)
bc70: 3b 0a 0a 09 69 66 20 28 6d 61 6a 6f 72 5f 72 63  ;...if (major_rc
bc80: 20 3d 3d 20 30 78 39 30 29 20 7b 0a 09 09 2f 2a   == 0x90) {.../*
bc90: 20 53 75 63 63 65 73 73 20 2a 2f 0a 09 09 43 41   Success */...CA
bca0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
bcb0: 46 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e 20  F("Returning in 
bcc0: 73 75 63 63 65 73 73 20 28 6d 61 6a 6f 72 5f 72  success (major_r
bcd0: 63 20 3d 20 30 78 39 30 29 22 29 3b 0a 0a 09 09  c = 0x90)");....
bce0: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
bcf0: 53 43 5f 53 5f 4f 4b 29 3b 0a 09 7d 0a 0a 0a 09  SC_S_OK);..}....
bd00: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
bd10: 4e 54 46 28 22 41 50 44 55 20 52 65 74 75 72 6e  NTF("APDU Return
bd20: 65 64 20 61 6e 20 65 72 72 6f 72 2c 20 72 65 74  ed an error, ret
bd30: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
bd40: 65 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41  e");...return(CA
bd50: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45  CKEY_PCSC_E_GENE
bd60: 52 49 43 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  RIC);.}..static 
bd70: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 63  unsigned char *c
bd80: 61 63 6b 65 79 5f 72 65 61 64 5f 62 65 72 74 6c  ackey_read_bertl
bd90: 76 5f 74 61 67 28 75 6e 73 69 67 6e 65 64 20 63  v_tag(unsigned c
bda0: 68 61 72 20 2a 62 75 66 66 65 72 2c 20 73 69 7a  har *buffer, siz
bdb0: 65 5f 74 20 2a 62 75 66 66 65 72 5f 6c 65 6e 5f  e_t *buffer_len_
bdc0: 70 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  p, unsigned char
bdd0: 20 74 61 67 2c 20 75 6e 73 69 67 6e 65 64 20 63   tag, unsigned c
bde0: 68 61 72 20 2a 6f 75 74 62 75 66 66 65 72 2c 20  har *outbuffer, 
bdf0: 73 69 7a 65 5f 74 20 2a 6f 75 74 62 75 66 66 65  size_t *outbuffe
be00: 72 5f 6c 65 6e 5f 70 29 20 7b 0a 09 75 6e 73 69  r_len_p) {..unsi
be10: 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 66 65  gned char *buffe
be20: 72 5f 70 3b 0a 09 73 69 7a 65 5f 74 20 6f 75 74  r_p;..size_t out
be30: 62 75 66 66 65 72 5f 6c 65 6e 2c 20 62 75 66 66  buffer_len, buff
be40: 65 72 5f 6c 65 6e 3b 0a 09 73 69 7a 65 5f 74 20  er_len;..size_t 
be50: 73 69 7a 65 3b 0a 09 69 6e 74 20 69 64 78 3b 0a  size;..int idx;.
be60: 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
be70: 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
be80: 3b 0a 0a 09 69 66 20 28 62 75 66 66 65 72 5f 6c  ;...if (buffer_l
be90: 65 6e 5f 70 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  en_p == NULL) {.
bea0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
beb0: 52 49 4e 54 46 28 22 62 75 66 66 65 72 5f 6c 65  RINTF("buffer_le
bec0: 6e 5f 70 20 69 73 20 4e 55 4c 4c 2e 20 20 52 65  n_p is NULL.  Re
bed0: 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
bee0: 72 65 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  re.");....return
bef0: 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 69 66 20  (NULL);..}...if 
bf00: 28 6f 75 74 62 75 66 66 65 72 5f 6c 65 6e 5f 70  (outbuffer_len_p
bf10: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
bf20: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
bf30: 46 28 22 6f 75 74 62 75 66 66 65 72 5f 6c 65 6e  F("outbuffer_len
bf40: 5f 70 20 69 73 20 4e 55 4c 4c 2e 20 20 52 65 74  _p is NULL.  Ret
bf50: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
bf60: 65 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  e.");....return(
bf70: 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 62 75 66 66  NULL);..}...buff
bf80: 65 72 5f 6c 65 6e 20 3d 20 2a 6f 75 74 62 75 66  er_len = *outbuf
bf90: 66 65 72 5f 6c 65 6e 5f 70 3b 0a 09 6f 75 74 62  fer_len_p;..outb
bfa0: 75 66 66 65 72 5f 6c 65 6e 20 3d 20 2a 6f 75 74  uffer_len = *out
bfb0: 62 75 66 66 65 72 5f 6c 65 6e 5f 70 3b 0a 0a 09  buffer_len_p;...
bfc0: 69 66 20 28 62 75 66 66 65 72 5f 6c 65 6e 20 3c  if (buffer_len <
bfd0: 20 32 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   2) {...CACKEY_D
bfe0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 62 75 66  EBUG_PRINTF("buf
bff0: 66 65 72 5f 6c 65 6e 20 69 73 20 6c 65 73 73 20  fer_len is less 
c000: 74 68 61 6e 20 32 2c 20 73 6f 20 77 65 20 63 61  than 2, so we ca
c010: 6e 27 74 20 72 65 61 64 20 61 6e 79 20 74 61 67  n't read any tag
c020: 2e 20 20 52 65 74 75 72 6e 69 6e 67 20 69 6e 20  .  Returning in 
c030: 66 61 69 6c 75 72 65 2e 22 29 3b 0a 0a 09 09 72  failure.");....r
c040: 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a  eturn(NULL);..}.
c050: 0a 09 62 75 66 66 65 72 5f 70 20 3d 20 62 75 66  ..buffer_p = buf
c060: 66 65 72 3b 0a 09 69 66 20 28 62 75 66 66 65 72  fer;..if (buffer
c070: 5f 70 5b 30 5d 20 21 3d 20 74 61 67 29 20 7b 0a  _p[0] != tag) {.
c080: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
c090: 52 49 4e 54 46 28 22 54 61 67 20 66 6f 75 6e 64  RINTF("Tag found
c0a0: 20 77 61 73 20 6e 6f 74 20 74 61 67 20 65 78 70   was not tag exp
c0b0: 65 63 74 65 64 2e 20 20 54 61 67 20 3d 20 25 30  ected.  Tag = %0
c0c0: 32 78 2c 20 45 78 70 65 63 74 65 64 20 3d 20 25  2x, Expected = %
c0d0: 30 32 78 2e 20 20 52 65 74 75 72 6e 69 6e 67 20  02x.  Returning 
c0e0: 69 6e 20 66 61 69 6c 75 72 65 2e 22 2c 20 28 75  in failure.", (u
c0f0: 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 62 75 66  nsigned int) buf
c100: 66 65 72 5f 70 5b 30 5d 2c 20 74 61 67 29 3b 0a  fer_p[0], tag);.
c110: 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b  ...return(NULL);
c120: 0a 09 7d 0a 0a 09 62 75 66 66 65 72 5f 70 2b 2b  ..}...buffer_p++
c130: 3b 0a 09 62 75 66 66 65 72 5f 6c 65 6e 2d 2d 3b  ;..buffer_len--;
c140: 0a 0a 09 69 66 20 28 28 62 75 66 66 65 72 5f 70  ...if ((buffer_p
c150: 5b 30 5d 20 26 20 30 78 38 30 29 20 3d 3d 20 30  [0] & 0x80) == 0
c160: 78 38 30 29 20 7b 0a 09 09 73 69 7a 65 20 3d 20  x80) {...size = 
c170: 30 3b 0a 09 09 69 64 78 20 3d 20 28 62 75 66 66  0;...idx = (buff
c180: 65 72 5f 70 5b 30 5d 20 26 20 30 78 37 66 29 3b  er_p[0] & 0x7f);
c190: 0a 0a 09 09 69 66 20 28 69 64 78 20 3e 20 62 75  ....if (idx > bu
c1a0: 66 66 65 72 5f 6c 65 6e 29 20 7b 0a 09 09 09 43  ffer_len) {....C
c1b0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
c1c0: 54 46 28 22 4d 61 6c 66 6f 72 6d 65 64 20 42 45  TF("Malformed BE
c1d0: 52 20 76 61 6c 75 65 20 2d 2d 20 6e 6f 74 20 65  R value -- not e
c1e0: 6e 6f 75 67 68 20 62 79 74 65 73 20 61 76 61 69  nough bytes avai
c1f0: 6c 61 62 6c 65 20 74 6f 20 72 65 61 64 20 6c 65  lable to read le
c200: 6e 67 74 68 20 28 69 64 78 20 3d 20 25 69 2c 20  ngth (idx = %i, 
c210: 62 75 66 66 65 72 5f 6c 65 6e 20 3d 20 25 6c 75  buffer_len = %lu
c220: 29 22 2c 20 69 64 78 2c 20 28 75 6e 73 69 67 6e  )", idx, (unsign
c230: 65 64 20 6c 6f 6e 67 29 20 62 75 66 66 65 72 5f  ed long) buffer_
c240: 6c 65 6e 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e  len);.....return
c250: 28 4e 55 4c 4c 29 3b 0a 09 09 7d 0a 0a 09 09 66  (NULL);...}....f
c260: 6f 72 20 28 3b 20 69 64 78 20 3e 20 30 3b 20 69  or (; idx > 0; i
c270: 64 78 2d 2d 29 20 7b 0a 09 09 09 62 75 66 66 65  dx--) {....buffe
c280: 72 5f 70 2b 2b 3b 0a 09 09 09 62 75 66 66 65 72  r_p++;....buffer
c290: 5f 6c 65 6e 2d 2d 3b 0a 0a 09 09 09 73 69 7a 65  _len--;.....size
c2a0: 20 3c 3c 3d 20 38 3b 0a 09 09 09 73 69 7a 65 20   <<= 8;....size 
c2b0: 7c 3d 20 62 75 66 66 65 72 5f 70 5b 30 5d 3b 0a  |= buffer_p[0];.
c2c0: 09 09 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09  ..}..} else {...
c2d0: 73 69 7a 65 20 3d 20 62 75 66 66 65 72 5f 70 5b  size = buffer_p[
c2e0: 30 5d 3b 0a 09 7d 0a 0a 09 62 75 66 66 65 72 5f  0];..}...buffer_
c2f0: 70 2b 2b 3b 0a 09 62 75 66 66 65 72 5f 6c 65 6e  p++;..buffer_len
c300: 2d 2d 3b 0a 0a 09 69 66 20 28 73 69 7a 65 20 3e  --;...if (size >
c310: 20 6f 75 74 62 75 66 66 65 72 5f 6c 65 6e 29 20   outbuffer_len) 
c320: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
c330: 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20  _PRINTF("Unable 
c340: 74 6f 20 63 6f 70 79 20 76 61 6c 75 65 20 62 75  to copy value bu
c350: 66 66 65 72 20 74 6f 20 6f 75 74 62 75 66 66 65  ffer to outbuffe
c360: 72 2c 20 6e 6f 74 20 65 6e 6f 75 67 68 20 72 6f  r, not enough ro
c370: 6f 6d 2e 20 20 56 61 6c 75 65 20 62 75 66 66 65  om.  Value buffe
c380: 72 20 6c 65 6e 67 74 68 20 3d 20 25 6c 75 2c 20  r length = %lu, 
c390: 6f 75 74 20 62 75 66 66 65 72 20 6c 65 6e 67 74  out buffer lengt
c3a0: 68 20 3d 20 25 6c 75 22 2c 20 28 75 6e 73 69 67  h = %lu", (unsig
c3b0: 6e 65 64 20 6c 6f 6e 67 29 20 73 69 7a 65 2c 20  ned long) size, 
c3c0: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
c3d0: 6f 75 74 62 75 66 66 65 72 5f 6c 65 6e 29 3b 0a  outbuffer_len);.
c3e0: 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b  ...return(NULL);
c3f0: 0a 09 7d 0a 0a 09 2a 6f 75 74 62 75 66 66 65 72  ..}...*outbuffer
c400: 5f 6c 65 6e 5f 70 20 3d 20 73 69 7a 65 3b 0a 09  _len_p = size;..
c410: 69 66 20 28 6f 75 74 62 75 66 66 65 72 29 20 7b  if (outbuffer) {
c420: 0a 09 09 6d 65 6d 63 70 79 28 6f 75 74 62 75 66  ...memcpy(outbuf
c430: 66 65 72 2c 20 62 75 66 66 65 72 5f 70 2c 20 73  fer, buffer_p, s
c440: 69 7a 65 29 3b 0a 09 09 62 75 66 66 65 72 5f 70  ize);...buffer_p
c450: 20 2b 3d 20 73 69 7a 65 3b 0a 09 09 62 75 66 66   += size;...buff
c460: 65 72 5f 6c 65 6e 20 2d 3d 20 73 69 7a 65 3b 0a  er_len -= size;.
c470: 0a 09 09 2a 62 75 66 66 65 72 5f 6c 65 6e 5f 70  ...*buffer_len_p
c480: 20 3d 20 62 75 66 66 65 72 5f 6c 65 6e 3b 0a 0a   = buffer_len;..
c490: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
c4a0: 52 49 4e 54 42 55 46 28 22 42 45 52 2d 54 4c 56  RINTBUF("BER-TLV
c4b0: 20 72 65 73 75 6c 74 73 3a 22 2c 20 6f 75 74 62   results:", outb
c4c0: 75 66 66 65 72 2c 20 73 69 7a 65 29 3b 0a 09 7d  uffer, size);..}
c4d0: 20 65 6c 73 65 20 7b 0a 09 09 6d 65 6d 6d 6f 76   else {...memmov
c4e0: 65 28 62 75 66 66 65 72 2c 20 62 75 66 66 65 72  e(buffer, buffer
c4f0: 5f 70 2c 20 73 69 7a 65 29 3b 0a 09 09 62 75 66  _p, size);...buf
c500: 66 65 72 5f 70 20 3d 20 62 75 66 66 65 72 3b 0a  fer_p = buffer;.
c510: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
c520: 50 52 49 4e 54 42 55 46 28 22 42 45 52 2d 54 4c  PRINTBUF("BER-TL
c530: 56 20 72 65 73 75 6c 74 73 3a 22 2c 20 62 75 66  V results:", buf
c540: 66 65 72 2c 20 73 69 7a 65 29 3b 0a 09 7d 0a 0a  fer, size);..}..
c550: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
c560: 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
c570: 69 6e 20 73 75 63 63 65 73 73 2e 20 20 53 69 7a  in success.  Siz
c580: 65 20 6f 66 20 63 6f 6e 74 65 6e 74 73 20 66 6f  e of contents fo
c590: 72 20 74 61 67 20 25 30 32 78 20 69 73 20 25 6c  r tag %02x is %l
c5a0: 75 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 69 6e  u", (unsigned in
c5b0: 74 29 20 74 61 67 2c 20 28 75 6e 73 69 67 6e 65  t) tag, (unsigne
c5c0: 64 20 6c 6f 6e 67 29 20 73 69 7a 65 29 3b 0a 0a  d long) size);..
c5d0: 09 72 65 74 75 72 6e 28 62 75 66 66 65 72 5f 70  .return(buffer_p
c5e0: 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50  );.}../*. * SYNP
c5f0: 4f 53 49 53 0a 20 2a 20 20 20 20 20 73 73 69 7a  OSIS. *     ssiz
c600: 65 5f 74 20 63 61 63 6b 65 79 5f 67 65 74 5f 64  e_t cackey_get_d
c610: 61 74 61 28 73 74 72 75 63 74 20 63 61 63 6b 65  ata(struct cacke
c620: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e  y_slot *slot, un
c630: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66  signed char *buf
c640: 66 65 72 2c 20 73 69 7a 65 5f 74 20 62 75 66 66  fer, size_t buff
c650: 65 72 5f 6c 65 6e 2c 20 75 6e 73 69 67 6e 65 64  er_len, unsigned
c660: 20 63 68 61 72 20 6f 69 64 5b 33 5d 29 3b 0a 20   char oid[3]);. 
c670: 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20  *. * ARGUMENTS. 
c680: 2a 20 20 20 20 20 73 74 72 75 63 74 20 63 61 63  *     struct cac
c690: 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20  key_slot *slot. 
c6a0: 2a 20 20 20 20 20 20 20 20 20 53 6c 6f 74 20 74  *         Slot t
c6b0: 6f 20 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20  o send commands 
c6c0: 74 6f 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73  to. *. *     uns
c6d0: 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 66  igned char *buff
c6e0: 65 72 0a 20 2a 20 20 20 20 20 20 20 20 20 5b 4f  er. *         [O
c6f0: 55 54 5d 20 42 75 66 66 65 72 0a 20 2a 0a 20 2a  UT] Buffer. *. *
c700: 20 20 20 20 20 73 69 7a 65 5f 74 20 62 75 66 66       size_t buff
c710: 65 72 5f 6c 65 6e 0a 20 2a 20 20 20 20 20 20 20  er_len. *       
c720: 20 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65    Number of byte
c730: 73 20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f 20  s to attempt to 
c740: 72 65 61 64 0a 20 2a 0a 20 2a 20 20 20 20 20 75  read. *. *     u
c750: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6f 69 64  nsigned char oid
c760: 5b 33 5d 0a 20 2a 20 20 20 20 20 20 20 20 20 33  [3]. *         3
c770: 2d 62 79 74 65 20 4f 49 44 20 74 6f 20 72 65 61  -byte OID to rea
c780: 64 0a 20 2a 0a 20 2a 0a 20 2a 20 52 45 54 55 52  d. *. *. * RETUR
c790: 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 54  N VALUE. *     T
c7a0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
c7b0: 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20  urns the number 
c7c0: 6f 66 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c  of bytes actuall
c7d0: 79 20 72 65 61 64 2c 20 6f 72 20 2d 31 20 6f 6e  y read, or -1 on
c7e0: 20 65 72 72 6f 72 2e 0a 20 2a 0a 20 2a 20 4e 4f   error.. *. * NO
c7f0: 54 45 53 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a  TES. *     None.
c800: 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 73 73   *. */.static ss
c810: 69 7a 65 5f 74 20 63 61 63 6b 65 79 5f 67 65 74  ize_t cackey_get
c820: 5f 64 61 74 61 28 73 74 72 75 63 74 20 63 61 63  _data(struct cac
c830: 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20  key_slot *slot, 
c840: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62  unsigned char *b
c850: 75 66 66 65 72 2c 20 73 69 7a 65 5f 74 20 62 75  uffer, size_t bu
c860: 66 66 65 72 5f 6c 65 6e 2c 20 75 6e 73 69 67 6e  ffer_len, unsign
c870: 65 64 20 63 68 61 72 20 6f 69 64 5b 33 5d 29 20  ed char oid[3]) 
c880: 7b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72  {..unsigned char
c890: 20 63 6d 64 5b 5d 20 3d 20 7b 30 78 35 43 2c 20   cmd[] = {0x5C, 
c8a0: 30 78 30 33 2c 20 30 78 30 30 2c 20 30 78 30 30  0x03, 0x00, 0x00
c8b0: 2c 20 30 78 30 30 7d 3b 0a 09 75 6e 73 69 67 6e  , 0x00};..unsign
c8c0: 65 64 20 63 68 61 72 20 2a 62 75 66 66 65 72 5f  ed char *buffer_
c8d0: 70 3b 0a 09 73 69 7a 65 5f 74 20 69 6e 69 74 5f  p;..size_t init_
c8e0: 62 75 66 66 65 72 5f 6c 65 6e 2c 20 73 69 7a 65  buffer_len, size
c8f0: 3b 0a 09 75 69 6e 74 31 36 5f 74 20 72 65 73 70  ;..uint16_t resp
c900: 63 6f 64 65 3b 0a 09 69 6e 74 20 73 65 6e 64 5f  code;..int send_
c910: 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ret;...CACKEY_DE
c920: 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
c930: 65 64 2e 22 29 3b 0a 0a 09 69 6e 69 74 5f 62 75  ed.");...init_bu
c940: 66 66 65 72 5f 6c 65 6e 20 3d 20 62 75 66 66 65  ffer_len = buffe
c950: 72 5f 6c 65 6e 3b 0a 0a 09 63 6d 64 5b 32 5d 20  r_len;...cmd[2] 
c960: 3d 20 6f 69 64 5b 30 5d 3b 0a 09 63 6d 64 5b 33  = oid[0];..cmd[3
c970: 5d 20 3d 20 6f 69 64 5b 31 5d 3b 0a 09 63 6d 64  ] = oid[1];..cmd
c980: 5b 34 5d 20 3d 20 6f 69 64 5b 32 5d 3b 0a 0a 09  [4] = oid[2];...
c990: 2f 2a 20 32 35 36 20 74 6f 20 69 6e 64 69 63 61  /* 256 to indica
c9a0: 74 65 20 74 68 65 20 6c 61 72 67 65 73 74 20 6d  te the largest m
c9b0: 65 73 73 61 67 65 20 73 69 7a 65 20 2d 2d 20 6e  essage size -- n
c9c0: 6f 74 20 63 6c 65 61 72 20 69 66 20 74 68 69 73  ot clear if this
c9d0: 20 77 69 6c 6c 20 77 6f 72 6b 20 77 69 74 68 20   will work with 
c9e0: 61 6c 6c 20 6d 65 73 73 61 67 65 73 20 2a 2f 0a  all messages */.
c9f0: 09 73 65 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b  .send_ret = cack
ca00: 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f  ey_send_apdu(slo
ca10: 74 2c 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 49  t, GSCIS_CLASS_I
ca20: 53 4f 37 38 31 36 2c 20 4e 49 53 54 53 50 38 30  SO7816, NISTSP80
ca30: 30 5f 37 33 5f 33 5f 49 4e 53 54 52 5f 47 45 54  0_73_3_INSTR_GET
ca40: 5f 44 41 54 41 2c 20 30 78 33 46 2c 20 30 78 46  _DATA, 0x3F, 0xF
ca50: 46 2c 20 73 69 7a 65 6f 66 28 63 6d 64 29 2c 20  F, sizeof(cmd), 
ca60: 63 6d 64 2c 20 32 35 36 2c 20 26 72 65 73 70 63  cmd, 256, &respc
ca70: 6f 64 65 2c 20 62 75 66 66 65 72 2c 20 26 62 75  ode, buffer, &bu
ca80: 66 66 65 72 5f 6c 65 6e 29 3b 0a 0a 09 69 66 20  ffer_len);...if 
ca90: 28 73 65 6e 64 5f 72 65 74 20 3d 3d 20 43 41 43  (send_ret == CAC
caa0: 4b 45 59 5f 50 43 53 43 5f 45 5f 52 45 54 52 59  KEY_PCSC_E_RETRY
cab0: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
cac0: 55 47 5f 50 52 49 4e 54 46 28 22 41 44 50 55 20  UG_PRINTF("ADPU 
cad0: 53 65 6e 64 69 6e 67 20 66 61 69 6c 65 64 2c 20  Sending failed, 
cae0: 72 65 74 72 79 69 6e 67 20 72 65 61 64 20 62 75  retrying read bu
caf0: 66 66 65 72 22 29 3b 0a 0a 09 09 72 65 74 75 72  ffer");....retur
cb00: 6e 28 63 61 63 6b 65 79 5f 67 65 74 5f 64 61 74  n(cackey_get_dat
cb10: 61 28 73 6c 6f 74 2c 20 62 75 66 66 65 72 2c 20  a(slot, buffer, 
cb20: 69 6e 69 74 5f 62 75 66 66 65 72 5f 6c 65 6e 2c  init_buffer_len,
cb30: 20 6f 69 64 29 29 3b 0a 09 7d 0a 0a 09 69 66 20   oid));..}...if 
cb40: 28 73 65 6e 64 5f 72 65 74 20 21 3d 20 43 41 43  (send_ret != CAC
cb50: 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b  KEY_PCSC_S_OK) {
cb60: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
cb70: 50 52 49 4e 54 46 28 22 63 61 63 6b 65 79 5f 73  PRINTF("cackey_s
cb80: 65 6e 64 5f 61 70 64 75 28 29 20 66 61 69 6c 65  end_apdu() faile
cb90: 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20  d, returning in 
cba0: 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65  failure");....re
cbb0: 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 23 69  turn(-1);..}..#i
cbc0: 66 64 65 66 20 43 41 43 4b 45 59 5f 50 41 52 41  fdef CACKEY_PARA
cbd0: 4e 4f 49 44 0a 23 20 20 69 66 64 65 66 20 5f 50  NOID.#  ifdef _P
cbe0: 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58 0a 09  OSIX_SSIZE_MAX..
cbf0: 69 66 20 28 62 75 66 66 65 72 5f 6c 65 6e 20 3e  if (buffer_len >
cc00: 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41   _POSIX_SSIZE_MA
cc10: 58 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  X) {...CACKEY_DE
cc20: 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 61 64  BUG_PRINTF("Read
cc30: 20 62 79 74 65 73 20 28 62 75 66 66 65 72 5f 6c   bytes (buffer_l
cc40: 65 6e 29 20 65 78 63 65 65 64 73 20 6d 61 78 69  en) exceeds maxi
cc50: 6d 75 6d 20 76 61 6c 75 65 2c 20 72 65 74 75 72  mum value, retur
cc60: 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 2e  ning in failure.
cc70: 20 28 6d 61 78 20 3d 20 25 6c 69 2c 20 62 75 66   (max = %li, buf
cc80: 66 65 72 5f 6c 65 6e 20 3d 20 25 6c 75 29 22 2c  fer_len = %lu)",
cc90: 20 28 6c 6f 6e 67 29 20 5f 50 4f 53 49 58 5f 53   (long) _POSIX_S
cca0: 53 49 5a 45 5f 4d 41 58 2c 20 28 75 6e 73 69 67  SIZE_MAX, (unsig
ccb0: 6e 65 64 20 6c 6f 6e 67 29 20 62 75 66 66 65 72  ned long) buffer
ccc0: 5f 6c 65 6e 29 3b 0a 0a 09 09 72 65 74 75 72 6e  _len);....return
ccd0: 28 2d 31 29 3b 0a 09 7d 0a 23 20 20 65 6e 64 69  (-1);..}.#  endi
cce0: 66 0a 23 65 6e 64 69 66 0a 0a 09 69 66 20 28 62  f.#endif...if (b
ccf0: 75 66 66 65 72 5f 6c 65 6e 20 3c 20 32 29 20 7b  uffer_len < 2) {
cd00: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
cd10: 50 52 49 4e 54 46 28 22 41 50 44 55 20 47 45 54  PRINTF("APDU GET
cd20: 20 44 41 54 41 20 72 65 74 75 72 6e 65 64 20 25   DATA returned %
cd30: 6c 75 20 62 79 74 65 73 2c 20 77 68 69 63 68 20  lu bytes, which 
cd40: 69 73 20 74 6f 6f 20 73 68 6f 72 74 20 66 6f 72  is too short for
cd50: 20 61 20 42 45 52 2d 54 4c 56 20 72 65 73 70 6f   a BER-TLV respo
cd60: 6e 73 65 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  nse", (unsigned 
cd70: 6c 6f 6e 67 29 20 62 75 66 66 65 72 5f 6c 65 6e  long) buffer_len
cd80: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29  );....return(-1)
cd90: 3b 0a 09 7d 0a 0a 09 73 69 7a 65 20 3d 20 62 75  ;..}...size = bu
cda0: 66 66 65 72 5f 6c 65 6e 3b 0a 09 62 75 66 66 65  ffer_len;..buffe
cdb0: 72 5f 70 20 3d 20 63 61 63 6b 65 79 5f 72 65 61  r_p = cackey_rea
cdc0: 64 5f 62 65 72 74 6c 76 5f 74 61 67 28 62 75 66  d_bertlv_tag(buf
cdd0: 66 65 72 2c 20 26 62 75 66 66 65 72 5f 6c 65 6e  fer, &buffer_len
cde0: 2c 20 30 78 35 33 2c 20 4e 55 4c 4c 2c 20 26 73  , 0x53, NULL, &s
cdf0: 69 7a 65 29 3b 0a 0a 09 69 66 20 28 62 75 66 66  ize);...if (buff
ce00: 65 72 5f 70 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  er_p == NULL) {.
ce10: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
ce20: 52 49 4e 54 46 28 22 54 61 67 20 64 65 63 6f 64  RINTF("Tag decod
ce30: 69 6e 67 20 66 61 69 6c 65 64 2c 20 72 65 74 75  ing failed, retu
ce40: 72 6e 69 6e 67 20 69 6e 20 65 72 72 6f 72 2e 22  rning in error."
ce50: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29  );....return(-1)
ce60: 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
ce70: 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22 47 45  BUG_PRINTBUF("GE
ce80: 54 20 44 41 54 41 20 72 65 73 75 6c 74 22 2c 20  T DATA result", 
ce90: 62 75 66 66 65 72 2c 20 73 69 7a 65 29 3b 0a 0a  buffer, size);..
cea0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
ceb0: 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
cec0: 69 6e 20 73 75 63 63 65 73 73 2c 20 72 65 61 64  in success, read
ced0: 20 25 6c 75 20 62 79 74 65 73 22 2c 20 28 75 6e   %lu bytes", (un
cee0: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69 7a  signed long) siz
cef0: 65 29 3b 0a 0a 09 72 65 74 75 72 6e 28 73 69 7a  e);...return(siz
cf00: 65 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e  e);.}../*. * SYN
cf10: 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 73 73 69  POSIS. *     ssi
cf20: 7a 65 5f 74 20 63 61 63 6b 65 79 5f 72 65 61 64  ze_t cackey_read
cf30: 5f 62 75 66 66 65 72 28 73 74 72 75 63 74 20 63  _buffer(struct c
cf40: 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74  ackey_slot *slot
cf50: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
cf60: 2a 62 75 66 66 65 72 2c 20 73 69 7a 65 5f 74 20  *buffer, size_t 
cf70: 63 6f 75 6e 74 2c 20 75 6e 73 69 67 6e 65 64 20  count, unsigned 
cf80: 63 68 61 72 20 74 5f 6f 72 5f 76 2c 20 73 69 7a  char t_or_v, siz
cf90: 65 5f 74 20 69 6e 69 74 69 61 6c 5f 6f 66 66 73  e_t initial_offs
cfa0: 65 74 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d  et);. *. * ARGUM
cfb0: 45 4e 54 53 0a 20 2a 20 20 20 20 20 73 74 72 75  ENTS. *     stru
cfc0: 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a  ct cackey_slot *
cfd0: 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20  slot. *         
cfe0: 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d  Slot to send com
cff0: 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 20  mands to. *. *  
d000: 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
d010: 20 2a 62 75 66 66 65 72 0a 20 2a 20 20 20 20 20   *buffer. *     
d020: 20 20 20 20 5b 4f 55 54 5d 20 42 75 66 66 65 72      [OUT] Buffer
d030: 0a 20 2a 0a 20 2a 20 20 20 20 20 73 69 7a 65 5f  . *. *     size_
d040: 74 20 63 6f 75 6e 74 0a 20 2a 20 20 20 20 20 20  t count. *      
d050: 20 20 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74     Number of byt
d060: 65 73 20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f  es to attempt to
d070: 20 72 65 61 64 0a 20 2a 0a 20 2a 20 20 20 20 20   read. *. *     
d080: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 74 5f  unsigned char t_
d090: 6f 72 5f 76 0a 20 2a 20 20 20 20 20 20 20 20 20  or_v. *         
d0a0: 53 65 6c 65 63 74 20 74 68 65 20 54 2d 62 75 66  Select the T-buf
d0b0: 66 65 72 20 28 30 31 29 20 6f 72 20 56 2d 62 75  fer (01) or V-bu
d0c0: 66 66 65 72 20 28 30 32 29 20 74 6f 20 72 65 61  ffer (02) to rea
d0d0: 64 20 66 72 6f 6d 2e 20 20 0a 20 2a 0a 20 2a 20  d from.  . *. * 
d0e0: 20 20 20 20 73 69 7a 65 5f 74 20 69 6e 69 74 69      size_t initi
d0f0: 61 6c 5f 6f 66 66 73 65 74 0a 20 2a 20 20 20 20  al_offset. *    
d100: 20 20 20 20 20 53 70 65 63 69 66 79 20 74 68 65       Specify the
d110: 20 6f 66 66 73 65 74 20 74 6f 20 62 65 67 69 6e   offset to begin
d120: 20 74 68 65 20 72 65 61 64 20 66 72 6f 6d 0a 20   the read from. 
d130: 2a 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56  *. *. * RETURN V
d140: 41 4c 55 45 0a 20 2a 20 20 20 20 20 54 68 69 73  ALUE. *     This
d150: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
d160: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
d170: 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20 72  bytes actually r
d180: 65 61 64 2c 20 6f 72 20 2d 31 20 6f 6e 20 65 72  ead, or -1 on er
d190: 72 6f 72 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53  ror.. *. * NOTES
d1a0: 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a  . *     None. *.
d1b0: 20 2a 2f 0a 73 74 61 74 69 63 20 73 73 69 7a 65   */.static ssize
d1c0: 5f 74 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 62  _t cackey_read_b
d1d0: 75 66 66 65 72 28 73 74 72 75 63 74 20 63 61 63  uffer(struct cac
d1e0: 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20  key_slot *slot, 
d1f0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62  unsigned char *b
d200: 75 66 66 65 72 2c 20 73 69 7a 65 5f 74 20 63 6f  uffer, size_t co
d210: 75 6e 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  unt, unsigned ch
d220: 61 72 20 74 5f 6f 72 5f 76 2c 20 73 69 7a 65 5f  ar t_or_v, size_
d230: 74 20 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65 74  t initial_offset
d240: 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68  ) {..unsigned ch
d250: 61 72 20 2a 69 6e 69 74 5f 62 75 66 66 65 72 3b  ar *init_buffer;
d260: 0a 09 73 69 7a 65 5f 74 20 69 6e 69 74 5f 63 6f  ..size_t init_co
d270: 75 6e 74 3b 0a 09 73 69 7a 65 5f 74 20 69 6e 69  unt;..size_t ini
d280: 74 5f 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65 74  t_initial_offset
d290: 3b 0a 0a 09 73 69 7a 65 5f 74 20 6f 66 66 73 65  ;...size_t offse
d2a0: 74 20 3d 20 30 2c 20 6d 61 78 5f 6f 66 66 73 65  t = 0, max_offse
d2b0: 74 2c 20 6d 61 78 5f 63 6f 75 6e 74 3b 0a 09 75  t, max_count;..u
d2c0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63 6d 64  nsigned char cmd
d2d0: 5b 32 5d 3b 0a 09 75 69 6e 74 31 36 5f 74 20 72  [2];..uint16_t r
d2e0: 65 73 70 63 6f 64 65 3b 0a 09 69 6e 74 20 73 65  espcode;..int se
d2f0: 6e 64 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59  nd_ret;...CACKEY
d300: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
d310: 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 6e 69 74  alled.");...init
d320: 5f 62 75 66 66 65 72 20 3d 20 62 75 66 66 65 72  _buffer = buffer
d330: 3b 0a 09 69 6e 69 74 5f 63 6f 75 6e 74 20 3d 20  ;..init_count = 
d340: 63 6f 75 6e 74 3b 0a 09 69 6e 69 74 5f 69 6e 69  count;..init_ini
d350: 74 69 61 6c 5f 6f 66 66 73 65 74 20 3d 20 69 6e  tial_offset = in
d360: 69 74 69 61 6c 5f 6f 66 66 73 65 74 3b 0a 0a 09  itial_offset;...
d370: 6d 61 78 5f 6f 66 66 73 65 74 20 3d 20 63 6f 75  max_offset = cou
d380: 6e 74 3b 0a 09 6d 61 78 5f 63 6f 75 6e 74 20 3d  nt;..max_count =
d390: 20 43 41 43 4b 45 59 5f 41 50 44 55 5f 4d 54 55   CACKEY_APDU_MTU
d3a0: 3b 0a 0a 09 69 66 20 28 74 5f 6f 72 5f 76 20 21  ;...if (t_or_v !
d3b0: 3d 20 31 20 26 26 20 74 5f 6f 72 5f 76 20 21 3d  = 1 && t_or_v !=
d3c0: 20 32 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   2) {...CACKEY_D
d3d0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 49 6e 76  EBUG_PRINTF("Inv
d3e0: 61 6c 69 64 20 54 20 6f 72 20 56 20 70 61 72 61  alid T or V para
d3f0: 6d 65 74 65 72 20 73 70 65 63 69 66 69 65 64 2c  meter specified,
d400: 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61   returning in fa
d410: 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75  ilure");....retu
d420: 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 63 6d 64  rn(-1);..}...cmd
d430: 5b 30 5d 20 3d 20 74 5f 6f 72 5f 76 3b 0a 0a 09  [0] = t_or_v;...
d440: 77 68 69 6c 65 20 28 31 29 20 7b 0a 09 09 69 66  while (1) {...if
d450: 20 28 6f 66 66 73 65 74 20 3e 3d 20 6d 61 78 5f   (offset >= max_
d460: 6f 66 66 73 65 74 29 20 7b 0a 09 09 09 43 41 43  offset) {....CAC
d470: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
d480: 28 22 42 75 66 66 65 72 20 74 6f 6f 20 73 6d 61  ("Buffer too sma
d490: 6c 6c 2c 20 72 65 74 75 72 6e 69 6e 67 20 77 68  ll, returning wh
d4a0: 61 74 20 77 65 20 67 6f 74 2e 2e 2e 22 29 3b 0a  at we got...");.
d4b0: 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a  ....break;...}..
d4c0: 09 09 63 6f 75 6e 74 20 3d 20 6d 61 78 5f 6f 66  ..count = max_of
d4d0: 66 73 65 74 20 2d 20 6f 66 66 73 65 74 3b 0a 09  fset - offset;..
d4e0: 09 69 66 20 28 63 6f 75 6e 74 20 3e 20 6d 61 78  .if (count > max
d4f0: 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 09 63 6f 75  _count) {....cou
d500: 6e 74 20 3d 20 6d 61 78 5f 63 6f 75 6e 74 3b 0a  nt = max_count;.
d510: 09 09 7d 0a 0a 09 09 63 6d 64 5b 31 5d 20 3d 20  ..}....cmd[1] = 
d520: 63 6f 75 6e 74 3b 0a 0a 09 09 73 65 6e 64 5f 72  count;....send_r
d530: 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64  et = cackey_send
d540: 5f 61 70 64 75 28 73 6c 6f 74 2c 20 47 53 43 49  _apdu(slot, GSCI
d550: 53 5f 43 4c 41 53 53 5f 47 4c 4f 42 41 4c 5f 50  S_CLASS_GLOBAL_P
d560: 4c 41 54 46 4f 52 4d 2c 20 47 53 43 49 53 5f 49  LATFORM, GSCIS_I
d570: 4e 53 54 52 5f 52 45 41 44 5f 42 55 46 46 45 52  NSTR_READ_BUFFER
d580: 2c 20 28 28 69 6e 69 74 69 61 6c 5f 6f 66 66 73  , ((initial_offs
d590: 65 74 20 2b 20 6f 66 66 73 65 74 29 20 3e 3e 20  et + offset) >> 
d5a0: 38 29 20 26 20 30 78 66 66 2c 20 28 69 6e 69 74  8) & 0xff, (init
d5b0: 69 61 6c 5f 6f 66 66 73 65 74 20 2b 20 6f 66 66  ial_offset + off
d5c0: 73 65 74 29 20 26 20 30 78 66 66 2c 20 73 69 7a  set) & 0xff, siz
d5d0: 65 6f 66 28 63 6d 64 29 2c 20 63 6d 64 2c 20 30  eof(cmd), cmd, 0
d5e0: 78 30 30 2c 20 26 72 65 73 70 63 6f 64 65 2c 20  x00, &respcode, 
d5f0: 62 75 66 66 65 72 20 2b 20 6f 66 66 73 65 74 2c  buffer + offset,
d600: 20 26 63 6f 75 6e 74 29 3b 0a 0a 09 09 69 66 20   &count);....if 
d610: 28 73 65 6e 64 5f 72 65 74 20 3d 3d 20 43 41 43  (send_ret == CAC
d620: 4b 45 59 5f 50 43 53 43 5f 45 5f 52 45 54 52 59  KEY_PCSC_E_RETRY
d630: 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
d640: 42 55 47 5f 50 52 49 4e 54 46 28 22 41 44 50 55  BUG_PRINTF("ADPU
d650: 20 53 65 6e 64 69 6e 67 20 66 61 69 6c 65 64 2c   Sending failed,
d660: 20 72 65 74 72 79 69 6e 67 20 72 65 61 64 20 62   retrying read b
d670: 75 66 66 65 72 22 29 3b 0a 0a 09 09 09 72 65 74  uffer");.....ret
d680: 75 72 6e 28 63 61 63 6b 65 79 5f 72 65 61 64 5f  urn(cackey_read_
d690: 62 75 66 66 65 72 28 73 6c 6f 74 2c 20 69 6e 69  buffer(slot, ini
d6a0: 74 5f 62 75 66 66 65 72 2c 20 69 6e 69 74 5f 63  t_buffer, init_c
d6b0: 6f 75 6e 74 2c 20 74 5f 6f 72 5f 76 2c 20 69 6e  ount, t_or_v, in
d6c0: 69 74 5f 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65  it_initial_offse
d6d0: 74 29 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28  t));...}....if (
d6e0: 73 65 6e 64 5f 72 65 74 20 21 3d 20 43 41 43 4b  send_ret != CACK
d6f0: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a  EY_PCSC_S_OK) {.
d700: 09 09 09 69 66 20 28 72 65 73 70 63 6f 64 65 20  ...if (respcode 
d710: 3d 3d 20 30 78 36 41 38 36 29 20 7b 0a 09 09 09  == 0x6A86) {....
d720: 09 69 66 20 28 6d 61 78 5f 63 6f 75 6e 74 20 3d  .if (max_count =
d730: 3d 20 31 29 20 7b 0a 09 09 09 09 09 62 72 65 61  = 1) {......brea
d740: 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 6d 61  k;.....}......ma
d750: 78 5f 63 6f 75 6e 74 20 3d 20 6d 61 78 5f 63 6f  x_count = max_co
d760: 75 6e 74 20 2f 20 32 3b 0a 0a 09 09 09 09 63 6f  unt / 2;......co
d770: 6e 74 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a 09 09  ntinue;....}....
d780: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
d790: 49 4e 54 46 28 22 63 61 63 6b 65 79 5f 73 65 6e  INTF("cackey_sen
d7a0: 64 5f 61 70 64 75 28 29 20 66 61 69 6c 65 64 2c  d_apdu() failed,
d7b0: 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61   returning in fa
d7c0: 69 6c 75 72 65 22 29 3b 0a 0a 09 09 09 72 65 74  ilure");.....ret
d7d0: 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09 09  urn(-1);...}....
d7e0: 6f 66 66 73 65 74 20 2b 3d 20 63 6f 75 6e 74 3b  offset += count;
d7f0: 0a 0a 09 09 69 66 20 28 63 6f 75 6e 74 20 3c 20  ....if (count < 
d800: 6d 61 78 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 09  max_count) {....
d810: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
d820: 4e 54 46 28 22 53 68 6f 72 74 20 72 65 61 64 20  NTF("Short read 
d830: 2d 2d 20 63 6f 75 6e 74 20 3d 20 25 69 2c 20 63  -- count = %i, c
d840: 6d 64 5b 31 5d 20 3d 20 25 69 22 2c 20 28 69 6e  md[1] = %i", (in
d850: 74 29 20 63 6f 75 6e 74 2c 20 28 69 6e 74 29 20  t) count, (int) 
d860: 63 6d 64 5b 31 5d 29 3b 0a 0a 09 09 09 62 72 65  cmd[1]);.....bre
d870: 61 6b 3b 0a 09 09 7d 0a 09 7d 0a 0a 23 69 66 64  ak;...}..}..#ifd
d880: 65 66 20 43 41 43 4b 45 59 5f 50 41 52 41 4e 4f  ef CACKEY_PARANO
d890: 49 44 0a 23 20 20 69 66 64 65 66 20 5f 50 4f 53  ID.#  ifdef _POS
d8a0: 49 58 5f 53 53 49 5a 45 5f 4d 41 58 0a 09 69 66  IX_SSIZE_MAX..if
d8b0: 20 28 6f 66 66 73 65 74 20 3e 20 5f 50 4f 53 49   (offset > _POSI
d8c0: 58 5f 53 53 49 5a 45 5f 4d 41 58 29 20 7b 0a 09  X_SSIZE_MAX) {..
d8d0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
d8e0: 49 4e 54 46 28 22 4f 66 66 73 65 74 20 65 78 63  INTF("Offset exc
d8f0: 65 65 64 73 20 6d 61 78 69 6d 75 6d 20 76 61 6c  eeds maximum val
d900: 75 65 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e  ue, returning in
d910: 20 66 61 69 6c 75 72 65 2e 20 28 6d 61 78 20 3d   failure. (max =
d920: 20 25 6c 69 2c 20 6f 66 66 73 65 74 20 3d 20 25   %li, offset = %
d930: 6c 75 29 22 2c 20 28 6c 6f 6e 67 29 20 5f 50 4f  lu)", (long) _PO
d940: 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58 2c 20 28  SIX_SSIZE_MAX, (
d950: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 6f  unsigned long) o
d960: 66 66 73 65 74 29 3b 0a 0a 09 09 72 65 74 75 72  ffset);....retur
d970: 6e 28 2d 31 29 3b 0a 09 7d 0a 23 20 20 65 6e 64  n(-1);..}.#  end
d980: 69 66 0a 23 65 6e 64 69 66 0a 0a 09 43 41 43 4b  if.#endif...CACK
d990: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
d9a0: 22 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 73 75  "Returning in su
d9b0: 63 63 65 73 73 2c 20 72 65 61 64 20 25 6c 75 20  ccess, read %lu 
d9c0: 62 79 74 65 73 22 2c 20 28 75 6e 73 69 67 6e 65  bytes", (unsigne
d9d0: 64 20 6c 6f 6e 67 29 20 6f 66 66 73 65 74 29 3b  d long) offset);
d9e0: 0a 0a 09 72 65 74 75 72 6e 28 6f 66 66 73 65 74  ...return(offset
d9f0: 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50  );.}../*. * SYNP
da00: 4f 53 49 53 0a 20 2a 20 20 20 20 20 63 61 63 6b  OSIS. *     cack
da10: 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 73 65  ey_ret cackey_se
da20: 6c 65 63 74 5f 61 70 70 6c 65 74 28 73 74 72 75  lect_applet(stru
da30: 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a  ct cackey_slot *
da40: 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20 63  slot, unsigned c
da50: 68 61 72 20 2a 61 69 64 2c 20 73 69 7a 65 5f 74  har *aid, size_t
da60: 20 61 69 64 5f 6c 65 6e 29 3b 0a 20 2a 0a 20 2a   aid_len);. *. *
da70: 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20   ARGUMENTS. *   
da80: 20 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f    struct cackey_
da90: 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20  slot *slot. *   
daa0: 20 20 20 20 20 20 53 6c 6f 74 20 74 6f 20 73 65        Slot to se
dab0: 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20  nd commands to. 
dac0: 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65  *. *     unsigne
dad0: 64 20 63 68 61 72 20 2a 61 69 64 0a 20 2a 20 20  d char *aid. *  
dae0: 20 20 20 20 20 20 20 42 75 66 66 65 72 20 63 6f         Buffer co
daf0: 6e 74 61 69 6e 69 6e 67 20 41 70 70 6c 65 74 20  ntaining Applet 
db00: 49 44 20 74 6f 20 73 65 6c 65 63 74 0a 20 2a 0a  ID to select. *.
db10: 20 2a 20 20 20 20 20 73 69 7a 65 5f 74 20 61 69   *     size_t ai
db20: 64 5f 6c 65 6e 0a 20 2a 20 20 20 20 20 20 20 20  d_len. *        
db30: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
db40: 20 69 6e 20 74 68 65 20 22 61 69 64 22 20 28 41   in the "aid" (A
db50: 70 70 6c 65 74 20 49 44 29 20 70 61 72 61 6d 65  pplet ID) parame
db60: 74 65 72 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e  ter. *. * RETURN
db70: 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 43 41   VALUE. *     CA
db80: 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20  CKEY_PCSC_S_OK  
db90: 20 20 20 20 20 20 20 4f 6e 20 73 75 63 63 65 73         On succes
dba0: 73 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f  s. *     CACKEY_
dbb0: 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 20 20  PCSC_E_GENERIC  
dbc0: 20 20 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a 20 2a    On error. *. *
dbd0: 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 4e 6f   NOTES. *     No
dbe0: 6e 65 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63  ne. *. */.static
dbf0: 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b   cackey_ret cack
dc00: 65 79 5f 73 65 6c 65 63 74 5f 61 70 70 6c 65 74  ey_select_applet
dc10: 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73  (struct cackey_s
dc20: 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67  lot *slot, unsig
dc30: 6e 65 64 20 63 68 61 72 20 2a 61 69 64 2c 20 73  ned char *aid, s
dc40: 69 7a 65 5f 74 20 61 69 64 5f 6c 65 6e 29 20 7b  ize_t aid_len) {
dc50: 0a 09 69 6e 74 20 73 65 6e 64 5f 72 65 74 3b 0a  ..int send_ret;.
dc60: 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
dc70: 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
dc80: 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
dc90: 5f 50 52 49 4e 54 42 55 46 28 22 53 65 6c 65 63  _PRINTBUF("Selec
dca0: 74 69 6e 67 20 61 70 70 6c 65 74 3a 22 2c 20 61  ting applet:", a
dcb0: 69 64 2c 20 61 69 64 5f 6c 65 6e 29 3b 0a 0a 09  id, aid_len);...
dcc0: 73 65 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b 65  send_ret = cacke
dcd0: 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f 74  y_send_apdu(slot
dce0: 2c 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 49 53  , GSCIS_CLASS_IS
dcf0: 4f 37 38 31 36 2c 20 47 53 43 49 53 5f 49 4e 53  O7816, GSCIS_INS
dd00: 54 52 5f 53 45 4c 45 43 54 2c 20 47 53 43 49 53  TR_SELECT, GSCIS
dd10: 5f 50 41 52 41 4d 5f 53 45 4c 45 43 54 5f 41 50  _PARAM_SELECT_AP
dd20: 50 4c 45 54 2c 20 30 78 30 30 2c 20 61 69 64 5f  PLET, 0x00, aid_
dd30: 6c 65 6e 2c 20 61 69 64 2c 20 30 78 30 30 2c 20  len, aid, 0x00, 
dd40: 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c  NULL, NULL, NULL
dd50: 29 3b 0a 0a 09 69 66 20 28 73 65 6e 64 5f 72 65  );...if (send_re
dd60: 74 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43  t == CACKEY_PCSC
dd70: 5f 45 5f 52 45 54 52 59 29 20 7b 0a 09 09 43 41  _E_RETRY) {...CA
dd80: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
dd90: 46 28 22 41 44 50 55 20 53 65 6e 64 69 6e 67 20  F("ADPU Sending 
dda0: 66 61 69 6c 65 64 2c 20 72 65 74 72 79 69 6e 67  failed, retrying
ddb0: 20 73 65 6c 65 63 74 20 61 70 70 6c 65 74 22 29   select applet")
ddc0: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 63 61 63 6b  ;....return(cack
ddd0: 65 79 5f 73 65 6c 65 63 74 5f 61 70 70 6c 65 74  ey_select_applet
dde0: 28 73 6c 6f 74 2c 20 61 69 64 2c 20 61 69 64 5f  (slot, aid, aid_
ddf0: 6c 65 6e 29 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  len));..}...if (
de00: 73 65 6e 64 5f 72 65 74 20 21 3d 20 43 41 43 4b  send_ret != CACK
de10: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a  EY_PCSC_S_OK) {.
de20: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
de30: 52 49 4e 54 46 28 22 46 61 69 6c 65 64 20 74 6f  RINTF("Failed to
de40: 20 6f 70 65 6e 20 61 70 70 6c 65 74 2c 20 72 65   open applet, re
de50: 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
de60: 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  re");....return(
de70: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45  CACKEY_PCSC_E_GE
de80: 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 43 41 43  NERIC);..}...CAC
de90: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
dea0: 28 22 53 75 63 63 65 73 73 66 75 6c 6c 79 20 73  ("Successfully s
deb0: 65 6c 65 63 74 65 64 20 66 69 6c 65 22 29 3b 0a  elected file");.
dec0: 0a 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
ded0: 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f  PCSC_S_OK);.}../
dee0: 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a  *. * SYNPOSIS. *
def0: 20 20 20 20 20 63 61 63 6b 65 79 5f 72 65 74 20       cackey_ret 
df00: 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 66 69  cackey_select_fi
df10: 6c 65 28 73 74 72 75 63 74 20 63 61 63 6b 65 79  le(struct cackey
df20: 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 69 6e  _slot *slot, uin
df30: 74 31 36 5f 74 20 65 66 29 3b 0a 20 2a 0a 20 2a  t16_t ef);. *. *
df40: 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20   ARGUMENTS. *   
df50: 20 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f    struct cackey_
df60: 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20  slot *slot. *   
df70: 20 20 20 20 20 20 53 6c 6f 74 20 74 6f 20 73 65        Slot to se
df80: 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20  nd commands to. 
df90: 2a 0a 20 2a 20 20 20 20 20 75 69 6e 74 31 36 5f  *. *     uint16_
dfa0: 74 20 65 66 0a 20 2a 20 20 20 20 20 20 20 20 20  t ef. *         
dfb0: 45 6c 65 6d 65 6e 74 61 6c 20 46 69 6c 65 20 74  Elemental File t
dfc0: 6f 20 73 65 6c 65 63 74 0a 20 2a 0a 20 2a 20 52  o select. *. * R
dfd0: 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20  ETURN VALUE. *  
dfe0: 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53     CACKEY_PCSC_S
dff0: 5f 4f 4b 20 20 20 20 20 20 20 20 20 4f 6e 20 73  _OK         On s
e000: 75 63 63 65 73 73 0a 20 2a 20 20 20 20 20 43 41  uccess. *     CA
e010: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45  CKEY_PCSC_E_GENE
e020: 52 49 43 20 20 20 20 4f 6e 20 65 72 72 6f 72 0a  RIC    On error.
e030: 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20   *. * NOTES. *  
e040: 20 20 20 54 68 69 73 20 73 65 6c 65 63 74 73 20     This selects 
e050: 61 6e 20 45 6c 65 6d 65 6e 74 61 72 79 20 46 69  an Elementary Fi
e060: 6c 65 20 28 45 46 29 20 75 6e 64 65 72 20 74 68  le (EF) under th
e070: 65 20 63 75 72 72 65 6e 74 6c 79 20 73 65 6c 65  e currently sele
e080: 63 74 65 64 0a 20 2a 20 20 20 20 20 44 65 64 69  cted. *     Dedi
e090: 63 61 74 65 64 20 46 69 6c 65 20 28 44 46 29 0a  cated File (DF).
e0a0: 20 2a 0a 20 2a 20 20 20 20 20 54 79 70 69 63 61   *. *     Typica
e0b0: 6c 6c 79 20 74 68 69 73 20 69 73 20 63 61 6c 6c  lly this is call
e0c0: 65 64 20 61 66 74 65 72 20 73 65 6c 65 63 74 69  ed after selecti
e0d0: 6e 67 20 74 68 65 20 63 6f 72 72 65 63 74 20 41  ng the correct A
e0e0: 70 70 6c 65 74 20 28 75 73 69 6e 67 0a 20 2a 20  pplet (using. * 
e0f0: 20 20 20 20 63 61 63 6b 65 79 5f 73 65 6c 65 63      cackey_selec
e100: 74 5f 61 70 70 6c 65 74 29 20 66 6f 72 20 56 4d  t_applet) for VM
e110: 20 63 61 72 64 73 0a 20 2a 0a 20 2a 2f 0a 73 74   cards. *. */.st
e120: 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74 20  atic cackey_ret 
e130: 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 66 69  cackey_select_fi
e140: 6c 65 28 73 74 72 75 63 74 20 63 61 63 6b 65 79  le(struct cackey
e150: 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 69 6e  _slot *slot, uin
e160: 74 31 36 5f 74 20 65 66 29 20 7b 0a 09 75 6e 73  t16_t ef) {..uns
e170: 69 67 6e 65 64 20 63 68 61 72 20 66 69 64 5f 62  igned char fid_b
e180: 75 66 5b 32 5d 3b 0a 09 69 6e 74 20 73 65 6e 64  uf[2];..int send
e190: 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  _ret;...CACKEY_D
e1a0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
e1b0: 6c 65 64 2e 22 29 3b 0a 0a 09 2f 2a 20 4f 70 65  led.");.../* Ope
e1c0: 6e 20 74 68 65 20 65 6c 65 6d 65 6e 74 61 72 79  n the elementary
e1d0: 20 66 69 6c 65 20 2a 2f 0a 09 66 69 64 5f 62 75   file */..fid_bu
e1e0: 66 5b 30 5d 20 3d 20 28 65 66 20 3e 3e 20 38 29  f[0] = (ef >> 8)
e1f0: 20 26 20 30 78 66 66 3b 0a 09 66 69 64 5f 62 75   & 0xff;..fid_bu
e200: 66 5b 31 5d 20 3d 20 65 66 20 26 20 30 78 66 66  f[1] = ef & 0xff
e210: 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
e220: 5f 50 52 49 4e 54 46 28 22 53 65 6c 65 63 74 69  _PRINTF("Selecti
e230: 6e 67 20 66 69 6c 65 3a 20 25 30 34 6c 78 22 2c  ng file: %04lx",
e240: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
e250: 20 65 66 29 3b 0a 0a 09 73 65 6e 64 5f 72 65 74   ef);...send_ret
e260: 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61   = cackey_send_a
e270: 70 64 75 28 73 6c 6f 74 2c 20 47 53 43 49 53 5f  pdu(slot, GSCIS_
e280: 43 4c 41 53 53 5f 49 53 4f 37 38 31 36 2c 20 47  CLASS_ISO7816, G
e290: 53 43 49 53 5f 49 4e 53 54 52 5f 53 45 4c 45 43  SCIS_INSTR_SELEC
e2a0: 54 2c 20 30 78 30 32 2c 20 30 78 30 43 2c 20 73  T, 0x02, 0x0C, s
e2b0: 69 7a 65 6f 66 28 66 69 64 5f 62 75 66 29 2c 20  izeof(fid_buf), 
e2c0: 66 69 64 5f 62 75 66 2c 20 30 78 30 30 2c 20 4e  fid_buf, 0x00, N
e2d0: 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29  ULL, NULL, NULL)
e2e0: 3b 0a 09 69 66 20 28 73 65 6e 64 5f 72 65 74 20  ;..if (send_ret 
e2f0: 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  != CACKEY_PCSC_S
e300: 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  _OK) {...CACKEY_
e310: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 61  DEBUG_PRINTF("Fa
e320: 69 6c 65 64 20 74 6f 20 6f 70 65 6e 20 66 69 6c  iled to open fil
e330: 65 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20  e, returning in 
e340: 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65  failure");....re
e350: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
e360: 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a  _E_GENERIC);..}.
e370: 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
e380: 52 49 4e 54 46 28 22 53 75 63 63 65 73 73 66 75  RINTF("Successfu
e390: 6c 6c 79 20 73 65 6c 65 63 74 65 64 20 66 69 6c  lly selected fil
e3a0: 65 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41  e");...return(CA
e3b0: 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b  CKEY_PCSC_S_OK);
e3c0: 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53  .}../*. * SYNPOS
e3d0: 49 53 0a 20 2a 20 20 20 20 20 76 6f 69 64 20 63  IS. *     void c
e3e0: 61 63 6b 65 79 5f 66 72 65 65 5f 74 6c 76 28 73  ackey_free_tlv(s
e3f0: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76  truct cackey_tlv
e400: 5f 65 6e 74 69 74 79 20 2a 72 6f 6f 74 29 3b 0a  _entity *root);.
e410: 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a   *. * ARGUMENTS.
e420: 20 2a 20 20 20 20 20 73 74 72 75 63 74 20 63 61   *     struct ca
e430: 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20  ckey_tlv_entity 
e440: 2a 72 6f 6f 74 0a 20 2a 20 20 20 20 20 20 20 20  *root. *        
e450: 20 52 6f 6f 74 20 6f 66 20 74 68 65 20 54 4c 56   Root of the TLV
e460: 20 6c 69 73 74 20 74 6f 20 73 74 61 72 74 20 66   list to start f
e470: 72 65 65 69 6e 67 0a 20 2a 0a 20 2a 20 52 45 54  reeing. *. * RET
e480: 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20  URN VALUE. *    
e490: 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 4e 4f 54 45   None. *. * NOTE
e4a0: 53 0a 20 2a 20 20 20 20 20 54 68 69 73 20 66 75  S. *     This fu
e4b0: 6e 63 74 69 6f 6e 20 66 72 65 65 73 20 74 68 65  nction frees the
e4c0: 20 54 4c 56 20 6c 69 6e 6b 65 64 20 6c 69 73 74   TLV linked list
e4d0: 65 64 20 72 65 74 75 72 6e 65 64 20 66 72 6f 6d  ed returned from
e4e0: 0a 20 2a 20 20 20 20 20 22 63 61 63 6b 65 79 5f  . *     "cackey_
e4f0: 72 65 61 64 5f 74 6c 76 22 0a 20 2a 0a 20 2a 2f  read_tlv". *. */
e500: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 61 63  .static void cac
e510: 6b 65 79 5f 66 72 65 65 5f 74 6c 76 28 73 74 72  key_free_tlv(str
e520: 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65  uct cackey_tlv_e
e530: 6e 74 69 74 79 20 2a 72 6f 6f 74 29 20 7b 0a 09  ntity *root) {..
e540: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c  struct cackey_tl
e550: 76 5f 65 6e 74 69 74 79 20 2a 63 75 72 72 2c 20  v_entity *curr, 
e560: 2a 6e 65 78 74 3b 0a 0a 09 69 66 20 28 72 6f 6f  *next;...if (roo
e570: 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72  t == NULL) {...r
e580: 65 74 75 72 6e 3b 0a 09 7d 0a 0a 09 66 6f 72 20  eturn;..}...for 
e590: 28 63 75 72 72 20 3d 20 72 6f 6f 74 3b 20 63 75  (curr = root; cu
e5a0: 72 72 3b 20 63 75 72 72 20 3d 20 6e 65 78 74 29  rr; curr = next)
e5b0: 20 7b 0a 09 09 6e 65 78 74 20 3d 20 63 75 72 72   {...next = curr
e5c0: 2d 3e 5f 6e 65 78 74 3b 0a 0a 09 09 73 77 69 74  ->_next;....swit
e5d0: 63 68 20 28 63 75 72 72 2d 3e 74 61 67 29 20 7b  ch (curr->tag) {
e5e0: 0a 09 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ....case GSCIS_T
e5f0: 41 47 5f 41 43 52 5f 54 41 42 4c 45 3a 0a 09 09  AG_ACR_TABLE:...
e600: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
e610: 43 45 52 54 49 46 49 43 41 54 45 3a 0a 09 09 09  CERTIFICATE:....
e620: 09 69 66 20 28 63 75 72 72 2d 3e 76 61 6c 75 65  .if (curr->value
e630: 29 20 7b 0a 09 09 09 09 09 66 72 65 65 28 63 75  ) {......free(cu
e640: 72 72 2d 3e 76 61 6c 75 65 29 3b 0a 09 09 09 09  rr->value);.....
e650: 7d 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  }.....break;....
e660: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43  case GSCIS_TAG_C
e670: 41 52 44 55 52 4c 3a 0a 09 09 09 09 69 66 20 28  ARDURL:.....if (
e680: 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64  curr->value_card
e690: 75 72 6c 29 20 7b 0a 09 09 09 09 09 66 72 65 65  url) {......free
e6a0: 28 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72  (curr->value_car
e6b0: 64 75 72 6c 29 3b 0a 09 09 09 09 7d 0a 09 09 09  durl);.....}....
e6c0: 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09 66  .break;...}....f
e6d0: 72 65 65 28 63 75 72 72 29 3b 0a 09 7d 0a 0a 09  ree(curr);..}...
e6e0: 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 20 2a  return;.}../*. *
e6f0: 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20   SYNPOSIS. *    
e700: 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55 4d   .... *. * ARGUM
e710: 45 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a  ENTS. *     ....
e720: 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c   *. * RETURN VAL
e730: 55 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a  UE. *     .... *
e740: 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20  . * NOTES. *    
e750: 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74   .... *. */.stat
e760: 69 63 20 73 74 72 75 63 74 20 63 61 63 6b 65 79  ic struct cackey
e770: 5f 74 6c 76 5f 65 6e 74 69 74 79 20 2a 63 61 63  _tlv_entity *cac
e780: 6b 65 79 5f 72 65 61 64 5f 74 6c 76 28 73 74 72  key_read_tlv(str
e790: 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20  uct cackey_slot 
e7a0: 2a 73 6c 6f 74 29 20 7b 0a 09 73 74 72 75 63 74  *slot) {..struct
e7b0: 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69   cackey_tlv_enti
e7c0: 74 79 20 2a 63 75 72 72 5f 65 6e 74 69 74 79 2c  ty *curr_entity,
e7d0: 20 2a 72 6f 6f 74 20 3d 20 4e 55 4c 4c 2c 20 2a   *root = NULL, *
e7e0: 6c 61 73 74 20 3d 20 4e 55 4c 4c 3b 0a 09 75 6e  last = NULL;..un
e7f0: 73 69 67 6e 65 64 20 63 68 61 72 20 74 6c 65 6e  signed char tlen
e800: 5f 62 75 66 5b 32 5d 2c 20 74 76 61 6c 5f 62 75  _buf[2], tval_bu
e810: 66 5b 31 30 32 34 5d 2c 20 2a 74 76 61 6c 3b 0a  f[1024], *tval;.
e820: 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 76  .unsigned char v
e830: 6c 65 6e 5f 62 75 66 5b 32 5d 2c 20 76 76 61 6c  len_buf[2], vval
e840: 5f 62 75 66 5b 38 31 39 32 5d 2c 20 2a 76 76 61  _buf[8192], *vva
e850: 6c 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61  l;..unsigned cha
e860: 72 20 2a 74 6d 70 62 75 66 3b 0a 09 75 6e 73 69  r *tmpbuf;..unsi
e870: 67 6e 65 64 20 6c 6f 6e 67 20 74 6d 70 62 75 66  gned long tmpbuf
e880: 6c 65 6e 3b 0a 09 73 73 69 7a 65 5f 74 20 74 6c  len;..ssize_t tl
e890: 65 6e 2c 20 76 6c 65 6e 3b 0a 09 73 73 69 7a 65  en, vlen;..ssize
e8a0: 5f 74 20 72 65 61 64 5f 72 65 74 3b 0a 09 73 69  _t read_ret;..si
e8b0: 7a 65 5f 74 20 6f 66 66 73 65 74 5f 74 20 3d 20  ze_t offset_t = 
e8c0: 30 2c 20 6f 66 66 73 65 74 5f 76 20 3d 20 30 3b  0, offset_v = 0;
e8d0: 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  ..unsigned char 
e8e0: 74 61 67 3b 0a 09 73 69 7a 65 5f 74 20 6c 65 6e  tag;..size_t len
e8f0: 67 74 68 3b 0a 23 69 66 64 65 66 20 48 41 56 45  gth;.#ifdef HAVE
e900: 5f 4c 49 42 5a 0a 09 69 6e 74 20 75 6e 63 6f 6d  _LIBZ..int uncom
e910: 70 72 65 73 73 5f 72 65 74 3b 0a 23 65 6e 64 69  press_ret;.#endi
e920: 66 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  f...CACKEY_DEBUG
e930: 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
e940: 22 29 3b 0a 0a 09 72 65 61 64 5f 72 65 74 20 3d  ");...read_ret =
e950: 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 62 75 66   cackey_read_buf
e960: 66 65 72 28 73 6c 6f 74 2c 20 74 6c 65 6e 5f 62  fer(slot, tlen_b
e970: 75 66 2c 20 73 69 7a 65 6f 66 28 74 6c 65 6e 5f  uf, sizeof(tlen_
e980: 62 75 66 29 2c 20 31 2c 20 6f 66 66 73 65 74 5f  buf), 1, offset_
e990: 74 29 3b 0a 09 69 66 20 28 72 65 61 64 5f 72 65  t);..if (read_re
e9a0: 74 20 21 3d 20 73 69 7a 65 6f 66 28 74 6c 65 6e  t != sizeof(tlen
e9b0: 5f 62 75 66 29 29 20 7b 0a 09 09 43 41 43 4b 45  _buf)) {...CACKE
e9c0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
e9d0: 52 65 61 64 20 66 61 69 6c 65 64 2c 20 72 65 74  Read failed, ret
e9e0: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
e9f0: 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e  e");....return(N
ea00: 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 74 6c 65 6e 20  ULL);..}...tlen 
ea10: 3d 20 28 74 6c 65 6e 5f 62 75 66 5b 31 5d 20 3c  = (tlen_buf[1] <
ea20: 3c 20 38 29 20 7c 20 74 6c 65 6e 5f 62 75 66 5b  < 8) | tlen_buf[
ea30: 30 5d 3b 0a 0a 09 72 65 61 64 5f 72 65 74 20 3d  0];...read_ret =
ea40: 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 62 75 66   cackey_read_buf
ea50: 66 65 72 28 73 6c 6f 74 2c 20 76 6c 65 6e 5f 62  fer(slot, vlen_b
ea60: 75 66 2c 20 73 69 7a 65 6f 66 28 76 6c 65 6e 5f  uf, sizeof(vlen_
ea70: 62 75 66 29 2c 20 32 2c 20 6f 66 66 73 65 74 5f  buf), 2, offset_
ea80: 76 29 3b 0a 09 69 66 20 28 72 65 61 64 5f 72 65  v);..if (read_re
ea90: 74 20 21 3d 20 73 69 7a 65 6f 66 28 76 6c 65 6e  t != sizeof(vlen
eaa0: 5f 62 75 66 29 29 20 7b 0a 09 09 43 41 43 4b 45  _buf)) {...CACKE
eab0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
eac0: 52 65 61 64 20 66 61 69 6c 65 64 2c 20 72 65 74  Read failed, ret
ead0: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
eae0: 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e  e");....return(N
eaf0: 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 76 6c 65 6e 20  ULL);..}...vlen 
eb00: 3d 20 28 76 6c 65 6e 5f 62 75 66 5b 31 5d 20 3c  = (vlen_buf[1] <
eb10: 3c 20 38 29 20 7c 20 76 6c 65 6e 5f 62 75 66 5b  < 8) | vlen_buf[
eb20: 30 5d 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  0];...CACKEY_DEB
eb30: 55 47 5f 50 52 49 4e 54 46 28 22 54 61 67 20 4c  UG_PRINTF("Tag L
eb40: 65 6e 67 74 68 20 3d 20 25 6c 75 2c 20 56 61 6c  ength = %lu, Val
eb50: 75 65 20 4c 65 6e 67 74 68 20 3d 20 25 6c 75 22  ue Length = %lu"
eb60: 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
eb70: 29 20 74 6c 65 6e 2c 20 28 75 6e 73 69 67 6e 65  ) tlen, (unsigne
eb80: 64 20 6c 6f 6e 67 29 20 76 6c 65 6e 29 3b 0a 0a  d long) vlen);..
eb90: 09 6f 66 66 73 65 74 5f 74 20 2b 3d 20 32 3b 0a  .offset_t += 2;.
eba0: 09 6f 66 66 73 65 74 5f 76 20 2b 3d 20 32 3b 0a  .offset_v += 2;.
ebb0: 0a 09 69 66 20 28 74 6c 65 6e 20 3e 20 73 69 7a  ..if (tlen > siz
ebc0: 65 6f 66 28 74 76 61 6c 5f 62 75 66 29 29 20 7b  eof(tval_buf)) {
ebd0: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
ebe0: 50 52 49 4e 54 46 28 22 54 61 67 20 6c 65 6e 67  PRINTF("Tag leng
ebf0: 74 68 20 69 73 20 74 6f 6f 20 6c 61 72 67 65 2c  th is too large,
ec00: 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61   returning in fa
ec10: 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75  ilure");....retu
ec20: 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 69  rn(NULL);..}...i
ec30: 66 20 28 76 6c 65 6e 20 3e 20 73 69 7a 65 6f 66  f (vlen > sizeof
ec40: 28 76 76 61 6c 5f 62 75 66 29 29 20 7b 0a 09 09  (vval_buf)) {...
ec50: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
ec60: 4e 54 46 28 22 56 61 6c 75 65 20 6c 65 6e 67 74  NTF("Value lengt
ec70: 68 20 69 73 20 74 6f 6f 20 6c 61 72 67 65 2c 20  h is too large, 
ec80: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  returning in fai
ec90: 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72  lure");....retur
eca0: 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 72 65  n(NULL);..}...re
ecb0: 61 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f  ad_ret = cackey_
ecc0: 72 65 61 64 5f 62 75 66 66 65 72 28 73 6c 6f 74  read_buffer(slot
ecd0: 2c 20 74 76 61 6c 5f 62 75 66 2c 20 74 6c 65 6e  , tval_buf, tlen
ece0: 2c 20 31 2c 20 6f 66 66 73 65 74 5f 74 29 3b 0a  , 1, offset_t);.
ecf0: 09 69 66 20 28 72 65 61 64 5f 72 65 74 20 21 3d  .if (read_ret !=
ed00: 20 74 6c 65 6e 29 20 7b 0a 09 09 43 41 43 4b 45   tlen) {...CACKE
ed10: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
ed20: 55 6e 61 62 6c 65 20 74 6f 20 72 65 61 64 20 65  Unable to read e
ed30: 6e 74 69 72 65 20 54 2d 62 75 66 66 65 72 2c 20  ntire T-buffer, 
ed40: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  returning in fai
ed50: 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72  lure");....retur
ed60: 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 72 65  n(NULL);..}...re
ed70: 61 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f  ad_ret = cackey_
ed80: 72 65 61 64 5f 62 75 66 66 65 72 28 73 6c 6f 74  read_buffer(slot
ed90: 2c 20 76 76 61 6c 5f 62 75 66 2c 20 76 6c 65 6e  , vval_buf, vlen
eda0: 2c 20 32 2c 20 6f 66 66 73 65 74 5f 76 29 3b 0a  , 2, offset_v);.
edb0: 09 69 66 20 28 72 65 61 64 5f 72 65 74 20 21 3d  .if (read_ret !=
edc0: 20 76 6c 65 6e 29 20 7b 0a 09 09 43 41 43 4b 45   vlen) {...CACKE
edd0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
ede0: 55 6e 61 62 6c 65 20 74 6f 20 72 65 61 64 20 65  Unable to read e
edf0: 6e 74 69 72 65 20 56 2d 62 75 66 66 65 72 2c 20  ntire V-buffer, 
ee00: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  returning in fai
ee10: 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72  lure");....retur
ee20: 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 74 76  n(NULL);..}...tv
ee30: 61 6c 20 3d 20 74 76 61 6c 5f 62 75 66 3b 0a 09  al = tval_buf;..
ee40: 76 76 61 6c 20 3d 20 76 76 61 6c 5f 62 75 66 3b  vval = vval_buf;
ee50: 0a 09 77 68 69 6c 65 20 28 74 6c 65 6e 20 3e 20  ..while (tlen > 
ee60: 30 20 26 26 20 76 6c 65 6e 20 3e 20 30 29 20 7b  0 && vlen > 0) {
ee70: 0a 09 09 74 61 67 20 3d 20 2a 74 76 61 6c 3b 0a  ...tag = *tval;.
ee80: 09 09 74 76 61 6c 2b 2b 3b 0a 09 09 74 6c 65 6e  ..tval++;...tlen
ee90: 2d 2d 3b 0a 0a 09 09 69 66 20 28 2a 74 76 61 6c  --;....if (*tval
eea0: 20 3d 3d 20 30 78 66 66 29 20 7b 0a 09 09 09 6c   == 0xff) {....l
eeb0: 65 6e 67 74 68 20 3d 20 28 74 76 61 6c 5b 32 5d  ength = (tval[2]
eec0: 20 3c 3c 20 38 29 20 7c 20 74 76 61 6c 5b 31 5d   << 8) | tval[1]
eed0: 3b 0a 09 09 09 74 76 61 6c 20 2b 3d 20 33 3b 0a  ;....tval += 3;.
eee0: 09 09 09 74 6c 65 6e 20 2d 3d 20 33 3b 0a 09 09  ...tlen -= 3;...
eef0: 7d 20 65 6c 73 65 20 7b 0a 09 09 09 6c 65 6e 67  } else {....leng
ef00: 74 68 20 3d 20 2a 74 76 61 6c 3b 0a 09 09 09 74  th = *tval;....t
ef10: 76 61 6c 2b 2b 3b 0a 09 09 09 74 6c 65 6e 2d 2d  val++;....tlen--
ef20: 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f  ;...}....CACKEY_
ef30: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54 61  DEBUG_PRINTF("Ta
ef40: 67 3a 20 25 73 20 28 25 30 32 78 29 22 2c 20 43  g: %s (%02x)", C
ef50: 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43  ACKEY_DEBUG_FUNC
ef60: 5f 54 41 47 5f 54 4f 5f 53 54 52 28 74 61 67 29  _TAG_TO_STR(tag)
ef70: 2c 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29  , (unsigned int)
ef80: 20 74 61 67 29 3b 0a 09 09 43 41 43 4b 45 59 5f   tag);...CACKEY_
ef90: 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22  DEBUG_PRINTBUF("
efa0: 56 61 6c 75 65 3a 22 2c 20 76 76 61 6c 2c 20 6c  Value:", vval, l
efb0: 65 6e 67 74 68 29 3b 0a 0a 09 09 63 75 72 72 5f  ength);....curr_
efc0: 65 6e 74 69 74 79 20 3d 20 4e 55 4c 4c 3b 0a 09  entity = NULL;..
efd0: 09 73 77 69 74 63 68 20 28 74 61 67 29 20 7b 0a  .switch (tag) {.
efe0: 09 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
eff0: 47 5f 43 41 52 44 55 52 4c 3a 0a 09 09 09 09 63  G_CARDURL:.....c
f000: 75 72 72 5f 65 6e 74 69 74 79 20 3d 20 6d 61 6c  urr_entity = mal
f010: 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63 75 72 72  loc(sizeof(*curr
f020: 5f 65 6e 74 69 74 79 29 29 3b 0a 09 09 09 09 63  _entity));.....c
f030: 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75  urr_entity->valu
f040: 65 5f 63 61 72 64 75 72 6c 20 3d 20 6d 61 6c 6c  e_cardurl = mall
f050: 6f 63 28 73 69 7a 65 6f 66 28 2a 63 75 72 72 5f  oc(sizeof(*curr_
f060: 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65 5f 63 61  entity->value_ca
f070: 72 64 75 72 6c 29 29 3b 0a 0a 09 09 09 09 6d 65  rdurl));......me
f080: 6d 63 70 79 28 63 75 72 72 5f 65 6e 74 69 74 79  mcpy(curr_entity
f090: 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d  ->value_cardurl-
f0a0: 3e 72 69 64 2c 20 76 76 61 6c 2c 20 35 29 3b 0a  >rid, vval, 5);.
f0b0: 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d  ....curr_entity-
f0c0: 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e  >value_cardurl->
f0d0: 61 70 70 74 79 70 65 20 3d 20 76 76 61 6c 5b 35  apptype = vval[5
f0e0: 5d 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69  ];.....curr_enti
f0f0: 74 79 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72  ty->value_cardur
f100: 6c 2d 3e 6f 62 6a 65 63 74 69 64 20 3d 20 28 76  l->objectid = (v
f110: 76 61 6c 5b 36 5d 20 3c 3c 20 38 29 20 7c 20 76  val[6] << 8) | v
f120: 76 61 6c 5b 37 5d 3b 0a 09 09 09 09 63 75 72 72  val[7];.....curr
f130: 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65 5f 63  _entity->value_c
f140: 61 72 64 75 72 6c 2d 3e 61 70 70 69 64 20 3d 20  ardurl->appid = 
f150: 28 76 76 61 6c 5b 38 5d 20 3c 3c 20 38 29 20 7c  (vval[8] << 8) |
f160: 20 76 76 61 6c 5b 39 5d 3b 0a 0a 09 09 09 09 63   vval[9];......c
f170: 75 72 72 5f 65 6e 74 69 74 79 2d 3e 74 61 67 20  urr_entity->tag 
f180: 3d 20 74 61 67 3b 0a 09 09 09 09 63 75 72 72 5f  = tag;.....curr_
f190: 65 6e 74 69 74 79 2d 3e 5f 6e 65 78 74 20 3d 20  entity->_next = 
f1a0: 4e 55 4c 4c 3b 0a 0a 09 09 09 09 62 72 65 61 6b  NULL;......break
f1b0: 3b 0a 09 09 09 63 61 73 65 20 47 53 43 49 53 5f  ;....case GSCIS_
f1c0: 54 41 47 5f 41 43 52 5f 54 41 42 4c 45 3a 0a 09  TAG_ACR_TABLE:..
f1d0: 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 20 3d  ...curr_entity =
f1e0: 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a   malloc(sizeof(*
f1f0: 63 75 72 72 5f 65 6e 74 69 74 79 29 29 3b 0a 09  curr_entity));..
f200: 09 09 09 74 6d 70 62 75 66 20 3d 20 6d 61 6c 6c  ...tmpbuf = mall
f210: 6f 63 28 6c 65 6e 67 74 68 29 3b 0a 0a 09 09 09  oc(length);.....
f220: 09 6d 65 6d 63 70 79 28 74 6d 70 62 75 66 2c 20  .memcpy(tmpbuf, 
f230: 76 76 61 6c 2c 20 6c 65 6e 67 74 68 29 3b 0a 0a  vval, length);..
f240: 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d  ....curr_entity-
f250: 3e 74 61 67 20 3d 20 74 61 67 3b 0a 09 09 09 09  >tag = tag;.....
f260: 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 6c 65 6e  curr_entity->len
f270: 67 74 68 20 3d 20 6c 65 6e 67 74 68 3b 0a 09 09  gth = length;...
f280: 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76  ..curr_entity->v
f290: 61 6c 75 65 20 3d 20 74 6d 70 62 75 66 3b 0a 09  alue = tmpbuf;..
f2a0: 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e  ...curr_entity->
f2b0: 5f 6e 65 78 74 20 3d 20 4e 55 4c 4c 3b 0a 0a 09  _next = NULL;...
f2c0: 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
f2d0: 65 20 47 53 43 49 53 5f 54 41 47 5f 43 45 52 54  e GSCIS_TAG_CERT
f2e0: 49 46 49 43 41 54 45 3a 0a 09 09 09 09 63 75 72  IFICATE:.....cur
f2f0: 72 5f 65 6e 74 69 74 79 20 3d 20 6d 61 6c 6c 6f  r_entity = mallo
f300: 63 28 73 69 7a 65 6f 66 28 2a 63 75 72 72 5f 65  c(sizeof(*curr_e
f310: 6e 74 69 74 79 29 29 3b 0a 0a 23 69 66 64 65 66  ntity));..#ifdef
f320: 20 48 41 56 45 5f 4c 49 42 5a 0a 09 09 09 09 74   HAVE_LIBZ.....t
f330: 6d 70 62 75 66 6c 65 6e 20 3d 20 6c 65 6e 67 74  mpbuflen = lengt
f340: 68 20 2a 20 32 3b 0a 09 09 09 09 74 6d 70 62 75  h * 2;.....tmpbu
f350: 66 20 3d 20 6d 61 6c 6c 6f 63 28 74 6d 70 62 75  f = malloc(tmpbu
f360: 66 6c 65 6e 29 3b 0a 0a 09 09 09 09 75 6e 63 6f  flen);......unco
f370: 6d 70 72 65 73 73 5f 72 65 74 20 3d 20 75 6e 63  mpress_ret = unc
f380: 6f 6d 70 72 65 73 73 28 74 6d 70 62 75 66 2c 20  ompress(tmpbuf, 
f390: 26 74 6d 70 62 75 66 6c 65 6e 2c 20 76 76 61 6c  &tmpbuflen, vval
f3a0: 2c 20 6c 65 6e 67 74 68 29 3b 0a 09 09 09 09 69  , length);.....i
f3b0: 66 20 28 75 6e 63 6f 6d 70 72 65 73 73 5f 72 65  f (uncompress_re
f3c0: 74 20 21 3d 20 5a 5f 4f 4b 29 20 7b 0a 09 09 09  t != Z_OK) {....
f3d0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
f3e0: 52 49 4e 54 46 28 22 46 61 69 6c 65 64 20 74 6f  RINTF("Failed to
f3f0: 20 64 65 63 6f 6d 70 72 65 73 73 2c 20 75 6e 63   decompress, unc
f400: 6f 6d 70 72 65 73 73 28 29 20 72 65 74 75 72 6e  ompress() return
f410: 65 64 20 25 69 20 2d 2d 20 72 65 73 6f 72 74 69  ed %i -- resorti
f420: 6e 67 20 74 6f 20 64 69 72 65 63 74 20 63 6f 70  ng to direct cop
f430: 79 22 2c 20 75 6e 63 6f 6d 70 72 65 73 73 5f 72  y", uncompress_r
f440: 65 74 29 3b 0a 0a 09 09 09 09 09 74 6d 70 62 75  et);.......tmpbu
f450: 66 6c 65 6e 20 3d 20 6c 65 6e 67 74 68 3b 0a 09  flen = length;..
f460: 09 09 09 09 6d 65 6d 63 70 79 28 74 6d 70 62 75  ....memcpy(tmpbu
f470: 66 2c 20 76 76 61 6c 2c 20 6c 65 6e 67 74 68 29  f, vval, length)
f480: 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43  ;.....}......CAC
f490: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42  KEY_DEBUG_PRINTB
f4a0: 55 46 28 22 44 65 63 6f 6d 70 72 65 73 73 65 64  UF("Decompressed
f4b0: 20 74 6f 3a 22 2c 20 74 6d 70 62 75 66 2c 20 74   to:", tmpbuf, t
f4c0: 6d 70 62 75 66 6c 65 6e 29 3b 0a 23 65 6c 73 65  mpbuflen);.#else
f4d0: 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
f4e0: 47 5f 50 52 49 4e 54 46 28 22 4d 69 73 73 69 6e  G_PRINTF("Missin
f4f0: 67 20 5a 4c 49 42 20 53 75 70 70 6f 72 74 2c 20  g ZLIB Support, 
f500: 74 68 69 73 20 63 65 72 74 69 66 69 63 61 74 65  this certificate
f510: 20 69 73 20 6c 69 6b 65 6c 79 20 75 73 65 6c 65   is likely usele
f520: 73 73 2e 2e 2e 22 29 3b 0a 0a 09 09 09 09 74 6d  ss...");......tm
f530: 70 62 75 66 6c 65 6e 20 3d 20 6c 65 6e 67 74 68  pbuflen = length
f540: 3b 0a 09 09 09 09 6d 65 6d 63 70 79 28 74 6d 70  ;.....memcpy(tmp
f550: 62 75 66 2c 20 76 76 61 6c 2c 20 6c 65 6e 67 74  buf, vval, lengt
f560: 68 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 09 09 09  h);.#endif......
f570: 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 74 61 67  curr_entity->tag
f580: 20 3d 20 74 61 67 3b 0a 09 09 09 09 63 75 72 72   = tag;.....curr
f590: 5f 65 6e 74 69 74 79 2d 3e 6c 65 6e 67 74 68 20  _entity->length 
f5a0: 3d 20 74 6d 70 62 75 66 6c 65 6e 3b 0a 09 09 09  = tmpbuflen;....
f5b0: 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61  .curr_entity->va
f5c0: 6c 75 65 20 3d 20 74 6d 70 62 75 66 3b 0a 09 09  lue = tmpbuf;...
f5d0: 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 5f  ..curr_entity->_
f5e0: 6e 65 78 74 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09  next = NULL;....
f5f0: 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
f600: 20 47 53 43 49 53 5f 54 41 47 5f 50 4b 43 53 31   GSCIS_TAG_PKCS1
f610: 35 3a 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69  5:.....curr_enti
f620: 74 79 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65  ty = malloc(size
f630: 6f 66 28 2a 63 75 72 72 5f 65 6e 74 69 74 79 29  of(*curr_entity)
f640: 29 3b 0a 0a 09 09 09 09 63 75 72 72 5f 65 6e 74  );......curr_ent
f650: 69 74 79 2d 3e 74 61 67 20 3d 20 74 61 67 3b 0a  ity->tag = tag;.
f660: 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d  ....curr_entity-
f670: 3e 76 61 6c 75 65 5f 62 79 74 65 20 3d 20 76 76  >value_byte = vv
f680: 61 6c 5b 30 5d 3b 0a 09 09 09 09 63 75 72 72 5f  al[0];.....curr_
f690: 65 6e 74 69 74 79 2d 3e 5f 6e 65 78 74 20 3d 20  entity->_next = 
f6a0: 4e 55 4c 4c 3b 0a 0a 09 09 09 09 62 72 65 61 6b  NULL;......break
f6b0: 3b 0a 09 09 7d 0a 0a 09 09 76 76 61 6c 20 2b 3d  ;...}....vval +=
f6c0: 20 6c 65 6e 67 74 68 3b 0a 09 09 76 6c 65 6e 20   length;...vlen 
f6d0: 2d 3d 20 6c 65 6e 67 74 68 3b 0a 0a 09 09 69 66  -= length;....if
f6e0: 20 28 63 75 72 72 5f 65 6e 74 69 74 79 20 21 3d   (curr_entity !=
f6f0: 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 69 66 20 28   NULL) {....if (
f700: 72 6f 6f 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  root == NULL) {.
f710: 09 09 09 09 72 6f 6f 74 20 3d 20 63 75 72 72 5f  ....root = curr_
f720: 65 6e 74 69 74 79 3b 0a 09 09 09 7d 0a 0a 09 09  entity;....}....
f730: 09 69 66 20 28 6c 61 73 74 20 21 3d 20 4e 55 4c  .if (last != NUL
f740: 4c 29 20 7b 0a 09 09 09 09 6c 61 73 74 2d 3e 5f  L) {.....last->_
f750: 6e 65 78 74 20 3d 20 63 75 72 72 5f 65 6e 74 69  next = curr_enti
f760: 74 79 3b 0a 09 09 09 7d 0a 0a 09 09 09 6c 61 73  ty;....}.....las
f770: 74 20 3d 20 63 75 72 72 5f 65 6e 74 69 74 79 3b  t = curr_entity;
f780: 0a 09 09 7d 0a 09 7d 0a 0a 09 72 65 74 75 72 6e  ...}..}...return
f790: 28 72 6f 6f 74 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a  (root);.}../*. *
f7a0: 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20   SYNPOSIS. *    
f7b0: 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55 4d   .... *. * ARGUM
f7c0: 45 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a  ENTS. *     ....
f7d0: 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c   *. * RETURN VAL
f7e0: 55 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a  UE. *     .... *
f7f0: 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20  . * NOTES. *    
f800: 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74   .... *. */.stat
f810: 69 63 20 76 6f 69 64 20 63 61 63 6b 65 79 5f 66  ic void cackey_f
f820: 72 65 65 5f 63 65 72 74 73 28 73 74 72 75 63 74  ree_certs(struct
f830: 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65   cackey_pcsc_ide
f840: 6e 74 69 74 79 20 2a 73 74 61 72 74 2c 20 73 69  ntity *start, si
f850: 7a 65 5f 74 20 63 6f 75 6e 74 2c 20 69 6e 74 20  ze_t count, int 
f860: 66 72 65 65 5f 73 74 61 72 74 29 20 7b 0a 09 73  free_start) {..s
f870: 69 7a 65 5f 74 20 69 64 78 3b 0a 0a 09 69 66 20  ize_t idx;...if 
f880: 28 73 74 61 72 74 20 3d 3d 20 4e 55 4c 4c 29 20  (start == NULL) 
f890: 7b 0a 09 09 72 65 74 75 72 6e 3b 0a 09 7d 0a 0a  {...return;..}..
f8a0: 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69  .for (idx = 0; i
f8b0: 64 78 20 3c 20 63 6f 75 6e 74 3b 20 69 64 78 2b  dx < count; idx+
f8c0: 2b 29 20 7b 0a 09 09 69 66 20 28 73 74 61 72 74  +) {...if (start
f8d0: 5b 69 64 78 5d 2e 63 65 72 74 69 66 69 63 61 74  [idx].certificat
f8e0: 65 29 20 7b 0a 09 09 09 66 72 65 65 28 73 74 61  e) {....free(sta
f8f0: 72 74 5b 69 64 78 5d 2e 63 65 72 74 69 66 69 63  rt[idx].certific
f900: 61 74 65 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69  ate);...}..}...i
f910: 66 20 28 66 72 65 65 5f 73 74 61 72 74 29 20 7b  f (free_start) {
f920: 0a 09 09 66 72 65 65 28 73 74 61 72 74 29 3b 0a  ...free(start);.
f930: 09 7d 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a  .}...return;.}..
f940: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 63 61  static struct ca
f950: 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69  ckey_pcsc_identi
f960: 74 79 20 2a 63 61 63 6b 65 79 5f 63 6f 70 79 5f  ty *cackey_copy_
f970: 63 65 72 74 73 28 73 74 72 75 63 74 20 63 61 63  certs(struct cac
f980: 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74  key_pcsc_identit
f990: 79 20 2a 64 65 73 74 2c 20 73 74 72 75 63 74 20  y *dest, struct 
f9a0: 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e  cackey_pcsc_iden
f9b0: 74 69 74 79 20 2a 73 74 61 72 74 2c 20 73 69 7a  tity *start, siz
f9c0: 65 5f 74 20 63 6f 75 6e 74 29 20 7b 0a 09 73 69  e_t count) {..si
f9d0: 7a 65 5f 74 20 69 64 78 3b 0a 0a 09 69 66 20 28  ze_t idx;...if (
f9e0: 73 74 61 72 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b  start == NULL) {
f9f0: 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b  ...return(NULL);
fa00: 0a 09 7d 0a 0a 09 69 66 20 28 64 65 73 74 20 3d  ..}...if (dest =
fa10: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 64 65 73 74  = NULL) {...dest
fa20: 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66   = malloc(sizeof
fa30: 28 2a 64 65 73 74 29 20 2a 20 63 6f 75 6e 74 29  (*dest) * count)
fa40: 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 64 78 20  ;..}...for (idx 
fa50: 3d 20 30 3b 20 69 64 78 20 3c 20 63 6f 75 6e 74  = 0; idx < count
fa60: 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 64 65 73  ; idx++) {...des
fa70: 74 5b 69 64 78 5d 2e 69 64 5f 74 79 70 65 20 3d  t[idx].id_type =
fa80: 20 73 74 61 72 74 5b 69 64 78 5d 2e 69 64 5f 74   start[idx].id_t
fa90: 79 70 65 3b 0a 0a 09 09 73 77 69 74 63 68 20 28  ype;....switch (
faa0: 64 65 73 74 5b 69 64 78 5d 2e 69 64 5f 74 79 70  dest[idx].id_typ
fab0: 65 29 20 7b 0a 09 09 09 63 61 73 65 20 43 41 43  e) {....case CAC
fac0: 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43 41 43 3a  KEY_ID_TYPE_CAC:
fad0: 0a 09 09 09 09 6d 65 6d 63 70 79 28 64 65 73 74  .....memcpy(dest
fae0: 5b 69 64 78 5d 2e 63 61 72 64 2e 63 61 63 2e 61  [idx].card.cac.a
faf0: 70 70 6c 65 74 2c 20 73 74 61 72 74 5b 69 64 78  pplet, start[idx
fb00: 5d 2e 63 61 72 64 2e 63 61 63 2e 61 70 70 6c 65  ].card.cac.apple
fb10: 74 2c 20 73 69 7a 65 6f 66 28 64 65 73 74 5b 69  t, sizeof(dest[i
fb20: 64 78 5d 2e 63 61 72 64 2e 63 61 63 2e 61 70 70  dx].card.cac.app
fb30: 6c 65 74 29 29 3b 0a 09 09 09 09 64 65 73 74 5b  let));.....dest[
fb40: 69 64 78 5d 2e 63 61 72 64 2e 63 61 63 2e 66 69  idx].card.cac.fi
fb50: 6c 65 20 3d 20 73 74 61 72 74 5b 69 64 78 5d 2e  le = start[idx].
fb60: 63 61 72 64 2e 63 61 63 2e 66 69 6c 65 3b 0a 09  card.cac.file;..
fb70: 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
fb80: 65 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45  e CACKEY_ID_TYPE
fb90: 5f 50 49 56 3a 0a 09 09 09 09 64 65 73 74 5b 69  _PIV:.....dest[i
fba0: 64 78 5d 2e 63 61 72 64 2e 70 69 76 2e 6b 65 79  dx].card.piv.key
fbb0: 5f 69 64 20 3d 20 73 74 61 72 74 5b 69 64 78 5d  _id = start[idx]
fbc0: 2e 63 61 72 64 2e 70 69 76 2e 6b 65 79 5f 69 64  .card.piv.key_id
fbd0: 3b 0a 09 09 09 09 6d 65 6d 63 70 79 28 64 65 73  ;.....memcpy(des
fbe0: 74 5b 69 64 78 5d 2e 63 61 72 64 2e 70 69 76 2e  t[idx].card.piv.
fbf0: 6c 61 62 65 6c 2c 20 73 74 61 72 74 5b 69 64 78  label, start[idx
fc00: 5d 2e 63 61 72 64 2e 70 69 76 2e 6c 61 62 65 6c  ].card.piv.label
fc10: 2c 20 73 69 7a 65 6f 66 28 64 65 73 74 5b 69 64  , sizeof(dest[id
fc20: 78 5d 2e 63 61 72 64 2e 70 69 76 2e 6c 61 62 65  x].card.piv.labe
fc30: 6c 29 29 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a  l));.....break;.
fc40: 09 09 09 63 61 73 65 20 43 41 43 4b 45 59 5f 49  ...case CACKEY_I
fc50: 44 5f 54 59 50 45 5f 43 45 52 54 5f 4f 4e 4c 59  D_TYPE_CERT_ONLY
fc60: 3a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d  :.....break;...}
fc70: 0a 09 09 64 65 73 74 5b 69 64 78 5d 2e 63 65 72  ...dest[idx].cer
fc80: 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3d 20 73  tificate_len = s
fc90: 74 61 72 74 5b 69 64 78 5d 2e 63 65 72 74 69 66  tart[idx].certif
fca0: 69 63 61 74 65 5f 6c 65 6e 3b 0a 09 09 64 65 73  icate_len;...des
fcb0: 74 5b 69 64 78 5d 2e 6b 65 79 73 69 7a 65 20 3d  t[idx].keysize =
fcc0: 20 73 74 61 72 74 5b 69 64 78 5d 2e 6b 65 79 73   start[idx].keys
fcd0: 69 7a 65 3b 0a 0a 09 09 64 65 73 74 5b 69 64 78  ize;....dest[idx
fce0: 5d 2e 63 65 72 74 69 66 69 63 61 74 65 20 3d 20  ].certificate = 
fcf0: 6d 61 6c 6c 6f 63 28 64 65 73 74 5b 69 64 78 5d  malloc(dest[idx]
fd00: 2e 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e  .certificate_len
fd10: 29 3b 0a 09 09 6d 65 6d 63 70 79 28 64 65 73 74  );...memcpy(dest
fd20: 5b 69 64 78 5d 2e 63 65 72 74 69 66 69 63 61 74  [idx].certificat
fd30: 65 2c 20 73 74 61 72 74 5b 69 64 78 5d 2e 63 65  e, start[idx].ce
fd40: 72 74 69 66 69 63 61 74 65 2c 20 64 65 73 74 5b  rtificate, dest[
fd50: 69 64 78 5d 2e 63 65 72 74 69 66 69 63 61 74 65  idx].certificate
fd60: 5f 6c 65 6e 29 3b 0a 09 7d 0a 0a 09 72 65 74 75  _len);..}...retu
fd70: 72 6e 28 64 65 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a  rn(dest);.}../*.
fd80: 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20   * SYNPOSIS. *  
fd90: 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47     .... *. * ARG
fda0: 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e  UMENTS. *     ..
fdb0: 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56  .. *. * RETURN V
fdc0: 41 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a  ALUE. *     ....
fdd0: 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20   *. * NOTES. *  
fde0: 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74     .... *. */.st
fdf0: 61 74 69 63 20 73 74 72 75 63 74 20 63 61 63 6b  atic struct cack
fe00: 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79  ey_pcsc_identity
fe10: 20 2a 63 61 63 6b 65 79 5f 72 65 61 64 5f 63 65   *cackey_read_ce
fe20: 72 74 73 28 73 74 72 75 63 74 20 63 61 63 6b 65  rts(struct cacke
fe30: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 73 74  y_slot *slot, st
fe40: 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63  ruct cackey_pcsc
fe50: 5f 69 64 65 6e 74 69 74 79 20 2a 63 65 72 74 73  _identity *certs
fe60: 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  , unsigned long 
fe70: 2a 63 6f 75 6e 74 29 20 7b 0a 09 73 74 72 75 63  *count) {..struc
fe80: 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64  t cackey_pcsc_id
fe90: 65 6e 74 69 74 79 20 2a 63 75 72 72 5f 69 64 3b  entity *curr_id;
fea0: 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  ..struct cackey_
feb0: 74 6c 76 5f 65 6e 74 69 74 79 20 2a 63 63 63 5f  tlv_entity *ccc_
fec0: 74 6c 76 2c 20 2a 63 63 63 5f 63 75 72 72 2c 20  tlv, *ccc_curr, 
fed0: 2a 61 70 70 5f 74 6c 76 2c 20 2a 61 70 70 5f 63  *app_tlv, *app_c
fee0: 75 72 72 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63  urr;..unsigned c
fef0: 68 61 72 20 63 63 63 5f 61 69 64 5b 5d 20 3d 20  har ccc_aid[] = 
ff00: 7b 47 53 43 49 53 5f 41 49 44 5f 43 43 43 7d 2c  {GSCIS_AID_CCC},
ff10: 20 70 69 76 5f 61 69 64 5b 5d 20 3d 20 7b 4e 49   piv_aid[] = {NI
ff20: 53 54 53 50 38 30 30 5f 37 33 5f 33 5f 50 49 56  STSP800_73_3_PIV
ff30: 5f 41 49 44 7d 3b 0a 09 75 6e 73 69 67 6e 65 64  _AID};..unsigned
ff40: 20 63 68 61 72 20 2a 70 69 76 5f 6f 69 64 2c 20   char *piv_oid, 
ff50: 70 69 76 5f 6f 69 64 5f 70 69 76 61 75 74 68 5b  piv_oid_pivauth[
ff60: 5d 20 3d 20 7b 4e 49 53 54 53 50 38 30 30 5f 37  ] = {NISTSP800_7
ff70: 33 5f 33 5f 4f 49 44 5f 50 49 56 41 55 54 48 7d  3_3_OID_PIVAUTH}
ff80: 2c 20 70 69 76 5f 6f 69 64 5f 73 69 67 6e 61 74  , piv_oid_signat
ff90: 75 72 65 5b 5d 20 3d 20 7b 4e 49 53 54 53 50 38  ure[] = {NISTSP8
ffa0: 30 30 5f 37 33 5f 33 5f 4f 49 44 5f 53 49 47 4e  00_73_3_OID_SIGN
ffb0: 41 54 55 52 45 7d 2c 20 70 69 76 5f 6f 69 64 5f  ATURE}, piv_oid_
ffc0: 6b 65 79 6d 67 74 5b 5d 20 3d 20 7b 4e 49 53 54  keymgt[] = {NIST
ffd0: 53 50 38 30 30 5f 37 33 5f 33 5f 4f 49 44 5f 4b  SP800_73_3_OID_K
ffe0: 45 59 4d 47 54 7d 3b 0a 09 75 6e 73 69 67 6e 65  EYMGT};..unsigne
fff0: 64 20 63 68 61 72 20 63 75 72 72 5f 61 69 64 5b  d char curr_aid[
10000 37 5d 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68  7];..unsigned ch
10010 61 72 20 62 75 66 66 65 72 5b 38 31 39 32 5d 2c  ar buffer[8192],
10020 20 2a 62 75 66 66 65 72 5f 70 2c 20 2a 74 6d 70   *buffer_p, *tmp
10030 62 75 66 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c  buf;..unsigned l
10040 6f 6e 67 20 6f 75 74 69 64 78 20 3d 20 30 3b 0a  ong outidx = 0;.
10050 09 63 68 61 72 20 2a 70 69 76 5f 6c 61 62 65 6c  .char *piv_label
10060 3b 0a 09 63 61 63 6b 65 79 5f 72 65 74 20 74 72  ;..cackey_ret tr
10070 61 6e 73 61 63 74 69 6f 6e 5f 72 65 74 3b 0a 09  ansaction_ret;..
10080 73 73 69 7a 65 5f 74 20 72 65 61 64 5f 72 65 74  ssize_t read_ret
10090 3b 0a 09 73 69 7a 65 5f 74 20 62 75 66 66 65 72  ;..size_t buffer
100a0 5f 6c 65 6e 2c 20 74 6d 70 62 75 66 6c 65 6e 3b  _len, tmpbuflen;
100b0 0a 09 69 6e 74 20 63 65 72 74 73 5f 72 65 73 69  ..int certs_resi
100c0 7a 61 62 6c 65 3b 0a 09 69 6e 74 20 73 65 6e 64  zable;..int send
100d0 5f 72 65 74 2c 20 73 65 6c 65 63 74 5f 72 65 74  _ret, select_ret
100e0 3b 0a 09 69 6e 74 20 70 69 76 5f 6b 65 79 2c 20  ;..int piv_key, 
100f0 70 69 76 20 3d 20 30 3b 0a 09 69 6e 74 20 69 64  piv = 0;..int id
10100 78 3b 0a 23 69 66 64 65 66 20 48 41 56 45 5f 4c  x;.#ifdef HAVE_L
10110 49 42 5a 0a 09 69 6e 74 20 75 6e 63 6f 6d 70 72  IBZ..int uncompr
10120 65 73 73 5f 72 65 74 3b 0a 09 7a 5f 73 74 72 65  ess_ret;..z_stre
10130 61 6d 20 67 7a 69 70 5f 73 74 72 65 61 6d 3b 0a  am gzip_stream;.
10140 23 65 6e 64 69 66 0a 0a 09 43 41 43 4b 45 59 5f  #endif...CACKEY_
10150 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
10160 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 63  lled.");...if (c
10170 6f 75 6e 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  ount == NULL) {.
10180 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
10190 52 49 4e 54 46 28 22 63 6f 75 6e 74 20 69 73 20  RINTF("count is 
101a0 4e 55 4c 4c 2c 20 72 65 74 75 72 6e 69 6e 67 20  NULL, returning 
101b0 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09  in failure");...
101c0 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09  .return(NULL);..
101d0 7d 0a 0a 09 69 66 20 28 63 65 72 74 73 20 21 3d  }...if (certs !=
101e0 20 4e 55 4c 4c 29 20 7b 0a 09 09 69 66 20 28 2a   NULL) {...if (*
101f0 63 6f 75 6e 74 20 3d 3d 20 30 29 20 7b 0a 09 09  count == 0) {...
10200 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
10210 49 4e 54 46 28 22 52 65 71 75 65 73 74 65 64 20  INTF("Requested 
10220 77 65 20 72 65 74 75 72 6e 20 30 20 6f 62 6a 65  we return 0 obje
10230 63 74 73 2c 20 73 68 6f 72 74 2d 63 69 72 63 75  cts, short-circu
10240 69 74 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e  it");.....return
10250 28 63 65 72 74 73 29 3b 0a 09 09 7d 0a 09 7d 0a  (certs);...}..}.
10260 0a 09 69 66 20 28 21 73 6c 6f 74 2d 3e 73 6c 6f  ..if (!slot->slo
10270 74 5f 72 65 73 65 74 29 20 7b 0a 09 09 69 66 20  t_reset) {...if 
10280 28 73 6c 6f 74 2d 3e 63 61 63 68 65 64 5f 63 65  (slot->cached_ce
10290 72 74 73 29 20 7b 0a 09 09 09 69 66 20 28 63 65  rts) {....if (ce
102a0 72 74 73 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  rts == NULL) {..
102b0 09 09 09 63 65 72 74 73 20 3d 20 6d 61 6c 6c 6f  ...certs = mallo
102c0 63 28 73 69 7a 65 6f 66 28 2a 63 65 72 74 73 29  c(sizeof(*certs)
102d0 20 2a 20 73 6c 6f 74 2d 3e 63 61 63 68 65 64 5f   * slot->cached_
102e0 63 65 72 74 73 5f 63 6f 75 6e 74 29 3b 0a 09 09  certs_count);...
102f0 09 09 2a 63 6f 75 6e 74 20 3d 20 73 6c 6f 74 2d  ..*count = slot-
10300 3e 63 61 63 68 65 64 5f 63 65 72 74 73 5f 63 6f  >cached_certs_co
10310 75 6e 74 3b 0a 09 09 09 7d 20 65 6c 73 65 20 7b  unt;....} else {
10320 0a 09 09 09 09 69 66 20 28 2a 63 6f 75 6e 74 20  .....if (*count 
10330 3e 20 73 6c 6f 74 2d 3e 63 61 63 68 65 64 5f 63  > slot->cached_c
10340 65 72 74 73 5f 63 6f 75 6e 74 29 20 7b 0a 09 09  erts_count) {...
10350 09 09 09 2a 63 6f 75 6e 74 20 3d 20 73 6c 6f 74  ...*count = slot
10360 2d 3e 63 61 63 68 65 64 5f 63 65 72 74 73 5f 63  ->cached_certs_c
10370 6f 75 6e 74 3b 0a 09 09 09 09 7d 0a 09 09 09 7d  ount;.....}....}
10380 0a 0a 09 09 09 63 61 63 6b 65 79 5f 63 6f 70 79  .....cackey_copy
10390 5f 63 65 72 74 73 28 63 65 72 74 73 2c 20 73 6c  _certs(certs, sl
103a0 6f 74 2d 3e 63 61 63 68 65 64 5f 63 65 72 74 73  ot->cached_certs
103b0 2c 20 2a 63 6f 75 6e 74 29 3b 0a 0a 09 09 09 72  , *count);.....r
103c0 65 74 75 72 6e 28 63 65 72 74 73 29 3b 0a 09 09  eturn(certs);...
103d0 7d 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 2d  }..}...if (slot-
103e0 3e 63 61 63 68 65 64 5f 63 65 72 74 73 29 20 7b  >cached_certs) {
103f0 0a 09 09 63 61 63 6b 65 79 5f 66 72 65 65 5f 63  ...cackey_free_c
10400 65 72 74 73 28 73 6c 6f 74 2d 3e 63 61 63 68 65  erts(slot->cache
10410 64 5f 63 65 72 74 73 2c 20 73 6c 6f 74 2d 3e 63  d_certs, slot->c
10420 61 63 68 65 64 5f 63 65 72 74 73 5f 63 6f 75 6e  ached_certs_coun
10430 74 2c 20 31 29 3b 0a 0a 09 09 73 6c 6f 74 2d 3e  t, 1);....slot->
10440 63 61 63 68 65 64 5f 63 65 72 74 73 20 3d 20 4e  cached_certs = N
10450 55 4c 4c 3b 0a 09 7d 0a 0a 09 2f 2a 20 42 65 67  ULL;..}.../* Beg
10460 69 6e 20 61 20 53 6d 61 72 74 43 61 72 64 20 74  in a SmartCard t
10470 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 74  ransaction */..t
10480 72 61 6e 73 61 63 74 69 6f 6e 5f 72 65 74 20 3d  ransaction_ret =
10490 20 63 61 63 6b 65 79 5f 62 65 67 69 6e 5f 74 72   cackey_begin_tr
104a0 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b  ansaction(slot);
104b0 0a 09 69 66 20 28 74 72 61 6e 73 61 63 74 69 6f  ..if (transactio
104c0 6e 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f  n_ret != CACKEY_
104d0 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43  PCSC_S_OK) {...C
104e0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
104f0 54 46 28 22 55 6e 61 62 6c 65 20 62 65 67 69 6e  TF("Unable begin
10500 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 72 65   transaction, re
10510 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
10520 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  re");....return(
10530 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  NULL);..}...if (
10540 63 65 72 74 73 20 3d 3d 20 4e 55 4c 4c 29 20 7b  certs == NULL) {
10550 0a 09 09 63 65 72 74 73 20 3d 20 6d 61 6c 6c 6f  ...certs = mallo
10560 63 28 73 69 7a 65 6f 66 28 2a 63 65 72 74 73 29  c(sizeof(*certs)
10570 20 2a 20 35 29 3b 0a 09 09 2a 63 6f 75 6e 74 20   * 5);...*count 
10580 3d 20 35 3b 0a 09 09 63 65 72 74 73 5f 72 65 73  = 5;...certs_res
10590 69 7a 61 62 6c 65 20 3d 20 31 3b 0a 09 7d 20 65  izable = 1;..} e
105a0 6c 73 65 20 7b 0a 09 09 63 65 72 74 73 5f 72 65  lse {...certs_re
105b0 73 69 7a 61 62 6c 65 20 3d 20 30 3b 0a 09 7d 0a  sizable = 0;..}.
105c0 0a 09 2f 2a 20 53 65 6c 65 63 74 20 74 68 65 20  ../* Select the 
105d0 43 43 43 20 41 70 70 6c 65 74 20 2a 2f 0a 09 73  CCC Applet */..s
105e0 65 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79  end_ret = cackey
105f0 5f 73 65 6c 65 63 74 5f 61 70 70 6c 65 74 28 73  _select_applet(s
10600 6c 6f 74 2c 20 63 63 63 5f 61 69 64 2c 20 73 69  lot, ccc_aid, si
10610 7a 65 6f 66 28 63 63 63 5f 61 69 64 29 29 3b 0a  zeof(ccc_aid));.
10620 09 69 66 20 28 73 65 6e 64 5f 72 65 74 20 21 3d  .if (send_ret !=
10630 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f   CACKEY_PCSC_S_O
10640 4b 29 20 7b 0a 09 09 2f 2a 20 54 72 79 20 50 49  K) {.../* Try PI
10650 56 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 2a 2f  V application */
10660 0a 09 09 73 65 6e 64 5f 72 65 74 20 3d 20 63 61  ...send_ret = ca
10670 63 6b 65 79 5f 73 65 6c 65 63 74 5f 61 70 70 6c  ckey_select_appl
10680 65 74 28 73 6c 6f 74 2c 20 70 69 76 5f 61 69 64  et(slot, piv_aid
10690 2c 20 73 69 7a 65 6f 66 28 70 69 76 5f 61 69 64  , sizeof(piv_aid
106a0 29 29 3b 0a 09 09 69 66 20 28 73 65 6e 64 5f 72  ));...if (send_r
106b0 65 74 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53  et == CACKEY_PCS
106c0 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 43 41 43  C_S_OK) {....CAC
106d0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
106e0 28 22 57 65 20 68 61 76 65 20 61 20 50 49 56 20  ("We have a PIV 
106f0 63 61 72 64 20 2d 2d 20 6e 6f 74 20 75 73 69 6e  card -- not usin
10700 67 20 74 68 65 20 43 43 43 2c 20 70 75 6c 6c 69  g the CCC, pulli
10710 6e 67 20 70 72 65 2d 73 65 6c 65 63 74 65 64 20  ng pre-selected 
10720 6b 65 79 73 22 29 3b 0a 0a 09 09 09 70 69 76 20  keys");.....piv 
10730 3d 20 31 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a  = 1;...} else {.
10740 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
10750 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74  PRINTF("Unable t
10760 6f 20 73 65 6c 65 63 74 20 43 43 43 20 41 70 70  o select CCC App
10770 6c 65 74 2c 20 72 65 74 75 72 6e 69 6e 67 20 69  let, returning i
10780 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09  n failure");....
10790 09 2f 2a 20 54 65 72 6d 69 6e 61 74 65 20 53 6d  ./* Terminate Sm
107a0 61 72 74 43 61 72 64 20 54 72 61 6e 73 61 63 74  artCard Transact
107b0 69 6f 6e 20 2a 2f 0a 09 09 09 63 61 63 6b 65 79  ion */....cackey
107c0 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
107d0 28 73 6c 6f 74 29 3b 0a 0a 09 09 09 72 65 74 75  (slot);.....retu
107e0 72 6e 28 4e 55 4c 4c 29 3b 0a 09 09 7d 0a 09 7d  rn(NULL);...}..}
107f0 0a 0a 09 69 66 20 28 70 69 76 29 20 7b 0a 09 09  ...if (piv) {...
10800 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64  for (idx = 0; id
10810 78 20 3c 20 33 3b 20 69 64 78 2b 2b 29 20 7b 0a  x < 3; idx++) {.
10820 09 09 09 73 77 69 74 63 68 20 28 69 64 78 29 20  ...switch (idx) 
10830 7b 0a 09 09 09 09 63 61 73 65 20 30 3a 0a 09 09  {.....case 0:...
10840 09 09 09 70 69 76 5f 6f 69 64 20 3d 20 70 69 76  ...piv_oid = piv
10850 5f 6f 69 64 5f 70 69 76 61 75 74 68 3b 0a 09 09  _oid_pivauth;...
10860 09 09 09 70 69 76 5f 6b 65 79 20 3d 20 4e 49 53  ...piv_key = NIS
10870 54 53 50 38 30 30 5f 37 38 5f 33 5f 4b 45 59 5f  TSP800_78_3_KEY_
10880 50 49 56 41 55 54 48 3b 0a 09 09 09 09 09 70 69  PIVAUTH;......pi
10890 76 5f 6c 61 62 65 6c 20 3d 20 22 41 75 74 68 65  v_label = "Authe
108a0 6e 74 69 63 61 74 69 6f 6e 22 3b 0a 09 09 09 09  ntication";.....
108b0 09 62 72 65 61 6b 3b 0a 09 09 09 09 63 61 73 65  .break;.....case
108c0 20 31 3a 0a 09 09 09 09 09 70 69 76 5f 6f 69 64   1:......piv_oid
108d0 20 3d 20 70 69 76 5f 6f 69 64 5f 73 69 67 6e 61   = piv_oid_signa
108e0 74 75 72 65 3b 0a 09 09 09 09 09 70 69 76 5f 6b  ture;......piv_k
108f0 65 79 20 3d 20 4e 49 53 54 53 50 38 30 30 5f 37  ey = NISTSP800_7
10900 38 5f 33 5f 4b 45 59 5f 53 49 47 4e 41 54 55 52  8_3_KEY_SIGNATUR
10910 45 3b 0a 09 09 09 09 09 70 69 76 5f 6c 61 62 65  E;......piv_labe
10920 6c 20 3d 20 22 53 69 67 6e 61 74 75 72 65 22 3b  l = "Signature";
10930 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
10940 09 63 61 73 65 20 32 3a 0a 09 09 09 09 09 70 69  .case 2:......pi
10950 76 5f 6f 69 64 20 3d 20 70 69 76 5f 6f 69 64 5f  v_oid = piv_oid_
10960 6b 65 79 6d 67 74 3b 0a 09 09 09 09 09 70 69 76  keymgt;......piv
10970 5f 6b 65 79 20 3d 20 4e 49 53 54 53 50 38 30 30  _key = NISTSP800
10980 5f 37 38 5f 33 5f 4b 45 59 5f 4b 45 59 4d 47 54  _78_3_KEY_KEYMGT
10990 3b 0a 09 09 09 09 09 70 69 76 5f 6c 61 62 65 6c  ;......piv_label
109a0 20 3d 20 22 4b 65 79 20 4d 61 6e 61 67 65 6d 65   = "Key Manageme
109b0 6e 74 22 3b 0a 09 09 09 09 09 62 72 65 61 6b 3b  nt";......break;
109c0 0a 09 09 09 7d 0a 0a 09 09 09 72 65 61 64 5f 72  ....}.....read_r
109d0 65 74 20 3d 20 63 61 63 6b 65 79 5f 67 65 74 5f  et = cackey_get_
109e0 64 61 74 61 28 73 6c 6f 74 2c 20 62 75 66 66 65  data(slot, buffe
109f0 72 2c 20 73 69 7a 65 6f 66 28 62 75 66 66 65 72  r, sizeof(buffer
10a00 29 2c 20 70 69 76 5f 6f 69 64 29 3b 0a 0a 09 09  ), piv_oid);....
10a10 09 69 66 20 28 72 65 61 64 5f 72 65 74 20 3c 3d  .if (read_ret <=
10a20 20 30 29 20 7b 0a 09 09 09 09 63 6f 6e 74 69 6e   0) {.....contin
10a30 75 65 3b 0a 09 09 09 7d 0a 0a 09 09 09 63 75 72  ue;....}.....cur
10a40 72 5f 69 64 20 3d 20 26 63 65 72 74 73 5b 6f 75  r_id = &certs[ou
10a50 74 69 64 78 5d 3b 0a 09 09 09 6f 75 74 69 64 78  tidx];....outidx
10a60 2b 2b 3b 0a 0a 09 09 09 63 75 72 72 5f 69 64 2d  ++;.....curr_id-
10a70 3e 6b 65 79 73 69 7a 65 20 3d 20 2d 31 3b 0a 09  >keysize = -1;..
10a80 09 09 63 75 72 72 5f 69 64 2d 3e 69 64 5f 74 79  ..curr_id->id_ty
10a90 70 65 20 3d 20 43 41 43 4b 45 59 5f 49 44 5f 54  pe = CACKEY_ID_T
10aa0 59 50 45 5f 50 49 56 3b 0a 09 09 09 63 75 72 72  YPE_PIV;....curr
10ab0 5f 69 64 2d 3e 63 61 72 64 2e 70 69 76 2e 6b 65  _id->card.piv.ke
10ac0 79 5f 69 64 20 3d 20 70 69 76 5f 6b 65 79 3b 0a  y_id = piv_key;.
10ad0 09 09 09 6d 65 6d 63 70 79 28 63 75 72 72 5f 69  ...memcpy(curr_i
10ae0 64 2d 3e 63 61 72 64 2e 70 69 76 2e 6c 61 62 65  d->card.piv.labe
10af0 6c 2c 20 70 69 76 5f 6c 61 62 65 6c 2c 20 73 74  l, piv_label, st
10b00 72 6c 65 6e 28 70 69 76 5f 6c 61 62 65 6c 29 20  rlen(piv_label) 
10b10 2b 20 31 29 3b 0a 0a 09 09 09 63 75 72 72 5f 69  + 1);.....curr_i
10b20 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65 5f 6c  d->certificate_l
10b30 65 6e 20 3d 20 72 65 61 64 5f 72 65 74 3b 0a 09  en = read_ret;..
10b40 09 09 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69  ..curr_id->certi
10b50 66 69 63 61 74 65 20 3d 20 6d 61 6c 6c 6f 63 28  ficate = malloc(
10b60 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69  curr_id->certifi
10b70 63 61 74 65 5f 6c 65 6e 29 3b 0a 0a 09 09 09 62  cate_len);.....b
10b80 75 66 66 65 72 5f 6c 65 6e 20 3d 20 73 69 7a 65  uffer_len = size
10b90 6f 66 28 62 75 66 66 65 72 29 3b 0a 09 09 09 62  of(buffer);....b
10ba0 75 66 66 65 72 5f 70 20 3d 20 63 61 63 6b 65 79  uffer_p = cackey
10bb0 5f 72 65 61 64 5f 62 65 72 74 6c 76 5f 74 61 67  _read_bertlv_tag
10bc0 28 62 75 66 66 65 72 2c 20 26 62 75 66 66 65 72  (buffer, &buffer
10bd0 5f 6c 65 6e 2c 20 30 78 37 30 2c 20 63 75 72 72  _len, 0x70, curr
10be0 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65  _id->certificate
10bf0 2c 20 26 63 75 72 72 5f 69 64 2d 3e 63 65 72 74  , &curr_id->cert
10c00 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a 0a 09  ificate_len);...
10c10 09 09 69 66 20 28 62 75 66 66 65 72 5f 70 20 3d  ..if (buffer_p =
10c20 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 43 41  = NULL) {.....CA
10c30 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
10c40 46 28 22 52 65 61 64 69 6e 67 20 63 65 72 74 69  F("Reading certi
10c50 66 69 63 61 74 65 20 66 72 6f 6d 20 42 45 52 2d  ficate from BER-
10c60 54 4c 56 20 72 65 73 70 6f 6e 73 65 20 66 61 69  TLV response fai
10c70 6c 65 64 2c 20 73 6b 69 70 70 69 6e 67 20 6b 65  led, skipping ke
10c80 79 20 25 69 22 2c 20 69 64 78 29 3b 0a 0a 09 09  y %i", idx);....
10c90 09 09 66 72 65 65 28 63 75 72 72 5f 69 64 2d 3e  ..free(curr_id->
10ca0 63 65 72 74 69 66 69 63 61 74 65 29 3b 0a 0a 09  certificate);...
10cb0 09 09 09 63 75 72 72 5f 69 64 2d 3e 63 65 72 74  ...curr_id->cert
10cc0 69 66 69 63 61 74 65 20 3d 20 4e 55 4c 4c 3b 0a  ificate = NULL;.
10cd0 0a 09 09 09 09 6f 75 74 69 64 78 2d 2d 3b 0a 0a  .....outidx--;..
10ce0 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09  ....continue;...
10cf0 09 7d 0a 0a 23 69 66 64 65 66 20 48 41 56 45 5f  .}..#ifdef HAVE_
10d00 4c 49 42 5a 0a 09 09 09 69 66 20 28 63 75 72 72  LIBZ....if (curr
10d10 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65  _id->certificate
10d20 5f 6c 65 6e 20 3e 20 34 29 20 7b 0a 09 09 09 09  _len > 4) {.....
10d30 69 66 20 28 6d 65 6d 63 6d 70 28 63 75 72 72 5f  if (memcmp(curr_
10d40 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65 2c  id->certificate,
10d50 20 22 5c 78 31 66 5c 78 38 62 5c 78 30 38 5c 78   "\x1f\x8b\x08\x
10d60 30 30 22 2c 20 34 29 20 3d 3d 20 30 29 20 7b 0a  00", 4) == 0) {.
10d70 09 09 09 09 09 74 6d 70 62 75 66 6c 65 6e 20 3d  .....tmpbuflen =
10d80 20 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66   curr_id->certif
10d90 69 63 61 74 65 5f 6c 65 6e 20 2a 20 32 3b 0a 09  icate_len * 2;..
10da0 09 09 09 09 74 6d 70 62 75 66 20 3d 20 6d 61 6c  ....tmpbuf = mal
10db0 6c 6f 63 28 74 6d 70 62 75 66 6c 65 6e 29 3b 0a  loc(tmpbuflen);.
10dc0 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
10dd0 55 47 5f 50 52 49 4e 54 42 55 46 28 22 41 74 74  UG_PRINTBUF("Att
10de0 65 6d 70 74 69 6e 67 20 74 6f 20 64 65 63 6f 6d  empting to decom
10df0 70 72 65 73 73 3a 22 2c 20 63 75 72 72 5f 69 64  press:", curr_id
10e00 2d 3e 63 65 72 74 69 66 69 63 61 74 65 2c 20 63  ->certificate, c
10e10 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63  urr_id->certific
10e20 61 74 65 5f 6c 65 6e 29 3b 0a 0a 09 09 09 09 09  ate_len);.......
10e30 67 7a 69 70 5f 73 74 72 65 61 6d 2e 7a 61 6c 6c  gzip_stream.zall
10e40 6f 63 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 09  oc = NULL;......
10e50 67 7a 69 70 5f 73 74 72 65 61 6d 2e 7a 66 72 65  gzip_stream.zfre
10e60 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 67  e = NULL;......g
10e70 7a 69 70 5f 73 74 72 65 61 6d 2e 6f 70 61 71 75  zip_stream.opaqu
10e80 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09 09  e = NULL;.......
10e90 67 7a 69 70 5f 73 74 72 65 61 6d 2e 6e 65 78 74  gzip_stream.next
10ea0 5f 69 6e 20 20 3d 20 63 75 72 72 5f 69 64 2d 3e  _in  = curr_id->
10eb0 63 65 72 74 69 66 69 63 61 74 65 3b 0a 09 09 09  certificate;....
10ec0 09 09 67 7a 69 70 5f 73 74 72 65 61 6d 2e 61 76  ..gzip_stream.av
10ed0 61 69 6c 5f 69 6e 20 3d 20 63 75 72 72 5f 69 64  ail_in = curr_id
10ee0 2d 3e 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65  ->certificate_le
10ef0 6e 3b 0a 09 09 09 09 09 67 7a 69 70 5f 73 74 72  n;......gzip_str
10f00 65 61 6d 2e 6e 65 78 74 5f 6f 75 74 20 3d 20 74  eam.next_out = t
10f10 6d 70 62 75 66 3b 0a 09 09 09 09 09 67 7a 69 70  mpbuf;......gzip
10f20 5f 73 74 72 65 61 6d 2e 61 76 61 69 6c 5f 6f 75  _stream.avail_ou
10f30 74 20 3d 20 74 6d 70 62 75 66 6c 65 6e 3b 0a 0a  t = tmpbuflen;..
10f40 09 09 09 09 09 75 6e 63 6f 6d 70 72 65 73 73 5f  .....uncompress_
10f50 72 65 74 20 3d 20 69 6e 66 6c 61 74 65 49 6e 69  ret = inflateIni
10f60 74 28 26 67 7a 69 70 5f 73 74 72 65 61 6d 29 3b  t(&gzip_stream);
10f70 0a 09 09 09 09 09 69 66 20 28 75 6e 63 6f 6d 70  ......if (uncomp
10f80 72 65 73 73 5f 72 65 74 20 3d 3d 20 5a 5f 4f 4b  ress_ret == Z_OK
10f90 29 20 7b 0a 09 09 09 09 09 09 75 6e 63 6f 6d 70  ) {.......uncomp
10fa0 72 65 73 73 5f 72 65 74 20 3d 20 69 6e 66 6c 61  ress_ret = infla
10fb0 74 65 52 65 73 65 74 32 28 26 67 7a 69 70 5f 73  teReset2(&gzip_s
10fc0 74 72 65 61 6d 2c 20 33 31 29 3b 0a 09 09 09 09  tream, 31);.....
10fd0 09 7d 0a 09 09 09 09 09 69 66 20 28 75 6e 63 6f  .}......if (unco
10fe0 6d 70 72 65 73 73 5f 72 65 74 20 3d 3d 20 5a 5f  mpress_ret == Z_
10ff0 4f 4b 29 20 7b 0a 09 09 09 09 09 09 75 6e 63 6f  OK) {.......unco
11000 6d 70 72 65 73 73 5f 72 65 74 20 3d 20 69 6e 66  mpress_ret = inf
11010 6c 61 74 65 28 26 67 7a 69 70 5f 73 74 72 65 61  late(&gzip_strea
11020 6d 2c 20 30 29 3b 0a 09 09 09 09 09 7d 0a 09 09  m, 0);......}...
11030 09 09 09 69 66 20 28 75 6e 63 6f 6d 70 72 65 73  ...if (uncompres
11040 73 5f 72 65 74 20 3d 3d 20 5a 5f 53 54 52 45 41  s_ret == Z_STREA
11050 4d 5f 45 4e 44 29 20 7b 0a 09 09 09 09 09 09 75  M_END) {.......u
11060 6e 63 6f 6d 70 72 65 73 73 5f 72 65 74 20 3d 20  ncompress_ret = 
11070 69 6e 66 6c 61 74 65 45 6e 64 28 26 67 7a 69 70  inflateEnd(&gzip
11080 5f 73 74 72 65 61 6d 29 3b 0a 09 09 09 09 09 7d  _stream);......}
11090 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09 75 6e   else {.......un
110a0 63 6f 6d 70 72 65 73 73 5f 72 65 74 20 3d 20 5a  compress_ret = Z
110b0 5f 44 41 54 41 5f 45 52 52 4f 52 3b 0a 09 09 09  _DATA_ERROR;....
110c0 09 09 7d 0a 09 09 09 09 09 69 66 20 28 75 6e 63  ..}......if (unc
110d0 6f 6d 70 72 65 73 73 5f 72 65 74 20 3d 3d 20 5a  ompress_ret == Z
110e0 5f 4f 4b 29 20 7b 0a 09 09 09 09 09 09 74 6d 70  _OK) {.......tmp
110f0 62 75 66 6c 65 6e 20 3d 20 67 7a 69 70 5f 73 74  buflen = gzip_st
11100 72 65 61 6d 2e 74 6f 74 61 6c 5f 6f 75 74 3b 0a  ream.total_out;.
11110 0a 09 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45  .......CACKEY_DE
11120 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22 44 65  BUG_PRINTBUF("De
11130 63 6f 6d 70 72 65 73 73 65 64 20 74 6f 3a 22 2c  compressed to:",
11140 20 74 6d 70 62 75 66 2c 20 74 6d 70 62 75 66 6c   tmpbuf, tmpbufl
11150 65 6e 29 3b 0a 0a 09 09 09 09 09 09 66 72 65 65  en);........free
11160 28 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66  (curr_id->certif
11170 69 63 61 74 65 29 3b 0a 0a 09 09 09 09 09 09 63  icate);........c
11180 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63  urr_id->certific
11190 61 74 65 20 3d 20 74 6d 70 62 75 66 3b 0a 09 09  ate = tmpbuf;...
111a0 09 09 09 09 63 75 72 72 5f 69 64 2d 3e 63 65 72  ....curr_id->cer
111b0 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3d 20 74  tificate_len = t
111c0 6d 70 62 75 66 6c 65 6e 3b 0a 09 09 09 09 09 7d  mpbuflen;......}
111d0 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09 43 41   else {.......CA
111e0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
111f0 46 28 22 44 65 63 6f 6d 70 72 65 73 73 69 6e 67  F("Decompressing
11200 20 66 61 69 6c 65 64 21 20 75 6e 63 6f 6d 70 72   failed! uncompr
11210 65 73 73 28 29 20 72 65 74 75 72 6e 65 64 20 25  ess() returned %
11220 69 22 2c 20 75 6e 63 6f 6d 70 72 65 73 73 5f 72  i", uncompress_r
11230 65 74 29 3b 0a 0a 09 09 09 09 09 09 66 72 65 65  et);........free
11240 28 74 6d 70 62 75 66 29 3b 0a 09 09 09 09 09 7d  (tmpbuf);......}
11250 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 23 65 6e 64  .....}....}.#end
11260 69 66 0a 09 09 7d 0a 09 7d 20 65 6c 73 65 20 7b  if...}..} else {
11270 0a 09 09 2f 2a 20 52 65 61 64 20 61 6c 6c 20 74  .../* Read all t
11280 68 65 20 61 70 70 6c 65 74 73 20 66 72 6f 6d 20  he applets from 
11290 74 68 65 20 43 43 43 27 73 20 54 4c 56 20 2a 2f  the CCC's TLV */
112a0 0a 09 09 63 63 63 5f 74 6c 76 20 3d 20 63 61 63  ...ccc_tlv = cac
112b0 6b 65 79 5f 72 65 61 64 5f 74 6c 76 28 73 6c 6f  key_read_tlv(slo
112c0 74 29 3b 0a 0a 09 09 2f 2a 20 4c 6f 6f 6b 20 66  t);..../* Look f
112d0 6f 72 20 43 41 52 44 55 52 4c 73 20 74 68 61 74  or CARDURLs that
112e0 20 63 6f 6f 72 65 73 70 6f 6e 64 20 74 6f 20 50   coorespond to P
112f0 4b 49 20 61 70 70 6c 65 74 73 20 2a 2f 0a 09 09  KI applets */...
11300 66 6f 72 20 28 63 63 63 5f 63 75 72 72 20 3d 20  for (ccc_curr = 
11310 63 63 63 5f 74 6c 76 3b 20 63 63 63 5f 63 75 72  ccc_tlv; ccc_cur
11320 72 3b 20 63 63 63 5f 63 75 72 72 20 3d 20 63 63  r; ccc_curr = cc
11330 63 5f 63 75 72 72 2d 3e 5f 6e 65 78 74 29 20 7b  c_curr->_next) {
11340 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
11350 5f 50 52 49 4e 54 46 28 22 46 6f 75 6e 64 20 74  _PRINTF("Found t
11360 61 67 3a 20 25 73 20 2e 2e 2e 20 22 2c 20 43 41  ag: %s ... ", CA
11370 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
11380 54 41 47 5f 54 4f 5f 53 54 52 28 63 63 63 5f 63  TAG_TO_STR(ccc_c
11390 75 72 72 2d 3e 74 61 67 29 29 3b 0a 0a 09 09 09  urr->tag));.....
113a0 69 66 20 28 63 63 63 5f 63 75 72 72 2d 3e 74 61  if (ccc_curr->ta
113b0 67 20 21 3d 20 47 53 43 49 53 5f 54 41 47 5f 43  g != GSCIS_TAG_C
113c0 41 52 44 55 52 4c 29 20 7b 0a 09 09 09 09 43 41  ARDURL) {.....CA
113d0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
113e0 46 28 22 20 20 2e 2e 2e 20 73 6b 69 70 70 69 6e  F("  ... skippin
113f0 67 20 69 74 20 28 77 65 20 6f 6e 6c 79 20 63 61  g it (we only ca
11400 72 65 20 61 62 6f 75 74 20 43 41 52 44 55 52 4c  re about CARDURL
11410 73 29 22 29 3b 0a 0a 09 09 09 09 63 6f 6e 74 69  s)");......conti
11420 6e 75 65 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66  nue;....}.....if
11430 20 28 28 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c   ((ccc_curr->val
11440 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70 74  ue_cardurl->appt
11450 79 70 65 20 26 20 43 41 43 4b 45 59 5f 54 4c 56  ype & CACKEY_TLV
11460 5f 41 50 50 5f 50 4b 49 29 20 21 3d 20 43 41 43  _APP_PKI) != CAC
11470 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 50 4b 49 29  KEY_TLV_APP_PKI)
11480 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45   {.....CACKEY_DE
11490 42 55 47 5f 50 52 49 4e 54 46 28 22 20 20 2e 2e  BUG_PRINTF("  ..
114a0 2e 20 73 6b 69 70 70 69 6e 67 20 69 74 20 28 77  . skipping it (w
114b0 65 20 6f 6e 6c 79 20 63 61 72 65 20 61 62 6f 75  e only care abou
114c0 74 20 50 4b 49 20 61 70 70 6c 65 74 73 2c 20 74  t PKI applets, t
114d0 68 69 73 20 61 70 70 6c 65 74 20 73 75 70 70 6f  his applet suppo
114e0 72 74 73 3a 20 25 73 2f 25 30 32 78 29 22 2c 20  rts: %s/%02x)", 
114f0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e  CACKEY_DEBUG_FUN
11500 43 5f 41 50 50 54 59 50 45 5f 54 4f 5f 53 54 52  C_APPTYPE_TO_STR
11510 28 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65  (ccc_curr->value
11520 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70 74 79 70  _cardurl->apptyp
11530 65 29 2c 20 28 75 6e 73 69 67 6e 65 64 20 69 6e  e), (unsigned in
11540 74 29 20 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c  t) ccc_curr->val
11550 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70 74  ue_cardurl->appt
11560 79 70 65 29 3b 0a 0a 09 09 09 09 63 6f 6e 74 69  ype);......conti
11570 6e 75 65 3b 0a 09 09 09 7d 0a 0a 09 09 09 43 41  nue;....}.....CA
11580 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
11590 42 55 46 28 22 52 49 44 3a 22 2c 20 63 63 63 5f  BUF("RID:", ccc_
115a0 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64  curr->value_card
115b0 75 72 6c 2d 3e 72 69 64 2c 20 73 69 7a 65 6f 66  url->rid, sizeof
115c0 28 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65  (ccc_curr->value
115d0 5f 63 61 72 64 75 72 6c 2d 3e 72 69 64 29 29 3b  _cardurl->rid));
115e0 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
115f0 5f 50 52 49 4e 54 46 28 22 41 70 70 49 44 20 3d  _PRINTF("AppID =
11600 20 25 73 2f 25 30 34 6c 78 22 2c 20 43 41 43 4b   %s/%04lx", CACK
11610 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 4f 42  EY_DEBUG_FUNC_OB
11620 4a 49 44 5f 54 4f 5f 53 54 52 28 63 63 63 5f 63  JID_TO_STR(ccc_c
11630 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75  urr->value_cardu
11640 72 6c 2d 3e 61 70 70 69 64 29 2c 20 28 75 6e 73  rl->appid), (uns
11650 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 63 63 5f  igned long) ccc_
11660 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64  curr->value_card
11670 75 72 6c 2d 3e 61 70 70 69 64 29 3b 0a 09 09 09  url->appid);....
11680 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
11690 4e 54 46 28 22 4f 62 6a 65 63 74 49 44 20 3d 20  NTF("ObjectID = 
116a0 25 73 2f 25 30 34 6c 78 22 2c 20 43 41 43 4b 45  %s/%04lx", CACKE
116b0 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 4f 42 4a  Y_DEBUG_FUNC_OBJ
116c0 49 44 5f 54 4f 5f 53 54 52 28 63 63 63 5f 63 75  ID_TO_STR(ccc_cu
116d0 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72  rr->value_cardur
116e0 6c 2d 3e 6f 62 6a 65 63 74 69 64 29 2c 20 28 75  l->objectid), (u
116f0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 63  nsigned long) cc
11700 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61  c_curr->value_ca
11710 72 64 75 72 6c 2d 3e 6f 62 6a 65 63 74 69 64 29  rdurl->objectid)
11720 3b 0a 0a 09 09 09 6d 65 6d 63 70 79 28 63 75 72  ;.....memcpy(cur
11730 72 5f 61 69 64 2c 20 63 63 63 5f 63 75 72 72 2d  r_aid, ccc_curr-
11740 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e  >value_cardurl->
11750 72 69 64 2c 20 73 69 7a 65 6f 66 28 63 63 63 5f  rid, sizeof(ccc_
11760 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64  curr->value_card
11770 75 72 6c 2d 3e 72 69 64 29 29 3b 0a 09 09 09 63  url->rid));....c
11780 75 72 72 5f 61 69 64 5b 73 69 7a 65 6f 66 28 63  urr_aid[sizeof(c
11790 75 72 72 5f 61 69 64 29 20 2d 20 32 5d 20 3d 20  urr_aid) - 2] = 
117a0 28 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65  (ccc_curr->value
117b0 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70 69 64 20  _cardurl->appid 
117c0 3e 3e 20 38 29 20 26 20 30 78 66 66 3b 0a 09 09  >> 8) & 0xff;...
117d0 09 63 75 72 72 5f 61 69 64 5b 73 69 7a 65 6f 66  .curr_aid[sizeof
117e0 28 63 75 72 72 5f 61 69 64 29 20 2d 20 31 5d 20  (curr_aid) - 1] 
117f0 3d 20 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75  = ccc_curr->valu
11800 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70 69 64  e_cardurl->appid
11810 20 26 20 30 78 66 66 3b 0a 0a 09 09 09 2f 2a 20   & 0xff;...../* 
11820 53 65 6c 65 63 74 20 66 6f 75 6e 64 20 61 70 70  Select found app
11830 6c 65 74 20 2e 2e 2e 20 2a 2f 0a 09 09 09 73 65  let ... */....se
11840 6c 65 63 74 5f 72 65 74 20 3d 20 63 61 63 6b 65  lect_ret = cacke
11850 79 5f 73 65 6c 65 63 74 5f 61 70 70 6c 65 74 28  y_select_applet(
11860 73 6c 6f 74 2c 20 63 75 72 72 5f 61 69 64 2c 20  slot, curr_aid, 
11870 73 69 7a 65 6f 66 28 63 75 72 72 5f 61 69 64 29  sizeof(curr_aid)
11880 29 3b 0a 09 09 09 69 66 20 28 73 65 6c 65 63 74  );....if (select
11890 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50  _ret != CACKEY_P
118a0 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 09  CSC_S_OK) {.....
118b0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
118c0 4e 54 46 28 22 46 61 69 6c 65 64 20 74 6f 20 73  NTF("Failed to s
118d0 65 6c 65 63 74 20 61 70 70 6c 65 74 2c 20 73 6b  elect applet, sk
118e0 69 70 70 69 6e 67 20 70 72 6f 63 65 73 73 69 6e  ipping processin
118f0 67 20 6f 66 20 74 68 69 73 20 6f 62 6a 65 63 74  g of this object
11900 22 29 3b 0a 0a 09 09 09 09 63 6f 6e 74 69 6e 75  ");......continu
11910 65 3b 0a 09 09 09 7d 0a 0a 09 09 09 2f 2a 20 2e  e;....}...../* .
11920 2e 2e 20 61 6e 64 20 6f 62 6a 65 63 74 20 28 66  .. and object (f
11930 69 6c 65 29 20 2a 2f 0a 09 09 09 73 65 6c 65 63  ile) */....selec
11940 74 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73  t_ret = cackey_s
11950 65 6c 65 63 74 5f 66 69 6c 65 28 73 6c 6f 74 2c  elect_file(slot,
11960 20 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65   ccc_curr->value
11970 5f 63 61 72 64 75 72 6c 2d 3e 6f 62 6a 65 63 74  _cardurl->object
11980 69 64 29 3b 0a 09 09 09 69 66 20 28 73 65 6c 65  id);....if (sele
11990 63 74 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59  ct_ret != CACKEY
119a0 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09  _PCSC_S_OK) {...
119b0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
119c0 52 49 4e 54 46 28 22 46 61 69 6c 65 64 20 74 6f  RINTF("Failed to
119d0 20 73 65 6c 65 63 74 20 66 69 6c 65 2c 20 73 6b   select file, sk
119e0 69 70 70 69 6e 67 20 70 72 6f 63 65 73 73 69 6e  ipping processin
119f0 67 20 6f 66 20 74 68 69 73 20 6f 62 6a 65 63 74  g of this object
11a00 22 29 3b 0a 0a 09 09 09 09 63 6f 6e 74 69 6e 75  ");......continu
11a10 65 3b 0a 09 09 09 7d 0a 0a 09 09 09 2f 2a 20 50  e;....}...../* P
11a20 72 6f 63 65 73 73 20 74 68 69 73 20 66 69 6c 65  rocess this file
11a30 27 73 20 54 4c 56 20 6c 6f 6f 6b 69 6e 67 20 66  's TLV looking f
11a40 6f 72 20 63 65 72 74 69 66 69 63 61 74 65 73 20  or certificates 
11a50 2a 2f 0a 09 09 09 61 70 70 5f 74 6c 76 20 3d 20  */....app_tlv = 
11a60 63 61 63 6b 65 79 5f 72 65 61 64 5f 74 6c 76 28  cackey_read_tlv(
11a70 73 6c 6f 74 29 3b 0a 09 0a 09 09 09 66 6f 72 20  slot);......for 
11a80 28 61 70 70 5f 63 75 72 72 20 3d 20 61 70 70 5f  (app_curr = app_
11a90 74 6c 76 3b 20 61 70 70 5f 63 75 72 72 3b 20 61  tlv; app_curr; a
11aa0 70 70 5f 63 75 72 72 20 3d 20 61 70 70 5f 63 75  pp_curr = app_cu
11ab0 72 72 2d 3e 5f 6e 65 78 74 29 20 7b 0a 09 09 09  rr->_next) {....
11ac0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
11ad0 49 4e 54 46 28 22 46 6f 75 6e 64 20 74 61 67 3a  INTF("Found tag:
11ae0 20 25 73 22 2c 20 43 41 43 4b 45 59 5f 44 45 42   %s", CACKEY_DEB
11af0 55 47 5f 46 55 4e 43 5f 54 41 47 5f 54 4f 5f 53  UG_FUNC_TAG_TO_S
11b00 54 52 28 61 70 70 5f 63 75 72 72 2d 3e 74 61 67  TR(app_curr->tag
11b10 29 29 3b 0a 09 09 09 09 69 66 20 28 61 70 70 5f  ));.....if (app_
11b20 63 75 72 72 2d 3e 74 61 67 20 21 3d 20 47 53 43  curr->tag != GSC
11b30 49 53 5f 54 41 47 5f 43 45 52 54 49 46 49 43 41  IS_TAG_CERTIFICA
11b40 54 45 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45  TE) {......CACKE
11b50 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
11b60 20 20 2e 2e 2e 20 73 6b 69 70 70 69 6e 67 20 69    ... skipping i
11b70 74 20 28 77 65 20 6f 6e 6c 79 20 63 61 72 65 20  t (we only care 
11b80 61 62 6f 75 74 20 43 45 52 54 49 46 49 43 41 54  about CERTIFICAT
11b90 45 73 29 22 29 3b 0a 0a 09 09 09 09 09 63 6f 6e  Es)");.......con
11ba0 74 69 6e 75 65 3b 0a 09 09 09 09 7d 0a 0a 09 09  tinue;.....}....
11bb0 09 09 63 75 72 72 5f 69 64 20 3d 20 26 63 65 72  ..curr_id = &cer
11bc0 74 73 5b 6f 75 74 69 64 78 5d 3b 0a 09 09 09 09  ts[outidx];.....
11bd0 6f 75 74 69 64 78 2b 2b 3b 0a 0a 09 09 09 09 63  outidx++;......c
11be0 75 72 72 5f 69 64 2d 3e 69 64 5f 74 79 70 65 20  urr_id->id_type 
11bf0 3d 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45  = CACKEY_ID_TYPE
11c00 5f 43 41 43 3b 0a 09 09 09 09 6d 65 6d 63 70 79  _CAC;.....memcpy
11c10 28 63 75 72 72 5f 69 64 2d 3e 63 61 72 64 2e 63  (curr_id->card.c
11c20 61 63 2e 61 70 70 6c 65 74 2c 20 63 75 72 72 5f  ac.applet, curr_
11c30 61 69 64 2c 20 73 69 7a 65 6f 66 28 63 75 72 72  aid, sizeof(curr
11c40 5f 69 64 2d 3e 63 61 72 64 2e 63 61 63 2e 61 70  _id->card.cac.ap
11c50 70 6c 65 74 29 29 3b 0a 09 09 09 09 63 75 72 72  plet));.....curr
11c60 5f 69 64 2d 3e 63 61 72 64 2e 63 61 63 2e 66 69  _id->card.cac.fi
11c70 6c 65 20 3d 20 63 63 63 5f 63 75 72 72 2d 3e 76  le = ccc_curr->v
11c80 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 6f 62  alue_cardurl->ob
11c90 6a 65 63 74 69 64 3b 0a 09 09 09 09 63 75 72 72  jectid;.....curr
11ca0 5f 69 64 2d 3e 6b 65 79 73 69 7a 65 20 3d 20 2d  _id->keysize = -
11cb0 31 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  1;......CACKEY_D
11cc0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 69 6c  EBUG_PRINTF("Fil
11cd0 6c 69 6e 67 20 63 75 72 72 5f 69 64 2d 3e 63 61  ling curr_id->ca
11ce0 72 64 2e 63 61 63 2e 61 70 70 6c 65 74 20 28 25  rd.cac.applet (%
11cf0 70 29 20 77 69 74 68 20 25 6c 75 20 62 79 74 65  p) with %lu byte
11d00 73 3a 22 2c 20 63 75 72 72 5f 69 64 2d 3e 63 61  s:", curr_id->ca
11d10 72 64 2e 63 61 63 2e 61 70 70 6c 65 74 2c 20 28  rd.cac.applet, (
11d20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73  unsigned long) s
11d30 69 7a 65 6f 66 28 63 75 72 72 5f 69 64 2d 3e 63  izeof(curr_id->c
11d40 61 72 64 2e 63 61 63 2e 61 70 70 6c 65 74 29 29  ard.cac.applet))
11d50 3b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ;.....CACKEY_DEB
11d60 55 47 5f 50 52 49 4e 54 42 55 46 28 22 56 41 4c  UG_PRINTBUF("VAL
11d70 3a 22 2c 20 63 75 72 72 5f 69 64 2d 3e 63 61 72  :", curr_id->car
11d80 64 2e 63 61 63 2e 61 70 70 6c 65 74 2c 20 73 69  d.cac.applet, si
11d90 7a 65 6f 66 28 63 75 72 72 5f 69 64 2d 3e 63 61  zeof(curr_id->ca
11da0 72 64 2e 63 61 63 2e 61 70 70 6c 65 74 29 29 3b  rd.cac.applet));
11db0 0a 0a 09 09 09 09 63 75 72 72 5f 69 64 2d 3e 63  ......curr_id->c
11dc0 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3d  ertificate_len =
11dd0 20 61 70 70 5f 63 75 72 72 2d 3e 6c 65 6e 67 74   app_curr->lengt
11de0 68 3b 0a 0a 09 09 09 09 63 75 72 72 5f 69 64 2d  h;......curr_id-
11df0 3e 63 65 72 74 69 66 69 63 61 74 65 20 3d 20 6d  >certificate = m
11e00 61 6c 6c 6f 63 28 63 75 72 72 5f 69 64 2d 3e 63  alloc(curr_id->c
11e10 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b  ertificate_len);
11e20 0a 09 09 09 09 6d 65 6d 63 70 79 28 63 75 72 72  .....memcpy(curr
11e30 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65  _id->certificate
11e40 2c 20 61 70 70 5f 63 75 72 72 2d 3e 76 61 6c 75  , app_curr->valu
11e50 65 2c 20 63 75 72 72 5f 69 64 2d 3e 63 65 72 74  e, curr_id->cert
11e60 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a 0a 09  ificate_len);...
11e70 09 09 09 69 66 20 28 6f 75 74 69 64 78 20 3e 3d  ...if (outidx >=
11e80 20 2a 63 6f 75 6e 74 29 20 7b 0a 09 09 09 09 09   *count) {......
11e90 69 66 20 28 63 65 72 74 73 5f 72 65 73 69 7a 61  if (certs_resiza
11ea0 62 6c 65 29 20 7b 0a 09 09 09 09 09 09 2a 63 6f  ble) {.......*co
11eb0 75 6e 74 20 2a 3d 20 32 3b 0a 09 09 09 09 09 09  unt *= 2;.......
11ec0 69 66 20 28 2a 63 6f 75 6e 74 20 21 3d 20 30 29  if (*count != 0)
11ed0 20 7b 0a 09 09 09 09 09 09 09 63 65 72 74 73 20   {........certs 
11ee0 3d 20 72 65 61 6c 6c 6f 63 28 63 65 72 74 73 2c  = realloc(certs,
11ef0 20 73 69 7a 65 6f 66 28 2a 63 65 72 74 73 29 20   sizeof(*certs) 
11f00 2a 20 28 2a 63 6f 75 6e 74 29 29 3b 0a 09 09 09  * (*count));....
11f10 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09  ...} else {.....
11f20 09 09 09 63 65 72 74 73 20 3d 20 4e 55 4c 4c 3b  ...certs = NULL;
11f30 0a 09 09 09 09 09 09 7d 0a 09 09 09 09 09 7d 20  .......}......} 
11f40 65 6c 73 65 20 7b 0a 09 09 09 09 09 09 62 72 65  else {.......bre
11f50 61 6b 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d  ak;......}.....}
11f60 0a 09 09 09 7d 0a 0a 09 09 09 63 61 63 6b 65 79  ....}.....cackey
11f70 5f 66 72 65 65 5f 74 6c 76 28 61 70 70 5f 74 6c  _free_tlv(app_tl
11f80 76 29 3b 0a 0a 09 09 09 69 66 20 28 6f 75 74 69  v);.....if (outi
11f90 64 78 20 3e 3d 20 2a 63 6f 75 6e 74 29 20 7b 0a  dx >= *count) {.
11fa0 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 7d 0a  ....break;....}.
11fb0 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 66 72  ..}....cackey_fr
11fc0 65 65 5f 74 6c 76 28 63 63 63 5f 74 6c 76 29 3b  ee_tlv(ccc_tlv);
11fd0 0a 09 7d 0a 0a 09 2a 63 6f 75 6e 74 20 3d 20 6f  ..}...*count = o
11fe0 75 74 69 64 78 3b 0a 0a 09 69 66 20 28 63 65 72  utidx;...if (cer
11ff0 74 73 5f 72 65 73 69 7a 61 62 6c 65 29 20 7b 0a  ts_resizable) {.
12000 09 09 69 66 20 28 2a 63 6f 75 6e 74 20 21 3d 20  ..if (*count != 
12010 30 29 20 7b 0a 09 09 09 63 65 72 74 73 20 3d 20  0) {....certs = 
12020 72 65 61 6c 6c 6f 63 28 63 65 72 74 73 2c 20 73  realloc(certs, s
12030 69 7a 65 6f 66 28 2a 63 65 72 74 73 29 20 2a 20  izeof(*certs) * 
12040 28 2a 63 6f 75 6e 74 29 29 3b 0a 09 09 7d 20 65  (*count));...} e
12050 6c 73 65 20 7b 0a 09 09 09 63 65 72 74 73 20 3d  lse {....certs =
12060 20 4e 55 4c 4c 3b 0a 09 09 7d 0a 09 7d 0a 0a 09   NULL;...}..}...
12070 73 6c 6f 74 2d 3e 63 61 63 68 65 64 5f 63 65 72  slot->cached_cer
12080 74 73 20 3d 20 63 61 63 6b 65 79 5f 63 6f 70 79  ts = cackey_copy
12090 5f 63 65 72 74 73 28 4e 55 4c 4c 2c 20 63 65 72  _certs(NULL, cer
120a0 74 73 2c 20 2a 63 6f 75 6e 74 29 3b 0a 09 73 6c  ts, *count);..sl
120b0 6f 74 2d 3e 63 61 63 68 65 64 5f 63 65 72 74 73  ot->cached_certs
120c0 5f 63 6f 75 6e 74 20 3d 20 2a 63 6f 75 6e 74 3b  _count = *count;
120d0 0a 0a 09 2f 2a 20 54 65 72 6d 69 6e 61 74 65 20  .../* Terminate 
120e0 53 6d 61 72 74 43 61 72 64 20 54 72 61 6e 73 61  SmartCard Transa
120f0 63 74 69 6f 6e 20 2a 2f 0a 09 63 61 63 6b 65 79  ction */..cackey
12100 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
12110 28 73 6c 6f 74 29 3b 0a 0a 09 72 65 74 75 72 6e  (slot);...return
12120 28 63 65 72 74 73 29 3b 0a 7d 0a 0a 2f 2a 0a 20  (certs);.}../*. 
12130 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20  * SYNPOSIS. *   
12140 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55    .... *. * ARGU
12150 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e  MENTS. *     ...
12160 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41  . *. * RETURN VA
12170 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20  LUE. *     .... 
12180 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20  *. * NOTES. *   
12190 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61    .... *. */.sta
121a0 74 69 63 20 73 73 69 7a 65 5f 74 20 63 61 63 6b  tic ssize_t cack
121b0 65 79 5f 73 69 67 6e 64 65 63 72 79 70 74 28 73  ey_signdecrypt(s
121c0 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f  truct cackey_slo
121d0 74 20 2a 73 6c 6f 74 2c 20 73 74 72 75 63 74 20  t *slot, struct 
121e0 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79 20  cackey_identity 
121f0 2a 69 64 65 6e 74 69 74 79 2c 20 75 6e 73 69 67  *identity, unsig
12200 6e 65 64 20 63 68 61 72 20 2a 62 75 66 2c 20 73  ned char *buf, s
12210 69 7a 65 5f 74 20 62 75 66 6c 65 6e 2c 20 75 6e  ize_t buflen, un
12220 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6f 75 74  signed char *out
12230 62 75 66 2c 20 73 69 7a 65 5f 74 20 6f 75 74 62  buf, size_t outb
12240 75 66 6c 65 6e 2c 20 69 6e 74 20 70 61 64 49 6e  uflen, int padIn
12250 70 75 74 2c 20 69 6e 74 20 75 6e 70 61 64 4f 75  put, int unpadOu
12260 74 70 75 74 29 20 7b 0a 09 63 61 63 6b 65 79 5f  tput) {..cackey_
12270 70 63 73 63 5f 69 64 5f 74 79 70 65 20 69 64 5f  pcsc_id_type id_
12280 74 79 70 65 3b 0a 09 75 6e 73 69 67 6e 65 64 20  type;..unsigned 
12290 63 68 61 72 20 64 79 6e 5f 61 75 74 68 5f 74 65  char dyn_auth_te
122a0 6d 70 6c 61 74 65 5b 31 30 5d 2c 20 2a 64 79 6e  mplate[10], *dyn
122b0 5f 61 75 74 68 5f 74 6d 70 62 75 66 3b 0a 09 75  _auth_tmpbuf;..u
122c0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74 6d  nsigned char *tm
122d0 70 62 75 66 2c 20 2a 74 6d 70 62 75 66 5f 73 2c  pbuf, *tmpbuf_s,
122e0 20 2a 6f 75 74 62 75 66 5f 73 2c 20 2a 6f 75 74   *outbuf_s, *out
122f0 62 75 66 5f 70 3b 0a 09 75 6e 73 69 67 6e 65 64  buf_p;..unsigned
12300 20 63 68 61 72 20 62 79 74 65 73 5f 74 6f 5f 73   char bytes_to_s
12310 65 6e 64 2c 20 70 31 2c 20 63 6c 61 73 73 3b 0a  end, p1, class;.
12320 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 62  .unsigned char b
12330 6c 6f 63 6b 74 79 70 65 3b 0a 09 63 61 63 6b 65  locktype;..cacke
12340 79 5f 72 65 74 20 73 65 6e 64 5f 72 65 74 3b 0a  y_ret send_ret;.
12350 09 75 69 6e 74 31 36 5f 74 20 72 65 73 70 63 6f  .uint16_t respco
12360 64 65 3b 0a 09 73 73 69 7a 65 5f 74 20 72 65 74  de;..ssize_t ret
12370 76 61 6c 20 3d 20 30 2c 20 75 6e 70 61 64 6f 66  val = 0, unpadof
12380 66 73 65 74 3b 0a 09 73 69 7a 65 5f 74 20 74 6d  fset;..size_t tm
12390 70 62 75 66 6c 65 6e 2c 20 70 61 64 6c 65 6e 2c  pbuflen, padlen,
123a0 20 74 6d 70 6f 75 74 62 75 66 6c 65 6e 2c 20 6f   tmpoutbuflen, o
123b0 75 74 62 75 66 5f 6c 65 6e 3b 0a 09 69 6e 74 20  utbuf_len;..int 
123c0 66 72 65 65 5f 74 6d 70 62 75 66 20 3d 20 30 3b  free_tmpbuf = 0;
123d0 0a 09 69 6e 74 20 6c 65 3b 0a 0a 09 43 41 43 4b  ..int le;...CACK
123e0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
123f0 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
12400 20 28 73 6c 6f 74 20 3d 3d 20 4e 55 4c 4c 29 20   (slot == NULL) 
12410 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
12420 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
12430 20 73 6c 6f 74 20 69 73 20 4e 55 4c 4c 22 29 3b   slot is NULL");
12440 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a  ....return(-1);.
12450 09 7d 0a 0a 09 69 66 20 28 62 75 66 20 3d 3d 20  .}...if (buf == 
12460 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
12470 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
12480 72 72 6f 72 2e 20 20 62 75 66 20 69 73 20 4e 55  rror.  buf is NU
12490 4c 4c 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  LL");....return(
124a0 2d 31 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 6f 75  -1);..}...if (ou
124b0 74 62 75 66 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  tbuf == NULL) {.
124c0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
124d0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 6f  RINTF("Error.  o
124e0 75 74 62 75 66 20 69 73 20 4e 55 4c 4c 22 29 3b  utbuf is NULL");
124f0 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a  ....return(-1);.
12500 09 7d 0a 0a 09 69 66 20 28 69 64 65 6e 74 69 74  .}...if (identit
12510 79 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  y == NULL) {...C
12520 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
12530 54 46 28 22 45 72 72 6f 72 2e 20 20 69 64 65 6e  TF("Error.  iden
12540 74 69 74 79 20 69 73 20 4e 55 4c 4c 22 29 3b 0a  tity is NULL");.
12550 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09  ...return(-1);..
12560 7d 0a 0a 09 69 66 20 28 69 64 65 6e 74 69 74 79  }...if (identity
12570 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20  ->pcsc_identity 
12580 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43  == NULL) {...CAC
12590 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
125a0 28 22 45 72 72 6f 72 2e 20 20 69 64 65 6e 74 69  ("Error.  identi
125b0 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74  ty->pcsc_identit
125c0 79 20 69 73 20 4e 55 4c 4c 22 29 3b 0a 0a 09 09  y is NULL");....
125d0 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a  return(-1);..}..
125e0 09 69 64 5f 74 79 70 65 20 3d 20 69 64 65 6e 74  .id_type = ident
125f0 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69  ity->pcsc_identi
12600 74 79 2d 3e 69 64 5f 74 79 70 65 3b 0a 09 69 66  ty->id_type;..if
12610 20 28 69 64 5f 74 79 70 65 20 3d 3d 20 43 41 43   (id_type == CAC
12620 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43 45 52 54  KEY_ID_TYPE_CERT
12630 5f 4f 4e 4c 59 29 20 7b 0a 09 09 43 41 43 4b 45  _ONLY) {...CACKE
12640 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
12650 45 72 72 6f 72 2e 20 20 69 64 65 6e 74 69 74 79  Error.  identity
12660 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20  ->pcsc_identity 
12670 69 73 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50  is CACKEY_ID_TYP
12680 45 5f 43 45 52 54 5f 4f 4e 4c 59 2c 20 77 68 69  E_CERT_ONLY, whi
12690 63 68 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65  ch cannot be use
126a0 64 20 66 6f 72 20 73 69 67 6e 2f 64 65 63 72 79  d for sign/decry
126b0 70 74 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  pt");....return(
126c0 2d 31 29 3b 0a 09 7d 0a 0a 09 73 77 69 74 63 68  -1);..}...switch
126d0 20 28 69 64 5f 74 79 70 65 29 20 7b 0a 09 09 63   (id_type) {...c
126e0 61 73 65 20 43 41 43 4b 45 59 5f 49 44 5f 54 59  ase CACKEY_ID_TY
126f0 50 45 5f 50 49 56 3a 0a 09 09 63 61 73 65 20 43  PE_PIV:...case C
12700 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43 41  ACKEY_ID_TYPE_CA
12710 43 3a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 64  C:....break;...d
12720 65 66 61 75 6c 74 3a 0a 09 09 09 43 41 43 4b 45  efault:....CACKE
12730 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
12740 45 72 72 6f 72 2e 20 20 69 64 65 6e 74 69 74 79  Error.  identity
12750 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20  ->pcsc_identity 
12760 69 73 20 6e 6f 74 20 61 20 73 75 70 70 6f 72 74  is not a support
12770 65 64 20 76 61 6c 75 65 2e 20 54 79 70 65 20 69  ed value. Type i
12780 73 3a 20 30 78 25 6c 78 20 28 50 49 56 20 3d 20  s: 0x%lx (PIV = 
12790 30 78 25 6c 78 2c 20 43 41 43 20 3d 20 30 78 25  0x%lx, CAC = 0x%
127a0 6c 78 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  lx)", (unsigned 
127b0 6c 6f 6e 67 29 20 69 64 5f 74 79 70 65 2c 20 28  long) id_type, (
127c0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 43  unsigned long) C
127d0 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 50 49  ACKEY_ID_TYPE_PI
127e0 56 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  V, (unsigned lon
127f0 67 29 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50  g) CACKEY_ID_TYP
12800 45 5f 43 41 43 29 3b 0a 0a 09 09 09 72 65 74 75  E_CAC);.....retu
12810 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 2f 2a 20  rn(-1);..}.../* 
12820 44 65 74 65 72 6d 69 6e 65 20 69 64 65 6e 74 69  Determine identi
12830 74 79 20 4b 65 79 20 73 69 7a 65 20 2a 2f 0a 09  ty Key size */..
12840 69 66 20 28 69 64 65 6e 74 69 74 79 2d 3e 70 63  if (identity->pc
12850 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 6b 65 79  sc_identity->key
12860 73 69 7a 65 20 3c 20 30 29 20 7b 0a 09 09 69 64  size < 0) {...id
12870 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65  entity->pcsc_ide
12880 6e 74 69 74 79 2d 3e 6b 65 79 73 69 7a 65 20 3d  ntity->keysize =
12890 20 78 35 30 39 5f 74 6f 5f 6b 65 79 73 69 7a 65   x509_to_keysize
128a0 28 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f  (identity->pcsc_
128b0 69 64 65 6e 74 69 74 79 2d 3e 63 65 72 74 69 66  identity->certif
128c0 69 63 61 74 65 2c 20 69 64 65 6e 74 69 74 79 2d  icate, identity-
128d0 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e  >pcsc_identity->
128e0 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 29  certificate_len)
128f0 3b 0a 09 7d 0a 0a 09 2f 2a 20 50 61 64 20 6d 65  ;..}.../* Pad me
12900 73 73 61 67 65 20 74 6f 20 6b 65 79 20 73 69 7a  ssage to key siz
12910 65 20 2a 2f 0a 09 69 66 20 28 70 61 64 49 6e 70  e */..if (padInp
12920 75 74 29 20 7b 0a 09 09 69 66 20 28 69 64 65 6e  ut) {...if (iden
12930 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74  tity->pcsc_ident
12940 69 74 79 2d 3e 6b 65 79 73 69 7a 65 20 3e 20 30  ity->keysize > 0
12950 29 20 7b 0a 09 09 09 69 66 20 28 62 75 66 6c 65  ) {....if (bufle
12960 6e 20 21 3d 20 69 64 65 6e 74 69 74 79 2d 3e 70  n != identity->p
12970 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 6b 65  csc_identity->ke
12980 79 73 69 7a 65 29 20 7b 0a 09 09 09 09 69 66 20  ysize) {.....if 
12990 28 62 75 66 6c 65 6e 20 3e 20 28 69 64 65 6e 74  (buflen > (ident
129a0 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69  ity->pcsc_identi
129b0 74 79 2d 3e 6b 65 79 73 69 7a 65 20 2b 20 33 29  ty->keysize + 3)
129c0 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f  ) {......CACKEY_
129d0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
129e0 72 6f 72 2e 20 20 4d 65 73 73 61 67 65 20 69 73  ror.  Message is
129f0 20 74 6f 6f 20 6c 61 72 67 65 20 74 6f 20 73 69   too large to si
12a00 67 6e 2f 64 65 63 72 79 70 74 22 29 3b 0a 0a 09  gn/decrypt");...
12a10 09 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a  ....return(-1);.
12a20 09 09 09 09 7d 0a 0a 09 09 09 09 74 6d 70 62 75  ....}......tmpbu
12a30 66 6c 65 6e 20 3d 20 69 64 65 6e 74 69 74 79 2d  flen = identity-
12a40 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e  >pcsc_identity->
12a50 6b 65 79 73 69 7a 65 3b 0a 09 09 09 09 74 6d 70  keysize;.....tmp
12a60 62 75 66 20 3d 20 6d 61 6c 6c 6f 63 28 74 6d 70  buf = malloc(tmp
12a70 62 75 66 6c 65 6e 29 3b 0a 09 09 09 09 66 72 65  buflen);.....fre
12a80 65 5f 74 6d 70 62 75 66 20 3d 20 31 3b 0a 0a 09  e_tmpbuf = 1;...
12a90 09 09 09 70 61 64 6c 65 6e 20 3d 20 74 6d 70 62  ...padlen = tmpb
12aa0 75 66 6c 65 6e 20 2d 20 62 75 66 6c 65 6e 20 2d  uflen - buflen -
12ab0 20 33 3b 0a 0a 09 09 09 09 2f 2a 20 52 53 41 20   3;....../* RSA 
12ac0 50 4b 43 53 23 31 20 45 4d 53 41 2d 50 4b 43 53  PKCS#1 EMSA-PKCS
12ad0 31 2d 76 31 5f 35 20 50 61 64 64 69 6e 67 20 2a  1-v1_5 Padding *
12ae0 2f 0a 09 09 09 09 74 6d 70 62 75 66 5b 30 5d 20  /.....tmpbuf[0] 
12af0 3d 20 30 78 30 30 3b 0a 09 09 09 09 74 6d 70 62  = 0x00;.....tmpb
12b00 75 66 5b 31 5d 20 3d 20 30 78 30 31 3b 0a 09 09  uf[1] = 0x01;...
12b10 09 09 6d 65 6d 73 65 74 28 26 74 6d 70 62 75 66  ..memset(&tmpbuf
12b20 5b 32 5d 2c 20 30 78 46 46 2c 20 70 61 64 6c 65  [2], 0xFF, padle
12b30 6e 29 3b 0a 09 09 09 09 74 6d 70 62 75 66 5b 70  n);.....tmpbuf[p
12b40 61 64 6c 65 6e 20 2b 20 32 5d 3d 20 30 78 30 30  adlen + 2]= 0x00
12b50 3b 0a 09 09 09 09 6d 65 6d 63 70 79 28 26 74 6d  ;.....memcpy(&tm
12b60 70 62 75 66 5b 70 61 64 6c 65 6e 20 2b 20 33 5d  pbuf[padlen + 3]
12b70 2c 20 62 75 66 2c 20 62 75 66 6c 65 6e 29 3b 0a  , buf, buflen);.
12b80 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
12b90 47 5f 50 52 49 4e 54 42 55 46 28 22 55 6e 70 61  G_PRINTBUF("Unpa
12ba0 64 64 65 64 3a 22 2c 20 62 75 66 2c 20 62 75 66  dded:", buf, buf
12bb0 6c 65 6e 29 3b 0a 09 09 09 09 43 41 43 4b 45 59  len);.....CACKEY
12bc0 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28  _DEBUG_PRINTBUF(
12bd0 22 50 61 64 64 65 64 3a 22 2c 20 74 6d 70 62 75  "Padded:", tmpbu
12be0 66 2c 20 74 6d 70 62 75 66 6c 65 6e 29 3b 0a 09  f, tmpbuflen);..
12bf0 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 74  ..} else {.....t
12c00 6d 70 62 75 66 20 3d 20 62 75 66 3b 0a 09 09 09  mpbuf = buf;....
12c10 09 74 6d 70 62 75 66 6c 65 6e 20 3d 20 62 75 66  .tmpbuflen = buf
12c20 6c 65 6e 3b 0a 09 09 09 09 66 72 65 65 5f 74 6d  len;.....free_tm
12c30 70 62 75 66 20 3d 20 30 3b 0a 09 09 09 09 70 61  pbuf = 0;.....pa
12c40 64 6c 65 6e 20 3d 20 30 3b 0a 09 09 09 7d 0a 09  dlen = 0;....}..
12c50 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 43 41 43  .} else {....CAC
12c60 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
12c70 28 22 55 6e 61 62 6c 65 20 74 6f 20 64 65 74 65  ("Unable to dete
12c80 72 6d 69 6e 65 20 6b 65 79 20 73 69 7a 65 2c 20  rmine key size, 
12c90 68 6f 70 69 6e 67 20 74 68 65 20 6d 65 73 73 61  hoping the messa
12ca0 67 65 20 69 73 20 70 72 6f 70 65 72 6c 79 20 70  ge is properly p
12cb0 61 64 64 65 64 21 22 29 3b 0a 0a 09 09 09 74 6d  added!");.....tm
12cc0 70 62 75 66 20 3d 20 62 75 66 3b 0a 09 09 09 74  pbuf = buf;....t
12cd0 6d 70 62 75 66 6c 65 6e 20 3d 20 62 75 66 6c 65  mpbuflen = bufle
12ce0 6e 3b 0a 09 09 09 66 72 65 65 5f 74 6d 70 62 75  n;....free_tmpbu
12cf0 66 20 3d 20 30 3b 0a 09 09 09 70 61 64 6c 65 6e  f = 0;....padlen
12d00 20 3d 20 30 3b 0a 09 09 7d 0a 09 7d 20 65 6c 73   = 0;...}..} els
12d10 65 20 7b 0a 09 09 74 6d 70 62 75 66 20 3d 20 62  e {...tmpbuf = b
12d20 75 66 3b 0a 09 09 74 6d 70 62 75 66 6c 65 6e 20  uf;...tmpbuflen 
12d30 3d 20 62 75 66 6c 65 6e 3b 0a 09 09 66 72 65 65  = buflen;...free
12d40 5f 74 6d 70 62 75 66 20 3d 20 30 3b 0a 09 09 70  _tmpbuf = 0;...p
12d50 61 64 6c 65 6e 20 3d 20 30 3b 0a 09 7d 0a 0a 09  adlen = 0;..}...
12d60 2f 2a 20 42 65 67 69 6e 20 74 72 61 6e 73 61 63  /* Begin transac
12d70 74 69 6f 6e 20 2a 2f 0a 09 63 61 63 6b 65 79 5f  tion */..cackey_
12d80 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f  begin_transactio
12d90 6e 28 73 6c 6f 74 29 3b 0a 0a 09 2f 2a 20 53 65  n(slot);.../* Se
12da0 6c 65 63 74 20 63 6f 72 72 65 63 74 20 61 70 70  lect correct app
12db0 6c 65 74 20 2a 2f 0a 09 73 77 69 74 63 68 20 28  let */..switch (
12dc0 69 64 5f 74 79 70 65 29 20 7b 0a 09 09 63 61 73  id_type) {...cas
12dd0 65 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45  e CACKEY_ID_TYPE
12de0 5f 43 41 43 3a 0a 09 09 09 43 41 43 4b 45 59 5f  _CAC:....CACKEY_
12df0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 65  DEBUG_PRINTF("Se
12e00 6c 65 63 74 69 6e 67 20 61 70 70 6c 65 74 20 66  lecting applet f
12e10 6f 75 6e 64 20 61 74 20 25 70 20 2e 2e 2e 22 2c  ound at %p ...",
12e20 20 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f   identity->pcsc_
12e30 69 64 65 6e 74 69 74 79 2d 3e 63 61 72 64 2e 63  identity->card.c
12e40 61 63 2e 61 70 70 6c 65 74 29 3b 0a 09 09 09 63  ac.applet);....c
12e50 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 61 70 70  ackey_select_app
12e60 6c 65 74 28 73 6c 6f 74 2c 20 69 64 65 6e 74 69  let(slot, identi
12e70 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74  ty->pcsc_identit
12e80 79 2d 3e 63 61 72 64 2e 63 61 63 2e 61 70 70 6c  y->card.cac.appl
12e90 65 74 2c 20 73 69 7a 65 6f 66 28 69 64 65 6e 74  et, sizeof(ident
12ea0 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69  ity->pcsc_identi
12eb0 74 79 2d 3e 63 61 72 64 2e 63 61 63 2e 61 70 70  ty->card.cac.app
12ec0 6c 65 74 29 29 3b 0a 0a 09 09 09 2f 2a 20 53 65  let));...../* Se
12ed0 6c 65 63 74 20 63 6f 72 72 65 63 74 20 66 69 6c  lect correct fil
12ee0 65 20 2a 2f 0a 09 09 09 63 61 63 6b 65 79 5f 73  e */....cackey_s
12ef0 65 6c 65 63 74 5f 66 69 6c 65 28 73 6c 6f 74 2c  elect_file(slot,
12f00 20 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f   identity->pcsc_
12f10 69 64 65 6e 74 69 74 79 2d 3e 63 61 72 64 2e 63  identity->card.c
12f20 61 63 2e 66 69 6c 65 29 3b 0a 09 09 09 62 72 65  ac.file);....bre
12f30 61 6b 3b 0a 09 09 63 61 73 65 20 43 41 43 4b 45  ak;...case CACKE
12f40 59 5f 49 44 5f 54 59 50 45 5f 50 49 56 3a 0a 09  Y_ID_TYPE_PIV:..
12f50 09 09 64 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c  ..dyn_auth_templ
12f60 61 74 65 5b 30 5d 20 3d 20 30 78 37 43 3b 0a 09  ate[0] = 0x7C;..
12f70 09 09 64 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c  ..dyn_auth_templ
12f80 61 74 65 5b 31 5d 20 3d 20 30 78 38 32 3b 0a 09  ate[1] = 0x82;..
12f90 09 09 64 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c  ..dyn_auth_templ
12fa0 61 74 65 5b 32 5d 20 3d 20 28 28 74 6d 70 62 75  ate[2] = ((tmpbu
12fb0 66 6c 65 6e 20 2b 20 36 29 20 26 20 30 78 66 66  flen + 6) & 0xff
12fc0 30 30 29 20 3e 3e 20 38 3b 0a 09 09 09 64 79 6e  00) >> 8;....dyn
12fd0 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74 65 5b 33  _auth_template[3
12fe0 5d 20 3d 20 28 74 6d 70 62 75 66 6c 65 6e 20 2b  ] = (tmpbuflen +
12ff0 20 36 29 20 26 20 30 78 30 30 66 66 3b 0a 09 09   6) & 0x00ff;...
13000 09 64 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61  .dyn_auth_templa
13010 74 65 5b 34 5d 20 3d 20 30 78 38 32 3b 0a 09 09  te[4] = 0x82;...
13020 09 64 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61  .dyn_auth_templa
13030 74 65 5b 35 5d 20 3d 20 30 78 30 30 3b 0a 09 09  te[5] = 0x00;...
13040 09 64 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61  .dyn_auth_templa
13050 74 65 5b 36 5d 20 3d 20 30 78 38 31 3b 0a 09 09  te[6] = 0x81;...
13060 09 64 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61  .dyn_auth_templa
13070 74 65 5b 37 5d 20 3d 20 30 78 38 32 3b 0a 09 09  te[7] = 0x82;...
13080 09 64 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61  .dyn_auth_templa
13090 74 65 5b 38 5d 20 3d 20 28 74 6d 70 62 75 66 6c  te[8] = (tmpbufl
130a0 65 6e 20 26 20 30 78 66 66 30 30 29 20 3e 3e 20  en & 0xff00) >> 
130b0 38 3b 0a 09 09 09 64 79 6e 5f 61 75 74 68 5f 74  8;....dyn_auth_t
130c0 65 6d 70 6c 61 74 65 5b 39 5d 20 3d 20 74 6d 70  emplate[9] = tmp
130d0 62 75 66 6c 65 6e 20 26 20 30 78 30 30 66 66 3b  buflen & 0x00ff;
130e0 0a 0a 09 09 09 64 79 6e 5f 61 75 74 68 5f 74 6d  .....dyn_auth_tm
130f0 70 62 75 66 20 3d 20 6d 61 6c 6c 6f 63 28 74 6d  pbuf = malloc(tm
13100 70 62 75 66 6c 65 6e 20 2b 20 73 69 7a 65 6f 66  pbuflen + sizeof
13110 28 64 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61  (dyn_auth_templa
13120 74 65 29 29 3b 0a 09 09 09 6d 65 6d 63 70 79 28  te));....memcpy(
13130 64 79 6e 5f 61 75 74 68 5f 74 6d 70 62 75 66 2c  dyn_auth_tmpbuf,
13140 20 64 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61   dyn_auth_templa
13150 74 65 2c 20 73 69 7a 65 6f 66 28 64 79 6e 5f 61  te, sizeof(dyn_a
13160 75 74 68 5f 74 65 6d 70 6c 61 74 65 29 29 3b 0a  uth_template));.
13170 09 09 09 6d 65 6d 63 70 79 28 64 79 6e 5f 61 75  ...memcpy(dyn_au
13180 74 68 5f 74 6d 70 62 75 66 20 2b 20 73 69 7a 65  th_tmpbuf + size
13190 6f 66 28 64 79 6e 5f 61 75 74 68 5f 74 65 6d 70  of(dyn_auth_temp
131a0 6c 61 74 65 29 2c 20 74 6d 70 62 75 66 2c 20 74  late), tmpbuf, t
131b0 6d 70 62 75 66 6c 65 6e 29 3b 0a 0a 09 09 09 69  mpbuflen);.....i
131c0 66 20 28 66 72 65 65 5f 74 6d 70 62 75 66 29 20  f (free_tmpbuf) 
131d0 7b 0a 09 09 09 09 66 72 65 65 28 74 6d 70 62 75  {.....free(tmpbu
131e0 66 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 74 6d 70  f);....}.....tmp
131f0 62 75 66 6c 65 6e 20 2b 3d 20 73 69 7a 65 6f 66  buflen += sizeof
13200 28 64 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61  (dyn_auth_templa
13210 74 65 29 3b 0a 09 09 09 74 6d 70 62 75 66 20 3d  te);....tmpbuf =
13220 20 64 79 6e 5f 61 75 74 68 5f 74 6d 70 62 75 66   dyn_auth_tmpbuf
13230 3b 0a 09 09 09 66 72 65 65 5f 74 6d 70 62 75 66  ;....free_tmpbuf
13240 20 3d 20 31 3b 0a 0a 09 09 09 62 72 65 61 6b 3b   = 1;.....break;
13250 0a 09 09 63 61 73 65 20 43 41 43 4b 45 59 5f 49  ...case CACKEY_I
13260 44 5f 54 59 50 45 5f 43 45 52 54 5f 4f 4e 4c 59  D_TYPE_CERT_ONLY
13270 3a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a  :....break;..}..
13280 09 74 6d 70 62 75 66 5f 73 20 3d 20 74 6d 70 62  .tmpbuf_s = tmpb
13290 75 66 3b 0a 09 6f 75 74 62 75 66 5f 73 20 3d 20  uf;..outbuf_s = 
132a0 6f 75 74 62 75 66 3b 0a 09 77 68 69 6c 65 20 28  outbuf;..while (
132b0 74 6d 70 62 75 66 6c 65 6e 29 20 7b 0a 09 09 74  tmpbuflen) {...t
132c0 6d 70 6f 75 74 62 75 66 6c 65 6e 20 3d 20 6f 75  mpoutbuflen = ou
132d0 74 62 75 66 6c 65 6e 3b 0a 0a 09 09 69 66 20 28  tbuflen;....if (
132e0 74 6d 70 62 75 66 6c 65 6e 20 3e 20 43 41 43 4b  tmpbuflen > CACK
132f0 45 59 5f 41 50 44 55 5f 4d 54 55 29 20 7b 0a 09  EY_APDU_MTU) {..
13300 09 09 62 79 74 65 73 5f 74 6f 5f 73 65 6e 64 20  ..bytes_to_send 
13310 3d 20 43 41 43 4b 45 59 5f 41 50 44 55 5f 4d 54  = CACKEY_APDU_MT
13320 55 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  U;...} else {...
13330 09 62 79 74 65 73 5f 74 6f 5f 73 65 6e 64 20 3d  .bytes_to_send =
13340 20 74 6d 70 62 75 66 6c 65 6e 3b 0a 09 09 7d 0a   tmpbuflen;...}.
13350 0a 09 09 73 65 6e 64 5f 72 65 74 20 3d 20 43 41  ...send_ret = CA
13360 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45  CKEY_PCSC_E_GENE
13370 52 49 43 3b 0a 09 09 73 77 69 74 63 68 20 28 69  RIC;...switch (i
13380 64 5f 74 79 70 65 29 20 7b 0a 09 09 09 63 61 73  d_type) {....cas
13390 65 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45  e CACKEY_ID_TYPE
133a0 5f 43 41 43 3a 0a 09 09 09 09 69 66 20 28 74 6d  _CAC:.....if (tm
133b0 70 62 75 66 6c 65 6e 20 3e 20 43 41 43 4b 45 59  pbuflen > CACKEY
133c0 5f 41 50 44 55 5f 4d 54 55 29 20 7b 0a 09 09 09  _APDU_MTU) {....
133d0 09 09 70 31 20 3d 20 30 78 38 30 3b 0a 09 09 09  ..p1 = 0x80;....
133e0 09 09 6c 65 20 3d 20 30 78 30 30 3b 0a 09 09 09  ..le = 0x00;....
133f0 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 70  .} else {......p
13400 31 20 3d 20 30 78 30 30 3b 0a 09 09 09 09 09 6c  1 = 0x00;......l
13410 65 20 3d 20 30 78 30 30 3b 0a 09 09 09 09 7d 0a  e = 0x00;.....}.
13420 0a 09 09 09 09 73 65 6e 64 5f 72 65 74 20 3d 20  .....send_ret = 
13430 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75  cackey_send_apdu
13440 28 73 6c 6f 74 2c 20 47 53 43 49 53 5f 43 4c 41  (slot, GSCIS_CLA
13450 53 53 5f 47 4c 4f 42 41 4c 5f 50 4c 41 54 46 4f  SS_GLOBAL_PLATFO
13460 52 4d 2c 20 47 53 43 49 53 5f 49 4e 53 54 52 5f  RM, GSCIS_INSTR_
13470 53 49 47 4e 44 45 43 52 59 50 54 2c 20 70 31 2c  SIGNDECRYPT, p1,
13480 20 30 78 30 30 2c 20 62 79 74 65 73 5f 74 6f 5f   0x00, bytes_to_
13490 73 65 6e 64 2c 20 74 6d 70 62 75 66 2c 20 6c 65  send, tmpbuf, le
134a0 2c 20 26 72 65 73 70 63 6f 64 65 2c 20 6f 75 74  , &respcode, out
134b0 62 75 66 2c 20 26 74 6d 70 6f 75 74 62 75 66 6c  buf, &tmpoutbufl
134c0 65 6e 29 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a  en);.....break;.
134d0 09 09 09 63 61 73 65 20 43 41 43 4b 45 59 5f 49  ...case CACKEY_I
134e0 44 5f 54 59 50 45 5f 50 49 56 3a 0a 09 09 09 09  D_TYPE_PIV:.....
134f0 69 66 20 28 74 6d 70 62 75 66 6c 65 6e 20 3e 20  if (tmpbuflen > 
13500 43 41 43 4b 45 59 5f 41 50 44 55 5f 4d 54 55 29  CACKEY_APDU_MTU)
13510 20 7b 0a 09 09 09 09 09 63 6c 61 73 73 20 3d 20   {......class = 
13520 30 78 31 30 3b 0a 09 09 09 09 09 6c 65 20 3d 20  0x10;......le = 
13530 30 78 30 30 3b 0a 09 09 09 09 7d 20 65 6c 73 65  0x00;.....} else
13540 20 7b 0a 09 09 09 09 09 63 6c 61 73 73 20 3d 20   {......class = 
13550 47 53 43 49 53 5f 43 4c 41 53 53 5f 49 53 4f 37  GSCIS_CLASS_ISO7
13560 38 31 36 3b 0a 09 09 09 09 09 6c 65 20 3d 20 32  816;......le = 2
13570 35 36 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 73  56;.....}......s
13580 65 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79  end_ret = cackey
13590 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f 74 2c  _send_apdu(slot,
135a0 20 63 6c 61 73 73 2c 20 4e 49 53 54 53 50 38 30   class, NISTSP80
135b0 30 5f 37 33 5f 33 5f 49 4e 53 54 52 5f 47 45 4e  0_73_3_INSTR_GEN
135c0 41 55 54 48 2c 20 4e 49 53 54 53 50 38 30 30 5f  AUTH, NISTSP800_
135d0 37 38 5f 33 5f 41 4c 47 4f 5f 52 53 41 32 30 34  78_3_ALGO_RSA204
135e0 38 2c 20 69 64 65 6e 74 69 74 79 2d 3e 70 63 73  8, identity->pcs
135f0 63 5f 69 64 65 6e 74 69 74 79 2d 3e 63 61 72 64  c_identity->card
13600 2e 70 69 76 2e 6b 65 79 5f 69 64 2c 20 62 79 74  .piv.key_id, byt
13610 65 73 5f 74 6f 5f 73 65 6e 64 2c 20 74 6d 70 62  es_to_send, tmpb
13620 75 66 2c 20 6c 65 2c 20 26 72 65 73 70 63 6f 64  uf, le, &respcod
13630 65 2c 20 6f 75 74 62 75 66 2c 20 26 74 6d 70 6f  e, outbuf, &tmpo
13640 75 74 62 75 66 6c 65 6e 29 3b 0a 09 09 09 09 62  utbuflen);.....b
13650 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 41  reak;....case CA
13660 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43 45 52  CKEY_ID_TYPE_CER
13670 54 5f 4f 4e 4c 59 3a 0a 09 09 09 09 62 72 65 61  T_ONLY:.....brea
13680 6b 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 73 65  k;...}....if (se
13690 6e 64 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59  nd_ret != CACKEY
136a0 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09  _PCSC_S_OK) {...
136b0 09 69 66 20 28 66 72 65 65 5f 74 6d 70 62 75 66  .if (free_tmpbuf
136c0 29 20 7b 0a 09 09 09 09 69 66 20 28 74 6d 70 62  ) {.....if (tmpb
136d0 75 66 5f 73 29 20 7b 0a 09 09 09 09 09 66 72 65  uf_s) {......fre
136e0 65 28 74 6d 70 62 75 66 5f 73 29 3b 0a 09 09 09  e(tmpbuf_s);....
136f0 09 7d 0a 09 09 09 7d 0a 0a 09 09 09 2f 2a 20 45  .}....}...../* E
13700 6e 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a  nd transaction *
13710 2f 0a 09 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f  /....cackey_end_
13720 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74  transaction(slot
13730 29 3b 0a 0a 09 09 09 69 66 20 28 73 65 6e 64 5f  );.....if (send_
13740 72 65 74 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43  ret == CACKEY_PC
13750 53 43 5f 45 5f 52 45 54 52 59 29 20 7b 0a 09 09  SC_E_RETRY) {...
13760 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
13770 52 49 4e 54 46 28 22 41 44 50 55 20 53 65 6e 64  RINTF("ADPU Send
13780 69 6e 67 20 46 61 69 6c 65 64 20 2d 2d 20 72 65  ing Failed -- re
13790 74 72 79 69 6e 67 2e 22 29 3b 0a 0a 09 09 09 09  trying.");......
137a0 72 65 74 75 72 6e 28 63 61 63 6b 65 79 5f 73 69  return(cackey_si
137b0 67 6e 64 65 63 72 79 70 74 28 73 6c 6f 74 2c 20  gndecrypt(slot, 
137c0 69 64 65 6e 74 69 74 79 2c 20 62 75 66 2c 20 62  identity, buf, b
137d0 75 66 6c 65 6e 2c 20 6f 75 74 62 75 66 2c 20 6f  uflen, outbuf, o
137e0 75 74 62 75 66 6c 65 6e 2c 20 70 61 64 49 6e 70  utbuflen, padInp
137f0 75 74 2c 20 75 6e 70 61 64 4f 75 74 70 75 74 29  ut, unpadOutput)
13800 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 43 41 43 4b  );....}.....CACK
13810 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
13820 22 41 44 50 55 20 53 65 6e 64 69 6e 67 20 46 61  "ADPU Sending Fa
13830 69 6c 65 64 20 2d 2d 20 72 65 74 75 72 6e 69 6e  iled -- returnin
13840 67 20 69 6e 20 65 72 72 6f 72 2e 22 29 3b 0a 0a  g in error.");..
13850 09 09 09 69 66 20 28 72 65 73 70 63 6f 64 65 20  ...if (respcode 
13860 3d 3d 20 30 78 36 39 38 32 20 7c 7c 20 72 65 73  == 0x6982 || res
13870 70 63 6f 64 65 20 3d 3d 20 30 78 36 65 30 30 29  pcode == 0x6e00)
13880 20 7b 0a 09 09 09 09 69 66 20 28 72 65 73 70 63   {.....if (respc
13890 6f 64 65 20 3d 3d 20 30 78 36 45 30 30 29 20 7b  ode == 0x6E00) {
138a0 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
138b0 55 47 5f 50 52 49 4e 54 46 28 22 47 6f 74 20 5c  UG_PRINTF("Got \
138c0 22 57 52 4f 4e 47 20 43 4c 41 53 53 5c 22 2c 20  "WRONG CLASS\", 
138d0 74 68 69 73 20 6d 65 61 6e 73 20 77 65 20 61 72  this means we ar
138e0 65 20 74 61 6c 6b 69 6e 67 20 74 6f 20 74 68 65  e talking to the
138f0 20 77 72 6f 6e 67 20 6f 62 6a 65 63 74 20 28 6c   wrong object (l
13900 69 6b 65 6c 79 20 62 65 63 61 75 73 65 20 74 68  ikely because th
13910 65 20 63 61 72 64 20 77 65 6e 74 20 61 77 61 79  e card went away
13920 29 20 2d 2d 20 72 65 73 65 74 74 69 6e 67 22 29  ) -- resetting")
13930 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09  ;.....} else {..
13940 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
13950 5f 50 52 49 4e 54 46 28 22 53 65 63 75 72 69 74  _PRINTF("Securit
13960 79 20 73 74 61 74 75 73 20 6e 6f 74 20 73 61 74  y status not sat
13970 69 73 69 66 69 65 64 20 28 72 65 73 70 63 6f 64  isified (respcod
13980 65 20 3d 20 30 78 25 30 34 78 29 2e 20 20 52 65  e = 0x%04x).  Re
13990 74 75 72 6e 69 6e 67 20 4e 45 45 44 4c 4f 47 49  turning NEEDLOGI
139a0 4e 22 2c 20 28 69 6e 74 29 20 72 65 73 70 63 6f  N", (int) respco
139b0 64 65 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09  de);.....}......
139c0 63 61 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74  cackey_mark_slot
139d0 5f 72 65 73 65 74 28 73 6c 6f 74 29 3b 0a 0a 09  _reset(slot);...
139e0 09 09 09 73 6c 6f 74 2d 3e 74 6f 6b 65 6e 5f 66  ...slot->token_f
139f0 6c 61 67 73 20 3d 20 43 4b 46 5f 4c 4f 47 49 4e  lags = CKF_LOGIN
13a00 5f 52 45 51 55 49 52 45 44 3b 0a 0a 09 09 09 09  _REQUIRED;......
13a10 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
13a20 53 43 5f 45 5f 4e 45 45 44 4c 4f 47 49 4e 29 3b  SC_E_NEEDLOGIN);
13a30 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 73 65  ....}.....if (se
13a40 6e 64 5f 72 65 74 20 3d 3d 20 43 41 43 4b 45 59  nd_ret == CACKEY
13a50 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53  _PCSC_E_TOKENABS
13a60 45 4e 54 29 20 7b 0a 09 09 09 09 43 41 43 4b 45  ENT) {.....CACKE
13a70 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
13a80 54 6f 6b 65 6e 20 61 62 73 65 6e 74 2e 20 20 52  Token absent.  R
13a90 65 74 75 72 6e 69 6e 67 20 54 4f 4b 45 4e 41 42  eturning TOKENAB
13aa0 53 45 4e 54 22 29 3b 0a 0a 09 09 09 09 63 61 63  SENT");......cac
13ab0 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65  key_mark_slot_re
13ac0 73 65 74 28 73 6c 6f 74 29 3b 0a 0a 09 09 09 09  set(slot);......
13ad0 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
13ae0 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54  SC_E_TOKENABSENT
13af0 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 72 65 74 75  );....}.....retu
13b00 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09 09 74  rn(-1);...}....t
13b10 6d 70 62 75 66 20 2b 3d 20 62 79 74 65 73 5f 74  mpbuf += bytes_t
13b20 6f 5f 73 65 6e 64 3b 0a 09 09 74 6d 70 62 75 66  o_send;...tmpbuf
13b30 6c 65 6e 20 2d 3d 20 62 79 74 65 73 5f 74 6f 5f  len -= bytes_to_
13b40 73 65 6e 64 3b 0a 0a 09 09 6f 75 74 62 75 66 20  send;....outbuf 
13b50 2b 3d 20 74 6d 70 6f 75 74 62 75 66 6c 65 6e 3b  += tmpoutbuflen;
13b60 0a 09 09 6f 75 74 62 75 66 6c 65 6e 20 2d 3d 20  ...outbuflen -= 
13b70 74 6d 70 6f 75 74 62 75 66 6c 65 6e 3b 0a 09 09  tmpoutbuflen;...
13b80 72 65 74 76 61 6c 20 2b 3d 20 74 6d 70 6f 75 74  retval += tmpout
13b90 62 75 66 6c 65 6e 3b 0a 09 7d 0a 0a 09 69 66 20  buflen;..}...if 
13ba0 28 66 72 65 65 5f 74 6d 70 62 75 66 29 20 7b 0a  (free_tmpbuf) {.
13bb0 09 09 69 66 20 28 74 6d 70 62 75 66 5f 73 29 20  ..if (tmpbuf_s) 
13bc0 7b 0a 09 09 09 66 72 65 65 28 74 6d 70 62 75 66  {....free(tmpbuf
13bd0 5f 73 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 6f 75  _s);...}..}...ou
13be0 74 62 75 66 20 3d 20 6f 75 74 62 75 66 5f 73 3b  tbuf = outbuf_s;
13bf0 0a 0a 09 2f 2a 20 45 6e 64 20 74 72 61 6e 73 61  .../* End transa
13c00 63 74 69 6f 6e 20 2a 2f 0a 09 63 61 63 6b 65 79  ction */..cackey
13c10 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
13c20 28 73 6c 6f 74 29 3b 0a 0a 23 69 66 64 65 66 20  (slot);..#ifdef 
13c30 43 41 43 4b 45 59 5f 50 41 52 41 4e 4f 49 44 0a  CACKEY_PARANOID.
13c40 23 20 20 69 66 64 65 66 20 5f 50 4f 53 49 58 5f  #  ifdef _POSIX_
13c50 53 53 49 5a 45 5f 4d 41 58 0a 09 69 66 20 28 6f  SSIZE_MAX..if (o
13c60 75 74 62 75 66 6c 65 6e 20 3e 20 5f 50 4f 53 49  utbuflen > _POSI
13c70 58 5f 53 53 49 5a 45 5f 4d 41 58 29 20 7b 0a 09  X_SSIZE_MAX) {..
13c80 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
13c90 49 4e 54 46 28 22 4f 75 74 62 75 66 6c 65 6e 20  INTF("Outbuflen 
13ca0 65 78 63 65 65 64 73 20 6d 61 78 69 6d 75 6d 20  exceeds maximum 
13cb0 76 61 6c 75 65 2c 20 72 65 74 75 72 6e 69 6e 67  value, returning
13cc0 20 69 6e 20 66 61 69 6c 75 72 65 2e 20 28 6d 61   in failure. (ma
13cd0 78 20 3d 20 25 6c 69 2c 20 6f 75 74 62 75 66 6c  x = %li, outbufl
13ce0 65 6e 20 3d 20 25 6c 75 29 22 2c 20 28 6c 6f 6e  en = %lu)", (lon
13cf0 67 29 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f  g) _POSIX_SSIZE_
13d00 4d 41 58 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  MAX, (unsigned l
13d10 6f 6e 67 29 20 6f 75 74 62 75 66 6c 65 6e 29 3b  ong) outbuflen);
13d20 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a  ....return(-1);.
13d30 09 7d 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64  .}.#  endif.#end
13d40 69 66 0a 0a 09 2f 2a 20 57 65 20 6d 75 73 74 20  if.../* We must 
13d50 72 65 6d 6f 76 65 20 74 68 65 20 22 37 43 22 20  remove the "7C" 
13d60 74 61 67 20 74 6f 20 67 65 74 20 74 6f 20 74 68  tag to get to th
13d70 65 20 73 69 67 6e 61 74 75 72 65 20 2a 2f 0a 09  e signature */..
13d80 73 77 69 74 63 68 20 28 69 64 5f 74 79 70 65 29  switch (id_type)
13d90 20 7b 0a 09 09 63 61 73 65 20 43 41 43 4b 45 59   {...case CACKEY
13da0 5f 49 44 5f 54 59 50 45 5f 50 49 56 3a 0a 09 09  _ID_TYPE_PIV:...
13db0 09 6f 75 74 62 75 66 5f 6c 65 6e 20 3d 20 72 65  .outbuf_len = re
13dc0 74 76 61 6c 3b 0a 09 09 09 6f 75 74 62 75 66 5f  tval;....outbuf_
13dd0 70 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f  p = cackey_read_
13de0 62 65 72 74 6c 76 5f 74 61 67 28 6f 75 74 62 75  bertlv_tag(outbu
13df0 66 2c 20 26 6f 75 74 62 75 66 5f 6c 65 6e 2c 20  f, &outbuf_len, 
13e00 30 78 37 43 2c 20 4e 55 4c 4c 2c 20 20 26 6f 75  0x7C, NULL,  &ou
13e10 74 62 75 66 5f 6c 65 6e 29 3b 0a 09 09 09 69 66  tbuf_len);....if
13e20 20 28 6f 75 74 62 75 66 5f 70 20 3d 3d 20 4e 55   (outbuf_p == NU
13e30 4c 4c 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59  LL) {.....CACKEY
13e40 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
13e50 65 73 70 6f 6e 73 65 20 66 72 6f 6d 20 50 49 56  esponse from PIV
13e60 20 66 6f 72 20 47 45 4e 45 52 41 54 45 20 41 55   for GENERATE AU
13e70 54 48 45 4e 54 49 43 41 54 49 4f 4e 20 77 61 73  THENTICATION was
13e80 20 6e 6f 74 20 61 20 30 78 37 43 20 74 61 67 2c   not a 0x7C tag,
13e90 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61   returning in fa
13ea0 69 6c 75 72 65 22 29 3b 0a 0a 09 09 09 09 72 65  ilure");......re
13eb0 74 75 72 6e 28 2d 31 29 3b 0a 09 09 09 7d 0a 0a  turn(-1);....}..
13ec0 09 09 09 72 65 74 76 61 6c 20 3d 20 6f 75 74 62  ...retval = outb
13ed0 75 66 5f 6c 65 6e 3b 0a 0a 09 09 09 6f 75 74 62  uf_len;.....outb
13ee0 75 66 5f 6c 65 6e 20 3d 20 72 65 74 76 61 6c 3b  uf_len = retval;
13ef0 0a 09 09 09 6f 75 74 62 75 66 5f 70 20 3d 20 63  ....outbuf_p = c
13f00 61 63 6b 65 79 5f 72 65 61 64 5f 62 65 72 74 6c  ackey_read_bertl
13f10 76 5f 74 61 67 28 6f 75 74 62 75 66 2c 20 26 6f  v_tag(outbuf, &o
13f20 75 74 62 75 66 5f 6c 65 6e 2c 20 30 78 38 32 2c  utbuf_len, 0x82,
13f30 20 4e 55 4c 4c 2c 20 20 26 6f 75 74 62 75 66 5f   NULL,  &outbuf_
13f40 6c 65 6e 29 3b 0a 09 09 09 69 66 20 28 6f 75 74  len);....if (out
13f50 62 75 66 5f 70 20 3d 3d 20 4e 55 4c 4c 29 20 7b  buf_p == NULL) {
13f60 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
13f70 47 5f 50 52 49 4e 54 46 28 22 52 65 73 70 6f 6e  G_PRINTF("Respon
13f80 73 65 20 66 72 6f 6d 20 50 49 56 20 66 6f 72 20  se from PIV for 
13f90 47 45 4e 45 52 41 54 45 20 41 55 54 48 45 4e 54  GENERATE AUTHENT
13fa0 49 43 41 54 49 4f 4e 20 77 61 73 20 6e 6f 74 20  ICATION was not 
13fb0 61 20 30 78 38 32 20 77 69 74 68 69 6e 20 61 20  a 0x82 within a 
13fc0 30 78 37 43 20 74 61 67 2c 20 72 65 74 75 72 6e  0x7C tag, return
13fd0 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29  ing in failure")
13fe0 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 2d 31  ;......return(-1
13ff0 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 72 65 74 76  );....}.....retv
14000 61 6c 20 3d 20 6f 75 74 62 75 66 5f 6c 65 6e 3b  al = outbuf_len;
14010 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 63 61  .....break;...ca
14020 73 65 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50  se CACKEY_ID_TYP
14030 45 5f 43 41 43 3a 0a 09 09 63 61 73 65 20 43 41  E_CAC:...case CA
14040 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43 45 52  CKEY_ID_TYPE_CER
14050 54 5f 4f 4e 4c 59 3a 0a 09 09 09 62 72 65 61 6b  T_ONLY:....break
14060 3b 0a 09 7d 0a 0a 09 2f 2a 20 55 6e 70 61 64 20  ;..}.../* Unpad 
14070 72 65 70 6c 79 20 2a 2f 0a 09 69 66 20 28 75 6e  reply */..if (un
14080 70 61 64 4f 75 74 70 75 74 29 20 7b 0a 09 09 69  padOutput) {...i
14090 66 20 28 72 65 74 76 61 6c 20 3c 20 33 29 20 7b  f (retval < 3) {
140a0 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
140b0 5f 50 52 49 4e 54 46 28 22 52 65 70 6c 79 20 69  _PRINTF("Reply i
140c0 73 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20 77 65 20  s too small, we 
140d0 61 72 65 20 6e 6f 74 20 61 62 6c 65 20 74 6f 20  are not able to 
140e0 75 6e 70 61 64 20 2d 2d 20 70 61 73 73 69 6e 67  unpad -- passing
140f0 20 62 61 63 6b 20 61 6e 64 20 68 6f 70 69 6e 67   back and hoping
14100 20 66 6f 72 20 74 68 65 20 62 65 73 74 21 22 29   for the best!")
14110 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ;.....CACKEY_DEB
14120 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
14130 6e 69 6e 67 20 69 6e 20 73 75 63 63 65 73 73 2c  ning in success,
14140 20 72 65 74 76 61 6c 20 3d 20 25 6c 69 20 28 62   retval = %li (b
14150 79 74 65 73 29 22 2c 20 28 6c 6f 6e 67 29 20 72  ytes)", (long) r
14160 65 74 76 61 6c 29 3b 0a 09 09 09 72 65 74 75 72  etval);....retur
14170 6e 28 72 65 74 76 61 6c 29 3b 0a 09 09 7d 0a 0a  n(retval);...}..
14180 09 09 69 66 20 28 6f 75 74 62 75 66 5b 30 5d 20  ..if (outbuf[0] 
14190 21 3d 20 30 78 30 30 29 20 7b 0a 09 09 09 43 41  != 0x00) {....CA
141a0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
141b0 46 28 22 55 6e 72 65 63 6f 67 6e 69 7a 65 64 20  F("Unrecognized 
141c0 70 61 64 64 69 6e 67 20 73 63 68 65 6d 65 20 2d  padding scheme -
141d0 2d 20 70 61 73 73 69 6e 67 20 62 61 63 6b 20 61  - passing back a
141e0 6e 64 20 68 6f 70 69 6e 67 20 66 6f 72 20 74 68  nd hoping for th
141f0 65 20 62 65 73 74 21 22 29 3b 0a 0a 09 09 09 43  e best!");.....C
14200 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
14210 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e  TF("Returning in
14220 20 73 75 63 63 65 73 73 2c 20 72 65 74 76 61 6c   success, retval
14230 20 3d 20 25 6c 69 20 28 62 79 74 65 73 29 22 2c   = %li (bytes)",
14240 20 28 6c 6f 6e 67 29 20 72 65 74 76 61 6c 29 3b   (long) retval);
14250 0a 09 09 09 72 65 74 75 72 6e 28 72 65 74 76 61  ....return(retva
14260 6c 29 3b 0a 09 09 7d 0a 0a 09 09 62 6c 6f 63 6b  l);...}....block
14270 74 79 70 65 20 3d 20 6f 75 74 62 75 66 5b 31 5d  type = outbuf[1]
14280 3b 0a 09 09 75 6e 70 61 64 6f 66 66 73 65 74 20  ;...unpadoffset 
14290 3d 20 30 3b 0a 0a 09 09 73 77 69 74 63 68 20 28  = 0;....switch (
142a0 62 6c 6f 63 6b 74 79 70 65 29 20 7b 0a 09 09 09  blocktype) {....
142b0 63 61 73 65 20 30 78 30 30 3a 0a 09 09 09 09 2f  case 0x00:...../
142c0 2a 20 50 61 64 64 69 6e 67 20 53 63 68 65 6d 65  * Padding Scheme
142d0 20 31 2c 20 74 68 65 20 66 69 72 73 74 20 6e 6f   1, the first no
142e0 6e 2d 7a 65 72 6f 20 62 79 74 65 20 69 73 20 74  n-zero byte is t
142f0 68 65 20 73 74 61 72 74 20 6f 66 20 64 61 74 61  he start of data
14300 20 2a 2f 0a 09 09 09 09 66 6f 72 20 28 75 6e 70   */.....for (unp
14310 61 64 6f 66 66 73 65 74 20 3d 20 32 3b 20 75 6e  adoffset = 2; un
14320 70 61 64 6f 66 66 73 65 74 20 3c 20 72 65 74 76  padoffset < retv
14330 61 6c 3b 20 75 6e 70 61 64 6f 66 66 73 65 74 2b  al; unpadoffset+
14340 2b 29 20 7b 0a 09 09 09 09 09 69 66 20 28 6f 75  +) {......if (ou
14350 74 62 75 66 5b 75 6e 70 61 64 6f 66 66 73 65 74  tbuf[unpadoffset
14360 5d 20 21 3d 20 30 78 30 30 29 20 7b 0a 09 09 09  ] != 0x00) {....
14370 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 7d  ...break;......}
14380 0a 09 09 09 09 7d 0a 09 09 09 09 62 72 65 61 6b  .....}.....break
14390 3b 0a 09 09 09 63 61 73 65 20 30 78 30 31 3a 0a  ;....case 0x01:.
143a0 09 09 09 09 2f 2a 20 50 61 64 64 69 6e 67 20 53  ..../* Padding S
143b0 63 68 65 6d 65 20 32 2c 20 70 61 64 20 62 79 74  cheme 2, pad byt
143c0 65 73 20 61 72 65 20 30 78 46 46 20 66 6f 6c 6c  es are 0xFF foll
143d0 6f 77 65 64 20 62 79 20 30 78 30 30 20 2a 2f 0a  owed by 0x00 */.
143e0 09 09 09 09 66 6f 72 20 28 75 6e 70 61 64 6f 66  ....for (unpadof
143f0 66 73 65 74 20 3d 20 32 3b 20 75 6e 70 61 64 6f  fset = 2; unpado
14400 66 66 73 65 74 20 3c 20 72 65 74 76 61 6c 3b 20  ffset < retval; 
14410 75 6e 70 61 64 6f 66 66 73 65 74 2b 2b 29 20 7b  unpadoffset++) {
14420 0a 09 09 09 09 09 69 66 20 28 6f 75 74 62 75 66  ......if (outbuf
14430 5b 75 6e 70 61 64 6f 66 66 73 65 74 5d 20 21 3d  [unpadoffset] !=
14440 20 30 78 46 46 29 20 7b 0a 09 09 09 09 09 09 69   0xFF) {.......i
14450 66 20 28 6f 75 74 62 75 66 5b 75 6e 70 61 64 6f  f (outbuf[unpado
14460 66 66 73 65 74 5d 20 3d 3d 20 30 78 30 30 29 20  ffset] == 0x00) 
14470 7b 0a 09 09 09 09 09 09 09 75 6e 70 61 64 6f 66  {........unpadof
14480 66 73 65 74 2b 2b 3b 0a 0a 09 09 09 09 09 09 09  fset++;.........
14490 62 72 65 61 6b 3b 0a 09 09 09 09 09 09 7d 20 65  break;.......} e
144a0 6c 73 65 20 7b 0a 09 09 09 09 09 09 09 43 41 43  lse {........CAC
144b0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
144c0 28 22 49 6e 76 61 6c 69 64 20 70 61 64 64 69 6e  ("Invalid paddin
144d0 67 20 64 61 74 61 20 66 6f 75 6e 64 2c 20 72 65  g data found, re
144e0 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
144f0 72 65 2c 20 73 68 6f 75 6c 64 20 68 61 76 65 20  re, should have 
14500 62 65 65 6e 20 30 78 30 30 20 66 6f 75 6e 64 20  been 0x00 found 
14510 30 78 25 30 32 78 22 2c 20 28 75 6e 73 69 67 6e  0x%02x", (unsign
14520 65 64 20 69 6e 74 29 20 6f 75 74 62 75 66 5b 75  ed int) outbuf[u
14530 6e 70 61 64 6f 66 66 73 65 74 5d 29 3b 0a 0a 09  npadoffset]);...
14540 09 09 09 09 09 09 72 65 74 75 72 6e 28 2d 31 29  ......return(-1)
14550 3b 0a 09 09 09 09 09 09 7d 0a 09 09 09 09 09 7d  ;.......}......}
14560 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09 43 41   else {.......CA
14570 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
14580 46 28 22 49 6e 76 61 6c 69 64 20 70 61 64 64 69  F("Invalid paddi
14590 6e 67 20 64 61 74 61 20 66 6f 75 6e 64 2c 20 72  ng data found, r
145a0 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
145b0 75 72 65 2c 20 73 68 6f 75 6c 64 20 68 61 76 65  ure, should have
145c0 20 62 65 65 6e 20 30 78 46 46 20 66 6f 75 6e 64   been 0xFF found
145d0 20 30 78 25 30 32 78 22 2c 20 28 75 6e 73 69 67   0x%02x", (unsig
145e0 6e 65 64 20 69 6e 74 29 20 6f 75 74 62 75 66 5b  ned int) outbuf[
145f0 75 6e 70 61 64 6f 66 66 73 65 74 5d 29 3b 0a 0a  unpadoffset]);..
14600 09 09 09 09 09 09 72 65 74 75 72 6e 28 2d 31 29  ......return(-1)
14610 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 09  ;......}.....}..
14620 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
14630 65 20 30 78 30 32 3a 0a 09 09 09 09 2f 2a 20 50  e 0x02:...../* P
14640 61 64 64 69 6e 67 20 53 63 68 65 6d 65 20 33 2c  adding Scheme 3,
14650 20 70 61 64 20 62 79 74 65 73 20 61 72 65 20 6e   pad bytes are n
14660 6f 6e 2d 7a 65 72 6f 20 66 69 72 73 74 20 7a 65  on-zero first ze
14670 72 6f 20 62 79 74 65 20 66 6f 75 6e 64 20 69 73  ro byte found is
14680 20 74 68 65 20 73 65 70 65 72 61 74 6f 72 20 62   the seperator b
14690 79 74 65 20 2a 2f 0a 09 09 09 09 66 6f 72 20 28  yte */.....for (
146a0 75 6e 70 61 64 6f 66 66 73 65 74 20 3d 20 32 3b  unpadoffset = 2;
146b0 20 75 6e 70 61 64 6f 66 66 73 65 74 20 3c 20 72   unpadoffset < r
146c0 65 74 76 61 6c 3b 20 75 6e 70 61 64 6f 66 66 73  etval; unpadoffs
146d0 65 74 2b 2b 29 20 7b 0a 09 09 09 09 09 69 66 20  et++) {......if 
146e0 28 6f 75 74 62 75 66 5b 75 6e 70 61 64 6f 66 66  (outbuf[unpadoff
146f0 73 65 74 5d 20 3d 3d 20 30 78 30 30 29 20 7b 0a  set] == 0x00) {.
14700 09 09 09 09 09 09 75 6e 70 61 64 6f 66 66 73 65  ......unpadoffse
14710 74 2b 2b 3b 0a 0a 09 09 09 09 09 09 62 72 65 61  t++;........brea
14720 6b 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a  k;......}.....}.
14730 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a  ....break;...}..
14740 09 09 69 66 20 28 75 6e 70 61 64 6f 66 66 73 65  ..if (unpadoffse
14750 74 20 3e 20 72 65 74 76 61 6c 29 20 7b 0a 09 09  t > retval) {...
14760 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
14770 49 4e 54 46 28 22 4f 66 66 73 65 74 20 67 72 65  INTF("Offset gre
14780 61 74 65 72 20 74 68 61 6e 20 72 65 70 6c 79 20  ater than reply 
14790 73 69 7a 65 2c 20 61 62 6f 72 74 69 6e 67 2e 20  size, aborting. 
147a0 20 28 75 6e 70 61 64 6f 66 66 73 65 74 20 3d 20   (unpadoffset = 
147b0 25 6c 75 2c 20 72 65 74 76 61 6c 20 3d 20 25 6c  %lu, retval = %l
147c0 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  u)", (unsigned l
147d0 6f 6e 67 29 20 75 6e 70 61 64 6f 66 66 73 65 74  ong) unpadoffset
147e0 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
147f0 29 20 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09 72  ) retval);.....r
14800 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 0a  eturn(-1);...}..
14810 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
14820 52 49 4e 54 42 55 46 28 22 50 61 64 64 65 64 3a  RINTBUF("Padded:
14830 22 2c 20 6f 75 74 62 75 66 2c 20 72 65 74 76 61  ", outbuf, retva
14840 6c 29 3b 0a 0a 09 09 72 65 74 76 61 6c 20 2d 3d  l);....retval -=
14850 20 75 6e 70 61 64 6f 66 66 73 65 74 3b 0a 09 09   unpadoffset;...
14860 6d 65 6d 6d 6f 76 65 28 6f 75 74 62 75 66 2c 20  memmove(outbuf, 
14870 6f 75 74 62 75 66 20 2b 20 75 6e 70 61 64 6f 66  outbuf + unpadof
14880 66 73 65 74 2c 20 72 65 74 76 61 6c 29 3b 0a 0a  fset, retval);..
14890 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
148a0 52 49 4e 54 42 55 46 28 22 55 6e 70 61 64 64 65  RINTBUF("Unpadde
148b0 64 3a 22 2c 20 6f 75 74 62 75 66 2c 20 72 65 74  d:", outbuf, ret
148c0 76 61 6c 29 3b 0a 09 7d 0a 0a 0a 09 43 41 43 4b  val);..}....CACK
148d0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
148e0 22 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 73 75  "Returning in su
148f0 63 63 65 73 73 2c 20 72 65 74 76 61 6c 20 3d 20  ccess, retval = 
14900 25 6c 69 20 28 62 79 74 65 73 29 22 2c 20 28 6c  %li (bytes)", (l
14910 6f 6e 67 29 20 72 65 74 76 61 6c 29 3b 0a 0a 09  ong) retval);...
14920 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a  return(retval);.
14930 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49  }../*. * SYNPOSI
14940 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a  S. *     .... *.
14950 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20   * ARGUMENTS. * 
14960 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45      .... *. * RE
14970 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20  TURN VALUE. *   
14980 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45    .... *. * NOTE
14990 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a  S. *     .... *.
149a0 20 2a 2f 0a 73 74 61 74 69 63 20 63 61 63 6b 65   */.static cacke
149b0 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 74 6f 6b  y_ret cackey_tok
149c0 65 6e 5f 70 72 65 73 65 6e 74 28 73 74 72 75 63  en_present(struc
149d0 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73  t cackey_slot *s
149e0 6c 6f 74 29 20 7b 0a 09 63 61 63 6b 65 79 5f 72  lot) {..cackey_r
149f0 65 74 20 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f  et pcsc_connect_
14a00 72 65 74 3b 0a 09 44 57 4f 52 44 20 72 65 61 64  ret;..DWORD read
14a10 65 72 5f 6c 65 6e 20 3d 20 30 2c 20 73 74 61 74  er_len = 0, stat
14a20 65 20 3d 20 30 2c 20 70 72 6f 74 6f 63 6f 6c 20  e = 0, protocol 
14a30 3d 20 30 2c 20 61 74 72 5f 6c 65 6e 3b 0a 09 42  = 0, atr_len;..B
14a40 59 54 45 20 61 74 72 5b 4d 41 58 5f 41 54 52 5f  YTE atr[MAX_ATR_
14a50 53 49 5a 45 5d 3b 0a 09 4c 4f 4e 47 20 73 74 61  SIZE];..LONG sta
14a60 74 75 73 5f 72 65 74 2c 20 73 63 61 72 64 5f 72  tus_ret, scard_r
14a70 65 63 6f 6e 6e 5f 72 65 74 3b 0a 0a 09 43 41 43  econn_ret;...CAC
14a80 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
14a90 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
14aa0 66 20 28 73 6c 6f 74 2d 3e 69 6e 74 65 72 6e 61  f (slot->interna
14ab0 6c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  l) {...CACKEY_DE
14ac0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
14ad0 72 6e 69 6e 67 20 74 6f 6b 65 6e 20 70 72 65 73  rning token pres
14ae0 65 6e 74 20 28 69 6e 74 65 72 6e 61 6c 20 74 6f  ent (internal to
14af0 6b 65 6e 29 22 29 3b 0a 0a 09 09 72 65 74 75 72  ken)");....retur
14b00 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  n(CACKEY_PCSC_S_
14b10 54 4f 4b 45 4e 50 52 45 53 45 4e 54 29 3b 0a 09  TOKENPRESENT);..
14b20 7d 0a 0a 09 70 63 73 63 5f 63 6f 6e 6e 65 63 74  }...pcsc_connect
14b30 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 63 6f  _ret = cackey_co
14b40 6e 6e 65 63 74 5f 63 61 72 64 28 73 6c 6f 74 29  nnect_card(slot)
14b50 3b 0a 09 69 66 20 28 70 63 73 63 5f 63 6f 6e 6e  ;..if (pcsc_conn
14b60 65 63 74 5f 72 65 74 20 21 3d 20 43 41 43 4b 45  ect_ret != CACKE
14b70 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09  Y_PCSC_S_OK) {..
14b80 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
14b90 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20  INTF("Unable to 
14ba0 63 6f 6e 6e 65 63 74 20 74 6f 20 63 61 72 64 2c  connect to card,
14bb0 20 72 65 74 75 72 6e 69 6e 67 20 74 6f 6b 65 6e   returning token
14bc0 20 61 62 73 65 6e 74 22 29 3b 0a 0a 09 09 72 65   absent");....re
14bd0 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
14be0 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b  _E_TOKENABSENT);
14bf0 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
14c00 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 69  UG_PRINTF("Calli
14c10 6e 67 20 53 43 61 72 64 53 74 61 74 75 73 28 29  ng SCardStatus()
14c20 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 63 61   to determine ca
14c30 72 64 20 73 74 61 74 75 73 22 29 3b 0a 0a 09 61  rd status");...a
14c40 74 72 5f 6c 65 6e 20 3d 20 73 69 7a 65 6f 66 28  tr_len = sizeof(
14c50 61 74 72 29 3b 0a 09 73 74 61 74 75 73 5f 72 65  atr);..status_re
14c60 74 20 3d 20 53 43 61 72 64 53 74 61 74 75 73 28  t = SCardStatus(
14c70 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c  slot->pcsc_card,
14c80 20 4e 55 4c 4c 2c 20 26 72 65 61 64 65 72 5f 6c   NULL, &reader_l
14c90 65 6e 2c 20 26 73 74 61 74 65 2c 20 26 70 72 6f  en, &state, &pro
14ca0 74 6f 63 6f 6c 2c 20 61 74 72 2c 20 26 61 74 72  tocol, atr, &atr
14cb0 5f 6c 65 6e 29 3b 0a 0a 09 69 66 20 28 73 74 61  _len);...if (sta
14cc0 74 75 73 5f 72 65 74 20 3d 3d 20 53 43 41 52 44  tus_ret == SCARD
14cd0 5f 45 5f 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c  _E_INVALID_HANDL
14ce0 45 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  E) {...CACKEY_DE
14cf0 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43 61 72  BUG_PRINTF("SCar
14d00 64 53 74 61 74 75 73 28 29 20 72 65 74 75 72 6e  dStatus() return
14d10 65 64 20 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c  ed SCARD_E_INVAL
14d20 49 44 5f 48 41 4e 44 4c 45 2c 20 6d 61 72 6b 69  ID_HANDLE, marki
14d30 6e 67 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  ng is not alread
14d40 79 20 63 6f 6e 6e 65 63 74 65 64 20 61 6e 64 20  y connected and 
14d50 74 72 79 69 6e 67 20 61 67 61 69 6e 22 29 3b 0a  trying again");.
14d60 09 09 63 61 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c  ..cackey_mark_sl
14d70 6f 74 5f 72 65 73 65 74 28 73 6c 6f 74 29 3b 0a  ot_reset(slot);.
14d80 0a 09 09 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f  ...pcsc_connect_
14d90 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 63 6f 6e  ret = cackey_con
14da0 6e 65 63 74 5f 63 61 72 64 28 73 6c 6f 74 29 3b  nect_card(slot);
14db0 0a 09 09 69 66 20 28 70 63 73 63 5f 63 6f 6e 6e  ...if (pcsc_conn
14dc0 65 63 74 5f 72 65 74 20 21 3d 20 43 41 43 4b 45  ect_ret != CACKE
14dd0 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09  Y_PCSC_S_OK) {..
14de0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
14df0 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f  RINTF("Unable to
14e00 20 63 6f 6e 6e 65 63 74 20 74 6f 20 63 61 72 64   connect to card
14e10 2c 20 72 65 74 75 72 6e 69 6e 67 20 74 6f 6b 65  , returning toke
14e20 6e 20 61 62 73 65 6e 74 22 29 3b 0a 0a 09 09 09  n absent");.....
14e30 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
14e40 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54  SC_E_TOKENABSENT
14e50 29 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59  );...}....CACKEY
14e60 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
14e70 61 6c 6c 69 6e 67 20 53 43 61 72 64 53 74 61 74  alling SCardStat
14e80 75 73 28 29 20 61 67 61 69 6e 22 29 3b 0a 0a 09  us() again");...
14e90 09 61 74 72 5f 6c 65 6e 20 3d 20 73 69 7a 65 6f  .atr_len = sizeo
14ea0 66 28 61 74 72 29 3b 0a 09 09 73 74 61 74 75 73  f(atr);...status
14eb0 5f 72 65 74 20 3d 20 53 43 61 72 64 53 74 61 74  _ret = SCardStat
14ec0 75 73 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61  us(slot->pcsc_ca
14ed0 72 64 2c 20 4e 55 4c 4c 2c 20 26 72 65 61 64 65  rd, NULL, &reade
14ee0 72 5f 6c 65 6e 2c 20 26 73 74 61 74 65 2c 20 26  r_len, &state, &
14ef0 70 72 6f 74 6f 63 6f 6c 2c 20 61 74 72 2c 20 26  protocol, atr, &
14f00 61 74 72 5f 6c 65 6e 29 3b 0a 09 7d 0a 0a 09 69  atr_len);..}...i
14f10 66 20 28 73 74 61 74 75 73 5f 72 65 74 20 21 3d  f (status_ret !=
14f20 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53   SCARD_S_SUCCESS
14f30 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 61 72  ) {...cackey_mar
14f40 6b 5f 73 6c 6f 74 5f 72 65 73 65 74 28 73 6c 6f  k_slot_reset(slo
14f50 74 29 3b 0a 0a 09 09 69 66 20 28 73 74 61 74 75  t);....if (statu
14f60 73 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 57  s_ret == SCARD_W
14f70 5f 52 45 53 45 54 5f 43 41 52 44 29 20 7b 0a 09  _RESET_CARD) {..
14f80 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
14f90 52 49 4e 54 46 28 22 52 65 73 65 74 20 72 65 71  RINTF("Reset req
14fa0 75 69 72 65 64 2c 20 70 6c 65 61 73 65 20 68 6f  uired, please ho
14fb0 6c 64 2e 2e 2e 22 29 3b 0a 0a 09 09 09 73 63 61  ld...");.....sca
14fc0 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 74 20 3d 20  rd_reconn_ret = 
14fd0 63 61 63 6b 65 79 5f 72 65 63 6f 6e 6e 65 63 74  cackey_reconnect
14fe0 5f 63 61 72 64 28 73 6c 6f 74 2c 20 53 43 41 52  _card(slot, SCAR
14ff0 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 20 7c 20  D_PROTOCOL_T0 | 
15000 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54  SCARD_PROTOCOL_T
15010 31 29 3b 0a 09 09 09 69 66 20 28 73 63 61 72 64  1);....if (scard
15020 5f 72 65 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53  _reconn_ret == S
15030 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20  CARD_S_SUCCESS) 
15040 7b 0a 09 09 09 09 2f 2a 20 52 65 2d 65 73 74 61  {...../* Re-esta
15050 62 6c 69 73 68 20 74 72 61 6e 73 61 63 74 69 6f  blish transactio
15060 6e 2c 20 69 66 20 69 74 20 77 61 73 20 70 72 65  n, if it was pre
15070 73 65 6e 74 20 2a 2f 0a 09 09 09 09 69 66 20 28  sent */.....if (
15080 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f  slot->transactio
15090 6e 5f 64 65 70 74 68 20 3e 20 30 29 20 7b 0a 09  n_depth > 0) {..
150a0 09 09 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61  ....slot->transa
150b0 63 74 69 6f 6e 5f 64 65 70 74 68 2d 2d 3b 0a 09  ction_depth--;..
150c0 09 09 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61  ....slot->transa
150d0 63 74 69 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f  ction_need_hw_lo
150e0 63 6b 20 3d 20 31 3b 0a 09 09 09 09 09 63 61 63  ck = 1;......cac
150f0 6b 65 79 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61  key_begin_transa
15100 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 09 09 09  ction(slot);....
15110 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  .}......CACKEY_D
15120 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 73  EBUG_PRINTF("Res
15130 65 74 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72  et successful, r
15140 65 71 75 65 72 79 69 6e 67 22 29 3b 0a 09 09 09  equerying");....
15150 09 73 74 61 74 75 73 5f 72 65 74 20 3d 20 53 43  .status_ret = SC
15160 61 72 64 53 74 61 74 75 73 28 73 6c 6f 74 2d 3e  ardStatus(slot->
15170 70 63 73 63 5f 63 61 72 64 2c 20 4e 55 4c 4c 2c  pcsc_card, NULL,
15180 20 26 72 65 61 64 65 72 5f 6c 65 6e 2c 20 26 73   &reader_len, &s
15190 74 61 74 65 2c 20 26 70 72 6f 74 6f 63 6f 6c 2c  tate, &protocol,
151a0 20 61 74 72 2c 20 26 61 74 72 5f 6c 65 6e 29 3b   atr, &atr_len);
151b0 0a 09 09 09 09 69 66 20 28 73 74 61 74 75 73 5f  .....if (status_
151c0 72 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f 53  ret != SCARD_S_S
151d0 55 43 43 45 53 53 29 20 7b 0a 09 09 09 09 09 43  UCCESS) {......C
151e0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
151f0 54 46 28 22 53 74 69 6c 6c 20 75 6e 61 62 6c 65  TF("Still unable
15200 20 74 6f 20 71 75 65 72 79 20 63 61 72 64 20 73   to query card s
15210 74 61 74 75 73 2c 20 72 65 74 75 72 6e 69 6e 67  tatus, returning
15220 20 74 6f 6b 65 6e 20 61 62 73 65 6e 74 2e 20 20   token absent.  
15230 53 43 61 72 64 53 74 61 74 75 73 28 29 20 3d 20  SCardStatus() = 
15240 25 73 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55  %s", CACKEY_DEBU
15250 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f  G_FUNC_SCARDERR_
15260 54 4f 5f 53 54 52 28 73 74 61 74 75 73 5f 72 65  TO_STR(status_re
15270 74 29 29 3b 0a 0a 09 09 09 09 09 72 65 74 75 72  t));.......retur
15280 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  n(CACKEY_PCSC_E_
15290 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b 0a 09 09  TOKENABSENT);...
152a0 09 09 7d 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a  ..}....} else {.
152b0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
152c0 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20  _PRINTF("Unable 
152d0 74 6f 20 72 65 63 6f 6e 6e 65 63 74 20 74 6f 20  to reconnect to 
152e0 63 61 72 64 2c 20 72 65 74 75 72 6e 69 6e 67 20  card, returning 
152f0 74 6f 6b 65 6e 20 61 62 73 65 6e 74 2e 20 20 53  token absent.  S
15300 43 61 72 64 52 65 63 6f 6e 6e 65 63 74 28 29 20  CardReconnect() 
15310 3d 20 25 73 22 2c 20 43 41 43 4b 45 59 5f 44 45  = %s", CACKEY_DE
15320 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52  BUG_FUNC_SCARDER
15330 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 5f 72  R_TO_STR(scard_r
15340 65 63 6f 6e 6e 5f 72 65 74 29 29 3b 0a 0a 09 09  econn_ret));....
15350 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
15360 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45  PCSC_E_TOKENABSE
15370 4e 54 29 3b 0a 09 09 09 7d 0a 09 09 7d 20 65 6c  NT);....}...} el
15380 73 65 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  se {....CACKEY_D
15390 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61  EBUG_PRINTF("Una
153a0 62 6c 65 20 74 6f 20 71 75 65 72 79 20 63 61 72  ble to query car
153b0 64 20 73 74 61 74 75 73 2c 20 72 65 74 75 72 6e  d status, return
153c0 69 6e 67 20 74 6f 6b 65 6e 20 61 62 73 65 6e 74  ing token absent
153d0 2e 20 20 53 43 61 72 64 53 74 61 74 75 73 28 29  .  SCardStatus()
153e0 20 3d 20 25 73 22 2c 20 43 41 43 4b 45 59 5f 44   = %s", CACKEY_D
153f0 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45  EBUG_FUNC_SCARDE
15400 52 52 5f 54 4f 5f 53 54 52 28 73 74 61 74 75 73  RR_TO_STR(status
15410 5f 72 65 74 29 29 3b 0a 0a 09 09 09 72 65 74 75  _ret));.....retu
15420 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  rn(CACKEY_PCSC_E
15430 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b 0a 09  _TOKENABSENT);..
15440 09 7d 0a 09 7d 0a 0a 09 69 66 20 28 28 73 74 61  .}..}...if ((sta
15450 74 65 20 26 20 53 43 41 52 44 5f 41 42 53 45 4e  te & SCARD_ABSEN
15460 54 29 20 3d 3d 20 53 43 41 52 44 5f 41 42 53 45  T) == SCARD_ABSE
15470 4e 54 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  NT) {...CACKEY_D
15480 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 72  EBUG_PRINTF("Car
15490 64 20 69 73 20 61 62 73 65 6e 74 2c 20 72 65 74  d is absent, ret
154a0 75 72 6e 69 6e 67 20 74 6f 6b 65 6e 20 61 62 73  urning token abs
154b0 65 6e 74 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ent");....return
154c0 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54  (CACKEY_PCSC_E_T
154d0 4f 4b 45 4e 41 42 53 45 4e 54 29 3b 0a 09 7d 0a  OKENABSENT);..}.
154e0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
154f0 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
15500 20 74 6f 6b 65 6e 20 70 72 65 73 65 6e 74 2e 22   token present."
15510 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41 43 4b  );...return(CACK
15520 45 59 5f 50 43 53 43 5f 53 5f 54 4f 4b 45 4e 50  EY_PCSC_S_TOKENP
15530 52 45 53 45 4e 54 29 3b 0a 7d 0a 0a 2f 2a 0a 20  RESENT);.}../*. 
15540 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20  * SYNPOSIS. *   
15550 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55    .... *. * ARGU
15560 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e  MENTS. *     ...
15570 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41  . *. * RETURN VA
15580 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20  LUE. *     .... 
15590 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20  *. * NOTES. *   
155a0 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61    .... *. */.sta
155b0 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74 20 63  tic cackey_ret c
155c0 61 63 6b 65 79 5f 73 65 74 5f 70 69 6e 28 73 74  ackey_set_pin(st
155d0 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74  ruct cackey_slot
155e0 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64   *slot, unsigned
155f0 20 63 68 61 72 20 2a 6f 6c 64 5f 70 69 6e 2c 20   char *old_pin, 
15600 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6f 6c  unsigned long ol
15610 64 5f 70 69 6e 5f 6c 65 6e 2c 20 75 6e 73 69 67  d_pin_len, unsig
15620 6e 65 64 20 63 68 61 72 20 2a 70 69 6e 2c 20 75  ned char *pin, u
15630 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 70 69 6e  nsigned long pin
15640 5f 6c 65 6e 29 20 7b 0a 09 73 74 72 75 63 74 20  _len) {..struct 
15650 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e  cackey_pcsc_iden
15660 74 69 74 79 20 2a 70 63 73 63 5f 69 64 65 6e 74  tity *pcsc_ident
15670 69 74 69 65 73 3b 0a 09 75 6e 73 69 67 6e 65 64  ities;..unsigned
15680 20 63 68 61 72 20 63 61 63 5f 70 69 6e 5b 38 5d   char cac_pin[8]
15690 20 3d 20 7b 30 78 46 46 2c 20 30 78 46 46 2c 20   = {0xFF, 0xFF, 
156a0 30 78 46 46 2c 20 30 78 46 46 2c 20 30 78 46 46  0xFF, 0xFF, 0xFF
156b0 2c 20 30 78 46 46 2c 20 30 78 46 46 2c 20 30 78  , 0xFF, 0xFF, 0x
156c0 46 46 7d 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63  FF};..unsigned c
156d0 68 61 72 20 6f 6c 64 5f 63 61 63 5f 70 69 6e 5b  har old_cac_pin[
156e0 38 5d 20 3d 20 7b 30 78 46 46 2c 20 30 78 46 46  8] = {0xFF, 0xFF
156f0 2c 20 30 78 46 46 2c 20 30 78 46 46 2c 20 30 78  , 0xFF, 0xFF, 0x
15700 46 46 2c 20 30 78 46 46 2c 20 30 78 46 46 2c 20  FF, 0xFF, 0xFF, 
15710 30 78 46 46 7d 3b 0a 09 75 6e 73 69 67 6e 65 64  0xFF};..unsigned
15720 20 63 68 61 72 20 70 69 6e 5f 75 70 64 61 74 65   char pin_update
15730 5b 73 69 7a 65 6f 66 28 63 61 63 5f 70 69 6e 29  [sizeof(cac_pin)
15740 20 2b 20 73 69 7a 65 6f 66 28 6f 6c 64 5f 63 61   + sizeof(old_ca
15750 63 5f 70 69 6e 29 5d 3b 0a 09 75 6e 73 69 67 6e  c_pin)];..unsign
15760 65 64 20 6c 6f 6e 67 20 6e 75 6d 5f 63 65 72 74  ed long num_cert
15770 73 3b 0a 09 75 69 6e 74 31 36 5f 74 20 72 65 73  s;..uint16_t res
15780 70 6f 6e 73 65 5f 63 6f 64 65 3b 0a 09 69 6e 74  ponse_code;..int
15790 20 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67   tries_remaining
157a0 3b 0a 09 69 6e 74 20 73 65 6e 64 5f 72 65 74 3b  ;..int send_ret;
157b0 0a 09 69 6e 74 20 6b 65 79 5f 72 65 66 65 72 65  ..int key_refere
157c0 6e 63 65 20 3d 20 30 78 30 30 3b 0a 0a 09 2f 2a  nce = 0x00;.../*
157d0 20 41 70 70 61 72 65 6e 74 6c 79 2c 20 43 41 43   Apparently, CAC
157e0 20 50 49 4e 73 20 61 72 65 20 2a 45 58 41 43 54   PINs are *EXACT
157f0 4c 59 2a 20 38 20 62 79 74 65 73 20 6c 6f 6e 67  LY* 8 bytes long
15800 20 2d 2d 20 70 61 64 20 77 69 74 68 20 30 78 46   -- pad with 0xF
15810 46 20 69 66 20 74 6f 6f 20 73 68 6f 72 74 20 2a  F if too short *
15820 2f 0a 09 69 66 20 28 70 69 6e 5f 6c 65 6e 20 3e  /..if (pin_len >
15830 3d 20 38 29 20 7b 0a 09 09 6d 65 6d 63 70 79 28  = 8) {...memcpy(
15840 63 61 63 5f 70 69 6e 2c 20 70 69 6e 2c 20 38 29  cac_pin, pin, 8)
15850 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 6d 65  ;..} else {...me
15860 6d 63 70 79 28 63 61 63 5f 70 69 6e 2c 20 70 69  mcpy(cac_pin, pi
15870 6e 2c 20 70 69 6e 5f 6c 65 6e 29 3b 0a 09 7d 0a  n, pin_len);..}.
15880 0a 09 69 66 20 28 6f 6c 64 5f 70 69 6e 5f 6c 65  ..if (old_pin_le
15890 6e 20 3e 3d 20 38 29 20 7b 0a 09 09 6d 65 6d 63  n >= 8) {...memc
158a0 70 79 28 6f 6c 64 5f 63 61 63 5f 70 69 6e 2c 20  py(old_cac_pin, 
158b0 6f 6c 64 5f 70 69 6e 2c 20 38 29 3b 0a 09 7d 20  old_pin, 8);..} 
158c0 65 6c 73 65 20 7b 0a 09 09 6d 65 6d 63 70 79 28  else {...memcpy(
158d0 6f 6c 64 5f 63 61 63 5f 70 69 6e 2c 20 6f 6c 64  old_cac_pin, old
158e0 5f 70 69 6e 2c 20 6f 6c 64 5f 70 69 6e 5f 6c 65  _pin, old_pin_le
158f0 6e 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 43 6f 6e 63  n);..}.../* Conc
15900 61 74 65 6e 61 74 65 20 62 6f 74 68 20 50 49 4e  atenate both PIN
15910 73 20 74 6f 67 65 74 68 65 72 20 74 6f 20 73 65  s together to se
15920 6e 64 20 61 73 20 61 20 73 69 6e 67 6c 65 20 69  nd as a single i
15930 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 09 6d  nstruction */..m
15940 65 6d 63 70 79 28 70 69 6e 5f 75 70 64 61 74 65  emcpy(pin_update
15950 2c 20 6f 6c 64 5f 63 61 63 5f 70 69 6e 2c 20 73  , old_cac_pin, s
15960 69 7a 65 6f 66 28 6f 6c 64 5f 63 61 63 5f 70 69  izeof(old_cac_pi
15970 6e 29 29 3b 0a 09 6d 65 6d 63 70 79 28 70 69 6e  n));..memcpy(pin
15980 5f 75 70 64 61 74 65 20 2b 20 73 69 7a 65 6f 66  _update + sizeof
15990 28 6f 6c 64 5f 63 61 63 5f 70 69 6e 29 2c 20 63  (old_cac_pin), c
159a0 61 63 5f 70 69 6e 2c 20 73 69 7a 65 6f 66 28 63  ac_pin, sizeof(c
159b0 61 63 5f 70 69 6e 29 29 3b 0a 0a 09 2f 2a 20 52  ac_pin));.../* R
159c0 65 6a 65 63 74 20 50 49 4e 73 20 77 68 69 63 68  eject PINs which
159d0 20 61 72 65 20 74 6f 6f 20 73 68 6f 72 74 20 2a   are too short *
159e0 2f 0a 09 69 66 20 28 70 69 6e 5f 6c 65 6e 20 3c  /..if (pin_len <
159f0 20 35 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   5) {...CACKEY_D
15a00 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 6a  EBUG_PRINTF("Rej
15a10 65 63 74 69 6e 67 20 4e 65 77 20 50 49 4e 20 77  ecting New PIN w
15a20 68 69 63 68 20 69 73 20 74 6f 6f 20 73 68 6f 72  hich is too shor
15a30 74 20 28 6c 65 6e 67 74 68 20 3d 20 25 6c 75 2c  t (length = %lu,
15a40 20 6d 75 73 74 20 62 65 20 61 74 6c 65 61 73 74   must be atleast
15a50 20 35 29 22 2c 20 70 69 6e 5f 6c 65 6e 29 3b 0a   5)", pin_len);.
15a60 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
15a70 5f 50 43 53 43 5f 45 5f 42 41 44 50 49 4e 29 3b  _PCSC_E_BADPIN);
15a80 0a 09 7d 0a 0a 09 69 66 20 28 6f 6c 64 5f 70 69  ..}...if (old_pi
15a90 6e 5f 6c 65 6e 20 3c 20 35 29 20 7b 0a 09 09 43  n_len < 5) {...C
15aa0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
15ab0 54 46 28 22 52 65 6a 65 63 74 69 6e 67 20 4f 6c  TF("Rejecting Ol
15ac0 64 20 50 49 4e 20 77 68 69 63 68 20 69 73 20 74  d PIN which is t
15ad0 6f 6f 20 73 68 6f 72 74 20 28 6c 65 6e 67 74 68  oo short (length
15ae0 20 3d 20 25 6c 75 2c 20 6d 75 73 74 20 62 65 20   = %lu, must be 
15af0 61 74 6c 65 61 73 74 20 35 29 22 2c 20 6f 6c 64  atleast 5)", old
15b00 5f 70 69 6e 5f 6c 65 6e 29 3b 0a 0a 09 09 72 65  _pin_len);....re
15b10 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
15b20 5f 45 5f 42 41 44 50 49 4e 29 3b 0a 09 7d 0a 0a  _E_BADPIN);..}..
15b30 09 2f 2a 20 50 49 56 20 61 75 74 68 65 6e 74 69  ./* PIV authenti
15b40 63 61 74 69 6f 6e 20 75 73 65 73 20 61 20 22 6b  cation uses a "k
15b50 65 79 5f 72 65 66 65 72 65 6e 63 65 22 20 6f 66  ey_reference" of
15b60 20 30 78 38 30 20 2a 2f 0a 09 70 63 73 63 5f 69   0x80 */..pcsc_i
15b70 64 65 6e 74 69 74 69 65 73 20 3d 20 63 61 63 6b  dentities = cack
15b80 65 79 5f 72 65 61 64 5f 63 65 72 74 73 28 73 6c  ey_read_certs(sl
15b90 6f 74 2c 20 4e 55 4c 4c 2c 20 26 6e 75 6d 5f 63  ot, NULL, &num_c
15ba0 65 72 74 73 29 3b 0a 09 69 66 20 28 6e 75 6d 5f  erts);..if (num_
15bb0 63 65 72 74 73 20 3e 20 30 20 26 26 20 70 63 73  certs > 0 && pcs
15bc0 63 5f 69 64 65 6e 74 69 74 69 65 73 20 21 3d 20  c_identities != 
15bd0 4e 55 4c 4c 29 20 7b 0a 09 09 73 77 69 74 63 68  NULL) {...switch
15be0 20 28 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65   (pcsc_identitie
15bf0 73 5b 30 5d 2e 69 64 5f 74 79 70 65 29 20 7b 0a  s[0].id_type) {.
15c00 09 09 09 63 61 73 65 20 43 41 43 4b 45 59 5f 49  ...case CACKEY_I
15c10 44 5f 54 59 50 45 5f 50 49 56 3a 0a 09 09 09 09  D_TYPE_PIV:.....
15c20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
15c30 4e 54 46 28 22 57 65 20 68 61 76 65 20 50 49 56  NTF("We have PIV
15c40 20 63 61 72 64 2c 20 73 6f 20 77 65 20 77 69 6c   card, so we wil
15c50 6c 20 61 74 74 65 6d 70 74 20 74 6f 20 61 75 74  l attempt to aut
15c60 68 65 6e 74 69 63 61 74 65 20 75 73 69 6e 67 20  henticate using 
15c70 74 68 65 20 50 49 56 20 41 70 70 6c 69 63 61 74  the PIV Applicat
15c80 69 6f 6e 20 6b 65 79 20 72 65 66 65 72 65 6e 63  ion key referenc
15c90 65 22 29 3b 0a 0a 09 09 09 09 6b 65 79 5f 72 65  e");......key_re
15ca0 66 65 72 65 6e 63 65 20 3d 20 30 78 38 30 3b 0a  ference = 0x80;.
15cb0 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 64 65  ....break;....de
15cc0 66 61 75 6c 74 3a 0a 09 09 09 09 62 72 65 61 6b  fault:.....break
15cd0 3b 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f  ;...}....cackey_
15ce0 66 72 65 65 5f 63 65 72 74 73 28 70 63 73 63 5f  free_certs(pcsc_
15cf0 69 64 65 6e 74 69 74 69 65 73 2c 20 6e 75 6d 5f  identities, num_
15d00 63 65 72 74 73 2c 20 31 29 3b 0a 09 7d 0a 0a 09  certs, 1);..}...
15d10 2f 2a 20 49 73 73 75 65 20 61 20 53 65 74 20 50  /* Issue a Set P
15d20 49 4e 20 28 43 48 41 4e 47 45 20 52 45 46 45 52  IN (CHANGE REFER
15d30 45 4e 43 45 29 20 2a 2f 0a 09 73 65 6e 64 5f 72  ENCE) */..send_r
15d40 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64  et = cackey_send
15d50 5f 61 70 64 75 28 73 6c 6f 74 2c 20 47 53 43 49  _apdu(slot, GSCI
15d60 53 5f 43 4c 41 53 53 5f 49 53 4f 37 38 31 36 2c  S_CLASS_ISO7816,
15d70 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 43 48 41   GSCIS_INSTR_CHA
15d80 4e 47 45 5f 52 45 46 45 52 45 4e 43 45 2c 20 30  NGE_REFERENCE, 0
15d90 78 30 30 2c 20 6b 65 79 5f 72 65 66 65 72 65 6e  x00, key_referen
15da0 63 65 2c 20 73 69 7a 65 6f 66 28 70 69 6e 5f 75  ce, sizeof(pin_u
15db0 70 64 61 74 65 29 2c 20 70 69 6e 5f 75 70 64 61  pdate), pin_upda
15dc0 74 65 2c 20 30 78 30 30 2c 20 26 72 65 73 70 6f  te, 0x00, &respo
15dd0 6e 73 65 5f 63 6f 64 65 2c 20 4e 55 4c 4c 2c 20  nse_code, NULL, 
15de0 4e 55 4c 4c 29 3b 0a 0a 09 69 66 20 28 73 65 6e  NULL);...if (sen
15df0 64 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f  d_ret != CACKEY_
15e00 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 69  PCSC_S_OK) {...i
15e10 66 20 28 28 72 65 73 70 6f 6e 73 65 5f 63 6f 64  f ((response_cod
15e20 65 20 26 20 30 78 36 33 43 30 29 20 3d 3d 20 30  e & 0x63C0) == 0
15e30 78 36 33 43 30 29 20 7b 0a 09 09 09 74 72 69 65  x63C0) {....trie
15e40 73 5f 72 65 6d 61 69 6e 69 6e 67 20 3d 20 28 72  s_remaining = (r
15e50 65 73 70 6f 6e 73 65 5f 63 6f 64 65 20 26 20 30  esponse_code & 0
15e60 78 46 29 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f  xF);.....CACKEY_
15e70 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 50 49  DEBUG_PRINTF("PI
15e80 4e 20 56 65 72 69 66 69 63 61 74 69 6f 6e 20 66  N Verification f
15e90 61 69 6c 65 64 2c 20 25 69 20 74 72 69 65 73 20  ailed, %i tries 
15ea0 72 65 6d 61 69 6e 69 6e 67 22 2c 20 74 72 69 65  remaining", trie
15eb0 73 5f 72 65 6d 61 69 6e 69 6e 67 29 3b 0a 0a 09  s_remaining);...
15ec0 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
15ed0 50 43 53 43 5f 45 5f 42 41 44 50 49 4e 29 3b 0a  PCSC_E_BADPIN);.
15ee0 09 09 7d 0a 0a 09 09 69 66 20 28 72 65 73 70 6f  ..}....if (respo
15ef0 6e 73 65 5f 63 6f 64 65 20 3d 3d 20 30 78 36 39  nse_code == 0x69
15f00 38 33 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  83) {....CACKEY_
15f10 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e  DEBUG_PRINTF("Un
15f20 61 62 6c 65 20 74 6f 20 73 65 74 20 50 49 4e 2c  able to set PIN,
15f30 20 64 65 76 69 63 65 20 69 73 20 6c 6f 63 6b 65   device is locke
15f40 64 20 6f 72 20 63 68 61 6e 67 69 6e 67 20 74 68  d or changing th
15f50 65 20 50 49 4e 20 69 73 20 64 69 73 61 62 6c 65  e PIN is disable
15f60 64 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28  d");.....return(
15f70 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4c 4f  CACKEY_PCSC_E_LO
15f80 43 4b 45 44 29 3b 0a 09 09 7d 0a 0a 09 09 72 65  CKED);...}....re
15f90 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
15fa0 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a  _E_GENERIC);..}.
15fb0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
15fc0 52 49 4e 54 46 28 22 50 49 4e 20 43 68 61 6e 67  RINTF("PIN Chang
15fd0 65 20 73 75 63 63 65 65 64 65 64 22 29 3b 0a 0a  e succeeded");..
15fe0 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
15ff0 43 53 43 5f 53 5f 4f 4b 29 3b 0a 0a 09 2f 2a 20  CSC_S_OK);.../* 
16000 44 69 73 61 62 6c 65 20 61 20 77 61 72 6e 69 6e  Disable a warnin
16010 67 2c 20 73 69 6e 63 65 20 74 68 69 73 20 69 73  g, since this is
16020 20 6f 6e 6c 79 20 75 73 65 64 20 69 6e 20 64 65   only used in de
16030 62 75 67 20 6d 6f 64 65 20 2a 2f 0a 09 74 72 69  bug mode */..tri
16040 65 73 5f 72 65 6d 61 69 6e 69 6e 67 20 3d 20 74  es_remaining = t
16050 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 3b 0a  ries_remaining;.
16060 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49  }../*. * SYNPOSI
16070 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a  S. *     .... *.
16080 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20   * ARGUMENTS. * 
16090 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45      .... *. * RE
160a0 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20  TURN VALUE. *   
160b0 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45    .... *. * NOTE
160c0 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a  S. *     .... *.
160d0 20 2a 2f 0a 73 74 61 74 69 63 20 63 61 63 6b 65   */.static cacke
160e0 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 6c 6f 67  y_ret cackey_log
160f0 69 6e 28 73 74 72 75 63 74 20 63 61 63 6b 65 79  in(struct cackey
16100 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73  _slot *slot, uns
16110 69 67 6e 65 64 20 63 68 61 72 20 2a 70 69 6e 2c  igned char *pin,
16120 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 70   unsigned long p
16130 69 6e 5f 6c 65 6e 2c 20 69 6e 74 20 2a 74 72 69  in_len, int *tri
16140 65 73 5f 72 65 6d 61 69 6e 69 6e 67 5f 70 2c 20  es_remaining_p, 
16150 69 6e 74 20 72 65 74 72 69 65 73 29 20 7b 0a 09  int retries) {..
16160 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63  struct cackey_pc
16170 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 70 63 73  sc_identity *pcs
16180 63 5f 69 64 65 6e 74 69 74 69 65 73 3b 0a 09 75  c_identities;..u
16190 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63 61 63  nsigned char cac
161a0 5f 70 69 6e 5b 38 5d 20 3d 20 7b 30 78 46 46 2c  _pin[8] = {0xFF,
161b0 20 30 78 46 46 2c 20 30 78 46 46 2c 20 30 78 46   0xFF, 0xFF, 0xF
161c0 46 2c 20 30 78 46 46 2c 20 30 78 46 46 2c 20 30  F, 0xFF, 0xFF, 0
161d0 78 46 46 2c 20 30 78 46 46 7d 3b 0a 09 75 6e 73  xFF, 0xFF};..uns
161e0 69 67 6e 65 64 20 6c 6f 6e 67 20 6e 75 6d 5f 63  igned long num_c
161f0 65 72 74 73 3b 0a 09 75 69 6e 74 31 36 5f 74 20  erts;..uint16_t 
16200 72 65 73 70 6f 6e 73 65 5f 63 6f 64 65 3b 0a 09  response_code;..
16210 69 6e 74 20 74 72 69 65 73 5f 72 65 6d 61 69 6e  int tries_remain
16220 69 6e 67 3b 0a 09 69 6e 74 20 73 65 6e 64 5f 72  ing;..int send_r
16230 65 74 3b 0a 09 69 6e 74 20 6b 65 79 5f 72 65 66  et;..int key_ref
16240 65 72 65 6e 63 65 20 3d 20 30 78 30 30 2c 20 68  erence = 0x00, h
16250 61 76 65 5f 70 69 76 20 3d 20 30 3b 0a 09 63 61  ave_piv = 0;..ca
16260 63 6b 65 79 5f 72 65 74 20 63 6f 6e 6e 65 63 74  ckey_ret connect
16270 5f 72 65 74 2c 20 74 6f 6b 65 6e 5f 72 65 74 3b  _ret, token_ret;
16280 0a 0a 09 2f 2a 20 49 6e 64 69 63 61 74 65 20 74  .../* Indicate t
16290 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 6b 6e  hat we do not kn
162a0 6f 77 20 61 62 6f 75 74 20 68 6f 77 20 6d 61 6e  ow about how man
162b0 79 20 74 72 69 65 73 20 61 72 65 20 72 65 6d 61  y tries are rema
162c0 69 6e 69 6e 67 20 2a 2f 0a 09 69 66 20 28 74 72  ining */..if (tr
162d0 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 5f 70 29  ies_remaining_p)
162e0 20 7b 0a 09 09 2a 74 72 69 65 73 5f 72 65 6d 61   {...*tries_rema
162f0 69 6e 69 6e 67 5f 70 20 3d 20 2d 31 3b 0a 09 7d  ining_p = -1;..}
16300 0a 0a 09 2f 2a 20 41 70 70 61 72 65 6e 74 6c 79  .../* Apparently
16310 2c 20 43 41 43 20 50 49 4e 73 20 61 72 65 20 2a  , CAC PINs are *
16320 45 58 41 43 54 4c 59 2a 20 38 20 62 79 74 65 73  EXACTLY* 8 bytes
16330 20 6c 6f 6e 67 20 2d 2d 20 70 61 64 20 77 69 74   long -- pad wit
16340 68 20 30 78 46 46 20 69 66 20 74 6f 6f 20 73 68  h 0xFF if too sh
16350 6f 72 74 20 2a 2f 0a 09 69 66 20 28 70 69 6e 5f  ort */..if (pin_
16360 6c 65 6e 20 3e 3d 20 38 29 20 7b 0a 09 09 6d 65  len >= 8) {...me
16370 6d 63 70 79 28 63 61 63 5f 70 69 6e 2c 20 70 69  mcpy(cac_pin, pi
16380 6e 2c 20 38 29 3b 0a 09 7d 20 65 6c 73 65 20 7b  n, 8);..} else {
16390 0a 09 09 6d 65 6d 63 70 79 28 63 61 63 5f 70 69  ...memcpy(cac_pi
163a0 6e 2c 20 70 69 6e 2c 20 70 69 6e 5f 6c 65 6e 29  n, pin, pin_len)
163b0 3b 0a 09 7d 0a 0a 09 2f 2a 20 52 65 6a 65 63 74  ;..}.../* Reject
163c0 20 50 49 4e 73 20 77 68 69 63 68 20 61 72 65 20   PINs which are 
163d0 74 6f 6f 20 73 68 6f 72 74 20 2a 2f 0a 09 69 66  too short */..if
163e0 20 28 70 69 6e 5f 6c 65 6e 20 3c 20 35 29 20 7b   (pin_len < 5) {
163f0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
16400 50 52 49 4e 54 46 28 22 52 65 6a 65 63 74 69 6e  PRINTF("Rejectin
16410 67 20 50 49 4e 20 77 68 69 63 68 20 69 73 20 74  g PIN which is t
16420 6f 6f 20 73 68 6f 72 74 20 28 6c 65 6e 67 74 68  oo short (length
16430 20 3d 20 25 6c 75 2c 20 6d 75 73 74 20 62 65 20   = %lu, must be 
16440 61 74 6c 65 61 73 74 20 35 29 22 2c 20 70 69 6e  atleast 5)", pin
16450 5f 6c 65 6e 29 3b 0a 0a 09 09 72 65 74 75 72 6e  _len);....return
16460 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 42  (CACKEY_PCSC_E_B
16470 41 44 50 49 4e 29 3b 0a 09 7d 0a 0a 09 2f 2a 20  ADPIN);..}.../* 
16480 50 49 56 20 61 75 74 68 65 6e 74 69 63 61 74 69  PIV authenticati
16490 6f 6e 20 75 73 65 73 20 61 20 22 6b 65 79 5f 72  on uses a "key_r
164a0 65 66 65 72 65 6e 63 65 22 20 6f 66 20 30 78 38  eference" of 0x8
164b0 30 20 2a 2f 0a 09 70 63 73 63 5f 69 64 65 6e 74  0 */..pcsc_ident
164c0 69 74 69 65 73 20 3d 20 63 61 63 6b 65 79 5f 72  ities = cackey_r
164d0 65 61 64 5f 63 65 72 74 73 28 73 6c 6f 74 2c 20  ead_certs(slot, 
164e0 4e 55 4c 4c 2c 20 26 6e 75 6d 5f 63 65 72 74 73  NULL, &num_certs
164f0 29 3b 0a 09 69 66 20 28 6e 75 6d 5f 63 65 72 74  );..if (num_cert
16500 73 20 3e 20 30 20 26 26 20 70 63 73 63 5f 69 64  s > 0 && pcsc_id
16510 65 6e 74 69 74 69 65 73 20 21 3d 20 4e 55 4c 4c  entities != NULL
16520 29 20 7b 0a 09 09 73 77 69 74 63 68 20 28 70 63  ) {...switch (pc
16530 73 63 5f 69 64 65 6e 74 69 74 69 65 73 5b 30 5d  sc_identities[0]
16540 2e 69 64 5f 74 79 70 65 29 20 7b 0a 09 09 09 63  .id_type) {....c
16550 61 73 65 20 43 41 43 4b 45 59 5f 49 44 5f 54 59  ase CACKEY_ID_TY
16560 50 45 5f 50 49 56 3a 0a 09 09 09 09 43 41 43 4b  PE_PIV:.....CACK
16570 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
16580 22 57 65 20 68 61 76 65 20 50 49 56 20 63 61 72  "We have PIV car
16590 64 2c 20 73 6f 20 77 65 20 77 69 6c 6c 20 61 74  d, so we will at
165a0 74 65 6d 70 74 20 74 6f 20 61 75 74 68 65 6e 74  tempt to authent
165b0 69 63 61 74 65 20 75 73 69 6e 67 20 74 68 65 20  icate using the 
165c0 50 49 56 20 41 70 70 6c 69 63 61 74 69 6f 6e 20  PIV Application 
165d0 6b 65 79 20 72 65 66 65 72 65 6e 63 65 22 29 3b  key reference");
165e0 0a 0a 09 09 09 09 68 61 76 65 5f 70 69 76 20 3d  ......have_piv =
165f0 20 31 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09   1;.....break;..
16600 09 09 64 65 66 61 75 6c 74 3a 0a 09 09 09 09 62  ..default:.....b
16610 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09 63 61 63  reak;...}....cac
16620 6b 65 79 5f 66 72 65 65 5f 63 65 72 74 73 28 70  key_free_certs(p
16630 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 2c 20  csc_identities, 
16640 6e 75 6d 5f 63 65 72 74 73 2c 20 31 29 3b 0a 09  num_certs, 1);..
16650 7d 0a 0a 09 69 66 20 28 68 61 76 65 5f 70 69 76  }...if (have_piv
16660 20 3d 3d 20 31 29 20 7b 0a 09 09 6b 65 79 5f 72   == 1) {...key_r
16670 65 66 65 72 65 6e 63 65 20 3d 20 30 78 38 30 3b  eference = 0x80;
16680 0a 09 7d 0a 0a 09 2f 2a 20 49 73 73 75 65 20 50  ..}.../* Issue P
16690 49 4e 20 56 65 72 69 66 79 20 2a 2f 0a 09 73 65  IN Verify */..se
166a0 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f  nd_ret = cackey_
166b0 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f 74 2c 20  send_apdu(slot, 
166c0 47 53 43 49 53 5f 43 4c 41 53 53 5f 49 53 4f 37  GSCIS_CLASS_ISO7
166d0 38 31 36 2c 20 47 53 43 49 53 5f 49 4e 53 54 52  816, GSCIS_INSTR
166e0 5f 56 45 52 49 46 59 2c 20 30 78 30 30 2c 20 6b  _VERIFY, 0x00, k
166f0 65 79 5f 72 65 66 65 72 65 6e 63 65 2c 20 73 69  ey_reference, si
16700 7a 65 6f 66 28 63 61 63 5f 70 69 6e 29 2c 20 63  zeof(cac_pin), c
16710 61 63 5f 70 69 6e 2c 20 30 78 30 30 2c 20 26 72  ac_pin, 0x00, &r
16720 65 73 70 6f 6e 73 65 5f 63 6f 64 65 2c 20 4e 55  esponse_code, NU
16730 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 69 66 20  LL, NULL);...if 
16740 28 73 65 6e 64 5f 72 65 74 20 21 3d 20 43 41 43  (send_ret != CAC
16750 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b  KEY_PCSC_S_OK) {
16760 0a 09 09 69 66 20 28 28 72 65 73 70 6f 6e 73 65  ...if ((response
16770 5f 63 6f 64 65 20 26 20 30 78 36 33 43 30 29 20  _code & 0x63C0) 
16780 3d 3d 20 30 78 36 33 43 30 29 20 7b 0a 09 09 09  == 0x63C0) {....
16790 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 20  tries_remaining 
167a0 3d 20 28 72 65 73 70 6f 6e 73 65 5f 63 6f 64 65  = (response_code
167b0 20 26 20 30 78 46 29 3b 0a 0a 09 09 09 43 41 43   & 0xF);.....CAC
167c0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
167d0 28 22 50 49 4e 20 56 65 72 69 66 69 63 61 74 69  ("PIN Verificati
167e0 6f 6e 20 66 61 69 6c 65 64 2c 20 25 69 20 74 72  on failed, %i tr
167f0 69 65 73 20 72 65 6d 61 69 6e 69 6e 67 22 2c 20  ies remaining", 
16800 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 29  tries_remaining)
16810 3b 0a 0a 09 09 09 69 66 20 28 74 72 69 65 73 5f  ;.....if (tries_
16820 72 65 6d 61 69 6e 69 6e 67 5f 70 29 20 7b 0a 09  remaining_p) {..
16830 09 09 09 2a 74 72 69 65 73 5f 72 65 6d 61 69 6e  ...*tries_remain
16840 69 6e 67 5f 70 20 3d 20 74 72 69 65 73 5f 72 65  ing_p = tries_re
16850 6d 61 69 6e 69 6e 67 3b 0a 09 09 09 7d 0a 0a 09  maining;....}...
16860 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
16870 50 43 53 43 5f 45 5f 42 41 44 50 49 4e 29 3b 0a  PCSC_E_BADPIN);.
16880 09 09 7d 0a 0a 09 09 69 66 20 28 72 65 73 70 6f  ..}....if (respo
16890 6e 73 65 5f 63 6f 64 65 20 3d 3d 20 30 78 36 39  nse_code == 0x69
168a0 38 33 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  83) {....CACKEY_
168b0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 50 49  DEBUG_PRINTF("PI
168c0 4e 20 56 65 72 69 66 69 63 61 74 69 6f 6e 20 66  N Verification f
168d0 61 69 6c 65 64 2c 20 64 65 76 69 63 65 20 69 73  ailed, device is
168e0 20 6c 6f 63 6b 65 64 22 29 3b 0a 0a 09 09 09 72   locked");.....r
168f0 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
16900 43 5f 45 5f 4c 4f 43 4b 45 44 29 3b 0a 09 09 7d  C_E_LOCKED);...}
16910 0a 0a 09 09 69 66 20 28 72 65 73 70 6f 6e 73 65  ....if (response
16920 5f 63 6f 64 65 20 3d 3d 20 30 78 36 64 30 30 29  _code == 0x6d00)
16930 20 7b 0a 09 09 09 69 66 20 28 72 65 74 72 69 65   {....if (retrie
16940 73 20 3e 20 30 29 20 7b 0a 09 09 09 09 43 41 43  s > 0) {.....CAC
16950 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
16960 28 22 47 6f 74 20 49 53 4f 20 37 38 31 36 20 52  ("Got ISO 7816 R
16970 65 73 70 6f 6e 73 65 20 5c 22 36 44 20 30 30 5c  esponse \"6D 00\
16980 22 20 69 6e 20 72 65 73 70 6f 6e 73 65 20 74 6f  " in response to
16990 20 61 20 56 45 52 49 46 59 20 72 65 71 75 65 73   a VERIFY reques
169a0 74 2e 22 29 3b 0a 09 09 09 09 43 41 43 4b 45 59  t.");.....CACKEY
169b0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 57  _DEBUG_PRINTF("W
169c0 65 20 64 69 64 20 6e 6f 74 20 65 78 70 65 63 74  e did not expect
169d0 20 74 68 69 73 20 62 65 63 61 75 73 65 20 69 74   this because it
169e0 20 69 73 20 6e 6f 74 20 6d 65 6e 74 69 6f 6e 65   is not mentione
169f0 64 20 69 6e 20 4e 49 53 54 20 53 50 20 38 30 30  d in NIST SP 800
16a00 2d 37 33 2d 33 20 50 61 72 74 20 32 20 53 65 63  -73-3 Part 2 Sec
16a10 74 69 6f 6e 20 33 2e 32 2e 31 20 6f 72 20 47 53  tion 3.2.1 or GS
16a20 43 2d 49 53 20 76 32 2e 31 22 29 3b 0a 09 09 09  C-IS v2.1");....
16a30 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
16a40 49 4e 54 46 28 22 57 65 20 61 72 65 20 67 6f 69  INTF("We are goi
16a50 6e 67 20 74 6f 20 74 72 79 20 74 6f 20 72 65 73  ng to try to res
16a60 65 74 20 74 68 65 20 63 61 72 64 20 61 6e 64 20  et the card and 
16a70 73 65 6c 65 63 74 20 74 68 65 20 61 70 70 6c 65  select the apple
16a80 74 20 61 67 61 69 6e 2e 22 29 3b 0a 0a 09 09 09  t again.");.....
16a90 09 63 61 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f  .cackey_mark_slo
16aa0 74 5f 72 65 73 65 74 28 73 6c 6f 74 29 3b 0a 0a  t_reset(slot);..
16ab0 09 09 09 09 63 6f 6e 6e 65 63 74 5f 72 65 74 20  ....connect_ret 
16ac0 3d 20 63 61 63 6b 65 79 5f 63 6f 6e 6e 65 63 74  = cackey_connect
16ad0 5f 63 61 72 64 28 73 6c 6f 74 29 3b 0a 09 09 09  _card(slot);....
16ae0 09 69 66 20 28 63 6f 6e 6e 65 63 74 5f 72 65 74  .if (connect_ret
16af0 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f   != CACKEY_PCSC_
16b00 53 5f 4f 4b 29 20 7b 0a 09 09 09 09 09 43 41 43  S_OK) {......CAC
16b10 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
16b20 28 22 55 6e 61 62 6c 65 20 74 6f 20 72 65 63 6f  ("Unable to reco
16b30 6e 6e 65 63 74 20 61 66 74 65 72 20 72 65 73 65  nnect after rese
16b40 74 74 69 6e 67 20 74 68 65 20 63 61 72 64 2c 20  tting the card, 
16b50 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 65 72 72  returning in err
16b60 6f 72 2e 22 29 3b 0a 0a 09 09 09 09 09 72 65 74  or.");.......ret
16b70 75 72 6e 28 63 6f 6e 6e 65 63 74 5f 72 65 74 29  urn(connect_ret)
16b80 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43  ;.....}......CAC
16b90 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
16ba0 28 22 56 65 72 69 66 79 69 6e 67 20 77 65 20 73  ("Verifying we s
16bb0 74 69 6c 6c 20 68 61 76 65 20 61 20 74 6f 6b 65  till have a toke
16bc0 6e 2e 22 29 3b 0a 09 09 09 09 74 6f 6b 65 6e 5f  n.");.....token_
16bd0 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 74 6f 6b  ret = cackey_tok
16be0 65 6e 5f 70 72 65 73 65 6e 74 28 73 6c 6f 74 29  en_present(slot)
16bf0 3b 0a 09 09 09 09 69 66 20 28 74 6f 6b 65 6e 5f  ;.....if (token_
16c00 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43  ret != CACKEY_PC
16c10 53 43 5f 53 5f 54 4f 4b 45 4e 50 52 45 53 45 4e  SC_S_TOKENPRESEN
16c20 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59  T) {......CACKEY
16c30 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54  _DEBUG_PRINTF("T
16c40 6f 6b 65 6e 20 6e 6f 74 20 70 72 65 73 65 6e 74  oken not present
16c50 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 65  , returning in e
16c60 72 72 6f 72 2e 22 29 3b 0a 0a 09 09 09 09 09 72  rror.");.......r
16c70 65 74 75 72 6e 28 74 6f 6b 65 6e 5f 72 65 74 29  eturn(token_ret)
16c80 3b 0a 09 09 09 09 7d 0a 0a 0a 09 09 09 09 43 41  ;.....}.......CA
16c90 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
16ca0 46 28 22 54 72 79 69 6e 67 20 74 6f 20 6c 6f 67  F("Trying to log
16cb0 69 6e 20 61 67 61 69 6e 22 29 3b 0a 09 09 09 09  in again");.....
16cc0 72 65 74 75 72 6e 28 63 61 63 6b 65 79 5f 6c 6f  return(cackey_lo
16cd0 67 69 6e 28 73 6c 6f 74 2c 20 70 69 6e 2c 20 70  gin(slot, pin, p
16ce0 69 6e 5f 6c 65 6e 2c 20 74 72 69 65 73 5f 72 65  in_len, tries_re
16cf0 6d 61 69 6e 69 6e 67 5f 70 2c 20 72 65 74 72 69  maining_p, retri
16d00 65 73 20 2d 20 31 29 29 3b 0a 09 09 09 7d 0a 09  es - 1));....}..
16d10 09 7d 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43  .}....return(CAC
16d20 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52  KEY_PCSC_E_GENER
16d30 49 43 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  IC);..}...CACKEY
16d40 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 50  _DEBUG_PRINTF("P
16d50 49 4e 20 56 65 72 69 66 69 63 61 74 69 6f 6e 20  IN Verification 
16d60 73 75 63 63 65 65 64 65 64 22 29 3b 0a 0a 09 72  succeeded");...r
16d70 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
16d80 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20  C_S_OK);.}../*. 
16d90 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20  * SYNPOSIS. *   
16da0 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55    .... *. * ARGU
16db0 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e  MENTS. *     ...
16dc0 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41  . *. * RETURN VA
16dd0 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20  LUE. *     .... 
16de0 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20  *. * NOTES. *   
16df0 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61    .... *. */.sta
16e00 74 69 63 20 73 73 69 7a 65 5f 74 20 63 61 63 6b  tic ssize_t cack
16e10 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79  ey_pcsc_identity
16e20 5f 74 6f 5f 6c 61 62 65 6c 28 73 74 72 75 63 74  _to_label(struct
16e30 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65   cackey_pcsc_ide
16e40 6e 74 69 74 79 20 2a 69 64 65 6e 74 69 74 79 2c  ntity *identity,
16e50 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
16e60 6c 61 62 65 6c 5f 62 75 66 2c 20 75 6e 73 69 67  label_buf, unsig
16e70 6e 65 64 20 6c 6f 6e 67 20 6c 61 62 65 6c 5f 62  ned long label_b
16e80 75 66 5f 6c 65 6e 29 20 7b 0a 09 75 6e 73 69 67  uf_len) {..unsig
16e90 6e 65 64 20 6c 6f 6e 67 20 63 65 72 74 69 66 69  ned long certifi
16ea0 63 61 74 65 5f 6c 65 6e 3b 0a 09 76 6f 69 64 20  cate_len;..void 
16eb0 2a 6c 61 62 65 6c 5f 61 73 6e 31 3b 0a 09 76 6f  *label_asn1;..vo
16ec0 69 64 20 2a 63 65 72 74 69 66 69 63 61 74 65 3b  id *certificate;
16ed0 0a 09 69 6e 74 20 78 35 30 39 5f 72 65 61 64 5f  ..int x509_read_
16ee0 72 65 74 3b 0a 0a 09 63 65 72 74 69 66 69 63 61  ret;...certifica
16ef0 74 65 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e 63  te = identity->c
16f00 65 72 74 69 66 69 63 61 74 65 3b 0a 09 63 65 72  ertificate;..cer
16f10 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3d 20 69  tificate_len = i
16f20 64 65 6e 74 69 74 79 2d 3e 63 65 72 74 69 66 69  dentity->certifi
16f30 63 61 74 65 5f 6c 65 6e 3b 0a 0a 09 69 66 20 28  cate_len;...if (
16f40 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20  certificate_len 
16f50 3c 20 30 29 20 7b 0a 09 09 72 65 74 75 72 6e 28  < 0) {...return(
16f60 2d 31 29 3b 0a 09 7d 0a 0a 09 78 35 30 39 5f 72  -1);..}...x509_r
16f70 65 61 64 5f 72 65 74 20 3d 20 78 35 30 39 5f 74  ead_ret = x509_t
16f80 6f 5f 73 75 62 6a 65 63 74 28 63 65 72 74 69 66  o_subject(certif
16f90 69 63 61 74 65 2c 20 63 65 72 74 69 66 69 63 61  icate, certifica
16fa0 74 65 5f 6c 65 6e 2c 20 28 76 6f 69 64 20 2a 2a  te_len, (void **
16fb0 29 20 26 6c 61 62 65 6c 5f 61 73 6e 31 29 3b 0a  ) &label_asn1);.
16fc0 09 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72  .if (x509_read_r
16fd0 65 74 20 3c 20 30 29 20 7b 0a 09 09 72 65 74 75  et < 0) {...retu
16fe0 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 78 35 30  rn(-1);..}...x50
16ff0 39 5f 72 65 61 64 5f 72 65 74 20 3d 20 78 35 30  9_read_ret = x50
17000 39 5f 64 6e 5f 74 6f 5f 73 74 72 69 6e 67 28 6c  9_dn_to_string(l
17010 61 62 65 6c 5f 61 73 6e 31 2c 20 78 35 30 39 5f  abel_asn1, x509_
17020 72 65 61 64 5f 72 65 74 2c 20 28 63 68 61 72 20  read_ret, (char 
17030 2a 29 20 6c 61 62 65 6c 5f 62 75 66 2c 20 6c 61  *) label_buf, la
17040 62 65 6c 5f 62 75 66 5f 6c 65 6e 2c 20 22 43 4e  bel_buf_len, "CN
17050 22 29 3b 0a 09 69 66 20 28 78 35 30 39 5f 72 65  ");..if (x509_re
17060 61 64 5f 72 65 74 20 3c 3d 20 30 29 20 7b 0a 09  ad_ret <= 0) {..
17070 09 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3d  .x509_read_ret =
17080 20 78 35 30 39 5f 64 6e 5f 74 6f 5f 73 74 72 69   x509_dn_to_stri
17090 6e 67 28 6c 61 62 65 6c 5f 61 73 6e 31 2c 20 78  ng(label_asn1, x
170a0 35 30 39 5f 72 65 61 64 5f 72 65 74 2c 20 28 63  509_read_ret, (c
170b0 68 61 72 20 2a 29 20 6c 61 62 65 6c 5f 62 75 66  har *) label_buf
170c0 2c 20 6c 61 62 65 6c 5f 62 75 66 5f 6c 65 6e 2c  , label_buf_len,
170d0 20 4e 55 4c 4c 29 3b 0a 0a 09 09 69 66 20 28 78   NULL);....if (x
170e0 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3c 3d 20  509_read_ret <= 
170f0 30 29 20 7b 0a 09 09 09 72 65 74 75 72 6e 28 2d  0) {....return(-
17100 31 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 23 69 66 64  1);...}..}..#ifd
17110 65 66 20 43 41 43 4b 45 59 5f 50 41 52 41 4e 4f  ef CACKEY_PARANO
17120 49 44 0a 23 20 20 69 66 64 65 66 20 5f 50 4f 53  ID.#  ifdef _POS
17130 49 58 5f 53 53 49 5a 45 5f 4d 41 58 0a 09 69 66  IX_SSIZE_MAX..if
17140 20 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20   (x509_read_ret 
17150 3e 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d  > _POSIX_SSIZE_M
17160 41 58 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  AX) {...CACKEY_D
17170 45 42 55 47 5f 50 52 49 4e 54 46 28 22 78 35 30  EBUG_PRINTF("x50
17180 39 5f 72 65 61 64 5f 72 65 74 20 65 78 63 65 65  9_read_ret excee
17190 64 73 20 6d 61 78 69 6d 75 6d 20 76 61 6c 75 65  ds maximum value
171a0 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66  , returning in f
171b0 61 69 6c 75 72 65 2e 20 28 6d 61 78 20 3d 20 25  ailure. (max = %
171c0 6c 69 2c 20 78 35 30 39 5f 72 65 61 64 5f 72 65  li, x509_read_re
171d0 74 20 3d 20 25 6c 75 29 22 2c 20 28 6c 6f 6e 67  t = %lu)", (long
171e0 29 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d  ) _POSIX_SSIZE_M
171f0 41 58 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  AX, (unsigned lo
17200 6e 67 29 20 78 35 30 39 5f 72 65 61 64 5f 72 65  ng) x509_read_re
17210 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31  t);....return(-1
17220 29 3b 0a 09 7d 0a 23 20 20 65 6e 64 69 66 0a 23  );..}.#  endif.#
17230 65 6e 64 69 66 0a 0a 09 72 65 74 75 72 6e 28 78  endif...return(x
17240 35 30 39 5f 72 65 61 64 5f 72 65 74 29 3b 0a 7d  509_read_ret);.}
17250 0a 0a 2f 2a 20 52 65 74 75 72 6e 73 20 30 20 6f  ../* Returns 0 o
17260 6e 20 73 75 63 63 65 73 73 20 2a 2f 0a 73 74 61  n success */.sta
17270 74 69 63 20 69 6e 74 20 63 61 63 6b 65 79 5f 6d  tic int cackey_m
17280 75 74 65 78 5f 63 72 65 61 74 65 28 76 6f 69 64  utex_create(void
17290 20 2a 2a 6d 75 74 65 78 29 20 7b 0a 09 70 74 68   **mutex) {..pth
172a0 72 65 61 64 5f 6d 75 74 65 78 5f 74 20 2a 70 74  read_mutex_t *pt
172b0 68 72 65 61 64 5f 6d 75 74 65 78 3b 0a 09 69 6e  hread_mutex;..in
172c0 74 20 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c  t pthread_retval
172d0 3b 0a 09 43 4b 5f 52 56 20 63 75 73 74 6f 6d 5f  ;..CK_RV custom_
172e0 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59  retval;...CACKEY
172f0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
17300 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
17310 28 63 61 63 6b 65 79 5f 61 72 67 73 2e 66 6c 61  (cackey_args.fla
17320 67 73 20 26 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b  gs & CKF_OS_LOCK
17330 49 4e 47 5f 4f 4b 29 20 3d 3d 20 43 4b 46 5f 4f  ING_OK) == CKF_O
17340 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20 7b 0a  S_LOCKING_OK) {.
17350 09 09 70 74 68 72 65 61 64 5f 6d 75 74 65 78 20  ..pthread_mutex 
17360 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28  = malloc(sizeof(
17370 2a 70 74 68 72 65 61 64 5f 6d 75 74 65 78 29 29  *pthread_mutex))
17380 3b 0a 09 09 69 66 20 28 21 70 74 68 72 65 61 64  ;...if (!pthread
17390 5f 6d 75 74 65 78 29 20 7b 0a 09 09 09 43 41 43  _mutex) {....CAC
173a0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
173b0 28 22 46 61 69 6c 65 64 20 74 6f 20 61 6c 6c 6f  ("Failed to allo
173c0 63 61 74 65 20 6d 65 6d 6f 72 79 2e 22 29 3b 0a  cate memory.");.
173d0 0a 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a  ....return(-1);.
173e0 09 09 7d 0a 0a 09 09 70 74 68 72 65 61 64 5f 72  ..}....pthread_r
173f0 65 74 76 61 6c 20 3d 20 70 74 68 72 65 61 64 5f  etval = pthread_
17400 6d 75 74 65 78 5f 69 6e 69 74 28 70 74 68 72 65  mutex_init(pthre
17410 61 64 5f 6d 75 74 65 78 2c 20 4e 55 4c 4c 29 3b  ad_mutex, NULL);
17420 0a 09 09 69 66 20 28 70 74 68 72 65 61 64 5f 72  ...if (pthread_r
17430 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
17440 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
17450 49 4e 54 46 28 22 70 74 68 72 65 61 64 5f 6d 75  INTF("pthread_mu
17460 74 65 78 5f 69 6e 69 74 28 29 20 72 65 74 75 72  tex_init() retur
17470 6e 65 64 20 65 72 72 6f 72 20 28 25 69 29 2e 22  ned error (%i)."
17480 2c 20 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c  , pthread_retval
17490 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 2d 31  );.....return(-1
174a0 29 3b 0a 09 09 7d 0a 0a 09 09 2a 6d 75 74 65 78  );...}....*mutex
174b0 20 3d 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78   = pthread_mutex
174c0 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69 66  ;..} else {...if
174d0 20 28 63 61 63 6b 65 79 5f 61 72 67 73 2e 43 72   (cackey_args.Cr
174e0 65 61 74 65 4d 75 74 65 78 29 20 7b 0a 09 09 09  eateMutex) {....
174f0 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 20 3d 20  custom_retval = 
17500 63 61 63 6b 65 79 5f 61 72 67 73 2e 43 72 65 61  cackey_args.Crea
17510 74 65 4d 75 74 65 78 28 6d 75 74 65 78 29 3b 0a  teMutex(mutex);.
17520 0a 09 09 09 69 66 20 28 63 75 73 74 6f 6d 5f 72  ....if (custom_r
17530 65 74 76 61 6c 20 21 3d 20 43 4b 52 5f 4f 4b 29  etval != CKR_OK)
17540 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45   {.....CACKEY_DE
17550 42 55 47 5f 50 52 49 4e 54 46 28 22 63 61 63 6b  BUG_PRINTF("cack
17560 65 79 5f 61 72 67 73 2e 43 72 65 61 74 65 4d 75  ey_args.CreateMu
17570 74 65 78 28 29 20 72 65 74 75 72 6e 65 64 20 65  tex() returned e
17580 72 72 6f 72 20 28 25 6c 69 29 2e 22 2c 20 28 6c  rror (%li).", (l
17590 6f 6e 67 29 20 63 75 73 74 6f 6d 5f 72 65 74 76  ong) custom_retv
175a0 61 6c 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e  al);......return
175b0 28 2d 31 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a 09  (-1);....}...}..
175c0 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
175d0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
175e0 6e 67 20 73 75 63 65 73 73 66 75 6c 6c 79 20 28  ng sucessfully (
175f0 30 29 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 30  0)");...return(0
17600 29 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 73  );.}../* Returns
17610 20 30 20 6f 6e 20 73 75 63 63 65 73 73 20 2a 2f   0 on success */
17620 0a 73 74 61 74 69 63 20 69 6e 74 20 63 61 63 6b  .static int cack
17630 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 76 6f  ey_mutex_lock(vo
17640 69 64 20 2a 6d 75 74 65 78 29 20 7b 0a 09 70 74  id *mutex) {..pt
17650 68 72 65 61 64 5f 6d 75 74 65 78 5f 74 20 2a 70  hread_mutex_t *p
17660 74 68 72 65 61 64 5f 6d 75 74 65 78 3b 0a 09 69  thread_mutex;..i
17670 6e 74 20 70 74 68 72 65 61 64 5f 72 65 74 76 61  nt pthread_retva
17680 6c 3b 0a 09 43 4b 5f 52 56 20 63 75 73 74 6f 6d  l;..CK_RV custom
17690 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45  _retval;...CACKE
176a0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
176b0 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
176c0 28 28 63 61 63 6b 65 79 5f 61 72 67 73 2e 66 6c  ((cackey_args.fl
176d0 61 67 73 20 26 20 43 4b 46 5f 4f 53 5f 4c 4f 43  ags & CKF_OS_LOC
176e0 4b 49 4e 47 5f 4f 4b 29 20 3d 3d 20 43 4b 46 5f  KING_OK) == CKF_
176f0 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20 7b  OS_LOCKING_OK) {
17700 0a 09 09 70 74 68 72 65 61 64 5f 6d 75 74 65 78  ...pthread_mutex
17710 20 3d 20 6d 75 74 65 78 3b 0a 0a 09 09 70 74 68   = mutex;....pth
17720 72 65 61 64 5f 72 65 74 76 61 6c 20 3d 20 70 74  read_retval = pt
17730 68 72 65 61 64 5f 6d 75 74 65 78 5f 6c 6f 63 6b  hread_mutex_lock
17740 28 70 74 68 72 65 61 64 5f 6d 75 74 65 78 29 3b  (pthread_mutex);
17750 0a 09 09 69 66 20 28 70 74 68 72 65 61 64 5f 72  ...if (pthread_r
17760 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
17770 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
17780 49 4e 54 46 28 22 70 74 68 72 65 61 64 5f 6d 75  INTF("pthread_mu
17790 74 65 78 5f 6c 6f 63 6b 28 29 20 72 65 74 75 72  tex_lock() retur
177a0 6e 65 64 20 65 72 72 6f 72 20 28 25 69 29 2e 22  ned error (%i)."
177b0 2c 20 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c  , pthread_retval
177c0 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 2d 31  );.....return(-1
177d0 29 3b 0a 09 09 7d 0a 09 7d 20 65 6c 73 65 20 7b  );...}..} else {
177e0 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 61 72  ...if (cackey_ar
177f0 67 73 2e 4c 6f 63 6b 4d 75 74 65 78 29 20 7b 0a  gs.LockMutex) {.
17800 09 09 09 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c  ...custom_retval
17810 20 3d 20 63 61 63 6b 65 79 5f 61 72 67 73 2e 4c   = cackey_args.L
17820 6f 63 6b 4d 75 74 65 78 28 6d 75 74 65 78 29 3b  ockMutex(mutex);
17830 0a 0a 09 09 09 69 66 20 28 63 75 73 74 6f 6d 5f  .....if (custom_
17840 72 65 74 76 61 6c 20 21 3d 20 43 4b 52 5f 4f 4b  retval != CKR_OK
17850 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  ) {.....CACKEY_D
17860 45 42 55 47 5f 50 52 49 4e 54 46 28 22 63 61 63  EBUG_PRINTF("cac
17870 6b 65 79 5f 61 72 67 73 2e 4c 6f 63 6b 4d 75 74  key_args.LockMut
17880 65 78 28 29 20 72 65 74 75 72 6e 65 64 20 65 72  ex() returned er
17890 72 6f 72 20 28 25 6c 69 29 2e 22 2c 20 28 6c 6f  ror (%li).", (lo
178a0 6e 67 29 20 63 75 73 74 6f 6d 5f 72 65 74 76 61  ng) custom_retva
178b0 6c 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28  l);......return(
178c0 2d 31 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a 09 7d  -1);....}...}..}
178d0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
178e0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
178f0 67 20 73 75 63 65 73 73 66 75 6c 6c 79 20 28 30  g sucessfully (0
17900 29 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 30 29  )");...return(0)
17910 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 73 20  ;.}../* Returns 
17920 30 20 6f 6e 20 73 75 63 63 65 73 73 20 2a 2f 0a  0 on success */.
17930 73 74 61 74 69 63 20 69 6e 74 20 63 61 63 6b 65  static int cacke
17940 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 76  y_mutex_unlock(v
17950 6f 69 64 20 2a 6d 75 74 65 78 29 20 7b 0a 09 70  oid *mutex) {..p
17960 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 74 20 2a  thread_mutex_t *
17970 70 74 68 72 65 61 64 5f 6d 75 74 65 78 3b 0a 09  pthread_mutex;..
17980 69 6e 74 20 70 74 68 72 65 61 64 5f 72 65 74 76  int pthread_retv
17990 61 6c 3b 0a 09 43 4b 5f 52 56 20 63 75 73 74 6f  al;..CK_RV custo
179a0 6d 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b  m_retval;...CACK
179b0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
179c0 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
179d0 20 28 28 63 61 63 6b 65 79 5f 61 72 67 73 2e 66   ((cackey_args.f
179e0 6c 61 67 73 20 26 20 43 4b 46 5f 4f 53 5f 4c 4f  lags & CKF_OS_LO
179f0 43 4b 49 4e 47 5f 4f 4b 29 20 3d 3d 20 43 4b 46  CKING_OK) == CKF
17a00 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20  _OS_LOCKING_OK) 
17a10 7b 0a 09 09 70 74 68 72 65 61 64 5f 6d 75 74 65  {...pthread_mute
17a20 78 20 3d 20 6d 75 74 65 78 3b 0a 0a 09 09 70 74  x = mutex;....pt
17a30 68 72 65 61 64 5f 72 65 74 76 61 6c 20 3d 20 70  hread_retval = p
17a40 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 75 6e 6c  thread_mutex_unl
17a50 6f 63 6b 28 70 74 68 72 65 61 64 5f 6d 75 74 65  ock(pthread_mute
17a60 78 29 3b 0a 09 09 69 66 20 28 70 74 68 72 65 61  x);...if (pthrea
17a70 64 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  d_retval != 0) {
17a80 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
17a90 5f 50 52 49 4e 54 46 28 22 70 74 68 72 65 61 64  _PRINTF("pthread
17aa0 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 29 20  _mutex_unlock() 
17ab0 72 65 74 75 72 6e 65 64 20 65 72 72 6f 72 20 28  returned error (
17ac0 25 69 29 2e 22 2c 20 70 74 68 72 65 61 64 5f 72  %i).", pthread_r
17ad0 65 74 76 61 6c 29 3b 0a 0a 09 09 09 72 65 74 75  etval);.....retu
17ae0 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 09 7d 20 65  rn(-1);...}..} e
17af0 6c 73 65 20 7b 0a 09 09 69 66 20 28 63 61 63 6b  lse {...if (cack
17b00 65 79 5f 61 72 67 73 2e 55 6e 6c 6f 63 6b 4d 75  ey_args.UnlockMu
17b10 74 65 78 29 20 7b 0a 09 09 09 63 75 73 74 6f 6d  tex) {....custom
17b20 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
17b30 5f 61 72 67 73 2e 55 6e 6c 6f 63 6b 4d 75 74 65  _args.UnlockMute
17b40 78 28 6d 75 74 65 78 29 3b 0a 0a 09 09 09 69 66  x(mutex);.....if
17b50 20 28 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 20   (custom_retval 
17b60 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 09  != CKR_OK) {....
17b70 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
17b80 49 4e 54 46 28 22 63 61 63 6b 65 79 5f 61 72 67  INTF("cackey_arg
17b90 73 2e 55 6e 6c 6f 63 6b 4d 75 74 65 78 28 29 20  s.UnlockMutex() 
17ba0 72 65 74 75 72 6e 65 64 20 65 72 72 6f 72 20 28  returned error (
17bb0 25 6c 69 29 2e 22 2c 20 28 6c 6f 6e 67 29 20 63  %li).", (long) c
17bc0 75 73 74 6f 6d 5f 72 65 74 76 61 6c 29 3b 0a 0a  ustom_retval);..
17bd0 09 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a  ....return(-1);.
17be0 09 09 09 7d 0a 09 09 7d 0a 09 7d 0a 0a 09 43 41  ...}...}..}...CA
17bf0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
17c00 46 28 22 52 65 74 75 72 6e 69 6e 67 20 73 75 63  F("Returning suc
17c10 65 73 73 66 75 6c 6c 79 20 28 30 29 22 29 3b 0a  essfully (0)");.
17c20 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a  ..return(0);.}..
17c30 73 74 61 74 69 63 20 43 4b 5f 41 54 54 52 49 42  static CK_ATTRIB
17c40 55 54 45 5f 50 54 52 20 63 61 63 6b 65 79 5f 67  UTE_PTR cackey_g
17c50 65 74 5f 61 74 74 72 69 62 75 74 65 73 28 43 4b  et_attributes(CK
17c60 5f 4f 42 4a 45 43 54 5f 43 4c 41 53 53 20 6f 62  _OBJECT_CLASS ob
17c70 6a 65 63 74 63 6c 61 73 73 2c 20 73 74 72 75 63  jectclass, struc
17c80 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64  t cackey_pcsc_id
17c90 65 6e 74 69 74 79 20 2a 69 64 65 6e 74 69 74 79  entity *identity
17ca0 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  , unsigned long 
17cb0 69 64 65 6e 74 69 74 79 5f 6e 75 6d 2c 20 43 4b  identity_num, CK
17cc0 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 43 6f  _ULONG_PTR pulCo
17cd0 75 6e 74 29 20 7b 0a 09 73 74 61 74 69 63 20 43  unt) {..static C
17ce0 4b 5f 42 42 4f 4f 4c 20 63 6b 5f 74 72 75 65 20  K_BBOOL ck_true 
17cf0 3d 20 31 3b 0a 09 73 74 61 74 69 63 20 43 4b 5f  = 1;..static CK_
17d00 42 42 4f 4f 4c 20 63 6b 5f 66 61 6c 73 65 20 3d  BBOOL ck_false =
17d10 20 30 3b 0a 09 73 74 61 74 69 63 20 43 4b 5f 54   0;..static CK_T
17d20 52 55 53 54 20 63 6b 5f 74 72 75 73 74 65 64 20  RUST ck_trusted 
17d30 3d 20 43 4b 5f 54 52 55 53 54 45 44 5f 44 45 4c  = CK_TRUSTED_DEL
17d40 45 47 41 54 4f 52 3b 0a 09 43 4b 5f 55 4c 4f 4e  EGATOR;..CK_ULON
17d50 47 20 6e 75 6d 61 74 74 72 73 20 3d 20 30 2c 20  G numattrs = 0, 
17d60 72 65 74 76 61 6c 5f 63 6f 75 6e 74 3b 0a 09 43  retval_count;..C
17d70 4b 5f 41 54 54 52 49 42 55 54 45 5f 54 59 50 45  K_ATTRIBUTE_TYPE
17d80 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 3b   curr_attr_type;
17d90 0a 09 43 4b 5f 41 54 54 52 49 42 55 54 45 20 63  ..CK_ATTRIBUTE c
17da0 75 72 72 5f 61 74 74 72 2c 20 2a 72 65 74 76 61  urr_attr, *retva
17db0 6c 3b 0a 09 43 4b 5f 56 4f 49 44 5f 50 54 52 20  l;..CK_VOID_PTR 
17dc0 70 56 61 6c 75 65 3b 0a 09 43 4b 5f 55 4c 4f 4e  pValue;..CK_ULON
17dd0 47 20 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 09 43  G ulValueLen;..C
17de0 4b 5f 4f 42 4a 45 43 54 5f 43 4c 41 53 53 20 63  K_OBJECT_CLASS c
17df0 6b 5f 6f 62 6a 65 63 74 5f 63 6c 61 73 73 3b 0a  k_object_class;.
17e00 09 43 4b 5f 43 45 52 54 49 46 49 43 41 54 45 5f  .CK_CERTIFICATE_
17e10 54 59 50 45 20 63 6b 5f 63 65 72 74 69 66 69 63  TYPE ck_certific
17e20 61 74 65 5f 74 79 70 65 3b 0a 09 43 4b 5f 4b 45  ate_type;..CK_KE
17e30 59 5f 54 59 50 45 20 63 6b 5f 6b 65 79 5f 74 79  Y_TYPE ck_key_ty
17e40 70 65 3b 0a 09 43 4b 5f 55 54 46 38 43 48 41 52  pe;..CK_UTF8CHAR
17e50 20 75 63 54 6d 70 42 75 66 5b 31 30 32 34 5d 3b   ucTmpBuf[1024];
17e60 0a 09 53 48 41 31 43 6f 6e 74 65 78 74 20 73 68  ..SHA1Context sh
17e70 61 31 5f 63 74 78 3b 0a 09 4d 44 35 5f 43 54 58  a1_ctx;..MD5_CTX
17e80 20 6d 64 35 5f 63 74 78 3b 0a 09 75 69 6e 74 38   md5_ctx;..uint8
17e90 5f 74 20 73 68 61 31 5f 68 61 73 68 5b 53 48 41  _t sha1_hash[SHA
17ea0 31 48 61 73 68 53 69 7a 65 5d 3b 0a 09 75 69 6e  1HashSize];..uin
17eb0 74 38 5f 74 20 6d 64 35 5f 68 61 73 68 5b 4d 44  t8_t md5_hash[MD
17ec0 35 48 61 73 68 53 69 7a 65 5d 3b 0a 09 75 6e 73  5HashSize];..uns
17ed0 69 67 6e 65 64 20 63 68 61 72 20 2a 63 65 72 74  igned char *cert
17ee0 69 66 69 63 61 74 65 3b 0a 09 73 73 69 7a 65 5f  ificate;..ssize_
17ef0 74 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65  t certificate_le
17f00 6e 20 3d 20 2d 31 2c 20 78 35 30 39 5f 72 65 61  n = -1, x509_rea
17f10 64 5f 72 65 74 3b 0a 09 69 6e 74 20 70 56 61 6c  d_ret;..int pVal
17f20 75 65 5f 66 72 65 65 3b 0a 0a 09 43 41 43 4b 45  ue_free;...CACKE
17f30 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
17f40 43 61 6c 6c 65 64 20 28 6f 62 6a 65 63 74 43 6c  Called (objectCl
17f50 61 73 73 20 3d 20 25 6c 75 2c 20 69 64 65 6e 74  ass = %lu, ident
17f60 69 74 79 5f 6e 75 6d 20 3d 20 25 6c 75 29 2e 22  ity_num = %lu)."
17f70 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
17f80 29 20 6f 62 6a 65 63 74 63 6c 61 73 73 2c 20 69  ) objectclass, i
17f90 64 65 6e 74 69 74 79 5f 6e 75 6d 29 3b 0a 0a 09  dentity_num);...
17fa0 2a 70 75 6c 43 6f 75 6e 74 20 3d 20 30 3b 0a 0a  *pulCount = 0;..
17fb0 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73  .if (objectclass
17fc0 20 21 3d 20 43 4b 4f 5f 43 45 52 54 49 46 49 43   != CKO_CERTIFIC
17fd0 41 54 45 20 26 26 20 6f 62 6a 65 63 74 63 6c 61  ATE && objectcla
17fe0 73 73 20 21 3d 20 43 4b 4f 5f 50 55 42 4c 49 43  ss != CKO_PUBLIC
17ff0 5f 4b 45 59 20 26 26 20 6f 62 6a 65 63 74 63 6c  _KEY && objectcl
18000 61 73 73 20 21 3d 20 43 4b 4f 5f 50 52 49 56 41  ass != CKO_PRIVA
18010 54 45 5f 4b 45 59 20 26 26 20 6f 62 6a 65 63 74  TE_KEY && object
18020 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 4e 45 54  class != CKO_NET
18030 53 43 41 50 45 5f 54 52 55 53 54 29 20 7b 0a 09  SCAPE_TRUST) {..
18040 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
18050 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
18060 30 20 6f 62 6a 65 63 74 73 20 28 4e 55 4c 4c 29  0 objects (NULL)
18070 2c 20 69 6e 76 61 6c 69 64 20 6f 62 6a 65 63 74  , invalid object
18080 20 63 6c 61 73 73 22 29 3b 0a 0a 09 09 72 65 74   class");....ret
18090 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09  urn(NULL);..}...
180a0 2f 2a 20 47 65 74 20 43 65 72 74 20 2a 2f 0a 09  /* Get Cert */..
180b0 69 66 20 28 69 64 65 6e 74 69 74 79 20 3d 3d 20  if (identity == 
180c0 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
180d0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
180e0 65 74 75 72 6e 69 6e 67 20 30 20 6f 62 6a 65 63  eturning 0 objec
180f0 74 73 20 28 4e 55 4c 4c 29 2c 20 69 6e 76 61 6c  ts (NULL), inval
18100 69 64 20 69 64 65 6e 74 69 79 20 70 72 6f 76 69  id identiy provi
18110 64 65 64 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ded");....return
18120 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 63 65 72  (NULL);..}...cer
18130 74 69 66 69 63 61 74 65 20 3d 20 69 64 65 6e 74  tificate = ident
18140 69 74 79 2d 3e 63 65 72 74 69 66 69 63 61 74 65  ity->certificate
18150 3b 0a 09 63 65 72 74 69 66 69 63 61 74 65 5f 6c  ;..certificate_l
18160 65 6e 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e 63  en = identity->c
18170 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 3b 0a  ertificate_len;.
18180 0a 09 69 66 20 28 63 65 72 74 69 66 69 63 61 74  ..if (certificat
18190 65 5f 6c 65 6e 20 3d 3d 20 2d 31 20 7c 7c 20 63  e_len == -1 || c
181a0 65 72 74 69 66 69 63 61 74 65 20 3d 3d 20 4e 55  ertificate == NU
181b0 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
181c0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
181d0 75 72 6e 69 6e 67 20 30 20 6f 62 6a 65 63 74 73  urning 0 objects
181e0 20 28 4e 55 4c 4c 29 2c 20 74 68 69 73 20 69 64   (NULL), this id
181f0 65 6e 74 69 74 79 20 64 6f 65 73 20 6e 6f 74 20  entity does not 
18200 68 61 76 65 20 61 6e 20 58 2e 35 30 39 20 63 65  have an X.509 ce
18210 72 74 69 66 69 63 61 74 65 20 61 73 73 6f 63 69  rtificate associ
18220 61 74 65 64 20 77 69 74 68 20 69 74 20 61 6e 64  ated with it and
18230 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 22 29   will not work")
18240 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c  ;....return(NULL
18250 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 56 65 72 69 66  );..}.../* Verif
18260 79 20 74 68 61 74 20 63 65 72 74 69 66 69 63 61  y that certifica
18270 74 65 20 69 73 20 41 53 4e 2e 31 20 65 6e 63 6f  te is ASN.1 enco
18280 64 65 64 20 58 2e 35 30 39 20 63 65 72 74 69 66  ded X.509 certif
18290 69 63 61 74 65 20 2a 2f 0a 09 69 66 20 28 78 35  icate */..if (x5
182a0 30 39 5f 74 6f 5f 73 65 72 69 61 6c 28 63 65 72  09_to_serial(cer
182b0 74 69 66 69 63 61 74 65 2c 20 63 65 72 74 69 66  tificate, certif
182c0 69 63 61 74 65 5f 6c 65 6e 2c 20 4e 55 4c 4c 29  icate_len, NULL)
182d0 20 3c 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59   < 0) {...CACKEY
182e0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
182f0 65 74 75 72 6e 69 6e 67 20 30 20 6f 62 6a 65 63  eturning 0 objec
18300 74 73 20 28 4e 55 4c 4c 29 2c 20 74 68 65 20 58  ts (NULL), the X
18310 2e 35 30 39 20 63 65 72 74 69 66 69 63 61 74 65  .509 certificate
18320 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
18330 20 74 68 69 73 20 69 64 65 6e 74 69 74 79 20 69   this identity i
18340 73 20 6e 6f 74 20 76 61 6c 69 64 22 29 3b 0a 0a  s not valid");..
18350 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a  ..return(NULL);.
18360 09 7d 0a 0a 09 72 65 74 76 61 6c 5f 63 6f 75 6e  .}...retval_coun
18370 74 20 3d 20 36 34 3b 0a 09 72 65 74 76 61 6c 20  t = 64;..retval 
18380 3d 20 6d 61 6c 6c 6f 63 28 72 65 74 76 61 6c 5f  = malloc(retval_
18390 63 6f 75 6e 74 20 2a 20 73 69 7a 65 6f 66 28 2a  count * sizeof(*
183a0 72 65 74 76 61 6c 29 29 3b 0a 0a 09 66 6f 72 20  retval));...for 
183b0 28 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 20  (curr_attr_type 
183c0 3d 20 30 3b 20 63 75 72 72 5f 61 74 74 72 5f 74  = 0; curr_attr_t
183d0 79 70 65 20 3c 20 30 78 63 65 35 33 36 33 62 66  ype < 0xce5363bf
183e0 3b 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65  ; curr_attr_type
183f0 2b 2b 29 20 7b 0a 09 09 69 66 20 28 63 75 72 72  ++) {...if (curr
18400 5f 61 74 74 72 5f 74 79 70 65 20 3d 3d 20 30 78  _attr_type == 0x
18410 38 30 30 29 20 7b 0a 09 09 09 63 75 72 72 5f 61  800) {....curr_a
18420 74 74 72 5f 74 79 70 65 20 3d 20 30 78 63 65 35  ttr_type = 0xce5
18430 33 36 33 30 30 3b 0a 09 09 7d 0a 0a 09 09 70 56  36300;...}....pV
18440 61 6c 75 65 5f 66 72 65 65 20 3d 20 30 3b 0a 09  alue_free = 0;..
18450 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a  .pValue = NULL;.
18460 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 28  ..ulValueLen = (
18470 43 4b 5f 4c 4f 4e 47 29 20 2d 31 3b 0a 0a 09 09  CK_LONG) -1;....
18480 73 77 69 74 63 68 20 28 63 75 72 72 5f 61 74 74  switch (curr_att
18490 72 5f 74 79 70 65 29 20 7b 0a 09 09 09 63 61 73  r_type) {....cas
184a0 65 20 43 4b 41 5f 43 4c 41 53 53 3a 0a 09 09 09  e CKA_CLASS:....
184b0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
184c0 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67  INTF("Requesting
184d0 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 43   attribute CKA_C
184e0 4c 41 53 53 20 28 30 78 25 30 38 6c 78 29 20 2e  LASS (0x%08lx) .
184f0 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ..", (unsigned l
18500 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74  ong) curr_attr_t
18510 79 70 65 29 3b 0a 0a 09 09 09 09 63 6b 5f 6f 62  ype);......ck_ob
18520 6a 65 63 74 5f 63 6c 61 73 73 20 3d 20 6f 62 6a  ject_class = obj
18530 65 63 74 63 6c 61 73 73 3b 0a 0a 09 09 09 09 70  ectclass;......p
18540 56 61 6c 75 65 20 3d 20 26 63 6b 5f 6f 62 6a 65  Value = &ck_obje
18550 63 74 5f 63 6c 61 73 73 3b 0a 09 09 09 09 75 6c  ct_class;.....ul
18560 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f  ValueLen = sizeo
18570 66 28 63 6b 5f 6f 62 6a 65 63 74 5f 63 6c 61 73  f(ck_object_clas
18580 73 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f  s);......CACKEY_
18590 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
185a0 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75  .. returning %lu
185b0 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73   (%p/%lu)", (uns
185c0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43  igned long) *((C
185d0 4b 5f 4f 42 4a 45 43 54 5f 43 4c 41 53 53 20 2a  K_OBJECT_CLASS *
185e0 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75  ) pValue), pValu
185f0 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  e, (unsigned lon
18600 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a  g) ulValueLen);.
18610 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
18620 61 73 65 20 43 4b 41 5f 54 4f 4b 45 4e 3a 0a 09  ase CKA_TOKEN:..
18630 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
18640 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69  PRINTF("Requesti
18650 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41  ng attribute CKA
18660 5f 54 4f 4b 45 4e 20 28 30 78 25 30 38 6c 78 29  _TOKEN (0x%08lx)
18670 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64   ...", (unsigned
18680 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72   long) curr_attr
18690 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 70 56 61  _type);......pVa
186a0 6c 75 65 20 3d 20 26 63 6b 5f 74 72 75 65 3b 0a  lue = &ck_true;.
186b0 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ....ulValueLen =
186c0 20 73 69 7a 65 6f 66 28 63 6b 5f 74 72 75 65 29   sizeof(ck_true)
186d0 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  ;......CACKEY_DE
186e0 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
186f0 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28   returning %lu (
18700 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67  %p/%lu)", (unsig
18710 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f  ned long) *((CK_
18720 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29  BBOOL *) pValue)
18730 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67  , pValue, (unsig
18740 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75  ned long) ulValu
18750 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61  eLen);......brea
18760 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 50  k;....case CKA_P
18770 52 49 56 41 54 45 3a 0a 09 09 09 09 43 41 43 4b  RIVATE:.....CACK
18780 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
18790 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72  "Requesting attr
187a0 69 62 75 74 65 20 43 4b 41 5f 50 52 49 56 41 54  ibute CKA_PRIVAT
187b0 45 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22  E (0x%08lx) ..."
187c0 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
187d0 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65  ) curr_attr_type
187e0 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65  );......if (obje
187f0 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 4e  ctclass != CKO_N
18800 45 54 53 43 41 50 45 5f 54 52 55 53 54 29 20 7b  ETSCAPE_TRUST) {
18810 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
18820 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
18830 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20  but not getting 
18840 69 74 20 62 65 63 61 75 73 65 20 77 65 20 61 72  it because we ar
18850 65 20 6e 6f 74 20 61 20 4e 65 74 73 63 61 70 65  e not a Netscape
18860 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29 3b   trust object");
18870 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .......break;...
18880 09 09 7d 0a 0a 09 09 09 09 70 56 61 6c 75 65 20  ..}......pValue 
18890 3d 20 26 63 6b 5f 66 61 6c 73 65 3b 0a 09 09 09  = &ck_false;....
188a0 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69  .ulValueLen = si
188b0 7a 65 6f 66 28 63 6b 5f 66 61 6c 73 65 29 3b 0a  zeof(ck_false);.
188c0 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
188d0 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72  G_PRINTF(" ... r
188e0 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70  eturning %lu (%p
188f0 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65  /%lu)", (unsigne
18900 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42  d long) *((CK_BB
18910 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c 20  OOL *) pValue), 
18920 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65  pValue, (unsigne
18930 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c  d long) ulValueL
18940 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b  en);......break;
18950 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 54 52 55  ....case CKA_TRU
18960 53 54 45 44 3a 0a 09 09 09 09 43 41 43 4b 45 59  STED:.....CACKEY
18970 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
18980 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62  equesting attrib
18990 75 74 65 20 43 4b 41 5f 54 52 55 53 54 45 44 20  ute CKA_TRUSTED 
189a0 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20  (0x%08lx) ...", 
189b0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
189c0 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b  curr_attr_type);
189d0 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74  ......if (object
189e0 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54  class == CKO_NET
189f0 53 43 41 50 45 5f 54 52 55 53 54 29 20 7b 0a 09  SCAPE_TRUST) {..
18a00 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
18a10 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75  _PRINTF(" ... bu
18a20 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74  t not getting it
18a30 20 62 65 63 61 75 73 65 20 77 65 20 61 72 65 20   because we are 
18a40 61 20 4e 65 74 73 63 61 70 65 20 74 72 75 73 74  a Netscape trust
18a50 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09   object");......
18a60 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09  .break;.....}...
18a70 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f  ...pValue = &ck_
18a80 74 72 75 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75  true;.....ulValu
18a90 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b  eLen = sizeof(ck
18aa0 5f 74 72 75 65 29 3b 0a 0a 09 09 09 09 43 41 43  _true);......CAC
18ab0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
18ac0 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67  (" ... returning
18ad0 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20   %lu (%p/%lu)", 
18ae0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
18af0 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70  *((CK_BBOOL *) p
18b00 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20  Value), pValue, 
18b10 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
18b20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09  ulValueLen);....
18b30 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
18b40 20 43 4b 41 5f 4d 4f 44 49 46 49 41 42 4c 45 3a   CKA_MODIFIABLE:
18b50 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
18b60 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73  G_PRINTF("Reques
18b70 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43  ting attribute C
18b80 4b 41 5f 4d 4f 44 49 46 49 41 42 4c 45 20 28 30  KA_MODIFIABLE (0
18b90 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75  x%08lx) ...", (u
18ba0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75  nsigned long) cu
18bb0 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a  rr_attr_type);..
18bc0 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b  ....pValue = &ck
18bd0 5f 66 61 6c 73 65 3b 0a 09 09 09 09 75 6c 56 61  _false;.....ulVa
18be0 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28  lueLen = sizeof(
18bf0 63 6b 5f 66 61 6c 73 65 29 3b 0a 0a 09 09 09 09  ck_false);......
18c00 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
18c10 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e  NTF(" ... return
18c20 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29  ing %lu (%p/%lu)
18c30 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
18c40 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a  g) *((CK_BBOOL *
18c50 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75  ) pValue), pValu
18c60 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  e, (unsigned lon
18c70 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a  g) ulValueLen);.
18c80 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
18c90 61 73 65 20 43 4b 41 5f 4c 41 42 45 4c 3a 0a 09  ase CKA_LABEL:..
18ca0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
18cb0 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69  PRINTF("Requesti
18cc0 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41  ng attribute CKA
18cd0 5f 4c 41 42 45 4c 20 28 30 78 25 30 38 6c 78 29  _LABEL (0x%08lx)
18ce0 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64   ...", (unsigned
18cf0 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72   long) curr_attr
18d00 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20  _type);......if 
18d10 28 69 64 65 6e 74 69 74 79 2d 3e 69 64 5f 74 79  (identity->id_ty
18d20 70 65 20 3d 3d 20 43 41 43 4b 45 59 5f 49 44 5f  pe == CACKEY_ID_
18d30 54 59 50 45 5f 50 49 56 29 20 7b 0a 09 09 09 09  TYPE_PIV) {.....
18d40 09 70 56 61 6c 75 65 20 3d 20 69 64 65 6e 74 69  .pValue = identi
18d50 74 79 2d 3e 63 61 72 64 2e 70 69 76 2e 6c 61 62  ty->card.piv.lab
18d60 65 6c 3b 0a 09 09 09 09 09 75 6c 56 61 6c 75 65  el;......ulValue
18d70 4c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 70 56 61  Len = strlen(pVa
18d80 6c 75 65 29 3b 0a 09 09 09 09 7d 20 65 6c 73 65  lue);.....} else
18d90 20 7b 0a 09 09 09 09 09 75 6c 56 61 6c 75 65 4c   {......ulValueL
18da0 65 6e 20 3d 20 73 6e 70 72 69 6e 74 66 28 28 63  en = snprintf((c
18db0 68 61 72 20 2a 29 20 75 63 54 6d 70 42 75 66 2c  har *) ucTmpBuf,
18dc0 20 73 69 7a 65 6f 66 28 75 63 54 6d 70 42 75 66   sizeof(ucTmpBuf
18dd0 29 2c 20 22 49 64 65 6e 74 69 74 79 20 23 25 6c  ), "Identity #%l
18de0 75 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  u", (unsigned lo
18df0 6e 67 29 20 69 64 65 6e 74 69 74 79 5f 6e 75 6d  ng) identity_num
18e00 29 3b 0a 09 09 09 09 09 70 56 61 6c 75 65 20 3d  );......pValue =
18e10 20 75 63 54 6d 70 42 75 66 3b 0a 0a 09 09 09 09   ucTmpBuf;......
18e20 09 69 66 20 28 75 6c 56 61 6c 75 65 4c 65 6e 20  .if (ulValueLen 
18e30 3e 3d 20 73 69 7a 65 6f 66 28 75 63 54 6d 70 42  >= sizeof(ucTmpB
18e40 75 66 29 29 20 7b 0a 09 09 09 09 09 09 75 6c 56  uf)) {.......ulV
18e50 61 6c 75 65 4c 65 6e 20 3d 20 30 3b 0a 09 09 09  alueLen = 0;....
18e60 09 09 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c  ...pValue = NULL
18e70 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 0a  ;......}.....}..
18e80 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
18e90 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65  _PRINTF(" ... re
18ea0 74 75 72 6e 69 6e 67 20 28 25 70 2f 25 6c 75 29  turning (%p/%lu)
18eb0 22 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69  ", pValue, (unsi
18ec0 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c  gned long) ulVal
18ed0 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65  ueLen);......bre
18ee0 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f  ak;....case CKA_
18ef0 56 41 4c 55 45 3a 0a 09 09 09 09 43 41 43 4b 45  VALUE:.....CACKE
18f00 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
18f10 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69  Requesting attri
18f20 62 75 74 65 20 43 4b 41 5f 56 41 4c 55 45 20 28  bute CKA_VALUE (
18f30 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28  0x%08lx) ...", (
18f40 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63  unsigned long) c
18f50 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a  urr_attr_type);.
18f60 0a 09 09 09 09 73 77 69 74 63 68 20 28 6f 62 6a  .....switch (obj
18f70 65 63 74 63 6c 61 73 73 29 20 7b 0a 09 09 09 09  ectclass) {.....
18f80 09 63 61 73 65 20 43 4b 4f 5f 50 52 49 56 41 54  .case CKO_PRIVAT
18f90 45 5f 4b 45 59 3a 0a 09 09 09 09 09 09 43 41 43  E_KEY:.......CAC
18fa0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
18fb0 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67  (" ... but not g
18fc0 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73  etting it becaus
18fd0 65 20 77 65 20 61 72 65 20 61 20 70 72 69 76 61  e we are a priva
18fe0 74 65 20 6b 65 79 2e 22 29 3b 0a 0a 09 09 09 09  te key.");......
18ff0 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 63 61  ..break;......ca
19000 73 65 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f  se CKO_NETSCAPE_
19010 54 52 55 53 54 3a 0a 09 09 09 09 09 09 43 41 43  TRUST:.......CAC
19020 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
19030 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67  (" ... but not g
19040 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73  etting it becaus
19050 65 20 77 65 20 61 72 65 20 61 20 4e 65 74 73 63  e we are a Netsc
19060 61 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74  ape trust object
19070 22 29 3b 0a 0a 09 09 09 09 09 09 62 72 65 61 6b  ");........break
19080 3b 0a 09 09 09 09 09 63 61 73 65 20 43 4b 4f 5f  ;......case CKO_
19090 50 55 42 4c 49 43 5f 4b 45 59 3a 0a 09 09 09 09  PUBLIC_KEY:.....
190a0 09 09 69 66 20 28 63 65 72 74 69 66 69 63 61 74  ..if (certificat
190b0 65 5f 6c 65 6e 20 3e 3d 20 30 29 20 7b 0a 09 09  e_len >= 0) {...
190c0 09 09 09 09 09 78 35 30 39 5f 72 65 61 64 5f 72  .....x509_read_r
190d0 65 74 20 3d 20 78 35 30 39 5f 74 6f 5f 70 75 62  et = x509_to_pub
190e0 6b 65 79 28 63 65 72 74 69 66 69 63 61 74 65 2c  key(certificate,
190f0 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e   certificate_len
19100 2c 20 26 70 56 61 6c 75 65 29 3b 0a 09 09 09 09  , &pValue);.....
19110 09 09 09 69 66 20 28 78 35 30 39 5f 72 65 61 64  ...if (x509_read
19120 5f 72 65 74 20 3c 20 30 29 20 7b 20 0a 09 09 09  _ret < 0) { ....
19130 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 4e 55  .....pValue = NU
19140 4c 4c 3b 0a 09 09 09 09 09 09 09 7d 20 65 6c 73  LL;........} els
19150 65 20 7b 0a 09 09 09 09 09 09 09 09 75 6c 56 61  e {.........ulVa
19160 6c 75 65 4c 65 6e 20 3d 20 78 35 30 39 5f 72 65  lueLen = x509_re
19170 61 64 5f 72 65 74 3b 0a 09 09 09 09 09 09 09 7d  ad_ret;........}
19180 0a 09 09 09 09 09 09 7d 0a 0a 09 09 09 09 09 09  .......}........
19190 62 72 65 61 6b 3b 0a 09 09 09 09 09 63 61 73 65  break;......case
191a0 20 43 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 45   CKO_CERTIFICATE
191b0 3a 0a 09 09 09 09 09 09 70 56 61 6c 75 65 20 3d  :.......pValue =
191c0 20 63 65 72 74 69 66 69 63 61 74 65 3b 0a 09 09   certificate;...
191d0 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ....ulValueLen =
191e0 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e   certificate_len
191f0 3b 0a 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a  ;........break;.
19200 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45  ....}......CACKE
19210 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
19220 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25   ... returning %
19230 70 2f 25 6c 75 22 2c 20 70 56 61 6c 75 65 2c 20  p/%lu", pValue, 
19240 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
19250 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09  ulValueLen);....
19260 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
19270 20 43 4b 41 5f 49 53 53 55 45 52 3a 0a 09 09 09   CKA_ISSUER:....
19280 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
19290 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67  INTF("Requesting
192a0 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 49   attribute CKA_I
192b0 53 53 55 45 52 20 28 30 78 25 30 38 6c 78 29 20  SSUER (0x%08lx) 
192c0 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  ...", (unsigned 
192d0 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f  long) curr_attr_
192e0 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28  type);......if (
192f0 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43  objectclass != C
19300 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 45 20 26  KO_CERTIFICATE &
19310 26 20 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d  & objectclass !=
19320 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52   CKO_NETSCAPE_TR
19330 55 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b  UST) {......CACK
19340 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
19350 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65  " ... but not ge
19360 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65  tting it because
19370 20 77 65 20 61 72 65 20 6e 6f 74 20 61 20 63 65   we are not a ce
19380 72 74 69 66 69 63 61 74 65 20 6f 72 20 4e 65 74  rtificate or Net
19390 73 63 61 70 65 20 74 72 75 73 74 20 6f 62 6a 65  scape trust obje
193a0 63 74 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61  ct");.......brea
193b0 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69 66  k;.....}......if
193c0 20 28 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65   (certificate_le
193d0 6e 20 3e 3d 20 30 29 20 7b 0a 09 09 09 09 09 78  n >= 0) {......x
193e0 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3d 20 78  509_read_ret = x
193f0 35 30 39 5f 74 6f 5f 69 73 73 75 65 72 28 63 65  509_to_issuer(ce
19400 72 74 69 66 69 63 61 74 65 2c 20 63 65 72 74 69  rtificate, certi
19410 66 69 63 61 74 65 5f 6c 65 6e 2c 20 26 70 56 61  ficate_len, &pVa
19420 6c 75 65 29 3b 0a 09 09 09 09 09 69 66 20 28 78  lue);......if (x
19430 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3c 20 30  509_read_ret < 0
19440 29 20 7b 0a 09 09 09 09 09 09 70 56 61 6c 75 65  ) {.......pValue
19450 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 7d 20   = NULL;......} 
19460 65 6c 73 65 20 7b 0a 09 09 09 09 09 09 75 6c 56  else {.......ulV
19470 61 6c 75 65 4c 65 6e 20 3d 20 78 35 30 39 5f 72  alueLen = x509_r
19480 65 61 64 5f 72 65 74 3b 0a 09 09 09 09 09 7d 0a  ead_ret;......}.
19490 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45  ....}......CACKE
194a0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
194b0 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25   ... returning %
194c0 70 2f 25 6c 75 22 2c 20 70 56 61 6c 75 65 2c 20  p/%lu", pValue, 
194d0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
194e0 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09  ulValueLen);....
194f0 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
19500 20 43 4b 41 5f 53 45 52 49 41 4c 5f 4e 55 4d 42   CKA_SERIAL_NUMB
19510 45 52 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  ER:.....CACKEY_D
19520 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71  EBUG_PRINTF("Req
19530 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74  uesting attribut
19540 65 20 43 4b 41 5f 53 45 52 49 41 4c 5f 4e 55 4d  e CKA_SERIAL_NUM
19550 42 45 52 20 28 30 78 25 30 38 6c 78 29 20 2e 2e  BER (0x%08lx) ..
19560 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  .", (unsigned lo
19570 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79  ng) curr_attr_ty
19580 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62  pe);......if (ob
19590 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f  jectclass != CKO
195a0 5f 43 45 52 54 49 46 49 43 41 54 45 20 26 26 20  _CERTIFICATE && 
195b0 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43  objectclass != C
195c0 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53  KO_NETSCAPE_TRUS
195d0 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59  T) {......CACKEY
195e0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
195f0 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74  ... but not gett
19600 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77  ing it because w
19610 65 20 61 72 65 20 6e 6f 74 20 61 20 63 65 72 74  e are not a cert
19620 69 66 69 63 61 74 65 20 6f 72 20 4e 65 74 73 63  ificate or Netsc
19630 61 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74  ape trust object
19640 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b  ");.......break;
19650 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69 66 20 28  .....}......if (
19660 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20  certificate_len 
19670 3e 3d 20 30 29 20 7b 0a 09 09 09 09 09 78 35 30  >= 0) {......x50
19680 39 5f 72 65 61 64 5f 72 65 74 20 3d 20 78 35 30  9_read_ret = x50
19690 39 5f 74 6f 5f 73 65 72 69 61 6c 28 63 65 72 74  9_to_serial(cert
196a0 69 66 69 63 61 74 65 2c 20 63 65 72 74 69 66 69  ificate, certifi
196b0 63 61 74 65 5f 6c 65 6e 2c 20 26 70 56 61 6c 75  cate_len, &pValu
196c0 65 29 3b 0a 09 09 09 09 09 69 66 20 28 78 35 30  e);......if (x50
196d0 39 5f 72 65 61 64 5f 72 65 74 20 3c 20 30 29 20  9_read_ret < 0) 
196e0 7b 0a 09 09 09 09 09 09 70 56 61 6c 75 65 20 3d  {.......pValue =
196f0 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 7d 20 65 6c   NULL;......} el
19700 73 65 20 7b 0a 09 09 09 09 09 09 75 6c 56 61 6c  se {.......ulVal
19710 75 65 4c 65 6e 20 3d 20 78 35 30 39 5f 72 65 61  ueLen = x509_rea
19720 64 5f 72 65 74 3b 0a 09 09 09 09 09 7d 0a 09 09  d_ret;......}...
19730 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f  ..}......CACKEY_
19740 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
19750 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 28 25 70  .. returning (%p
19760 2f 25 6c 75 29 22 2c 20 70 56 61 6c 75 65 2c 20  /%lu)", pValue, 
19770 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
19780 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09  ulValueLen);....
19790 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
197a0 20 43 4b 41 5f 53 55 42 4a 45 43 54 3a 0a 09 09   CKA_SUBJECT:...
197b0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
197c0 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e  RINTF("Requestin
197d0 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f  g attribute CKA_
197e0 53 55 42 4a 45 43 54 20 28 30 78 25 30 38 6c 78  SUBJECT (0x%08lx
197f0 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65  ) ...", (unsigne
19800 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74  d long) curr_att
19810 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66  r_type);......if
19820 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d   (objectclass !=
19830 20 43 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 45   CKO_CERTIFICATE
19840 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f  ) {......CACKEY_
19850 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
19860 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69  .. but not getti
19870 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77 65  ng it because we
19880 20 61 72 65 20 6e 6f 74 20 61 20 63 65 72 74 69   are not a certi
19890 66 69 63 61 74 65 22 29 3b 0a 0a 09 09 09 09 09  ficate");.......
198a0 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09  break;.....}....
198b0 09 09 69 66 20 28 63 65 72 74 69 66 69 63 61 74  ..if (certificat
198c0 65 5f 6c 65 6e 20 3e 3d 20 30 29 20 7b 0a 09 09  e_len >= 0) {...
198d0 09 09 09 78 35 30 39 5f 72 65 61 64 5f 72 65 74  ...x509_read_ret
198e0 20 3d 20 78 35 30 39 5f 74 6f 5f 73 75 62 6a 65   = x509_to_subje
198f0 63 74 28 63 65 72 74 69 66 69 63 61 74 65 2c 20  ct(certificate, 
19900 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c  certificate_len,
19910 20 26 70 56 61 6c 75 65 29 3b 0a 09 09 09 09 09   &pValue);......
19920 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72 65  if (x509_read_re
19930 74 20 3c 20 30 29 20 7b 0a 09 09 09 09 09 09 70  t < 0) {.......p
19940 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09  Value = NULL;...
19950 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09  ...} else {.....
19960 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 78  ..ulValueLen = x
19970 35 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09 09  509_read_ret;...
19980 09 09 09 7d 0a 09 09 09 09 7d 0a 0a 09 09 09 09  ...}.....}......
19990 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
199a0 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e  NTF(" ... return
199b0 69 6e 67 20 25 70 2f 25 6c 75 22 2c 20 70 56 61  ing %p/%lu", pVa
199c0 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  lue, (unsigned l
199d0 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29  ong) ulValueLen)
199e0 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  ;......break;...
199f0 09 63 61 73 65 20 43 4b 41 5f 49 44 3a 0a 09 09  .case CKA_ID:...
19a00 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
19a10 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e  RINTF("Requestin
19a20 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f  g attribute CKA_
19a30 49 44 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e  ID (0x%08lx) ...
19a40 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
19a50 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70  g) curr_attr_typ
19a60 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a  e);......if (obj
19a70 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f  ectclass == CKO_
19a80 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54 29 20  NETSCAPE_TRUST) 
19a90 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45  {......CACKEY_DE
19aa0 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
19ab0 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67   but not getting
19ac0 20 69 74 20 62 65 63 61 75 73 65 20 77 65 20 61   it because we a
19ad0 72 65 20 61 20 4e 65 74 73 63 61 70 65 20 74 72  re a Netscape tr
19ae0 75 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09  ust object");...
19af0 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d  ....break;.....}
19b00 0a 0a 09 09 09 09 75 63 54 6d 70 42 75 66 5b 30  ......ucTmpBuf[0
19b10 5d 20 3d 20 28 28 69 64 65 6e 74 69 74 79 5f 6e  ] = ((identity_n
19b20 75 6d 20 2b 20 31 29 20 3e 3e 20 38 29 20 26 20  um + 1) >> 8) & 
19b30 30 78 66 66 3b 0a 09 09 09 09 75 63 54 6d 70 42  0xff;.....ucTmpB
19b40 75 66 5b 31 5d 20 3d 20 20 28 69 64 65 6e 74 69  uf[1] =  (identi
19b50 74 79 5f 6e 75 6d 20 2b 20 31 29 20 26 20 30 78  ty_num + 1) & 0x
19b60 66 66 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65 20  ff;......pValue 
19b70 3d 20 26 75 63 54 6d 70 42 75 66 3b 0a 09 09 09  = &ucTmpBuf;....
19b80 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 32 3b  .ulValueLen = 2;
19b90 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
19ba0 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
19bb0 72 65 74 75 72 6e 69 6e 67 20 25 70 2f 25 6c 75  returning %p/%lu
19bc0 22 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69  ", pValue, (unsi
19bd0 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c  gned long) ulVal
19be0 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65  ueLen);......bre
19bf0 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f  ak;....case CKA_
19c00 43 45 52 54 49 46 49 43 41 54 45 5f 54 59 50 45  CERTIFICATE_TYPE
19c10 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  :.....CACKEY_DEB
19c20 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65  UG_PRINTF("Reque
19c30 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20  sting attribute 
19c40 43 4b 41 5f 43 45 52 54 49 46 49 43 41 54 45 5f  CKA_CERTIFICATE_
19c50 54 59 50 45 20 28 30 78 25 30 38 6c 78 29 20 2e  TYPE (0x%08lx) .
19c60 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ..", (unsigned l
19c70 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74  ong) curr_attr_t
19c80 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f  ype);......if (o
19c90 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b  bjectclass != CK
19ca0 4f 5f 43 45 52 54 49 46 49 43 41 54 45 29 20 7b  O_CERTIFICATE) {
19cb0 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
19cc0 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
19cd0 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20  but not getting 
19ce0 69 74 20 62 65 63 61 75 73 65 20 77 65 20 61 72  it because we ar
19cf0 65 20 6e 6f 74 20 61 20 63 65 72 74 69 66 69 63  e not a certific
19d00 61 74 65 2e 22 29 3b 0a 0a 09 09 09 09 09 62 72  ate.");.......br
19d10 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09  eak;.....}......
19d20 2f 2a 20 57 65 20 6f 6e 6c 79 20 73 75 70 70 6f  /* We only suppo
19d30 72 74 20 6f 6e 65 20 63 65 72 74 69 66 69 63 61  rt one certifica
19d40 74 65 20 74 79 70 65 20 2a 2f 0a 09 09 09 09 63  te type */.....c
19d50 6b 5f 63 65 72 74 69 66 69 63 61 74 65 5f 74 79  k_certificate_ty
19d60 70 65 20 3d 20 43 4b 43 5f 58 5f 35 30 39 3b 0a  pe = CKC_X_509;.
19d70 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63  .....pValue = &c
19d80 6b 5f 63 65 72 74 69 66 69 63 61 74 65 5f 74 79  k_certificate_ty
19d90 70 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c  pe;.....ulValueL
19da0 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 63  en = sizeof(ck_c
19db0 65 72 74 69 66 69 63 61 74 65 5f 74 79 70 65 29  ertificate_type)
19dc0 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  ;......CACKEY_DE
19dd0 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
19de0 20 72 65 74 75 72 6e 69 6e 67 20 43 4b 43 5f 58   returning CKC_X
19df0 5f 35 30 39 20 28 25 6c 75 29 20 28 25 70 2f 25  _509 (%lu) (%p/%
19e00 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  lu)", (unsigned 
19e10 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 43 45 52 54  long) *((CK_CERT
19e20 49 46 49 43 41 54 45 5f 54 59 50 45 20 2a 29 20  IFICATE_TYPE *) 
19e30 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c  pValue), pValue,
19e40 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
19e50 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09   ulValueLen);...
19e60 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
19e70 65 20 43 4b 41 5f 4b 45 59 5f 54 59 50 45 3a 0a  e CKA_KEY_TYPE:.
19e80 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
19e90 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74  _PRINTF("Request
19ea0 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b  ing attribute CK
19eb0 41 5f 4b 45 59 5f 54 59 50 45 20 28 30 78 25 30  A_KEY_TYPE (0x%0
19ec0 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69  8lx) ...", (unsi
19ed0 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f  gned long) curr_
19ee0 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09  attr_type);.....
19ef0 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73  .if (objectclass
19f00 20 21 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f   != CKO_PRIVATE_
19f10 4b 45 59 20 26 26 20 6f 62 6a 65 63 74 63 6c 61  KEY && objectcla
19f20 73 73 20 21 3d 20 43 4b 4f 5f 50 55 42 4c 49 43  ss != CKO_PUBLIC
19f30 5f 4b 45 59 29 20 7b 0a 09 09 09 09 09 43 41 43  _KEY) {......CAC
19f40 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
19f50 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67  (" ... but not g
19f60 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73  etting it becaus
19f70 65 20 77 65 20 61 72 65 20 6e 6f 74 20 61 20 6b  e we are not a k
19f80 65 79 2e 22 29 3b 0a 0a 09 09 09 09 09 62 72 65  ey.");.......bre
19f90 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 2f  ak;.....}....../
19fa0 2a 20 57 65 20 6f 6e 6c 79 20 73 75 70 70 6f 72  * We only suppor
19fb0 74 20 6f 6e 65 20 6b 65 79 20 74 79 70 65 20 2a  t one key type *
19fc0 2f 0a 09 09 09 09 63 6b 5f 6b 65 79 5f 74 79 70  /.....ck_key_typ
19fd0 65 20 3d 20 43 4b 4b 5f 52 53 41 3b 0a 0a 09 09  e = CKK_RSA;....
19fe0 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 6b  ..pValue = &ck_k
19ff0 65 79 5f 74 79 70 65 3b 0a 09 09 09 09 75 6c 56  ey_type;.....ulV
1a000 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66  alueLen = sizeof
1a010 28 63 6b 5f 6b 65 79 5f 74 79 70 65 29 3b 0a 0a  (ck_key_type);..
1a020 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
1a030 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65  _PRINTF(" ... re
1a040 74 75 72 6e 69 6e 67 20 43 4b 4b 5f 52 53 41 20  turning CKK_RSA 
1a050 28 25 6c 75 29 20 28 25 70 2f 25 6c 75 29 22 2c  (%lu) (%p/%lu)",
1a060 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
1a070 20 2a 28 28 43 4b 5f 43 45 52 54 49 46 49 43 41   *((CK_CERTIFICA
1a080 54 45 5f 54 59 50 45 20 2a 29 20 70 56 61 6c 75  TE_TYPE *) pValu
1a090 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73  e), pValue, (uns
1a0a0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61  igned long) ulVa
1a0b0 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72  lueLen);......br
1a0c0 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41  eak;....case CKA
1a0d0 5f 53 49 47 4e 3a 0a 09 09 09 09 43 41 43 4b 45  _SIGN:.....CACKE
1a0e0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1a0f0 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69  Requesting attri
1a100 62 75 74 65 20 43 4b 41 5f 53 49 47 4e 20 28 30  bute CKA_SIGN (0
1a110 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75  x%08lx) ...", (u
1a120 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75  nsigned long) cu
1a130 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a  rr_attr_type);..
1a140 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c  ....if (objectcl
1a150 61 73 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43  ass == CKO_NETSC
1a160 41 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09  APE_TRUST) {....
1a170 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1a180 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20  RINTF(" ... but 
1a190 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 62  not getting it b
1a1a0 65 63 61 75 73 65 20 77 65 20 61 72 65 20 61 20  ecause we are a 
1a1b0 4e 65 74 73 63 61 70 65 20 74 72 75 73 74 20 6f  Netscape trust o
1a1c0 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62  bject");.......b
1a1d0 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09  reak;.....}.....
1a1e0 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73  .if (objectclass
1a1f0 20 3d 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f   == CKO_PRIVATE_
1a200 4b 45 59 29 20 7b 0a 09 09 09 09 09 70 56 61 6c  KEY) {......pVal
1a210 75 65 20 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09  ue = &ck_true;..
1a220 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ....ulValueLen =
1a230 20 73 69 7a 65 6f 66 28 63 6b 5f 74 72 75 65 29   sizeof(ck_true)
1a240 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09  ;.....} else {..
1a250 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b  ....pValue = &ck
1a260 5f 66 61 6c 73 65 3b 0a 09 09 09 09 09 75 6c 56  _false;......ulV
1a270 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66  alueLen = sizeof
1a280 28 63 6b 5f 66 61 6c 73 65 29 3b 0a 09 09 09 09  (ck_false);.....
1a290 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  }......CACKEY_DE
1a2a0 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
1a2b0 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28   returning %lu (
1a2c0 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67  %p/%lu)", (unsig
1a2d0 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f  ned long) *((CK_
1a2e0 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29  BBOOL *) pValue)
1a2f0 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67  , pValue, (unsig
1a300 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75  ned long) ulValu
1a310 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61  eLen);......brea
1a320 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 53  k;....case CKA_S
1a330 49 47 4e 5f 52 45 43 4f 56 45 52 3a 0a 09 09 09  IGN_RECOVER:....
1a340 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1a350 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67  INTF("Requesting
1a360 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 53   attribute CKA_S
1a370 49 47 4e 5f 52 45 43 4f 56 45 52 20 28 30 78 25  IGN_RECOVER (0x%
1a380 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73  08lx) ...", (uns
1a390 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72  igned long) curr
1a3a0 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09  _attr_type);....
1a3b0 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73  ..if (objectclas
1a3c0 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50  s == CKO_NETSCAP
1a3d0 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 09 09  E_TRUST) {......
1a3e0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1a3f0 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f  NTF(" ... but no
1a400 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63  t getting it bec
1a410 61 75 73 65 20 77 65 20 61 72 65 20 61 20 4e 65  ause we are a Ne
1a420 74 73 63 61 70 65 20 74 72 75 73 74 20 6f 62 6a  tscape trust obj
1a430 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62 72 65  ect");.......bre
1a440 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 2f  ak;.....}....../
1a450 2a 20 57 65 20 63 75 72 72 65 6e 74 6c 79 20 6f  * We currently o
1a460 6e 6c 79 20 73 75 70 70 6f 72 74 20 22 53 69 67  nly support "Sig
1a470 6e 20 77 69 74 68 20 41 70 70 65 6e 64 69 78 22  n with Appendix"
1a480 20 2a 2f 0a 09 09 09 09 70 56 61 6c 75 65 20 3d   */.....pValue =
1a490 20 26 63 6b 5f 66 61 6c 73 65 3b 0a 09 09 09 09   &ck_false;.....
1a4a0 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a  ulValueLen = siz
1a4b0 65 6f 66 28 63 6b 5f 66 61 6c 73 65 29 3b 0a 0a  eof(ck_false);..
1a4c0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
1a4d0 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65  _PRINTF(" ... re
1a4e0 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f  turning %lu (%p/
1a4f0 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64  %lu)", (unsigned
1a500 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f   long) *((CK_BBO
1a510 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70  OL *) pValue), p
1a520 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64  Value, (unsigned
1a530 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65   long) ulValueLe
1a540 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a  n);......break;.
1a550 09 09 09 63 61 73 65 20 43 4b 41 5f 44 45 43 52  ...case CKA_DECR
1a560 59 50 54 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f  YPT:.....CACKEY_
1a570 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
1a580 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75  questing attribu
1a590 74 65 20 43 4b 41 5f 44 45 43 52 59 50 54 20 28  te CKA_DECRYPT (
1a5a0 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28  0x%08lx) ...", (
1a5b0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63  unsigned long) c
1a5c0 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a  urr_attr_type);.
1a5d0 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63  .....if (objectc
1a5e0 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53  lass == CKO_NETS
1a5f0 43 41 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 09  CAPE_TRUST) {...
1a600 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1a610 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74  PRINTF(" ... but
1a620 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20   not getting it 
1a630 62 65 63 61 75 73 65 20 77 65 20 61 72 65 20 61  because we are a
1a640 20 4e 65 74 73 63 61 70 65 20 74 72 75 73 74 20   Netscape trust 
1a650 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09  object");.......
1a660 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09  break;.....}....
1a670 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73  ..if (objectclas
1a680 73 20 3d 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45  s == CKO_PRIVATE
1a690 5f 4b 45 59 20 7c 7c 20 6f 62 6a 65 63 74 63 6c  _KEY || objectcl
1a6a0 61 73 73 20 3d 3d 20 43 4b 4f 5f 50 55 42 4c 49  ass == CKO_PUBLI
1a6b0 43 5f 4b 45 59 29 20 7b 0a 09 09 09 09 09 70 56  C_KEY) {......pV
1a6c0 61 6c 75 65 20 3d 20 26 63 6b 5f 74 72 75 65 3b  alue = &ck_true;
1a6d0 0a 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e  ......ulValueLen
1a6e0 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 74 72 75   = sizeof(ck_tru
1a6f0 65 29 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b  e);.....} else {
1a700 0a 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26  ......pValue = &
1a710 63 6b 5f 66 61 6c 73 65 3b 0a 09 09 09 09 09 75  ck_false;......u
1a720 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65  lValueLen = size
1a730 6f 66 28 63 6b 5f 66 61 6c 73 65 29 3b 0a 09 09  of(ck_false);...
1a740 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f  ..}......CACKEY_
1a750 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
1a760 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75  .. returning %lu
1a770 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73   (%p/%lu)", (uns
1a780 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43  igned long) *((C
1a790 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75  K_BBOOL *) pValu
1a7a0 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73  e), pValue, (uns
1a7b0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61  igned long) ulVa
1a7c0 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72  lueLen);......br
1a7d0 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41  eak;....case CKA
1a7e0 5f 53 45 4e 53 49 54 49 56 45 3a 0a 09 09 09 09  _SENSITIVE:.....
1a7f0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1a800 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20  NTF("Requesting 
1a810 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 53 45  attribute CKA_SE
1a820 4e 53 49 54 49 56 45 20 28 30 78 25 30 38 6c 78  NSITIVE (0x%08lx
1a830 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65  ) ...", (unsigne
1a840 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74  d long) curr_att
1a850 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66  r_type);......if
1a860 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d   (objectclass ==
1a870 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52   CKO_NETSCAPE_TR
1a880 55 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b  UST) {......CACK
1a890 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1a8a0 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65  " ... but not ge
1a8b0 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65  tting it because
1a8c0 20 77 65 20 61 72 65 20 61 20 4e 65 74 73 63 61   we are a Netsca
1a8d0 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22  pe trust object"
1a8e0 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a  );.......break;.
1a8f0 09 09 09 09 7d 0a 0a 09 09 09 09 69 66 20 28 6f  ....}......if (o
1a900 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b  bjectclass == CK
1a910 4f 5f 50 52 49 56 41 54 45 5f 4b 45 59 29 20 7b  O_PRIVATE_KEY) {
1a920 0a 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26  ......pValue = &
1a930 63 6b 5f 74 72 75 65 3b 0a 09 09 09 09 09 75 6c  ck_true;......ul
1a940 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f  ValueLen = sizeo
1a950 66 28 63 6b 5f 74 72 75 65 29 3b 0a 09 09 09 09  f(ck_true);.....
1a960 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 70 56  } else {......pV
1a970 61 6c 75 65 20 3d 20 26 63 6b 5f 66 61 6c 73 65  alue = &ck_false
1a980 3b 0a 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65  ;......ulValueLe
1a990 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 66 61  n = sizeof(ck_fa
1a9a0 6c 73 65 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09  lse);.....}.....
1a9b0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1a9c0 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72  INTF(" ... retur
1a9d0 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75  ning %lu (%p/%lu
1a9e0 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  )", (unsigned lo
1a9f0 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20  ng) *((CK_BBOOL 
1aa00 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c  *) pValue), pVal
1aa10 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  ue, (unsigned lo
1aa20 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b  ng) ulValueLen);
1aa30 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
1aa40 63 61 73 65 20 43 4b 41 5f 45 58 54 52 41 43 54  case CKA_EXTRACT
1aa50 41 42 4c 45 3a 0a 09 09 09 09 43 41 43 4b 45 59  ABLE:.....CACKEY
1aa60 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
1aa70 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62  equesting attrib
1aa80 75 74 65 20 43 4b 41 5f 45 58 54 52 41 43 54 41  ute CKA_EXTRACTA
1aa90 42 4c 45 20 28 30 78 25 30 38 6c 78 29 20 2e 2e  BLE (0x%08lx) ..
1aaa0 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  .", (unsigned lo
1aab0 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79  ng) curr_attr_ty
1aac0 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62  pe);......if (ob
1aad0 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f  jectclass == CKO
1aae0 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54 29  _NETSCAPE_TRUST)
1aaf0 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44   {......CACKEY_D
1ab00 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
1ab10 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e  . but not gettin
1ab20 67 20 69 74 20 62 65 63 61 75 73 65 20 77 65 20  g it because we 
1ab30 61 72 65 20 61 20 4e 65 74 73 63 61 70 65 20 74  are a Netscape t
1ab40 72 75 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a  rust object");..
1ab50 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09  .....break;.....
1ab60 7d 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63  }......if (objec
1ab70 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 50 52  tclass == CKO_PR
1ab80 49 56 41 54 45 5f 4b 45 59 29 20 7b 0a 09 09 09  IVATE_KEY) {....
1ab90 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 66  ..pValue = &ck_f
1aba0 61 6c 73 65 3b 0a 09 09 09 09 09 75 6c 56 61 6c  alse;......ulVal
1abb0 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63  ueLen = sizeof(c
1abc0 6b 5f 74 72 75 65 29 3b 0a 09 09 09 09 7d 20 65  k_true);.....} e
1abd0 6c 73 65 20 7b 0a 09 09 09 09 09 70 56 61 6c 75  lse {......pValu
1abe0 65 20 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09 09  e = &ck_true;...
1abf0 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  ...ulValueLen = 
1ac00 73 69 7a 65 6f 66 28 63 6b 5f 66 61 6c 73 65 29  sizeof(ck_false)
1ac10 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43  ;.....}......CAC
1ac20 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1ac30 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67  (" ... returning
1ac40 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20   %lu (%p/%lu)", 
1ac50 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
1ac60 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70  *((CK_BBOOL *) p
1ac70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20  Value), pValue, 
1ac80 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
1ac90 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09  ulValueLen);....
1aca0 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
1acb0 20 43 4b 41 5f 4d 4f 44 55 4c 55 53 3a 0a 09 09   CKA_MODULUS:...
1acc0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1acd0 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e  RINTF("Requestin
1ace0 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f  g attribute CKA_
1acf0 4d 4f 44 55 4c 55 53 20 28 30 78 25 30 38 6c 78  MODULUS (0x%08lx
1ad00 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65  ) ...", (unsigne
1ad10 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74  d long) curr_att
1ad20 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66  r_type);......if
1ad30 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d   (objectclass ==
1ad40 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52   CKO_NETSCAPE_TR
1ad50 55 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b  UST) {......CACK
1ad60 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1ad70 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65  " ... but not ge
1ad80 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65  tting it because
1ad90 20 77 65 20 61 72 65 20 61 20 4e 65 74 73 63 61   we are a Netsca
1ada0 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22  pe trust object"
1adb0 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a  );.......break;.
1adc0 09 09 09 09 7d 0a 0a 09 09 09 09 69 66 20 28 63  ....}......if (c
1add0 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3e  ertificate_len >
1ade0 3d 20 30 29 20 7b 0a 09 09 09 09 09 78 35 30 39  = 0) {......x509
1adf0 5f 72 65 61 64 5f 72 65 74 20 3d 20 78 35 30 39  _read_ret = x509
1ae00 5f 74 6f 5f 6d 6f 64 75 6c 75 73 28 63 65 72 74  _to_modulus(cert
1ae10 69 66 69 63 61 74 65 2c 20 63 65 72 74 69 66 69  ificate, certifi
1ae20 63 61 74 65 5f 6c 65 6e 2c 20 26 70 56 61 6c 75  cate_len, &pValu
1ae30 65 29 3b 0a 09 09 09 09 09 69 66 20 28 78 35 30  e);......if (x50
1ae40 39 5f 72 65 61 64 5f 72 65 74 20 3c 20 30 29 20  9_read_ret < 0) 
1ae50 7b 0a 09 09 09 09 09 09 70 56 61 6c 75 65 20 3d  {.......pValue =
1ae60 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 7d 20 65 6c   NULL;......} el
1ae70 73 65 20 7b 0a 09 09 09 09 09 09 75 6c 56 61 6c  se {.......ulVal
1ae80 75 65 4c 65 6e 20 3d 20 78 35 30 39 5f 72 65 61  ueLen = x509_rea
1ae90 64 5f 72 65 74 3b 0a 09 09 09 09 09 7d 0a 09 09  d_ret;......}...
1aea0 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f  ..}......CACKEY_
1aeb0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
1aec0 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 28 25 70  .. returning (%p
1aed0 2f 25 6c 75 29 22 2c 20 70 56 61 6c 75 65 2c 20  /%lu)", pValue, 
1aee0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
1aef0 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09  ulValueLen);....
1af00 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
1af10 20 43 4b 41 5f 50 55 42 4c 49 43 5f 45 58 50 4f   CKA_PUBLIC_EXPO
1af20 4e 45 4e 54 3a 0a 09 09 09 09 43 41 43 4b 45 59  NENT:.....CACKEY
1af30 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
1af40 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62  equesting attrib
1af50 75 74 65 20 43 4b 41 5f 50 55 42 4c 49 43 5f 45  ute CKA_PUBLIC_E
1af60 58 50 4f 4e 45 4e 54 20 28 30 78 25 30 38 6c 78  XPONENT (0x%08lx
1af70 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65  ) ...", (unsigne
1af80 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74  d long) curr_att
1af90 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66  r_type);......if
1afa0 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d   (objectclass ==
1afb0 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52   CKO_NETSCAPE_TR
1afc0 55 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b  UST) {......CACK
1afd0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1afe0 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65  " ... but not ge
1aff0 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65  tting it because
1b000 20 77 65 20 61 72 65 20 61 20 4e 65 74 73 63 61   we are a Netsca
1b010 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22  pe trust object"
1b020 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a  );.......break;.
1b030 09 09 09 09 7d 0a 0a 09 09 09 09 69 66 20 28 63  ....}......if (c
1b040 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3e  ertificate_len >
1b050 3d 20 30 29 20 7b 0a 09 09 09 09 09 78 35 30 39  = 0) {......x509
1b060 5f 72 65 61 64 5f 72 65 74 20 3d 20 78 35 30 39  _read_ret = x509
1b070 5f 74 6f 5f 65 78 70 6f 6e 65 6e 74 28 63 65 72  _to_exponent(cer
1b080 74 69 66 69 63 61 74 65 2c 20 63 65 72 74 69 66  tificate, certif
1b090 69 63 61 74 65 5f 6c 65 6e 2c 20 26 70 56 61 6c  icate_len, &pVal
1b0a0 75 65 29 3b 0a 09 09 09 09 09 69 66 20 28 78 35  ue);......if (x5
1b0b0 30 39 5f 72 65 61 64 5f 72 65 74 20 3c 20 30 29  09_read_ret < 0)
1b0c0 20 7b 0a 09 09 09 09 09 09 70 56 61 6c 75 65 20   {.......pValue 
1b0d0 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 7d 20 65  = NULL;......} e
1b0e0 6c 73 65 20 7b 0a 09 09 09 09 09 09 75 6c 56 61  lse {.......ulVa
1b0f0 6c 75 65 4c 65 6e 20 3d 20 78 35 30 39 5f 72 65  lueLen = x509_re
1b100 61 64 5f 72 65 74 3b 0a 09 09 09 09 09 7d 0a 09  ad_ret;......}..
1b110 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59  ...}......CACKEY
1b120 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
1b130 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 28 25  ... returning (%
1b140 70 2f 25 6c 75 29 22 2c 20 70 56 61 6c 75 65 2c  p/%lu)", pValue,
1b150 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
1b160 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09   ulValueLen);...
1b170 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
1b180 65 20 43 4b 41 5f 54 52 55 53 54 5f 44 49 47 49  e CKA_TRUST_DIGI
1b190 54 41 4c 5f 53 49 47 4e 41 54 55 52 45 3a 0a 09  TAL_SIGNATURE:..
1b1a0 09 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54  ..case CKA_TRUST
1b1b0 5f 4e 4f 4e 5f 52 45 50 55 44 49 41 54 49 4f 4e  _NON_REPUDIATION
1b1c0 3a 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 54 52  :....case CKA_TR
1b1d0 55 53 54 5f 4b 45 59 5f 45 4e 43 49 50 48 45 52  UST_KEY_ENCIPHER
1b1e0 4d 45 4e 54 3a 0a 09 09 09 63 61 73 65 20 43 4b  MENT:....case CK
1b1f0 41 5f 54 52 55 53 54 5f 44 41 54 41 5f 45 4e 43  A_TRUST_DATA_ENC
1b200 49 50 48 45 52 4d 45 4e 54 3a 0a 09 09 09 63 61  IPHERMENT:....ca
1b210 73 65 20 43 4b 41 5f 54 52 55 53 54 5f 4b 45 59  se CKA_TRUST_KEY
1b220 5f 41 47 52 45 45 4d 45 4e 54 3a 0a 09 09 09 63  _AGREEMENT:....c
1b230 61 73 65 20 43 4b 41 5f 54 52 55 53 54 5f 4b 45  ase CKA_TRUST_KE
1b240 59 5f 43 45 52 54 5f 53 49 47 4e 3a 0a 09 09 09  Y_CERT_SIGN:....
1b250 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54 5f 43  case CKA_TRUST_C
1b260 52 4c 5f 53 49 47 4e 3a 0a 09 09 09 63 61 73 65  RL_SIGN:....case
1b270 20 43 4b 41 5f 54 52 55 53 54 5f 53 45 52 56 45   CKA_TRUST_SERVE
1b280 52 5f 41 55 54 48 3a 0a 09 09 09 63 61 73 65 20  R_AUTH:....case 
1b290 43 4b 41 5f 54 52 55 53 54 5f 43 4c 49 45 4e 54  CKA_TRUST_CLIENT
1b2a0 5f 41 55 54 48 3a 0a 09 09 09 63 61 73 65 20 43  _AUTH:....case C
1b2b0 4b 41 5f 54 52 55 53 54 5f 43 4f 44 45 5f 53 49  KA_TRUST_CODE_SI
1b2c0 47 4e 49 4e 47 3a 0a 09 09 09 63 61 73 65 20 43  GNING:....case C
1b2d0 4b 41 5f 54 52 55 53 54 5f 45 4d 41 49 4c 5f 50  KA_TRUST_EMAIL_P
1b2e0 52 4f 54 45 43 54 49 4f 4e 3a 0a 09 09 09 09 43  ROTECTION:.....C
1b2f0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1b300 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61  TF("Requesting a
1b310 74 74 72 69 62 75 74 65 20 43 4b 41 5f 54 52 55  ttribute CKA_TRU
1b320 53 54 5f 2e 2e 2e 20 28 30 78 25 30 38 6c 78 29  ST_... (0x%08lx)
1b330 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64   ...", (unsigned
1b340 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72   long) curr_attr
1b350 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 70 56 61  _type);......pVa
1b360 6c 75 65 20 3d 20 26 63 6b 5f 74 72 75 73 74 65  lue = &ck_truste
1b370 64 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65  d;.....ulValueLe
1b380 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 74 72  n = sizeof(ck_tr
1b390 75 73 74 65 64 29 3b 0a 0a 09 09 09 09 43 41 43  usted);......CAC
1b3a0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1b3b0 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67  (" ... returning
1b3c0 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20   %lu (%p/%lu)", 
1b3d0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
1b3e0 2a 28 28 43 4b 5f 54 52 55 53 54 20 2a 29 20 70  *((CK_TRUST *) p
1b3f0 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20  Value), pValue, 
1b400 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
1b410 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09  ulValueLen);....
1b420 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
1b430 20 43 4b 41 5f 43 45 52 54 5f 53 48 41 31 5f 48   CKA_CERT_SHA1_H
1b440 41 53 48 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f  ASH:.....CACKEY_
1b450 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
1b460 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75  questing attribu
1b470 74 65 20 43 4b 41 5f 43 45 52 54 5f 53 48 41 31  te CKA_CERT_SHA1
1b480 5f 48 41 53 48 20 28 30 78 25 30 38 6c 78 29 20  _HASH (0x%08lx) 
1b490 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  ...", (unsigned 
1b4a0 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f  long) curr_attr_
1b4b0 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28  type);......if (
1b4c0 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43  objectclass != C
1b4d0 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53  KO_NETSCAPE_TRUS
1b4e0 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59  T) {......CACKEY
1b4f0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
1b500 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74  ... but not gett
1b510 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77  ing it because w
1b520 65 20 61 72 65 20 6e 6f 74 20 61 20 4e 65 74 73  e are not a Nets
1b530 63 61 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63  cape trust objec
1b540 74 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b  t");.......break
1b550 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 53 48 41  ;.....}......SHA
1b560 31 52 65 73 65 74 28 26 73 68 61 31 5f 63 74 78  1Reset(&sha1_ctx
1b570 29 3b 0a 09 09 09 09 53 48 41 31 49 6e 70 75 74  );.....SHA1Input
1b580 28 26 73 68 61 31 5f 63 74 78 2c 20 63 65 72 74  (&sha1_ctx, cert
1b590 69 66 69 63 61 74 65 2c 20 63 65 72 74 69 66 69  ificate, certifi
1b5a0 63 61 74 65 5f 6c 65 6e 29 3b 0a 09 09 09 09 53  cate_len);.....S
1b5b0 48 41 31 52 65 73 75 6c 74 28 26 73 68 61 31 5f  HA1Result(&sha1_
1b5c0 63 74 78 2c 20 73 68 61 31 5f 68 61 73 68 29 3b  ctx, sha1_hash);
1b5d0 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 73  ......pValue = s
1b5e0 68 61 31 5f 68 61 73 68 3b 0a 09 09 09 09 75 6c  ha1_hash;.....ul
1b5f0 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f  ValueLen = sizeo
1b600 66 28 73 68 61 31 5f 68 61 73 68 29 3b 0a 0a 09  f(sha1_hash);...
1b610 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1b620 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74  PRINTF(" ... ret
1b630 75 72 6e 69 6e 67 20 25 70 2f 25 6c 75 22 2c 20  urning %p/%lu", 
1b640 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65  pValue, (unsigne
1b650 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c  d long) ulValueL
1b660 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b  en);......break;
1b670 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 43 45 52  ....case CKA_CER
1b680 54 5f 4d 44 35 5f 48 41 53 48 3a 0a 09 09 09 09  T_MD5_HASH:.....
1b690 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1b6a0 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20  NTF("Requesting 
1b6b0 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 43 45  attribute CKA_CE
1b6c0 52 54 5f 4d 44 35 5f 48 41 53 48 20 28 30 78 25  RT_MD5_HASH (0x%
1b6d0 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73  08lx) ...", (uns
1b6e0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72  igned long) curr
1b6f0 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09  _attr_type);....
1b700 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73  ..if (objectclas
1b710 73 20 21 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50  s != CKO_NETSCAP
1b720 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 09 09  E_TRUST) {......
1b730 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1b740 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f  NTF(" ... but no
1b750 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63  t getting it bec
1b760 61 75 73 65 20 77 65 20 61 72 65 20 6e 6f 74 20  ause we are not 
1b770 61 20 4e 65 74 73 63 61 70 65 20 74 72 75 73 74  a Netscape trust
1b780 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09   object");......
1b790 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09  .break;.....}...
1b7a0 09 09 09 4d 44 35 49 6e 69 74 28 26 6d 64 35 5f  ...MD5Init(&md5_
1b7b0 63 74 78 29 3b 0a 09 09 09 09 4d 44 35 55 70 64  ctx);.....MD5Upd
1b7c0 61 74 65 28 26 6d 64 35 5f 63 74 78 2c 20 63 65  ate(&md5_ctx, ce
1b7d0 72 74 69 66 69 63 61 74 65 2c 20 63 65 72 74 69  rtificate, certi
1b7e0 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a 09 09 09  ficate_len);....
1b7f0 09 4d 44 35 46 69 6e 61 6c 28 6d 64 35 5f 68 61  .MD5Final(md5_ha
1b800 73 68 2c 20 26 6d 64 35 5f 63 74 78 29 3b 0a 0a  sh, &md5_ctx);..
1b810 09 09 09 09 70 56 61 6c 75 65 20 3d 20 6d 64 35  ....pValue = md5
1b820 5f 68 61 73 68 3b 0a 09 09 09 09 75 6c 56 61 6c  _hash;.....ulVal
1b830 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 6d  ueLen = sizeof(m
1b840 64 35 5f 68 61 73 68 29 3b 0a 0a 09 09 09 09 43  d5_hash);......C
1b850 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1b860 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69  TF(" ... returni
1b870 6e 67 20 25 70 2f 25 6c 75 22 2c 20 70 56 61 6c  ng %p/%lu", pVal
1b880 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  ue, (unsigned lo
1b890 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b  ng) ulValueLen);
1b8a0 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
1b8b0 64 65 66 61 75 6c 74 3a 0a 09 09 09 09 70 56 61  default:.....pVa
1b8c0 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09  lue = NULL;.....
1b8d0 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 28 43 4b  ulValueLen = (CK
1b8e0 5f 4c 4f 4e 47 29 20 2d 31 3b 0a 09 09 09 09 62  _LONG) -1;.....b
1b8f0 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09 69 66 20  reak;...}....if 
1b900 28 28 28 43 4b 5f 4c 4f 4e 47 29 20 75 6c 56 61  (((CK_LONG) ulVa
1b910 6c 75 65 4c 65 6e 29 20 21 3d 20 28 28 43 4b 5f  lueLen) != ((CK_
1b920 4c 4f 4e 47 29 20 2d 31 29 29 20 7b 0a 09 09 09  LONG) -1)) {....
1b930 2f 2a 20 50 75 73 68 20 63 75 72 72 5f 61 74 74  /* Push curr_att
1b940 72 20 6f 6e 74 6f 20 74 68 65 20 73 74 61 63 6b  r onto the stack
1b950 20 2a 2f 0a 09 09 09 63 75 72 72 5f 61 74 74 72   */....curr_attr
1b960 2e 74 79 70 65 20 3d 20 63 75 72 72 5f 61 74 74  .type = curr_att
1b970 72 5f 74 79 70 65 3b 0a 09 09 09 63 75 72 72 5f  r_type;....curr_
1b980 61 74 74 72 2e 75 6c 56 61 6c 75 65 4c 65 6e 20  attr.ulValueLen 
1b990 3d 20 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 0a 09  = ulValueLen;...
1b9a0 09 09 63 75 72 72 5f 61 74 74 72 2e 70 56 61 6c  ..curr_attr.pVal
1b9b0 75 65 20 3d 20 6d 61 6c 6c 6f 63 28 63 75 72 72  ue = malloc(curr
1b9c0 5f 61 74 74 72 2e 75 6c 56 61 6c 75 65 4c 65 6e  _attr.ulValueLen
1b9d0 29 3b 0a 09 09 09 6d 65 6d 63 70 79 28 63 75 72  );....memcpy(cur
1b9e0 72 5f 61 74 74 72 2e 70 56 61 6c 75 65 2c 20 70  r_attr.pValue, p
1b9f0 56 61 6c 75 65 2c 20 63 75 72 72 5f 61 74 74 72  Value, curr_attr
1ba00 2e 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09  .ulValueLen);...
1ba10 09 09 69 66 20 28 70 56 61 6c 75 65 5f 66 72 65  ..if (pValue_fre
1ba20 65 20 26 26 20 70 56 61 6c 75 65 29 20 7b 0a 09  e && pValue) {..
1ba30 09 09 09 66 72 65 65 28 70 56 61 6c 75 65 29 3b  ...free(pValue);
1ba40 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 6e 75  ....}.....if (nu
1ba50 6d 61 74 74 72 73 20 3e 3d 20 72 65 74 76 61 6c  mattrs >= retval
1ba60 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 09 09 72 65  _count) {.....re
1ba70 74 76 61 6c 20 3d 20 72 65 61 6c 6c 6f 63 28 72  tval = realloc(r
1ba80 65 74 76 61 6c 2c 20 72 65 74 76 61 6c 5f 63 6f  etval, retval_co
1ba90 75 6e 74 20 2a 20 73 69 7a 65 6f 66 28 2a 72 65  unt * sizeof(*re
1baa0 74 76 61 6c 29 29 3b 0a 09 09 09 7d 0a 0a 09 09  tval));....}....
1bab0 09 6d 65 6d 63 70 79 28 26 72 65 74 76 61 6c 5b  .memcpy(&retval[
1bac0 6e 75 6d 61 74 74 72 73 5d 2c 20 26 63 75 72 72  numattrs], &curr
1bad0 5f 61 74 74 72 2c 20 73 69 7a 65 6f 66 28 63 75  _attr, sizeof(cu
1bae0 72 72 5f 61 74 74 72 29 29 3b 0a 09 09 09 6e 75  rr_attr));....nu
1baf0 6d 61 74 74 72 73 2b 2b 3b 0a 09 09 7d 0a 09 7d  mattrs++;...}..}
1bb00 0a 0a 09 69 66 20 28 6e 75 6d 61 74 74 72 73 20  ...if (numattrs 
1bb10 21 3d 20 30 29 20 7b 0a 09 09 72 65 74 76 61 6c  != 0) {...retval
1bb20 5f 63 6f 75 6e 74 20 3d 20 6e 75 6d 61 74 74 72  _count = numattr
1bb30 73 3b 0a 09 09 72 65 74 76 61 6c 20 3d 20 72 65  s;...retval = re
1bb40 61 6c 6c 6f 63 28 72 65 74 76 61 6c 2c 20 72 65  alloc(retval, re
1bb50 74 76 61 6c 5f 63 6f 75 6e 74 20 2a 20 73 69 7a  tval_count * siz
1bb60 65 6f 66 28 2a 72 65 74 76 61 6c 29 29 3b 0a 09  eof(*retval));..
1bb70 7d 20 65 6c 73 65 20 7b 0a 09 09 66 72 65 65 28  } else {...free(
1bb80 72 65 74 76 61 6c 29 3b 0a 0a 09 09 72 65 74 76  retval);....retv
1bb90 61 6c 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 0a 09  al = NULL;..}...
1bba0 2a 70 75 6c 43 6f 75 6e 74 20 3d 20 6e 75 6d 61  *pulCount = numa
1bbb0 74 74 72 73 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  ttrs;...CACKEY_D
1bbc0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
1bbd0 75 72 6e 69 6e 67 20 25 6c 75 20 6f 62 6a 65 63  urning %lu objec
1bbe0 74 73 20 28 25 70 29 2e 22 2c 20 6e 75 6d 61 74  ts (%p).", numat
1bbf0 74 72 73 2c 20 28 76 6f 69 64 20 2a 29 20 72 65  trs, (void *) re
1bc00 74 76 61 6c 29 3b 0a 0a 09 72 65 74 75 72 6e 28  tval);...return(
1bc10 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 73 74 61 74  retval);.}..stat
1bc20 69 63 20 76 6f 69 64 20 63 61 63 6b 65 79 5f 66  ic void cackey_f
1bc30 72 65 65 5f 69 64 65 6e 74 69 74 69 65 73 28 73  ree_identities(s
1bc40 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65  truct cackey_ide
1bc50 6e 74 69 74 79 20 2a 69 64 65 6e 74 69 74 69 65  ntity *identitie
1bc60 73 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  s, unsigned long
1bc70 20 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e   identities_coun
1bc80 74 29 20 7b 0a 09 43 4b 5f 41 54 54 52 49 42 55  t) {..CK_ATTRIBU
1bc90 54 45 20 2a 63 75 72 72 5f 61 74 74 72 3b 0a 09  TE *curr_attr;..
1bca0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 69 64  unsigned long id
1bcb0 5f 69 64 78 2c 20 61 74 74 72 5f 69 64 78 3b 0a  _idx, attr_idx;.
1bcc0 0a 09 69 66 20 28 69 64 65 6e 74 69 74 69 65 73  ..if (identities
1bcd0 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 69 64 65 6e   == NULL || iden
1bce0 74 69 74 69 65 73 5f 63 6f 75 6e 74 20 3d 3d 20  tities_count == 
1bcf0 30 29 20 7b 0a 09 09 72 65 74 75 72 6e 3b 0a 09  0) {...return;..
1bd00 7d 0a 0a 09 66 6f 72 20 28 69 64 5f 69 64 78 20  }...for (id_idx 
1bd10 3d 20 30 3b 20 69 64 5f 69 64 78 20 3c 20 69 64  = 0; id_idx < id
1bd20 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 3b 20  entities_count; 
1bd30 69 64 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66  id_idx++) {...if
1bd40 20 28 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f   (identities[id_
1bd50 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73 29  idx].attributes)
1bd60 20 7b 0a 09 09 09 66 6f 72 20 28 61 74 74 72 5f   {....for (attr_
1bd70 69 64 78 20 3d 20 30 3b 20 61 74 74 72 5f 69 64  idx = 0; attr_id
1bd80 78 20 3c 20 69 64 65 6e 74 69 74 69 65 73 5b 69  x < identities[i
1bd90 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65  d_idx].attribute
1bda0 73 5f 63 6f 75 6e 74 3b 20 61 74 74 72 5f 69 64  s_count; attr_id
1bdb0 78 2b 2b 29 20 7b 0a 09 09 09 09 63 75 72 72 5f  x++) {.....curr_
1bdc0 61 74 74 72 20 3d 20 26 69 64 65 6e 74 69 74 69  attr = &identiti
1bdd0 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69  es[id_idx].attri
1bde0 62 75 74 65 73 5b 61 74 74 72 5f 69 64 78 5d 3b  butes[attr_idx];
1bdf0 0a 0a 09 09 09 09 69 66 20 28 63 75 72 72 5f 61  ......if (curr_a
1be00 74 74 72 2d 3e 70 56 61 6c 75 65 29 20 7b 0a 09  ttr->pValue) {..
1be10 09 09 09 09 66 72 65 65 28 63 75 72 72 5f 61 74  ....free(curr_at
1be20 74 72 2d 3e 70 56 61 6c 75 65 29 3b 0a 09 09 09  tr->pValue);....
1be30 09 7d 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28  .}....}.....if (
1be40 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64  identities[id_id
1be50 78 5d 2e 61 74 74 72 69 62 75 74 65 73 29 20 7b  x].attributes) {
1be60 0a 09 09 09 09 66 72 65 65 28 69 64 65 6e 74 69  .....free(identi
1be70 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74  ties[id_idx].att
1be80 72 69 62 75 74 65 73 29 3b 0a 09 09 09 7d 0a 0a  ributes);....}..
1be90 09 09 09 63 61 63 6b 65 79 5f 66 72 65 65 5f 63  ...cackey_free_c
1bea0 65 72 74 73 28 69 64 65 6e 74 69 74 69 65 73 5b  erts(identities[
1beb0 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64 65  id_idx].pcsc_ide
1bec0 6e 74 69 74 79 2c 20 31 2c 20 31 29 3b 0a 09 09  ntity, 1, 1);...
1bed0 7d 0a 09 7d 0a 0a 09 66 72 65 65 28 69 64 65 6e  }..}...free(iden
1bee0 74 69 74 69 65 73 29 3b 0a 7d 0a 0a 73 74 61 74  tities);.}..stat
1bef0 69 63 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  ic unsigned long
1bf00 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 64 6f 64   cackey_read_dod
1bf10 5f 69 64 65 6e 74 69 74 69 65 73 28 73 74 72 75  _identities(stru
1bf20 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69  ct cackey_identi
1bf30 74 79 20 2a 69 64 65 6e 74 69 74 69 65 73 2c 20  ty *identities, 
1bf40 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6e 75  unsigned long nu
1bf50 6d 5f 64 6f 64 5f 63 65 72 74 73 29 20 7b 0a 09  m_dod_certs) {..
1bf60 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 63 65  unsigned long ce
1bf70 72 74 5f 69 64 78 2c 20 69 64 5f 69 64 78 20 3d  rt_idx, id_idx =
1bf80 20 30 3b 0a 0a 09 69 66 20 28 69 64 65 6e 74 69   0;...if (identi
1bf90 74 69 65 73 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  ties == NULL) {.
1bfa0 09 09 72 65 74 75 72 6e 28 6e 75 6d 5f 64 6f 64  ..return(num_dod
1bfb0 5f 63 65 72 74 73 20 2a 20 33 29 3b 0a 09 7d 0a  _certs * 3);..}.
1bfc0 0a 09 66 6f 72 20 28 63 65 72 74 5f 69 64 78 20  ..for (cert_idx 
1bfd0 3d 20 30 3b 20 63 65 72 74 5f 69 64 78 20 3c 20  = 0; cert_idx < 
1bfe0 6e 75 6d 5f 64 6f 64 5f 63 65 72 74 73 3b 20 63  num_dod_certs; c
1bff0 65 72 74 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 69  ert_idx++) {...i
1c000 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78  dentities[id_idx
1c010 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20  ].pcsc_identity 
1c020 3d 20 4e 55 4c 4c 3b 0a 09 09 69 64 65 6e 74 69  = NULL;...identi
1c030 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74  ties[id_idx].att
1c040 72 69 62 75 74 65 73 20 3d 20 63 61 63 6b 65 79  ributes = cackey
1c050 5f 67 65 74 5f 61 74 74 72 69 62 75 74 65 73 28  _get_attributes(
1c060 43 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 45 2c  CKO_CERTIFICATE,
1c070 20 26 65 78 74 72 61 5f 63 65 72 74 73 5b 63 65   &extra_certs[ce
1c080 72 74 5f 69 64 78 5d 2c 20 30 78 66 30 30 30 20  rt_idx], 0xf000 
1c090 7c 20 63 65 72 74 5f 69 64 78 2c 20 26 69 64 65  | cert_idx, &ide
1c0a0 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e  ntities[id_idx].
1c0b0 61 74 74 72 69 62 75 74 65 73 5f 63 6f 75 6e 74  attributes_count
1c0c0 29 3b 0a 09 09 69 64 5f 69 64 78 2b 2b 3b 0a 0a  );...id_idx++;..
1c0d0 09 09 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f  ..identities[id_
1c0e0 69 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69  idx].pcsc_identi
1c0f0 74 79 20 3d 20 4e 55 4c 4c 3b 0a 09 09 69 64 65  ty = NULL;...ide
1c100 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e  ntities[id_idx].
1c110 61 74 74 72 69 62 75 74 65 73 20 3d 20 63 61 63  attributes = cac
1c120 6b 65 79 5f 67 65 74 5f 61 74 74 72 69 62 75 74  key_get_attribut
1c130 65 73 28 43 4b 4f 5f 50 55 42 4c 49 43 5f 4b 45  es(CKO_PUBLIC_KE
1c140 59 2c 20 26 65 78 74 72 61 5f 63 65 72 74 73 5b  Y, &extra_certs[
1c150 63 65 72 74 5f 69 64 78 5d 2c 20 30 78 66 30 30  cert_idx], 0xf00
1c160 30 20 7c 20 63 65 72 74 5f 69 64 78 2c 20 26 69  0 | cert_idx, &i
1c170 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78  dentities[id_idx
1c180 5d 2e 61 74 74 72 69 62 75 74 65 73 5f 63 6f 75  ].attributes_cou
1c190 6e 74 29 3b 0a 09 09 69 64 5f 69 64 78 2b 2b 3b  nt);...id_idx++;
1c1a0 0a 0a 09 09 69 64 65 6e 74 69 74 69 65 73 5b 69  ....identities[i
1c1b0 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e  d_idx].pcsc_iden
1c1c0 74 69 74 79 20 3d 20 4e 55 4c 4c 3b 0a 09 09 69  tity = NULL;...i
1c1d0 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78  dentities[id_idx
1c1e0 5d 2e 61 74 74 72 69 62 75 74 65 73 20 3d 20 63  ].attributes = c
1c1f0 61 63 6b 65 79 5f 67 65 74 5f 61 74 74 72 69 62  ackey_get_attrib
1c200 75 74 65 73 28 43 4b 4f 5f 4e 45 54 53 43 41 50  utes(CKO_NETSCAP
1c210 45 5f 54 52 55 53 54 2c 20 26 65 78 74 72 61 5f  E_TRUST, &extra_
1c220 63 65 72 74 73 5b 63 65 72 74 5f 69 64 78 5d 2c  certs[cert_idx],
1c230 20 30 78 66 30 30 30 20 7c 20 63 65 72 74 5f 69   0xf000 | cert_i
1c240 64 78 2c 20 26 69 64 65 6e 74 69 74 69 65 73 5b  dx, &identities[
1c250 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74  id_idx].attribut
1c260 65 73 5f 63 6f 75 6e 74 29 3b 0a 09 09 69 64 5f  es_count);...id_
1c270 69 64 78 2b 2b 3b 0a 09 7d 0a 0a 09 72 65 74 75  idx++;..}...retu
1c280 72 6e 28 69 64 5f 69 64 78 29 3b 0a 7d 0a 0a 73  rn(id_idx);.}..s
1c290 74 61 74 69 63 20 73 74 72 75 63 74 20 63 61 63  tatic struct cac
1c2a0 6b 65 79 5f 69 64 65 6e 74 69 74 79 20 2a 63 61  key_identity *ca
1c2b0 63 6b 65 79 5f 72 65 61 64 5f 69 64 65 6e 74 69  ckey_read_identi
1c2c0 74 69 65 73 28 73 74 72 75 63 74 20 63 61 63 6b  ties(struct cack
1c2d0 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75  ey_slot *slot, u
1c2e0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 2a 69 64  nsigned long *id
1c2f0 73 5f 66 6f 75 6e 64 29 20 7b 0a 09 73 74 72 75  s_found) {..stru
1c300 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69  ct cackey_pcsc_i
1c310 64 65 6e 74 69 74 79 20 2a 70 63 73 63 5f 69 64  dentity *pcsc_id
1c320 65 6e 74 69 74 69 65 73 3b 0a 09 73 74 72 75 63  entities;..struc
1c330 74 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 74  t cackey_identit
1c340 79 20 2a 69 64 65 6e 74 69 74 69 65 73 3b 0a 09  y *identities;..
1c350 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6e 75  unsigned long nu
1c360 6d 5f 69 64 73 2c 20 69 64 5f 69 64 78 2c 20 63  m_ids, id_idx, c
1c370 75 72 72 5f 69 64 5f 74 79 70 65 3b 0a 09 75 6e  urr_id_type;..un
1c380 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6e 75 6d 5f  signed long num_
1c390 63 65 72 74 73 2c 20 6e 75 6d 5f 64 6f 64 5f 63  certs, num_dod_c
1c3a0 65 72 74 73 2c 20 63 65 72 74 5f 69 64 78 3b 0a  erts, cert_idx;.
1c3b0 09 69 6e 74 20 69 6e 63 6c 75 64 65 5f 65 78 74  .int include_ext
1c3c0 72 61 5f 63 65 72 74 73 20 3d 20 30 2c 20 69 6e  ra_certs = 0, in
1c3d0 63 6c 75 64 65 5f 64 6f 64 5f 63 65 72 74 73 3b  clude_dod_certs;
1c3e0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1c3f0 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
1c400 29 3b 0a 0a 09 69 66 20 28 69 64 73 5f 66 6f 75  );...if (ids_fou
1c410 6e 64 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  nd == NULL) {...
1c420 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1c430 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 69 64 73  NTF("Error.  ids
1c440 5f 66 6f 75 6e 64 20 69 73 20 4e 55 4c 4c 22 29  _found is NULL")
1c450 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c  ;....return(NULL
1c460 29 3b 0a 09 7d 0a 0a 23 69 66 64 65 66 20 43 41  );..}..#ifdef CA
1c470 43 4b 45 59 5f 43 41 52 44 5f 53 4c 4f 54 5f 49  CKEY_CARD_SLOT_I
1c480 4e 43 4c 55 44 45 5f 45 58 54 52 41 5f 43 45 52  NCLUDE_EXTRA_CER
1c490 54 53 0a 09 69 6e 63 6c 75 64 65 5f 65 78 74 72  TS..include_extr
1c4a0 61 5f 63 65 72 74 73 20 3d 20 31 3b 0a 23 65 6e  a_certs = 1;.#en
1c4b0 64 69 66 0a 0a 09 69 66 20 28 67 65 74 65 6e 76  dif...if (getenv
1c4c0 28 22 43 41 43 4b 45 59 5f 44 4f 44 5f 43 45 52  ("CACKEY_DOD_CER
1c4d0 54 53 5f 4f 4e 5f 48 57 5f 53 4c 4f 54 53 22 29  TS_ON_HW_SLOTS")
1c4e0 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 69 6e   != NULL) {...in
1c4f0 63 6c 75 64 65 5f 65 78 74 72 61 5f 63 65 72 74  clude_extra_cert
1c500 73 20 3d 20 31 3b 0a 09 7d 0a 0a 09 69 66 20 28  s = 1;..}...if (
1c510 67 65 74 65 6e 76 28 22 43 41 43 4b 45 59 5f 4e  getenv("CACKEY_N
1c520 4f 5f 44 4f 44 5f 43 45 52 54 53 5f 4f 4e 5f 48  O_DOD_CERTS_ON_H
1c530 57 5f 53 4c 4f 54 53 22 29 20 21 3d 20 4e 55 4c  W_SLOTS") != NUL
1c540 4c 29 20 7b 0a 09 09 69 6e 63 6c 75 64 65 5f 65  L) {...include_e
1c550 78 74 72 61 5f 63 65 72 74 73 20 3d 20 30 3b 0a  xtra_certs = 0;.
1c560 09 7d 0a 0a 23 69 66 64 65 66 20 43 41 43 4b 45  .}..#ifdef CACKE
1c570 59 5f 4e 4f 5f 45 58 54 52 41 5f 43 45 52 54 53  Y_NO_EXTRA_CERTS
1c580 0a 09 69 66 20 28 67 65 74 65 6e 76 28 22 43 41  ..if (getenv("CA
1c590 43 4b 45 59 5f 45 58 54 52 41 5f 43 45 52 54 53  CKEY_EXTRA_CERTS
1c5a0 22 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  ") != NULL) {...
1c5b0 69 6e 63 6c 75 64 65 5f 64 6f 64 5f 63 65 72 74  include_dod_cert
1c5c0 73 20 3d 20 31 3b 0a 09 7d 20 65 6c 73 65 20 7b  s = 1;..} else {
1c5d0 0a 09 09 69 6e 63 6c 75 64 65 5f 64 6f 64 5f 63  ...include_dod_c
1c5e0 65 72 74 73 20 3d 20 30 3b 0a 09 7d 0a 23 65 6c  erts = 0;..}.#el
1c5f0 73 65 0a 09 69 66 20 28 67 65 74 65 6e 76 28 22  se..if (getenv("
1c600 43 41 43 4b 45 59 5f 4e 4f 5f 45 58 54 52 41 5f  CACKEY_NO_EXTRA_
1c610 43 45 52 54 53 22 29 20 21 3d 20 4e 55 4c 4c 29  CERTS") != NULL)
1c620 20 7b 0a 09 09 69 6e 63 6c 75 64 65 5f 64 6f 64   {...include_dod
1c630 5f 63 65 72 74 73 20 3d 20 30 3b 0a 09 7d 20 65  _certs = 0;..} e
1c640 6c 73 65 20 7b 0a 09 09 69 6e 63 6c 75 64 65 5f  lse {...include_
1c650 64 6f 64 5f 63 65 72 74 73 20 3d 20 31 3b 0a 09  dod_certs = 1;..
1c660 7d 0a 23 65 6e 64 69 66 0a 0a 09 69 66 20 28 69  }.#endif...if (i
1c670 6e 63 6c 75 64 65 5f 64 6f 64 5f 63 65 72 74 73  nclude_dod_certs
1c680 29 20 7b 0a 09 09 6e 75 6d 5f 64 6f 64 5f 63 65  ) {...num_dod_ce
1c690 72 74 73 20 3d 20 73 69 7a 65 6f 66 28 65 78 74  rts = sizeof(ext
1c6a0 72 61 5f 63 65 72 74 73 29 20 2f 20 73 69 7a 65  ra_certs) / size
1c6b0 6f 66 28 65 78 74 72 61 5f 63 65 72 74 73 5b 30  of(extra_certs[0
1c6c0 5d 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09  ]);..} else {...
1c6d0 6e 75 6d 5f 64 6f 64 5f 63 65 72 74 73 20 3d 20  num_dod_certs = 
1c6e0 30 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74  0;..}...if (slot
1c6f0 2d 3e 69 6e 74 65 72 6e 61 6c 29 20 7b 0a 09 09  ->internal) {...
1c700 6e 75 6d 5f 69 64 73 20 3d 20 63 61 63 6b 65 79  num_ids = cackey
1c710 5f 72 65 61 64 5f 64 6f 64 5f 69 64 65 6e 74 69  _read_dod_identi
1c720 74 69 65 73 28 4e 55 4c 4c 2c 20 6e 75 6d 5f 64  ties(NULL, num_d
1c730 6f 64 5f 63 65 72 74 73 29 3b 0a 0a 09 09 69 66  od_certs);....if
1c740 20 28 6e 75 6d 5f 69 64 73 20 21 3d 20 30 29 20   (num_ids != 0) 
1c750 7b 0a 09 09 09 69 64 65 6e 74 69 74 69 65 73 20  {....identities 
1c760 3d 20 6d 61 6c 6c 6f 63 28 6e 75 6d 5f 69 64 73  = malloc(num_ids
1c770 20 2a 20 73 69 7a 65 6f 66 28 2a 69 64 65 6e 74   * sizeof(*ident
1c780 69 74 69 65 73 29 29 3b 0a 0a 09 09 09 63 61 63  ities));.....cac
1c790 6b 65 79 5f 72 65 61 64 5f 64 6f 64 5f 69 64 65  key_read_dod_ide
1c7a0 6e 74 69 74 69 65 73 28 69 64 65 6e 74 69 74 69  ntities(identiti
1c7b0 65 73 2c 20 6e 75 6d 5f 64 6f 64 5f 63 65 72 74  es, num_dod_cert
1c7c0 73 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09  s);...} else {..
1c7d0 09 09 69 64 65 6e 74 69 74 69 65 73 20 3d 20 4e  ..identities = N
1c7e0 55 4c 4c 3b 0a 09 09 7d 0a 0a 09 09 2a 69 64 73  ULL;...}....*ids
1c7f0 5f 66 6f 75 6e 64 20 3d 20 6e 75 6d 5f 69 64 73  _found = num_ids
1c800 3b 0a 0a 09 09 72 65 74 75 72 6e 28 69 64 65 6e  ;....return(iden
1c810 74 69 74 69 65 73 29 3b 0a 09 7d 0a 0a 09 70 63  tities);..}...pc
1c820 73 63 5f 69 64 65 6e 74 69 74 69 65 73 20 3d 20  sc_identities = 
1c830 63 61 63 6b 65 79 5f 72 65 61 64 5f 63 65 72 74  cackey_read_cert
1c840 73 28 73 6c 6f 74 2c 20 4e 55 4c 4c 2c 20 26 6e  s(slot, NULL, &n
1c850 75 6d 5f 63 65 72 74 73 29 3b 0a 09 69 66 20 28  um_certs);..if (
1c860 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 20  pcsc_identities 
1c870 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 2f 2a 20  != NULL) {.../* 
1c880 43 6f 6e 76 65 72 74 20 6e 75 6d 62 65 72 20 6f  Convert number o
1c890 66 20 43 65 72 74 73 20 74 6f 20 6e 75 6d 62 65  f Certs to numbe
1c8a0 72 20 6f 66 20 6f 62 6a 65 63 74 73 20 2a 2f 0a  r of objects */.
1c8b0 09 09 6e 75 6d 5f 69 64 73 20 3d 20 28 43 4b 4f  ..num_ids = (CKO
1c8c0 5f 50 52 49 56 41 54 45 5f 4b 45 59 20 2d 20 43  _PRIVATE_KEY - C
1c8d0 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 45 20 2b  KO_CERTIFICATE +
1c8e0 20 31 29 20 2a 20 6e 75 6d 5f 63 65 72 74 73 3b   1) * num_certs;
1c8f0 0a 0a 09 09 69 66 20 28 69 6e 63 6c 75 64 65 5f  ....if (include_
1c900 65 78 74 72 61 5f 63 65 72 74 73 29 20 7b 0a 09  extra_certs) {..
1c910 09 09 6e 75 6d 5f 69 64 73 20 2b 3d 20 63 61 63  ..num_ids += cac
1c920 6b 65 79 5f 72 65 61 64 5f 64 6f 64 5f 69 64 65  key_read_dod_ide
1c930 6e 74 69 74 69 65 73 28 4e 55 4c 4c 2c 20 6e 75  ntities(NULL, nu
1c940 6d 5f 64 6f 64 5f 63 65 72 74 73 29 3b 0a 09 09  m_dod_certs);...
1c950 7d 0a 0a 09 09 69 64 65 6e 74 69 74 69 65 73 20  }....identities 
1c960 3d 20 6d 61 6c 6c 6f 63 28 6e 75 6d 5f 69 64 73  = malloc(num_ids
1c970 20 2a 20 73 69 7a 65 6f 66 28 2a 69 64 65 6e 74   * sizeof(*ident
1c980 69 74 69 65 73 29 29 3b 0a 0a 09 09 2f 2a 20 41  ities));..../* A
1c990 64 64 20 63 65 72 74 69 66 69 63 61 74 65 73 2c  dd certificates,
1c9a0 20 70 75 62 6c 69 63 20 6b 65 79 73 2c 20 61 6e   public keys, an
1c9b0 64 20 70 72 69 76 61 74 65 20 6b 65 79 73 20 66  d private keys f
1c9c0 72 6f 6d 20 74 68 65 20 73 6d 61 72 74 63 61 72  rom the smartcar
1c9d0 64 20 2a 2f 0a 09 09 69 64 5f 69 64 78 20 3d 20  d */...id_idx = 
1c9e0 30 3b 0a 09 09 66 6f 72 20 28 63 65 72 74 5f 69  0;...for (cert_i
1c9f0 64 78 20 3d 20 30 3b 20 63 65 72 74 5f 69 64 78  dx = 0; cert_idx
1ca00 20 3c 20 6e 75 6d 5f 63 65 72 74 73 3b 20 63 65   < num_certs; ce
1ca10 72 74 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 09 66  rt_idx++) {....f
1ca20 6f 72 20 28 63 75 72 72 5f 69 64 5f 74 79 70 65  or (curr_id_type
1ca30 20 3d 20 43 4b 4f 5f 43 45 52 54 49 46 49 43 41   = CKO_CERTIFICA
1ca40 54 45 3b 20 63 75 72 72 5f 69 64 5f 74 79 70 65  TE; curr_id_type
1ca50 20 3c 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f   <= CKO_PRIVATE_
1ca60 4b 45 59 3b 20 63 75 72 72 5f 69 64 5f 74 79 70  KEY; curr_id_typ
1ca70 65 2b 2b 29 20 7b 0a 09 09 09 09 69 64 65 6e 74  e++) {.....ident
1ca80 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74  ities[id_idx].at
1ca90 74 72 69 62 75 74 65 73 20 3d 20 63 61 63 6b 65  tributes = cacke
1caa0 79 5f 67 65 74 5f 61 74 74 72 69 62 75 74 65 73  y_get_attributes
1cab0 28 63 75 72 72 5f 69 64 5f 74 79 70 65 2c 20 26  (curr_id_type, &
1cac0 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 5b  pcsc_identities[
1cad0 63 65 72 74 5f 69 64 78 5d 2c 20 63 65 72 74 5f  cert_idx], cert_
1cae0 69 64 78 2c 20 26 69 64 65 6e 74 69 74 69 65 73  idx, &identities
1caf0 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75  [id_idx].attribu
1cb00 74 65 73 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09 09  tes_count);.....
1cb10 09 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69  .identities[id_i
1cb20 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69 74  dx].pcsc_identit
1cb30 79 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f  y = malloc(sizeo
1cb40 66 28 2a 69 64 65 6e 74 69 74 69 65 73 5b 69 64  f(*identities[id
1cb50 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e 74  _idx].pcsc_ident
1cb60 69 74 79 29 29 3b 0a 09 09 09 09 6d 65 6d 63 70  ity));.....memcp
1cb70 79 28 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f  y(identities[id_
1cb80 69 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69  idx].pcsc_identi
1cb90 74 79 2c 20 26 70 63 73 63 5f 69 64 65 6e 74 69  ty, &pcsc_identi
1cba0 74 69 65 73 5b 63 65 72 74 5f 69 64 78 5d 2c 20  ties[cert_idx], 
1cbb0 73 69 7a 65 6f 66 28 2a 69 64 65 6e 74 69 74 69  sizeof(*identiti
1cbc0 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f  es[id_idx].pcsc_
1cbd0 69 64 65 6e 74 69 74 79 29 29 3b 0a 0a 09 09 09  identity));.....
1cbe0 09 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69  .identities[id_i
1cbf0 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69 74  dx].pcsc_identit
1cc00 79 2d 3e 63 65 72 74 69 66 69 63 61 74 65 20 3d  y->certificate =
1cc10 20 6d 61 6c 6c 6f 63 28 70 63 73 63 5f 69 64 65   malloc(pcsc_ide
1cc20 6e 74 69 74 69 65 73 5b 63 65 72 74 5f 69 64 78  ntities[cert_idx
1cc30 5d 2e 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65  ].certificate_le
1cc40 6e 29 3b 0a 09 09 09 09 6d 65 6d 63 70 79 28 69  n);.....memcpy(i
1cc50 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78  dentities[id_idx
1cc60 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d  ].pcsc_identity-
1cc70 3e 63 65 72 74 69 66 69 63 61 74 65 2c 20 70 63  >certificate, pc
1cc80 73 63 5f 69 64 65 6e 74 69 74 69 65 73 5b 63 65  sc_identities[ce
1cc90 72 74 5f 69 64 78 5d 2e 63 65 72 74 69 66 69 63  rt_idx].certific
1cca0 61 74 65 2c 20 70 63 73 63 5f 69 64 65 6e 74 69  ate, pcsc_identi
1ccb0 74 69 65 73 5b 63 65 72 74 5f 69 64 78 5d 2e 63  ties[cert_idx].c
1ccc0 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b  ertificate_len);
1ccd0 0a 0a 09 09 09 09 69 64 5f 69 64 78 2b 2b 3b 0a  ......id_idx++;.
1cce0 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 69 66 20 28  ...}...}....if (
1ccf0 69 6e 63 6c 75 64 65 5f 65 78 74 72 61 5f 63 65  include_extra_ce
1cd00 72 74 73 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  rts) {....CACKEY
1cd10 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 49  _DEBUG_PRINTF("I
1cd20 6e 63 6c 75 64 69 6e 67 20 55 53 20 47 6f 76 65  ncluding US Gove
1cd30 72 6e 6d 65 6e 74 20 43 65 72 74 69 66 69 63 61  rnment Certifica
1cd40 74 65 73 20 6f 6e 20 68 61 72 64 77 61 72 65 20  tes on hardware 
1cd50 73 6c 6f 74 22 29 3b 0a 0a 09 09 09 63 61 63 6b  slot");.....cack
1cd60 65 79 5f 72 65 61 64 5f 64 6f 64 5f 69 64 65 6e  ey_read_dod_iden
1cd70 74 69 74 69 65 73 28 69 64 65 6e 74 69 74 69 65  tities(identitie
1cd80 73 20 2b 20 69 64 5f 69 64 78 2c 20 6e 75 6d 5f  s + id_idx, num_
1cd90 64 6f 64 5f 63 65 72 74 73 29 3b 0a 09 09 7d 0a  dod_certs);...}.
1cda0 0a 09 09 63 61 63 6b 65 79 5f 66 72 65 65 5f 63  ...cackey_free_c
1cdb0 65 72 74 73 28 70 63 73 63 5f 69 64 65 6e 74 69  erts(pcsc_identi
1cdc0 74 69 65 73 2c 20 6e 75 6d 5f 63 65 72 74 73 2c  ties, num_certs,
1cdd0 20 31 29 3b 0a 0a 09 09 2a 69 64 73 5f 66 6f 75   1);....*ids_fou
1cde0 6e 64 20 3d 20 6e 75 6d 5f 69 64 73 3b 0a 0a 09  nd = num_ids;...
1cdf0 09 72 65 74 75 72 6e 28 69 64 65 6e 74 69 74 69  .return(identiti
1ce00 65 73 29 3b 0a 09 7d 0a 0a 0a 09 2a 69 64 73 5f  es);..}....*ids_
1ce10 66 6f 75 6e 64 20 3d 20 30 3b 0a 09 72 65 74 75  found = 0;..retu
1ce20 72 6e 28 4e 55 4c 4c 29 3b 0a 7d 0a 0a 73 74 61  rn(NULL);.}..sta
1ce30 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74 20 63  tic cackey_ret c
1ce40 61 63 6b 65 79 5f 67 65 74 5f 70 69 6e 28 63 68  ackey_get_pin(ch
1ce50 61 72 20 2a 70 69 6e 62 75 66 29 20 7b 0a 09 46  ar *pinbuf) {..F
1ce60 49 4c 45 20 2a 70 69 6e 66 64 3b 0a 09 63 68 61  ILE *pinfd;..cha
1ce70 72 20 2a 66 67 65 74 73 5f 72 65 74 3b 0a 09 69  r *fgets_ret;..i
1ce80 6e 74 20 70 63 6c 6f 73 65 5f 72 65 74 3b 0a 0a  nt pclose_ret;..
1ce90 09 69 66 20 28 63 61 63 6b 65 79 5f 70 69 6e 5f  .if (cackey_pin_
1cea0 63 6f 6d 6d 61 6e 64 20 3d 3d 20 4e 55 4c 4c 29  command == NULL)
1ceb0 20 7b 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b   {...return(CACK
1cec0 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49  EY_PCSC_E_GENERI
1ced0 43 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 69 6e  C);..}...if (pin
1cee0 62 75 66 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  buf == NULL) {..
1cef0 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
1cf00 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a  CSC_E_GENERIC);.
1cf10 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
1cf20 47 5f 50 52 49 4e 54 46 28 22 43 41 43 4b 45 59  G_PRINTF("CACKEY
1cf30 5f 50 49 4e 5f 43 4f 4d 4d 41 4e 44 20 3d 20 25  _PIN_COMMAND = %
1cf40 73 22 2c 20 63 61 63 6b 65 79 5f 70 69 6e 5f 63  s", cackey_pin_c
1cf50 6f 6d 6d 61 6e 64 29 3b 0a 0a 09 70 69 6e 66 64  ommand);...pinfd
1cf60 20 3d 20 70 6f 70 65 6e 28 63 61 63 6b 65 79 5f   = popen(cackey_
1cf70 70 69 6e 5f 63 6f 6d 6d 61 6e 64 2c 20 22 72 22  pin_command, "r"
1cf80 29 3b 0a 09 69 66 20 28 70 69 6e 66 64 20 3d 3d  );..if (pinfd ==
1cf90 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
1cfa0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1cfb0 45 72 72 6f 72 2e 20 20 25 73 3a 20 55 6e 61 62  Error.  %s: Unab
1cfc0 6c 65 20 74 6f 20 72 75 6e 22 2c 20 63 61 63 6b  le to run", cack
1cfd0 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 29 3b  ey_pin_command);
1cfe0 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ....return(CACKE
1cff0 59 5f 50 43 53 43 5f 45 5f 42 41 44 50 49 4e 29  Y_PCSC_E_BADPIN)
1d000 3b 0a 09 7d 0a 0a 09 66 67 65 74 73 5f 72 65 74  ;..}...fgets_ret
1d010 20 3d 20 66 67 65 74 73 28 70 69 6e 62 75 66 2c   = fgets(pinbuf,
1d020 20 33 32 2c 20 70 69 6e 66 64 29 3b 0a 09 69 66   32, pinfd);..if
1d030 20 28 66 67 65 74 73 5f 72 65 74 20 3d 3d 20 4e   (fgets_ret == N
1d040 55 4c 4c 29 20 7b 0a 09 09 70 69 6e 62 75 66 5b  ULL) {...pinbuf[
1d050 30 5d 20 3d 20 27 5c 30 27 3b 0a 09 7d 0a 0a 09  0] = '\0';..}...
1d060 70 63 6c 6f 73 65 5f 72 65 74 20 3d 20 70 63 6c  pclose_ret = pcl
1d070 6f 73 65 28 70 69 6e 66 64 29 3b 0a 09 69 66 20  ose(pinfd);..if 
1d080 28 70 63 6c 6f 73 65 5f 72 65 74 20 3d 3d 20 2d  (pclose_ret == -
1d090 31 20 26 26 20 65 72 72 6e 6f 20 3d 3d 20 45 43  1 && errno == EC
1d0a0 48 49 4c 44 29 20 7b 0a 09 09 43 41 43 4b 45 59  HILD) {...CACKEY
1d0b0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4e  _DEBUG_PRINTF("N
1d0c0 6f 74 69 63 65 2e 20 20 70 63 6c 6f 73 65 28 29  otice.  pclose()
1d0d0 20 69 6e 64 69 63 61 74 65 64 20 69 74 20 63 6f   indicated it co
1d0e0 75 6c 64 20 6e 6f 74 20 67 65 74 20 74 68 65 20  uld not get the 
1d0f0 73 74 61 74 75 73 20 6f 66 20 74 68 65 20 63 68  status of the ch
1d100 69 6c 64 2c 20 61 73 73 75 6d 69 6e 67 20 69 74  ild, assuming it
1d110 20 73 75 63 63 65 65 65 64 65 64 20 21 22 29 3b   succeeeded !");
1d120 0a 0a 09 09 70 63 6c 6f 73 65 5f 72 65 74 20 3d  ....pclose_ret =
1d130 20 30 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 63 6c   0;..}...if (pcl
1d140 6f 73 65 5f 72 65 74 20 21 3d 20 30 29 20 7b 0a  ose_ret != 0) {.
1d150 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1d160 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 25  RINTF("Error.  %
1d170 73 3a 20 65 78 69 74 65 64 20 77 69 74 68 20 6e  s: exited with n
1d180 6f 6e 2d 7a 65 72 6f 20 73 74 61 74 75 73 20 6f  on-zero status o
1d190 66 20 25 69 22 2c 20 63 61 63 6b 65 79 5f 70 69  f %i", cackey_pi
1d1a0 6e 5f 63 6f 6d 6d 61 6e 64 2c 20 70 63 6c 6f 73  n_command, pclos
1d1b0 65 5f 72 65 74 29 3b 0a 0a 09 09 72 65 74 75 72  e_ret);....retur
1d1c0 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  n(CACKEY_PCSC_E_
1d1d0 42 41 44 50 49 4e 29 3b 0a 09 7d 0a 0a 09 69 66  BADPIN);..}...if
1d1e0 20 28 73 74 72 6c 65 6e 28 70 69 6e 62 75 66 29   (strlen(pinbuf)
1d1f0 20 3c 20 31 29 20 7b 0a 09 09 43 41 43 4b 45 59   < 1) {...CACKEY
1d200 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1d210 72 72 6f 72 2e 20 20 25 73 3a 20 72 65 74 75 72  rror.  %s: retur
1d220 6e 65 64 20 6e 6f 20 64 61 74 61 22 2c 20 63 61  ned no data", ca
1d230 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64  ckey_pin_command
1d240 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43  );....return(CAC
1d250 4b 45 59 5f 50 43 53 43 5f 45 5f 42 41 44 50 49  KEY_PCSC_E_BADPI
1d260 4e 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 69 6e  N);..}...if (pin
1d270 62 75 66 5b 73 74 72 6c 65 6e 28 70 69 6e 62 75  buf[strlen(pinbu
1d280 66 29 20 2d 20 31 5d 20 3d 3d 20 27 5c 6e 27 29  f) - 1] == '\n')
1d290 20 7b 0a 09 09 70 69 6e 62 75 66 5b 73 74 72 6c   {...pinbuf[strl
1d2a0 65 6e 28 70 69 6e 62 75 66 29 20 2d 20 31 5d 20  en(pinbuf) - 1] 
1d2b0 3d 20 27 5c 30 27 3b 0a 09 7d 0a 0a 09 72 65 74  = '\0';..}...ret
1d2c0 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
1d2d0 53 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  S_OK);.}..CK_DEF
1d2e0 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
1d2f0 52 56 2c 20 43 5f 49 6e 69 74 69 61 6c 69 7a 65  RV, C_Initialize
1d300 29 28 43 4b 5f 56 4f 49 44 5f 50 54 52 20 70 49  )(CK_VOID_PTR pI
1d310 6e 69 74 41 72 67 73 29 20 7b 0a 09 43 4b 5f 43  nitArgs) {..CK_C
1d320 5f 49 4e 49 54 49 41 4c 49 5a 45 5f 41 52 47 53  _INITIALIZE_ARGS
1d330 20 43 4b 5f 50 54 52 20 61 72 67 73 3b 0a 09 75   CK_PTR args;..u
1d340 69 6e 74 33 32 5f 74 20 69 64 78 2c 20 68 69 67  int32_t idx, hig
1d350 68 65 73 74 5f 73 6c 6f 74 3b 0a 09 69 6e 74 20  hest_slot;..int 
1d360 6d 75 74 65 78 5f 69 6e 69 74 5f 72 65 74 3b 0a  mutex_init_ret;.
1d370 09 69 6e 74 20 69 6e 63 6c 75 64 65 5f 64 6f 64  .int include_dod
1d380 5f 63 65 72 74 73 3b 0a 0a 09 43 41 43 4b 45 59  _certs;...CACKEY
1d390 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
1d3a0 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
1d3b0 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
1d3c0 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
1d3d0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1d3e0 6f 72 2e 20 20 41 6c 72 65 61 64 79 20 69 6e 69  or.  Already ini
1d3f0 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
1d400 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
1d410 4f 4b 49 5f 41 4c 52 45 41 44 59 5f 49 4e 49 54  OKI_ALREADY_INIT
1d420 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69  IALIZED);..}...i
1d430 66 20 28 70 49 6e 69 74 41 72 67 73 20 21 3d 20  f (pInitArgs != 
1d440 4e 55 4c 4c 29 20 7b 0a 09 09 61 72 67 73 20 3d  NULL) {...args =
1d450 20 70 49 6e 69 74 41 72 67 73 3b 0a 09 09 6d 65   pInitArgs;...me
1d460 6d 63 70 79 28 26 63 61 63 6b 65 79 5f 61 72 67  mcpy(&cackey_arg
1d470 73 2c 20 61 72 67 73 2c 20 73 69 7a 65 6f 66 28  s, args, sizeof(
1d480 63 61 63 6b 65 79 5f 61 72 67 73 29 29 3b 0a 0a  cackey_args));..
1d490 09 09 69 66 20 28 61 72 67 73 2d 3e 43 72 65 61  ..if (args->Crea
1d4a0 74 65 4d 75 74 65 78 20 3d 3d 20 4e 55 4c 4c 20  teMutex == NULL 
1d4b0 7c 7c 20 61 72 67 73 2d 3e 44 65 73 74 72 6f 79  || args->Destroy
1d4c0 4d 75 74 65 78 20 3d 3d 20 4e 55 4c 4c 20 7c 7c  Mutex == NULL ||
1d4d0 20 61 72 67 73 2d 3e 4c 6f 63 6b 4d 75 74 65 78   args->LockMutex
1d4e0 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 73   == NULL || args
1d4f0 2d 3e 55 6e 6c 6f 63 6b 4d 75 74 65 78 20 3d 3d  ->UnlockMutex ==
1d500 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 69 66 20 28   NULL) {....if (
1d510 61 72 67 73 2d 3e 43 72 65 61 74 65 4d 75 74 65  args->CreateMute
1d520 78 20 21 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67  x != NULL || arg
1d530 73 2d 3e 44 65 73 74 72 6f 79 4d 75 74 65 78 20  s->DestroyMutex 
1d540 21 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 73 2d  != NULL || args-
1d550 3e 4c 6f 63 6b 4d 75 74 65 78 20 21 3d 20 4e 55  >LockMutex != NU
1d560 4c 4c 20 7c 7c 20 61 72 67 73 2d 3e 55 6e 6c 6f  LL || args->Unlo
1d570 63 6b 4d 75 74 65 78 20 21 3d 20 4e 55 4c 4c 29  ckMutex != NULL)
1d580 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45   {.....CACKEY_DE
1d590 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1d5a0 72 2e 20 53 6f 6d 65 2c 20 62 75 74 20 6e 6f 74  r. Some, but not
1d5b0 20 41 6c 6c 20 74 68 72 65 61 64 69 6e 67 20 70   All threading p
1d5c0 72 69 6d 69 74 69 76 65 73 20 70 72 6f 76 69 64  rimitives provid
1d5d0 65 64 2e 22 29 3b 0a 0a 09 09 09 09 72 65 74 75  ed.");......retu
1d5e0 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53  rn(CKR_ARGUMENTS
1d5f0 5f 42 41 44 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a  _BAD);....}...}.
1d600 09 7d 20 65 6c 73 65 20 7b 0a 09 09 63 61 63 6b  .} else {...cack
1d610 65 79 5f 61 72 67 73 2e 43 72 65 61 74 65 4d 75  ey_args.CreateMu
1d620 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 09 09 63 61  tex = NULL;...ca
1d630 63 6b 65 79 5f 61 72 67 73 2e 44 65 73 74 72 6f  ckey_args.Destro
1d640 79 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 09  yMutex = NULL;..
1d650 09 63 61 63 6b 65 79 5f 61 72 67 73 2e 4c 6f 63  .cackey_args.Loc
1d660 6b 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 09  kMutex = NULL;..
1d670 09 63 61 63 6b 65 79 5f 61 72 67 73 2e 55 6e 6c  .cackey_args.Unl
1d680 6f 63 6b 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b  ockMutex = NULL;
1d690 0a 09 09 63 61 63 6b 65 79 5f 61 72 67 73 2e 66  ...cackey_args.f
1d6a0 6c 61 67 73 20 3d 20 30 3b 0a 09 7d 0a 0a 09 66  lags = 0;..}...f
1d6b0 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78  or (idx = 0; idx
1d6c0 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65   < (sizeof(cacke
1d6d0 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69  y_sessions) / si
1d6e0 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
1d6f0 69 6f 6e 73 5b 30 5d 29 29 3b 20 69 64 78 2b 2b  ions[0])); idx++
1d700 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 73 65 73  ) {...cackey_ses
1d710 73 69 6f 6e 73 5b 69 64 78 5d 2e 61 63 74 69 76  sions[idx].activ
1d720 65 20 3d 20 30 3b 0a 09 7d 0a 0a 09 66 6f 72 20  e = 0;..}...for 
1d730 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20  (idx = 0; idx < 
1d740 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
1d750 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  lots) / sizeof(c
1d760 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29  ackey_slots[0]))
1d770 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 63 61 63  ; idx++) {...cac
1d780 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 61  key_slots[idx].a
1d790 63 74 69 76 65 20 3d 20 30 3b 0a 09 09 63 61 63  ctive = 0;...cac
1d7a0 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 70  key_slots[idx].p
1d7b0 63 73 63 5f 72 65 61 64 65 72 20 3d 20 4e 55 4c  csc_reader = NUL
1d7c0 4c 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  L;...cackey_slot
1d7d0 73 5b 69 64 78 5d 2e 74 72 61 6e 73 61 63 74 69  s[idx].transacti
1d7e0 6f 6e 5f 64 65 70 74 68 20 3d 20 30 3b 0a 09 09  on_depth = 0;...
1d7f0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78  cackey_slots[idx
1d800 5d 2e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 6e 65  ].transaction_ne
1d810 65 64 5f 68 77 5f 6c 6f 63 6b 20 3d 20 30 3b 0a  ed_hw_lock = 0;.
1d820 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69  ..cackey_slots[i
1d830 64 78 5d 2e 73 6c 6f 74 5f 72 65 73 65 74 20 3d  dx].slot_reset =
1d840 20 30 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f   0;...cackey_slo
1d850 74 73 5b 69 64 78 5d 2e 74 6f 6b 65 6e 5f 66 6c  ts[idx].token_fl
1d860 61 67 73 20 3d 20 30 3b 0a 09 09 63 61 63 6b 65  ags = 0;...cacke
1d870 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 6c 61 62  y_slots[idx].lab
1d880 65 6c 20 3d 20 4e 55 4c 4c 3b 0a 09 09 63 61 63  el = NULL;...cac
1d890 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 69  key_slots[idx].i
1d8a0 6e 74 65 72 6e 61 6c 20 3d 20 30 3b 0a 09 7d 0a  nternal = 0;..}.
1d8b0 0a 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f 4e  .#ifdef CACKEY_N
1d8c0 4f 5f 45 58 54 52 41 5f 43 45 52 54 53 0a 09 69  O_EXTRA_CERTS..i
1d8d0 66 20 28 67 65 74 65 6e 76 28 22 43 41 43 4b 45  f (getenv("CACKE
1d8e0 59 5f 45 58 54 52 41 5f 43 45 52 54 53 22 29 20  Y_EXTRA_CERTS") 
1d8f0 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 69 6e 63  != NULL) {...inc
1d900 6c 75 64 65 5f 64 6f 64 5f 63 65 72 74 73 20 3d  lude_dod_certs =
1d910 20 31 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09   1;..} else {...
1d920 69 6e 63 6c 75 64 65 5f 64 6f 64 5f 63 65 72 74  include_dod_cert
1d930 73 20 3d 20 30 3b 0a 09 7d 0a 23 65 6c 73 65 0a  s = 0;..}.#else.
1d940 09 69 66 20 28 67 65 74 65 6e 76 28 22 43 41 43  .if (getenv("CAC
1d950 4b 45 59 5f 4e 4f 5f 45 58 54 52 41 5f 43 45 52  KEY_NO_EXTRA_CER
1d960 54 53 22 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  TS") != NULL) {.
1d970 09 09 69 6e 63 6c 75 64 65 5f 64 6f 64 5f 63 65  ..include_dod_ce
1d980 72 74 73 20 3d 20 30 3b 0a 09 7d 20 65 6c 73 65  rts = 0;..} else
1d990 20 7b 0a 09 09 69 6e 63 6c 75 64 65 5f 64 6f 64   {...include_dod
1d9a0 5f 63 65 72 74 73 20 3d 20 31 3b 0a 09 7d 0a 23  _certs = 1;..}.#
1d9b0 65 6e 64 69 66 0a 0a 09 69 66 20 28 69 6e 63 6c  endif...if (incl
1d9c0 75 64 65 5f 64 6f 64 5f 63 65 72 74 73 20 3d 3d  ude_dod_certs ==
1d9d0 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
1d9e0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 41 73 6b  EBUG_PRINTF("Ask
1d9f0 65 64 20 6e 6f 74 20 74 6f 20 69 6e 63 6c 75 64  ed not to includ
1da00 65 20 44 6f 44 20 63 65 72 74 69 66 69 63 61 74  e DoD certificat
1da10 65 73 22 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a  es");..} else {.
1da20 09 09 68 69 67 68 65 73 74 5f 73 6c 6f 74 20 3d  ..highest_slot =
1da30 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
1da40 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28  slots) / sizeof(
1da50 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29  cackey_slots[0])
1da60 29 20 2d 20 31 3b 0a 0a 09 09 43 41 43 4b 45 59  ) - 1;....CACKEY
1da70 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 49  _DEBUG_PRINTF("I
1da80 6e 63 6c 75 64 69 6e 67 20 44 6f 44 20 63 65 72  ncluding DoD cer
1da90 74 73 20 69 6e 20 73 6c 6f 74 20 25 6c 75 22 2c  ts in slot %lu",
1daa0 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
1dab0 20 68 69 67 68 65 73 74 5f 73 6c 6f 74 29 3b 0a   highest_slot);.
1dac0 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ...cackey_slots[
1dad0 68 69 67 68 65 73 74 5f 73 6c 6f 74 5d 2e 61 63  highest_slot].ac
1dae0 74 69 76 65 20 3d 20 31 3b 0a 09 09 63 61 63 6b  tive = 1;...cack
1daf0 65 79 5f 73 6c 6f 74 73 5b 68 69 67 68 65 73 74  ey_slots[highest
1db00 5f 73 6c 6f 74 5d 2e 69 6e 74 65 72 6e 61 6c 20  _slot].internal 
1db10 3d 20 31 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c  = 1;...cackey_sl
1db20 6f 74 73 5b 68 69 67 68 65 73 74 5f 73 6c 6f 74  ots[highest_slot
1db30 5d 2e 6c 61 62 65 6c 20 3d 20 28 75 6e 73 69 67  ].label = (unsig
1db40 6e 65 64 20 63 68 61 72 20 2a 29 20 22 55 53 20  ned char *) "US 
1db50 47 6f 76 65 72 6e 6d 65 6e 74 20 43 65 72 74 69  Government Certi
1db60 66 69 63 61 74 65 73 22 3b 0a 09 09 63 61 63 6b  ficates";...cack
1db70 65 79 5f 73 6c 6f 74 73 5b 68 69 67 68 65 73 74  ey_slots[highest
1db80 5f 73 6c 6f 74 5d 2e 70 63 73 63 5f 72 65 61 64  _slot].pcsc_read
1db90 65 72 20 3d 20 22 43 41 43 4b 65 79 22 3b 0a 09  er = "CACKey";..
1dba0 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 68 69  .cackey_slots[hi
1dbb0 67 68 65 73 74 5f 73 6c 6f 74 5d 2e 74 6f 6b 65  ghest_slot].toke
1dbc0 6e 5f 66 6c 61 67 73 20 3d 20 30 3b 0a 09 7d 0a  n_flags = 0;..}.
1dbd0 0a 09 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  ..cackey_initial
1dbe0 69 7a 65 64 20 3d 20 31 3b 0a 0a 09 69 66 20 28  ized = 1;...if (
1dbf0 21 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 5f  !cackey_biglock_
1dc00 69 6e 69 74 29 20 7b 0a 09 09 6d 75 74 65 78 5f  init) {...mutex_
1dc10 69 6e 69 74 5f 72 65 74 20 3d 20 63 61 63 6b 65  init_ret = cacke
1dc20 79 5f 6d 75 74 65 78 5f 63 72 65 61 74 65 28 26  y_mutex_create(&
1dc30 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
1dc40 0a 0a 09 09 69 66 20 28 6d 75 74 65 78 5f 69 6e  ....if (mutex_in
1dc50 69 74 5f 72 65 74 20 21 3d 20 30 29 20 7b 0a 09  it_ret != 0) {..
1dc60 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1dc70 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4d  RINTF("Error.  M
1dc80 75 74 65 78 20 69 6e 69 74 69 61 6c 69 7a 61 74  utex initializat
1dc90 69 6f 6e 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ion failed.");..
1dca0 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 41  ...return(CKR_CA
1dcb0 4e 54 5f 4c 4f 43 4b 29 3b 0a 09 09 7d 0a 0a 09  NT_LOCK);...}...
1dcc0 09 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 5f  .cackey_biglock_
1dcd0 69 6e 69 74 20 3d 20 31 3b 0a 09 7d 0a 0a 09 2f  init = 1;..}.../
1dce0 2a 20 44 65 66 69 6e 65 20 61 20 63 6f 6d 6d 61  * Define a comma
1dcf0 6e 64 20 74 6f 20 70 72 6f 6d 70 74 20 75 73 65  nd to prompt use
1dd00 72 20 66 6f 72 20 61 20 50 49 4e 20 2a 2f 0a 23  r for a PIN */.#
1dd10 69 66 64 65 66 20 43 41 43 4b 45 59 5f 50 49 4e  ifdef CACKEY_PIN
1dd20 5f 43 4f 4d 4d 41 4e 44 5f 44 45 46 41 55 4c 54  _COMMAND_DEFAULT
1dd30 0a 09 63 61 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d  ..cackey_pin_com
1dd40 6d 61 6e 64 20 3d 20 73 74 72 64 75 70 28 43 41  mand = strdup(CA
1dd50 43 4b 45 59 5f 4d 41 43 52 4f 5f 44 45 46 41 55  CKEY_MACRO_DEFAU
1dd60 4c 54 5f 58 53 54 52 28 43 41 43 4b 45 59 5f 50  LT_XSTR(CACKEY_P
1dd70 49 4e 5f 43 4f 4d 4d 41 4e 44 5f 44 45 46 41 55  IN_COMMAND_DEFAU
1dd80 4c 54 29 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69  LT));.#endif..#i
1dd90 66 64 65 66 20 43 41 43 4b 45 59 5f 50 49 4e 5f  fdef CACKEY_PIN_
1dda0 43 4f 4d 4d 41 4e 44 5f 58 4f 4e 4c 59 5f 44 45  COMMAND_XONLY_DE
1ddb0 46 41 55 4c 54 0a 09 69 66 20 28 67 65 74 65 6e  FAULT..if (geten
1ddc0 76 28 22 44 49 53 50 4c 41 59 22 29 20 21 3d 20  v("DISPLAY") != 
1ddd0 4e 55 4c 4c 29 20 7b 0a 09 09 63 61 63 6b 65 79  NULL) {...cackey
1dde0 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20 3d 20 73  _pin_command = s
1ddf0 74 72 64 75 70 28 43 41 43 4b 45 59 5f 4d 41 43  trdup(CACKEY_MAC
1de00 52 4f 5f 44 45 46 41 55 4c 54 5f 58 53 54 52 28  RO_DEFAULT_XSTR(
1de10 43 41 43 4b 45 59 5f 50 49 4e 5f 43 4f 4d 4d 41  CACKEY_PIN_COMMA
1de20 4e 44 5f 58 4f 4e 4c 59 5f 44 45 46 41 55 4c 54  ND_XONLY_DEFAULT
1de30 29 29 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a 0a 09  ));..}.#endif...
1de40 69 66 20 28 67 65 74 65 6e 76 28 22 43 41 43 4b  if (getenv("CACK
1de50 45 59 5f 50 49 4e 5f 43 4f 4d 4d 41 4e 44 22 29  EY_PIN_COMMAND")
1de60 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 63 61   != NULL) {...ca
1de70 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64  ckey_pin_command
1de80 20 3d 20 73 74 72 64 75 70 28 67 65 74 65 6e 76   = strdup(getenv
1de90 28 22 43 41 43 4b 45 59 5f 50 49 4e 5f 43 4f 4d  ("CACKEY_PIN_COM
1dea0 4d 41 4e 44 22 29 29 3b 0a 09 7d 0a 0a 09 69 66  MAND"));..}...if
1deb0 20 28 67 65 74 65 6e 76 28 22 43 41 43 4b 45 59   (getenv("CACKEY
1dec0 5f 50 49 4e 5f 43 4f 4d 4d 41 4e 44 5f 58 4f 4e  _PIN_COMMAND_XON
1ded0 4c 59 22 29 20 21 3d 20 4e 55 4c 4c 20 26 26 20  LY") != NULL && 
1dee0 67 65 74 65 6e 76 28 22 44 49 53 50 4c 41 59 22  getenv("DISPLAY"
1def0 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 63  ) != NULL) {...c
1df00 61 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e  ackey_pin_comman
1df10 64 20 3d 20 73 74 72 64 75 70 28 67 65 74 65 6e  d = strdup(geten
1df20 76 28 22 43 41 43 4b 45 59 5f 50 49 4e 5f 43 4f  v("CACKEY_PIN_CO
1df30 4d 4d 41 4e 44 5f 58 4f 4e 4c 59 22 29 29 3b 0a  MMAND_XONLY"));.
1df40 09 7d 0a 0a 23 69 66 64 65 66 20 43 41 43 4b 45  .}..#ifdef CACKE
1df50 59 5f 52 45 41 44 45 52 53 5f 49 4e 43 4c 55 44  Y_READERS_INCLUD
1df60 45 5f 4f 4e 4c 59 5f 44 45 46 41 55 4c 54 0a 09  E_ONLY_DEFAULT..
1df70 63 61 63 6b 65 79 5f 72 65 61 64 65 72 73 5f 69  cackey_readers_i
1df80 6e 63 6c 75 64 65 5f 6f 6e 6c 79 20 3d 20 73 74  nclude_only = st
1df90 72 64 75 70 28 43 41 43 4b 45 59 5f 4d 41 43 52  rdup(CACKEY_MACR
1dfa0 4f 5f 44 45 46 41 55 4c 54 5f 58 53 54 52 28 43  O_DEFAULT_XSTR(C
1dfb0 41 43 4b 45 59 5f 52 45 41 44 45 52 53 5f 49 4e  ACKEY_READERS_IN
1dfc0 43 4c 55 44 45 5f 4f 4e 4c 59 5f 44 45 46 41 55  CLUDE_ONLY_DEFAU
1dfd0 4c 54 29 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69  LT));.#endif..#i
1dfe0 66 64 65 66 20 43 41 43 4b 45 59 5f 52 45 41 44  fdef CACKEY_READ
1dff0 45 52 53 5f 45 58 43 4c 55 44 45 5f 44 45 46 41  ERS_EXCLUDE_DEFA
1e000 55 4c 54 0a 09 63 61 63 6b 65 79 5f 72 65 61 64  ULT..cackey_read
1e010 65 72 73 5f 65 78 63 6c 75 64 65 20 3d 20 73 74  ers_exclude = st
1e020 72 64 75 70 28 43 41 43 4b 45 59 5f 4d 41 43 52  rdup(CACKEY_MACR
1e030 4f 5f 44 45 46 41 55 4c 54 5f 58 53 54 52 28 43  O_DEFAULT_XSTR(C
1e040 41 43 4b 45 59 5f 52 45 41 44 45 52 53 5f 45 58  ACKEY_READERS_EX
1e050 43 4c 55 44 45 5f 44 45 46 41 55 4c 54 29 29 3b  CLUDE_DEFAULT));
1e060 0a 23 65 6e 64 69 66 0a 0a 09 69 66 20 28 67 65  .#endif...if (ge
1e070 74 65 6e 76 28 22 43 41 43 4b 45 59 5f 52 45 41  tenv("CACKEY_REA
1e080 44 45 52 53 5f 49 4e 43 4c 55 44 45 5f 4f 4e 4c  DERS_INCLUDE_ONL
1e090 59 22 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  Y") != NULL) {..
1e0a0 09 63 61 63 6b 65 79 5f 72 65 61 64 65 72 73 5f  .cackey_readers_
1e0b0 69 6e 63 6c 75 64 65 5f 6f 6e 6c 79 20 3d 20 73  include_only = s
1e0c0 74 72 64 75 70 28 67 65 74 65 6e 76 28 22 43 41  trdup(getenv("CA
1e0d0 43 4b 45 59 5f 52 45 41 44 45 52 53 5f 49 4e 43  CKEY_READERS_INC
1e0e0 4c 55 44 45 5f 4f 4e 4c 59 22 29 29 3b 0a 0a 09  LUDE_ONLY"));...
1e0f0 09 69 66 20 28 63 61 63 6b 65 79 5f 72 65 61 64  .if (cackey_read
1e100 65 72 73 5f 69 6e 63 6c 75 64 65 5f 6f 6e 6c 79  ers_include_only
1e110 5b 30 5d 20 3d 3d 20 27 5c 30 27 29 20 7b 0a 09  [0] == '\0') {..
1e120 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f 72 65  ..free(cackey_re
1e130 61 64 65 72 73 5f 69 6e 63 6c 75 64 65 5f 6f 6e  aders_include_on
1e140 6c 79 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f  ly);.....cackey_
1e150 72 65 61 64 65 72 73 5f 69 6e 63 6c 75 64 65 5f  readers_include_
1e160 6f 6e 6c 79 20 3d 20 4e 55 4c 4c 3b 0a 09 09 7d  only = NULL;...}
1e170 0a 09 7d 0a 0a 09 69 66 20 28 67 65 74 65 6e 76  ..}...if (getenv
1e180 28 22 43 41 43 4b 45 59 5f 52 45 41 44 45 52 53  ("CACKEY_READERS
1e190 5f 45 58 43 4c 55 44 45 22 29 20 21 3d 20 4e 55  _EXCLUDE") != NU
1e1a0 4c 4c 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 72  LL) {...cackey_r
1e1b0 65 61 64 65 72 73 5f 65 78 63 6c 75 64 65 20 3d  eaders_exclude =
1e1c0 20 73 74 72 64 75 70 28 67 65 74 65 6e 76 28 22   strdup(getenv("
1e1d0 43 41 43 4b 45 59 5f 52 45 41 44 45 52 53 5f 45  CACKEY_READERS_E
1e1e0 58 43 4c 55 44 45 22 29 29 3b 0a 0a 09 09 69 66  XCLUDE"));....if
1e1f0 20 28 63 61 63 6b 65 79 5f 72 65 61 64 65 72 73   (cackey_readers
1e200 5f 65 78 63 6c 75 64 65 5b 30 5d 20 3d 3d 20 27  _exclude[0] == '
1e210 5c 30 27 29 20 7b 0a 09 09 09 66 72 65 65 28 63  \0') {....free(c
1e220 61 63 6b 65 79 5f 72 65 61 64 65 72 73 5f 65 78  ackey_readers_ex
1e230 63 6c 75 64 65 29 3b 0a 0a 09 09 09 63 61 63 6b  clude);.....cack
1e240 65 79 5f 72 65 61 64 65 72 73 5f 65 78 63 6c 75  ey_readers_exclu
1e250 64 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 7d 0a 09  de = NULL;...}..
1e260 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
1e270 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
1e280 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c  ng CKR_OK (%i)",
1e290 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75   CKR_OK);...retu
1e2a0 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43  rn(CKR_OK);.}..C
1e2b0 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
1e2c0 4e 28 43 4b 5f 52 56 2c 20 43 5f 46 69 6e 61 6c  N(CK_RV, C_Final
1e2d0 69 7a 65 29 28 43 4b 5f 56 4f 49 44 5f 50 54 52  ize)(CK_VOID_PTR
1e2e0 20 70 52 65 73 65 72 76 65 64 29 20 7b 0a 09 75   pReserved) {..u
1e2f0 69 6e 74 33 32 5f 74 20 69 64 78 3b 0a 0a 09 43  int32_t idx;...C
1e300 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1e310 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
1e320 09 69 66 20 28 70 52 65 73 65 72 76 65 64 20 21  .if (pReserved !
1e330 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
1e340 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1e350 22 45 72 72 6f 72 2e 20 70 52 65 73 65 72 76 65  "Error. pReserve
1e360 64 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 22 29  d is not NULL.")
1e370 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
1e380 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a  ARGUMENTS_BAD);.
1e390 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  .}...if (!cackey
1e3a0 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
1e3b0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1e3c0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
1e3d0 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
1e3e0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1e3f0 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
1e400 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
1e410 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69  .for (idx = 0; i
1e420 64 78 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63  dx < (sizeof(cac
1e430 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20  key_sessions) / 
1e440 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
1e450 73 73 69 6f 6e 73 5b 30 5d 29 29 3b 20 69 64 78  ssions[0])); idx
1e460 2b 2b 29 20 7b 0a 09 09 69 66 20 28 63 61 63 6b  ++) {...if (cack
1e470 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d  ey_sessions[idx]
1e480 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 09 43 5f  .active) {....C_
1e490 43 6c 6f 73 65 53 65 73 73 69 6f 6e 28 69 64 78  CloseSession(idx
1e4a0 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 63 61 63 6b  );...}..}...cack
1e4b0 65 79 5f 73 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e  ey_slots_disconn
1e4c0 65 63 74 5f 61 6c 6c 28 29 3b 0a 0a 09 66 6f 72  ect_all();...for
1e4d0 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c   (idx = 0; idx <
1e4e0 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
1e4f0 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28  slots) / sizeof(
1e500 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29  cackey_slots[0])
1e510 29 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66  ); idx++) {...if
1e520 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69   (cackey_slots[i
1e530 64 78 5d 2e 69 6e 74 65 72 6e 61 6c 29 20 7b 0a  dx].internal) {.
1e540 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 7d  ...continue;...}
1e550 0a 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73  ....if (cackey_s
1e560 6c 6f 74 73 5b 69 64 78 5d 2e 70 63 73 63 5f 72  lots[idx].pcsc_r
1e570 65 61 64 65 72 29 20 7b 0a 09 09 09 66 72 65 65  eader) {....free
1e580 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64  (cackey_slots[id
1e590 78 5d 2e 70 63 73 63 5f 72 65 61 64 65 72 29 3b  x].pcsc_reader);
1e5a0 0a 09 09 7d 0a 0a 09 09 69 66 20 28 63 61 63 6b  ...}....if (cack
1e5b0 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 63 61  ey_slots[idx].ca
1e5c0 63 68 65 64 5f 63 65 72 74 73 29 20 7b 0a 09 09  ched_certs) {...
1e5d0 09 63 61 63 6b 65 79 5f 66 72 65 65 5f 63 65 72  .cackey_free_cer
1e5e0 74 73 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ts(cackey_slots[
1e5f0 69 64 78 5d 2e 63 61 63 68 65 64 5f 63 65 72 74  idx].cached_cert
1e600 73 2c 20 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  s, cackey_slots[
1e610 69 64 78 5d 2e 63 61 63 68 65 64 5f 63 65 72 74  idx].cached_cert
1e620 73 5f 63 6f 75 6e 74 2c 20 31 29 3b 0a 0a 09 09  s_count, 1);....
1e630 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64  .cackey_slots[id
1e640 78 5d 2e 63 61 63 68 65 64 5f 63 65 72 74 73 20  x].cached_certs 
1e650 3d 20 4e 55 4c 4c 3b 0a 09 09 7d 0a 09 7d 0a 0a  = NULL;...}..}..
1e660 09 63 61 63 6b 65 79 5f 70 63 73 63 5f 64 69 73  .cackey_pcsc_dis
1e670 63 6f 6e 6e 65 63 74 28 29 3b 0a 0a 09 69 66 20  connect();...if 
1e680 28 63 61 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d  (cackey_pin_comm
1e690 61 6e 64 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  and != NULL) {..
1e6a0 09 66 72 65 65 28 63 61 63 6b 65 79 5f 70 69 6e  .free(cackey_pin
1e6b0 5f 63 6f 6d 6d 61 6e 64 29 3b 0a 0a 09 09 63 61  _command);....ca
1e6c0 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64  ckey_pin_command
1e6d0 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 0a 09 69 66   = NULL;..}...if
1e6e0 20 28 63 61 63 6b 65 79 5f 72 65 61 64 65 72 73   (cackey_readers
1e6f0 5f 69 6e 63 6c 75 64 65 5f 6f 6e 6c 79 20 21 3d  _include_only !=
1e700 20 4e 55 4c 4c 29 20 7b 0a 09 09 66 72 65 65 28   NULL) {...free(
1e710 63 61 63 6b 65 79 5f 72 65 61 64 65 72 73 5f 69  cackey_readers_i
1e720 6e 63 6c 75 64 65 5f 6f 6e 6c 79 29 3b 0a 0a 09  nclude_only);...
1e730 09 63 61 63 6b 65 79 5f 72 65 61 64 65 72 73 5f  .cackey_readers_
1e740 69 6e 63 6c 75 64 65 5f 6f 6e 6c 79 20 3d 20 4e  include_only = N
1e750 55 4c 4c 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61  ULL;..}...if (ca
1e760 63 6b 65 79 5f 72 65 61 64 65 72 73 5f 65 78 63  ckey_readers_exc
1e770 6c 75 64 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  lude != NULL) {.
1e780 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f 72 65  ..free(cackey_re
1e790 61 64 65 72 73 5f 65 78 63 6c 75 64 65 29 3b 0a  aders_exclude);.
1e7a0 0a 09 09 63 61 63 6b 65 79 5f 72 65 61 64 65 72  ...cackey_reader
1e7b0 73 5f 65 78 63 6c 75 64 65 20 3d 20 4e 55 4c 4c  s_exclude = NULL
1e7c0 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 69 6e  ;..}...cackey_in
1e7d0 69 74 69 61 6c 69 7a 65 64 20 3d 20 30 3b 0a 0a  itialized = 0;..
1e7e0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1e7f0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
1e800 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b  CKR_OK (%i)", CK
1e810 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28  R_OK);...return(
1e820 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44  CKR_OK);.}..CK_D
1e830 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
1e840 4b 5f 52 56 2c 20 43 5f 47 65 74 49 6e 66 6f 29  K_RV, C_GetInfo)
1e850 28 43 4b 5f 49 4e 46 4f 5f 50 54 52 20 70 49 6e  (CK_INFO_PTR pIn
1e860 66 6f 29 20 7b 0a 09 73 74 61 74 69 63 20 43 4b  fo) {..static CK
1e870 5f 55 54 46 38 43 48 41 52 20 6d 61 6e 75 66 61  _UTF8CHAR manufa
1e880 63 74 75 72 65 72 49 44 5b 5d 20 3d 20 22 55 2e  cturerID[] = "U.
1e890 53 2e 20 47 6f 76 65 72 6e 6d 65 6e 74 22 3b 0a  S. Government";.
1e8a0 09 73 74 61 74 69 63 20 43 4b 5f 55 54 46 38 43  .static CK_UTF8C
1e8b0 48 41 52 20 6c 69 62 72 61 72 79 44 65 73 63 72  HAR libraryDescr
1e8c0 69 70 74 69 6f 6e 5b 5d 20 3d 20 22 43 41 43 4b  iption[] = "CACK
1e8d0 65 79 22 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ey";...CACKEY_DE
1e8e0 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
1e8f0 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70 49 6e  ed.");...if (pIn
1e900 66 6f 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  fo == NULL) {...
1e910 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1e920 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 49 6e 66  NTF("Error. pInf
1e930 6f 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09  o is NULL.");...
1e940 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55  .return(CKR_ARGU
1e950 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a  MENTS_BAD);..}..
1e960 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
1e970 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
1e980 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1e990 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
1e9a0 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
1e9b0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
1e9c0 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
1e9d0 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 70 49 6e  LIZED);..}...pIn
1e9e0 66 6f 2d 3e 63 72 79 70 74 6f 6b 69 56 65 72 73  fo->cryptokiVers
1e9f0 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 28 28 43 41  ion.major = ((CA
1ea00 43 4b 45 59 5f 43 52 59 50 54 4f 4b 49 5f 56 45  CKEY_CRYPTOKI_VE
1ea10 52 53 49 4f 4e 5f 43 4f 44 45 29 20 3e 3e 20 31  RSION_CODE) >> 1
1ea20 36 29 20 26 20 30 78 66 66 3b 0a 09 70 49 6e 66  6) & 0xff;..pInf
1ea30 6f 2d 3e 63 72 79 70 74 6f 6b 69 56 65 72 73 69  o->cryptokiVersi
1ea40 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 28 28 43 41 43  on.minor = ((CAC
1ea50 4b 45 59 5f 43 52 59 50 54 4f 4b 49 5f 56 45 52  KEY_CRYPTOKI_VER
1ea60 53 49 4f 4e 5f 43 4f 44 45 29 20 3e 3e 20 38 29  SION_CODE) >> 8)
1ea70 20 26 20 30 78 66 66 3b 0a 0a 09 6d 65 6d 73 65   & 0xff;...memse
1ea80 74 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63  t(pInfo->manufac
1ea90 74 75 72 65 72 49 44 2c 20 27 20 27 2c 20 73 69  turerID, ' ', si
1eaa0 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75  zeof(pInfo->manu
1eab0 66 61 63 74 75 72 65 72 49 44 29 29 3b 0a 09 6d  facturerID));..m
1eac0 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 6d 61 6e  emcpy(pInfo->man
1ead0 75 66 61 63 74 75 72 65 72 49 44 2c 20 6d 61 6e  ufacturerID, man
1eae0 75 66 61 63 74 75 72 65 72 49 44 2c 20 73 69 7a  ufacturerID, siz
1eaf0 65 6f 66 28 6d 61 6e 75 66 61 63 74 75 72 65 72  eof(manufacturer
1eb00 49 44 29 20 2d 20 31 29 3b 0a 0a 09 70 49 6e 66  ID) - 1);...pInf
1eb10 6f 2d 3e 66 6c 61 67 73 20 3d 20 30 78 30 30 3b  o->flags = 0x00;
1eb20 0a 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d  ...memset(pInfo-
1eb30 3e 6c 69 62 72 61 72 79 44 65 73 63 72 69 70 74  >libraryDescript
1eb40 69 6f 6e 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66  ion, ' ', sizeof
1eb50 28 70 49 6e 66 6f 2d 3e 6c 69 62 72 61 72 79 44  (pInfo->libraryD
1eb60 65 73 63 72 69 70 74 69 6f 6e 29 29 3b 0a 09 6d  escription));..m
1eb70 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 6c 69 62  emcpy(pInfo->lib
1eb80 72 61 72 79 44 65 73 63 72 69 70 74 69 6f 6e 2c  raryDescription,
1eb90 20 6c 69 62 72 61 72 79 44 65 73 63 72 69 70 74   libraryDescript
1eba0 69 6f 6e 2c 20 73 69 7a 65 6f 66 28 6c 69 62 72  ion, sizeof(libr
1ebb0 61 72 79 44 65 73 63 72 69 70 74 69 6f 6e 29 20  aryDescription) 
1ebc0 2d 20 31 29 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 6c  - 1);...pInfo->l
1ebd0 69 62 72 61 72 79 56 65 72 73 69 6f 6e 2e 6d 61  ibraryVersion.ma
1ebe0 6a 6f 72 20 3d 20 28 63 61 63 6b 65 79 5f 67 65  jor = (cackey_ge
1ebf0 74 76 65 72 73 69 6f 6e 28 29 20 3e 3e 20 31 36  tversion() >> 16
1ec00 29 20 26 20 30 78 66 66 3b 0a 09 70 49 6e 66 6f  ) & 0xff;..pInfo
1ec10 2d 3e 6c 69 62 72 61 72 79 56 65 72 73 69 6f 6e  ->libraryVersion
1ec20 2e 6d 69 6e 6f 72 20 3d 20 28 63 61 63 6b 65 79  .minor = (cackey
1ec30 5f 67 65 74 76 65 72 73 69 6f 6e 28 29 20 3e 3e  _getversion() >>
1ec40 20 38 29 20 26 20 30 78 66 66 3b 0a 0a 09 43 41   8) & 0xff;...CA
1ec50 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1ec60 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
1ec70 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f  _OK (%i)", CKR_O
1ec80 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  K);...return(CKR
1ec90 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 50  _OK);.}../*. * P
1eca0 72 6f 63 65 73 73 20 6c 69 73 74 20 6f 66 20 72  rocess list of r
1ecb0 65 61 64 65 72 73 2c 20 61 6e 64 20 63 72 65 61  eaders, and crea
1ecc0 74 65 20 6d 61 70 70 69 6e 67 20 62 65 74 77 65  te mapping betwe
1ecd0 65 6e 20 72 65 61 64 65 72 20 6e 61 6d 65 20 61  en reader name a
1ece0 6e 64 20 73 6c 6f 74 20 49 44 0a 20 2a 2f 0a 43  nd slot ID. */.C
1ecf0 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
1ed00 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 53 6c  N(CK_RV, C_GetSl
1ed10 6f 74 4c 69 73 74 29 28 43 4b 5f 42 42 4f 4f 4c  otList)(CK_BBOOL
1ed20 20 74 6f 6b 65 6e 50 72 65 73 65 6e 74 2c 20 43   tokenPresent, C
1ed30 4b 5f 53 4c 4f 54 5f 49 44 5f 50 54 52 20 70 53  K_SLOT_ID_PTR pS
1ed40 6c 6f 74 4c 69 73 74 2c 20 43 4b 5f 55 4c 4f 4e  lotList, CK_ULON
1ed50 47 5f 50 54 52 20 70 75 6c 43 6f 75 6e 74 29 20  G_PTR pulCount) 
1ed60 7b 0a 09 73 74 61 74 69 63 20 69 6e 74 20 66 69  {..static int fi
1ed70 72 73 74 5f 63 61 6c 6c 20 3d 20 31 3b 0a 09 69  rst_call = 1;..i
1ed80 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b  nt mutex_retval;
1ed90 0a 09 69 6e 74 20 70 63 73 63 5f 63 6f 6e 6e 65  ..int pcsc_conne
1eda0 63 74 5f 72 65 74 3b 0a 09 43 4b 5f 55 4c 4f 4e  ct_ret;..CK_ULON
1edb0 47 20 63 6f 75 6e 74 2c 20 73 6c 6f 74 5f 63 6f  G count, slot_co
1edc0 75 6e 74 20 3d 20 30 2c 20 63 75 72 72 73 6c 6f  unt = 0, currslo
1edd0 74 2c 20 73 6c 6f 74 5f 69 64 78 3b 0a 09 63 68  t, slot_idx;..ch
1ede0 61 72 20 2a 70 63 73 63 5f 72 65 61 64 65 72 73  ar *pcsc_readers
1edf0 2c 20 2a 70 63 73 63 5f 72 65 61 64 65 72 73 5f  , *pcsc_readers_
1ee00 73 2c 20 2a 70 63 73 63 5f 72 65 61 64 65 72 73  s, *pcsc_readers
1ee10 5f 65 3b 0a 09 63 68 61 72 20 2a 72 65 61 64 65  _e;..char *reade
1ee20 72 5f 63 68 65 63 6b 5f 70 61 74 74 65 72 6e 3b  r_check_pattern;
1ee30 0a 09 44 57 4f 52 44 20 70 63 73 63 5f 72 65 61  ..DWORD pcsc_rea
1ee40 64 65 72 73 5f 6c 65 6e 3b 0a 09 4c 4f 4e 47 20  ders_len;..LONG 
1ee50 73 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72  scard_listreader
1ee60 73 5f 72 65 74 3b 0a 09 73 69 7a 65 5f 74 20 63  s_ret;..size_t c
1ee70 75 72 72 5f 72 65 61 64 65 72 5f 6c 65 6e 3b 0a  urr_reader_len;.
1ee80 09 69 6e 74 20 73 6c 6f 74 5f 72 65 73 65 74 3b  .int slot_reset;
1ee90 0a 09 69 6e 74 20 69 6e 63 6c 75 64 65 5f 72 65  ..int include_re
1eea0 61 64 65 72 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  ader;...CACKEY_D
1eeb0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
1eec0 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70 75  led.");...if (pu
1eed0 6c 43 6f 75 6e 74 20 3d 3d 20 4e 55 4c 4c 29 20  lCount == NULL) 
1eee0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1eef0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1ef00 70 75 6c 43 6f 75 6e 74 20 69 73 20 4e 55 4c 4c  pulCount is NULL
1ef10 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
1ef20 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44  KR_ARGUMENTS_BAD
1ef30 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63  );..}...if (!cac
1ef40 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
1ef50 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1ef60 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1ef70 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
1ef80 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
1ef90 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
1efa0 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
1efb0 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  }...mutex_retval
1efc0 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
1efd0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
1efe0 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
1eff0 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
1f000 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1f010 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c  RINTF("Error.  L
1f020 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
1f030 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
1f040 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
1f050 09 7d 0a 0a 09 2f 2a 20 43 6c 65 61 72 20 6c 69  .}.../* Clear li
1f060 73 74 20 6f 66 20 73 6c 6f 74 73 20 2a 2f 0a 09  st of slots */..
1f070 73 6c 6f 74 5f 72 65 73 65 74 20 3d 20 30 3b 0a  slot_reset = 0;.
1f080 09 69 66 20 28 70 53 6c 6f 74 4c 69 73 74 29 20  .if (pSlotList) 
1f090 7b 0a 09 09 69 66 20 28 66 69 72 73 74 5f 63 61  {...if (first_ca
1f0a0 6c 6c 29 20 7b 0a 09 09 09 66 69 72 73 74 5f 63  ll) {....first_c
1f0b0 61 6c 6c 20 3d 20 30 3b 0a 0a 09 09 09 73 6c 6f  all = 0;.....slo
1f0c0 74 5f 72 65 73 65 74 20 3d 20 31 3b 0a 09 09 7d  t_reset = 1;...}
1f0d0 0a 0a 09 09 2f 2a 20 49 66 20 61 6e 79 20 6f 66  ..../* If any of
1f0e0 20 74 68 65 20 73 6c 6f 74 73 20 68 61 76 65 20   the slots have 
1f0f0 62 65 65 6e 20 72 65 73 65 74 20 74 68 65 6e 20  been reset then 
1f100 70 75 72 67 65 20 61 6c 6c 20 69 6e 66 6f 72 6d  purge all inform
1f110 61 74 69 6f 6e 20 61 6e 64 20 63 68 65 63 6b 20  ation and check 
1f120 61 67 61 69 6e 20 2a 2f 0a 09 09 66 6f 72 20 28  again */...for (
1f130 63 75 72 72 73 6c 6f 74 20 3d 20 30 3b 20 63 75  currslot = 0; cu
1f140 72 72 73 6c 6f 74 20 3c 20 28 73 69 7a 65 6f 66  rrslot < (sizeof
1f150 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f  (cackey_slots) /
1f160 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73   sizeof(cackey_s
1f170 6c 6f 74 73 5b 30 5d 29 29 3b 20 63 75 72 72 73  lots[0])); currs
1f180 6c 6f 74 2b 2b 29 20 7b 0a 09 09 09 69 66 20 28  lot++) {....if (
1f190 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72  cackey_slots[cur
1f1a0 72 73 6c 6f 74 5d 2e 69 6e 74 65 72 6e 61 6c 29  rslot].internal)
1f1b0 20 7b 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b   {.....continue;
1f1c0 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 21 63  ....}.....if (!c
1f1d0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72  ackey_slots[curr
1f1e0 73 6c 6f 74 5d 2e 61 63 74 69 76 65 29 20 7b 0a  slot].active) {.
1f1f0 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09  ....continue;...
1f200 09 7d 0a 0a 09 09 09 69 66 20 28 63 61 63 6b 65  .}.....if (cacke
1f210 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74  y_slots[currslot
1f220 5d 2e 73 6c 6f 74 5f 72 65 73 65 74 29 20 7b 0a  ].slot_reset) {.
1f230 09 09 09 09 73 6c 6f 74 5f 72 65 73 65 74 20 3d  ....slot_reset =
1f240 20 31 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a   1;......break;.
1f250 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 69 66 20 28  ...}...}....if (
1f260 73 6c 6f 74 5f 72 65 73 65 74 29 20 7b 0a 09 09  slot_reset) {...
1f270 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1f280 49 4e 54 46 28 22 50 75 72 67 69 6e 67 20 61 6c  INTF("Purging al
1f290 6c 20 73 6c 6f 74 20 69 6e 66 6f 72 6d 61 74 69  l slot informati
1f2a0 6f 6e 2e 22 29 3b 0a 0a 09 09 09 2f 2a 20 4f 6e  on.");...../* On
1f2b0 6c 79 20 75 70 64 61 74 65 20 74 68 65 20 6c 69  ly update the li
1f2c0 73 74 20 6f 66 20 73 6c 6f 74 73 20 69 66 20 77  st of slots if w
1f2d0 65 20 61 72 65 20 61 63 74 75 61 6c 6c 79 20 62  e are actually b
1f2e0 65 69 6e 67 20 73 75 70 70 6c 79 20 74 68 65 20  eing supply the 
1f2f0 73 6c 6f 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  slot information
1f300 20 2a 2f 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c   */....cackey_sl
1f310 6f 74 73 5f 64 69 73 63 6f 6e 6e 65 63 74 5f 61  ots_disconnect_a
1f320 6c 6c 28 29 3b 0a 0a 09 09 09 66 6f 72 20 28 63  ll();.....for (c
1f330 75 72 72 73 6c 6f 74 20 3d 20 30 3b 20 63 75 72  urrslot = 0; cur
1f340 72 73 6c 6f 74 20 3c 20 28 73 69 7a 65 6f 66 28  rslot < (sizeof(
1f350 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20  cackey_slots) / 
1f360 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
1f370 6f 74 73 5b 30 5d 29 29 3b 20 63 75 72 72 73 6c  ots[0])); currsl
1f380 6f 74 2b 2b 29 20 7b 0a 09 09 09 09 69 66 20 28  ot++) {.....if (
1f390 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72  cackey_slots[cur
1f3a0 72 73 6c 6f 74 5d 2e 69 6e 74 65 72 6e 61 6c 29  rslot].internal)
1f3b0 20 7b 0a 09 09 09 09 09 63 6f 6e 74 69 6e 75 65   {......continue
1f3c0 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69 66 20  ;.....}......if 
1f3d0 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75  (cackey_slots[cu
1f3e0 72 72 73 6c 6f 74 5d 2e 70 63 73 63 5f 72 65 61  rrslot].pcsc_rea
1f3f0 64 65 72 29 20 7b 0a 09 09 09 09 09 66 72 65 65  der) {......free
1f400 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75  (cackey_slots[cu
1f410 72 72 73 6c 6f 74 5d 2e 70 63 73 63 5f 72 65 61  rrslot].pcsc_rea
1f420 64 65 72 29 3b 0a 0a 09 09 09 09 09 63 61 63 6b  der);.......cack
1f430 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f  ey_slots[currslo
1f440 74 5d 2e 70 63 73 63 5f 72 65 61 64 65 72 20 3d  t].pcsc_reader =
1f450 20 4e 55 4c 4c 3b 0a 09 09 09 09 7d 0a 0a 09 09   NULL;.....}....
1f460 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f  ..if (cackey_slo
1f470 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 6c 61 62  ts[currslot].lab
1f480 65 6c 29 20 7b 0a 09 09 09 09 09 66 72 65 65 28  el) {......free(
1f490 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72  cackey_slots[cur
1f4a0 72 73 6c 6f 74 5d 2e 6c 61 62 65 6c 29 3b 0a 0a  rslot].label);..
1f4b0 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  .....cackey_slot
1f4c0 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 6c 61 62 65  s[currslot].labe
1f4d0 6c 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 7d 0a  l = NULL;.....}.
1f4e0 0a 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  .....cackey_slot
1f4f0 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 61 63 74 69  s[currslot].acti
1f500 76 65 20 3d 20 30 3b 0a 09 09 09 7d 0a 09 09 7d  ve = 0;....}...}
1f510 20 65 6c 73 65 20 7b 0a 09 09 09 0a 09 09 7d 0a   else {.......}.
1f520 09 7d 0a 0a 09 2f 2a 20 44 65 74 65 72 6d 69 6e  .}.../* Determin
1f530 65 20 6c 69 73 74 20 6f 66 20 72 65 61 64 65 72  e list of reader
1f540 73 20 2a 2f 0a 09 70 63 73 63 5f 63 6f 6e 6e 65  s */..pcsc_conne
1f550 63 74 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f  ct_ret = cackey_
1f560 70 63 73 63 5f 63 6f 6e 6e 65 63 74 28 29 3b 0a  pcsc_connect();.
1f570 2f 2a 20 58 58 58 3a 20 43 41 4e 20 48 41 4e 47  /* XXX: CAN HANG
1f580 20 48 45 52 45 20 21 20 2a 2f 0a 09 69 66 20 28   HERE ! */..if (
1f590 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74  pcsc_connect_ret
1f5a0 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f   != CACKEY_PCSC_
1f5b0 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59  S_OK) {...CACKEY
1f5c0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
1f5d0 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 50 43 2f  onnection to PC/
1f5e0 53 43 20 66 61 69 6c 65 64 2c 20 61 73 73 75 6d  SC failed, assum
1f5f0 69 6e 67 20 6e 6f 20 73 6c 6f 74 73 22 29 3b 0a  ing no slots");.
1f600 0a 09 09 73 6c 6f 74 5f 63 6f 75 6e 74 20 3d 20  ...slot_count = 
1f610 30 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 70  0;..} else {...p
1f620 63 73 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e 20  csc_readers_len 
1f630 3d 20 30 3b 0a 0a 09 09 73 63 61 72 64 5f 6c 69  = 0;....scard_li
1f640 73 74 72 65 61 64 65 72 73 5f 72 65 74 20 3d 20  streaders_ret = 
1f650 53 43 61 72 64 4c 69 73 74 52 65 61 64 65 72 73  SCardListReaders
1f660 28 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61  (*cackey_pcsc_ha
1f670 6e 64 6c 65 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c  ndle, NULL, NULL
1f680 2c 20 26 70 63 73 63 5f 72 65 61 64 65 72 73 5f  , &pcsc_readers_
1f690 6c 65 6e 29 3b 0a 0a 09 09 69 66 20 28 73 63 61  len);....if (sca
1f6a0 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72  rd_listreaders_r
1f6b0 65 74 20 3d 3d 20 53 43 41 52 44 5f 46 5f 43 4f  et == SCARD_F_CO
1f6c0 4d 4d 5f 45 52 52 4f 52 29 20 7b 0a 09 09 09 43  MM_ERROR) {....C
1f6d0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1f6e0 54 46 28 22 45 72 72 6f 72 2e 20 53 43 61 72 64  TF("Error. SCard
1f6f0 4c 69 73 74 52 65 61 64 65 72 73 28 29 20 72 65  ListReaders() re
1f700 74 75 72 6e 65 64 20 53 43 41 52 44 5f 46 5f 43  turned SCARD_F_C
1f710 4f 4d 4d 5f 45 52 52 4f 52 2c 20 61 73 73 75 6d  OMM_ERROR, assum
1f720 69 6e 67 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 74  ing Connection t
1f730 6f 20 50 43 2f 53 43 20 77 65 6e 74 20 61 77 61  o PC/SC went awa
1f740 79 2e 20 52 65 63 6f 6e 6e 65 63 74 69 6e 67 2e  y. Reconnecting.
1f750 22 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 70  ");.....cackey_p
1f760 63 73 63 5f 64 69 73 63 6f 6e 6e 65 63 74 28 29  csc_disconnect()
1f770 3b 0a 09 09 09 63 61 63 6b 65 79 5f 70 63 73 63  ;....cackey_pcsc
1f780 5f 63 6f 6e 6e 65 63 74 28 29 3b 0a 0a 09 09 09  _connect();.....
1f790 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1f7a0 4e 54 46 28 22 54 72 79 69 6e 67 20 53 43 61 72  NTF("Trying SCar
1f7b0 64 4c 69 73 74 52 65 61 64 65 72 73 28 29 20 61  dListReaders() a
1f7c0 67 61 69 6e 22 29 3b 0a 09 09 09 73 63 61 72 64  gain");....scard
1f7d0 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65 74  _listreaders_ret
1f7e0 20 3d 20 53 43 61 72 64 4c 69 73 74 52 65 61 64   = SCardListRead
1f7f0 65 72 73 28 2a 63 61 63 6b 65 79 5f 70 63 73 63  ers(*cackey_pcsc
1f800 5f 68 61 6e 64 6c 65 2c 20 4e 55 4c 4c 2c 20 4e  _handle, NULL, N
1f810 55 4c 4c 2c 20 26 70 63 73 63 5f 72 65 61 64 65  ULL, &pcsc_reade
1f820 72 73 5f 6c 65 6e 29 3b 0a 09 09 7d 0a 0a 09 09  rs_len);...}....
1f830 69 66 20 28 73 63 61 72 64 5f 6c 69 73 74 72 65  if (scard_listre
1f840 61 64 65 72 73 5f 72 65 74 20 3d 3d 20 53 43 41  aders_ret == SCA
1f850 52 44 5f 53 5f 53 55 43 43 45 53 53 20 26 26 20  RD_S_SUCCESS && 
1f860 70 63 73 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e  pcsc_readers_len
1f870 20 21 3d 20 30 29 20 7b 0a 09 09 09 70 63 73 63   != 0) {....pcsc
1f880 5f 72 65 61 64 65 72 73 20 3d 20 6d 61 6c 6c 6f  _readers = mallo
1f890 63 28 70 63 73 63 5f 72 65 61 64 65 72 73 5f 6c  c(pcsc_readers_l
1f8a0 65 6e 29 3b 0a 09 09 09 70 63 73 63 5f 72 65 61  en);....pcsc_rea
1f8b0 64 65 72 73 5f 73 20 3d 20 70 63 73 63 5f 72 65  ders_s = pcsc_re
1f8c0 61 64 65 72 73 3b 0a 0a 09 09 09 73 63 61 72 64  aders;.....scard
1f8d0 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65 74  _listreaders_ret
1f8e0 20 3d 20 53 43 61 72 64 4c 69 73 74 52 65 61 64   = SCardListRead
1f8f0 65 72 73 28 2a 63 61 63 6b 65 79 5f 70 63 73 63  ers(*cackey_pcsc
1f900 5f 68 61 6e 64 6c 65 2c 20 4e 55 4c 4c 2c 20 70  _handle, NULL, p
1f910 63 73 63 5f 72 65 61 64 65 72 73 2c 20 26 70 63  csc_readers, &pc
1f920 73 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e 29 3b  sc_readers_len);
1f930 0a 09 09 09 69 66 20 28 73 63 61 72 64 5f 6c 69  ....if (scard_li
1f940 73 74 72 65 61 64 65 72 73 5f 72 65 74 20 3d 3d  streaders_ret ==
1f950 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53   SCARD_S_SUCCESS
1f960 29 20 7b 0a 09 09 09 09 70 63 73 63 5f 72 65 61  ) {.....pcsc_rea
1f970 64 65 72 73 5f 65 20 3d 20 70 63 73 63 5f 72 65  ders_e = pcsc_re
1f980 61 64 65 72 73 20 2b 20 70 63 73 63 5f 72 65 61  aders + pcsc_rea
1f990 64 65 72 73 5f 6c 65 6e 3b 0a 0a 09 09 09 09 2f  ders_len;....../
1f9a0 2a 20 53 74 61 72 74 20 77 69 74 68 20 53 6c 6f  * Start with Slo
1f9b0 74 20 49 44 20 31 2c 20 74 6f 20 61 76 6f 69 64  t ID 1, to avoid
1f9c0 20 61 20 62 75 67 20 69 6e 20 47 44 4d 20 6f 6e   a bug in GDM on
1f9d0 20 52 48 45 4c 20 2a 2f 0a 09 09 09 09 2f 2a 20   RHEL */...../* 
1f9e0 42 75 67 20 35 39 34 39 31 31 3a 20 68 74 74 70  Bug 594911: http
1f9f0 73 3a 2f 2f 62 75 67 7a 69 6c 6c 61 2e 72 65 64  s://bugzilla.red
1fa00 68 61 74 2e 63 6f 6d 2f 73 68 6f 77 5f 62 75 67  hat.com/show_bug
1fa10 2e 63 67 69 3f 69 64 3d 35 39 34 39 31 31 20 2a  .cgi?id=594911 *
1fa20 2f 0a 09 09 09 09 63 75 72 72 73 6c 6f 74 20 3d  /.....currslot =
1fa30 20 31 3b 0a 09 09 09 09 73 6c 6f 74 5f 63 6f 75   1;.....slot_cou
1fa40 6e 74 20 3d 20 30 3b 0a 09 09 09 09 77 68 69 6c  nt = 0;.....whil
1fa50 65 20 28 70 63 73 63 5f 72 65 61 64 65 72 73 20  e (pcsc_readers 
1fa60 3c 20 70 63 73 63 5f 72 65 61 64 65 72 73 5f 65  < pcsc_readers_e
1fa70 29 20 7b 0a 09 09 09 09 09 2f 2a 20 46 69 6e 64  ) {....../* Find
1fa80 20 6e 65 78 74 20 61 76 61 69 6c 61 62 6c 65 20   next available 
1fa90 73 6c 6f 74 20 2a 2f 0a 09 09 09 09 09 66 6f 72  slot */......for
1faa0 20 28 3b 20 63 75 72 72 73 6c 6f 74 20 3c 20 28   (; currslot < (
1fab0 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
1fac0 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ots) / sizeof(ca
1fad0 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b  ckey_slots[0]));
1fae0 20 63 75 72 72 73 6c 6f 74 2b 2b 29 20 7b 0a 09   currslot++) {..
1faf0 09 09 09 09 09 69 66 20 28 21 63 61 63 6b 65 79  .....if (!cackey
1fb00 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d  _slots[currslot]
1fb10 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 09 09 09  .active) {......
1fb20 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 09 7d  ..break;.......}
1fb30 0a 09 09 09 09 09 7d 0a 0a 09 09 09 09 09 63 75  ......}.......cu
1fb40 72 72 5f 72 65 61 64 65 72 5f 6c 65 6e 20 3d 20  rr_reader_len = 
1fb50 73 74 72 6c 65 6e 28 70 63 73 63 5f 72 65 61 64  strlen(pcsc_read
1fb60 65 72 73 29 3b 0a 0a 09 09 09 09 09 69 66 20 28  ers);.......if (
1fb70 28 70 63 73 63 5f 72 65 61 64 65 72 73 20 2b 20  (pcsc_readers + 
1fb80 63 75 72 72 5f 72 65 61 64 65 72 5f 6c 65 6e 29  curr_reader_len)
1fb90 20 3e 20 70 63 73 63 5f 72 65 61 64 65 72 73 5f   > pcsc_readers_
1fba0 65 29 20 7b 0a 09 09 09 09 09 09 62 72 65 61 6b  e) {.......break
1fbb0 3b 0a 09 09 09 09 09 7d 0a 0a 09 09 09 09 09 69  ;......}.......i
1fbc0 66 20 28 63 75 72 72 5f 72 65 61 64 65 72 5f 6c  f (curr_reader_l
1fbd0 65 6e 20 3d 3d 20 30 29 20 7b 0a 09 09 09 09 09  en == 0) {......
1fbe0 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 7d 0a 0a  .break;......}..
1fbf0 09 09 09 09 09 69 66 20 28 63 75 72 72 73 6c 6f  .....if (currslo
1fc00 74 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63  t >= (sizeof(cac
1fc10 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a  key_slots) / siz
1fc20 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
1fc30 5b 30 5d 29 29 29 20 7b 0a 09 09 09 09 09 09 43  [0]))) {.......C
1fc40 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1fc50 54 46 28 22 46 6f 75 6e 64 20 6d 6f 72 65 20 72  TF("Found more r
1fc60 65 61 64 65 72 73 20 74 68 61 6e 20 73 6c 6f 74  eaders than slot
1fc70 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 21  s are available!
1fc80 22 29 3b 0a 0a 09 09 09 09 09 09 62 72 65 61 6b  ");........break
1fc90 3b 0a 09 09 09 09 09 7d 0a 0a 09 09 09 09 09 43  ;......}.......C
1fca0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1fcb0 54 46 28 22 46 6f 75 6e 64 20 72 65 61 64 65 72  TF("Found reader
1fcc0 3a 20 25 73 20 28 63 75 72 72 73 6c 6f 74 20 3d  : %s (currslot =
1fcd0 20 25 6c 75 29 22 2c 20 70 63 73 63 5f 72 65 61   %lu)", pcsc_rea
1fce0 64 65 72 73 2c 20 28 75 6e 73 69 67 6e 65 64 20  ders, (unsigned 
1fcf0 6c 6f 6e 67 29 20 63 75 72 72 73 6c 6f 74 29 3b  long) currslot);
1fd00 0a 0a 09 09 09 09 09 69 66 20 28 63 61 63 6b 65  .......if (cacke
1fd10 79 5f 72 65 61 64 65 72 73 5f 69 6e 63 6c 75 64  y_readers_includ
1fd20 65 5f 6f 6e 6c 79 20 21 3d 20 4e 55 4c 4c 29 20  e_only != NULL) 
1fd30 7b 0a 09 09 09 09 09 09 43 41 43 4b 45 59 5f 44  {.......CACKEY_D
1fd40 45 42 55 47 5f 50 52 49 4e 54 46 28 22 41 73 6b  EBUG_PRINTF("Ask
1fd50 65 64 20 74 6f 20 69 6e 63 6c 75 64 65 20 6f 6e  ed to include on
1fd60 6c 79 20 72 65 61 64 65 72 73 20 6d 61 74 63 68  ly readers match
1fd70 69 6e 67 3a 20 25 73 22 2c 20 63 61 63 6b 65 79  ing: %s", cackey
1fd80 5f 72 65 61 64 65 72 73 5f 69 6e 63 6c 75 64 65  _readers_include
1fd90 5f 6f 6e 6c 79 29 3b 0a 0a 09 09 09 09 09 09 69  _only);........i
1fda0 6e 63 6c 75 64 65 5f 72 65 61 64 65 72 20 3d 20  nclude_reader = 
1fdb0 30 3b 0a 09 09 09 09 09 09 72 65 61 64 65 72 5f  0;.......reader_
1fdc0 63 68 65 63 6b 5f 70 61 74 74 65 72 6e 20 3d 20  check_pattern = 
1fdd0 63 61 63 6b 65 79 5f 72 65 61 64 65 72 73 5f 69  cackey_readers_i
1fde0 6e 63 6c 75 64 65 5f 6f 6e 6c 79 3b 0a 09 09 09  nclude_only;....
1fdf0 09 09 7d 20 65 6c 73 65 20 69 66 20 28 63 61 63  ..} else if (cac
1fe00 6b 65 79 5f 72 65 61 64 65 72 73 5f 65 78 63 6c  key_readers_excl
1fe10 75 64 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ude != NULL) {..
1fe20 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
1fe30 47 5f 50 52 49 4e 54 46 28 22 41 73 6b 65 64 20  G_PRINTF("Asked 
1fe40 74 6f 20 65 78 63 6c 75 64 65 20 72 65 61 64 65  to exclude reade
1fe50 72 73 20 6d 61 74 63 68 69 6e 67 3a 20 25 73 22  rs matching: %s"
1fe60 2c 20 63 61 63 6b 65 79 5f 72 65 61 64 65 72 73  , cackey_readers
1fe70 5f 65 78 63 6c 75 64 65 29 3b 0a 0a 09 09 09 09  _exclude);......
1fe80 09 09 69 6e 63 6c 75 64 65 5f 72 65 61 64 65 72  ..include_reader
1fe90 20 3d 20 31 3b 0a 09 09 09 09 09 09 72 65 61 64   = 1;.......read
1fea0 65 72 5f 63 68 65 63 6b 5f 70 61 74 74 65 72 6e  er_check_pattern
1feb0 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 65 72   = cackey_reader
1fec0 73 5f 65 78 63 6c 75 64 65 3b 0a 09 09 09 09 09  s_exclude;......
1fed0 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09 69  } else {.......i
1fee0 6e 63 6c 75 64 65 5f 72 65 61 64 65 72 20 3d 20  nclude_reader = 
1fef0 31 3b 0a 09 09 09 09 09 09 72 65 61 64 65 72 5f  1;.......reader_
1ff00 63 68 65 63 6b 5f 70 61 74 74 65 72 6e 20 3d 20  check_pattern = 
1ff10 4e 55 4c 4c 3b 0a 09 09 09 09 09 7d 0a 0a 09 09  NULL;......}....
1ff20 09 09 09 69 66 20 28 72 65 61 64 65 72 5f 63 68  ...if (reader_ch
1ff30 65 63 6b 5f 70 61 74 74 65 72 6e 20 21 3d 20 4e  eck_pattern != N
1ff40 55 4c 4c 29 20 7b 0a 09 09 09 09 09 09 69 66 20  ULL) {.......if 
1ff50 28 73 74 72 73 74 72 28 70 63 73 63 5f 72 65 61  (strstr(pcsc_rea
1ff60 64 65 72 73 2c 20 72 65 61 64 65 72 5f 63 68 65  ders, reader_che
1ff70 63 6b 5f 70 61 74 74 65 72 6e 29 20 21 3d 20 4e  ck_pattern) != N
1ff80 55 4c 4c 29 20 7b 0a 09 09 09 09 09 09 09 43 41  ULL) {........CA
1ff90 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1ffa0 46 28 22 54 68 69 73 20 72 65 61 64 65 72 20 6d  F("This reader m
1ffb0 61 74 63 68 65 64 20 74 68 65 20 70 61 74 74 65  atched the patte
1ffc0 72 6e 2e 22 29 3b 0a 09 09 09 09 09 09 0a 09 09  rn.");..........
1ffd0 09 09 09 09 09 69 6e 63 6c 75 64 65 5f 72 65 61  .....include_rea
1ffe0 64 65 72 20 3d 20 21 69 6e 63 6c 75 64 65 5f 72  der = !include_r
1fff0 65 61 64 65 72 3b 0a 09 09 09 09 09 09 7d 0a 09  eader;.......}..
20000 09 09 09 09 7d 0a 0a 09 09 09 09 09 69 66 20 28  ....}.......if (
20010 69 6e 63 6c 75 64 65 5f 72 65 61 64 65 72 20 21  include_reader !
20020 3d 20 31 29 20 7b 0a 09 09 09 09 09 09 43 41 43  = 1) {.......CAC
20030 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
20040 28 22 53 6b 69 70 70 69 6e 67 20 74 68 69 73 20  ("Skipping this 
20050 72 65 61 64 65 72 2e 22 29 3b 0a 0a 09 09 09 09  reader.");......
20060 09 09 70 63 73 63 5f 72 65 61 64 65 72 73 20 2b  ..pcsc_readers +
20070 3d 20 63 75 72 72 5f 72 65 61 64 65 72 5f 6c 65  = curr_reader_le
20080 6e 20 2b 20 31 3b 0a 0a 09 09 09 09 09 09 63 6f  n + 1;........co
20090 6e 74 69 6e 75 65 3b 0a 09 09 09 09 09 7d 0a 0a  ntinue;......}..
200a0 09 09 09 09 09 2f 2a 20 4f 6e 6c 79 20 75 70 64  ...../* Only upd
200b0 61 74 65 20 74 68 65 20 6c 69 73 74 20 6f 66 20  ate the list of 
200c0 73 6c 6f 74 73 20 69 66 20 77 65 20 61 72 65 20  slots if we are 
200d0 61 63 74 75 61 6c 6c 79 20 62 65 69 6e 67 20 61  actually being a
200e0 73 6b 65 64 20 73 75 70 70 6c 79 20 74 68 65 20  sked supply the 
200f0 73 6c 6f 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  slot information
20100 20 2a 2f 0a 09 09 09 09 09 69 66 20 28 70 53 6c   */......if (pSl
20110 6f 74 4c 69 73 74 29 20 7b 0a 09 09 09 09 09 09  otList) {.......
20120 69 66 20 28 73 6c 6f 74 5f 72 65 73 65 74 29 20  if (slot_reset) 
20130 7b 0a 09 09 09 09 09 09 09 63 61 63 6b 65 79 5f  {........cackey_
20140 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e  slots[currslot].
20150 61 63 74 69 76 65 20 3d 20 31 3b 0a 09 09 09 09  active = 1;.....
20160 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ...cackey_slots[
20170 63 75 72 72 73 6c 6f 74 5d 2e 69 6e 74 65 72 6e  currslot].intern
20180 61 6c 20 3d 20 30 3b 0a 09 09 09 09 09 09 09 63  al = 0;........c
20190 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72  ackey_slots[curr
201a0 73 6c 6f 74 5d 2e 70 63 73 63 5f 72 65 61 64 65  slot].pcsc_reade
201b0 72 20 3d 20 73 74 72 64 75 70 28 70 63 73 63 5f  r = strdup(pcsc_
201c0 72 65 61 64 65 72 73 29 3b 0a 09 09 09 09 09 09  readers);.......
201d0 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75  .cackey_slots[cu
201e0 72 72 73 6c 6f 74 5d 2e 70 63 73 63 5f 63 61 72  rrslot].pcsc_car
201f0 64 5f 63 6f 6e 6e 65 63 74 65 64 20 3d 20 30 3b  d_connected = 0;
20200 0a 09 09 09 09 09 09 09 63 61 63 6b 65 79 5f 73  ........cackey_s
20210 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 74  lots[currslot].t
20220 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68  ransaction_depth
20230 20 3d 20 30 3b 0a 09 09 09 09 09 09 09 63 61 63   = 0;........cac
20240 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c  key_slots[currsl
20250 6f 74 5d 2e 74 72 61 6e 73 61 63 74 69 6f 6e 5f  ot].transaction_
20260 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b 20 3d 20 30  need_hw_lock = 0
20270 3b 0a 09 09 09 09 09 09 09 69 66 20 28 63 61 63  ;........if (cac
20280 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20  key_pin_command 
20290 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 09  == NULL) {......
202a0 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ...cackey_slots[
202b0 63 75 72 72 73 6c 6f 74 5d 2e 74 6f 6b 65 6e 5f  currslot].token_
202c0 66 6c 61 67 73 20 3d 20 43 4b 46 5f 4c 4f 47 49  flags = CKF_LOGI
202d0 4e 5f 52 45 51 55 49 52 45 44 3b 0a 09 09 09 09  N_REQUIRED;.....
202e0 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09  ...} else {.....
202f0 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ....cackey_slots
20300 5b 63 75 72 72 73 6c 6f 74 5d 2e 74 6f 6b 65 6e  [currslot].token
20310 5f 66 6c 61 67 73 20 3d 20 30 3b 0a 09 09 09 09  _flags = 0;.....
20320 09 09 09 7d 0a 09 09 09 09 09 09 09 63 61 63 6b  ...}........cack
20330 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f  ey_slots[currslo
20340 74 5d 2e 6c 61 62 65 6c 20 3d 20 4e 55 4c 4c 3b  t].label = NULL;
20350 0a 0a 09 09 09 09 09 09 09 63 61 63 6b 65 79 5f  .........cackey_
20360 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74 28  mark_slot_reset(
20370 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75  &cackey_slots[cu
20380 72 72 73 6c 6f 74 5d 29 3b 0a 09 09 09 09 09 09  rrslot]);.......
20390 7d 0a 09 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a  }......} else {.
203a0 09 09 09 09 09 09 69 66 20 28 21 63 61 63 6b 65  ......if (!cacke
203b0 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74  y_slots[currslot
203c0 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 09 09  ].active) {.....
203d0 09 09 09 2f 2a 20 41 72 74 69 66 69 63 69 61 6c  .../* Artificial
203e0 6c 79 20 69 6e 63 72 65 61 73 65 20 74 68 65 20  ly increase the 
203f0 6e 75 6d 62 65 72 20 6f 66 20 61 63 74 69 76 65  number of active
20400 20 73 6c 6f 74 73 20 62 79 20 77 68 61 74 20 77   slots by what w
20410 69 6c 6c 20 62 65 63 6f 6d 65 20 61 63 74 69 76  ill become activ
20420 65 20 2a 2f 0a 09 09 09 09 09 09 09 43 41 43 4b  e */........CACK
20430 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
20440 22 46 6f 75 6e 64 20 69 6e 2d 61 63 74 69 76 65  "Found in-active
20450 20 73 6c 6f 74 20 25 6c 75 2c 20 62 75 74 20 69   slot %lu, but i
20460 74 20 77 69 6c 6c 20 62 65 20 61 63 74 69 76 65  t will be active
20470 20 61 66 74 65 72 20 61 20 72 65 73 65 74 20 2d   after a reset -
20480 2d 20 6d 61 72 6b 69 6e 67 20 61 73 20 61 63 74  - marking as act
20490 69 76 65 20 66 6f 72 20 61 63 63 6f 75 6e 74 69  ive for accounti
204a0 6e 67 20 70 75 72 70 6f 73 65 73 22 2c 20 28 75  ng purposes", (u
204b0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75  nsigned long) cu
204c0 72 72 73 6c 6f 74 29 3b 0a 0a 09 09 09 09 09 09  rrslot);........
204d0 09 73 6c 6f 74 5f 63 6f 75 6e 74 2b 2b 3b 0a 09  .slot_count++;..
204e0 09 09 09 09 09 7d 0a 09 09 09 09 09 7d 0a 09 09  .....}......}...
204f0 09 09 09 63 75 72 72 73 6c 6f 74 2b 2b 3b 0a 0a  ...currslot++;..
20500 09 09 09 09 09 70 63 73 63 5f 72 65 61 64 65 72  .....pcsc_reader
20510 73 20 2b 3d 20 63 75 72 72 5f 72 65 61 64 65 72  s += curr_reader
20520 5f 6c 65 6e 20 2b 20 31 3b 0a 09 09 09 09 7d 0a  _len + 1;.....}.
20530 0a 09 09 09 09 66 6f 72 20 28 63 75 72 72 73 6c  .....for (currsl
20540 6f 74 20 3d 20 30 3b 20 63 75 72 72 73 6c 6f 74  ot = 0; currslot
20550 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65   < (sizeof(cacke
20560 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f  y_slots) / sizeo
20570 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30  f(cackey_slots[0
20580 5d 29 29 3b 20 63 75 72 72 73 6c 6f 74 2b 2b 29  ])); currslot++)
20590 20 7b 0a 09 09 09 09 09 69 66 20 28 63 61 63 6b   {......if (cack
205a0 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f  ey_slots[currslo
205b0 74 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 09  t].active) {....
205c0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
205d0 50 52 49 4e 54 46 28 22 46 6f 75 6e 64 20 61 63  PRINTF("Found ac
205e0 74 69 76 65 20 73 6c 6f 74 20 25 6c 75 2c 20 72  tive slot %lu, r
205f0 65 61 64 65 72 20 3d 20 25 73 22 2c 20 28 75 6e  eader = %s", (un
20600 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72  signed long) cur
20610 72 73 6c 6f 74 2c 20 63 61 63 6b 65 79 5f 73 6c  rslot, cackey_sl
20620 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 70 63  ots[currslot].pc
20630 73 63 5f 72 65 61 64 65 72 29 3b 0a 0a 09 09 09  sc_reader);.....
20640 09 09 09 73 6c 6f 74 5f 63 6f 75 6e 74 2b 2b 3b  ...slot_count++;
20650 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 09 09  ......}.....}...
20660 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 43 41  .} else {.....CA
20670 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
20680 46 28 22 53 65 63 6f 6e 64 20 63 61 6c 6c 20 74  F("Second call t
20690 6f 20 53 43 61 72 64 4c 69 73 74 52 65 61 64 65  o SCardListReade
206a0 72 73 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72  rs failed, retur
206b0 6e 20 25 73 2f 25 6c 69 22 2c 20 43 41 43 4b 45  n %s/%li", CACKE
206c0 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41  Y_DEBUG_FUNC_SCA
206d0 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61  RDERR_TO_STR(sca
206e0 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72  rd_listreaders_r
206f0 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72  et), (long) scar
20700 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65  d_listreaders_re
20710 74 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 66 72 65  t);....}.....fre
20720 65 28 70 63 73 63 5f 72 65 61 64 65 72 73 5f 73  e(pcsc_readers_s
20730 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  );...} else {...
20740 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
20750 49 4e 54 46 28 22 46 69 72 73 74 20 63 61 6c 6c  INTF("First call
20760 20 74 6f 20 53 43 61 72 64 4c 69 73 74 52 65 61   to SCardListRea
20770 64 65 72 73 20 66 61 69 6c 65 64 2c 20 72 65 74  ders failed, ret
20780 75 72 6e 20 25 73 2f 25 6c 69 22 2c 20 43 41 43  urn %s/%li", CAC
20790 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53  KEY_DEBUG_FUNC_S
207a0 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73  CARDERR_TO_STR(s
207b0 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73  card_listreaders
207c0 5f 72 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63  _ret), (long) sc
207d0 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f  ard_listreaders_
207e0 72 65 74 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 6d  ret);...}..}...m
207f0 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
20800 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
20810 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
20820 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
20830 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
20840 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
20850 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f  TF("Error.  Unlo
20860 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
20870 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
20880 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
20890 7d 0a 0a 09 69 66 20 28 70 53 6c 6f 74 4c 69 73  }...if (pSlotLis
208a0 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 2a  t == NULL) {...*
208b0 70 75 6c 43 6f 75 6e 74 20 3d 20 73 6c 6f 74 5f  pulCount = slot_
208c0 63 6f 75 6e 74 3b 0a 0a 09 09 43 41 43 4b 45 59  count;....CACKEY
208d0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
208e0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20  eturning CKR_OK 
208f0 28 25 69 29 2e 20 20 46 6f 75 6e 64 20 25 6c 75  (%i).  Found %lu
20900 20 72 65 61 64 65 72 73 2c 20 62 75 74 20 6e 6f   readers, but no
20910 74 20 73 74 6f 72 69 6e 67 20 49 44 73 20 28 70  t storing IDs (p
20920 53 6c 6f 74 4c 69 73 74 20 3d 3d 20 4e 55 4c 4c  SlotList == NULL
20930 29 22 2c 20 43 4b 52 5f 4f 4b 2c 20 28 75 6e 73  )", CKR_OK, (uns
20940 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 6c 6f 74  igned long) slot
20950 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09 72 65 74 75  _count);....retu
20960 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a  rn(CKR_OK);..}..
20970 09 63 6f 75 6e 74 20 3d 20 2a 70 75 6c 43 6f 75  .count = *pulCou
20980 6e 74 3b 0a 09 69 66 20 28 63 6f 75 6e 74 20 3c  nt;..if (count <
20990 20 73 6c 6f 74 5f 63 6f 75 6e 74 29 20 7b 0a 09   slot_count) {..
209a0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
209b0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 55 73 65  INTF("Error. Use
209c0 72 20 61 6c 6c 6f 63 61 74 65 64 20 25 6c 75 20  r allocated %lu 
209d0 65 6e 74 72 69 65 73 2c 20 62 75 74 20 77 65 20  entries, but we 
209e0 68 61 76 65 20 25 6c 75 20 65 6e 74 72 69 65 73  have %lu entries
209f0 2e 22 2c 20 63 6f 75 6e 74 2c 20 73 6c 6f 74 5f  .", count, slot_
20a00 63 6f 75 6e 74 29 3b 0a 0a 09 09 43 41 43 4b 45  count);....CACKE
20a10 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
20a20 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 42 55  Returning CKR_BU
20a30 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 22 29  FFER_TOO_SMALL")
20a40 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
20a50 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c  BUFFER_TOO_SMALL
20a60 29 3b 09 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  );...}...mutex_r
20a70 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
20a80 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79  utex_lock(cackey
20a90 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
20aa0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
20ab0 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
20ac0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
20ad0 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c  r.  Locking fail
20ae0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
20af0 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
20b00 4f 52 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 5f 69  OR);..}...slot_i
20b10 64 78 20 3d 20 30 3b 0a 09 66 6f 72 20 28 63 75  dx = 0;..for (cu
20b20 72 72 73 6c 6f 74 20 3d 20 30 3b 20 28 63 75 72  rrslot = 0; (cur
20b30 72 73 6c 6f 74 20 3c 20 28 73 69 7a 65 6f 66 28  rslot < (sizeof(
20b40 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20  cackey_slots) / 
20b50 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
20b60 6f 74 73 5b 30 5d 29 29 29 3b 20 63 75 72 72 73  ots[0]))); currs
20b70 6c 6f 74 2b 2b 29 20 7b 0a 09 09 69 66 20 28 21  lot++) {...if (!
20b80 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72  cackey_slots[cur
20b90 72 73 6c 6f 74 5d 2e 61 63 74 69 76 65 29 20 7b  rslot].active) {
20ba0 0a 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09  ....continue;...
20bb0 7d 0a 0a 09 09 69 66 20 28 73 6c 6f 74 5f 69 64  }....if (slot_id
20bc0 78 20 3e 3d 20 63 6f 75 6e 74 29 20 7b 0a 09 09  x >= count) {...
20bd0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
20be0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 55 73 65  INTF("Error. Use
20bf0 72 20 61 6c 6c 6f 63 61 74 65 64 20 25 6c 75 20  r allocated %lu 
20c00 65 6e 74 72 69 65 73 2c 20 62 75 74 20 77 65 20  entries, but we 
20c10 6a 75 73 74 20 74 72 69 65 64 20 74 6f 20 77 72  just tried to wr
20c20 69 74 65 20 74 6f 20 74 68 65 20 25 6c 75 20 69  ite to the %lu i
20c30 6e 64 65 78 20 2d 2d 20 69 67 6e 6f 72 69 6e 67  ndex -- ignoring
20c40 22 2c 20 63 6f 75 6e 74 2c 20 73 6c 6f 74 5f 69  ", count, slot_i
20c50 64 78 29 3b 0a 0a 09 09 09 63 6f 6e 74 69 6e 75  dx);.....continu
20c60 65 3b 0a 09 09 7d 0a 0a 09 09 70 53 6c 6f 74 4c  e;...}....pSlotL
20c70 69 73 74 5b 73 6c 6f 74 5f 69 64 78 5d 20 3d 20  ist[slot_idx] = 
20c80 63 75 72 72 73 6c 6f 74 3b 0a 09 09 73 6c 6f 74  currslot;...slot
20c90 5f 69 64 78 2b 2b 3b 0a 09 7d 0a 0a 09 6d 75 74  _idx++;..}...mut
20ca0 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
20cb0 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
20cc0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
20cd0 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
20ce0 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
20cf0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
20d00 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b  ("Error.  Unlock
20d10 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
20d20 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
20d30 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
20d40 0a 09 2a 70 75 6c 43 6f 75 6e 74 20 3d 20 73 6c  ..*pulCount = sl
20d50 6f 74 5f 63 6f 75 6e 74 3b 0a 0a 09 43 41 43 4b  ot_count;...CACK
20d60 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
20d70 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
20d80 4b 20 28 25 69 29 2e 20 20 46 6f 75 6e 64 20 25  K (%i).  Found %
20d90 6c 75 20 72 65 61 64 65 72 73 2e 22 2c 20 43 4b  lu readers.", CK
20da0 52 5f 4f 4b 2c 20 28 75 6e 73 69 67 6e 65 64 20  R_OK, (unsigned 
20db0 6c 6f 6e 67 29 20 73 6c 6f 74 5f 63 6f 75 6e 74  long) slot_count
20dc0 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
20dd0 4f 4b 29 3b 0a 0a 09 74 6f 6b 65 6e 50 72 65 73  OK);...tokenPres
20de0 65 6e 74 20 3d 20 74 6f 6b 65 6e 50 72 65 73 65  ent = tokenPrese
20df0 6e 74 3b 20 2f 2a 20 53 75 70 72 65 73 73 20 75  nt; /* Supress u
20e00 6e 75 73 65 64 20 76 61 72 69 61 62 6c 65 20 77  nused variable w
20e10 61 72 6e 69 6e 67 20 2a 2f 0a 7d 0a 0a 43 4b 5f  arning */.}..CK_
20e20 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
20e30 43 4b 5f 52 56 2c 20 43 5f 47 65 74 53 6c 6f 74  CK_RV, C_GetSlot
20e40 49 6e 66 6f 29 28 43 4b 5f 53 4c 4f 54 5f 49 44  Info)(CK_SLOT_ID
20e50 20 73 6c 6f 74 49 44 2c 20 43 4b 5f 53 4c 4f 54   slotID, CK_SLOT
20e60 5f 49 4e 46 4f 5f 50 54 52 20 70 49 6e 66 6f 29  _INFO_PTR pInfo)
20e70 20 7b 0a 09 73 74 61 74 69 63 20 43 4b 5f 55 54   {..static CK_UT
20e80 46 38 43 48 41 52 20 73 6c 6f 74 44 65 73 63 72  F8CHAR slotDescr
20e90 69 70 74 69 6f 6e 5b 5d 20 3d 20 22 43 41 43 4b  iption[] = "CACK
20ea0 65 79 20 53 6c 6f 74 22 3b 0a 09 69 6e 74 20 6d  ey Slot";..int m
20eb0 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09 69 6e  utex_retval;..in
20ec0 74 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 3b  t bytes_to_copy;
20ed0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
20ee0 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
20ef0 29 3b 0a 0a 09 69 66 20 28 70 49 6e 66 6f 20 3d  );...if (pInfo =
20f00 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
20f10 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
20f20 22 45 72 72 6f 72 2e 20 70 49 6e 66 6f 20 69 73  "Error. pInfo is
20f30 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74   NULL.");....ret
20f40 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54  urn(CKR_ARGUMENT
20f50 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  S_BAD);..}...if 
20f60 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
20f70 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
20f80 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
20f90 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
20fa0 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
20fb0 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
20fc0 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
20fd0 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f  D);..}...if (slo
20fe0 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49  tID < 0 || slotI
20ff0 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63  D >= (sizeof(cac
21000 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a  key_slots) / siz
21010 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
21020 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45  [0]))) {...CACKE
21030 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
21040 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73  Error. Invalid s
21050 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25  lot requested (%
21060 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20  lu), outside of 
21070 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c  valid range", sl
21080 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e  otID);....return
21090 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56  (CKR_SLOT_ID_INV
210a0 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65  ALID);..}...mute
210b0 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
210c0 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63  y_mutex_lock(cac
210d0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
210e0 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
210f0 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
21100 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
21110 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66  rror.  Locking f
21120 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
21130 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
21140 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20  ERROR);..}...if 
21150 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c  (cackey_slots[sl
21160 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20  otID].active == 
21170 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
21180 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
21190 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20  r. Invalid slot 
211a0 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c  requested (%lu),
211b0 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e   slot not curren
211c0 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f  tly active", slo
211d0 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f  tID);....cackey_
211e0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
211f0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
21200 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54  .return(CKR_SLOT
21210 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  _ID_INVALID);..}
21220 0a 0a 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20  ...pInfo->flags 
21230 3d 20 43 4b 46 5f 48 57 5f 53 4c 4f 54 3b 0a 0a  = CKF_HW_SLOT;..
21240 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 6c 6f  .if (!cackey_slo
21250 74 73 5b 73 6c 6f 74 49 44 5d 2e 69 6e 74 65 72  ts[slotID].inter
21260 6e 61 6c 29 20 7b 0a 09 09 70 49 6e 66 6f 2d 3e  nal) {...pInfo->
21270 66 6c 61 67 73 20 7c 3d 20 43 4b 46 5f 52 45 4d  flags |= CKF_REM
21280 4f 56 41 42 4c 45 5f 44 45 56 49 43 45 3b 0a 09  OVABLE_DEVICE;..
21290 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 74  }...if (cackey_t
212a0 6f 6b 65 6e 5f 70 72 65 73 65 6e 74 28 26 63 61  oken_present(&ca
212b0 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
212c0 44 5d 29 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43  D]) == CACKEY_PC
212d0 53 43 5f 53 5f 54 4f 4b 45 4e 50 52 45 53 45 4e  SC_S_TOKENPRESEN
212e0 54 29 20 7b 0a 09 09 70 49 6e 66 6f 2d 3e 66 6c  T) {...pInfo->fl
212f0 61 67 73 20 7c 3d 20 43 4b 46 5f 54 4f 4b 45 4e  ags |= CKF_TOKEN
21300 5f 50 52 45 53 45 4e 54 3b 0a 09 7d 0a 0a 09 62  _PRESENT;..}...b
21310 79 74 65 73 5f 74 6f 5f 63 6f 70 79 20 3d 20 73  ytes_to_copy = s
21320 74 72 6c 65 6e 28 63 61 63 6b 65 79 5f 73 6c 6f  trlen(cackey_slo
21330 74 73 5b 73 6c 6f 74 49 44 5d 2e 70 63 73 63 5f  ts[slotID].pcsc_
21340 72 65 61 64 65 72 29 3b 0a 09 69 66 20 28 73 69  reader);..if (si
21350 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75  zeof(pInfo->manu
21360 66 61 63 74 75 72 65 72 49 44 29 20 3c 20 62 79  facturerID) < by
21370 74 65 73 5f 74 6f 5f 63 6f 70 79 29 20 7b 0a 09  tes_to_copy) {..
21380 09 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 20 3d  .bytes_to_copy =
21390 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d   sizeof(pInfo->m
213a0 61 6e 75 66 61 63 74 75 72 65 72 49 44 29 3b 0a  anufacturerID);.
213b0 09 7d 0a 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f  .}..memcpy(pInfo
213c0 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44  ->manufacturerID
213d0 2c 20 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73  , cackey_slots[s
213e0 6c 6f 74 49 44 5d 2e 70 63 73 63 5f 72 65 61 64  lotID].pcsc_read
213f0 65 72 2c 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70  er, bytes_to_cop
21400 79 29 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  y);...mutex_retv
21410 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
21420 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
21430 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
21440 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
21450 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
21460 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
21470 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69  .  Unlocking fai
21480 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
21490 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
214a0 52 4f 52 29 3b 0a 09 7d 0a 0a 09 6d 65 6d 73 65  ROR);..}...memse
214b0 74 28 70 49 6e 66 6f 2d 3e 73 6c 6f 74 44 65 73  t(pInfo->slotDes
214c0 63 72 69 70 74 69 6f 6e 2c 20 27 20 27 2c 20 73  cription, ' ', s
214d0 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 73 6c 6f  izeof(pInfo->slo
214e0 74 44 65 73 63 72 69 70 74 69 6f 6e 29 29 3b 0a  tDescription));.
214f0 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 73  .memcpy(pInfo->s
21500 6c 6f 74 44 65 73 63 72 69 70 74 69 6f 6e 2c 20  lotDescription, 
21510 73 6c 6f 74 44 65 73 63 72 69 70 74 69 6f 6e 2c  slotDescription,
21520 20 73 69 7a 65 6f 66 28 73 6c 6f 74 44 65 73 63   sizeof(slotDesc
21530 72 69 70 74 69 6f 6e 29 20 2d 20 31 29 3b 0a 0a  ription) - 1);..
21540 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 6d  .memset(pInfo->m
21550 61 6e 75 66 61 63 74 75 72 65 72 49 44 2c 20 27  anufacturerID, '
21560 20 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f   ', sizeof(pInfo
21570 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44  ->manufacturerID
21580 29 29 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 68 61 72  ));...pInfo->har
21590 64 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d 61 6a  dwareVersion.maj
215a0 6f 72 20 3d 20 28 63 61 63 6b 65 79 5f 67 65 74  or = (cackey_get
215b0 76 65 72 73 69 6f 6e 28 29 20 3e 3e 20 31 36 29  version() >> 16)
215c0 20 26 20 30 78 66 66 3b 0a 09 70 49 6e 66 6f 2d   & 0xff;..pInfo-
215d0 3e 68 61 72 64 77 61 72 65 56 65 72 73 69 6f 6e  >hardwareVersion
215e0 2e 6d 69 6e 6f 72 20 3d 20 28 63 61 63 6b 65 79  .minor = (cackey
215f0 5f 67 65 74 76 65 72 73 69 6f 6e 28 29 20 3e 3e  _getversion() >>
21600 20 38 29 20 26 20 30 78 66 66 3b 0a 0a 09 70 49   8) & 0xff;...pI
21610 6e 66 6f 2d 3e 66 69 72 6d 77 61 72 65 56 65 72  nfo->firmwareVer
21620 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 30 78 30  sion.major = 0x0
21630 30 3b 0a 09 70 49 6e 66 6f 2d 3e 66 69 72 6d 77  0;..pInfo->firmw
21640 61 72 65 56 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72  areVersion.minor
21650 20 3d 20 30 78 30 30 3b 0a 0a 09 43 41 43 4b 45   = 0x00;...CACKE
21660 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
21670 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b  Returning CKR_OK
21680 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b   (%i)", CKR_OK);
21690 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b  ...return(CKR_OK
216a0 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
216b0 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
216c0 43 5f 47 65 74 54 6f 6b 65 6e 49 6e 66 6f 29 28  C_GetTokenInfo)(
216d0 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49  CK_SLOT_ID slotI
216e0 44 2c 20 43 4b 5f 54 4f 4b 45 4e 5f 49 4e 46 4f  D, CK_TOKEN_INFO
216f0 5f 50 54 52 20 70 49 6e 66 6f 29 20 7b 0a 09 73  _PTR pInfo) {..s
21700 74 61 74 69 63 20 43 4b 5f 55 54 46 38 43 48 41  tatic CK_UTF8CHA
21710 52 20 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44  R manufacturerID
21720 5b 5d 20 3d 20 22 55 2e 53 2e 20 47 6f 76 65 72  [] = "U.S. Gover
21730 6e 6d 65 6e 74 22 3b 0a 09 73 74 61 74 69 63 20  nment";..static 
21740 43 4b 5f 55 54 46 38 43 48 41 52 20 64 65 66 61  CK_UTF8CHAR defa
21750 75 6c 74 4c 61 62 65 6c 5b 5d 20 3d 20 22 55 6e  ultLabel[] = "Un
21760 6b 6e 6f 77 6e 20 54 6f 6b 65 6e 22 3b 0a 09 73  known Token";..s
21770 74 61 74 69 63 20 43 4b 5f 55 54 46 38 43 48 41  tatic CK_UTF8CHA
21780 52 20 6d 6f 64 65 6c 5b 5d 20 3d 20 22 43 41 43  R model[] = "CAC
21790 20 54 6f 6b 65 6e 22 3b 0a 09 73 74 72 75 63 74   Token";..struct
217a0 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65   cackey_pcsc_ide
217b0 6e 74 69 74 79 20 2a 70 63 73 63 5f 69 64 65 6e  ntity *pcsc_iden
217c0 74 69 74 69 65 73 3b 0a 09 75 6e 73 69 67 6e 65  tities;..unsigne
217d0 64 20 6c 6f 6e 67 20 6e 75 6d 5f 63 65 72 74 73  d long num_certs
217e0 3b 0a 09 73 73 69 7a 65 5f 74 20 6c 61 62 65 6c  ;..ssize_t label
217f0 5f 72 65 74 3b 0a 09 69 6e 74 20 6d 75 74 65 78  _ret;..int mutex
21800 5f 72 65 74 76 61 6c 3b 0a 09 69 6e 74 20 75 73  _retval;..int us
21810 65 5f 64 65 66 61 75 6c 74 5f 6c 61 62 65 6c 3b  e_default_label;
21820 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
21830 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
21840 29 3b 0a 0a 09 69 66 20 28 70 49 6e 66 6f 20 3d  );...if (pInfo =
21850 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
21860 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
21870 22 45 72 72 6f 72 2e 20 70 49 6e 66 6f 20 69 73  "Error. pInfo is
21880 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74   NULL.");....ret
21890 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54  urn(CKR_ARGUMENT
218a0 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  S_BAD);..}...if 
218b0 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
218c0 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
218d0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
218e0 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
218f0 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
21900 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
21910 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
21920 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f  D);..}...if (slo
21930 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49  tID < 0 || slotI
21940 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63  D >= (sizeof(cac
21950 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a  key_slots) / siz
21960 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
21970 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45  [0]))) {...CACKE
21980 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
21990 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73  Error. Invalid s
219a0 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25  lot requested (%
219b0 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20  lu), outside of 
219c0 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c  valid range", sl
219d0 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e  otID);....return
219e0 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56  (CKR_SLOT_ID_INV
219f0 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65  ALID);..}...mute
21a00 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
21a10 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63  y_mutex_lock(cac
21a20 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
21a30 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
21a40 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
21a50 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
21a60 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66  rror.  Locking f
21a70 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
21a80 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
21a90 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20  ERROR);..}...if 
21aa0 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c  (cackey_slots[sl
21ab0 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20  otID].active == 
21ac0 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
21ad0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
21ae0 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20  r. Invalid slot 
21af0 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c  requested (%lu),
21b00 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e   slot not curren
21b10 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f  tly active", slo
21b20 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f  tID);....cackey_
21b30 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
21b40 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
21b50 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54  .return(CKR_SLOT
21b60 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  _ID_INVALID);..}
21b70 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 74 6f  ...if (cackey_to
21b80 6b 65 6e 5f 70 72 65 73 65 6e 74 28 26 63 61 63  ken_present(&cac
21b90 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44  key_slots[slotID
21ba0 5d 29 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53  ]) != CACKEY_PCS
21bb0 43 5f 53 5f 54 4f 4b 45 4e 50 52 45 53 45 4e 54  C_S_TOKENPRESENT
21bc0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
21bd0 55 47 5f 50 52 49 4e 54 46 28 22 4e 6f 20 74 6f  UG_PRINTF("No to
21be0 6b 65 6e 20 69 73 20 70 72 65 73 65 6e 74 20 69  ken is present i
21bf0 6e 20 73 6c 6f 74 49 44 20 3d 20 25 6c 75 22 2c  n slotID = %lu",
21c00 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63   slotID);....cac
21c10 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
21c20 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
21c30 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
21c40 54 4f 4b 45 4e 5f 4e 4f 54 5f 50 52 45 53 45 4e  TOKEN_NOT_PRESEN
21c50 54 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  T);..}...mutex_r
21c60 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
21c70 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
21c80 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
21c90 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
21ca0 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
21cb0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
21cc0 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20  ror.  Unlocking 
21cd0 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
21ce0 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
21cf0 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 2f 2a  _ERROR);..}.../*
21d00 20 44 65 74 65 72 6d 69 6e 65 20 74 6f 6b 65 6e   Determine token
21d10 20 6c 61 62 65 6c 20 66 72 6f 6d 20 63 65 72 74   label from cert
21d20 69 66 69 63 61 74 65 73 20 2a 2f 0a 09 6d 65 6d  ificates */..mem
21d30 73 65 74 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c  set(pInfo->label
21d40 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 28 70 49  , ' ', sizeof(pI
21d50 6e 66 6f 2d 3e 6c 61 62 65 6c 29 29 3b 0a 09 75  nfo->label));..u
21d60 73 65 5f 64 65 66 61 75 6c 74 5f 6c 61 62 65 6c  se_default_label
21d70 20 3d 20 31 3b 0a 0a 09 69 66 20 28 63 61 63 6b   = 1;...if (cack
21d80 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
21d90 2e 6c 61 62 65 6c 20 3d 3d 20 4e 55 4c 4c 29 20  .label == NULL) 
21da0 7b 0a 09 09 70 63 73 63 5f 69 64 65 6e 74 69 74  {...pcsc_identit
21db0 69 65 73 20 3d 20 63 61 63 6b 65 79 5f 72 65 61  ies = cackey_rea
21dc0 64 5f 63 65 72 74 73 28 26 63 61 63 6b 65 79 5f  d_certs(&cackey_
21dd0 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c 20 4e  slots[slotID], N
21de0 55 4c 4c 2c 20 26 6e 75 6d 5f 63 65 72 74 73 29  ULL, &num_certs)
21df0 3b 0a 09 09 69 66 20 28 70 63 73 63 5f 69 64 65  ;...if (pcsc_ide
21e00 6e 74 69 74 69 65 73 20 21 3d 20 4e 55 4c 4c 29  ntities != NULL)
21e10 20 7b 0a 09 09 09 69 66 20 28 6e 75 6d 5f 63 65   {....if (num_ce
21e20 72 74 73 20 3e 20 30 29 20 7b 0a 09 09 09 09 6c  rts > 0) {.....l
21e30 61 62 65 6c 5f 72 65 74 20 3d 20 63 61 63 6b 65  abel_ret = cacke
21e40 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79 5f  y_pcsc_identity_
21e50 74 6f 5f 6c 61 62 65 6c 28 70 63 73 63 5f 69 64  to_label(pcsc_id
21e60 65 6e 74 69 74 69 65 73 2c 20 70 49 6e 66 6f 2d  entities, pInfo-
21e70 3e 6c 61 62 65 6c 2c 20 73 69 7a 65 6f 66 28 70  >label, sizeof(p
21e80 49 6e 66 6f 2d 3e 6c 61 62 65 6c 29 29 3b 0a 09  Info->label));..
21e90 09 09 09 69 66 20 28 6c 61 62 65 6c 5f 72 65 74  ...if (label_ret
21ea0 20 3e 20 30 29 20 7b 0a 09 09 09 09 09 75 73 65   > 0) {......use
21eb0 5f 64 65 66 61 75 6c 74 5f 6c 61 62 65 6c 20 3d  _default_label =
21ec0 20 30 3b 0a 0a 09 09 09 09 09 63 61 63 6b 65 79   0;.......cackey
21ed0 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c  _slots[slotID].l
21ee0 61 62 65 6c 20 3d 20 6d 61 6c 6c 6f 63 28 73 69  abel = malloc(si
21ef0 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6c 61 62 65  zeof(pInfo->labe
21f00 6c 29 29 3b 0a 0a 09 09 09 09 09 6d 65 6d 63 70  l));.......memcp
21f10 79 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73  y(cackey_slots[s
21f20 6c 6f 74 49 44 5d 2e 6c 61 62 65 6c 2c 20 70 49  lotID].label, pI
21f30 6e 66 6f 2d 3e 6c 61 62 65 6c 2c 20 73 69 7a 65  nfo->label, size
21f40 6f 66 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 29  of(pInfo->label)
21f50 29 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09  );.....}....}...
21f60 09 09 63 61 63 6b 65 79 5f 66 72 65 65 5f 63 65  ..cackey_free_ce
21f70 72 74 73 28 70 63 73 63 5f 69 64 65 6e 74 69 74  rts(pcsc_identit
21f80 69 65 73 2c 20 6e 75 6d 5f 63 65 72 74 73 2c 20  ies, num_certs, 
21f90 31 29 3b 0a 09 09 7d 0a 09 7d 20 65 6c 73 65 20  1);...}..} else 
21fa0 7b 0a 09 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f  {...memcpy(pInfo
21fb0 2d 3e 6c 61 62 65 6c 2c 20 63 61 63 6b 65 79 5f  ->label, cackey_
21fc0 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61  slots[slotID].la
21fd0 62 65 6c 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66  bel, sizeof(pInf
21fe0 6f 2d 3e 6c 61 62 65 6c 29 29 3b 0a 0a 09 09 75  o->label));....u
21ff0 73 65 5f 64 65 66 61 75 6c 74 5f 6c 61 62 65 6c  se_default_label
22000 20 3d 20 30 3b 0a 09 7d 0a 0a 09 69 66 20 28 75   = 0;..}...if (u
22010 73 65 5f 64 65 66 61 75 6c 74 5f 6c 61 62 65 6c  se_default_label
22020 29 20 7b 0a 09 09 6d 65 6d 63 70 79 28 70 49 6e  ) {...memcpy(pIn
22030 66 6f 2d 3e 6c 61 62 65 6c 2c 20 64 65 66 61 75  fo->label, defau
22040 6c 74 4c 61 62 65 6c 2c 20 73 69 7a 65 6f 66 28  ltLabel, sizeof(
22050 64 65 66 61 75 6c 74 4c 61 62 65 6c 29 20 2d 20  defaultLabel) - 
22060 31 29 3b 0a 09 7d 0a 0a 09 6d 65 6d 73 65 74 28  1);..}...memset(
22070 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75  pInfo->manufactu
22080 72 65 72 49 44 2c 20 27 20 27 2c 20 73 69 7a 65  rerID, ' ', size
22090 6f 66 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61  of(pInfo->manufa
220a0 63 74 75 72 65 72 49 44 29 29 3b 0a 09 6d 65 6d  cturerID));..mem
220b0 63 70 79 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66  cpy(pInfo->manuf
220c0 61 63 74 75 72 65 72 49 44 2c 20 6d 61 6e 75 66  acturerID, manuf
220d0 61 63 74 75 72 65 72 49 44 2c 20 73 69 7a 65 6f  acturerID, sizeo
220e0 66 28 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44  f(manufacturerID
220f0 29 20 2d 20 31 29 3b 0a 0a 09 6d 65 6d 73 65 74  ) - 1);...memset
22100 28 70 49 6e 66 6f 2d 3e 6d 6f 64 65 6c 2c 20 27  (pInfo->model, '
22110 20 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f   ', sizeof(pInfo
22120 2d 3e 6d 6f 64 65 6c 29 29 3b 0a 09 6d 65 6d 63  ->model));..memc
22130 70 79 28 70 49 6e 66 6f 2d 3e 6d 6f 64 65 6c 2c  py(pInfo->model,
22140 20 6d 6f 64 65 6c 2c 20 73 69 7a 65 6f 66 28 6d   model, sizeof(m
22150 6f 64 65 6c 29 20 2d 20 31 29 3b 0a 0a 09 6d 65  odel) - 1);...me
22160 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 73 65 72 69  mset(pInfo->seri
22170 61 6c 4e 75 6d 62 65 72 2c 20 27 20 27 2c 20 73  alNumber, ' ', s
22180 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 73 65 72  izeof(pInfo->ser
22190 69 61 6c 4e 75 6d 62 65 72 29 29 3b 0a 0a 09 6d  ialNumber));...m
221a0 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 75 74 63  emset(pInfo->utc
221b0 54 69 6d 65 2c 20 27 20 27 2c 20 73 69 7a 65 6f  Time, ' ', sizeo
221c0 66 28 70 49 6e 66 6f 2d 3e 75 74 63 54 69 6d 65  f(pInfo->utcTime
221d0 29 29 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 68 61 72  ));...pInfo->har
221e0 64 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d 61 6a  dwareVersion.maj
221f0 6f 72 20 3d 20 28 63 61 63 6b 65 79 5f 67 65 74  or = (cackey_get
22200 76 65 72 73 69 6f 6e 28 29 20 3e 3e 20 31 36 29  version() >> 16)
22210 20 26 20 30 78 66 66 3b 0a 09 70 49 6e 66 6f 2d   & 0xff;..pInfo-
22220 3e 68 61 72 64 77 61 72 65 56 65 72 73 69 6f 6e  >hardwareVersion
22230 2e 6d 69 6e 6f 72 20 3d 20 28 63 61 63 6b 65 79  .minor = (cackey
22240 5f 67 65 74 76 65 72 73 69 6f 6e 28 29 20 3e 3e  _getversion() >>
22250 20 38 29 20 26 20 30 78 66 66 3b 0a 0a 09 70 49   8) & 0xff;...pI
22260 6e 66 6f 2d 3e 66 69 72 6d 77 61 72 65 56 65 72  nfo->firmwareVer
22270 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 30 78 30  sion.major = 0x0
22280 30 3b 0a 09 70 49 6e 66 6f 2d 3e 66 69 72 6d 77  0;..pInfo->firmw
22290 61 72 65 56 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72  areVersion.minor
222a0 20 3d 20 30 78 30 30 3b 0a 0a 09 70 49 6e 66 6f   = 0x00;...pInfo
222b0 2d 3e 66 6c 61 67 73 20 3d 20 43 4b 46 5f 57 52  ->flags = CKF_WR
222c0 49 54 45 5f 50 52 4f 54 45 43 54 45 44 20 7c 20  ITE_PROTECTED | 
222d0 43 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 49 4e 49  CKF_USER_PIN_INI
222e0 54 49 41 4c 49 5a 45 44 20 7c 20 43 4b 46 5f 54  TIALIZED | CKF_T
222f0 4f 4b 45 4e 5f 49 4e 49 54 49 41 4c 49 5a 45 44  OKEN_INITIALIZED
22300 20 7c 20 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b   | cackey_slots[
22310 73 6c 6f 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c  slotID].token_fl
22320 61 67 73 3b 0a 0a 09 69 66 20 28 63 61 63 6b 65  ags;...if (cacke
22330 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20 21 3d  y_pin_command !=
22340 20 4e 55 4c 4c 29 20 7b 0a 09 09 70 49 6e 66 6f   NULL) {...pInfo
22350 2d 3e 66 6c 61 67 73 20 7c 3d 20 43 4b 46 5f 50  ->flags |= CKF_P
22360 52 4f 54 45 43 54 45 44 5f 41 55 54 48 45 4e 54  ROTECTED_AUTHENT
22370 49 43 41 54 49 4f 4e 5f 50 41 54 48 3b 0a 09 7d  ICATION_PATH;..}
22380 0a 0a 09 70 49 6e 66 6f 2d 3e 75 6c 4d 61 78 53  ...pInfo->ulMaxS
22390 65 73 73 69 6f 6e 43 6f 75 6e 74 20 3d 20 28 73  essionCount = (s
223a0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
223b0 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28  sions) / sizeof(
223c0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
223d0 30 5d 29 29 20 2d 20 31 3b 0a 09 70 49 6e 66 6f  0])) - 1;..pInfo
223e0 2d 3e 75 6c 53 65 73 73 69 6f 6e 43 6f 75 6e 74  ->ulSessionCount
223f0 20 3d 20 43 4b 5f 55 4e 41 56 41 49 4c 41 42 4c   = CK_UNAVAILABL
22400 45 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a 09  E_INFORMATION;..
22410 70 49 6e 66 6f 2d 3e 75 6c 4d 61 78 52 77 53 65  pInfo->ulMaxRwSe
22420 73 73 69 6f 6e 43 6f 75 6e 74 20 3d 20 30 3b 0a  ssionCount = 0;.
22430 09 70 49 6e 66 6f 2d 3e 75 6c 52 77 53 65 73 73  .pInfo->ulRwSess
22440 69 6f 6e 43 6f 75 6e 74 20 3d 20 43 4b 5f 55 4e  ionCount = CK_UN
22450 41 56 41 49 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d  AVAILABLE_INFORM
22460 41 54 49 4f 4e 3b 0a 09 70 49 6e 66 6f 2d 3e 75  ATION;..pInfo->u
22470 6c 4d 61 78 50 69 6e 4c 65 6e 20 3d 20 31 32 38  lMaxPinLen = 128
22480 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 4d 69 6e 50  ;..pInfo->ulMinP
22490 69 6e 4c 65 6e 20 3d 20 30 3b 0a 09 70 49 6e 66  inLen = 0;..pInf
224a0 6f 2d 3e 75 6c 54 6f 74 61 6c 50 75 62 6c 69 63  o->ulTotalPublic
224b0 4d 65 6d 6f 72 79 20 3d 20 43 4b 5f 55 4e 41 56  Memory = CK_UNAV
224c0 41 49 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d 41 54  AILABLE_INFORMAT
224d0 49 4f 4e 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 46  ION;..pInfo->ulF
224e0 72 65 65 50 75 62 6c 69 63 4d 65 6d 6f 72 79 20  reePublicMemory 
224f0 3d 20 43 4b 5f 55 4e 41 56 41 49 4c 41 42 4c 45  = CK_UNAVAILABLE
22500 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a 09 70  _INFORMATION;..p
22510 49 6e 66 6f 2d 3e 75 6c 54 6f 74 61 6c 50 72 69  Info->ulTotalPri
22520 76 61 74 65 4d 65 6d 6f 72 79 20 3d 20 43 4b 5f  vateMemory = CK_
22530 55 4e 41 56 41 49 4c 41 42 4c 45 5f 49 4e 46 4f  UNAVAILABLE_INFO
22540 52 4d 41 54 49 4f 4e 3b 0a 09 70 49 6e 66 6f 2d  RMATION;..pInfo-
22550 3e 75 6c 46 72 65 65 50 72 69 76 61 74 65 4d 65  >ulFreePrivateMe
22560 6d 6f 72 79 20 3d 20 43 4b 5f 55 4e 41 56 41 49  mory = CK_UNAVAI
22570 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d 41 54 49 4f  LABLE_INFORMATIO
22580 4e 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  N;...CACKEY_DEBU
22590 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
225a0 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22  ing CKR_OK (%i)"
225b0 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74  , CKR_OK);...ret
225c0 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a  urn(CKR_OK);.}..
225d0 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
225e0 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 57 61 69 74  ON(CK_RV, C_Wait
225f0 46 6f 72 53 6c 6f 74 45 76 65 6e 74 29 28 43 4b  ForSlotEvent)(CK
22600 5f 46 4c 41 47 53 20 66 6c 61 67 73 2c 20 43 4b  _FLAGS flags, CK
22610 5f 53 4c 4f 54 5f 49 44 5f 50 54 52 20 70 53 6c  _SLOT_ID_PTR pSl
22620 6f 74 49 44 2c 20 43 4b 5f 56 4f 49 44 5f 50 54  otID, CK_VOID_PT
22630 52 20 70 52 65 73 65 72 76 65 64 29 20 7b 0a 09  R pReserved) {..
22640 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
22650 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
22660 0a 09 69 66 20 28 70 52 65 73 65 72 76 65 64 20  ..if (pReserved 
22670 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43  != NULL) {...CAC
22680 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
22690 28 22 45 72 72 6f 72 2e 20 70 52 65 73 65 72 76  ("Error. pReserv
226a0 65 64 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 22  ed is not NULL."
226b0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
226c0 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b  _ARGUMENTS_BAD);
226d0 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ..}...if (!cacke
226e0 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
226f0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
22700 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
22710 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
22720 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
22730 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
22740 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
22750 0a 09 2f 2a 20 58 58 58 3a 20 54 4f 44 4f 3a 20  ../* XXX: TODO: 
22760 49 6d 70 6c 65 6d 65 6e 74 20 74 68 69 73 2e 2e  Implement this..
22770 2e 20 2a 2f 0a 09 43 41 43 4b 45 59 5f 44 45 42  . */..CACKEY_DEB
22780 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
22790 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
227a0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
227b0 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
227c0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
227d0 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
227e0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
227f0 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
22800 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
22810 43 4b 5f 52 56 2c 20 43 5f 47 65 74 4d 65 63 68  CK_RV, C_GetMech
22820 61 6e 69 73 6d 4c 69 73 74 29 28 43 4b 5f 53 4c  anismList)(CK_SL
22830 4f 54 5f 49 44 20 73 6c 6f 74 49 44 2c 20 43 4b  OT_ID slotID, CK
22840 5f 4d 45 43 48 41 4e 49 53 4d 5f 54 59 50 45 5f  _MECHANISM_TYPE_
22850 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 4c 69  PTR pMechanismLi
22860 73 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52  st, CK_ULONG_PTR
22870 20 70 75 6c 43 6f 75 6e 74 29 20 7b 0a 09 43 41   pulCount) {..CA
22880 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
22890 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
228a0 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
228b0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
228c0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
228d0 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
228e0 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
228f0 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
22900 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
22910 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  IZED);..}...if (
22920 70 75 6c 43 6f 75 6e 74 20 3d 3d 20 4e 55 4c 4c  pulCount == NULL
22930 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
22940 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
22950 2e 20 20 70 75 6c 43 6f 75 6e 74 20 69 73 20 4e  .  pulCount is N
22960 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  ULL.");....retur
22970 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f  n(CKR_ARGUMENTS_
22980 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70  BAD);..}...if (p
22990 4d 65 63 68 61 6e 69 73 6d 4c 69 73 74 20 3d 3d  MechanismList ==
229a0 20 4e 55 4c 4c 29 20 7b 0a 09 09 2a 70 75 6c 43   NULL) {...*pulC
229b0 6f 75 6e 74 20 3d 20 31 3b 0a 0a 09 09 43 41 43  ount = 1;....CAC
229c0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
229d0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
229e0 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b  OK (%i)", CKR_OK
229f0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
22a00 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 2a  _OK);..}...if (*
22a10 70 75 6c 43 6f 75 6e 74 20 3c 20 31 29 20 7b 0a  pulCount < 1) {.
22a20 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
22a30 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 42  RINTF("Error.  B
22a40 75 66 66 65 72 20 74 6f 6f 20 73 6d 61 6c 6c 2e  uffer too small.
22a50 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
22a60 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41  R_BUFFER_TOO_SMA
22a70 4c 4c 29 3b 0a 09 7d 0a 0a 09 70 4d 65 63 68 61  LL);..}...pMecha
22a80 6e 69 73 6d 4c 69 73 74 5b 30 5d 20 3d 20 43 4b  nismList[0] = CK
22a90 4d 5f 52 53 41 5f 50 4b 43 53 3b 0a 09 2a 70 75  M_RSA_PKCS;..*pu
22aa0 6c 43 6f 75 6e 74 20 3d 20 31 3b 0a 0a 09 43 41  lCount = 1;...CA
22ab0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
22ac0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
22ad0 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f  _OK (%i)", CKR_O
22ae0 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  K);...return(CKR
22af0 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  _OK);.}..CK_DEFI
22b00 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
22b10 56 2c 20 43 5f 47 65 74 4d 65 63 68 61 6e 69 73  V, C_GetMechanis
22b20 6d 49 6e 66 6f 29 28 43 4b 5f 53 4c 4f 54 5f 49  mInfo)(CK_SLOT_I
22b30 44 20 73 6c 6f 74 49 44 2c 20 43 4b 5f 4d 45 43  D slotID, CK_MEC
22b40 48 41 4e 49 53 4d 5f 54 59 50 45 20 74 79 70 65  HANISM_TYPE type
22b50 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 49  , CK_MECHANISM_I
22b60 4e 46 4f 5f 50 54 52 20 70 49 6e 66 6f 29 20 7b  NFO_PTR pInfo) {
22b70 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76  ..int mutex_retv
22b80 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  al;...CACKEY_DEB
22b90 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
22ba0 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70 49 6e 66  d.");...if (pInf
22bb0 6f 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  o == NULL) {...C
22bc0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
22bd0 54 46 28 22 45 72 72 6f 72 2e 20 70 49 6e 66 6f  TF("Error. pInfo
22be0 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09   is NULL.");....
22bf0 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d  return(CKR_ARGUM
22c00 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09  ENTS_BAD);..}...
22c10 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
22c20 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
22c30 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
22c40 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
22c50 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
22c60 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
22c70 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
22c80 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  IZED);..}...if (
22c90 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c  slotID < 0 || sl
22ca0 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28  otID >= (sizeof(
22cb0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20  cackey_slots) / 
22cc0 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
22cd0 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41  ots[0]))) {...CA
22ce0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
22cf0 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69  F("Error. Invali
22d00 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64  d slot requested
22d10 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20   (%lu), outside 
22d20 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c  of valid range",
22d30 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74   slotID);....ret
22d40 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f  urn(CKR_SLOT_ID_
22d50 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d  INVALID);..}...m
22d60 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
22d70 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28  ckey_mutex_lock(
22d80 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
22d90 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
22da0 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
22db0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
22dc0 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e  ("Error.  Lockin
22dd0 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
22de0 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
22df0 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
22e00 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  if (cackey_slots
22e10 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65 20  [slotID].active 
22e20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  == 0) {...CACKEY
22e30 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
22e40 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c  rror. Invalid sl
22e50 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c  ot requested (%l
22e60 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72  u), slot not cur
22e70 72 65 6e 74 6c 79 20 61 63 74 69 76 65 22 2c 20  rently active", 
22e80 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b  slotID);....cack
22e90 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
22ea0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
22eb0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
22ec0 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b  LOT_ID_INVALID);
22ed0 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  ..}...mutex_retv
22ee0 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
22ef0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
22f00 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
22f10 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
22f20 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
22f30 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
22f40 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69  .  Unlocking fai
22f50 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
22f60 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
22f70 52 4f 52 29 3b 0a 09 7d 0a 0a 09 73 77 69 74 63  ROR);..}...switc
22f80 68 20 28 74 79 70 65 29 20 7b 0a 09 09 63 61 73  h (type) {...cas
22f90 65 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 3a 0a  e CKM_RSA_PKCS:.
22fa0 09 09 09 70 49 6e 66 6f 2d 3e 75 6c 4d 69 6e 4b  ...pInfo->ulMinK
22fb0 65 79 53 69 7a 65 20 3d 20 35 31 32 3b 0a 09 09  eySize = 512;...
22fc0 09 70 49 6e 66 6f 2d 3e 75 6c 4d 61 78 4b 65 79  .pInfo->ulMaxKey
22fd0 53 69 7a 65 20 3d 20 38 31 39 32 3b 0a 09 09 09  Size = 8192;....
22fe0 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20 3d 20 43  pInfo->flags = C
22ff0 4b 46 5f 48 57 20 7c 20 43 4b 46 5f 45 4e 43 52  KF_HW | CKF_ENCR
23000 59 50 54 20 7c 20 43 4b 46 5f 44 45 43 52 59 50  YPT | CKF_DECRYP
23010 54 20 7c 20 43 4b 46 5f 53 49 47 4e 20 7c 20 43  T | CKF_SIGN | C
23020 4b 46 5f 56 45 52 49 46 59 3b 0a 09 09 09 62 72  KF_VERIFY;....br
23030 65 61 6b 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  eak;..}...CACKEY
23040 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
23050 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20  eturning CKR_OK 
23060 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a  (%i)", CKR_OK);.
23070 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29  ..return(CKR_OK)
23080 3b 0a 7d 0a 0a 2f 2a 20 57 65 20 64 6f 6e 27 74  ;.}../* We don't
23090 20 73 75 70 70 6f 72 74 20 74 68 69 73 20 6d 65   support this me
230a0 74 68 6f 64 2e 20 2a 2f 0a 43 4b 5f 44 45 46 49  thod. */.CK_DEFI
230b0 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
230c0 56 2c 20 43 5f 49 6e 69 74 54 6f 6b 65 6e 29 28  V, C_InitToken)(
230d0 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49  CK_SLOT_ID slotI
230e0 44 2c 20 43 4b 5f 55 54 46 38 43 48 41 52 5f 50  D, CK_UTF8CHAR_P
230f0 54 52 20 70 50 69 6e 2c 20 43 4b 5f 55 4c 4f 4e  TR pPin, CK_ULON
23100 47 20 75 6c 50 69 6e 4c 65 6e 2c 20 43 4b 5f 55  G ulPinLen, CK_U
23110 54 46 38 43 48 41 52 5f 50 54 52 20 70 4c 61 62  TF8CHAR_PTR pLab
23120 65 6c 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  el) {..CACKEY_DE
23130 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
23140 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
23150 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
23160 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
23170 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
23180 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
23190 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
231a0 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
231b0 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
231c0 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
231d0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
231e0 69 6e 67 20 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52  ing CKR_TOKEN_WR
231f0 49 54 45 5f 50 52 4f 54 45 43 54 45 44 20 28 25  ITE_PROTECTED (%
23200 69 29 22 2c 20 43 4b 52 5f 54 4f 4b 45 4e 5f 57  i)", CKR_TOKEN_W
23210 52 49 54 45 5f 50 52 4f 54 45 43 54 45 44 29 3b  RITE_PROTECTED);
23220 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 54 4f  ...return(CKR_TO
23230 4b 45 4e 5f 57 52 49 54 45 5f 50 52 4f 54 45 43  KEN_WRITE_PROTEC
23240 54 45 44 29 3b 0a 7d 0a 0a 2f 2a 20 57 65 20 64  TED);.}../* We d
23250 6f 6e 27 74 20 73 75 70 70 6f 72 74 20 74 68 69  on't support thi
23260 73 20 6d 65 74 68 6f 64 2e 20 2a 2f 0a 43 4b 5f  s method. */.CK_
23270 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
23280 43 4b 5f 52 56 2c 20 43 5f 49 6e 69 74 50 49 4e  CK_RV, C_InitPIN
23290 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
232a0 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
232b0 5f 55 54 46 38 43 48 41 52 5f 50 54 52 20 70 50  _UTF8CHAR_PTR pP
232c0 69 6e 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50  in, CK_ULONG ulP
232d0 69 6e 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59  inLen) {..CACKEY
232e0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
232f0 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
23300 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
23310 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
23320 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
23330 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
23340 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
23350 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
23360 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
23370 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
23380 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
23390 75 72 6e 69 6e 67 20 43 4b 52 5f 54 4f 4b 45 4e  urning CKR_TOKEN
233a0 5f 57 52 49 54 45 5f 50 52 4f 54 45 43 54 45 44  _WRITE_PROTECTED
233b0 20 28 25 69 29 22 2c 20 43 4b 52 5f 54 4f 4b 45   (%i)", CKR_TOKE
233c0 4e 5f 57 52 49 54 45 5f 50 52 4f 54 45 43 54 45  N_WRITE_PROTECTE
233d0 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
233e0 5f 54 4f 4b 45 4e 5f 57 52 49 54 45 5f 50 52 4f  _TOKEN_WRITE_PRO
233f0 54 45 43 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  TECTED);.}..CK_D
23400 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
23410 4b 5f 52 56 2c 20 43 5f 53 65 74 50 49 4e 29 28  K_RV, C_SetPIN)(
23420 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
23430 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 55  E hSession, CK_U
23440 54 46 38 43 48 41 52 5f 50 54 52 20 70 4f 6c 64  TF8CHAR_PTR pOld
23450 50 69 6e 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  Pin, CK_ULONG ul
23460 4f 6c 64 50 69 6e 4c 65 6e 2c 20 43 4b 5f 55 54  OldPinLen, CK_UT
23470 46 38 43 48 41 52 5f 50 54 52 20 70 4e 65 77 50  F8CHAR_PTR pNewP
23480 69 6e 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 4e  in, CK_ULONG ulN
23490 65 77 50 69 6e 4c 65 6e 29 20 7b 0a 09 63 68 61  ewPinLen) {..cha
234a0 72 20 6f 6c 64 70 69 6e 62 75 66 5b 36 34 5d 2c  r oldpinbuf[64],
234b0 20 6e 65 77 70 69 6e 62 75 66 5b 36 34 5d 3b 0a   newpinbuf[64];.
234c0 09 63 61 63 6b 65 79 5f 72 65 74 20 73 65 74 5f  .cackey_ret set_
234d0 70 69 6e 5f 72 65 74 2c 20 67 65 74 5f 70 69 6e  pin_ret, get_pin
234e0 5f 72 65 74 3b 0a 09 43 4b 5f 53 4c 4f 54 5f 49  _ret;..CK_SLOT_I
234f0 44 20 73 6c 6f 74 49 44 3b 0a 09 69 6e 74 20 6d  D slotID;..int m
23500 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43  utex_retval;...C
23510 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
23520 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
23530 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
23540 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
23550 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
23560 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
23570 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
23580 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
23590 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
235a0 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74  LIZED);..}...mut
235b0 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
235c0 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61  ey_mutex_lock(ca
235d0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
235e0 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
235f0 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
23600 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
23610 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20  Error.  Locking 
23620 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
23630 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
23640 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66  _ERROR);..}...if
23650 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   (!cackey_sessio
23660 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74  ns[hSession].act
23670 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  ive) {...cackey_
23680 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
23690 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
236a0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
236b0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65  INTF("Error.  Se
236c0 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65  ssion not active
236d0 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
236e0 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  (CKR_SESSION_HAN
236f0 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  DLE_INVALID);..}
23700 0a 0a 09 73 6c 6f 74 49 44 20 3d 20 63 61 63 6b  ...slotID = cack
23710 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
23720 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44 3b 0a 0a 09  sion].slotID;...
23730 69 66 20 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c  if (slotID < 0 |
23740 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a  | slotID >= (siz
23750 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
23760 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
23770 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a  y_slots[0]))) {.
23780 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
23790 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e  RINTF("Error. In
237a0 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65  valid slot reque
237b0 73 74 65 64 20 28 25 6c 75 29 2c 20 6f 75 74 73  sted (%lu), outs
237c0 69 64 65 20 6f 66 20 76 61 6c 69 64 20 72 61 6e  ide of valid ran
237d0 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09  ge", slotID);...
237e0 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
237f0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
23800 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  ock);....return(
23810 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
23820 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63  R);..}...if (cac
23830 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44  key_slots[slotID
23840 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 29 20 7b  ].active == 0) {
23850 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
23860 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49  PRINTF("Error. I
23870 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75  nvalid slot requ
23880 65 73 74 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f  ested (%lu), slo
23890 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20  t not currently 
238a0 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 29  active", slotID)
238b0 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65  ;....cackey_mute
238c0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
238d0 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74  biglock);....ret
238e0 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
238f0 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20  ERROR);..}...if 
23900 28 63 61 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d  (cackey_pin_comm
23910 61 6e 64 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  and != NULL) {..
23920 09 2f 2a 20 47 65 74 20 6f 6c 64 20 50 49 4e 20  ./* Get old PIN 
23930 2a 2f 0a 09 09 67 65 74 5f 70 69 6e 5f 72 65 74  */...get_pin_ret
23940 20 3d 20 63 61 63 6b 65 79 5f 67 65 74 5f 70 69   = cackey_get_pi
23950 6e 28 6f 6c 64 70 69 6e 62 75 66 29 3b 0a 0a 09  n(oldpinbuf);...
23960 09 69 66 20 28 67 65 74 5f 70 69 6e 5f 72 65 74  .if (get_pin_ret
23970 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f   != CACKEY_PCSC_
23980 53 5f 4f 4b 29 20 7b 0a 09 09 09 43 41 43 4b 45  S_OK) {....CACKE
23990 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
239a0 45 72 72 6f 72 20 77 68 69 6c 65 20 67 65 74 74  Error while gett
239b0 69 6e 67 20 4f 6c 64 20 50 49 4e 2c 20 72 65 74  ing Old PIN, ret
239c0 75 72 6e 69 6e 67 20 43 4b 52 5f 50 49 4e 5f 49  urning CKR_PIN_I
239d0 4e 43 4f 52 52 45 43 54 2e 22 29 3b 0a 0a 09 09  NCORRECT.");....
239e0 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
239f0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
23a00 6f 63 6b 29 3b 0a 09 09 09 0a 09 09 09 72 65 74  ock);........ret
23a10 75 72 6e 28 43 4b 52 5f 50 49 4e 5f 49 4e 43 4f  urn(CKR_PIN_INCO
23a20 52 52 45 43 54 29 3b 0a 09 09 7d 0a 0a 09 09 70  RRECT);...}....p
23a30 4f 6c 64 50 69 6e 20 3d 20 28 43 4b 5f 55 54 46  OldPin = (CK_UTF
23a40 38 43 48 41 52 5f 50 54 52 29 20 6f 6c 64 70 69  8CHAR_PTR) oldpi
23a50 6e 62 75 66 3b 0a 09 09 75 6c 4f 6c 64 50 69 6e  nbuf;...ulOldPin
23a60 4c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 6f 6c 64  Len = strlen(old
23a70 70 69 6e 62 75 66 29 3b 0a 0a 09 09 2f 2a 20 47  pinbuf);..../* G
23a80 65 74 20 6e 65 77 20 50 49 4e 20 2a 2f 0a 09 09  et new PIN */...
23a90 67 65 74 5f 70 69 6e 5f 72 65 74 20 3d 20 63 61  get_pin_ret = ca
23aa0 63 6b 65 79 5f 67 65 74 5f 70 69 6e 28 6e 65 77  ckey_get_pin(new
23ab0 70 69 6e 62 75 66 29 3b 0a 0a 09 09 69 66 20 28  pinbuf);....if (
23ac0 67 65 74 5f 70 69 6e 5f 72 65 74 20 21 3d 20 43  get_pin_ret != C
23ad0 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29  ACKEY_PCSC_S_OK)
23ae0 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
23af0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
23b00 20 77 68 69 6c 65 20 67 65 74 74 69 6e 67 20 4e   while getting N
23b10 65 77 20 50 49 4e 2c 20 72 65 74 75 72 6e 69 6e  ew PIN, returnin
23b20 67 20 43 4b 52 5f 50 49 4e 5f 49 4e 56 41 4c 49  g CKR_PIN_INVALI
23b30 44 2e 22 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79  D.");.....cackey
23b40 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
23b50 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
23b60 09 09 0a 09 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
23b70 5f 50 49 4e 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  _PIN_INVALID);..
23b80 09 7d 0a 0a 09 09 70 4e 65 77 50 69 6e 20 3d 20  .}....pNewPin = 
23b90 28 43 4b 5f 55 54 46 38 43 48 41 52 5f 50 54 52  (CK_UTF8CHAR_PTR
23ba0 29 20 6e 65 77 70 69 6e 62 75 66 3b 0a 09 09 75  ) newpinbuf;...u
23bb0 6c 4e 65 77 50 69 6e 4c 65 6e 20 3d 20 73 74 72  lNewPinLen = str
23bc0 6c 65 6e 28 6e 65 77 70 69 6e 62 75 66 29 3b 0a  len(newpinbuf);.
23bd0 09 7d 0a 0a 09 69 66 20 28 70 4f 6c 64 50 69 6e  .}...if (pOldPin
23be0 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
23bf0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
23c00 46 28 22 4f 6c 64 20 50 49 4e 20 76 61 6c 75 65  F("Old PIN value
23c10 20 69 73 20 77 72 6f 6e 67 20 28 6e 75 6c 6c 29   is wrong (null)
23c20 2e 22 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d  .");....cackey_m
23c30 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
23c40 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
23c50 72 65 74 75 72 6e 28 43 4b 52 5f 50 49 4e 5f 49  return(CKR_PIN_I
23c60 4e 43 4f 52 52 45 43 54 29 3b 0a 09 7d 0a 0a 09  NCORRECT);..}...
23c70 69 66 20 28 75 6c 4f 6c 64 50 69 6e 4c 65 6e 20  if (ulOldPinLen 
23c80 3d 3d 20 30 20 7c 7c 20 75 6c 4f 6c 64 50 69 6e  == 0 || ulOldPin
23c90 4c 65 6e 20 3e 20 38 29 20 7b 0a 09 09 43 41 43  Len > 8) {...CAC
23ca0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
23cb0 28 22 4f 6c 64 20 50 49 4e 20 6c 65 6e 67 74 68  ("Old PIN length
23cc0 20 69 73 20 77 72 6f 6e 67 3a 20 25 6c 75 2e 22   is wrong: %lu."
23cd0 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
23ce0 29 20 75 6c 4f 6c 64 50 69 6e 4c 65 6e 29 3b 0a  ) ulOldPinLen);.
23cf0 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
23d00 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
23d10 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72  glock);....retur
23d20 6e 28 43 4b 52 5f 50 49 4e 5f 49 4e 43 4f 52 52  n(CKR_PIN_INCORR
23d30 45 43 54 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70  ECT);..}...if (p
23d40 4e 65 77 50 69 6e 20 3d 3d 20 4e 55 4c 4c 29 20  NewPin == NULL) 
23d50 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
23d60 5f 50 52 49 4e 54 46 28 22 4e 65 77 20 50 49 4e  _PRINTF("New PIN
23d70 20 76 61 6c 75 65 20 69 73 20 77 72 6f 6e 67 20   value is wrong 
23d80 28 65 69 74 68 65 72 20 4e 55 4c 4c 2c 20 6f 72  (either NULL, or
23d90 20 74 6f 6f 20 6c 6f 6e 67 2f 73 68 6f 72 74 29   too long/short)
23da0 2e 22 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d  .");....cackey_m
23db0 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
23dc0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
23dd0 72 65 74 75 72 6e 28 43 4b 52 5f 50 49 4e 5f 49  return(CKR_PIN_I
23de0 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66  NVALID);..}...if
23df0 20 28 75 6c 4e 65 77 50 69 6e 4c 65 6e 20 3c 20   (ulNewPinLen < 
23e00 35 20 7c 7c 20 75 6c 4e 65 77 50 69 6e 4c 65 6e  5 || ulNewPinLen
23e10 20 3e 20 38 29 20 7b 0a 09 09 43 41 43 4b 45 59   > 8) {...CACKEY
23e20 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4e  _DEBUG_PRINTF("N
23e30 65 77 20 50 49 4e 20 6c 65 6e 67 74 68 20 69 73  ew PIN length is
23e40 20 77 72 6f 6e 67 3a 20 25 6c 75 2c 20 6d 75 73   wrong: %lu, mus
23e50 74 20 62 65 20 61 74 6c 65 61 73 74 20 35 20 61  t be atleast 5 a
23e60 6e 64 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20  nd no more than 
23e70 38 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  8.", (unsigned l
23e80 6f 6e 67 29 20 75 6c 4e 65 77 50 69 6e 4c 65 6e  ong) ulNewPinLen
23e90 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  );....cackey_mut
23ea0 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
23eb0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65  _biglock);....re
23ec0 74 75 72 6e 28 43 4b 52 5f 50 49 4e 5f 4c 45 4e  turn(CKR_PIN_LEN
23ed0 5f 52 41 4e 47 45 29 3b 0a 09 7d 0a 0a 09 73 65  _RANGE);..}...se
23ee0 74 5f 70 69 6e 5f 72 65 74 20 3d 20 63 61 63 6b  t_pin_ret = cack
23ef0 65 79 5f 73 65 74 5f 70 69 6e 28 26 63 61 63 6b  ey_set_pin(&cack
23f00 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
23f10 2c 20 70 4f 6c 64 50 69 6e 2c 20 75 6c 4f 6c 64  , pOldPin, ulOld
23f20 50 69 6e 4c 65 6e 2c 20 70 4e 65 77 50 69 6e 2c  PinLen, pNewPin,
23f30 20 75 6c 4e 65 77 50 69 6e 4c 65 6e 29 3b 0a 0a   ulNewPinLen);..
23f40 09 69 66 20 28 73 65 74 5f 70 69 6e 5f 72 65 74  .if (set_pin_ret
23f50 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f   != CACKEY_PCSC_
23f60 53 5f 4f 4b 29 20 7b 0a 09 09 69 66 20 28 63 61  S_OK) {...if (ca
23f70 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64  ckey_pin_command
23f80 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 63   == NULL) {....c
23f90 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
23fa0 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20  ID].token_flags 
23fb0 7c 3d 20 43 4b 46 5f 4c 4f 47 49 4e 5f 52 45 51  |= CKF_LOGIN_REQ
23fc0 55 49 52 45 44 3b 0a 09 09 7d 0a 0a 09 09 69 66  UIRED;...}....if
23fd0 20 28 73 65 74 5f 70 69 6e 5f 72 65 74 20 3d 3d   (set_pin_ret ==
23fe0 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4c   CACKEY_PCSC_E_L
23ff0 4f 43 4b 45 44 29 20 7b 0a 09 09 09 63 61 63 6b  OCKED) {....cack
24000 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
24010 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 7c 3d 20  .token_flags |= 
24020 43 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 4c 4f 43  CKF_USER_PIN_LOC
24030 4b 45 44 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 6d 75  KED;...}..}...mu
24040 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
24050 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
24060 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
24070 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
24080 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
24090 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
240a0 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63  F("Error.  Unloc
240b0 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
240c0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
240d0 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
240e0 0a 0a 09 73 77 69 74 63 68 20 28 73 65 74 5f 70  ...switch (set_p
240f0 69 6e 5f 72 65 74 29 20 7b 0a 09 09 63 61 73 65  in_ret) {...case
24100 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f   CACKEY_PCSC_S_O
24110 4b 3a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42  K:....CACKEY_DEB
24120 55 47 5f 50 52 49 4e 54 46 28 22 53 75 63 63 65  UG_PRINTF("Succe
24130 73 73 66 75 6c 6c 79 20 73 65 74 20 50 49 4e 2e  ssfully set PIN.
24140 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43  ");.....return(C
24150 4b 52 5f 4f 4b 29 3b 0a 09 09 63 61 73 65 20 43  KR_OK);...case C
24160 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 42 41 44  ACKEY_PCSC_E_BAD
24170 50 49 4e 3a 0a 09 09 09 43 41 43 4b 45 59 5f 44  PIN:....CACKEY_D
24180 45 42 55 47 5f 50 52 49 4e 54 46 28 22 50 49 4e  EBUG_PRINTF("PIN
24190 20 77 61 73 20 69 6e 76 61 6c 69 64 2e 22 29 3b   was invalid.");
241a0 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
241b0 50 49 4e 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 09  PIN_INVALID);...
241c0 63 61 73 65 20 43 41 43 4b 45 59 5f 50 43 53 43  case CACKEY_PCSC
241d0 5f 45 5f 4c 4f 43 4b 45 44 3a 0a 09 09 09 43 41  _E_LOCKED:....CA
241e0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
241f0 46 28 22 54 6f 6b 65 6e 20 69 73 20 6c 6f 63 6b  F("Token is lock
24200 65 64 20 6f 72 20 74 68 69 73 20 63 68 61 6e 67  ed or this chang
24210 65 20 69 73 20 6e 6f 74 20 70 65 72 6d 69 74 74  e is not permitt
24220 65 64 2e 22 29 3b 0a 0a 09 09 09 72 65 74 75 72  ed.");.....retur
24230 6e 28 43 4b 52 5f 50 49 4e 5f 4c 4f 43 4b 45 44  n(CKR_PIN_LOCKED
24240 29 3b 0a 09 09 64 65 66 61 75 6c 74 3a 0a 09 09  );...default:...
24250 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
24260 49 4e 54 46 28 22 53 6f 6d 65 74 68 69 6e 67 20  INTF("Something 
24270 65 6c 73 65 20 77 65 6e 74 20 77 72 6f 6e 67 20  else went wrong 
24280 63 68 61 6e 67 69 6e 67 20 74 68 65 20 50 49 4e  changing the PIN
24290 3a 20 25 69 22 2c 20 73 65 74 5f 70 69 6e 5f 72  : %i", set_pin_r
242a0 65 74 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28  et);.....return(
242b0 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
242c0 52 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28  R);..}...return(
242d0 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
242e0 52 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  R);.}..CK_DEFINE
242f0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
24300 20 43 5f 4f 70 65 6e 53 65 73 73 69 6f 6e 29 28   C_OpenSession)(
24310 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49  CK_SLOT_ID slotI
24320 44 2c 20 43 4b 5f 46 4c 41 47 53 20 66 6c 61 67  D, CK_FLAGS flag
24330 73 2c 20 43 4b 5f 56 4f 49 44 5f 50 54 52 20 70  s, CK_VOID_PTR p
24340 41 70 70 6c 69 63 61 74 69 6f 6e 2c 20 43 4b 5f  Application, CK_
24350 4e 4f 54 49 46 59 20 6e 6f 74 69 66 79 2c 20 43  NOTIFY notify, C
24360 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
24370 5f 50 54 52 20 70 68 53 65 73 73 69 6f 6e 29 20  _PTR phSession) 
24380 7b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  {..unsigned long
24390 20 69 64 78 3b 0a 09 69 6e 74 20 6d 75 74 65 78   idx;..int mutex
243a0 5f 72 65 74 76 61 6c 3b 0a 09 69 6e 74 20 66 6f  _retval;..int fo
243b0 75 6e 64 5f 73 65 73 73 69 6f 6e 20 3d 20 30 3b  und_session = 0;
243c0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
243d0 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
243e0 29 3b 0a 0a 09 69 66 20 28 28 66 6c 61 67 73 20  );...if ((flags 
243f0 26 20 43 4b 46 5f 53 45 52 49 41 4c 5f 53 45 53  & CKF_SERIAL_SES
24400 53 49 4f 4e 29 20 21 3d 20 43 4b 46 5f 53 45 52  SION) != CKF_SER
24410 49 41 4c 5f 53 45 53 53 49 4f 4e 29 20 7b 0a 09  IAL_SESSION) {..
24420 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
24430 49 4f 4e 5f 50 41 52 41 4c 4c 45 4c 5f 4e 4f 54  ION_PARALLEL_NOT
24440 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 09 7d 0a  _SUPPORTED);..}.
24450 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
24460 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
24470 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
24480 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
24490 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
244a0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
244b0 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
244c0 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66  ALIZED);..}...if
244d0 20 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20   (slotID < 0 || 
244e0 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f  slotID >= (sizeo
244f0 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20  f(cackey_slots) 
24500 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f  / sizeof(cackey_
24510 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09  slots[0]))) {...
24520 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
24530 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61  NTF("Error. Inva
24540 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74  lid slot request
24550 65 64 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 64  ed (%lu), outsid
24560 65 20 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 65  e of valid range
24570 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72  ", slotID);....r
24580 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49  eturn(CKR_SLOT_I
24590 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  D_INVALID);..}..
245a0 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
245b0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63  cackey_mutex_loc
245c0 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
245d0 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
245e0 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
245f0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
24600 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b  TF("Error.  Lock
24610 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
24620 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
24630 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
24640 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f  ..if (cackey_slo
24650 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76  ts[slotID].activ
24660 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  e == 0) {...CACK
24670 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
24680 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20  "Error. Invalid 
24690 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28  slot requested (
246a0 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63  %lu), slot not c
246b0 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 22  urrently active"
246c0 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61  , slotID);....ca
246d0 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
246e0 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
246f0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
24700 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44  _SLOT_ID_INVALID
24710 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 56 65 72 69 66  );..}.../* Verif
24720 79 20 74 68 61 74 20 74 68 65 20 63 61 72 64 20  y that the card 
24730 69 73 20 61 63 74 75 61 6c 6c 79 20 69 6e 20 74  is actually in t
24740 68 65 20 73 6c 6f 74 2e 20 2a 2f 0a 09 2f 2a 20  he slot. */../* 
24750 58 58 58 3a 20 43 68 65 63 6b 20 74 6f 20 6d 61  XXX: Check to ma
24760 6b 65 20 73 75 72 65 20 74 68 69 73 20 69 73 20  ke sure this is 
24770 69 6e 20 74 68 65 20 50 4b 43 53 23 31 31 20 73  in the PKCS#11 s
24780 70 65 63 69 66 69 63 61 74 69 6f 6e 20 2a 2f 0a  pecification */.
24790 09 69 66 20 28 63 61 63 6b 65 79 5f 74 6f 6b 65  .if (cackey_toke
247a0 6e 5f 70 72 65 73 65 6e 74 28 26 63 61 63 6b 65  n_present(&cacke
247b0 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 29  y_slots[slotID])
247c0 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f   != CACKEY_PCSC_
247d0 53 5f 54 4f 4b 45 4e 50 52 45 53 45 4e 54 29 20  S_TOKENPRESENT) 
247e0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
247f0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
24800 20 43 61 72 64 20 6e 6f 74 20 70 72 65 73 65 6e   Card not presen
24810 74 2e 20 20 52 65 74 75 72 6e 69 6e 67 20 43 4b  t.  Returning CK
24820 52 5f 44 45 56 49 43 45 5f 52 45 4d 4f 56 45 44  R_DEVICE_REMOVED
24830 22 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75  ");....cackey_mu
24840 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
24850 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72  y_biglock);....r
24860 65 74 75 72 6e 28 43 4b 52 5f 44 45 56 49 43 45  eturn(CKR_DEVICE
24870 5f 52 45 4d 4f 56 45 44 29 3b 0a 09 7d 0a 0a 09  _REMOVED);..}...
24880 66 6f 72 20 28 69 64 78 20 3d 20 31 3b 20 69 64  for (idx = 1; id
24890 78 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b  x < (sizeof(cack
248a0 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73  ey_sessions) / s
248b0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
248c0 73 69 6f 6e 73 5b 30 5d 29 29 3b 20 69 64 78 2b  sions[0])); idx+
248d0 2b 29 20 7b 0a 09 09 69 66 20 28 21 63 61 63 6b  +) {...if (!cack
248e0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d  ey_sessions[idx]
248f0 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 09 66 6f  .active) {....fo
24900 75 6e 64 5f 73 65 73 73 69 6f 6e 20 3d 20 31 3b  und_session = 1;
24910 0a 0a 09 09 09 2a 70 68 53 65 73 73 69 6f 6e 20  .....*phSession 
24920 3d 20 69 64 78 3b 0a 0a 09 09 09 63 61 63 6b 65  = idx;.....cacke
24930 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e  y_sessions[idx].
24940 61 63 74 69 76 65 20 3d 20 31 3b 0a 09 09 09 63  active = 1;....c
24950 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69  ackey_sessions[i
24960 64 78 5d 2e 73 6c 6f 74 49 44 20 3d 20 73 6c 6f  dx].slotID = slo
24970 74 49 44 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73  tID;....cackey_s
24980 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 73 74 61  essions[idx].sta
24990 74 65 20 3d 20 43 4b 53 5f 52 4f 5f 50 55 42 4c  te = CKS_RO_PUBL
249a0 49 43 5f 53 45 53 53 49 4f 4e 3b 0a 09 09 09 63  IC_SESSION;....c
249b0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69  ackey_sessions[i
249c0 64 78 5d 2e 66 6c 61 67 73 20 3d 20 66 6c 61 67  dx].flags = flag
249d0 73 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73  s;....cackey_ses
249e0 73 69 6f 6e 73 5b 69 64 78 5d 2e 75 6c 44 65 76  sions[idx].ulDev
249f0 69 63 65 45 72 72 6f 72 20 3d 20 30 3b 0a 09 09  iceError = 0;...
24a00 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
24a10 5b 69 64 78 5d 2e 70 41 70 70 6c 69 63 61 74 69  [idx].pApplicati
24a20 6f 6e 20 3d 20 70 41 70 70 6c 69 63 61 74 69 6f  on = pApplicatio
24a30 6e 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73  n;....cackey_ses
24a40 73 69 6f 6e 73 5b 69 64 78 5d 2e 4e 6f 74 69 66  sions[idx].Notif
24a50 79 20 3d 20 6e 6f 74 69 66 79 3b 0a 0a 09 09 09  y = notify;.....
24a60 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
24a70 69 64 78 5d 2e 69 64 65 6e 74 69 74 69 65 73 20  idx].identities 
24a80 3d 20 4e 55 4c 4c 3b 0a 09 09 09 63 61 63 6b 65  = NULL;....cacke
24a90 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e  y_sessions[idx].
24aa0 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74  identities_count
24ab0 20 3d 20 30 3b 0a 0a 09 09 09 63 61 63 6b 65 79   = 0;.....cackey
24ac0 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 73  _sessions[idx].s
24ad0 65 61 72 63 68 5f 61 63 74 69 76 65 20 3d 20 30  earch_active = 0
24ae0 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73  ;.....cackey_ses
24af0 73 69 6f 6e 73 5b 69 64 78 5d 2e 73 69 67 6e 5f  sions[idx].sign_
24b00 61 63 74 69 76 65 20 3d 20 30 3b 0a 0a 09 09 09  active = 0;.....
24b10 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
24b20 69 64 78 5d 2e 64 65 63 72 79 70 74 5f 61 63 74  idx].decrypt_act
24b30 69 76 65 20 3d 20 30 3b 0a 0a 09 09 09 63 61 63  ive = 0;.....cac
24b40 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78  key_sessions[idx
24b50 5d 2e 69 64 65 6e 74 69 74 69 65 73 20 3d 20 63  ].identities = c
24b60 61 63 6b 65 79 5f 72 65 61 64 5f 69 64 65 6e 74  ackey_read_ident
24b70 69 74 69 65 73 28 26 63 61 63 6b 65 79 5f 73 6c  ities(&cackey_sl
24b80 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c 20 26 63 61  ots[slotID], &ca
24b90 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64  ckey_sessions[id
24ba0 78 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 6f  x].identities_co
24bb0 75 6e 74 29 3b 0a 0a 0a 09 09 09 62 72 65 61 6b  unt);......break
24bc0 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 6d 75 74 65 78  ;...}..}...mutex
24bd0 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
24be0 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
24bf0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
24c00 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
24c10 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
24c20 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
24c30 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e  Error.  Unlockin
24c40 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
24c50 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
24c60 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
24c70 69 66 20 28 21 66 6f 75 6e 64 5f 73 65 73 73 69  if (!found_sessi
24c80 6f 6e 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  on) {...CACKEY_D
24c90 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
24ca0 75 72 6e 69 6e 67 20 43 4b 52 5f 53 45 53 53 49  urning CKR_SESSI
24cb0 4f 4e 5f 43 4f 55 4e 54 20 28 25 69 29 22 2c 20  ON_COUNT (%i)", 
24cc0 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 43 4f 55 4e  CKR_SESSION_COUN
24cd0 54 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  T);....return(CK
24ce0 52 5f 53 45 53 53 49 4f 4e 5f 43 4f 55 4e 54 29  R_SESSION_COUNT)
24cf0 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
24d00 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
24d10 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69  rning CKR_OK (%i
24d20 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72  )", CKR_OK);...r
24d30 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d  eturn(CKR_OK);.}
24d40 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
24d50 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 43 6c  TION(CK_RV, C_Cl
24d60 6f 73 65 53 65 73 73 69 6f 6e 29 28 43 4b 5f 53  oseSession)(CK_S
24d70 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
24d80 65 73 73 69 6f 6e 29 20 7b 0a 09 69 6e 74 20 6d  ession) {..int m
24d90 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43  utex_retval;...C
24da0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
24db0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
24dc0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
24dd0 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
24de0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
24df0 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
24e00 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
24e10 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
24e20 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
24e30 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  LIZED);..}...if 
24e40 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c  (hSession == 0 |
24e50 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73  | hSession >= (s
24e60 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
24e70 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28  sions) / sizeof(
24e80 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
24e90 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59  0]))) {...CACKEY
24ea0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
24eb0 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f  rror.  Session o
24ec0 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a  ut of range.");.
24ed0 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
24ee0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49  SESSION_HANDLE_I
24ef0 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75  NVALID);..}...mu
24f00 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
24f10 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63  key_mutex_lock(c
24f20 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
24f30 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
24f40 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
24f50 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
24f60 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67  "Error.  Locking
24f70 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
24f80 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
24f90 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69  L_ERROR);..}...i
24fa0 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69  f (!cackey_sessi
24fb0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63  ons[hSession].ac
24fc0 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79  tive) {...cackey
24fd0 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
24fe0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
24ff0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
25000 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
25010 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76  ession not activ
25020 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
25030 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41  n(CKR_SESSION_HA
25040 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
25050 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69  }...cackey_sessi
25060 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63  ons[hSession].ac
25070 74 69 76 65 20 3d 20 30 3b 0a 09 63 61 63 6b 65  tive = 0;..cacke
25080 79 5f 66 72 65 65 5f 69 64 65 6e 74 69 74 69 65  y_free_identitie
25090 73 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  s(cackey_session
250a0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e  s[hSession].iden
250b0 74 69 74 69 65 73 2c 20 63 61 63 6b 65 79 5f 73  tities, cackey_s
250c0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
250d0 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75  ].identities_cou
250e0 6e 74 29 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74  nt);...mutex_ret
250f0 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
25100 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
25110 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
25120 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
25130 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
25140 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
25150 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61  r.  Unlocking fa
25160 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
25170 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
25180 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  RROR);..}...CACK
25190 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
251a0 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
251b0 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29  K (%i)", CKR_OK)
251c0 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ;...return(CKR_O
251d0 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  K);.}..CK_DEFINE
251e0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
251f0 20 43 5f 43 6c 6f 73 65 41 6c 6c 53 65 73 73 69   C_CloseAllSessi
25200 6f 6e 73 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20  ons)(CK_SLOT_ID 
25210 73 6c 6f 74 49 44 29 20 7b 0a 09 75 69 6e 74 33  slotID) {..uint3
25220 32 5f 74 20 69 64 78 3b 0a 09 69 6e 74 20 6d 75  2_t idx;..int mu
25230 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41  tex_retval;...CA
25240 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
25250 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
25260 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
25270 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
25280 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
25290 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
252a0 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
252b0 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
252c0 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
252d0 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  IZED);..}...if (
252e0 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c  slotID < 0 || sl
252f0 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28  otID >= (sizeof(
25300 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20  cackey_slots) / 
25310 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
25320 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41  ots[0]))) {...CA
25330 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
25340 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69  F("Error. Invali
25350 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64  d slot requested
25360 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20   (%lu), outside 
25370 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c  of valid range",
25380 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74   slotID);....ret
25390 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f  urn(CKR_SLOT_ID_
253a0 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d  INVALID);..}...m
253b0 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
253c0 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28  ckey_mutex_lock(
253d0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
253e0 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
253f0 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
25400 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
25410 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e  ("Error.  Lockin
25420 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
25430 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
25440 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
25450 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  if (cackey_slots
25460 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65 20  [slotID].active 
25470 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  == 0) {...CACKEY
25480 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
25490 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c  rror. Invalid sl
254a0 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c  ot requested (%l
254b0 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72  u), slot not cur
254c0 72 65 6e 74 6c 79 20 61 63 74 69 76 65 22 2c 20  rently active", 
254d0 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b  slotID);....cack
254e0 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
254f0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
25500 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
25510 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b  LOT_ID_INVALID);
25520 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d  ..}...for (idx =
25530 20 30 3b 20 69 64 78 20 3c 20 28 73 69 7a 65 6f   0; idx < (sizeo
25540 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
25550 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
25560 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29  ey_sessions[0]))
25570 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20  ; idx++) {...if 
25580 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
25590 5b 69 64 78 5d 2e 61 63 74 69 76 65 29 20 7b 0a  [idx].active) {.
255a0 09 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65  ...if (cackey_se
255b0 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 73 6c 6f 74  ssions[idx].slot
255c0 49 44 20 21 3d 20 73 6c 6f 74 49 44 29 20 7b 0a  ID != slotID) {.
255d0 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09  ....continue;...
255e0 09 7d 0a 0a 09 09 09 63 61 63 6b 65 79 5f 6d 75  .}.....cackey_mu
255f0 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
25600 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 09 43  y_biglock);....C
25610 5f 43 6c 6f 73 65 53 65 73 73 69 6f 6e 28 69 64  _CloseSession(id
25620 78 29 3b 0a 09 09 09 63 61 63 6b 65 79 5f 6d 75  x);....cackey_mu
25630 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  tex_lock(cackey_
25640 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 7d 0a 09 7d  biglock);...}..}
25650 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
25660 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  = cackey_mutex_u
25670 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
25680 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
25690 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
256a0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
256b0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
256c0 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64  Unlocking failed
256d0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
256e0 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
256f0 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
25700 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
25710 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25  urning CKR_OK (%
25720 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09  i)", CKR_OK);...
25730 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a  return(CKR_OK);.
25740 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
25750 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47  CTION(CK_RV, C_G
25760 65 74 53 65 73 73 69 6f 6e 49 6e 66 6f 29 28 43  etSessionInfo)(C
25770 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
25780 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 53 45   hSession, CK_SE
25790 53 53 49 4f 4e 5f 49 4e 46 4f 5f 50 54 52 20 70  SSION_INFO_PTR p
257a0 49 6e 66 6f 29 20 7b 0a 09 69 6e 74 20 6d 75 74  Info) {..int mut
257b0 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43  ex_retval;...CAC
257c0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
257d0 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
257e0 66 20 28 70 49 6e 66 6f 20 3d 3d 20 4e 55 4c 4c  f (pInfo == NULL
257f0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
25800 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
25810 2e 20 70 49 6e 66 6f 20 69 73 20 4e 55 4c 4c 2e  . pInfo is NULL.
25820 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
25830 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29  R_ARGUMENTS_BAD)
25840 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b  ;..}...if (!cack
25850 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
25860 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
25870 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
25880 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
25890 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
258a0 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
258b0 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
258c0 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20  ...if (hSession 
258d0 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e  == 0 || hSession
258e0 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b   >= (sizeof(cack
258f0 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73  ey_sessions) / s
25900 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
25910 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09  sions[0]))) {...
25920 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
25930 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73  NTF("Error.  Ses
25940 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67  sion out of rang
25950 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
25960 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41  n(CKR_SESSION_HA
25970 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
25980 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  }...mutex_retval
25990 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
259a0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
259b0 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
259c0 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
259d0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
259e0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c  RINTF("Error.  L
259f0 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
25a00 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
25a10 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
25a20 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  .}...if (!cackey
25a30 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
25a40 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09  on].active) {...
25a50 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
25a60 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
25a70 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ck);....CACKEY_D
25a80 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
25a90 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74  or.  Session not
25aa0 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09   active.");.....
25ab0 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
25ac0 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
25ad0 49 44 29 3b 0a 09 7d 0a 0a 09 70 49 6e 66 6f 2d  ID);..}...pInfo-
25ae0 3e 73 6c 6f 74 49 44 20 3d 20 63 61 63 6b 65 79  >slotID = cackey
25af0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
25b00 6f 6e 5d 2e 73 6c 6f 74 49 44 3b 0a 09 70 49 6e  on].slotID;..pIn
25b10 66 6f 2d 3e 73 74 61 74 65 20 3d 20 63 61 63 6b  fo->state = cack
25b20 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
25b30 73 69 6f 6e 5d 2e 73 74 61 74 65 3b 0a 09 70 49  sion].state;..pI
25b40 6e 66 6f 2d 3e 66 6c 61 67 73 20 3d 20 63 61 63  nfo->flags = cac
25b50 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
25b60 73 73 69 6f 6e 5d 2e 66 6c 61 67 73 3b 0a 09 70  ssion].flags;..p
25b70 49 6e 66 6f 2d 3e 75 6c 44 65 76 69 63 65 45 72  Info->ulDeviceEr
25b80 72 6f 72 20 3d 20 63 61 63 6b 65 79 5f 73 65 73  ror = cackey_ses
25b90 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
25ba0 75 6c 44 65 76 69 63 65 45 72 72 6f 72 3b 0a 0a  ulDeviceError;..
25bb0 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
25bc0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
25bd0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
25be0 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
25bf0 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
25c00 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
25c10 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e  INTF("Error.  Un
25c20 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  locking failed."
25c30 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
25c40 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
25c50 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
25c60 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
25c70 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29  ning CKR_OK (%i)
25c80 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65  ", CKR_OK);...re
25c90 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a  turn(CKR_OK);.}.
25ca0 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
25cb0 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74  ION(CK_RV, C_Get
25cc0 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 65 29 28  OperationState)(
25cd0 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
25ce0 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42  E hSession, CK_B
25cf0 59 54 45 5f 50 54 52 20 70 4f 70 65 72 61 74 69  YTE_PTR pOperati
25d00 6f 6e 53 74 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e  onState, CK_ULON
25d10 47 5f 50 54 52 20 70 75 6c 4f 70 65 72 61 74 69  G_PTR pulOperati
25d20 6f 6e 53 74 61 74 65 4c 65 6e 29 20 7b 0a 09 43  onStateLen) {..C
25d30 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
25d40 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
25d50 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
25d60 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
25d70 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
25d80 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
25d90 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
25da0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
25db0 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
25dc0 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
25dd0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
25de0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
25df0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
25e00 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
25e10 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
25e20 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
25e30 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
25e40 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
25e50 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
25e60 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
25e70 53 65 74 4f 70 65 72 61 74 69 6f 6e 53 74 61 74  SetOperationStat
25e80 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  e)(CK_SESSION_HA
25e90 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
25ea0 4b 5f 42 59 54 45 5f 50 54 52 20 70 4f 70 65 72  K_BYTE_PTR pOper
25eb0 61 74 69 6f 6e 53 74 61 74 65 2c 20 43 4b 5f 55  ationState, CK_U
25ec0 4c 4f 4e 47 20 75 6c 4f 70 65 72 61 74 69 6f 6e  LONG ulOperation
25ed0 53 74 61 74 65 4c 65 6e 2c 20 43 4b 5f 4f 42 4a  StateLen, CK_OBJ
25ee0 45 43 54 5f 48 41 4e 44 4c 45 20 68 45 6e 63 72  ECT_HANDLE hEncr
25ef0 79 70 74 69 6f 6e 4b 65 79 2c 20 43 4b 5f 4f 42  yptionKey, CK_OB
25f00 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 41 75 74  JECT_HANDLE hAut
25f10 68 65 6e 74 69 63 61 74 69 6f 6e 4b 65 79 29 20  henticationKey) 
25f20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
25f30 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
25f40 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
25f50 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
25f60 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
25f70 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
25f80 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
25f90 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
25fa0 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
25fb0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
25fc0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
25fd0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
25fe0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
25ff0 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
26000 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
26010 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
26020 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
26030 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
26040 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
26050 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
26060 2c 20 5f 43 5f 4c 6f 67 69 6e 4d 75 74 65 78 41  , _C_LoginMutexA
26070 72 67 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  rg)(CK_SESSION_H
26080 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
26090 43 4b 5f 55 53 45 52 5f 54 59 50 45 20 75 73 65  CK_USER_TYPE use
260a0 72 54 79 70 65 2c 20 43 4b 5f 55 54 46 38 43 48  rType, CK_UTF8CH
260b0 41 52 5f 50 54 52 20 70 50 69 6e 2c 20 43 4b 5f  AR_PTR pPin, CK_
260c0 55 4c 4f 4e 47 20 75 6c 50 69 6e 4c 65 6e 2c 20  ULONG ulPinLen, 
260d0 69 6e 74 20 6c 6f 63 6b 5f 6d 75 74 65 78 29 20  int lock_mutex) 
260e0 7b 0a 09 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c  {..CK_SLOT_ID sl
260f0 6f 74 49 44 3b 0a 09 63 61 63 6b 65 79 5f 72 65  otID;..cackey_re
26100 74 20 67 65 74 5f 70 69 6e 5f 72 65 74 3b 0a 09  t get_pin_ret;..
26110 63 68 61 72 20 70 69 6e 62 75 66 5b 36 34 5d 3b  char pinbuf[64];
26120 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76  ..int mutex_retv
26130 61 6c 3b 0a 09 69 6e 74 20 74 72 69 65 73 5f 72  al;..int tries_r
26140 65 6d 61 69 6e 69 6e 67 3b 0a 09 69 6e 74 20 6c  emaining;..int l
26150 6f 67 69 6e 5f 72 65 74 3b 0a 0a 09 43 41 43 4b  ogin_ret;...CACK
26160 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
26170 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
26180 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
26190 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
261a0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
261b0 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
261c0 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
261d0 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
261e0 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
261f0 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53  ED);..}...if (hS
26200 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68  ession == 0 || h
26210 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65  Session >= (size
26220 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
26230 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63  ns) / sizeof(cac
26240 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29  key_sessions[0])
26250 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  )) {...CACKEY_DE
26260 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
26270 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20  r.  Session out 
26280 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a  of range.");....
26290 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53  ..return(CKR_SES
262a0 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41  SION_HANDLE_INVA
262b0 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75  LID);..}...if (u
262c0 73 65 72 54 79 70 65 20 21 3d 20 43 4b 55 5f 55  serType != CKU_U
262d0 53 45 52 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  SER) {...CACKEY_
262e0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
262f0 72 6f 72 2e 20 20 57 65 20 6f 6e 6c 79 20 73 75  ror.  We only su
26300 70 70 6f 72 74 20 55 53 45 52 20 6d 6f 64 65 2c  pport USER mode,
26310 20 61 73 6b 65 64 20 66 6f 72 20 25 6c 75 20 6d   asked for %lu m
26320 6f 64 65 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64  ode.", (unsigned
26330 20 6c 6f 6e 67 29 20 75 73 65 72 54 79 70 65 29   long) userType)
26340 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 55  ....return(CKR_U
26350 53 45 52 5f 54 59 50 45 5f 49 4e 56 41 4c 49 44  SER_TYPE_INVALID
26360 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 6c 6f 63 6b  );..}...if (lock
26370 5f 6d 75 74 65 78 29 20 7b 0a 09 09 6d 75 74 65  _mutex) {...mute
26380 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
26390 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63  y_mutex_lock(cac
263a0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 09  key_biglock);...
263b0 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
263c0 20 21 3d 20 30 29 20 7b 0a 09 09 09 43 41 43 4b   != 0) {....CACK
263d0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
263e0 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67  "Error.  Locking
263f0 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 09   failed.");.....
26400 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
26410 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 09 7d 0a 09  AL_ERROR);...}..
26420 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  }...if (!cackey_
26430 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
26440 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 69  n].active) {...i
26450 66 20 28 6c 6f 63 6b 5f 6d 75 74 65 78 29 20 7b  f (lock_mutex) {
26460 0a 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  ....cackey_mutex
26470 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
26480 69 67 6c 6f 63 6b 29 3b 0a 09 09 7d 0a 0a 09 09  iglock);...}....
26490 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
264a0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73  NTF("Error.  Ses
264b0 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e  sion not active.
264c0 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
264d0 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  CKR_SESSION_HAND
264e0 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  LE_INVALID);..}.
264f0 0a 09 73 6c 6f 74 49 44 20 3d 20 63 61 63 6b 65  ..slotID = cacke
26500 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
26510 69 6f 6e 5d 2e 73 6c 6f 74 49 44 3b 0a 0a 09 69  ion].slotID;...i
26520 66 20 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c  f (slotID < 0 ||
26530 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65   slotID >= (size
26540 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29  of(cackey_slots)
26550 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
26560 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09  _slots[0]))) {..
26570 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
26580 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76  INTF("Error. Inv
26590 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73  alid slot reques
265a0 74 65 64 20 28 25 6c 75 29 2c 20 6f 75 74 73 69  ted (%lu), outsi
265b0 64 65 20 6f 66 20 76 61 6c 69 64 20 72 61 6e 67  de of valid rang
265c0 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09  e", slotID);....
265d0 69 66 20 28 6c 6f 63 6b 5f 6d 75 74 65 78 29 20  if (lock_mutex) 
265e0 7b 0a 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65  {....cackey_mute
265f0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
26600 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 7d 0a 0a 09  biglock);...}...
26610 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
26620 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
26630 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74  .if (cackey_slot
26640 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65  s[slotID].active
26650 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   == 0) {...CACKE
26660 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
26670 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73  Error. Invalid s
26680 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25  lot requested (%
26690 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75  lu), slot not cu
266a0 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 22 2c  rrently active",
266b0 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 69 66 20   slotID);....if 
266c0 28 6c 6f 63 6b 5f 6d 75 74 65 78 29 20 7b 0a 09  (lock_mutex) {..
266d0 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
266e0 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
266f0 6c 6f 63 6b 29 3b 0a 09 09 7d 0a 0a 09 09 72 65  lock);...}....re
26700 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
26710 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66  _ERROR);..}...if
26720 20 28 63 61 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d   (cackey_pin_com
26730 6d 61 6e 64 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  mand != NULL) {.
26740 09 09 69 66 20 28 70 50 69 6e 20 21 3d 20 4e 55  ..if (pPin != NU
26750 4c 4c 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  LL) {....CACKEY_
26760 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 50 72  DEBUG_PRINTF("Pr
26770 6f 74 65 63 74 65 64 20 61 75 74 68 65 6e 74 69  otected authenti
26780 63 61 74 69 6f 6e 20 70 61 74 68 20 69 6e 20 65  cation path in e
26790 66 66 65 63 74 20 61 6e 64 20 50 49 4e 20 70 72  ffect and PIN pr
267a0 6f 76 69 64 65 64 20 21 3f 22 29 3b 0a 09 09 7d  ovided !?");...}
267b0 0a 0a 09 09 67 65 74 5f 70 69 6e 5f 72 65 74 20  ....get_pin_ret 
267c0 3d 20 63 61 63 6b 65 79 5f 67 65 74 5f 70 69 6e  = cackey_get_pin
267d0 28 70 69 6e 62 75 66 29 3b 0a 0a 09 09 69 66 20  (pinbuf);....if 
267e0 28 67 65 74 5f 70 69 6e 5f 72 65 74 20 21 3d 20  (get_pin_ret != 
267f0 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
26800 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
26810 42 55 47 5f 50 52 49 4e 54 46 28 22 63 61 63 6b  BUG_PRINTF("cack
26820 65 79 5f 67 65 74 5f 70 69 6e 28 29 20 72 65 74  ey_get_pin() ret
26830 75 72 6e 65 64 20 69 6e 20 66 61 69 6c 75 72 65  urned in failure
26840 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 65 20 50  , assuming the P
26850 49 4e 20 77 61 73 20 69 6e 63 6f 72 72 65 63 74  IN was incorrect
26860 2e 22 29 3b 0a 0a 09 09 09 69 66 20 28 6c 6f 63  .");.....if (loc
26870 6b 5f 6d 75 74 65 78 29 20 7b 0a 09 09 09 09 63  k_mutex) {.....c
26880 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
26890 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
268a0 6b 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 72 65 74  k);....}.....ret
268b0 75 72 6e 28 43 4b 52 5f 50 49 4e 5f 49 4e 43 4f  urn(CKR_PIN_INCO
268c0 52 52 45 43 54 29 3b 0a 09 09 7d 0a 0a 09 09 70  RRECT);...}....p
268d0 50 69 6e 20 3d 20 28 43 4b 5f 55 54 46 38 43 48  Pin = (CK_UTF8CH
268e0 41 52 5f 50 54 52 29 20 70 69 6e 62 75 66 3b 0a  AR_PTR) pinbuf;.
268f0 09 09 75 6c 50 69 6e 4c 65 6e 20 3d 20 73 74 72  ..ulPinLen = str
26900 6c 65 6e 28 70 69 6e 62 75 66 29 3b 0a 09 7d 0a  len(pinbuf);..}.
26910 0a 09 6c 6f 67 69 6e 5f 72 65 74 20 3d 20 63 61  ..login_ret = ca
26920 63 6b 65 79 5f 6c 6f 67 69 6e 28 26 63 61 63 6b  ckey_login(&cack
26930 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
26940 2c 20 70 50 69 6e 2c 20 75 6c 50 69 6e 4c 65 6e  , pPin, ulPinLen
26950 2c 20 26 74 72 69 65 73 5f 72 65 6d 61 69 6e 69  , &tries_remaini
26960 6e 67 2c 20 33 29 3b 0a 09 69 66 20 28 6c 6f 67  ng, 3);..if (log
26970 69 6e 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59  in_ret != CACKEY
26980 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09  _PCSC_S_OK) {...
26990 69 66 20 28 6c 6f 63 6b 5f 6d 75 74 65 78 29 20  if (lock_mutex) 
269a0 7b 0a 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65  {....cackey_mute
269b0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
269c0 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 7d 0a 0a 09  biglock);...}...
269d0 09 69 66 20 28 6c 6f 67 69 6e 5f 72 65 74 20 3d  .if (login_ret =
269e0 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  = CACKEY_PCSC_E_
269f0 4c 4f 43 4b 45 44 29 20 7b 0a 09 09 09 43 41 43  LOCKED) {....CAC
26a00 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
26a10 28 22 45 72 72 6f 72 2e 20 20 54 6f 6b 65 6e 20  ("Error.  Token 
26a20 69 73 20 6c 6f 63 6b 65 64 2e 22 29 3b 0a 0a 09  is locked.");...
26a30 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73  ..cackey_slots[s
26a40 6c 6f 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61  lotID].token_fla
26a50 67 73 20 7c 3d 20 43 4b 46 5f 55 53 45 52 5f 50  gs |= CKF_USER_P
26a60 49 4e 5f 4c 4f 43 4b 45 44 3b 0a 0a 09 09 09 43  IN_LOCKED;.....C
26a70 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
26a80 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
26a90 52 5f 50 49 4e 5f 4c 4f 43 4b 45 44 20 28 25 69  R_PIN_LOCKED (%i
26aa0 29 22 2c 20 28 69 6e 74 29 20 43 4b 52 5f 50 49  )", (int) CKR_PI
26ab0 4e 5f 4c 4f 43 4b 45 44 29 3b 0a 0a 09 09 09 72  N_LOCKED);.....r
26ac0 65 74 75 72 6e 28 43 4b 52 5f 50 49 4e 5f 4c 4f  eturn(CKR_PIN_LO
26ad0 43 4b 45 44 29 3b 0a 09 09 7d 20 65 6c 73 65 20  CKED);...} else 
26ae0 69 66 20 28 6c 6f 67 69 6e 5f 72 65 74 20 3d 3d  if (login_ret ==
26af0 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 42   CACKEY_PCSC_E_B
26b00 41 44 50 49 4e 29 20 7b 0a 09 09 09 43 41 43 4b  ADPIN) {....CACK
26b10 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
26b20 22 45 72 72 6f 72 2e 20 20 49 6e 76 61 6c 69 64  "Error.  Invalid
26b30 20 50 49 4e 2e 22 29 3b 0a 0a 09 09 09 63 61 63   PIN.");.....cac
26b40 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44  key_slots[slotID
26b50 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 7c 3d  ].token_flags |=
26b60 20 43 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 43 4f   CKF_USER_PIN_CO
26b70 55 4e 54 5f 4c 4f 57 3b 0a 0a 09 09 09 69 66 20  UNT_LOW;.....if 
26b80 28 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67  (tries_remaining
26b90 20 3d 3d 20 31 29 20 7b 0a 09 09 09 09 63 61 63   == 1) {.....cac
26ba0 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44  key_slots[slotID
26bb0 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 7c 3d  ].token_flags |=
26bc0 20 43 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 46 49   CKF_USER_PIN_FI
26bd0 4e 41 4c 5f 54 52 59 3b 0a 09 09 09 7d 0a 0a 09  NAL_TRY;....}...
26be0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
26bf0 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
26c00 20 43 4b 52 5f 50 49 4e 5f 49 4e 43 4f 52 52 45   CKR_PIN_INCORRE
26c10 43 54 20 28 25 69 29 22 2c 20 28 69 6e 74 29 20  CT (%i)", (int) 
26c20 43 4b 52 5f 50 49 4e 5f 49 4e 43 4f 52 52 45 43  CKR_PIN_INCORREC
26c30 54 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43  T);.....return(C
26c40 4b 52 5f 50 49 4e 5f 49 4e 43 4f 52 52 45 43 54  KR_PIN_INCORRECT
26c50 29 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59  );...}....CACKEY
26c60 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
26c70 72 72 6f 72 2e 20 20 55 6e 6b 6e 6f 77 6e 20 65  rror.  Unknown e
26c80 72 72 6f 72 20 72 65 74 75 72 6e 65 64 20 66 72  rror returned fr
26c90 6f 6d 20 63 61 63 6b 65 79 5f 6c 6f 67 69 6e 28  om cackey_login(
26ca0 29 20 28 25 69 29 22 2c 20 6c 6f 67 69 6e 5f 72  ) (%i)", login_r
26cb0 65 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  et);....return(C
26cc0 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
26cd0 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73  );..}...cackey_s
26ce0 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 74 6f 6b  lots[slotID].tok
26cf0 65 6e 5f 66 6c 61 67 73 20 26 3d 20 7e 28 43 4b  en_flags &= ~(CK
26d00 46 5f 55 53 45 52 5f 50 49 4e 5f 4c 4f 43 4b 45  F_USER_PIN_LOCKE
26d10 44 20 7c 20 43 4b 46 5f 55 53 45 52 5f 50 49 4e  D | CKF_USER_PIN
26d20 5f 43 4f 55 4e 54 5f 4c 4f 57 20 7c 20 43 4b 46  _COUNT_LOW | CKF
26d30 5f 4c 4f 47 49 4e 5f 52 45 51 55 49 52 45 44 20  _LOGIN_REQUIRED 
26d40 7c 20 43 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 46  | CKF_USER_PIN_F
26d50 49 4e 41 4c 5f 54 52 59 29 3b 0a 0a 09 63 61 63  INAL_TRY);...cac
26d60 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
26d70 73 73 69 6f 6e 5d 2e 73 74 61 74 65 20 3d 20 43  ssion].state = C
26d80 4b 53 5f 52 4f 5f 55 53 45 52 5f 46 55 4e 43 54  KS_RO_USER_FUNCT
26d90 49 4f 4e 53 3b 0a 0a 09 69 66 20 28 6c 6f 63 6b  IONS;...if (lock
26da0 5f 6d 75 74 65 78 29 20 7b 0a 09 09 6d 75 74 65  _mutex) {...mute
26db0 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
26dc0 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
26dd0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
26de0 09 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
26df0 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 09 43 41  al != 0) {....CA
26e00 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
26e10 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63  F("Error.  Unloc
26e20 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
26e30 0a 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
26e40 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
26e50 09 7d 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  .}..}...CACKEY_D
26e60 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
26e70 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25  urning CKR_OK (%
26e80 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09  i)", CKR_OK);...
26e90 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a  return(CKR_OK);.
26ea0 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
26eb0 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 4c  CTION(CK_RV, C_L
26ec0 6f 67 69 6e 29 28 43 4b 5f 53 45 53 53 49 4f 4e  ogin)(CK_SESSION
26ed0 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
26ee0 2c 20 43 4b 5f 55 53 45 52 5f 54 59 50 45 20 75  , CK_USER_TYPE u
26ef0 73 65 72 54 79 70 65 2c 20 43 4b 5f 55 54 46 38  serType, CK_UTF8
26f00 43 48 41 52 5f 50 54 52 20 70 50 69 6e 2c 20 43  CHAR_PTR pPin, C
26f10 4b 5f 55 4c 4f 4e 47 20 75 6c 50 69 6e 4c 65 6e  K_ULONG ulPinLen
26f20 29 20 7b 0a 09 72 65 74 75 72 6e 28 5f 43 5f 4c  ) {..return(_C_L
26f30 6f 67 69 6e 4d 75 74 65 78 41 72 67 28 68 53 65  oginMutexArg(hSe
26f40 73 73 69 6f 6e 2c 20 75 73 65 72 54 79 70 65 2c  ssion, userType,
26f50 20 70 50 69 6e 2c 20 75 6c 50 69 6e 4c 65 6e 2c   pPin, ulPinLen,
26f60 20 31 29 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49   1));.}..CK_DEFI
26f70 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
26f80 56 2c 20 43 5f 4c 6f 67 6f 75 74 29 28 43 4b 5f  V, C_Logout)(CK_
26f90 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
26fa0 53 65 73 73 69 6f 6e 29 20 7b 0a 09 43 4b 5f 53  Session) {..CK_S
26fb0 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 3b 0a 09  LOT_ID slotID;..
26fc0 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c  int mutex_retval
26fd0 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
26fe0 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
26ff0 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
27000 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
27010 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
27020 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
27030 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
27040 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
27050 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
27060 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
27070 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d  ..if (hSession =
27080 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20  = 0 || hSession 
27090 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65  >= (sizeof(cacke
270a0 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69  y_sessions) / si
270b0 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
270c0 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43  ions[0]))) {...C
270d0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
270e0 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73  TF("Error.  Sess
270f0 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65  ion out of range
27100 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
27110 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  (CKR_SESSION_HAN
27120 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  DLE_INVALID);..}
27130 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
27140 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c  = cackey_mutex_l
27150 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
27160 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
27170 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
27180 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
27190 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f  INTF("Error.  Lo
271a0 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
271b0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
271c0 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
271d0 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  }...if (!cackey_
271e0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
271f0 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63  n].active) {...c
27200 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
27210 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
27220 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  k);....CACKEY_DE
27230 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
27240 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20  r.  Session not 
27250 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09  active.");......
27260 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
27270 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  ON_HANDLE_INVALI
27280 44 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 49 44 20  D);..}...slotID 
27290 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  = cackey_session
272a0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74  s[hSession].slot
272b0 49 44 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44  ID;...if (slotID
272c0 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e   < 0 || slotID >
272d0 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  = (sizeof(cackey
272e0 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66  _slots) / sizeof
272f0 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d  (cackey_slots[0]
27300 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ))) {...CACKEY_D
27310 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
27320 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74  or. Invalid slot
27330 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29   requested (%lu)
27340 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 76 61 6c  , outside of val
27350 69 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49  id range", slotI
27360 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  D);....return(CK
27370 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
27380 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65  ;..}...if (cacke
27390 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e  y_slots[slotID].
273a0 61 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09  active == 0) {..
273b0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
273c0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76  INTF("Error. Inv
273d0 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73  alid slot reques
273e0 74 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20  ted (%lu), slot 
273f0 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61 63  not currently ac
27400 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a  tive", slotID);.
27410 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
27420 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
27430 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72  glock);....retur
27440 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
27450 52 4f 52 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65  ROR);..}...cacke
27460 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
27470 69 6f 6e 5d 2e 73 74 61 74 65 20 3d 20 43 4b 53  ion].state = CKS
27480 5f 52 4f 5f 50 55 42 4c 49 43 5f 53 45 53 53 49  _RO_PUBLIC_SESSI
27490 4f 4e 3b 0a 0a 09 69 66 20 28 63 61 63 6b 65 79  ON;...if (cackey
274a0 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20 3d 3d 20  _pin_command == 
274b0 4e 55 4c 4c 29 20 7b 0a 09 09 63 61 63 6b 65 79  NULL) {...cackey
274c0 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 74  _slots[slotID].t
274d0 6f 6b 65 6e 5f 66 6c 61 67 73 20 3d 20 43 4b 46  oken_flags = CKF
274e0 5f 4c 4f 47 49 4e 5f 52 45 51 55 49 52 45 44 3b  _LOGIN_REQUIRED;
274f0 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 63 61 63  ..} else {...cac
27500 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44  key_slots[slotID
27510 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 3d 20  ].token_flags = 
27520 30 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65  0;..}...mutex_re
27530 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
27540 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
27550 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
27560 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
27570 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
27580 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
27590 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66  or.  Unlocking f
275a0 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
275b0 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
275c0 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43  ERROR);..}...CAC
275d0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
275e0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
275f0 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b  OK (%i)", CKR_OK
27600 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
27610 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  OK);.}..CK_DEFIN
27620 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
27630 2c 20 43 5f 43 72 65 61 74 65 4f 62 6a 65 63 74  , C_CreateObject
27640 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
27650 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
27660 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52 20 70  _ATTRIBUTE_PTR p
27670 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f  Template, CK_ULO
27680 4e 47 20 75 6c 43 6f 75 6e 74 2c 20 43 4b 5f 4f  NG ulCount, CK_O
27690 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52  BJECT_HANDLE_PTR
276a0 20 70 68 4f 62 6a 65 63 74 29 20 7b 0a 09 43 41   phObject) {..CA
276b0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
276c0 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
276d0 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
276e0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
276f0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
27700 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
27710 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
27720 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
27730 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
27740 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
27750 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
27760 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
27770 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
27780 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
27790 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
277a0 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
277b0 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
277c0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
277d0 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
277e0 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 43  CTION(CK_RV, C_C
277f0 6f 70 79 4f 62 6a 65 63 74 29 28 43 4b 5f 53 45  opyObject)(CK_SE
27800 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
27810 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54  ssion, CK_OBJECT
27820 5f 48 41 4e 44 4c 45 20 68 4f 62 6a 65 63 74 2c  _HANDLE hObject,
27830 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54   CK_ATTRIBUTE_PT
27840 52 20 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f  R pTemplate, CK_
27850 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e 74 2c 20 43  ULONG ulCount, C
27860 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f  K_OBJECT_HANDLE_
27870 50 54 52 20 70 68 4e 65 77 4f 62 6a 65 63 74 29  PTR phNewObject)
27880 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
27890 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
278a0 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
278b0 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
278c0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
278d0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
278e0 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
278f0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
27900 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
27910 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
27920 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
27930 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
27940 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
27950 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
27960 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
27970 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
27980 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
27990 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
279a0 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  TED);.}..CK_DEFI
279b0 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
279c0 56 2c 20 43 5f 44 65 73 74 72 6f 79 4f 62 6a 65  V, C_DestroyObje
279d0 63 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  ct)(CK_SESSION_H
279e0 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
279f0 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45  CK_OBJECT_HANDLE
27a00 20 68 4f 62 6a 65 63 74 29 20 7b 0a 09 43 41 43   hObject) {..CAC
27a10 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
27a20 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
27a30 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
27a40 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
27a50 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
27a60 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
27a70 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
27a80 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
27a90 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
27aa0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
27ab0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
27ac0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
27ad0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
27ae0 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
27af0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
27b00 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
27b10 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
27b20 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
27b30 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
27b40 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65  TION(CK_RV, C_Ge
27b50 74 4f 62 6a 65 63 74 53 69 7a 65 29 28 43 4b 5f  tObjectSize)(CK_
27b60 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
27b70 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45  Session, CK_OBJE
27b80 43 54 5f 48 41 4e 44 4c 45 20 68 4f 62 6a 65 63  CT_HANDLE hObjec
27b90 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20  t, CK_ULONG_PTR 
27ba0 70 75 6c 53 69 7a 65 29 20 7b 0a 09 43 41 43 4b  pulSize) {..CACK
27bb0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
27bc0 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
27bd0 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
27be0 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
27bf0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
27c00 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
27c10 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
27c20 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
27c30 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
27c40 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
27c50 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
27c60 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
27c70 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
27c80 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
27c90 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
27ca0 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
27cb0 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
27cc0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
27cd0 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
27ce0 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74  ION(CK_RV, C_Get
27cf0 41 74 74 72 69 62 75 74 65 56 61 6c 75 65 29 28  AttributeValue)(
27d00 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
27d10 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f  E hSession, CK_O
27d20 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4f 62  BJECT_HANDLE hOb
27d30 6a 65 63 74 2c 20 43 4b 5f 41 54 54 52 49 42 55  ject, CK_ATTRIBU
27d40 54 45 5f 50 54 52 20 70 54 65 6d 70 6c 61 74 65  TE_PTR pTemplate
27d50 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f 75  , CK_ULONG ulCou
27d60 6e 74 29 20 7b 0a 09 43 4b 5f 41 54 54 52 49 42  nt) {..CK_ATTRIB
27d70 55 54 45 20 2a 63 75 72 72 5f 61 74 74 72 3b 0a  UTE *curr_attr;.
27d80 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69  .struct cackey_i
27d90 64 65 6e 74 69 74 79 20 2a 69 64 65 6e 74 69 74  dentity *identit
27da0 79 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  y;..unsigned lon
27db0 67 20 69 64 65 6e 74 69 74 79 5f 69 64 78 2c 20  g identity_idx, 
27dc0 61 74 74 72 5f 69 64 78 2c 20 73 65 73 73 5f 61  attr_idx, sess_a
27dd0 74 74 72 5f 69 64 78 2c 20 6e 75 6d 5f 69 64 73  ttr_idx, num_ids
27de0 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74  ;..int mutex_ret
27df0 76 61 6c 3b 0a 09 43 4b 5f 52 56 20 72 65 74 76  val;..CK_RV retv
27e00 61 6c 20 3d 20 43 4b 52 5f 4f 4b 3b 0a 09 43 4b  al = CKR_OK;..CK
27e10 5f 56 4f 49 44 5f 50 54 52 20 70 56 61 6c 75 65  _VOID_PTR pValue
27e20 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 75 6c 56 61  ;..CK_ULONG ulVa
27e30 6c 75 65 4c 65 6e 3b 0a 0a 09 43 41 43 4b 45 59  lueLen;...CACKEY
27e40 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
27e50 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
27e60 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
27e70 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
27e80 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
27e90 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
27ea0 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
27eb0 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
27ec0 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
27ed0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73  );..}...if (hSes
27ee0 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65  sion == 0 || hSe
27ef0 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66  ssion >= (sizeof
27f00 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
27f10 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
27f20 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29  y_sessions[0])))
27f30 20 7b 0a 09 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 45 72 72 6f 72 2e  G_PRINTF("Error.
27f50 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66    Session out of
27f60 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09   range.");......
27f70 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
27f80 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  ON_HANDLE_INVALI
27f90 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 4f 62  D);..}...if (hOb
27fa0 6a 65 63 74 20 3d 3d 20 30 29 20 7b 0a 09 09 43  ject == 0) {...C
27fb0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
27fc0 54 46 28 22 45 72 72 6f 72 2e 20 20 4f 62 6a 65  TF("Error.  Obje
27fd0 63 74 20 68 61 6e 64 6c 65 20 6f 75 74 20 6f 66  ct handle out of
27fe0 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09   range.");......
27ff0 72 65 74 75 72 6e 28 43 4b 52 5f 4f 42 4a 45 43  return(CKR_OBJEC
28000 54 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44  T_HANDLE_INVALID
28010 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 6c 43 6f  );..}...if (ulCo
28020 75 6e 74 20 3d 3d 20 30 29 20 7b 0a 09 09 2f 2a  unt == 0) {.../*
28030 20 53 68 6f 72 74 20 63 69 72 63 75 69 74 2c 20   Short circuit, 
28040 69 66 20 7a 65 72 6f 20 6f 62 6a 65 63 74 73 20  if zero objects 
28050 77 65 72 65 20 73 70 65 63 69 66 69 65 64 20 72  were specified r
28060 65 74 75 72 6e 20 7a 65 72 6f 20 69 74 65 6d 73  eturn zero items
28070 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 2a 2f 0a   immediately */.
28080 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
28090 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
280a0 20 43 4b 52 5f 4f 4b 20 28 25 69 29 20 28 73 68   CKR_OK (%i) (sh
280b0 6f 72 74 20 63 69 72 63 75 69 74 29 22 2c 20 43  ort circuit)", C
280c0 4b 52 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74 75 72  KR_OK);....retur
280d0 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09  n(CKR_OK);..}...
280e0 69 66 20 28 70 54 65 6d 70 6c 61 74 65 20 3d 3d  if (pTemplate ==
280f0 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
28100 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
28110 45 72 72 6f 72 2e 20 20 70 54 65 6d 70 6c 61 74  Error.  pTemplat
28120 65 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09  e is NULL.");...
28130 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55  .return(CKR_ARGU
28140 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a  MENTS_BAD);..}..
28150 09 69 64 65 6e 74 69 74 79 5f 69 64 78 20 3d 20  .identity_idx = 
28160 68 4f 62 6a 65 63 74 20 2d 20 31 3b 0a 0a 09 6d  hObject - 1;...m
28170 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
28180 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28  ckey_mutex_lock(
28190 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
281a0 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
281b0 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
281c0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
281d0 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e  ("Error.  Lockin
281e0 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
281f0 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
28200 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
28210 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73  if (!cackey_sess
28220 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61  ions[hSession].a
28230 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65  ctive) {...cacke
28240 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
28250 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
28260 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
28270 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
28280 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69  Session not acti
28290 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ve.");......retu
282a0 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48  rn(CKR_SESSION_H
282b0 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a  ANDLE_INVALID);.
282c0 09 7d 0a 0a 09 6e 75 6d 5f 69 64 73 20 3d 20 63  .}...num_ids = c
282d0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
282e0 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74  Session].identit
282f0 69 65 73 5f 63 6f 75 6e 74 3b 0a 0a 09 69 66 20  ies_count;...if 
28300 28 69 64 65 6e 74 69 74 79 5f 69 64 78 20 3e 3d  (identity_idx >=
28310 20 6e 75 6d 5f 69 64 73 29 20 7b 0a 09 09 63 61   num_ids) {...ca
28320 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
28330 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
28340 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  );....CACKEY_DEB
28350 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
28360 2e 20 20 4f 62 6a 65 63 74 20 68 61 6e 64 6c 65  .  Object handle
28370 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 20 20   out of range.  
28380 69 64 65 6e 74 69 74 79 5f 69 64 78 20 3d 20 25  identity_idx = %
28390 6c 75 2c 20 6e 75 6d 5f 69 64 73 20 3d 20 25 6c  lu, num_ids = %l
283a0 75 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  u.", (unsigned l
283b0 6f 6e 67 29 20 69 64 65 6e 74 69 74 79 5f 69 64  ong) identity_id
283c0 78 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  x, (unsigned lon
283d0 67 29 20 6e 75 6d 5f 69 64 73 29 3b 0a 0a 09 09  g) num_ids);....
283e0 72 65 74 75 72 6e 28 43 4b 52 5f 4f 42 4a 45 43  return(CKR_OBJEC
283f0 54 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44  T_HANDLE_INVALID
28400 29 3b 0a 09 7d 0a 0a 09 69 64 65 6e 74 69 74 79  );..}...identity
28410 20 3d 20 26 63 61 63 6b 65 79 5f 73 65 73 73 69   = &cackey_sessi
28420 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64  ons[hSession].id
28430 65 6e 74 69 74 69 65 73 5b 69 64 65 6e 74 69 74  entities[identit
28440 79 5f 69 64 78 5d 3b 0a 0a 09 66 6f 72 20 28 61  y_idx];...for (a
28450 74 74 72 5f 69 64 78 20 3d 20 30 3b 20 61 74 74  ttr_idx = 0; att
28460 72 5f 69 64 78 20 3c 20 75 6c 43 6f 75 6e 74 3b  r_idx < ulCount;
28470 20 61 74 74 72 5f 69 64 78 2b 2b 29 20 7b 0a 09   attr_idx++) {..
28480 09 63 75 72 72 5f 61 74 74 72 20 3d 20 26 70 54  .curr_attr = &pT
28490 65 6d 70 6c 61 74 65 5b 61 74 74 72 5f 69 64 78  emplate[attr_idx
284a0 5d 3b 0a 0a 09 09 70 56 61 6c 75 65 20 3d 20 4e  ];....pValue = N
284b0 55 4c 4c 3b 0a 09 09 75 6c 56 61 6c 75 65 4c 65  ULL;...ulValueLe
284c0 6e 20 3d 20 28 43 4b 5f 4c 4f 4e 47 29 20 2d 31  n = (CK_LONG) -1
284d0 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  ;....CACKEY_DEBU
284e0 47 5f 50 52 49 4e 54 46 28 22 4c 6f 6f 6b 69 6e  G_PRINTF("Lookin
284f0 67 20 66 6f 72 20 61 74 74 72 69 62 75 74 65 20  g for attribute 
28500 30 78 25 30 38 6c 78 20 28 69 64 65 6e 74 69 74  0x%08lx (identit
28510 79 3a 25 6c 75 29 20 2e 2e 2e 22 2c 20 28 75 6e  y:%lu) ...", (un
28520 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72  signed long) cur
28530 72 5f 61 74 74 72 2d 3e 74 79 70 65 2c 20 28 75  r_attr->type, (u
28540 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 69 64  nsigned long) id
28550 65 6e 74 69 74 79 5f 69 64 78 29 3b 0a 0a 09 09  entity_idx);....
28560 66 6f 72 20 28 73 65 73 73 5f 61 74 74 72 5f 69  for (sess_attr_i
28570 64 78 20 3d 20 30 3b 20 73 65 73 73 5f 61 74 74  dx = 0; sess_att
28580 72 5f 69 64 78 20 3c 20 69 64 65 6e 74 69 74 79  r_idx < identity
28590 2d 3e 61 74 74 72 69 62 75 74 65 73 5f 63 6f 75  ->attributes_cou
285a0 6e 74 3b 20 73 65 73 73 5f 61 74 74 72 5f 69 64  nt; sess_attr_id
285b0 78 2b 2b 29 20 7b 0a 09 09 09 69 66 20 28 69 64  x++) {....if (id
285c0 65 6e 74 69 74 79 2d 3e 61 74 74 72 69 62 75 74  entity->attribut
285d0 65 73 5b 73 65 73 73 5f 61 74 74 72 5f 69 64 78  es[sess_attr_idx
285e0 5d 2e 74 79 70 65 20 3d 3d 20 63 75 72 72 5f 61  ].type == curr_a
285f0 74 74 72 2d 3e 74 79 70 65 29 20 7b 0a 09 09 09  ttr->type) {....
28600 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
28610 49 4e 54 46 28 22 20 2e 2e 2e 20 66 6f 75 6e 64  INTF(" ... found
28620 20 69 74 2c 20 70 56 61 6c 75 65 20 3d 20 25 70   it, pValue = %p
28630 2c 20 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 25  , ulValueLen = %
28640 6c 75 22 2c 20 69 64 65 6e 74 69 74 79 2d 3e 61  lu", identity->a
28650 74 74 72 69 62 75 74 65 73 5b 73 65 73 73 5f 61  ttributes[sess_a
28660 74 74 72 5f 69 64 78 5d 2e 70 56 61 6c 75 65 2c  ttr_idx].pValue,
28670 20 69 64 65 6e 74 69 74 79 2d 3e 61 74 74 72 69   identity->attri
28680 62 75 74 65 73 5b 73 65 73 73 5f 61 74 74 72 5f  butes[sess_attr_
28690 69 64 78 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e 29  idx].ulValueLen)
286a0 3b 0a 09 09 09 09 0a 09 09 09 09 70 56 61 6c 75  ;..........pValu
286b0 65 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e 61 74  e = identity->at
286c0 74 72 69 62 75 74 65 73 5b 73 65 73 73 5f 61 74  tributes[sess_at
286d0 74 72 5f 69 64 78 5d 2e 70 56 61 6c 75 65 3b 0a  tr_idx].pValue;.
286e0 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ....ulValueLen =
286f0 20 69 64 65 6e 74 69 74 79 2d 3e 61 74 74 72 69   identity->attri
28700 62 75 74 65 73 5b 73 65 73 73 5f 61 74 74 72 5f  butes[sess_attr_
28710 69 64 78 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e 3b  idx].ulValueLen;
28720 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 69 66 20  ....}...}....if 
28730 28 63 75 72 72 5f 61 74 74 72 2d 3e 70 56 61 6c  (curr_attr->pVal
28740 75 65 20 26 26 20 70 56 61 6c 75 65 29 20 7b 0a  ue && pValue) {.
28750 09 09 09 69 66 20 28 63 75 72 72 5f 61 74 74 72  ...if (curr_attr
28760 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 20 3e 3d 20  ->ulValueLen >= 
28770 75 6c 56 61 6c 75 65 4c 65 6e 29 20 7b 0a 09 09  ulValueLen) {...
28780 09 09 6d 65 6d 63 70 79 28 63 75 72 72 5f 61 74  ..memcpy(curr_at
28790 74 72 2d 3e 70 56 61 6c 75 65 2c 20 70 56 61 6c  tr->pValue, pVal
287a0 75 65 2c 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b  ue, ulValueLen);
287b0 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ....} else {....
287c0 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 28 43  .ulValueLen = (C
287d0 4b 5f 4c 4f 4e 47 29 20 2d 31 3b 0a 0a 09 09 09  K_LONG) -1;.....
287e0 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 42 55  .retval = CKR_BU
287f0 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 3b 0a  FFER_TOO_SMALL;.
28800 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 63 75 72 72  ...}...}....curr
28810 5f 61 74 74 72 2d 3e 75 6c 56 61 6c 75 65 4c 65  _attr->ulValueLe
28820 6e 20 3d 20 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a  n = ulValueLen;.
28830 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  .}...mutex_retva
28840 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
28850 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
28860 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
28870 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
28880 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
28890 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
288a0 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c    Unlocking fail
288b0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
288c0 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
288d0 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 72 65  OR);..}...if (re
288e0 74 76 61 6c 20 3d 3d 20 43 4b 52 5f 41 54 54 52  tval == CKR_ATTR
288f0 49 42 55 54 45 5f 54 59 50 45 5f 49 4e 56 41 4c  IBUTE_TYPE_INVAL
28900 49 44 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ID) {...CACKEY_D
28910 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
28920 75 72 6e 69 6e 67 20 43 4b 52 5f 41 54 54 52 49  urning CKR_ATTRI
28930 42 55 54 45 5f 54 59 50 45 5f 49 4e 56 41 4c 49  BUTE_TYPE_INVALI
28940 44 20 28 25 69 29 22 2c 20 28 69 6e 74 29 20 72  D (%i)", (int) r
28950 65 74 76 61 6c 29 3b 0a 09 7d 20 65 6c 73 65 20  etval);..} else 
28960 69 66 20 28 72 65 74 76 61 6c 20 3d 3d 20 43 4b  if (retval == CK
28970 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41  R_BUFFER_TOO_SMA
28980 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
28990 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
289a0 75 72 6e 69 6e 67 20 43 4b 52 5f 42 55 46 46 45  urning CKR_BUFFE
289b0 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 20 28 25 69 29  R_TOO_SMALL (%i)
289c0 22 2c 20 28 69 6e 74 29 20 72 65 74 76 61 6c 29  ", (int) retval)
289d0 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 72 65  ;..} else if (re
289e0 74 76 61 6c 20 3d 3d 20 43 4b 52 5f 4f 4b 29 20  tval == CKR_OK) 
289f0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
28a00 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
28a10 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c  ng CKR_OK (%i)",
28a20 20 28 69 6e 74 29 20 72 65 74 76 61 6c 29 3b 0a   (int) retval);.
28a30 09 7d 20 65 6c 73 65 20 7b 0a 09 09 43 41 43 4b  .} else {...CACK
28a40 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
28a50 22 52 65 74 75 72 6e 69 6e 67 20 25 69 22 2c 20  "Returning %i", 
28a60 28 69 6e 74 29 20 72 65 74 76 61 6c 29 3b 0a 09  (int) retval);..
28a70 7d 0a 0a 09 72 65 74 75 72 6e 28 72 65 74 76 61  }...return(retva
28a80 6c 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  l);.}..CK_DEFINE
28a90 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
28aa0 20 43 5f 53 65 74 41 74 74 72 69 62 75 74 65 56   C_SetAttributeV
28ab0 61 6c 75 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e  alue)(CK_SESSION
28ac0 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
28ad0 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44  , CK_OBJECT_HAND
28ae0 4c 45 20 68 4f 62 6a 65 63 74 2c 20 43 4b 5f 41  LE hObject, CK_A
28af0 54 54 52 49 42 55 54 45 5f 50 54 52 20 70 54 65  TTRIBUTE_PTR pTe
28b00 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47  mplate, CK_ULONG
28b10 20 75 6c 43 6f 75 6e 74 29 20 7b 0a 09 43 41 43   ulCount) {..CAC
28b20 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
28b30 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
28b40 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
28b50 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
28b60 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
28b70 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
28b80 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
28b90 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
28ba0 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
28bb0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
28bc0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
28bd0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
28be0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
28bf0 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
28c00 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
28c10 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
28c20 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
28c30 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
28c40 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
28c50 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 46 69  TION(CK_RV, C_Fi
28c60 6e 64 4f 62 6a 65 63 74 73 49 6e 69 74 29 28 43  ndObjectsInit)(C
28c70 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
28c80 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 41 54   hSession, CK_AT
28c90 54 52 49 42 55 54 45 5f 50 54 52 20 70 54 65 6d  TRIBUTE_PTR pTem
28ca0 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20  plate, CK_ULONG 
28cb0 75 6c 43 6f 75 6e 74 29 20 7b 0a 09 43 4b 5f 53  ulCount) {..CK_S
28cc0 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 3b 0a 09  LOT_ID slotID;..
28cd0 43 4b 5f 55 4c 4f 4e 47 20 69 64 78 3b 0a 09 69  CK_ULONG idx;..i
28ce0 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b  nt mutex_retval;
28cf0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
28d00 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
28d10 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
28d20 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
28d30 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
28d40 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
28d50 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
28d60 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
28d70 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
28d80 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
28d90 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d  .if (hSession ==
28da0 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e   0 || hSession >
28db0 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  = (sizeof(cackey
28dc0 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a  _sessions) / siz
28dd0 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
28de0 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41  ons[0]))) {...CA
28df0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
28e00 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69  F("Error.  Sessi
28e10 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e  on out of range.
28e20 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
28e30 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  CKR_SESSION_HAND
28e40 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  LE_INVALID);..}.
28e50 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
28e60 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f   cackey_mutex_lo
28e70 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
28e80 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
28e90 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
28ea0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
28eb0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63  NTF("Error.  Loc
28ec0 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
28ed0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
28ee0 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
28ef0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73  ...if (!cackey_s
28f00 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
28f10 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61  ].active) {...ca
28f20 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
28f30 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
28f40 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  );....CACKEY_DEB
28f50 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
28f60 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61  .  Session not a
28f70 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72  ctive.");......r
28f80 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f  eturn(CKR_SESSIO
28f90 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44  N_HANDLE_INVALID
28fa0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b  );..}...if (cack
28fb0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
28fc0 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 61 63 74  sion].search_act
28fd0 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  ive) {...cackey_
28fe0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
28ff0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
29000 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
29010 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65  INTF("Error.  Se
29020 61 72 63 68 20 61 6c 72 65 61 64 79 20 61 63 74  arch already act
29030 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  ive.");......ret
29040 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f  urn(CKR_OPERATIO
29050 4e 5f 41 43 54 49 56 45 29 3b 0a 09 7d 0a 0a 09  N_ACTIVE);..}...
29060 73 6c 6f 74 49 44 20 3d 20 63 61 63 6b 65 79 5f  slotID = cackey_
29070 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
29080 6e 5d 2e 73 6c 6f 74 49 44 3b 0a 0a 09 69 66 20  n].slotID;...if 
29090 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73  (slotID < 0 || s
290a0 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66  lotID >= (sizeof
290b0 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f  (cackey_slots) /
290c0 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73   sizeof(cackey_s
290d0 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43  lots[0]))) {...C
290e0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
290f0 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c  TF("Error. Inval
29100 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65  id slot requeste
29110 64 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 65  d (%lu), outside
29120 20 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 65 22   of valid range"
29130 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65  , slotID);....re
29140 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
29150 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66  _ERROR);..}...if
29160 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73   (cackey_slots[s
29170 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d  lotID].active ==
29180 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
29190 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
291a0 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74  or. Invalid slot
291b0 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29   requested (%lu)
291c0 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65  , slot not curre
291d0 6e 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c  ntly active", sl
291e0 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79  otID);....cackey
291f0 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
29200 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
29210 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
29220 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
29230 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f  ..if (cackey_slo
29240 74 73 5b 73 6c 6f 74 49 44 5d 2e 73 6c 6f 74 5f  ts[slotID].slot_
29250 72 65 73 65 74 29 20 7b 0a 09 09 43 41 43 4b 45  reset) {...CACKE
29260 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
29270 54 68 65 20 73 6c 6f 74 20 68 61 73 20 62 65 65  The slot has bee
29280 6e 20 72 65 73 65 74 20 73 69 6e 63 65 20 77 65  n reset since we
29290 20 6c 61 73 74 20 6c 6f 6f 6b 65 64 20 66 6f 72   last looked for
292a0 20 69 64 65 6e 74 69 74 69 65 73 20 2d 2d 20 72   identities -- r
292b0 65 73 63 61 6e 6e 69 6e 67 22 29 3b 0a 0a 09 09  escanning");....
292c0 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69  if (cackey_sessi
292d0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64  ons[hSession].id
292e0 65 6e 74 69 74 69 65 73 20 21 3d 20 4e 55 4c 4c  entities != NULL
292f0 29 20 7b 0a 09 09 09 63 61 63 6b 65 79 5f 66 72  ) {....cackey_fr
29300 65 65 5f 69 64 65 6e 74 69 74 69 65 73 28 63 61  ee_identities(ca
29310 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
29320 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69  ession].identiti
29330 65 73 2c 20 63 61 63 6b 65 79 5f 73 65 73 73 69  es, cackey_sessi
29340 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64  ons[hSession].id
29350 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 29 3b  entities_count);
29360 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73  .....cackey_sess
29370 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69  ions[hSession].i
29380 64 65 6e 74 69 74 69 65 73 20 3d 20 4e 55 4c 4c  dentities = NULL
29390 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73  ;....cackey_sess
293a0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69  ions[hSession].i
293b0 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 20  dentities_count 
293c0 3d 20 30 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28  = 0;...}....if (
293d0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f  cackey_slots[slo
293e0 74 49 44 5d 2e 6c 61 62 65 6c 20 21 3d 20 4e 55  tID].label != NU
293f0 4c 4c 29 20 7b 0a 09 09 09 66 72 65 65 28 63 61  LL) {....free(ca
29400 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
29410 44 5d 2e 6c 61 62 65 6c 29 3b 0a 09 09 09 63 61  D].label);....ca
29420 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
29430 44 5d 2e 6c 61 62 65 6c 20 3d 20 4e 55 4c 4c 3b  D].label = NULL;
29440 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 6d  ...}....cackey_m
29450 61 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74 28 26  ark_slot_reset(&
29460 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f  cackey_slots[slo
29470 74 49 44 5d 29 3b 0a 09 09 63 61 63 6b 65 79 5f  tID]);...cackey_
29480 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 73 6c  slots[slotID].sl
29490 6f 74 5f 72 65 73 65 74 20 3d 20 30 3b 0a 09 7d  ot_reset = 0;..}
294a0 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65  ...if (cackey_se
294b0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
294c0 2e 69 64 65 6e 74 69 74 69 65 73 20 3d 3d 20 4e  .identities == N
294d0 55 4c 4c 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  ULL) {...cackey_
294e0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
294f0 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 20 3d 20  n].identities = 
29500 63 61 63 6b 65 79 5f 72 65 61 64 5f 69 64 65 6e  cackey_read_iden
29510 74 69 74 69 65 73 28 26 63 61 63 6b 65 79 5f 73  tities(&cackey_s
29520 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c 20 26 63  lots[slotID], &c
29530 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
29540 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74  Session].identit
29550 69 65 73 5f 63 6f 75 6e 74 29 3b 0a 09 7d 0a 0a  ies_count);..}..
29560 09 69 66 20 28 70 54 65 6d 70 6c 61 74 65 20 21  .if (pTemplate !
29570 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 69 66 20 28  = NULL) {...if (
29580 75 6c 43 6f 75 6e 74 20 21 3d 20 30 29 20 7b 0a  ulCount != 0) {.
29590 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
295a0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61  ns[hSession].sea
295b0 72 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74 20  rch_query_count 
295c0 3d 20 75 6c 43 6f 75 6e 74 3b 0a 09 09 09 63 61  = ulCount;....ca
295d0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
295e0 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71  ession].search_q
295f0 75 65 72 79 20 3d 20 6d 61 6c 6c 6f 63 28 75 6c  uery = malloc(ul
29600 43 6f 75 6e 74 20 2a 20 73 69 7a 65 6f 66 28 2a  Count * sizeof(*
29610 70 54 65 6d 70 6c 61 74 65 29 29 3b 0a 0a 09 09  pTemplate));....
29620 09 6d 65 6d 63 70 79 28 63 61 63 6b 65 79 5f 73  .memcpy(cackey_s
29630 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
29640 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 2c 20  ].search_query, 
29650 70 54 65 6d 70 6c 61 74 65 2c 20 75 6c 43 6f 75  pTemplate, ulCou
29660 6e 74 20 2a 20 73 69 7a 65 6f 66 28 2a 70 54 65  nt * sizeof(*pTe
29670 6d 70 6c 61 74 65 29 29 3b 0a 09 09 09 66 6f 72  mplate));....for
29680 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c   (idx = 0; idx <
29690 20 75 6c 43 6f 75 6e 74 3b 20 69 64 78 2b 2b 29   ulCount; idx++)
296a0 20 7b 0a 09 09 09 09 69 66 20 28 70 54 65 6d 70   {.....if (pTemp
296b0 6c 61 74 65 5b 69 64 78 5d 2e 75 6c 56 61 6c 75  late[idx].ulValu
296c0 65 4c 65 6e 20 3d 3d 20 30 29 20 7b 0a 09 09 09  eLen == 0) {....
296d0 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
296e0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72  s[hSession].sear
296f0 63 68 5f 71 75 65 72 79 5b 69 64 78 5d 2e 70 56  ch_query[idx].pV
29700 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09  alue = NULL;....
29710 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09  ...continue;....
29720 09 7d 0a 0a 09 09 09 09 63 61 63 6b 65 79 5f 73  .}......cackey_s
29730 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
29740 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5b 69  ].search_query[i
29750 64 78 5d 2e 70 56 61 6c 75 65 20 3d 20 6d 61 6c  dx].pValue = mal
29760 6c 6f 63 28 70 54 65 6d 70 6c 61 74 65 5b 69 64  loc(pTemplate[id
29770 78 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a  x].ulValueLen);.
29780 0a 09 09 09 09 69 66 20 28 63 61 63 6b 65 79 5f  .....if (cackey_
29790 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
297a0 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5b  n].search_query[
297b0 69 64 78 5d 2e 70 56 61 6c 75 65 29 20 7b 0a 09  idx].pValue) {..
297c0 09 09 09 09 6d 65 6d 63 70 79 28 63 61 63 6b 65  ....memcpy(cacke
297d0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
297e0 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72  ion].search_quer
297f0 79 5b 69 64 78 5d 2e 70 56 61 6c 75 65 2c 20 70  y[idx].pValue, p
29800 54 65 6d 70 6c 61 74 65 5b 69 64 78 5d 2e 70 56  Template[idx].pV
29810 61 6c 75 65 2c 20 70 54 65 6d 70 6c 61 74 65 5b  alue, pTemplate[
29820 69 64 78 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e 29  idx].ulValueLen)
29830 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 09 09 7d  ;.....}....}...}
29840 20 65 6c 73 65 20 7b 0a 09 09 09 63 61 63 6b 65   else {....cacke
29850 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
29860 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72  ion].search_quer
29870 79 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 09 09 09  y_count = 0;....
29880 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
29890 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68  hSession].search
298a0 5f 71 75 65 72 79 20 3d 20 4e 55 4c 4c 3b 0a 09  _query = NULL;..
298b0 09 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69  .}..} else {...i
298c0 66 20 28 75 6c 43 6f 75 6e 74 20 21 3d 20 30 29  f (ulCount != 0)
298d0 20 7b 0a 09 09 09 63 61 63 6b 65 79 5f 6d 75 74   {....cackey_mut
298e0 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
298f0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 09 43  _biglock);.....C
29900 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
29910 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 61 72  TF("Error.  Sear
29920 63 68 20 71 75 65 72 79 20 73 70 65 63 69 66 69  ch query specifi
29930 65 64 20 61 73 20 4e 55 4c 4c 2c 20 62 75 74 20  ed as NULL, but 
29940 6e 75 6d 62 65 72 20 6f 66 20 71 75 65 72 79 20  number of query 
29950 74 65 72 6d 73 20 6e 6f 74 20 73 70 65 63 69 66  terms not specif
29960 69 65 64 20 61 73 20 30 2e 22 29 3b 0a 0a 09 09  ied as 0.");....
29970 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55  .return(CKR_ARGU
29980 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 09 7d 0a  MENTS_BAD);...}.
29990 0a 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
299a0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61  ns[hSession].sea
299b0 72 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74 20  rch_query_count 
299c0 3d 20 30 3b 0a 09 09 63 61 63 6b 65 79 5f 73 65  = 0;...cackey_se
299d0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
299e0 2e 73 65 61 72 63 68 5f 71 75 65 72 79 20 3d 20  .search_query = 
299f0 4e 55 4c 4c 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65  NULL;..}...cacke
29a00 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
29a10 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 61 63 74 69  ion].search_acti
29a20 76 65 20 3d 20 31 3b 0a 09 63 61 63 6b 65 79 5f  ve = 1;..cackey_
29a30 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
29a40 6e 5d 2e 73 65 61 72 63 68 5f 63 75 72 72 5f 69  n].search_curr_i
29a50 64 20 3d 20 30 3b 0a 0a 09 6d 75 74 65 78 5f 72  d = 0;...mutex_r
29a60 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
29a70 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
29a80 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
29a90 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
29aa0 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
29ab0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
29ac0 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20  ror.  Unlocking 
29ad0 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
29ae0 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
29af0 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41  _ERROR);..}...CA
29b00 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
29b10 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
29b20 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f  _OK (%i)", CKR_O
29b30 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  K);...return(CKR
29b40 5f 4f 4b 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  _OK);.}..static 
29b50 69 6e 74 20 63 61 63 6b 65 79 5f 70 6b 63 73 31  int cackey_pkcs1
29b60 31 5f 63 6f 6d 70 61 72 65 5f 61 74 74 72 69 62  1_compare_attrib
29b70 75 74 65 73 28 43 4b 5f 41 54 54 52 49 42 55 54  utes(CK_ATTRIBUT
29b80 45 20 2a 61 2c 20 43 4b 5f 41 54 54 52 49 42 55  E *a, CK_ATTRIBU
29b90 54 45 20 2a 62 29 20 7b 0a 09 75 6e 73 69 67 6e  TE *b) {..unsign
29ba0 65 64 20 63 68 61 72 20 2a 73 6d 61 6c 6c 62 75  ed char *smallbu
29bb0 66 2c 20 2a 6c 61 72 67 65 62 75 66 3b 0a 09 73  f, *largebuf;..s
29bc0 69 7a 65 5f 74 20 73 6d 61 6c 6c 62 75 66 5f 6c  ize_t smallbuf_l
29bd0 65 6e 2c 20 6c 61 72 67 65 62 75 66 5f 6c 65 6e  en, largebuf_len
29be0 3b 0a 0a 09 69 66 20 28 61 2d 3e 74 79 70 65 20  ;...if (a->type 
29bf0 21 3d 20 62 2d 3e 74 79 70 65 29 20 7b 0a 09 09  != b->type) {...
29c00 72 65 74 75 72 6e 28 30 29 3b 0a 09 7d 0a 0a 09  return(0);..}...
29c10 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
29c20 4e 54 46 28 22 20 20 20 20 2e 2e 2e 20 66 6f 75  NTF("    ... fou
29c30 6e 64 20 6d 61 74 63 68 69 6e 67 20 74 79 70 65  nd matching type
29c40 20 2e 2e 2e 22 29 3b 0a 0a 09 43 41 43 4b 45 59   ...");...CACKEY
29c50 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28  _DEBUG_PRINTBUF(
29c60 22 20 20 20 20 2e 2e 2e 20 6f 75 72 20 76 61 6c  "    ... our val
29c70 75 65 3a 22 2c 20 61 2d 3e 70 56 61 6c 75 65 2c  ue:", a->pValue,
29c80 20 61 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 29 3b   a->ulValueLen);
29c90 0a 0a 09 69 66 20 28 62 2d 3e 70 56 61 6c 75 65  ...if (b->pValue
29ca0 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
29cb0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
29cc0 46 28 22 20 20 20 20 20 20 20 2e 2e 2e 20 66 6f  F("       ... fo
29cd0 75 6e 64 20 77 69 6c 64 63 61 72 64 20 6d 61 74  und wildcard mat
29ce0 63 68 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  ch");....return(
29cf0 31 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 61 2d 3e  1);..}...if (a->
29d00 70 56 61 6c 75 65 20 3d 3d 20 4e 55 4c 4c 29 20  pValue == NULL) 
29d10 7b 0a 09 09 72 65 74 75 72 6e 28 30 29 3b 0a 09  {...return(0);..
29d20 7d 0a 0a 20 09 69 66 20 28 62 2d 3e 75 6c 56 61  }.. .if (b->ulVa
29d30 6c 75 65 4c 65 6e 20 3d 3d 20 61 2d 3e 75 6c 56  lueLen == a->ulV
29d40 61 6c 75 65 4c 65 6e 20 26 26 20 6d 65 6d 63 6d  alueLen && memcm
29d50 70 28 61 2d 3e 70 56 61 6c 75 65 2c 20 62 2d 3e  p(a->pValue, b->
29d60 70 56 61 6c 75 65 2c 20 62 2d 3e 75 6c 56 61 6c  pValue, b->ulVal
29d70 75 65 4c 65 6e 29 20 3d 3d 20 30 29 20 7b 0a 09  ueLen) == 0) {..
29d80 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
29d90 49 4e 54 46 28 22 20 20 20 20 20 20 20 2e 2e 2e  INTF("       ...
29da0 20 66 6f 75 6e 64 20 65 78 61 63 74 20 6d 61 74   found exact mat
29db0 63 68 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  ch");....return(
29dc0 31 29 3b 0a 09 7d 0a 0a 09 73 77 69 74 63 68 20  1);..}...switch 
29dd0 28 61 2d 3e 74 79 70 65 29 20 7b 0a 09 09 63 61  (a->type) {...ca
29de0 73 65 20 43 4b 41 5f 4d 4f 44 55 4c 55 53 3a 0a  se CKA_MODULUS:.
29df0 09 09 09 69 66 20 28 61 2d 3e 75 6c 56 61 6c 75  ...if (a->ulValu
29e00 65 4c 65 6e 20 3d 3d 20 62 2d 3e 75 6c 56 61 6c  eLen == b->ulVal
29e10 75 65 4c 65 6e 29 20 7b 0a 09 09 09 09 62 72 65  ueLen) {.....bre
29e20 61 6b 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20  ak;....}.....if 
29e30 28 61 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 20 3e  (a->ulValueLen >
29e40 20 62 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 29 20   b->ulValueLen) 
29e50 7b 0a 09 09 09 09 73 6d 61 6c 6c 62 75 66 20 3d  {.....smallbuf =
29e60 20 62 2d 3e 70 56 61 6c 75 65 3b 0a 09 09 09 09   b->pValue;.....
29e70 73 6d 61 6c 6c 62 75 66 5f 6c 65 6e 20 3d 20 62  smallbuf_len = b
29e80 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 0a 09  ->ulValueLen;...
29e90 09 09 09 6c 61 72 67 65 62 75 66 20 3d 20 61 2d  ...largebuf = a-
29ea0 3e 70 56 61 6c 75 65 3b 0a 09 09 09 09 6c 61 72  >pValue;.....lar
29eb0 67 65 62 75 66 5f 6c 65 6e 20 3d 20 61 2d 3e 75  gebuf_len = a->u
29ec0 6c 56 61 6c 75 65 4c 65 6e 3b 0a 09 09 09 7d 20  lValueLen;....} 
29ed0 65 6c 73 65 20 7b 0a 09 09 09 09 73 6d 61 6c 6c  else {.....small
29ee0 62 75 66 20 3d 20 61 2d 3e 70 56 61 6c 75 65 3b  buf = a->pValue;
29ef0 0a 09 09 09 09 73 6d 61 6c 6c 62 75 66 5f 6c 65  .....smallbuf_le
29f00 6e 20 3d 20 61 2d 3e 75 6c 56 61 6c 75 65 4c 65  n = a->ulValueLe
29f10 6e 3b 0a 0a 09 09 09 09 6c 61 72 67 65 62 75 66  n;......largebuf
29f20 20 3d 20 62 2d 3e 70 56 61 6c 75 65 3b 0a 09 09   = b->pValue;...
29f30 09 09 6c 61 72 67 65 62 75 66 5f 6c 65 6e 20 3d  ..largebuf_len =
29f40 20 62 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a   b->ulValueLen;.
29f50 09 09 09 7d 0a 0a 09 09 09 66 6f 72 20 28 3b 20  ...}.....for (; 
29f60 6c 61 72 67 65 62 75 66 5f 6c 65 6e 20 21 3d 20  largebuf_len != 
29f70 73 6d 61 6c 6c 62 75 66 5f 6c 65 6e 3b 20 6c 61  smallbuf_len; la
29f80 72 67 65 62 75 66 2b 2b 2c 6c 61 72 67 65 62 75  rgebuf++,largebu
29f90 66 5f 6c 65 6e 2d 2d 29 20 7b 0a 09 09 09 09 69  f_len--) {.....i
29fa0 66 20 28 6c 61 72 67 65 62 75 66 5b 30 5d 20 21  f (largebuf[0] !
29fb0 3d 20 30 29 20 7b 0a 09 09 09 09 09 62 72 65 61  = 0) {......brea
29fc0 6b 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09  k;.....}....}...
29fd0 09 09 69 66 20 28 6c 61 72 67 65 62 75 66 5f 6c  ..if (largebuf_l
29fe0 65 6e 20 21 3d 20 73 6d 61 6c 6c 62 75 66 5f 6c  en != smallbuf_l
29ff0 65 6e 29 20 7b 0a 09 09 09 09 62 72 65 61 6b 3b  en) {.....break;
2a000 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 6d 65  ....}.....if (me
2a010 6d 63 6d 70 28 6c 61 72 67 65 62 75 66 2c 20 73  mcmp(largebuf, s
2a020 6d 61 6c 6c 62 75 66 2c 20 73 6d 61 6c 6c 62 75  mallbuf, smallbu
2a030 66 5f 6c 65 6e 29 20 3d 3d 20 30 29 20 7b 0a 09  f_len) == 0) {..
2a040 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2a050 50 52 49 4e 54 46 28 22 20 20 20 20 20 20 20 2e  PRINTF("       .
2a060 2e 2e 20 66 6f 75 6e 64 20 61 70 70 72 6f 78 69  .. found approxi
2a070 6d 61 74 65 20 6d 61 74 63 68 22 29 3b 0a 0a 09  mate match");...
2a080 09 09 09 72 65 74 75 72 6e 28 31 29 3b 0a 09 09  ...return(1);...
2a090 09 7d 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 7d  .}.....break;..}
2a0a0 0a 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a 7d 0a  ...return(0);.}.
2a0b0 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
2a0c0 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 46 69 6e  ION(CK_RV, C_Fin
2a0d0 64 4f 62 6a 65 63 74 73 29 28 43 4b 5f 53 45 53  dObjects)(CK_SES
2a0e0 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
2a0f0 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f  sion, CK_OBJECT_
2a100 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 4f 62 6a  HANDLE_PTR phObj
2a110 65 63 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  ect, CK_ULONG ul
2a120 4d 61 78 4f 62 6a 65 63 74 43 6f 75 6e 74 2c 20  MaxObjectCount, 
2a130 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c  CK_ULONG_PTR pul
2a140 4f 62 6a 65 63 74 43 6f 75 6e 74 29 20 7b 0a 09  ObjectCount) {..
2a150 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69 64  struct cackey_id
2a160 65 6e 74 69 74 79 20 2a 63 75 72 72 5f 69 64 3b  entity *curr_id;
2a170 0a 09 43 4b 5f 41 54 54 52 49 42 55 54 45 20 2a  ..CK_ATTRIBUTE *
2a180 63 75 72 72 5f 61 74 74 72 3b 0a 09 43 4b 5f 55  curr_attr;..CK_U
2a190 4c 4f 4e 47 20 63 75 72 72 5f 69 64 5f 69 64 78  LONG curr_id_idx
2a1a0 2c 20 63 75 72 72 5f 6f 75 74 5f 69 64 5f 69 64  , curr_out_id_id
2a1b0 78 2c 20 63 75 72 72 5f 61 74 74 72 5f 69 64 78  x, curr_attr_idx
2a1c0 2c 20 73 65 73 73 5f 61 74 74 72 5f 69 64 78 3b  , sess_attr_idx;
2a1d0 0a 09 43 4b 5f 55 4c 4f 4e 47 20 6d 61 74 63 68  ..CK_ULONG match
2a1e0 65 64 5f 63 6f 75 6e 74 2c 20 70 72 65 76 5f 6d  ed_count, prev_m
2a1f0 61 74 63 68 65 64 5f 63 6f 75 6e 74 3b 0a 09 69  atched_count;..i
2a200 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b  nt mutex_retval;
2a210 0a 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f 44  .#ifdef CACKEY_D
2a220 45 42 55 47 5f 53 45 41 52 43 48 5f 53 50 45 45  EBUG_SEARCH_SPEE
2a230 44 54 45 53 54 0a 09 73 74 72 75 63 74 20 74 69  DTEST..struct ti
2a240 6d 65 76 61 6c 20 73 74 61 72 74 2c 20 65 6e 64  meval start, end
2a250 3b 0a 09 75 69 6e 74 36 34 5f 74 20 73 74 61 72  ;..uint64_t star
2a260 74 5f 69 6e 74 2c 20 65 6e 64 5f 69 6e 74 3b 0a  t_int, end_int;.
2a270 23 65 6e 64 69 66 0a 0a 09 43 41 43 4b 45 59 5f  #endif...CACKEY_
2a280 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
2a290 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
2a2a0 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
2a2b0 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
2a2c0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2a2d0 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
2a2e0 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
2a2f0 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
2a300 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
2a310 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 75 6c 4f 62  ;..}...if (pulOb
2a320 6a 65 63 74 43 6f 75 6e 74 20 3d 3d 20 4e 55 4c  jectCount == NUL
2a330 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
2a340 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2a350 72 2e 20 20 70 75 6c 4f 62 6a 65 63 74 43 6f 75  r.  pulObjectCou
2a360 6e 74 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a  nt is NULL.");..
2a370 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47  ..return(CKR_ARG
2a380 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a  UMENTS_BAD);..}.
2a390 0a 09 69 66 20 28 70 68 4f 62 6a 65 63 74 20 3d  ..if (phObject =
2a3a0 3d 20 4e 55 4c 4c 20 26 26 20 75 6c 4d 61 78 4f  = NULL && ulMaxO
2a3b0 62 6a 65 63 74 43 6f 75 6e 74 20 3d 3d 20 30 29  bjectCount == 0)
2a3c0 20 7b 0a 09 09 2f 2a 20 53 68 6f 72 74 20 63 69   {.../* Short ci
2a3d0 72 63 75 69 74 2c 20 69 66 20 7a 65 72 6f 20 6f  rcuit, if zero o
2a3e0 62 6a 65 63 74 73 20 77 65 72 65 20 73 70 65 63  bjects were spec
2a3f0 69 66 69 65 64 20 72 65 74 75 72 6e 20 7a 65 72  ified return zer
2a400 6f 20 69 74 65 6d 73 20 69 6d 6d 65 64 69 61 74  o items immediat
2a410 65 6c 79 20 2a 2f 0a 09 09 2a 70 75 6c 4f 62 6a  ely */...*pulObj
2a420 65 63 74 43 6f 75 6e 74 20 3d 20 30 3b 0a 0a 09  ectCount = 0;...
2a430 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2a440 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
2a450 43 4b 52 5f 4f 4b 20 28 25 69 29 20 28 73 68 6f  CKR_OK (%i) (sho
2a460 72 74 20 63 69 72 63 75 69 74 29 22 2c 20 43 4b  rt circuit)", CK
2a470 52 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74 75 72 6e  R_OK);....return
2a480 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69  (CKR_OK);..}...i
2a490 66 20 28 70 68 4f 62 6a 65 63 74 20 3d 3d 20 4e  f (phObject == N
2a4a0 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
2a4b0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2a4c0 72 6f 72 2e 20 20 70 68 4f 62 6a 65 63 74 20 69  ror.  phObject i
2a4d0 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65  s NULL.");....re
2a4e0 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e  turn(CKR_ARGUMEN
2a4f0 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66  TS_BAD);..}...if
2a500 20 28 75 6c 4d 61 78 4f 62 6a 65 63 74 43 6f 75   (ulMaxObjectCou
2a510 6e 74 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43  nt == 0) {...CAC
2a520 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2a530 28 22 45 72 72 6f 72 2e 20 20 4d 61 78 69 6d 75  ("Error.  Maximu
2a540 6d 20 6e 75 6d 62 65 72 20 6f 66 20 6f 62 6a 65  m number of obje
2a550 63 74 73 20 73 70 65 63 69 66 69 65 64 20 61 73  cts specified as
2a560 20 7a 65 72 6f 2e 22 29 3b 0a 0a 09 09 72 65 74   zero.");....ret
2a570 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54  urn(CKR_ARGUMENT
2a580 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  S_BAD);..}...if 
2a590 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c  (hSession == 0 |
2a5a0 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73  | hSession >= (s
2a5b0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
2a5c0 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28  sions) / sizeof(
2a5d0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2a5e0 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59  0]))) {...CACKEY
2a5f0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2a600 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f  rror.  Session o
2a610 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a  ut of range.");.
2a620 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
2a630 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49  SESSION_HANDLE_I
2a640 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75  NVALID);..}...mu
2a650 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
2a660 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63  key_mutex_lock(c
2a670 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
2a680 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
2a690 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
2a6a0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2a6b0 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67  "Error.  Locking
2a6c0 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
2a6d0 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
2a6e0 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69  L_ERROR);..}...i
2a6f0 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69  f (!cackey_sessi
2a700 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63  ons[hSession].ac
2a710 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79  tive) {...cackey
2a720 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
2a730 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
2a740 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2a750 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
2a760 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76  ession not activ
2a770 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
2a780 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41  n(CKR_SESSION_HA
2a790 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
2a7a0 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  }...if (!cackey_
2a7b0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
2a7c0 6e 5d 2e 73 65 61 72 63 68 5f 61 63 74 69 76 65  n].search_active
2a7d0 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  ) {...cackey_mut
2a7e0 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
2a7f0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41  _biglock);....CA
2a800 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2a810 46 28 22 45 72 72 6f 72 2e 20 20 53 65 61 72 63  F("Error.  Searc
2a820 68 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b  h not active.");
2a830 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
2a840 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49  _OPERATION_NOT_I
2a850 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
2a860 0a 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f 44  .#ifdef CACKEY_D
2a870 45 42 55 47 5f 53 45 41 52 43 48 5f 53 50 45 45  EBUG_SEARCH_SPEE
2a880 44 54 45 53 54 0a 09 67 65 74 74 69 6d 65 6f 66  DTEST..gettimeof
2a890 64 61 79 28 26 73 74 61 72 74 2c 20 4e 55 4c 4c  day(&start, NULL
2a8a0 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 63 75 72 72  );.#endif...curr
2a8b0 5f 6f 75 74 5f 69 64 5f 69 64 78 20 3d 20 30 3b  _out_id_idx = 0;
2a8c0 0a 09 66 6f 72 20 28 63 75 72 72 5f 69 64 5f 69  ..for (curr_id_i
2a8d0 64 78 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73  dx = cackey_sess
2a8e0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
2a8f0 65 61 72 63 68 5f 63 75 72 72 5f 69 64 3b 20 63  earch_curr_id; c
2a900 75 72 72 5f 69 64 5f 69 64 78 20 3c 20 63 61 63  urr_id_idx < cac
2a910 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
2a920 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65  ssion].identitie
2a930 73 5f 63 6f 75 6e 74 20 26 26 20 75 6c 4d 61 78  s_count && ulMax
2a940 4f 62 6a 65 63 74 43 6f 75 6e 74 3b 20 63 75 72  ObjectCount; cur
2a950 72 5f 69 64 5f 69 64 78 2b 2b 29 20 7b 0a 09 09  r_id_idx++) {...
2a960 63 75 72 72 5f 69 64 20 3d 20 26 63 61 63 6b 65  curr_id = &cacke
2a970 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
2a980 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5b  ion].identities[
2a990 63 75 72 72 5f 69 64 5f 69 64 78 5d 3b 0a 0a 09  curr_id_idx];...
2a9a0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2a9b0 49 4e 54 46 28 22 50 72 6f 63 65 73 73 69 6e 67  INTF("Processing
2a9c0 20 69 64 65 6e 74 69 74 79 3a 25 6c 75 22 2c 20   identity:%lu", 
2a9d0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
2a9e0 63 75 72 72 5f 69 64 5f 69 64 78 29 3b 0a 0a 09  curr_id_idx);...
2a9f0 09 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 20 3d  .matched_count =
2aa00 20 30 3b 0a 0a 09 09 66 6f 72 20 28 63 75 72 72   0;....for (curr
2aa10 5f 61 74 74 72 5f 69 64 78 20 3d 20 30 3b 20 63  _attr_idx = 0; c
2aa20 75 72 72 5f 61 74 74 72 5f 69 64 78 20 3c 20 63  urr_attr_idx < c
2aa30 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
2aa40 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f  Session].search_
2aa50 71 75 65 72 79 5f 63 6f 75 6e 74 3b 20 63 75 72  query_count; cur
2aa60 72 5f 61 74 74 72 5f 69 64 78 2b 2b 29 20 7b 0a  r_attr_idx++) {.
2aa70 09 09 09 70 72 65 76 5f 6d 61 74 63 68 65 64 5f  ...prev_matched_
2aa80 63 6f 75 6e 74 20 3d 20 6d 61 74 63 68 65 64 5f  count = matched_
2aa90 63 6f 75 6e 74 3b 0a 0a 09 09 09 63 75 72 72 5f  count;.....curr_
2aaa0 61 74 74 72 20 3d 20 26 63 61 63 6b 65 79 5f 73  attr = &cackey_s
2aab0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
2aac0 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5b 63  ].search_query[c
2aad0 75 72 72 5f 61 74 74 72 5f 69 64 78 5d 3b 0a 0a  urr_attr_idx];..
2aae0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2aaf0 50 52 49 4e 54 46 28 22 20 20 43 68 65 63 6b 69  PRINTF("  Checki
2ab00 6e 67 20 66 6f 72 20 61 74 74 72 69 62 75 74 65  ng for attribute
2ab10 20 25 73 20 28 30 78 25 30 38 6c 78 29 20 69 6e   %s (0x%08lx) in
2ab20 20 69 64 65 6e 74 69 74 79 3a 25 69 2e 2e 2e 22   identity:%i..."
2ab30 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46  , CACKEY_DEBUG_F
2ab40 55 4e 43 5f 41 54 54 52 49 42 55 54 45 5f 54 4f  UNC_ATTRIBUTE_TO
2ab50 5f 53 54 52 28 63 75 72 72 5f 61 74 74 72 2d 3e  _STR(curr_attr->
2ab60 74 79 70 65 29 2c 20 28 75 6e 73 69 67 6e 65 64  type), (unsigned
2ab70 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72   long) curr_attr
2ab80 2d 3e 74 79 70 65 2c 20 28 69 6e 74 29 20 63 75  ->type, (int) cu
2ab90 72 72 5f 69 64 5f 69 64 78 29 3b 0a 09 09 09 43  rr_id_idx);....C
2aba0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2abb0 54 42 55 46 28 22 20 20 20 20 56 61 6c 75 65 20  TBUF("    Value 
2abc0 6c 6f 6f 6b 69 6e 67 20 66 6f 72 3a 22 2c 20 63  looking for:", c
2abd0 75 72 72 5f 61 74 74 72 2d 3e 70 56 61 6c 75 65  urr_attr->pValue
2abe0 2c 20 63 75 72 72 5f 61 74 74 72 2d 3e 75 6c 56  , curr_attr->ulV
2abf0 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 66 6f  alueLen);.....fo
2ac00 72 20 28 73 65 73 73 5f 61 74 74 72 5f 69 64 78  r (sess_attr_idx
2ac10 20 3d 20 30 3b 20 73 65 73 73 5f 61 74 74 72 5f   = 0; sess_attr_
2ac20 69 64 78 20 3c 20 63 75 72 72 5f 69 64 2d 3e 61  idx < curr_id->a
2ac30 74 74 72 69 62 75 74 65 73 5f 63 6f 75 6e 74 3b  ttributes_count;
2ac40 20 73 65 73 73 5f 61 74 74 72 5f 69 64 78 2b 2b   sess_attr_idx++
2ac50 29 20 7b 0a 09 09 09 09 69 66 20 28 63 61 63 6b  ) {.....if (cack
2ac60 65 79 5f 70 6b 63 73 31 31 5f 63 6f 6d 70 61 72  ey_pkcs11_compar
2ac70 65 5f 61 74 74 72 69 62 75 74 65 73 28 26 63 75  e_attributes(&cu
2ac80 72 72 5f 69 64 2d 3e 61 74 74 72 69 62 75 74 65  rr_id->attribute
2ac90 73 5b 73 65 73 73 5f 61 74 74 72 5f 69 64 78 5d  s[sess_attr_idx]
2aca0 2c 20 63 75 72 72 5f 61 74 74 72 29 29 20 7b 0a  , curr_attr)) {.
2acb0 09 09 09 09 09 6d 61 74 63 68 65 64 5f 63 6f 75  .....matched_cou
2acc0 6e 74 2b 2b 3b 0a 0a 09 09 09 09 09 62 72 65 61  nt++;.......brea
2acd0 6b 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09  k;.....}....}...
2ace0 09 09 2f 2a 20 49 66 20 74 68 65 20 61 74 74 72  ../* If the attr
2acf0 69 62 75 74 65 20 63 6f 75 6c 64 20 6e 6f 74 20  ibute could not 
2ad00 62 65 20 6d 61 74 63 68 65 64 2c 20 64 6f 20 6e  be matched, do n
2ad10 6f 74 20 74 72 79 20 74 6f 20 6d 61 74 63 68 20  ot try to match 
2ad20 61 64 64 69 74 69 6f 6e 61 6c 20 61 74 74 72 69  additional attri
2ad30 62 75 74 65 73 20 2a 2f 0a 09 09 09 69 66 20 28  butes */....if (
2ad40 70 72 65 76 5f 6d 61 74 63 68 65 64 5f 63 6f 75  prev_matched_cou
2ad50 6e 74 20 3d 3d 20 6d 61 74 63 68 65 64 5f 63 6f  nt == matched_co
2ad60 75 6e 74 29 20 7b 0a 09 09 09 09 62 72 65 61 6b  unt) {.....break
2ad70 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 69 66  ;....}...}....if
2ad80 20 28 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 20   (matched_count 
2ad90 3d 3d 20 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 5f 63 6f 75 6e 74 29  rch_query_count)
2adc0 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
2add0 55 47 5f 50 52 49 4e 54 46 28 22 20 20 2e 2e 2e  UG_PRINTF("  ...
2ade0 20 41 6c 6c 20 25 69 20 61 74 74 72 69 62 75 74   All %i attribut
2adf0 65 73 20 63 68 65 63 6b 65 64 20 66 6f 72 20 66  es checked for f
2ae00 6f 75 6e 64 2c 20 61 64 64 69 6e 67 20 69 64 65  ound, adding ide
2ae10 6e 74 69 74 79 3a 25 69 20 74 6f 20 72 65 74 75  ntity:%i to retu
2ae20 72 6e 65 64 20 6c 69 73 74 22 2c 20 28 69 6e 74  rned list", (int
2ae30 29 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ) cackey_session
2ae40 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72  s[hSession].sear
2ae50 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74 2c 20  ch_query_count, 
2ae60 28 69 6e 74 29 20 63 75 72 72 5f 69 64 5f 69 64  (int) curr_id_id
2ae70 78 29 3b 0a 0a 09 09 09 70 68 4f 62 6a 65 63 74  x);.....phObject
2ae80 5b 63 75 72 72 5f 6f 75 74 5f 69 64 5f 69 64 78  [curr_out_id_idx
2ae90 5d 20 3d 20 63 75 72 72 5f 69 64 5f 69 64 78 20  ] = curr_id_idx 
2aea0 2b 20 31 3b 0a 0a 09 09 09 75 6c 4d 61 78 4f 62  + 1;.....ulMaxOb
2aeb0 6a 65 63 74 43 6f 75 6e 74 2d 2d 3b 0a 0a 09 09  jectCount--;....
2aec0 09 63 75 72 72 5f 6f 75 74 5f 69 64 5f 69 64 78  .curr_out_id_idx
2aed0 2b 2b 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09  ++;...} else {..
2aee0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2aef0 52 49 4e 54 46 28 22 20 20 2e 2e 2e 20 4e 6f 74  RINTF("  ... Not
2af00 20 61 6c 6c 20 25 69 20 28 6f 6e 6c 79 20 66 6f   all %i (only fo
2af10 75 6e 64 20 25 69 29 20 61 74 74 72 69 62 75 74  und %i) attribut
2af20 65 73 20 63 68 65 63 6b 65 64 20 66 6f 72 20 66  es checked for f
2af30 6f 75 6e 64 2c 20 6e 6f 74 20 61 64 64 69 6e 67  ound, not adding
2af40 20 69 64 65 6e 74 69 74 79 3a 25 69 22 2c 20 28   identity:%i", (
2af50 69 6e 74 29 20 63 61 63 6b 65 79 5f 73 65 73 73  int) cackey_sess
2af60 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
2af70 65 61 72 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e  earch_query_coun
2af80 74 2c 20 28 69 6e 74 29 20 6d 61 74 63 68 65 64  t, (int) matched
2af90 5f 63 6f 75 6e 74 2c 20 28 69 6e 74 29 20 63 75  _count, (int) cu
2afa0 72 72 5f 69 64 5f 69 64 78 29 3b 0a 09 09 7d 0a  rr_id_idx);...}.
2afb0 09 7d 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69  .}..cackey_sessi
2afc0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65  ons[hSession].se
2afd0 61 72 63 68 5f 63 75 72 72 5f 69 64 20 3d 20 63  arch_curr_id = c
2afe0 75 72 72 5f 69 64 5f 69 64 78 3b 0a 09 2a 70 75  urr_id_idx;..*pu
2aff0 6c 4f 62 6a 65 63 74 43 6f 75 6e 74 20 3d 20 63  lObjectCount = c
2b000 75 72 72 5f 6f 75 74 5f 69 64 5f 69 64 78 3b 0a  urr_out_id_idx;.
2b010 0a 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f 44  .#ifdef CACKEY_D
2b020 45 42 55 47 5f 53 45 41 52 43 48 5f 53 50 45 45  EBUG_SEARCH_SPEE
2b030 44 54 45 53 54 0a 09 67 65 74 74 69 6d 65 6f 66  DTEST..gettimeof
2b040 64 61 79 28 26 65 6e 64 2c 20 4e 55 4c 4c 29 3b  day(&end, NULL);
2b050 0a 09 73 74 61 72 74 5f 69 6e 74 20 3d 20 28 73  ..start_int = (s
2b060 74 61 72 74 2e 74 76 5f 73 65 63 20 2a 20 31 30  tart.tv_sec * 10
2b070 30 30 30 30 30 29 20 2b 20 73 74 61 72 74 2e 74  00000) + start.t
2b080 76 5f 75 73 65 63 3b 0a 09 65 6e 64 5f 69 6e 74  v_usec;..end_int
2b090 20 3d 20 28 65 6e 64 2e 74 76 5f 73 65 63 20 2a   = (end.tv_sec *
2b0a0 20 31 30 30 30 30 30 30 29 20 2b 20 65 6e 64 2e   1000000) + end.
2b0b0 74 76 5f 75 73 65 63 3b 0a 09 66 70 72 69 6e 74  tv_usec;..fprint
2b0c0 66 28 73 74 64 65 72 72 2c 20 22 53 65 61 72 63  f(stderr, "Searc
2b0d0 68 20 74 6f 6f 6b 20 25 6c 75 20 6d 69 63 72 6f  h took %lu micro
2b0e0 73 65 63 6f 6e 64 73 5c 6e 22 2c 20 28 75 6e 73  seconds\n", (uns
2b0f0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 28 65 6e 64  igned long) (end
2b100 5f 69 6e 74 20 2d 20 73 74 61 72 74 5f 69 6e 74  _int - start_int
2b110 29 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 6d 75 74  ));.#endif...mut
2b120 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
2b130 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
2b140 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
2b150 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
2b160 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
2b170 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2b180 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b  ("Error.  Unlock
2b190 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
2b1a0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
2b1b0 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
2b1c0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2b1d0 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
2b1e0 20 43 4b 52 5f 4f 4b 20 28 25 69 29 2c 20 6e 75   CKR_OK (%i), nu
2b1f0 6d 20 6f 62 6a 65 63 74 73 20 3d 20 25 6c 75 22  m objects = %lu"
2b200 2c 20 43 4b 52 5f 4f 4b 2c 20 2a 70 75 6c 4f 62  , CKR_OK, *pulOb
2b210 6a 65 63 74 43 6f 75 6e 74 29 3b 0a 0a 09 72 65  jectCount);...re
2b220 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a  turn(CKR_OK);.}.
2b230 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
2b240 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 46 69 6e  ION(CK_RV, C_Fin
2b250 64 4f 62 6a 65 63 74 73 46 69 6e 61 6c 29 28 43  dObjectsFinal)(C
2b260 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
2b270 20 68 53 65 73 73 69 6f 6e 29 20 7b 0a 09 43 4b   hSession) {..CK
2b280 5f 55 4c 4f 4e 47 20 69 64 78 3b 0a 09 69 6e 74  _ULONG idx;..int
2b290 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a   mutex_retval;..
2b2a0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2b2b0 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
2b2c0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
2b2d0 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
2b2e0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2b2f0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
2b300 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
2b310 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
2b320 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
2b330 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69  IALIZED);..}...i
2b340 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30  f (hSession == 0
2b350 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20   || hSession >= 
2b360 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
2b370 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f  essions) / sizeo
2b380 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
2b390 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b  s[0]))) {...CACK
2b3a0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2b3b0 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e  "Error.  Session
2b3c0 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29   out of range.")
2b3d0 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
2b3e0 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  R_SESSION_HANDLE
2b3f0 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
2b400 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
2b410 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b  ackey_mutex_lock
2b420 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
2b430 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
2b440 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
2b450 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2b460 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69  F("Error.  Locki
2b470 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
2b480 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
2b490 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
2b4a0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73  .if (!cackey_ses
2b4b0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
2b4c0 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b  active) {...cack
2b4d0 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
2b4e0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
2b4f0 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
2b500 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2b510 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74   Session not act
2b520 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  ive.");......ret
2b530 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  urn(CKR_SESSION_
2b540 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
2b550 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ..}...if (!cacke
2b560 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
2b570 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 61 63 74 69  ion].search_acti
2b580 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d  ve) {...cackey_m
2b590 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
2b5a0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
2b5b0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2b5c0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 61  NTF("Error.  Sea
2b5d0 72 63 68 20 6e 6f 74 20 61 63 74 69 76 65 2e 22  rch not active."
2b5e0 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
2b5f0 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54  KR_OPERATION_NOT
2b600 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
2b610 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69  }...cackey_sessi
2b620 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65  ons[hSession].se
2b630 61 72 63 68 5f 61 63 74 69 76 65 20 3d 20 30 3b  arch_active = 0;
2b640 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b  ...for (idx = 0;
2b650 20 69 64 78 20 3c 20 63 61 63 6b 65 79 5f 73 65   idx < cackey_se
2b660 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
2b670 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5f 63 6f  .search_query_co
2b680 75 6e 74 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09  unt; idx++) {...
2b690 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69  if (cackey_sessi
2b6a0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65  ons[hSession].se
2b6b0 61 72 63 68 5f 71 75 65 72 79 5b 69 64 78 5d 2e  arch_query[idx].
2b6c0 70 56 61 6c 75 65 29 20 7b 0a 09 09 09 66 72 65  pValue) {....fre
2b6d0 65 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  e(cackey_session
2b6e0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72  s[hSession].sear
2b6f0 63 68 5f 71 75 65 72 79 5b 69 64 78 5d 2e 70 56  ch_query[idx].pV
2b700 61 6c 75 65 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09  alue);...}..}...
2b710 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69  if (cackey_sessi
2b720 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65  ons[hSession].se
2b730 61 72 63 68 5f 71 75 65 72 79 29 20 7b 0a 09 09  arch_query) {...
2b740 66 72 65 65 28 63 61 63 6b 65 79 5f 73 65 73 73  free(cackey_sess
2b750 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
2b760 65 61 72 63 68 5f 71 75 65 72 79 29 3b 0a 09 7d  earch_query);..}
2b770 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
2b780 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  = cackey_mutex_u
2b790 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
2b7a0 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
2b7b0 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
2b7c0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2b7d0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
2b7e0 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64  Unlocking failed
2b7f0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
2b800 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
2b810 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
2b820 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
2b830 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25  urning CKR_OK (%
2b840 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09  i)", CKR_OK);...
2b850 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a  return(CKR_OK);.
2b860 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
2b870 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 45  CTION(CK_RV, C_E
2b880 6e 63 72 79 70 74 49 6e 69 74 29 28 43 4b 5f 53  ncryptInit)(CK_S
2b890 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
2b8a0 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41  ession, CK_MECHA
2b8b0 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e  NISM_PTR pMechan
2b8c0 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48  ism, CK_OBJECT_H
2b8d0 41 4e 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09 43  ANDLE hKey) {..C
2b8e0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2b8f0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
2b900 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
2b910 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
2b920 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2b930 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
2b940 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
2b950 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
2b960 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
2b970 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
2b980 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2b990 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
2b9a0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
2b9b0 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
2b9c0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2b9d0 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
2b9e0 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
2b9f0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
2ba00 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
2ba10 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
2ba20 45 6e 63 72 79 70 74 29 28 43 4b 5f 53 45 53 53  Encrypt)(CK_SESS
2ba30 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
2ba40 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  ion, CK_BYTE_PTR
2ba50 20 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47   pData, CK_ULONG
2ba60 20 75 6c 44 61 74 61 4c 65 6e 2c 20 43 4b 5f 42   ulDataLen, CK_B
2ba70 59 54 45 5f 50 54 52 20 70 45 6e 63 72 79 70 74  YTE_PTR pEncrypt
2ba80 65 64 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47  edData, CK_ULONG
2ba90 5f 50 54 52 20 70 75 6c 45 6e 63 72 79 70 74 65  _PTR pulEncrypte
2baa0 64 44 61 74 61 4c 65 6e 29 20 7b 0a 09 43 41 43  dDataLen) {..CAC
2bab0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2bac0 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
2bad0 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
2bae0 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
2baf0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2bb00 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
2bb10 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
2bb20 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
2bb30 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
2bb40 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
2bb50 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2bb60 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
2bb70 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
2bb80 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
2bb90 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
2bba0 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
2bbb0 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
2bbc0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
2bbd0 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
2bbe0 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 45 6e  TION(CK_RV, C_En
2bbf0 63 72 79 70 74 55 70 64 61 74 65 29 28 43 4b 5f  cryptUpdate)(CK_
2bc00 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
2bc10 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45  Session, CK_BYTE
2bc20 5f 50 54 52 20 70 50 61 72 74 2c 20 43 4b 5f 55  _PTR pPart, CK_U
2bc30 4c 4f 4e 47 20 75 6c 50 61 72 74 4c 65 6e 2c 20  LONG ulPartLen, 
2bc40 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 45 6e 63  CK_BYTE_PTR pEnc
2bc50 72 79 70 74 65 64 50 61 72 74 2c 20 43 4b 5f 55  ryptedPart, CK_U
2bc60 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 45 6e 63 72  LONG_PTR pulEncr
2bc70 79 70 74 65 64 50 61 72 74 4c 65 6e 29 20 7b 0a  yptedPartLen) {.
2bc80 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2bc90 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
2bca0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
2bcb0 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
2bcc0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2bcd0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
2bce0 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
2bcf0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
2bd00 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
2bd10 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
2bd20 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2bd30 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
2bd40 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2bd50 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20  UPPORTED (%i)", 
2bd60 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
2bd70 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72  _SUPPORTED);...r
2bd80 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
2bd90 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
2bda0 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
2bdb0 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
2bdc0 43 5f 45 6e 63 72 79 70 74 46 69 6e 61 6c 29 28  C_EncryptFinal)(
2bdd0 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
2bde0 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42  E hSession, CK_B
2bdf0 59 54 45 5f 50 54 52 20 70 4c 61 73 74 45 6e 63  YTE_PTR pLastEnc
2be00 72 79 70 74 65 64 50 61 72 74 2c 20 43 4b 5f 55  ryptedPart, CK_U
2be10 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 4c 61 73 74  LONG_PTR pulLast
2be20 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e  EncryptedPartLen
2be30 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
2be40 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
2be50 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
2be60 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
2be70 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
2be80 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2be90 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
2bea0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
2beb0 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
2bec0 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
2bed0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2bee0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
2bef0 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
2bf00 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
2bf10 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
2bf20 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
2bf30 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
2bf40 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
2bf50 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
2bf60 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
2bf70 52 56 2c 20 43 5f 44 65 63 72 79 70 74 49 6e 69  RV, C_DecryptIni
2bf80 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  t)(CK_SESSION_HA
2bf90 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
2bfa0 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20  K_MECHANISM_PTR 
2bfb0 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f  pMechanism, CK_O
2bfc0 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65  BJECT_HANDLE hKe
2bfd0 79 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f  y) {..int mutex_
2bfe0 72 65 74 76 61 6c 3b 0a 0a 09 68 4b 65 79 2d 2d  retval;...hKey--
2bff0 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
2c000 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
2c010 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
2c020 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
2c030 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2c040 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
2c050 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
2c060 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
2c070 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
2c080 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
2c090 0a 09 69 66 20 28 70 4d 65 63 68 61 6e 69 73 6d  ..if (pMechanism
2c0a0 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
2c0b0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2c0c0 46 28 22 45 72 72 6f 72 2e 20 70 4d 65 63 68 61  F("Error. pMecha
2c0d0 6e 69 73 6d 20 69 73 20 4e 55 4c 4c 2e 22 29 3b  nism is NULL.");
2c0e0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41  ....return(CKR_A
2c0f0 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09  RGUMENTS_BAD);..
2c100 7d 0a 0a 09 69 66 20 28 70 4d 65 63 68 61 6e 69  }...if (pMechani
2c110 73 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d 20 21 3d  sm->mechanism !=
2c120 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 29 20 7b   CKM_RSA_PKCS) {
2c130 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2c140 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70  PRINTF("Error. p
2c150 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d 65 63 68 61  Mechanism->mecha
2c160 6e 69 73 6d 20 6e 6f 74 20 73 70 65 63 69 66 69  nism not specifi
2c170 65 64 20 61 73 20 43 4b 4d 5f 52 53 41 5f 50 4b  ed as CKM_RSA_PK
2c180 43 53 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  CS");....return(
2c190 43 4b 52 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 41  CKR_MECHANISM_PA
2c1a0 52 41 4d 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  RAM_INVALID);..}
2c1b0 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20  ...if (hSession 
2c1c0 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e  == 0 || hSession
2c1d0 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b   >= (sizeof(cack
2c1e0 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73  ey_sessions) / s
2c1f0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
2c200 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09  sions[0]))) {...
2c210 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2c220 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73  NTF("Error.  Ses
2c230 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67  sion out of rang
2c240 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
2c250 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41  n(CKR_SESSION_HA
2c260 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
2c270 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  }...mutex_retval
2c280 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
2c290 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
2c2a0 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
2c2b0 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
2c2c0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2c2d0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c  RINTF("Error.  L
2c2e0 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
2c2f0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
2c300 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
2c310 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  .}...if (!cackey
2c320 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
2c330 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09  on].active) {...
2c340 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
2c350 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
2c360 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ck);....CACKEY_D
2c370 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2c380 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74  or.  Session not
2c390 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09   active.");.....
2c3a0 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
2c3b0 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
2c3c0 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61  ID);..}...if (ca
2c3d0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
2c3e0 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f  ession].decrypt_
2c3f0 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b  active) {...cack
2c400 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
2c410 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
2c420 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
2c430 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2c440 20 44 65 63 72 79 70 74 20 61 6c 72 65 61 64 79   Decrypt already
2c450 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 22 29 3b   in progress.");
2c460 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
2c470 5f 4f 50 45 52 41 54 49 4f 4e 5f 41 43 54 49 56  _OPERATION_ACTIV
2c480 45 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 4b 65  E);..}...if (hKe
2c490 79 20 3e 3d 20 63 61 63 6b 65 79 5f 73 65 73 73  y >= cackey_sess
2c4a0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69  ions[hSession].i
2c4b0 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 29  dentities_count)
2c4c0 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65   {...cackey_mute
2c4d0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
2c4e0 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43  biglock);....CAC
2c4f0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2c500 28 22 45 72 72 6f 72 2e 20 20 4b 65 79 20 68 61  ("Error.  Key ha
2c510 6e 64 6c 65 20 6f 75 74 20 6f 66 20 72 61 6e 67  ndle out of rang
2c520 65 20 28 72 65 71 75 65 73 74 65 64 20 6b 65 79  e (requested key
2c530 20 25 6c 75 2c 20 6f 6e 6c 79 20 25 6c 75 20 69   %lu, only %lu i
2c540 64 65 6e 74 69 74 69 65 73 20 61 76 61 69 6c 61  dentities availa
2c550 62 6c 65 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65  ble).", (unsigne
2c560 64 20 6c 6f 6e 67 29 20 68 4b 65 79 2c 20 28 75  d long) hKey, (u
2c570 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 61  nsigned long) ca
2c580 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
2c590 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69  ession].identiti
2c5a0 65 73 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09 72 65  es_count);....re
2c5b0 74 75 72 6e 28 43 4b 52 5f 4b 45 59 5f 48 41 4e  turn(CKR_KEY_HAN
2c5c0 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  DLE_INVALID);..}
2c5d0 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
2c5e0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63  ns[hSession].dec
2c5f0 72 79 70 74 5f 61 63 74 69 76 65 20 3d 20 31 3b  rypt_active = 1;
2c600 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
2c610 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63  ns[hSession].dec
2c620 72 79 70 74 5f 6d 65 63 68 61 6e 69 73 6d 20 3d  rypt_mechanism =
2c630 20 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d 65 63   pMechanism->mec
2c640 68 61 6e 69 73 6d 3b 0a 09 63 61 63 6b 65 79 5f  hanism;..cackey_
2c650 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
2c660 6e 5d 2e 64 65 63 72 79 70 74 5f 6d 65 63 68 5f  n].decrypt_mech_
2c670 70 61 72 6d 20 3d 20 70 4d 65 63 68 61 6e 69 73  parm = pMechanis
2c680 6d 2d 3e 70 50 61 72 61 6d 65 74 65 72 3b 0a 09  m->pParameter;..
2c690 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2c6a0 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70  hSession].decryp
2c6b0 74 5f 6d 65 63 68 5f 70 61 72 6d 6c 65 6e 20 3d  t_mech_parmlen =
2c6c0 20 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 75 6c 50   pMechanism->ulP
2c6d0 61 72 61 6d 65 74 65 72 4c 65 6e 3b 0a 09 63 61  arameterLen;..ca
2c6e0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
2c6f0 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f  ession].decrypt_
2c700 69 64 65 6e 74 69 74 79 20 3d 20 26 63 61 63 6b  identity = &cack
2c710 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
2c720 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73  sion].identities
2c730 5b 68 4b 65 79 5d 3b 0a 0a 09 6d 75 74 65 78 5f  [hKey];...mutex_
2c740 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
2c750 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
2c760 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
2c770 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
2c780 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
2c790 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2c7a0 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67  rror.  Unlocking
2c7b0 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
2c7c0 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
2c7d0 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43  L_ERROR);..}...C
2c7e0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2c7f0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
2c800 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f  R_OK (%i)", CKR_
2c810 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  OK);...return(CK
2c820 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  R_OK);.}..CK_DEF
2c830 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
2c840 52 56 2c 20 43 5f 44 65 63 72 79 70 74 29 28 43  RV, C_Decrypt)(C
2c850 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
2c860 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59   hSession, CK_BY
2c870 54 45 5f 50 54 52 20 70 45 6e 63 72 79 70 74 65  TE_PTR pEncrypte
2c880 64 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20  dData, CK_ULONG 
2c890 75 6c 45 6e 63 72 79 70 74 65 64 44 61 74 61 4c  ulEncryptedDataL
2c8a0 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  en, CK_BYTE_PTR 
2c8b0 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 5f  pData, CK_ULONG_
2c8c0 50 54 52 20 70 75 6c 44 61 74 61 4c 65 6e 29 20  PTR pulDataLen) 
2c8d0 7b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 64 61 74 61  {..CK_ULONG data
2c8e0 6c 65 6e 5f 75 70 64 61 74 65 2c 20 64 61 74 61  len_update, data
2c8f0 6c 65 6e 5f 66 69 6e 61 6c 3b 0a 09 43 4b 5f 52  len_final;..CK_R
2c900 56 20 64 65 63 72 79 70 74 5f 72 65 74 3b 0a 09  V decrypt_ret;..
2c910 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c  int mutex_retval
2c920 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
2c930 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
2c940 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
2c950 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
2c960 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2c970 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
2c980 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
2c990 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
2c9a0 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
2c9b0 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
2c9c0 0a 09 69 66 20 28 70 75 6c 44 61 74 61 4c 65 6e  ..if (pulDataLen
2c9d0 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
2c9e0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2c9f0 46 28 22 45 72 72 6f 72 2e 20 70 75 6c 44 61 74  F("Error. pulDat
2ca00 61 4c 65 6e 20 69 73 20 4e 55 4c 4c 2e 22 29 3b  aLen is NULL.");
2ca10 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41  ....return(CKR_A
2ca20 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09  RGUMENTS_BAD);..
2ca30 7d 0a 0a 09 64 61 74 61 6c 65 6e 5f 75 70 64 61  }...datalen_upda
2ca40 74 65 20 3d 20 2a 70 75 6c 44 61 74 61 4c 65 6e  te = *pulDataLen
2ca50 3b 0a 0a 09 64 65 63 72 79 70 74 5f 72 65 74 20  ;...decrypt_ret 
2ca60 3d 20 43 5f 44 65 63 72 79 70 74 55 70 64 61 74  = C_DecryptUpdat
2ca70 65 28 68 53 65 73 73 69 6f 6e 2c 20 70 45 6e 63  e(hSession, pEnc
2ca80 72 79 70 74 65 64 44 61 74 61 2c 20 75 6c 45 6e  ryptedData, ulEn
2ca90 63 72 79 70 74 65 64 44 61 74 61 4c 65 6e 2c 20  cryptedDataLen, 
2caa0 70 44 61 74 61 2c 20 26 64 61 74 61 6c 65 6e 5f  pData, &datalen_
2cab0 75 70 64 61 74 65 29 3b 0a 09 69 66 20 28 64 65  update);..if (de
2cac0 63 72 79 70 74 5f 72 65 74 20 21 3d 20 43 4b 52  crypt_ret != CKR
2cad0 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  _OK) {...CACKEY_
2cae0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2caf0 72 6f 72 2e 20 20 44 65 63 72 79 70 74 55 70 64  ror.  DecryptUpd
2cb00 61 74 65 28 29 20 72 65 74 75 72 6e 65 64 20 66  ate() returned f
2cb10 61 69 6c 75 72 65 20 28 72 76 20 3d 20 25 6c 75  ailure (rv = %lu
2cb20 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ).", (unsigned l
2cb30 6f 6e 67 29 20 64 65 63 72 79 70 74 5f 72 65 74  ong) decrypt_ret
2cb40 29 3b 0a 0a 09 09 69 66 20 28 64 65 63 72 79 70  );....if (decryp
2cb50 74 5f 72 65 74 20 21 3d 20 43 4b 52 5f 42 55 46  t_ret != CKR_BUF
2cb60 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 20 7b  FER_TOO_SMALL) {
2cb70 0a 09 09 09 2f 2a 20 54 65 72 6d 69 6e 61 74 65  ..../* Terminate
2cb80 20 64 65 63 72 79 70 74 69 6f 6e 20 6f 70 65 72   decryption oper
2cb90 61 74 69 6f 6e 20 2a 2f 0a 0a 09 09 09 6d 75 74  ation */.....mut
2cba0 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
2cbb0 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61  ey_mutex_lock(ca
2cbc0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
2cbd0 09 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
2cbe0 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 09 09 43  al != 0) {.....C
2cbf0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2cc00 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b  TF("Error.  Lock
2cc10 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
2cc20 09 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
2cc30 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
2cc40 09 09 7d 0a 0a 09 09 09 69 66 20 28 21 63 61 63  ..}.....if (!cac
2cc50 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
2cc60 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b  ssion].active) {
2cc70 0a 09 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65  .....cackey_mute
2cc80 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
2cc90 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 09 09 43  biglock);......C
2cca0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2ccb0 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73  TF("Error.  Sess
2ccc0 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22  ion not active."
2ccd0 29 3b 0a 09 09 0a 09 09 09 09 72 65 74 75 72 6e  );........return
2cce0 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  (CKR_SESSION_HAN
2ccf0 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 09  DLE_INVALID);...
2cd00 09 7d 0a 0a 09 09 09 69 66 20 28 21 63 61 63 6b  .}.....if (!cack
2cd10 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
2cd20 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 61 63  sion].decrypt_ac
2cd30 74 69 76 65 29 20 7b 0a 09 09 09 09 63 61 63 6b  tive) {.....cack
2cd40 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
2cd50 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
2cd60 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
2cd70 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2cd80 2e 20 20 44 65 63 72 79 70 74 20 6e 6f 74 20 61  .  Decrypt not a
2cd90 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 09  ctive.");.......
2cda0 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52  .return(CKR_OPER
2cdb0 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41  ATION_NOT_INITIA
2cdc0 4c 49 5a 45 44 29 3b 0a 09 09 09 7d 0a 0a 09 09  LIZED);....}....
2cdd0 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
2cde0 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79  [hSession].decry
2cdf0 70 74 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a 0a  pt_active = 0;..
2ce00 09 09 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
2ce10 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  = cackey_mutex_u
2ce20 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
2ce30 6c 6f 63 6b 29 3b 0a 09 09 09 69 66 20 28 6d 75  lock);....if (mu
2ce40 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
2ce50 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45   {.....CACKEY_DE
2ce60 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2ce70 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61  r.  Unlocking fa
2ce80 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 09 09 72 65  iled.");......re
2ce90 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
2cea0 5f 45 52 52 4f 52 29 3b 0a 09 09 09 7d 0a 09 09  _ERROR);....}...
2ceb0 7d 0a 0a 09 09 72 65 74 75 72 6e 28 64 65 63 72  }....return(decr
2cec0 79 70 74 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09 69  ypt_ret);..}...i
2ced0 66 20 28 70 44 61 74 61 29 20 7b 0a 09 09 70 44  f (pData) {...pD
2cee0 61 74 61 20 2b 3d 20 64 61 74 61 6c 65 6e 5f 75  ata += datalen_u
2cef0 70 64 61 74 65 3b 0a 09 7d 0a 09 64 61 74 61 6c  pdate;..}..datal
2cf00 65 6e 5f 66 69 6e 61 6c 20 3d 20 2a 70 75 6c 44  en_final = *pulD
2cf10 61 74 61 4c 65 6e 20 2d 20 64 61 74 61 6c 65 6e  ataLen - datalen
2cf20 5f 75 70 64 61 74 65 3b 0a 0a 09 64 65 63 72 79  _update;...decry
2cf30 70 74 5f 72 65 74 20 3d 20 43 5f 44 65 63 72 79  pt_ret = C_Decry
2cf40 70 74 46 69 6e 61 6c 28 68 53 65 73 73 69 6f 6e  ptFinal(hSession
2cf50 2c 20 70 44 61 74 61 2c 20 26 64 61 74 61 6c 65  , pData, &datale
2cf60 6e 5f 66 69 6e 61 6c 29 3b 0a 09 69 66 20 28 64  n_final);..if (d
2cf70 65 63 72 79 70 74 5f 72 65 74 20 21 3d 20 43 4b  ecrypt_ret != CK
2cf80 52 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59  R_OK) {...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 44 65 63 72 79 70 74 46 69  rror.  DecryptFi
2cfb0 6e 61 6c 28 29 20 72 65 74 75 72 6e 65 64 20 66  nal() returned f
2cfc0 61 69 6c 75 72 65 20 28 72 76 20 3d 20 25 6c 75  ailure (rv = %lu
2cfd0 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ).", (unsigned l
2cfe0 6f 6e 67 29 20 64 65 63 72 79 70 74 5f 72 65 74  ong) decrypt_ret
2cff0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 64 65 63  );....return(dec
2d000 72 79 70 74 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09  rypt_ret);..}...
2d010 2a 70 75 6c 44 61 74 61 4c 65 6e 20 3d 20 64 61  *pulDataLen = da
2d020 74 61 6c 65 6e 5f 75 70 64 61 74 65 20 2b 20 64  talen_update + d
2d030 61 74 61 6c 65 6e 5f 66 69 6e 61 6c 3b 0a 0a 09  atalen_final;...
2d040 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2d050 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
2d060 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52  KR_OK (%i)", CKR
2d070 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  _OK);...return(C
2d080 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  KR_OK);.}..CK_DE
2d090 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
2d0a0 5f 52 56 2c 20 43 5f 44 65 63 72 79 70 74 55 70  _RV, C_DecryptUp
2d0b0 64 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e  date)(CK_SESSION
2d0c0 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
2d0d0 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 45  , CK_BYTE_PTR pE
2d0e0 6e 63 72 79 70 74 65 64 50 61 72 74 2c 20 43 4b  ncryptedPart, CK
2d0f0 5f 55 4c 4f 4e 47 20 75 6c 45 6e 63 72 79 70 74  _ULONG ulEncrypt
2d100 65 64 50 61 72 74 4c 65 6e 2c 20 43 4b 5f 42 59  edPartLen, CK_BY
2d110 54 45 5f 50 54 52 20 70 50 61 72 74 2c 20 43 4b  TE_PTR pPart, CK
2d120 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 50 61  _ULONG_PTR pulPa
2d130 72 74 4c 65 6e 29 20 7b 0a 09 73 74 61 74 69 63  rtLen) {..static
2d140 20 43 4b 5f 42 59 54 45 20 62 75 66 5b 31 36 33   CK_BYTE buf[163
2d150 38 34 5d 3b 0a 09 73 73 69 7a 65 5f 74 20 62 75  84];..ssize_t bu
2d160 66 6c 65 6e 3b 0a 09 43 4b 5f 53 4c 4f 54 5f 49  flen;..CK_SLOT_I
2d170 44 20 73 6c 6f 74 49 44 3b 0a 09 43 4b 5f 52 56  D slotID;..CK_RV
2d180 20 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 47 45   retval = CKR_GE
2d190 4e 45 52 41 4c 5f 45 52 52 4f 52 3b 0a 09 69 6e  NERAL_ERROR;..in
2d1a0 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a  t mutex_retval;.
2d1b0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2d1c0 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
2d1d0 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
2d1e0 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
2d1f0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2d200 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
2d210 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
2d220 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
2d230 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
2d240 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
2d250 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20  if (hSession == 
2d260 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d  0 || hSession >=
2d270 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
2d280 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65  sessions) / size
2d290 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
2d2a0 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43  ns[0]))) {...CAC
2d2b0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2d2c0 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f  ("Error.  Sessio
2d2d0 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22  n out of range."
2d2e0 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
2d2f0 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  KR_SESSION_HANDL
2d300 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
2d310 09 69 66 20 28 70 45 6e 63 72 79 70 74 65 64 50  .if (pEncryptedP
2d320 61 72 74 20 3d 3d 20 4e 55 4c 4c 20 26 26 20 75  art == NULL && u
2d330 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65  lEncryptedPartLe
2d340 6e 20 3d 3d 20 30 29 20 7b 0a 09 09 2f 2a 20 53  n == 0) {.../* S
2d350 68 6f 72 74 20 63 69 72 63 75 69 74 20 69 66 20  hort circuit if 
2d360 77 65 20 61 72 65 20 61 73 6b 65 64 20 74 6f 20  we are asked to 
2d370 64 65 63 72 79 70 74 20 6e 6f 74 68 69 6e 67 2e  decrypt nothing.
2d380 2e 2e 20 2a 2f 0a 09 09 43 41 43 4b 45 59 5f 44  .. */...CACKEY_D
2d390 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
2d3a0 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25  urning CKR_OK (%
2d3b0 69 29 20 28 73 68 6f 72 74 20 63 69 72 63 75 69  i) (short circui
2d3c0 74 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09  t)", CKR_OK);...
2d3d0 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b  .return(CKR_OK);
2d3e0 0a 09 7d 0a 0a 09 69 66 20 28 70 45 6e 63 72 79  ..}...if (pEncry
2d3f0 70 74 65 64 50 61 72 74 20 3d 3d 20 4e 55 4c 4c  ptedPart == NULL
2d400 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
2d410 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2d420 2e 20 70 45 6e 63 72 79 70 74 65 64 50 61 72 74  . pEncryptedPart
2d430 20 69 73 20 4e 55 4c 4c 2c 20 62 75 74 20 75 6c   is NULL, but ul
2d440 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e  EncryptedPartLen
2d450 20 69 73 20 6e 6f 74 20 30 2e 22 29 3b 0a 0a 09   is not 0.");...
2d460 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55  .return(CKR_ARGU
2d470 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a  MENTS_BAD);..}..
2d480 09 69 66 20 28 75 6c 45 6e 63 72 79 70 74 65 64  .if (ulEncrypted
2d490 50 61 72 74 4c 65 6e 20 3d 3d 20 30 29 20 7b 0a  PartLen == 0) {.
2d4a0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2d4b0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 75 6c  RINTF("Error. ul
2d4c0 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e  EncryptedPartLen
2d4d0 20 69 73 20 30 2c 20 62 75 74 20 70 50 61 72 74   is 0, but pPart
2d4e0 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 22 29 3b   is not NULL.");
2d4f0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41  ....return(CKR_A
2d500 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09  RGUMENTS_BAD);..
2d510 7d 0a 0a 09 69 66 20 28 70 75 6c 50 61 72 74 4c  }...if (pulPartL
2d520 65 6e 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  en == NULL) {...
2d530 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2d540 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 75 6c 50  NTF("Error. pulP
2d550 61 72 74 4c 65 6e 20 69 73 20 4e 55 4c 4c 2e 22  artLen is NULL."
2d560 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
2d570 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b  _ARGUMENTS_BAD);
2d580 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  ..}...mutex_retv
2d590 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
2d5a0 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  x_lock(cackey_bi
2d5b0 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
2d5c0 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
2d5d0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
2d5e0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2d5f0 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e   Locking failed.
2d600 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
2d610 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
2d620 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b  ;..}...if (!cack
2d630 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
2d640 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a  sion].active) {.
2d650 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
2d660 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
2d670 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59  lock);....CACKEY
2d680 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2d690 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e  rror.  Session n
2d6a0 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09  ot active.");...
2d6b0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
2d6c0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56  SSION_HANDLE_INV
2d6d0 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  ALID);..}...if (
2d6e0 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  !cackey_sessions
2d6f0 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79  [hSession].decry
2d700 70 74 5f 61 63 74 69 76 65 29 20 7b 0a 09 09 63  pt_active) {...c
2d710 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
2d720 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
2d730 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  k);....CACKEY_DE
2d740 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2d750 72 2e 20 20 44 65 63 72 79 70 74 20 6e 6f 74 20  r.  Decrypt not 
2d760 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09  active.");......
2d770 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41  return(CKR_OPERA
2d780 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TION_NOT_INITIAL
2d790 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74  IZED);..}...slot
2d7a0 49 44 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73  ID = cackey_sess
2d7b0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
2d7c0 6c 6f 74 49 44 3b 0a 0a 09 69 66 20 28 73 6c 6f  lotID;...if (slo
2d7d0 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49  tID < 0 || slotI
2d7e0 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63  D >= (sizeof(cac
2d7f0 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a  key_slots) / siz
2d800 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
2d810 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45  [0]))) {...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 49 6e 76 61 6c 69 64 20 73  Error. Invalid s
2d840 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25  lot requested (%
2d850 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20  lu), outside of 
2d860 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c  valid range", sl
2d870 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e  otID);....return
2d880 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
2d890 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61  OR);..}...if (ca
2d8a0 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
2d8b0 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 29 20  D].active == 0) 
2d8c0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
2d8d0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2d8e0 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71  Invalid slot req
2d8f0 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 73 6c  uested (%lu), sl
2d900 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79  ot not currently
2d910 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 49 44   active", slotID
2d920 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  );....cackey_mut
2d930 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
2d940 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65  _biglock);....re
2d950 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
2d960 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 73 77  _ERROR);..}...sw
2d970 69 74 63 68 20 28 63 61 63 6b 65 79 5f 73 65 73  itch (cackey_ses
2d980 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
2d990 64 65 63 72 79 70 74 5f 6d 65 63 68 61 6e 69 73  decrypt_mechanis
2d9a0 6d 29 20 7b 0a 09 09 63 61 73 65 20 43 4b 4d 5f  m) {...case CKM_
2d9b0 52 53 41 5f 50 4b 43 53 3a 0a 09 09 09 2f 2a 20  RSA_PKCS:..../* 
2d9c0 41 73 6b 20 63 61 72 64 20 74 6f 20 64 65 63 72  Ask card to decr
2d9d0 79 70 74 20 2a 2f 0a 09 09 09 62 75 66 6c 65 6e  ypt */....buflen
2d9e0 20 3d 20 63 61 63 6b 65 79 5f 73 69 67 6e 64 65   = cackey_signde
2d9f0 63 72 79 70 74 28 26 63 61 63 6b 65 79 5f 73 6c  crypt(&cackey_sl
2da00 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c 20 63 61 63  ots[slotID], cac
2da10 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
2da20 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 69  ssion].decrypt_i
2da30 64 65 6e 74 69 74 79 2c 20 70 45 6e 63 72 79 70  dentity, pEncryp
2da40 74 65 64 50 61 72 74 2c 20 75 6c 45 6e 63 72 79  tedPart, ulEncry
2da50 70 74 65 64 50 61 72 74 4c 65 6e 2c 20 62 75 66  ptedPartLen, buf
2da60 2c 20 73 69 7a 65 6f 66 28 62 75 66 29 2c 20 30  , sizeof(buf), 0
2da70 2c 20 31 29 3b 0a 0a 09 09 09 69 66 20 28 62 75  , 1);.....if (bu
2da80 66 6c 65 6e 20 3d 3d 20 43 41 43 4b 45 59 5f 50  flen == CACKEY_P
2da90 43 53 43 5f 45 5f 4e 45 45 44 4c 4f 47 49 4e 20  CSC_E_NEEDLOGIN 
2daa0 26 26 20 63 61 63 6b 65 79 5f 70 69 6e 5f 63 6f  && cackey_pin_co
2dab0 6d 6d 61 6e 64 20 21 3d 20 4e 55 4c 4c 29 20 7b  mmand != NULL) {
2dac0 0a 09 09 09 09 69 66 20 28 5f 43 5f 4c 6f 67 69  .....if (_C_Logi
2dad0 6e 4d 75 74 65 78 41 72 67 28 68 53 65 73 73 69  nMutexArg(hSessi
2dae0 6f 6e 2c 20 43 4b 55 5f 55 53 45 52 2c 20 4e 55  on, CKU_USER, NU
2daf0 4c 4c 2c 20 30 2c 20 30 29 20 3d 3d 20 43 4b 52  LL, 0, 0) == CKR
2db00 5f 4f 4b 29 20 7b 0a 09 09 09 09 09 62 75 66 6c  _OK) {......bufl
2db10 65 6e 20 3d 20 63 61 63 6b 65 79 5f 73 69 67 6e  en = cackey_sign
2db20 64 65 63 72 79 70 74 28 26 63 61 63 6b 65 79 5f  decrypt(&cackey_
2db30 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c 20 63  slots[slotID], c
2db40 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
2db50 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74  Session].decrypt
2db60 5f 69 64 65 6e 74 69 74 79 2c 20 70 45 6e 63 72  _identity, pEncr
2db70 79 70 74 65 64 50 61 72 74 2c 20 75 6c 45 6e 63  yptedPart, ulEnc
2db80 72 79 70 74 65 64 50 61 72 74 4c 65 6e 2c 20 62  ryptedPartLen, b
2db90 75 66 2c 20 73 69 7a 65 6f 66 28 62 75 66 29 2c  uf, sizeof(buf),
2dba0 20 30 2c 20 31 29 3b 0a 09 09 09 09 7d 0a 09 09   0, 1);.....}...
2dbb0 09 7d 0a 0a 09 09 09 69 66 20 28 62 75 66 6c 65  .}.....if (bufle
2dbc0 6e 20 3c 20 30 29 20 7b 0a 09 09 09 09 2f 2a 20  n < 0) {...../* 
2dbd0 44 65 63 72 79 70 74 69 6f 6e 20 66 61 69 6c 65  Decryption faile
2dbe0 64 2e 20 2a 2f 0a 09 09 09 09 69 66 20 28 62 75  d. */.....if (bu
2dbf0 66 6c 65 6e 20 3d 3d 20 43 41 43 4b 45 59 5f 50  flen == CACKEY_P
2dc00 43 53 43 5f 45 5f 4e 45 45 44 4c 4f 47 49 4e 29  CSC_E_NEEDLOGIN)
2dc10 20 7b 0a 09 09 09 09 09 72 65 74 76 61 6c 20 3d   {......retval =
2dc20 20 43 4b 52 5f 55 53 45 52 5f 4e 4f 54 5f 4c 4f   CKR_USER_NOT_LO
2dc30 47 47 45 44 5f 49 4e 3b 0a 09 09 09 09 7d 20 65  GGED_IN;.....} e
2dc40 6c 73 65 20 69 66 20 28 62 75 66 6c 65 6e 20 3d  lse if (buflen =
2dc50 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  = CACKEY_PCSC_E_
2dc60 54 4f 4b 45 4e 41 42 53 45 4e 54 29 20 7b 0a 09  TOKENABSENT) {..
2dc70 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52  ....retval = CKR
2dc80 5f 44 45 56 49 43 45 5f 52 45 4d 4f 56 45 44 3b  _DEVICE_REMOVED;
2dc90 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  .....} else {...
2dca0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2dcb0 50 52 49 4e 54 46 28 22 46 61 69 6c 65 64 20 74  PRINTF("Failed t
2dcc0 6f 20 73 65 6e 64 20 41 50 44 55 2c 20 65 72 72  o send APDU, err
2dcd0 6f 72 20 3d 20 25 6c 69 22 2c 20 28 6c 6f 6e 67  or = %li", (long
2dce0 20 69 6e 74 29 20 62 75 66 6c 65 6e 29 3b 0a 0a   int) buflen);..
2dcf0 09 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b  .....retval = CK
2dd00 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 3b  R_GENERAL_ERROR;
2dd10 0a 09 09 09 09 7d 0a 09 09 09 7d 20 65 6c 73 65  .....}....} else
2dd20 20 69 66 20 28 28 28 75 6e 73 69 67 6e 65 64 20   if (((unsigned 
2dd30 6c 6f 6e 67 29 20 62 75 66 6c 65 6e 29 20 3e 20  long) buflen) > 
2dd40 2a 70 75 6c 50 61 72 74 4c 65 6e 20 26 26 20 70  *pulPartLen && p
2dd50 50 61 72 74 29 20 7b 0a 09 09 09 09 2f 2a 20 44  Part) {...../* D
2dd60 65 63 72 79 70 74 65 64 20 64 61 74 61 20 74 6f  ecrypted data to
2dd70 6f 20 6c 61 72 67 65 20 2a 2f 0a 09 09 09 09 72  o large */.....r
2dd80 65 74 76 61 6c 20 3d 20 43 4b 52 5f 42 55 46 46  etval = CKR_BUFF
2dd90 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 3b 0a 09 09  ER_TOO_SMALL;...
2dda0 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 69 66  .} else {.....if
2ddb0 20 28 70 50 61 72 74 29 20 7b 0a 09 09 09 09 09   (pPart) {......
2ddc0 6d 65 6d 63 70 79 28 70 50 61 72 74 2c 20 62 75  memcpy(pPart, bu
2ddd0 66 2c 20 62 75 66 6c 65 6e 29 3b 0a 09 09 09 09  f, buflen);.....
2dde0 7d 0a 0a 09 09 09 09 2a 70 75 6c 50 61 72 74 4c  }......*pulPartL
2ddf0 65 6e 20 3d 20 62 75 66 6c 65 6e 3b 0a 0a 09 09  en = buflen;....
2de00 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 4f  ..retval = CKR_O
2de10 4b 3b 0a 09 09 09 7d 0a 0a 09 09 09 62 72 65 61  K;....}.....brea
2de20 6b 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65  k;..}...mutex_re
2de30 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
2de40 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
2de50 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
2de60 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
2de70 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
2de80 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2de90 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66  or.  Unlocking f
2dea0 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
2deb0 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
2dec0 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43  ERROR);..}...CAC
2ded0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2dee0 28 22 52 65 74 75 72 6e 69 6e 67 20 25 69 22 2c  ("Returning %i",
2def0 20 28 69 6e 74 29 20 72 65 74 76 61 6c 29 3b 0a   (int) retval);.
2df00 0a 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29  ..return(retval)
2df10 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
2df20 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
2df30 5f 44 65 63 72 79 70 74 46 69 6e 61 6c 29 28 43  _DecryptFinal)(C
2df40 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
2df50 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59   hSession, CK_BY
2df60 54 45 5f 50 54 52 20 70 4c 61 73 74 50 61 72 74  TE_PTR pLastPart
2df70 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70  , CK_ULONG_PTR p
2df80 75 6c 4c 61 73 74 50 61 72 74 4c 65 6e 29 20 7b  ulLastPartLen) {
2df90 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76  ..int mutex_retv
2dfa0 61 6c 3b 0a 09 69 6e 74 20 74 65 72 6d 69 6e 61  al;..int termina
2dfb0 74 65 5f 64 65 63 72 79 70 74 20 3d 20 31 3b 0a  te_decrypt = 1;.
2dfc0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2dfd0 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
2dfe0 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
2dff0 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
2e000 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2e010 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
2e020 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
2e030 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
2e040 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
2e050 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
2e060 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20  if (hSession == 
2e070 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d  0 || hSession >=
2e080 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
2e090 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65  sessions) / size
2e0a0 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
2e0b0 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43  ns[0]))) {...CAC
2e0c0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2e0d0 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f  ("Error.  Sessio
2e0e0 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22  n out of range."
2e0f0 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
2e100 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  KR_SESSION_HANDL
2e110 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
2e120 09 69 66 20 28 70 75 6c 4c 61 73 74 50 61 72 74  .if (pulLastPart
2e130 4c 65 6e 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  Len == NULL) {..
2e140 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2e150 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 75 6c  INTF("Error. pul
2e160 4c 61 73 74 50 61 72 74 4c 65 6e 20 69 73 20 4e  LastPartLen is N
2e170 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  ULL.");....retur
2e180 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f  n(CKR_ARGUMENTS_
2e190 42 41 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78  BAD);..}...mutex
2e1a0 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
2e1b0 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b  _mutex_lock(cack
2e1c0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
2e1d0 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
2e1e0 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
2e1f0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2e200 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61  ror.  Locking fa
2e210 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
2e220 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
2e230 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  RROR);..}...if (
2e240 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  !cackey_sessions
2e250 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76  [hSession].activ
2e260 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75  e) {...cackey_mu
2e270 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
2e280 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43  y_biglock);....C
2e290 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2e2a0 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73  TF("Error.  Sess
2e2b0 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22  ion not active."
2e2c0 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
2e2d0 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  KR_SESSION_HANDL
2e2e0 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
2e2f0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73  .if (!cackey_ses
2e300 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
2e310 64 65 63 72 79 70 74 5f 61 63 74 69 76 65 29 20  decrypt_active) 
2e320 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  {...cackey_mutex
2e330 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
2e340 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b  iglock);....CACK
2e350 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2e360 22 45 72 72 6f 72 2e 20 20 44 65 63 72 79 70 74  "Error.  Decrypt
2e370 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a   not active.");.
2e380 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
2e390 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e  OPERATION_NOT_IN
2e3a0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
2e3b0 09 2a 70 75 6c 4c 61 73 74 50 61 72 74 4c 65 6e  .*pulLastPartLen
2e3c0 20 3d 20 30 3b 0a 0a 09 69 66 20 28 70 4c 61 73   = 0;...if (pLas
2e3d0 74 50 61 72 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b  tPart == NULL) {
2e3e0 0a 09 09 74 65 72 6d 69 6e 61 74 65 5f 64 65 63  ...terminate_dec
2e3f0 72 79 70 74 20 3d 20 30 3b 0a 09 7d 0a 0a 09 69  rypt = 0;..}...i
2e400 66 20 28 74 65 72 6d 69 6e 61 74 65 5f 64 65 63  f (terminate_dec
2e410 72 79 70 74 29 20 7b 0a 09 09 63 61 63 6b 65 79  rypt) {...cackey
2e420 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
2e430 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 61 63 74 69  on].decrypt_acti
2e440 76 65 20 3d 20 30 3b 0a 09 7d 0a 0a 09 6d 75 74  ve = 0;..}...mut
2e450 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
2e460 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
2e470 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
2e480 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
2e490 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
2e4a0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2e4b0 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b  ("Error.  Unlock
2e4c0 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
2e4d0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
2e4e0 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
2e4f0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2e500 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
2e510 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43   CKR_OK (%i)", C
2e520 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e  KR_OK);...return
2e530 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f  (CKR_OK);.}..CK_
2e540 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
2e550 43 4b 5f 52 56 2c 20 43 5f 44 69 67 65 73 74 49  CK_RV, C_DigestI
2e560 6e 69 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  nit)(CK_SESSION_
2e570 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
2e580 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54   CK_MECHANISM_PT
2e590 52 20 70 4d 65 63 68 61 6e 69 73 6d 29 20 7b 0a  R pMechanism) {.
2e5a0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2e5b0 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
2e5c0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
2e5d0 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
2e5e0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2e5f0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
2e600 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
2e610 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
2e620 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
2e630 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
2e640 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2e650 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
2e660 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2e670 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20  UPPORTED (%i)", 
2e680 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
2e690 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72  _SUPPORTED);...r
2e6a0 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
2e6b0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
2e6c0 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
2e6d0 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
2e6e0 43 5f 44 69 67 65 73 74 29 28 43 4b 5f 53 45 53  C_Digest)(CK_SES
2e6f0 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
2e700 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  sion, CK_BYTE_PT
2e710 52 20 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e  R pData, CK_ULON
2e720 47 20 75 6c 44 61 74 61 4c 65 6e 2c 20 43 4b 5f  G ulDataLen, CK_
2e730 42 59 54 45 5f 50 54 52 20 70 44 69 67 65 73 74  BYTE_PTR pDigest
2e740 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70  , CK_ULONG_PTR p
2e750 75 6c 44 69 67 65 73 74 4c 65 6e 29 20 7b 0a 09  ulDigestLen) {..
2e760 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2e770 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
2e780 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
2e790 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
2e7a0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2e7b0 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
2e7c0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
2e7d0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
2e7e0 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
2e7f0 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
2e800 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2e810 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
2e820 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
2e830 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
2e840 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
2e850 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
2e860 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
2e870 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
2e880 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
2e890 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
2e8a0 5f 44 69 67 65 73 74 55 70 64 61 74 65 29 28 43  _DigestUpdate)(C
2e8b0 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
2e8c0 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59   hSession, CK_BY
2e8d0 54 45 5f 50 54 52 20 70 50 61 72 74 2c 20 43 4b  TE_PTR pPart, CK
2e8e0 5f 55 4c 4f 4e 47 20 75 6c 50 61 72 74 4c 65 6e  _ULONG ulPartLen
2e8f0 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
2e900 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
2e910 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
2e920 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
2e930 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
2e940 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2e950 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
2e960 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
2e970 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
2e980 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
2e990 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2e9a0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
2e9b0 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
2e9c0 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
2e9d0 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
2e9e0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
2e9f0 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
2ea00 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
2ea10 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
2ea20 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
2ea30 52 56 2c 20 43 5f 44 69 67 65 73 74 4b 65 79 29  RV, C_DigestKey)
2ea40 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
2ea50 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
2ea60 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b  OBJECT_HANDLE hK
2ea70 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  ey) {..CACKEY_DE
2ea80 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
2ea90 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
2eaa0 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
2eab0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
2eac0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2ead0 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
2eae0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
2eaf0 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
2eb00 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
2eb10 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
2eb20 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
2eb30 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
2eb40 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
2eb50 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
2eb60 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
2eb70 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
2eb80 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
2eb90 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
2eba0 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
2ebb0 4b 5f 52 56 2c 20 43 5f 44 69 67 65 73 74 46 69  K_RV, C_DigestFi
2ebc0 6e 61 6c 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  nal)(CK_SESSION_
2ebd0 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
2ebe0 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 44 69   CK_BYTE_PTR pDi
2ebf0 67 65 73 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50  gest, CK_ULONG_P
2ec00 54 52 20 70 75 6c 44 69 67 65 73 74 4c 65 6e 29  TR pulDigestLen)
2ec10 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
2ec20 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
2ec30 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
2ec40 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
2ec50 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2ec60 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
2ec70 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
2ec80 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
2ec90 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
2eca0 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
2ecb0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2ecc0 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
2ecd0 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
2ece0 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
2ecf0 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
2ed00 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
2ed10 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
2ed20 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
2ed30 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  TED);.}..CK_DEFI
2ed40 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
2ed50 56 2c 20 43 5f 53 69 67 6e 49 6e 69 74 29 28 43  V, C_SignInit)(C
2ed60 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
2ed70 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45   hSession, CK_ME
2ed80 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63  CHANISM_PTR pMec
2ed90 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43  hanism, CK_OBJEC
2eda0 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79 29 20 7b  T_HANDLE hKey) {
2edb0 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76  ..int mutex_retv
2edc0 61 6c 3b 0a 0a 09 68 4b 65 79 2d 2d 3b 0a 0a 09  al;...hKey--;...
2edd0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2ede0 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
2edf0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
2ee00 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
2ee10 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2ee20 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
2ee30 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
2ee40 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
2ee50 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
2ee60 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66  ALIZED);..}...if
2ee70 20 28 70 4d 65 63 68 61 6e 69 73 6d 20 3d 3d 20   (pMechanism == 
2ee80 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
2ee90 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2eea0 72 72 6f 72 2e 20 70 4d 65 63 68 61 6e 69 73 6d  rror. pMechanism
2eeb0 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09   is NULL.");....
2eec0 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d  return(CKR_ARGUM
2eed0 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09  ENTS_BAD);..}...
2eee0 69 66 20 28 70 4d 65 63 68 61 6e 69 73 6d 2d 3e  if (pMechanism->
2eef0 6d 65 63 68 61 6e 69 73 6d 20 21 3d 20 43 4b 4d  mechanism != CKM
2ef00 5f 52 53 41 5f 50 4b 43 53 29 20 7b 0a 09 09 43  _RSA_PKCS) {...C
2ef10 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2ef20 54 46 28 22 45 72 72 6f 72 2e 20 70 4d 65 63 68  TF("Error. pMech
2ef30 61 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d  anism->mechanism
2ef40 20 6e 6f 74 20 73 70 65 63 69 66 69 65 64 20 61   not specified a
2ef50 73 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 22 29  s CKM_RSA_PKCS")
2ef60 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
2ef70 4d 45 43 48 41 4e 49 53 4d 5f 50 41 52 41 4d 5f  MECHANISM_PARAM_
2ef80 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69  INVALID);..}...i
2ef90 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30  f (hSession == 0
2efa0 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20   || hSession >= 
2efb0 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
2efc0 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f  essions) / sizeo
2efd0 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
2efe0 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b  s[0]))) {...CACK
2eff0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2f000 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e  "Error.  Session
2f010 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29   out of range.")
2f020 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
2f030 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  R_SESSION_HANDLE
2f040 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
2f050 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
2f060 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b  ackey_mutex_lock
2f070 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
2f080 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
2f090 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
2f0a0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2f0b0 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69  F("Error.  Locki
2f0c0 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
2f0d0 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
2f0e0 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
2f0f0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73  .if (!cackey_ses
2f100 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
2f110 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b  active) {...cack
2f120 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
2f130 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
2f140 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
2f150 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2f160 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74   Session not act
2f170 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  ive.");......ret
2f180 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  urn(CKR_SESSION_
2f190 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
2f1a0 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79  ..}...if (cackey
2f1b0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
2f1c0 6f 6e 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65 29  on].sign_active)
2f1d0 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65   {...cackey_mute
2f1e0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
2f1f0 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43  biglock);....CAC
2f200 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2f210 28 22 45 72 72 6f 72 2e 20 20 53 69 67 6e 20 61  ("Error.  Sign a
2f220 6c 72 65 61 64 79 20 69 6e 20 70 72 6f 67 72 65  lready in progre
2f230 73 73 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ss.");......retu
2f240 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e  rn(CKR_OPERATION
2f250 5f 41 43 54 49 56 45 29 3b 0a 09 7d 0a 0a 09 69  _ACTIVE);..}...i
2f260 66 20 28 68 4b 65 79 20 3e 3d 20 63 61 63 6b 65  f (hKey >= cacke
2f270 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
2f280 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f  ion].identities_
2f290 63 6f 75 6e 74 29 20 7b 0a 09 09 63 61 63 6b 65  count) {...cacke
2f2a0 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
2f2b0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
2f2c0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2f2d0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
2f2e0 4b 65 79 20 68 61 6e 64 6c 65 20 6f 75 74 20 6f  Key handle out o
2f2f0 66 20 72 61 6e 67 65 20 28 72 65 71 75 65 73 74  f range (request
2f300 65 64 20 6b 65 79 20 25 6c 75 2c 20 6f 6e 6c 79  ed key %lu, only
2f310 20 25 6c 75 20 69 64 65 6e 74 69 74 69 65 73 20   %lu identities 
2f320 61 76 61 69 6c 61 62 6c 65 29 2e 22 2c 20 28 75  available).", (u
2f330 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 68 4b  nsigned long) hK
2f340 65 79 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  ey, (unsigned lo
2f350 6e 67 29 20 63 61 63 6b 65 79 5f 73 65 73 73 69  ng) cackey_sessi
2f360 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64  ons[hSession].id
2f370 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 29 3b  entities_count);
2f380 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4b  ....return(CKR_K
2f390 45 59 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  EY_HANDLE_INVALI
2f3a0 44 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f  D);..}...cackey_
2f3b0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
2f3c0 6e 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65 20 3d  n].sign_active =
2f3d0 20 31 3b 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73   1;...cackey_ses
2f3e0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
2f3f0 73 69 67 6e 5f 6d 65 63 68 61 6e 69 73 6d 20 3d  sign_mechanism =
2f400 20 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d 65 63   pMechanism->mec
2f410 68 61 6e 69 73 6d 3b 0a 0a 09 63 61 63 6b 65 79  hanism;...cackey
2f420 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
2f430 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 6c 65 6e 20  on].sign_buflen 
2f440 3d 20 31 32 38 3b 0a 09 63 61 63 6b 65 79 5f 73  = 128;..cackey_s
2f450 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
2f460 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 20 3d  ].sign_bufused =
2f470 20 30 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73 73   0;..cackey_sess
2f480 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
2f490 69 67 6e 5f 62 75 66 20 3d 20 6d 61 6c 6c 6f 63  ign_buf = malloc
2f4a0 28 73 69 7a 65 6f 66 28 2a 63 61 63 6b 65 79 5f  (sizeof(*cackey_
2f4b0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
2f4c0 6e 5d 2e 73 69 67 6e 5f 62 75 66 29 20 2a 20 63  n].sign_buf) * c
2f4d0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
2f4e0 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75  Session].sign_bu
2f4f0 66 6c 65 6e 29 3b 0a 0a 09 43 41 43 4b 45 59 5f  flen);...CACKEY_
2f500 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 65  DEBUG_PRINTF("Se
2f510 73 73 69 6f 6e 20 25 6c 75 20 73 69 67 6e 5f 69  ssion %lu sign_i
2f520 64 65 6e 74 69 74 79 20 69 73 20 25 70 20 28 69  dentity is %p (i
2f530 64 65 6e 74 69 74 79 20 23 25 6c 75 29 22 2c 20  dentity #%lu)", 
2f540 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
2f550 68 53 65 73 73 69 6f 6e 2c 20 28 76 6f 69 64 20  hSession, (void 
2f560 2a 29 20 26 63 61 63 6b 65 79 5f 73 65 73 73 69  *) &cackey_sessi
2f570 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64  ons[hSession].id
2f580 65 6e 74 69 74 69 65 73 5b 68 4b 65 79 5d 2c 20  entities[hKey], 
2f590 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
2f5a0 68 4b 65 79 29 3b 0a 09 63 61 63 6b 65 79 5f 73  hKey);..cackey_s
2f5b0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
2f5c0 5d 2e 73 69 67 6e 5f 69 64 65 6e 74 69 74 79 20  ].sign_identity 
2f5d0 3d 20 26 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  = &cackey_sessio
2f5e0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65  ns[hSession].ide
2f5f0 6e 74 69 74 69 65 73 5b 68 4b 65 79 5d 3b 0a 0a  ntities[hKey];..
2f600 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
2f610 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
2f620 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
2f630 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
2f640 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
2f650 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2f660 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e  INTF("Error.  Un
2f670 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  locking failed."
2f680 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
2f690 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
2f6a0 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
2f6b0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
2f6c0 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29  ning CKR_OK (%i)
2f6d0 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65  ", CKR_OK);...re
2f6e0 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a  turn(CKR_OK);.}.
2f6f0 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
2f700 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 69 67  ION(CK_RV, C_Sig
2f710 6e 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  n)(CK_SESSION_HA
2f720 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
2f730 4b 5f 42 59 54 45 5f 50 54 52 20 70 44 61 74 61  K_BYTE_PTR pData
2f740 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 44 61 74  , CK_ULONG ulDat
2f750 61 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  aLen, CK_BYTE_PT
2f760 52 20 70 53 69 67 6e 61 74 75 72 65 2c 20 43 4b  R pSignature, CK
2f770 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 53 69  _ULONG_PTR pulSi
2f780 67 6e 61 74 75 72 65 4c 65 6e 29 20 7b 0a 09 75  gnatureLen) {..u
2f790 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 73 74 61  nsigned long sta
2f7a0 72 74 5f 73 69 67 6e 5f 62 75 66 75 73 65 64 3b  rt_sign_bufused;
2f7b0 0a 09 43 4b 5f 52 56 20 73 69 67 6e 5f 72 65 74  ..CK_RV sign_ret
2f7c0 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74  ;..int mutex_ret
2f7d0 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  val;...CACKEY_DE
2f7e0 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
2f7f0 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
2f800 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
2f810 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
2f820 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2f830 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
2f840 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
2f850 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
2f860 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
2f870 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f  .}...if (hSessio
2f880 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69  n == 0 || hSessi
2f890 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61  on >= (sizeof(ca
2f8a0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f  ckey_sessions) /
2f8b0 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73   sizeof(cackey_s
2f8c0 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a  essions[0]))) {.
2f8d0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2f8e0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
2f8f0 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61  ession out of ra
2f900 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  nge.");......ret
2f910 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  urn(CKR_SESSION_
2f920 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
2f930 0a 09 7d 0a 0a 09 73 74 61 72 74 5f 73 69 67 6e  ..}...start_sign
2f940 5f 62 75 66 75 73 65 64 20 3d 20 63 61 63 6b 65  _bufused = cacke
2f950 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
2f960 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65  ion].sign_bufuse
2f970 64 3b 0a 0a 09 73 69 67 6e 5f 72 65 74 20 3d 20  d;...sign_ret = 
2f980 43 5f 53 69 67 6e 55 70 64 61 74 65 28 68 53 65  C_SignUpdate(hSe
2f990 73 73 69 6f 6e 2c 20 70 44 61 74 61 2c 20 75 6c  ssion, pData, ul
2f9a0 44 61 74 61 4c 65 6e 29 3b 0a 09 69 66 20 28 73  DataLen);..if (s
2f9b0 69 67 6e 5f 72 65 74 20 21 3d 20 43 4b 52 5f 4f  ign_ret != CKR_O
2f9c0 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  K) {...CACKEY_DE
2f9d0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2f9e0 72 2e 20 20 53 69 67 6e 55 70 64 61 74 65 28 29  r.  SignUpdate()
2f9f0 20 72 65 74 75 72 6e 65 64 20 66 61 69 6c 75 72   returned failur
2fa00 65 20 28 72 76 20 3d 20 25 6c 75 29 2e 22 2c 20  e (rv = %lu).", 
2fa10 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
2fa20 73 69 67 6e 5f 72 65 74 29 3b 0a 0a 09 09 69 66  sign_ret);....if
2fa30 20 28 73 69 67 6e 5f 72 65 74 20 21 3d 20 43 4b   (sign_ret != CK
2fa40 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41  R_BUFFER_TOO_SMA
2fa50 4c 4c 29 20 7b 0a 09 09 09 6d 75 74 65 78 5f 72  LL) {....mutex_r
2fa60 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
2fa70 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79  utex_lock(cackey
2fa80 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 09 69 66  _biglock);....if
2fa90 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
2faa0 3d 20 30 29 20 7b 0a 09 09 09 09 43 41 43 4b 45  = 0) {.....CACKE
2fab0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2fac0 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20  Error.  Locking 
2fad0 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 09 09  failed.");......
2fae0 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
2faf0 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 09 09 7d 0a  AL_ERROR);....}.
2fb00 0a 09 09 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ....if (!cackey_
2fb10 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
2fb20 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 09  n].active) {....
2fb30 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
2fb40 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
2fb50 6f 63 6b 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45  ock);......CACKE
2fb60 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2fb70 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20  Error.  Session 
2fb80 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09  not active.");..
2fb90 09 0a 09 09 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
2fba0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
2fbb0 49 4e 56 41 4c 49 44 29 3b 0a 09 09 09 7d 0a 0a  INVALID);....}..
2fbc0 09 09 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73  ...if (!cackey_s
2fbd0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
2fbe0 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65 29 20 7b  ].sign_active) {
2fbf0 0a 09 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65  .....cackey_mute
2fc00 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
2fc10 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 09 09 43  biglock);......C
2fc20 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2fc30 54 46 28 22 45 72 72 6f 72 2e 20 20 53 69 67 6e  TF("Error.  Sign
2fc40 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a   not active.");.
2fc50 09 09 0a 09 09 09 09 72 65 74 75 72 6e 28 43 4b  .......return(CK
2fc60 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f  R_OPERATION_NOT_
2fc70 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 09  INITIALIZED);...
2fc80 09 7d 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65  .}.....cackey_se
2fc90 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
2fca0 2e 73 69 67 6e 5f 61 63 74 69 76 65 20 3d 20 30  .sign_active = 0
2fcb0 3b 0a 0a 09 09 09 6d 75 74 65 78 5f 72 65 74 76  ;.....mutex_retv
2fcc0 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
2fcd0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
2fce0 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 09 69 66 20  biglock);....if 
2fcf0 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
2fd00 20 30 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59   0) {.....CACKEY
2fd10 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2fd20 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67  rror.  Unlocking
2fd30 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 09   failed.");.....
2fd40 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
2fd50 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 09 09 7d  RAL_ERROR);....}
2fd60 0a 09 09 7d 0a 0a 09 09 72 65 74 75 72 6e 28 73  ...}....return(s
2fd70 69 67 6e 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09 73  ign_ret);..}...s
2fd80 69 67 6e 5f 72 65 74 20 3d 20 43 5f 53 69 67 6e  ign_ret = C_Sign
2fd90 46 69 6e 61 6c 28 68 53 65 73 73 69 6f 6e 2c 20  Final(hSession, 
2fda0 70 53 69 67 6e 61 74 75 72 65 2c 20 70 75 6c 53  pSignature, pulS
2fdb0 69 67 6e 61 74 75 72 65 4c 65 6e 29 3b 0a 09 69  ignatureLen);..i
2fdc0 66 20 28 73 69 67 6e 5f 72 65 74 20 21 3d 20 43  f (sign_ret != C
2fdd0 4b 52 5f 4f 4b 29 20 7b 0a 09 09 69 66 20 28 73  KR_OK) {...if (s
2fde0 69 67 6e 5f 72 65 74 20 3d 3d 20 43 4b 52 5f 42  ign_ret == CKR_B
2fdf0 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 29  UFFER_TOO_SMALL)
2fe00 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
2fe10 55 47 5f 50 52 49 4e 54 46 28 22 53 69 67 6e 46  UG_PRINTF("SignF
2fe20 69 6e 61 6c 28 29 20 72 65 74 75 72 6e 65 64 20  inal() returned 
2fe30 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53  CKR_BUFFER_TOO_S
2fe40 4d 41 4c 4c 20 28 72 76 20 3d 20 25 6c 75 29 2c  MALL (rv = %lu),
2fe50 20 75 6e 64 6f 69 6e 67 20 43 5f 53 69 67 6e 55   undoing C_SignU
2fe60 70 64 61 74 65 28 29 22 2c 20 28 75 6e 73 69 67  pdate()", (unsig
2fe70 6e 65 64 20 6c 6f 6e 67 29 20 73 69 67 6e 5f 72  ned long) sign_r
2fe80 65 74 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f  et);.....cackey_
2fe90 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
2fea0 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 20  n].sign_bufused 
2feb0 3d 20 73 74 61 72 74 5f 73 69 67 6e 5f 62 75 66  = start_sign_buf
2fec0 75 73 65 64 3b 0a 0a 09 09 09 72 65 74 75 72 6e  used;.....return
2fed0 28 73 69 67 6e 5f 72 65 74 29 3b 0a 09 09 7d 0a  (sign_ret);...}.
2fee0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2fef0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
2ff00 53 69 67 6e 46 69 6e 61 6c 28 29 20 72 65 74 75  SignFinal() retu
2ff10 72 6e 65 64 20 66 61 69 6c 75 72 65 20 28 72 76  rned failure (rv
2ff20 20 3d 20 25 6c 75 29 2e 22 2c 20 28 75 6e 73 69   = %lu).", (unsi
2ff30 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69 67 6e 5f  gned long) sign_
2ff40 72 65 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  ret);....return(
2ff50 73 69 67 6e 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09  sign_ret);..}...
2ff60 69 66 20 28 70 53 69 67 6e 61 74 75 72 65 20 3d  if (pSignature =
2ff70 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
2ff80 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2ff90 22 70 53 69 67 6e 61 74 75 72 65 20 73 70 65 63  "pSignature spec
2ffa0 69 66 69 65 64 20 61 73 20 4e 55 4c 4c 2c 20 75  ified as NULL, u
2ffb0 6e 64 6f 69 6e 67 20 43 5f 53 69 67 6e 55 70 64  ndoing C_SignUpd
2ffc0 61 74 65 28 29 22 29 3b 0a 0a 09 09 63 61 63 6b  ate()");....cack
2ffd0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
2ffe0 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73  sion].sign_bufus
2fff0 65 64 20 3d 20 73 74 61 72 74 5f 73 69 67 6e 5f  ed = start_sign_
30000 62 75 66 75 73 65 64 3b 0a 0a 09 09 72 65 74 75  bufused;....retu
30010 72 6e 28 73 69 67 6e 5f 72 65 74 29 3b 0a 09 7d  rn(sign_ret);..}
30020 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
30030 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
30040 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20  g CKR_OK (%i)", 
30050 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72  CKR_OK);...retur
30060 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b  n(CKR_OK);.}..CK
30070 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
30080 28 43 4b 5f 52 56 2c 20 43 5f 53 69 67 6e 55 70  (CK_RV, C_SignUp
30090 64 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e  date)(CK_SESSION
300a0 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
300b0 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50  , CK_BYTE_PTR pP
300c0 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  art, CK_ULONG ul
300d0 50 61 72 74 4c 65 6e 29 20 7b 0a 09 69 6e 74 20  PartLen) {..int 
300e0 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09  mutex_retval;...
300f0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
30100 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
30110 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
30120 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
30130 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
30140 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
30150 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
30160 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
30170 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
30180 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66  ALIZED);..}...if
30190 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20   (hSession == 0 
301a0 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28  || hSession >= (
301b0 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
301c0 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66  ssions) / sizeof
301d0 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
301e0 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45  [0]))) {...CACKE
301f0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
30200 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20  Error.  Session 
30210 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b  out of range.");
30220 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
30230 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
30240 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69  INVALID);..}...i
30250 66 20 28 70 50 61 72 74 20 3d 3d 20 4e 55 4c 4c  f (pPart == NULL
30260 20 26 26 20 75 6c 50 61 72 74 4c 65 6e 20 3d 3d   && ulPartLen ==
30270 20 30 29 20 7b 0a 09 09 2f 2a 20 53 68 6f 72 74   0) {.../* Short
30280 20 63 69 72 63 75 69 74 20 69 66 20 77 65 20 61   circuit if we a
30290 72 65 20 61 73 6b 65 64 20 74 6f 20 73 69 67 6e  re asked to sign
302a0 20 6e 6f 74 68 69 6e 67 2e 2e 2e 20 2a 2f 0a 09   nothing... */..
302b0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
302c0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
302d0 43 4b 52 5f 4f 4b 20 28 25 69 29 20 28 73 68 6f  CKR_OK (%i) (sho
302e0 72 74 20 63 69 72 63 75 69 74 29 22 2c 20 43 4b  rt circuit)", CK
302f0 52 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74 75 72 6e  R_OK);....return
30300 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69  (CKR_OK);..}...i
30310 66 20 28 70 50 61 72 74 20 3d 3d 20 4e 55 4c 4c  f (pPart == NULL
30320 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
30330 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
30340 2e 20 70 50 61 72 74 20 69 73 20 4e 55 4c 4c 2c  . pPart is NULL,
30350 20 62 75 74 20 75 6c 50 61 72 74 4c 65 6e 20 69   but ulPartLen i
30360 73 20 6e 6f 74 20 30 2e 22 29 3b 0a 0a 09 09 72  s not 0.");....r
30370 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45  eturn(CKR_ARGUME
30380 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69  NTS_BAD);..}...i
30390 66 20 28 75 6c 50 61 72 74 4c 65 6e 20 3d 3d 20  f (ulPartLen == 
303a0 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
303b0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
303c0 72 2e 20 75 6c 50 61 72 74 4c 65 6e 20 69 73 20  r. ulPartLen is 
303d0 30 2c 20 62 75 74 20 70 50 61 72 74 20 69 73 20  0, but pPart is 
303e0 6e 6f 74 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09  not NULL.");....
303f0 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d  return(CKR_ARGUM
30400 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09  ENTS_BAD);..}...
30410 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
30420 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b  ackey_mutex_lock
30430 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
30440 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
30450 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
30460 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
30470 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69  F("Error.  Locki
30480 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
30490 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
304a0 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
304b0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73  .if (!cackey_ses
304c0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
304d0 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b  active) {...cack
304e0 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
304f0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
30500 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
30510 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
30520 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74   Session not act
30530 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  ive.");......ret
30540 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  urn(CKR_SESSION_
30550 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
30560 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ..}...if (!cacke
30570 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
30580 69 6f 6e 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65  ion].sign_active
30590 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  ) {...cackey_mut
305a0 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
305b0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41  _biglock);....CA
305c0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
305d0 46 28 22 45 72 72 6f 72 2e 20 20 53 69 67 6e 20  F("Error.  Sign 
305e0 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09  not active.");..
305f0 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ....return(CKR_O
30600 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49  PERATION_NOT_INI
30610 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
30620 73 77 69 74 63 68 20 28 63 61 63 6b 65 79 5f 73  switch (cackey_s
30630 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
30640 5d 2e 73 69 67 6e 5f 6d 65 63 68 61 6e 69 73 6d  ].sign_mechanism
30650 29 20 7b 0a 09 09 63 61 73 65 20 43 4b 4d 5f 52  ) {...case CKM_R
30660 53 41 5f 50 4b 43 53 3a 0a 09 09 09 2f 2a 20 41  SA_PKCS:..../* A
30670 63 63 75 6d 75 6c 61 74 65 20 64 69 72 65 63 74  ccumulate direct
30680 6c 79 20 2a 2f 0a 09 09 09 69 66 20 28 28 63 61  ly */....if ((ca
30690 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
306a0 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66  ession].sign_buf
306b0 75 73 65 64 20 2b 20 75 6c 50 61 72 74 4c 65 6e  used + ulPartLen
306c0 29 20 3e 20 63 61 63 6b 65 79 5f 73 65 73 73 69  ) > cackey_sessi
306d0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
306e0 67 6e 5f 62 75 66 6c 65 6e 29 20 7b 0a 09 09 09  gn_buflen) {....
306f0 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
30700 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
30710 62 75 66 6c 65 6e 20 2a 3d 20 32 3b 0a 0a 09 09  buflen *= 2;....
30720 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
30730 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
30740 5f 62 75 66 20 3d 20 72 65 61 6c 6c 6f 63 28 63  _buf = realloc(c
30750 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
30760 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75  Session].sign_bu
30770 66 2c 20 73 69 7a 65 6f 66 28 2a 63 61 63 6b 65  f, sizeof(*cacke
30780 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
30790 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 29 20 2a  ion].sign_buf) *
307a0 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73   cackey_sessions
307b0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
307c0 62 75 66 6c 65 6e 29 3b 0a 09 09 09 7d 0a 0a 09  buflen);....}...
307d0 09 09 6d 65 6d 63 70 79 28 63 61 63 6b 65 79 5f  ..memcpy(cackey_
307e0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
307f0 6e 5d 2e 73 69 67 6e 5f 62 75 66 20 2b 20 63 61  n].sign_buf + ca
30800 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
30810 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66  ession].sign_buf
30820 75 73 65 64 2c 20 70 50 61 72 74 2c 20 75 6c 50  used, pPart, ulP
30830 61 72 74 4c 65 6e 29 3b 0a 0a 09 09 09 63 61 63  artLen);.....cac
30840 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
30850 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75  ssion].sign_bufu
30860 73 65 64 20 2b 3d 20 75 6c 50 61 72 74 4c 65 6e  sed += ulPartLen
30870 3b 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 7d 0a  ;.....break;..}.
30880 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
30890 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e   cackey_mutex_un
308a0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
308b0 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
308c0 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
308d0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
308e0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55  RINTF("Error.  U
308f0 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e  nlocking failed.
30900 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
30910 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
30920 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
30930 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
30940 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69  rning CKR_OK (%i
30950 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72  )", CKR_OK);...r
30960 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d  eturn(CKR_OK);.}
30970 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
30980 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 69  TION(CK_RV, C_Si
30990 67 6e 46 69 6e 61 6c 29 28 43 4b 5f 53 45 53 53  gnFinal)(CK_SESS
309a0 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
309b0 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  ion, CK_BYTE_PTR
309c0 20 70 53 69 67 6e 61 74 75 72 65 2c 20 43 4b 5f   pSignature, CK_
309d0 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 53 69 67  ULONG_PTR pulSig
309e0 6e 61 74 75 72 65 4c 65 6e 29 20 7b 0a 09 73 74  natureLen) {..st
309f0 61 74 69 63 20 43 4b 5f 42 59 54 45 20 73 69 67  atic CK_BYTE sig
30a00 62 75 66 5b 31 30 32 34 5d 3b 0a 09 73 73 69 7a  buf[1024];..ssiz
30a10 65 5f 74 20 73 69 67 62 75 66 6c 65 6e 3b 0a 09  e_t sigbuflen;..
30a20 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49  CK_SLOT_ID slotI
30a30 44 3b 0a 09 43 4b 5f 52 56 20 72 65 74 76 61 6c  D;..CK_RV retval
30a40 20 3d 20 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45   = CKR_GENERAL_E
30a50 52 52 4f 52 3b 0a 09 69 6e 74 20 74 65 72 6d 69  RROR;..int termi
30a60 6e 61 74 65 5f 73 69 67 6e 20 3d 20 31 3b 0a 09  nate_sign = 1;..
30a70 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c  int mutex_retval
30a80 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
30a90 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
30aa0 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
30ab0 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
30ac0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
30ad0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
30ae0 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
30af0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
30b00 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
30b10 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
30b20 0a 09 69 66 20 28 70 75 6c 53 69 67 6e 61 74 75  ..if (pulSignatu
30b30 72 65 4c 65 6e 20 3d 3d 20 4e 55 4c 4c 29 20 7b  reLen == NULL) {
30b40 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
30b50 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70  PRINTF("Error. p
30b60 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 20 69  ulSignatureLen i
30b70 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65  s NULL.");....re
30b80 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e  turn(CKR_ARGUMEN
30b90 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66  TS_BAD);..}...if
30ba0 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20   (hSession == 0 
30bb0 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28  || hSession >= (
30bc0 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
30bd0 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66  ssions) / sizeof
30be0 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
30bf0 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45  [0]))) {...CACKE
30c00 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
30c10 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20  Error.  Session 
30c20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b  out of range.");
30c30 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
30c40 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
30c50 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d  INVALID);..}...m
30c60 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
30c70 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28  ckey_mutex_lock(
30c80 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
30c90 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
30ca0 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
30cb0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
30cc0 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e  ("Error.  Lockin
30cd0 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
30ce0 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
30cf0 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
30d00 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73  if (!cackey_sess
30d10 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61  ions[hSession].a
30d20 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65  ctive) {...cacke
30d30 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
30d40 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
30d50 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
30d60 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
30d70 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69  Session not acti
30d80 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ve.");......retu
30d90 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48  rn(CKR_SESSION_H
30da0 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a  ANDLE_INVALID);.
30db0 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  .}...if (!cackey
30dc0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
30dd0 6f 6e 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65 29  on].sign_active)
30de0 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65   {...cackey_mute
30df0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
30e00 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43  biglock);....CAC
30e10 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
30e20 28 22 45 72 72 6f 72 2e 20 20 53 69 67 6e 20 6e  ("Error.  Sign n
30e30 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09  ot active.");...
30e40 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50  ...return(CKR_OP
30e50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54  ERATION_NOT_INIT
30e60 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 73  IALIZED);..}...s
30e70 6c 6f 74 49 44 20 3d 20 63 61 63 6b 65 79 5f 73  lotID = cackey_s
30e80 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
30e90 5d 2e 73 6c 6f 74 49 44 3b 0a 0a 09 69 66 20 28  ].slotID;...if (
30ea0 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c  slotID < 0 || sl
30eb0 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28  otID >= (sizeof(
30ec0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20  cackey_slots) / 
30ed0 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
30ee0 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41  ots[0]))) {...CA
30ef0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
30f00 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69  F("Error. Invali
30f10 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64  d slot requested
30f20 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20   (%lu), outside 
30f30 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c  of valid range",
30f40 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74   slotID);....ret
30f50 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
30f60 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20  ERROR);..}...if 
30f70 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c  (cackey_slots[sl
30f80 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20  otID].active == 
30f90 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
30fa0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
30fb0 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20  r. Invalid slot 
30fc0 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c  requested (%lu),
30fd0 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e   slot not curren
30fe0 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f  tly active", slo
30ff0 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f  tID);....cackey_
31000 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
31010 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
31020 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
31030 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
31040 09 73 77 69 74 63 68 20 28 63 61 63 6b 65 79 5f  .switch (cackey_
31050 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
31060 6e 5d 2e 73 69 67 6e 5f 6d 65 63 68 61 6e 69 73  n].sign_mechanis
31070 6d 29 20 7b 0a 09 09 63 61 73 65 20 43 4b 4d 5f  m) {...case CKM_
31080 52 53 41 5f 50 4b 43 53 3a 0a 09 09 09 2f 2a 20  RSA_PKCS:..../* 
31090 41 73 6b 20 63 61 72 64 20 74 6f 20 73 69 67 6e  Ask card to sign
310a0 20 2a 2f 0a 09 09 09 43 41 43 4b 45 59 5f 44 45   */....CACKEY_DE
310b0 42 55 47 5f 50 52 49 4e 54 46 28 22 41 73 6b 69  BUG_PRINTF("Aski
310c0 6e 67 20 74 6f 20 73 69 67 6e 20 66 72 6f 6d 20  ng to sign from 
310d0 69 64 65 6e 74 69 74 79 20 25 70 20 69 6e 20 73  identity %p in s
310e0 65 73 73 69 6f 6e 20 25 6c 75 22 2c 20 28 76 6f  ession %lu", (vo
310f0 69 64 20 2a 29 20 63 61 63 6b 65 79 5f 73 65 73  id *) cackey_ses
31100 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
31110 73 69 67 6e 5f 69 64 65 6e 74 69 74 79 2c 20 28  sign_identity, (
31120 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 68  unsigned long) h
31130 53 65 73 73 69 6f 6e 29 3b 0a 09 09 09 73 69 67  Session);....sig
31140 62 75 66 6c 65 6e 20 3d 20 63 61 63 6b 65 79 5f  buflen = cackey_
31150 73 69 67 6e 64 65 63 72 79 70 74 28 26 63 61 63  signdecrypt(&cac
31160 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44  key_slots[slotID
31170 5d 2c 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ], cackey_sessio
31180 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
31190 6e 5f 69 64 65 6e 74 69 74 79 2c 20 63 61 63 6b  n_identity, cack
311a0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
311b0 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 2c 20  sion].sign_buf, 
311c0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
311d0 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62  hSession].sign_b
311e0 75 66 75 73 65 64 2c 20 73 69 67 62 75 66 2c 20  ufused, sigbuf, 
311f0 73 69 7a 65 6f 66 28 73 69 67 62 75 66 29 2c 20  sizeof(sigbuf), 
31200 31 2c 20 30 29 3b 0a 0a 09 09 09 69 66 20 28 73  1, 0);.....if (s
31210 69 67 62 75 66 6c 65 6e 20 3d 3d 20 43 41 43 4b  igbuflen == CACK
31220 45 59 5f 50 43 53 43 5f 45 5f 4e 45 45 44 4c 4f  EY_PCSC_E_NEEDLO
31230 47 49 4e 20 26 26 20 63 61 63 6b 65 79 5f 70 69  GIN && cackey_pi
31240 6e 5f 63 6f 6d 6d 61 6e 64 20 21 3d 20 4e 55 4c  n_command != NUL
31250 4c 29 20 7b 0a 09 09 09 09 69 66 20 28 5f 43 5f  L) {.....if (_C_
31260 4c 6f 67 69 6e 4d 75 74 65 78 41 72 67 28 68 53  LoginMutexArg(hS
31270 65 73 73 69 6f 6e 2c 20 43 4b 55 5f 55 53 45 52  ession, CKU_USER
31280 2c 20 4e 55 4c 4c 2c 20 30 2c 20 30 29 20 3d 3d  , NULL, 0, 0) ==
31290 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 09 09 09   CKR_OK) {......
312a0 73 69 67 62 75 66 6c 65 6e 20 3d 20 63 61 63 6b  sigbuflen = cack
312b0 65 79 5f 73 69 67 6e 64 65 63 72 79 70 74 28 26  ey_signdecrypt(&
312c0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f  cackey_slots[slo
312d0 74 49 44 5d 2c 20 63 61 63 6b 65 79 5f 73 65 73  tID], cackey_ses
312e0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
312f0 73 69 67 6e 5f 69 64 65 6e 74 69 74 79 2c 20 63  sign_identity, c
31300 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
31310 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75  Session].sign_bu
31320 66 2c 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  f, cackey_sessio
31330 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
31340 6e 5f 62 75 66 75 73 65 64 2c 20 73 69 67 62 75  n_bufused, sigbu
31350 66 2c 20 73 69 7a 65 6f 66 28 73 69 67 62 75 66  f, sizeof(sigbuf
31360 29 2c 20 31 2c 20 30 29 3b 0a 09 09 09 09 7d 0a  ), 1, 0);.....}.
31370 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 73 69 67  ...}.....if (sig
31380 62 75 66 6c 65 6e 20 3c 20 30 29 20 7b 0a 09 09  buflen < 0) {...
31390 09 09 2f 2a 20 53 69 67 6e 69 6e 67 20 66 61 69  ../* Signing fai
313a0 6c 65 64 2e 20 2a 2f 0a 09 09 09 09 69 66 20 28  led. */.....if (
313b0 73 69 67 62 75 66 6c 65 6e 20 3d 3d 20 43 41 43  sigbuflen == CAC
313c0 4b 45 59 5f 50 43 53 43 5f 45 5f 4e 45 45 44 4c  KEY_PCSC_E_NEEDL
313d0 4f 47 49 4e 29 20 7b 0a 09 09 09 09 09 72 65 74  OGIN) {......ret
313e0 76 61 6c 20 3d 20 43 4b 52 5f 55 53 45 52 5f 4e  val = CKR_USER_N
313f0 4f 54 5f 4c 4f 47 47 45 44 5f 49 4e 3b 0a 09 09  OT_LOGGED_IN;...
31400 09 09 7d 20 65 6c 73 65 20 69 66 20 28 73 69 67  ..} else if (sig
31410 62 75 66 6c 65 6e 20 3d 3d 20 43 41 43 4b 45 59  buflen == CACKEY
31420 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53  _PCSC_E_TOKENABS
31430 45 4e 54 29 20 7b 0a 09 09 09 09 09 72 65 74 76  ENT) {......retv
31440 61 6c 20 3d 20 43 4b 52 5f 44 45 56 49 43 45 5f  al = CKR_DEVICE_
31450 52 45 4d 4f 56 45 44 3b 0a 09 09 09 09 7d 20 65  REMOVED;.....} e
31460 6c 73 65 20 7b 0a 09 09 09 09 09 72 65 74 76 61  lse {......retva
31470 6c 20 3d 20 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  l = CKR_GENERAL_
31480 45 52 52 4f 52 3b 0a 09 09 09 09 7d 0a 09 09 09  ERROR;.....}....
31490 7d 20 65 6c 73 65 20 69 66 20 28 28 28 75 6e 73  } else if (((uns
314a0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69 67 62  igned long) sigb
314b0 75 66 6c 65 6e 29 20 3e 20 2a 70 75 6c 53 69 67  uflen) > *pulSig
314c0 6e 61 74 75 72 65 4c 65 6e 20 26 26 20 70 53 69  natureLen && pSi
314d0 67 6e 61 74 75 72 65 29 20 7b 0a 09 09 09 09 2f  gnature) {...../
314e0 2a 20 53 69 67 6e 65 64 20 64 61 74 61 20 74 6f  * Signed data to
314f0 6f 20 6c 61 72 67 65 20 2a 2f 0a 09 09 09 09 43  o large */.....C
31500 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
31510 54 46 28 22 72 65 74 76 61 6c 20 3d 20 43 4b 52  TF("retval = CKR
31520 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c  _BUFFER_TOO_SMAL
31530 4c 3b 20 20 73 69 67 62 75 66 6c 65 6e 20 3d 20  L;  sigbuflen = 
31540 25 6c 75 2c 20 70 75 6c 53 69 67 6e 61 74 75 72  %lu, pulSignatur
31550 65 4c 65 6e 20 3d 20 25 6c 75 22 2c 20 28 75 6e  eLen = %lu", (un
31560 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69 67  signed long) sig
31570 62 75 66 6c 65 6e 2c 20 28 75 6e 73 69 67 6e 65  buflen, (unsigne
31580 64 20 6c 6f 6e 67 29 20 2a 70 75 6c 53 69 67 6e  d long) *pulSign
31590 61 74 75 72 65 4c 65 6e 29 3b 0a 0a 09 09 09 09  atureLen);......
315a0 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 42 55 46  retval = CKR_BUF
315b0 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 3b 0a 0a  FER_TOO_SMALL;..
315c0 09 09 09 09 74 65 72 6d 69 6e 61 74 65 5f 73 69  ....terminate_si
315d0 67 6e 20 3d 20 30 3b 0a 09 09 09 7d 20 65 6c 73  gn = 0;....} els
315e0 65 20 7b 0a 09 09 09 09 74 65 72 6d 69 6e 61 74  e {.....terminat
315f0 65 5f 73 69 67 6e 20 3d 20 30 3b 0a 0a 09 09 09  e_sign = 0;.....
31600 09 69 66 20 28 70 53 69 67 6e 61 74 75 72 65 29  .if (pSignature)
31610 20 7b 0a 09 09 09 09 09 6d 65 6d 63 70 79 28 70   {......memcpy(p
31620 53 69 67 6e 61 74 75 72 65 2c 20 73 69 67 62 75  Signature, sigbu
31630 66 2c 20 73 69 67 62 75 66 6c 65 6e 29 3b 0a 0a  f, sigbuflen);..
31640 09 09 09 09 09 74 65 72 6d 69 6e 61 74 65 5f 73  .....terminate_s
31650 69 67 6e 20 3d 20 31 3b 0a 09 09 09 09 7d 0a 0a  ign = 1;.....}..
31660 09 09 09 09 2a 70 75 6c 53 69 67 6e 61 74 75 72  ....*pulSignatur
31670 65 4c 65 6e 20 3d 20 73 69 67 62 75 66 6c 65 6e  eLen = sigbuflen
31680 3b 0a 0a 09 09 09 09 72 65 74 76 61 6c 20 3d 20  ;......retval = 
31690 43 4b 52 5f 4f 4b 3b 0a 09 09 09 7d 0a 0a 09 09  CKR_OK;....}....
316a0 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 69 66 20  .break;..}...if 
316b0 28 74 65 72 6d 69 6e 61 74 65 5f 73 69 67 6e 29  (terminate_sign)
316c0 20 7b 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f   {...if (cackey_
316d0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
316e0 6e 5d 2e 73 69 67 6e 5f 62 75 66 29 20 7b 0a 09  n].sign_buf) {..
316f0 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f 73 65  ..free(cackey_se
31700 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
31710 2e 73 69 67 6e 5f 62 75 66 29 3b 0a 09 09 7d 0a  .sign_buf);...}.
31720 0a 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
31730 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
31740 6e 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a 09 7d  n_active = 0;..}
31750 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
31760 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  = cackey_mutex_u
31770 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
31780 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
31790 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
317a0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
317b0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
317c0 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64  Unlocking failed
317d0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
317e0 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
317f0 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
31800 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
31810 75 72 6e 69 6e 67 20 25 69 22 2c 20 28 69 6e 74  urning %i", (int
31820 29 20 72 65 74 76 61 6c 29 3b 0a 0a 09 72 65 74  ) retval);...ret
31830 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a  urn(retval);.}..
31840 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
31850 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 69 67 6e  ON(CK_RV, C_Sign
31860 52 65 63 6f 76 65 72 49 6e 69 74 29 28 43 4b 5f  RecoverInit)(CK_
31870 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
31880 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48  Session, CK_MECH
31890 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61  ANISM_PTR pMecha
318a0 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f  nism, CK_OBJECT_
318b0 48 41 4e 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09  HANDLE hKey) {..
318c0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
318d0 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
318e0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
318f0 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
31900 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
31910 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
31920 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
31930 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
31940 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
31950 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
31960 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
31970 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
31980 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
31990 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
319a0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
319b0 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
319c0 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
319d0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
319e0 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
319f0 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
31a00 5f 53 69 67 6e 52 65 63 6f 76 65 72 29 28 43 4b  _SignRecover)(CK
31a10 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
31a20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54  hSession, CK_BYT
31a30 45 5f 50 54 52 20 70 44 61 74 61 2c 20 43 4b 5f  E_PTR pData, CK_
31a40 55 4c 4f 4e 47 20 75 6c 44 61 74 61 4c 65 6e 2c  ULONG ulDataLen,
31a50 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 53 69   CK_BYTE_PTR pSi
31a60 67 6e 61 74 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e  gnature, CK_ULON
31a70 47 5f 50 54 52 20 70 75 6c 53 69 67 6e 61 74 75  G_PTR pulSignatu
31a80 72 65 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59  reLen) {..CACKEY
31a90 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
31aa0 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
31ab0 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
31ac0 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
31ad0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
31ae0 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
31af0 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
31b00 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
31b10 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
31b20 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
31b30 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
31b40 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
31b50 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
31b60 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
31b70 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
31b80 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
31b90 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
31ba0 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
31bb0 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
31bc0 4e 28 43 4b 5f 52 56 2c 20 43 5f 56 65 72 69 66  N(CK_RV, C_Verif
31bd0 79 49 6e 69 74 29 28 43 4b 5f 53 45 53 53 49 4f  yInit)(CK_SESSIO
31be0 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
31bf0 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f  n, CK_MECHANISM_
31c00 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20  PTR pMechanism, 
31c10 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45  CK_OBJECT_HANDLE
31c20 20 68 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59   hKey) {..CACKEY
31c30 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
31c40 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
31c50 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
31c60 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
31c70 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
31c80 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
31c90 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
31ca0 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
31cb0 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
31cc0 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
31cd0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
31ce0 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
31cf0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
31d00 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
31d10 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
31d20 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
31d30 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
31d40 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
31d50 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
31d60 4e 28 43 4b 5f 52 56 2c 20 43 5f 56 65 72 69 66  N(CK_RV, C_Verif
31d70 79 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  y)(CK_SESSION_HA
31d80 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
31d90 4b 5f 42 59 54 45 5f 50 54 52 20 70 44 61 74 61  K_BYTE_PTR pData
31da0 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 44 61 74  , CK_ULONG ulDat
31db0 61 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  aLen, CK_BYTE_PT
31dc0 52 20 70 53 69 67 6e 61 74 75 72 65 2c 20 43 4b  R pSignature, CK
31dd0 5f 55 4c 4f 4e 47 20 75 6c 53 69 67 6e 61 74 75  _ULONG ulSignatu
31de0 72 65 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59  reLen) {..CACKEY
31df0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
31e00 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
31e10 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
31e20 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
31e30 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
31e40 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
31e50 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
31e60 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
31e70 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
31e80 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
31e90 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
31ea0 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
31eb0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
31ec0 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
31ed0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
31ee0 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
31ef0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
31f00 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
31f10 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
31f20 4e 28 43 4b 5f 52 56 2c 20 43 5f 56 65 72 69 66  N(CK_RV, C_Verif
31f30 79 55 70 64 61 74 65 29 28 43 4b 5f 53 45 53 53  yUpdate)(CK_SESS
31f40 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
31f50 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  ion, CK_BYTE_PTR
31f60 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47   pPart, CK_ULONG
31f70 20 75 6c 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43   ulPartLen) {..C
31f80 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
31f90 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
31fa0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
31fb0 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
31fc0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
31fd0 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
31fe0 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
31ff0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
32000 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
32010 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
32020 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
32030 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
32040 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
32050 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
32060 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
32070 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
32080 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
32090 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
320a0 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
320b0 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
320c0 56 65 72 69 66 79 46 69 6e 61 6c 29 28 43 4b 5f  VerifyFinal)(CK_
320d0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
320e0 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45  Session, CK_BYTE
320f0 5f 50 54 52 20 70 53 69 67 6e 61 74 75 72 65 2c  _PTR pSignature,
32100 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 53 69 67 6e   CK_ULONG ulSign
32110 61 74 75 72 65 4c 65 6e 29 20 7b 0a 09 43 41 43  atureLen) {..CAC
32120 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
32130 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
32140 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
32150 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
32160 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
32170 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
32180 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
32190 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
321a0 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
321b0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
321c0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
321d0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
321e0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
321f0 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
32200 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
32210 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
32220 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
32230 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
32240 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
32250 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 56 65  TION(CK_RV, C_Ve
32260 72 69 66 79 52 65 63 6f 76 65 72 49 6e 69 74 29  rifyRecoverInit)
32270 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
32280 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
32290 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d  MECHANISM_PTR pM
322a0 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a  echanism, CK_OBJ
322b0 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79 29  ECT_HANDLE hKey)
322c0 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
322d0 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
322e0 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
322f0 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
32300 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
32310 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
32320 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
32330 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
32340 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
32350 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
32360 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
32370 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
32380 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
32390 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
323a0 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
323b0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
323c0 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
323d0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
323e0 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  TED);.}..CK_DEFI
323f0 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
32400 56 2c 20 43 5f 56 65 72 69 66 79 52 65 63 6f 76  V, C_VerifyRecov
32410 65 72 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  er)(CK_SESSION_H
32420 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
32430 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 53 69 67  CK_BYTE_PTR pSig
32440 6e 61 74 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47  nature, CK_ULONG
32450 20 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 2c   ulSignatureLen,
32460 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 44 61   CK_BYTE_PTR pDa
32470 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52  ta, CK_ULONG_PTR
32480 20 70 75 6c 44 61 74 61 4c 65 6e 29 20 7b 0a 09   pulDataLen) {..
32490 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
324a0 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
324b0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
324c0 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
324d0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
324e0 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
324f0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
32500 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
32510 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
32520 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
32530 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
32540 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
32550 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
32560 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
32570 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
32580 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
32590 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
325a0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
325b0 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
325c0 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
325d0 5f 44 69 67 65 73 74 45 6e 63 72 79 70 74 55 70  _DigestEncryptUp
325e0 64 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e  date)(CK_SESSION
325f0 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
32600 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50  , CK_BYTE_PTR pP
32610 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  art, CK_ULONG ul
32620 50 61 72 74 4c 65 6e 2c 20 43 4b 5f 42 59 54 45  PartLen, CK_BYTE
32630 5f 50 54 52 20 70 45 6e 63 72 79 70 74 65 64 50  _PTR pEncryptedP
32640 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54  art, CK_ULONG_PT
32650 52 20 70 75 6c 45 6e 63 72 79 70 74 65 64 50 61  R pulEncryptedPa
32660 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59  rtLen) {..CACKEY
32670 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
32680 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
32690 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
326a0 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
326b0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
326c0 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
326d0 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
326e0 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
326f0 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
32700 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
32710 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
32720 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
32730 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
32740 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
32750 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
32760 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
32770 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
32780 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
32790 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
327a0 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65 63 72 79  N(CK_RV, C_Decry
327b0 70 74 44 69 67 65 73 74 55 70 64 61 74 65 29 28  ptDigestUpdate)(
327c0 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
327d0 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42  E hSession, CK_B
327e0 59 54 45 5f 50 54 52 20 70 45 6e 63 72 79 70 74  YTE_PTR pEncrypt
327f0 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47  edPart, CK_ULONG
32800 20 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74   ulEncryptedPart
32810 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  Len, CK_BYTE_PTR
32820 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47   pPart, CK_ULONG
32830 5f 50 54 52 20 70 75 6c 50 61 72 74 4c 65 6e 29  _PTR pulPartLen)
32840 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
32850 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
32860 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
32870 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
32880 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
32890 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
328a0 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
328b0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
328c0 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
328d0 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
328e0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
328f0 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
32900 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
32910 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
32920 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
32930 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
32940 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
32950 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
32960 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  TED);.}..CK_DEFI
32970 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
32980 56 2c 20 43 5f 53 69 67 6e 45 6e 63 72 79 70 74  V, C_SignEncrypt
32990 55 70 64 61 74 65 29 28 43 4b 5f 53 45 53 53 49  Update)(CK_SESSI
329a0 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
329b0 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  on, CK_BYTE_PTR 
329c0 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20  pPart, CK_ULONG 
329d0 75 6c 50 61 72 74 4c 65 6e 2c 20 43 4b 5f 42 59  ulPartLen, CK_BY
329e0 54 45 5f 50 54 52 20 70 45 6e 63 72 79 70 74 65  TE_PTR pEncrypte
329f0 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f  dPart, CK_ULONG_
32a00 50 54 52 20 70 75 6c 45 6e 63 72 79 70 74 65 64  PTR pulEncrypted
32a10 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b  PartLen) {..CACK
32a20 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
32a30 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
32a40 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
32a50 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
32a60 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
32a70 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
32a80 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
32a90 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
32aa0 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
32ab0 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
32ac0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
32ad0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
32ae0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
32af0 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
32b00 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
32b10 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
32b20 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
32b30 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
32b40 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
32b50 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65 63  ION(CK_RV, C_Dec
32b60 72 79 70 74 56 65 72 69 66 79 55 70 64 61 74 65  ryptVerifyUpdate
32b70 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
32b80 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
32b90 5f 42 59 54 45 5f 50 54 52 20 70 45 6e 63 72 79  _BYTE_PTR pEncry
32ba0 70 74 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f  ptedPart, CK_ULO
32bb0 4e 47 20 75 6c 45 6e 63 72 79 70 74 65 64 50 61  NG ulEncryptedPa
32bc0 72 74 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  rtLen, CK_BYTE_P
32bd0 54 52 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f  TR pPart, CK_ULO
32be0 4e 47 5f 50 54 52 20 70 75 6c 50 61 72 74 4c 65  NG_PTR pulPartLe
32bf0 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  n) {..CACKEY_DEB
32c00 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
32c10 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
32c20 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
32c30 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
32c40 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
32c50 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
32c60 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
32c70 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
32c80 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
32c90 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
32ca0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
32cb0 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
32cc0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
32cd0 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
32ce0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
32cf0 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
32d00 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
32d10 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  ORTED);.}..CK_DE
32d20 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
32d30 5f 52 56 2c 20 43 5f 47 65 6e 65 72 61 74 65 4b  _RV, C_GenerateK
32d40 65 79 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  ey)(CK_SESSION_H
32d50 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
32d60 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52  CK_MECHANISM_PTR
32d70 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f   pMechanism, CK_
32d80 41 54 54 52 49 42 55 54 45 5f 50 54 52 20 70 54  ATTRIBUTE_PTR pT
32d90 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e  emplate, CK_ULON
32da0 47 20 75 6c 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42  G ulCount, CK_OB
32db0 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20  JECT_HANDLE_PTR 
32dc0 70 68 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59  phKey) {..CACKEY
32dd0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
32de0 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
32df0 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
32e00 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
32e10 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
32e20 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
32e30 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
32e40 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
32e50 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
32e60 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
32e70 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
32e80 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
32e90 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
32ea0 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
32eb0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
32ec0 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
32ed0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
32ee0 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
32ef0 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
32f00 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 6e 65 72  N(CK_RV, C_Gener
32f10 61 74 65 4b 65 79 50 61 69 72 29 28 43 4b 5f 53  ateKeyPair)(CK_S
32f20 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
32f30 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41  ession, CK_MECHA
32f40 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e  NISM_PTR pMechan
32f50 69 73 6d 2c 20 43 4b 5f 41 54 54 52 49 42 55 54  ism, CK_ATTRIBUT
32f60 45 5f 50 54 52 20 70 50 75 62 6c 69 63 4b 65 79  E_PTR pPublicKey
32f70 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f  Template, CK_ULO
32f80 4e 47 20 75 6c 50 75 62 6c 69 63 4b 65 79 41 74  NG ulPublicKeyAt
32f90 74 72 69 62 75 74 65 43 6f 75 6e 74 2c 20 43 4b  tributeCount, CK
32fa0 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52 20 70  _ATTRIBUTE_PTR p
32fb0 50 72 69 76 61 74 65 4b 65 79 54 65 6d 70 6c 61  PrivateKeyTempla
32fc0 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50  te, CK_ULONG ulP
32fd0 72 69 76 61 74 65 4b 65 79 41 74 74 72 69 62 75  rivateKeyAttribu
32fe0 74 65 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45  teCount, CK_OBJE
32ff0 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 68  CT_HANDLE_PTR ph
33000 50 75 62 6c 69 63 4b 65 79 2c 20 43 4b 5f 4f 42  PublicKey, CK_OB
33010 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20  JECT_HANDLE_PTR 
33020 70 68 50 72 69 76 61 74 65 4b 65 79 29 20 7b 0a  phPrivateKey) {.
33030 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
33040 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
33050 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
33060 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
33070 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
33080 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
33090 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
330a0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
330b0 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
330c0 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
330d0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
330e0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
330f0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
33100 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20  UPPORTED (%i)", 
33110 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
33120 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72  _SUPPORTED);...r
33130 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
33140 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
33150 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
33160 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
33170 43 5f 57 72 61 70 4b 65 79 29 28 43 4b 5f 53 45  C_WrapKey)(CK_SE
33180 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
33190 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e  ssion, CK_MECHAN
331a0 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69  ISM_PTR pMechani
331b0 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41  sm, CK_OBJECT_HA
331c0 4e 44 4c 45 20 68 57 72 61 70 70 69 6e 67 4b 65  NDLE hWrappingKe
331d0 79 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e  y, CK_OBJECT_HAN
331e0 44 4c 45 20 68 4b 65 79 2c 20 43 4b 5f 42 59 54  DLE hKey, CK_BYT
331f0 45 5f 50 54 52 20 70 57 72 61 70 70 65 64 4b 65  E_PTR pWrappedKe
33200 79 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20  y, CK_ULONG_PTR 
33210 70 75 6c 57 72 61 70 70 65 64 4b 65 79 4c 65 6e  pulWrappedKeyLen
33220 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
33230 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
33240 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
33250 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
33260 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
33270 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
33280 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
33290 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
332a0 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
332b0 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
332c0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
332d0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
332e0 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
332f0 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
33300 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
33310 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
33320 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
33330 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
33340 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
33350 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
33360 52 56 2c 20 43 5f 55 6e 77 72 61 70 4b 65 79 29  RV, C_UnwrapKey)
33370 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
33380 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
33390 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d  MECHANISM_PTR pM
333a0 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a  echanism, CK_OBJ
333b0 45 43 54 5f 48 41 4e 44 4c 45 20 68 55 6e 77 72  ECT_HANDLE hUnwr
333c0 61 70 70 69 6e 67 4b 65 79 2c 20 43 4b 5f 42 59  appingKey, CK_BY
333d0 54 45 5f 50 54 52 20 70 57 72 61 70 70 65 64 4b  TE_PTR pWrappedK
333e0 65 79 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 57  ey, CK_ULONG ulW
333f0 72 61 70 70 65 64 4b 65 79 4c 65 6e 2c 20 43 4b  rappedKeyLen, CK
33400 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52 20 70  _ATTRIBUTE_PTR p
33410 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f  Template, CK_ULO
33420 4e 47 20 75 6c 41 74 74 72 69 62 75 74 65 43 6f  NG ulAttributeCo
33430 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48  unt, CK_OBJECT_H
33440 41 4e 44 4c 45 5f 50 54 52 20 70 68 4b 65 79 29  ANDLE_PTR phKey)
33450 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
33460 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
33470 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
33480 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
33490 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
334a0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
334b0 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
334c0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
334d0 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
334e0 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
334f0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
33500 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
33510 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
33520 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
33530 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
33540 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
33550 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
33560 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
33570 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  TED);.}..CK_DEFI
33580 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
33590 56 2c 20 43 5f 44 65 72 69 76 65 4b 65 79 29 28  V, C_DeriveKey)(
335a0 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
335b0 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d  E hSession, CK_M
335c0 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65  ECHANISM_PTR pMe
335d0 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45  chanism, CK_OBJE
335e0 43 54 5f 48 41 4e 44 4c 45 20 68 42 61 73 65 4b  CT_HANDLE hBaseK
335f0 65 79 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45  ey, CK_ATTRIBUTE
33600 5f 50 54 52 20 70 54 65 6d 70 6c 61 74 65 2c 20  _PTR pTemplate, 
33610 43 4b 5f 55 4c 4f 4e 47 20 75 6c 41 74 74 72 69  CK_ULONG ulAttri
33620 62 75 74 65 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42  buteCount, CK_OB
33630 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20  JECT_HANDLE_PTR 
33640 70 68 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59  phKey) {..CACKEY
33650 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
33660 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
33670 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
33680 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
33690 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
336a0 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
336b0 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
336c0 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
336d0 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
336e0 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
336f0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
33700 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
33710 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
33720 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
33730 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
33740 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
33750 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
33760 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
33770 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
33780 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 65 65 64 52  N(CK_RV, C_SeedR
33790 61 6e 64 6f 6d 29 28 43 4b 5f 53 45 53 53 49 4f  andom)(CK_SESSIO
337a0 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
337b0 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
337c0 53 65 65 64 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  Seed, CK_ULONG u
337d0 6c 53 65 65 64 4c 65 6e 29 20 7b 0a 09 43 41 43  lSeedLen) {..CAC
337e0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
337f0 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
33800 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
33810 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
33820 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
33830 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
33840 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
33850 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
33860 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
33870 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
33880 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
33890 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
338a0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
338b0 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
338c0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
338d0 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
338e0 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
338f0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
33900 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
33910 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65  TION(CK_RV, C_Ge
33920 6e 65 72 61 74 65 52 61 6e 64 6f 6d 29 28 43 4b  nerateRandom)(CK
33930 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
33940 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54  hSession, CK_BYT
33950 45 5f 50 54 52 20 70 52 61 6e 64 6f 6d 44 61 74  E_PTR pRandomDat
33960 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 52 61  a, CK_ULONG ulRa
33970 6e 64 6f 6d 4c 65 6e 29 20 7b 0a 09 43 41 43 4b  ndomLen) {..CACK
33980 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
33990 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
339a0 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
339b0 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
339c0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
339d0 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
339e0 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
339f0 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
33a00 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
33a10 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
33a20 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
33a30 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
33a40 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
33a50 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
33a60 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
33a70 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
33a80 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
33a90 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
33aa0 0a 2f 2a 20 44 65 70 72 65 63 61 74 65 64 20 46  ./* Deprecated F
33ab0 75 6e 63 74 69 6f 6e 20 2a 2f 0a 43 4b 5f 44 45  unction */.CK_DE
33ac0 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
33ad0 5f 52 56 2c 20 43 5f 47 65 74 46 75 6e 63 74 69  _RV, C_GetFuncti
33ae0 6f 6e 53 74 61 74 75 73 29 28 43 4b 5f 53 45 53  onStatus)(CK_SES
33af0 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
33b00 73 69 6f 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f  sion) {..CACKEY_
33b10 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
33b20 6c 6c 65 64 2e 22 29 3b 0a 0a 09 43 41 43 4b 45  lled.");...CACKE
33b30 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
33b40 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
33b50 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c  NCTION_NOT_PARAL
33b60 4c 45 4c 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  LEL (%i)", CKR_F
33b70 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41  UNCTION_NOT_PARA
33b80 4c 4c 45 4c 29 3b 0a 0a 09 72 65 74 75 72 6e 28  LLEL);...return(
33b90 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
33ba0 5f 50 41 52 41 4c 4c 45 4c 29 3b 0a 0a 09 68 53  _PARALLEL);...hS
33bb0 65 73 73 69 6f 6e 20 3d 20 68 53 65 73 73 69 6f  ession = hSessio
33bc0 6e 3b 20 2f 2a 20 53 75 70 72 65 73 73 20 75 6e  n; /* Supress un
33bd0 75 73 65 64 20 76 61 72 69 61 62 6c 65 20 77 61  used variable wa
33be0 72 6e 69 6e 67 20 2a 2f 0a 7d 0a 0a 2f 2a 20 44  rning */.}../* D
33bf0 65 70 72 65 63 61 74 65 64 20 46 75 6e 63 74 69  eprecated Functi
33c00 6f 6e 20 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45 5f  on */.CK_DEFINE_
33c10 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
33c20 43 5f 43 61 6e 63 65 6c 46 75 6e 63 74 69 6f 6e  C_CancelFunction
33c30 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
33c40 44 4c 45 20 68 53 65 73 73 69 6f 6e 29 20 7b 0a  DLE hSession) {.
33c50 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
33c60 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
33c70 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
33c80 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
33c90 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
33ca0 4f 54 5f 50 41 52 41 4c 4c 45 4c 20 28 25 69 29  OT_PARALLEL (%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 50 41 52 41 4c 4c 45 4c 29 3b 0a 0a  NOT_PARALLEL);..
33cd0 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
33ce0 54 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45  TION_NOT_PARALLE
33cf0 4c 29 3b 0a 0a 09 68 53 65 73 73 69 6f 6e 20 3d  L);...hSession =
33d00 20 68 53 65 73 73 69 6f 6e 3b 20 2f 2a 20 53 75   hSession; /* Su
33d10 70 72 65 73 73 20 75 6e 75 73 65 64 20 76 61 72  press unused var
33d20 69 61 62 6c 65 20 77 61 72 6e 69 6e 67 20 2a 2f  iable warning */
33d30 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
33d40 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
33d50 47 65 74 46 75 6e 63 74 69 6f 6e 4c 69 73 74 29  GetFunctionList)
33d60 28 43 4b 5f 46 55 4e 43 54 49 4f 4e 5f 4c 49 53  (CK_FUNCTION_LIS
33d70 54 5f 50 54 52 5f 50 54 52 20 70 70 46 75 6e 63  T_PTR_PTR ppFunc
33d80 74 69 6f 6e 4c 69 73 74 29 20 7b 0a 09 43 4b 5f  tionList) {..CK_
33d90 46 55 4e 43 54 49 4f 4e 5f 4c 49 53 54 5f 50 54  FUNCTION_LIST_PT
33da0 52 20 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 3b  R pFunctionList;
33db0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
33dc0 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
33dd0 29 3b 0a 0a 09 69 66 20 28 70 70 46 75 6e 63 74  );...if (ppFunct
33de0 69 6f 6e 4c 69 73 74 20 3d 3d 20 4e 55 4c 4c 29  ionList == NULL)
33df0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
33e00 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
33e10 20 70 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 20   ppFunctionList 
33e20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72  is NULL.");....r
33e30 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45  eturn(CKR_ARGUME
33e40 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 70  NTS_BAD);..}...p
33e50 46 75 6e 63 74 69 6f 6e 4c 69 73 74 20 3d 20 6d  FunctionList = m
33e60 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70 46  alloc(sizeof(*pF
33e70 75 6e 63 74 69 6f 6e 4c 69 73 74 29 29 3b 0a 0a  unctionList));..
33e80 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
33e90 76 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20  version.major = 
33ea0 28 28 43 41 43 4b 45 59 5f 43 52 59 50 54 4f 4b  ((CACKEY_CRYPTOK
33eb0 49 5f 56 45 52 53 49 4f 4e 5f 43 4f 44 45 29 20  I_VERSION_CODE) 
33ec0 3e 3e 20 31 36 29 20 26 20 30 78 66 66 3b 0a 09  >> 16) & 0xff;..
33ed0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 76  pFunctionList->v
33ee0 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 28  ersion.minor = (
33ef0 28 43 41 43 4b 45 59 5f 43 52 59 50 54 4f 4b 49  (CACKEY_CRYPTOKI
33f00 5f 56 45 52 53 49 4f 4e 5f 43 4f 44 45 29 20 3e  _VERSION_CODE) >
33f10 3e 20 38 29 20 26 20 30 78 66 66 3b 0a 0a 09 70  > 8) & 0xff;...p
33f20 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
33f30 49 6e 69 74 69 61 6c 69 7a 65 20 3d 20 43 5f 49  Initialize = C_I
33f40 6e 69 74 69 61 6c 69 7a 65 3b 0a 09 70 46 75 6e  nitialize;..pFun
33f50 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 46 69 6e  ctionList->C_Fin
33f60 61 6c 69 7a 65 20 3d 20 43 5f 46 69 6e 61 6c 69  alize = C_Finali
33f70 7a 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  ze;..pFunctionLi
33f80 73 74 2d 3e 43 5f 47 65 74 49 6e 66 6f 20 3d 20  st->C_GetInfo = 
33f90 43 5f 47 65 74 49 6e 66 6f 3b 0a 09 70 46 75 6e  C_GetInfo;..pFun
33fa0 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74  ctionList->C_Get
33fb0 53 6c 6f 74 4c 69 73 74 20 3d 20 43 5f 47 65 74  SlotList = C_Get
33fc0 53 6c 6f 74 4c 69 73 74 3b 0a 09 70 46 75 6e 63  SlotList;..pFunc
33fd0 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 53  tionList->C_GetS
33fe0 6c 6f 74 49 6e 66 6f 20 3d 20 43 5f 47 65 74 53  lotInfo = C_GetS
33ff0 6c 6f 74 49 6e 66 6f 3b 0a 09 70 46 75 6e 63 74  lotInfo;..pFunct
34000 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 54 6f  ionList->C_GetTo
34010 6b 65 6e 49 6e 66 6f 20 3d 20 43 5f 47 65 74 54  kenInfo = C_GetT
34020 6f 6b 65 6e 49 6e 66 6f 3b 0a 09 70 46 75 6e 63  okenInfo;..pFunc
34030 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 57 61 69 74  tionList->C_Wait
34040 46 6f 72 53 6c 6f 74 45 76 65 6e 74 20 3d 20 43  ForSlotEvent = C
34050 5f 57 61 69 74 46 6f 72 53 6c 6f 74 45 76 65 6e  _WaitForSlotEven
34060 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  t;..pFunctionLis
34070 74 2d 3e 43 5f 47 65 74 4d 65 63 68 61 6e 69 73  t->C_GetMechanis
34080 6d 4c 69 73 74 20 3d 20 43 5f 47 65 74 4d 65 63  mList = C_GetMec
34090 68 61 6e 69 73 6d 4c 69 73 74 3b 0a 09 70 46 75  hanismList;..pFu
340a0 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65  nctionList->C_Ge
340b0 74 4d 65 63 68 61 6e 69 73 6d 49 6e 66 6f 20 3d  tMechanismInfo =
340c0 20 43 5f 47 65 74 4d 65 63 68 61 6e 69 73 6d 49   C_GetMechanismI
340d0 6e 66 6f 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  nfo;..pFunctionL
340e0 69 73 74 2d 3e 43 5f 49 6e 69 74 54 6f 6b 65 6e  ist->C_InitToken
340f0 20 3d 20 43 5f 49 6e 69 74 54 6f 6b 65 6e 3b 0a   = C_InitToken;.
34100 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
34110 43 5f 49 6e 69 74 50 49 4e 20 3d 20 43 5f 49 6e  C_InitPIN = C_In
34120 69 74 50 49 4e 3b 0a 09 70 46 75 6e 63 74 69 6f  itPIN;..pFunctio
34130 6e 4c 69 73 74 2d 3e 43 5f 53 65 74 50 49 4e 20  nList->C_SetPIN 
34140 3d 20 43 5f 53 65 74 50 49 4e 3b 0a 09 70 46 75  = C_SetPIN;..pFu
34150 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 4f 70  nctionList->C_Op
34160 65 6e 53 65 73 73 69 6f 6e 20 3d 20 43 5f 4f 70  enSession = C_Op
34170 65 6e 53 65 73 73 69 6f 6e 3b 0a 09 70 46 75 6e  enSession;..pFun
34180 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 43 6c 6f  ctionList->C_Clo
34190 73 65 53 65 73 73 69 6f 6e 20 3d 20 43 5f 43 6c  seSession = C_Cl
341a0 6f 73 65 53 65 73 73 69 6f 6e 3b 0a 09 70 46 75  oseSession;..pFu
341b0 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 43 6c  nctionList->C_Cl
341c0 6f 73 65 41 6c 6c 53 65 73 73 69 6f 6e 73 20 3d  oseAllSessions =
341d0 20 43 5f 43 6c 6f 73 65 41 6c 6c 53 65 73 73 69   C_CloseAllSessi
341e0 6f 6e 73 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  ons;..pFunctionL
341f0 69 73 74 2d 3e 43 5f 47 65 74 53 65 73 73 69 6f  ist->C_GetSessio
34200 6e 49 6e 66 6f 20 3d 20 43 5f 47 65 74 53 65 73  nInfo = C_GetSes
34210 73 69 6f 6e 49 6e 66 6f 3b 0a 09 70 46 75 6e 63  sionInfo;..pFunc
34220 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 4f  tionList->C_GetO
34230 70 65 72 61 74 69 6f 6e 53 74 61 74 65 20 3d 20  perationState = 
34240 43 5f 47 65 74 4f 70 65 72 61 74 69 6f 6e 53 74  C_GetOperationSt
34250 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  ate;..pFunctionL
34260 69 73 74 2d 3e 43 5f 53 65 74 4f 70 65 72 61 74  ist->C_SetOperat
34270 69 6f 6e 53 74 61 74 65 20 3d 20 43 5f 53 65 74  ionState = C_Set
34280 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 65 3b 0a  OperationState;.
34290 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
342a0 43 5f 4c 6f 67 69 6e 20 3d 20 43 5f 4c 6f 67 69  C_Login = C_Logi
342b0 6e 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  n;..pFunctionLis
342c0 74 2d 3e 43 5f 4c 6f 67 6f 75 74 20 3d 20 43 5f  t->C_Logout = C_
342d0 4c 6f 67 6f 75 74 3b 0a 09 70 46 75 6e 63 74 69  Logout;..pFuncti
342e0 6f 6e 4c 69 73 74 2d 3e 43 5f 43 72 65 61 74 65  onList->C_Create
342f0 4f 62 6a 65 63 74 20 3d 20 43 5f 43 72 65 61 74  Object = C_Creat
34300 65 4f 62 6a 65 63 74 3b 0a 09 70 46 75 6e 63 74  eObject;..pFunct
34310 69 6f 6e 4c 69 73 74 2d 3e 43 5f 43 6f 70 79 4f  ionList->C_CopyO
34320 62 6a 65 63 74 20 3d 20 43 5f 43 6f 70 79 4f 62  bject = C_CopyOb
34330 6a 65 63 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  ject;..pFunction
34340 4c 69 73 74 2d 3e 43 5f 44 65 73 74 72 6f 79 4f  List->C_DestroyO
34350 62 6a 65 63 74 20 3d 20 43 5f 44 65 73 74 72 6f  bject = C_Destro
34360 79 4f 62 6a 65 63 74 3b 0a 09 70 46 75 6e 63 74  yObject;..pFunct
34370 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 4f 62  ionList->C_GetOb
34380 6a 65 63 74 53 69 7a 65 20 3d 20 43 5f 47 65 74  jectSize = C_Get
34390 4f 62 6a 65 63 74 53 69 7a 65 3b 0a 09 70 46 75  ObjectSize;..pFu
343a0 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65  nctionList->C_Ge
343b0 74 41 74 74 72 69 62 75 74 65 56 61 6c 75 65 20  tAttributeValue 
343c0 3d 20 43 5f 47 65 74 41 74 74 72 69 62 75 74 65  = C_GetAttribute
343d0 56 61 6c 75 65 3b 0a 09 70 46 75 6e 63 74 69 6f  Value;..pFunctio
343e0 6e 4c 69 73 74 2d 3e 43 5f 53 65 74 41 74 74 72  nList->C_SetAttr
343f0 69 62 75 74 65 56 61 6c 75 65 20 3d 20 43 5f 53  ibuteValue = C_S
34400 65 74 41 74 74 72 69 62 75 74 65 56 61 6c 75 65  etAttributeValue
34410 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
34420 2d 3e 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73 49  ->C_FindObjectsI
34430 6e 69 74 20 3d 20 43 5f 46 69 6e 64 4f 62 6a 65  nit = C_FindObje
34440 63 74 73 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74  ctsInit;..pFunct
34450 69 6f 6e 4c 69 73 74 2d 3e 43 5f 46 69 6e 64 4f  ionList->C_FindO
34460 62 6a 65 63 74 73 20 3d 20 43 5f 46 69 6e 64 4f  bjects = C_FindO
34470 62 6a 65 63 74 73 3b 0a 09 70 46 75 6e 63 74 69  bjects;..pFuncti
34480 6f 6e 4c 69 73 74 2d 3e 43 5f 46 69 6e 64 4f 62  onList->C_FindOb
34490 6a 65 63 74 73 46 69 6e 61 6c 20 3d 20 43 5f 46  jectsFinal = C_F
344a0 69 6e 64 4f 62 6a 65 63 74 73 46 69 6e 61 6c 3b  indObjectsFinal;
344b0 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
344c0 3e 43 5f 45 6e 63 72 79 70 74 49 6e 69 74 20 3d  >C_EncryptInit =
344d0 20 43 5f 45 6e 63 72 79 70 74 49 6e 69 74 3b 0a   C_EncryptInit;.
344e0 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
344f0 43 5f 45 6e 63 72 79 70 74 20 3d 20 43 5f 45 6e  C_Encrypt = C_En
34500 63 72 79 70 74 3b 0a 09 70 46 75 6e 63 74 69 6f  crypt;..pFunctio
34510 6e 4c 69 73 74 2d 3e 43 5f 45 6e 63 72 79 70 74  nList->C_Encrypt
34520 55 70 64 61 74 65 20 3d 20 43 5f 45 6e 63 72 79  Update = C_Encry
34530 70 74 55 70 64 61 74 65 3b 0a 09 70 46 75 6e 63  ptUpdate;..pFunc
34540 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 45 6e 63 72  tionList->C_Encr
34550 79 70 74 46 69 6e 61 6c 20 3d 20 43 5f 45 6e 63  yptFinal = C_Enc
34560 72 79 70 74 46 69 6e 61 6c 3b 0a 09 70 46 75 6e  ryptFinal;..pFun
34570 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65 63  ctionList->C_Dec
34580 72 79 70 74 49 6e 69 74 20 3d 20 43 5f 44 65 63  ryptInit = C_Dec
34590 72 79 70 74 49 6e 69 74 3b 0a 09 70 46 75 6e 63  ryptInit;..pFunc
345a0 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65 63 72  tionList->C_Decr
345b0 79 70 74 20 3d 20 43 5f 44 65 63 72 79 70 74 3b  ypt = C_Decrypt;
345c0 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
345d0 3e 43 5f 44 65 63 72 79 70 74 55 70 64 61 74 65  >C_DecryptUpdate
345e0 20 3d 20 43 5f 44 65 63 72 79 70 74 55 70 64 61   = C_DecryptUpda
345f0 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  te;..pFunctionLi
34600 73 74 2d 3e 43 5f 44 65 63 72 79 70 74 46 69 6e  st->C_DecryptFin
34610 61 6c 20 3d 20 43 5f 44 65 63 72 79 70 74 46 69  al = C_DecryptFi
34620 6e 61 6c 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  nal;..pFunctionL
34630 69 73 74 2d 3e 43 5f 44 69 67 65 73 74 49 6e 69  ist->C_DigestIni
34640 74 20 3d 20 43 5f 44 69 67 65 73 74 49 6e 69 74  t = C_DigestInit
34650 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
34660 2d 3e 43 5f 44 69 67 65 73 74 20 3d 20 43 5f 44  ->C_Digest = C_D
34670 69 67 65 73 74 3b 0a 09 70 46 75 6e 63 74 69 6f  igest;..pFunctio
34680 6e 4c 69 73 74 2d 3e 43 5f 44 69 67 65 73 74 55  nList->C_DigestU
34690 70 64 61 74 65 20 3d 20 43 5f 44 69 67 65 73 74  pdate = C_Digest
346a0 55 70 64 61 74 65 3b 0a 09 70 46 75 6e 63 74 69  Update;..pFuncti
346b0 6f 6e 4c 69 73 74 2d 3e 43 5f 44 69 67 65 73 74  onList->C_Digest
346c0 4b 65 79 20 3d 20 43 5f 44 69 67 65 73 74 4b 65  Key = C_DigestKe
346d0 79 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  y;..pFunctionLis
346e0 74 2d 3e 43 5f 44 69 67 65 73 74 46 69 6e 61 6c  t->C_DigestFinal
346f0 20 3d 20 43 5f 44 69 67 65 73 74 46 69 6e 61 6c   = C_DigestFinal
34700 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
34710 2d 3e 43 5f 53 69 67 6e 49 6e 69 74 20 3d 20 43  ->C_SignInit = C
34720 5f 53 69 67 6e 49 6e 69 74 3b 0a 09 70 46 75 6e  _SignInit;..pFun
34730 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69 67  ctionList->C_Sig
34740 6e 20 3d 20 43 5f 53 69 67 6e 3b 0a 09 70 46 75  n = C_Sign;..pFu
34750 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69  nctionList->C_Si
34760 67 6e 55 70 64 61 74 65 20 3d 20 43 5f 53 69 67  gnUpdate = C_Sig
34770 6e 55 70 64 61 74 65 3b 0a 09 70 46 75 6e 63 74  nUpdate;..pFunct
34780 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 46  ionList->C_SignF
34790 69 6e 61 6c 20 3d 20 43 5f 53 69 67 6e 46 69 6e  inal = C_SignFin
347a0 61 6c 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  al;..pFunctionLi
347b0 73 74 2d 3e 43 5f 53 69 67 6e 52 65 63 6f 76 65  st->C_SignRecove
347c0 72 49 6e 69 74 20 3d 20 43 5f 53 69 67 6e 52 65  rInit = C_SignRe
347d0 63 6f 76 65 72 49 6e 69 74 3b 0a 09 70 46 75 6e  coverInit;..pFun
347e0 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69 67  ctionList->C_Sig
347f0 6e 52 65 63 6f 76 65 72 20 3d 20 43 5f 53 69 67  nRecover = C_Sig
34800 6e 52 65 63 6f 76 65 72 3b 0a 09 70 46 75 6e 63  nRecover;..pFunc
34810 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65 72 69  tionList->C_Veri
34820 66 79 49 6e 69 74 20 3d 20 43 5f 56 65 72 69 66  fyInit = C_Verif
34830 79 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f  yInit;..pFunctio
34840 6e 4c 69 73 74 2d 3e 43 5f 56 65 72 69 66 79 20  nList->C_Verify 
34850 3d 20 43 5f 56 65 72 69 66 79 3b 0a 09 70 46 75  = C_Verify;..pFu
34860 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65  nctionList->C_Ve
34870 72 69 66 79 55 70 64 61 74 65 20 3d 20 43 5f 56  rifyUpdate = C_V
34880 65 72 69 66 79 55 70 64 61 74 65 3b 0a 09 70 46  erifyUpdate;..pF
34890 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 56  unctionList->C_V
348a0 65 72 69 66 79 46 69 6e 61 6c 20 3d 20 43 5f 56  erifyFinal = C_V
348b0 65 72 69 66 79 46 69 6e 61 6c 3b 0a 09 70 46 75  erifyFinal;..pFu
348c0 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65  nctionList->C_Ve
348d0 72 69 66 79 52 65 63 6f 76 65 72 49 6e 69 74 20  rifyRecoverInit 
348e0 3d 20 43 5f 56 65 72 69 66 79 52 65 63 6f 76 65  = C_VerifyRecove
348f0 72 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f  rInit;..pFunctio
34900 6e 4c 69 73 74 2d 3e 43 5f 56 65 72 69 66 79 52  nList->C_VerifyR
34910 65 63 6f 76 65 72 20 3d 20 43 5f 56 65 72 69 66  ecover = C_Verif
34920 79 52 65 63 6f 76 65 72 3b 0a 09 70 46 75 6e 63  yRecover;..pFunc
34930 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 69 67 65  tionList->C_Dige
34940 73 74 45 6e 63 72 79 70 74 55 70 64 61 74 65 20  stEncryptUpdate 
34950 3d 20 43 5f 44 69 67 65 73 74 45 6e 63 72 79 70  = C_DigestEncryp
34960 74 55 70 64 61 74 65 3b 0a 09 70 46 75 6e 63 74  tUpdate;..pFunct
34970 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65 63 72 79  ionList->C_Decry
34980 70 74 44 69 67 65 73 74 55 70 64 61 74 65 20 3d  ptDigestUpdate =
34990 20 43 5f 44 65 63 72 79 70 74 44 69 67 65 73 74   C_DecryptDigest
349a0 55 70 64 61 74 65 3b 0a 09 70 46 75 6e 63 74 69  Update;..pFuncti
349b0 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 45 6e  onList->C_SignEn
349c0 63 72 79 70 74 55 70 64 61 74 65 20 3d 20 43 5f  cryptUpdate = C_
349d0 53 69 67 6e 45 6e 63 72 79 70 74 55 70 64 61 74  SignEncryptUpdat
349e0 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  e;..pFunctionLis
349f0 74 2d 3e 43 5f 44 65 63 72 79 70 74 56 65 72 69  t->C_DecryptVeri
34a00 66 79 55 70 64 61 74 65 20 3d 20 43 5f 44 65 63  fyUpdate = C_Dec
34a10 72 79 70 74 56 65 72 69 66 79 55 70 64 61 74 65  ryptVerifyUpdate
34a20 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
34a30 2d 3e 43 5f 47 65 6e 65 72 61 74 65 4b 65 79 20  ->C_GenerateKey 
34a40 3d 20 43 5f 47 65 6e 65 72 61 74 65 4b 65 79 3b  = C_GenerateKey;
34a50 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
34a60 3e 43 5f 47 65 6e 65 72 61 74 65 4b 65 79 50 61  >C_GenerateKeyPa
34a70 69 72 20 3d 20 43 5f 47 65 6e 65 72 61 74 65 4b  ir = C_GenerateK
34a80 65 79 50 61 69 72 3b 0a 09 70 46 75 6e 63 74 69  eyPair;..pFuncti
34a90 6f 6e 4c 69 73 74 2d 3e 43 5f 57 72 61 70 4b 65  onList->C_WrapKe
34aa0 79 20 3d 20 43 5f 57 72 61 70 4b 65 79 3b 0a 09  y = C_WrapKey;..
34ab0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
34ac0 5f 55 6e 77 72 61 70 4b 65 79 20 3d 20 43 5f 55  _UnwrapKey = C_U
34ad0 6e 77 72 61 70 4b 65 79 3b 0a 09 70 46 75 6e 63  nwrapKey;..pFunc
34ae0 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65 72 69  tionList->C_Deri
34af0 76 65 4b 65 79 20 3d 20 43 5f 44 65 72 69 76 65  veKey = C_Derive
34b00 4b 65 79 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  Key;..pFunctionL
34b10 69 73 74 2d 3e 43 5f 53 65 65 64 52 61 6e 64 6f  ist->C_SeedRando
34b20 6d 20 3d 20 43 5f 53 65 65 64 52 61 6e 64 6f 6d  m = C_SeedRandom
34b30 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
34b40 2d 3e 43 5f 47 65 6e 65 72 61 74 65 52 61 6e 64  ->C_GenerateRand
34b50 6f 6d 20 3d 20 43 5f 47 65 6e 65 72 61 74 65 52  om = C_GenerateR
34b60 61 6e 64 6f 6d 3b 0a 09 70 46 75 6e 63 74 69 6f  andom;..pFunctio
34b70 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 46 75 6e 63  nList->C_GetFunc
34b80 74 69 6f 6e 53 74 61 74 75 73 20 3d 20 43 5f 47  tionStatus = C_G
34b90 65 74 46 75 6e 63 74 69 6f 6e 53 74 61 74 75 73  etFunctionStatus
34ba0 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
34bb0 2d 3e 43 5f 43 61 6e 63 65 6c 46 75 6e 63 74 69  ->C_CancelFuncti
34bc0 6f 6e 20 3d 20 43 5f 43 61 6e 63 65 6c 46 75 6e  on = C_CancelFun
34bd0 63 74 69 6f 6e 3b 0a 09 70 46 75 6e 63 74 69 6f  ction;..pFunctio
34be0 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 46 75 6e 63  nList->C_GetFunc
34bf0 74 69 6f 6e 4c 69 73 74 20 3d 20 43 5f 47 65 74  tionList = C_Get
34c00 46 75 6e 63 74 69 6f 6e 4c 69 73 74 3b 0a 0a 09  FunctionList;...
34c10 2a 70 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 20  *ppFunctionList 
34c20 3d 20 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 3b  = pFunctionList;
34c30 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
34c40 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
34c50 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20  g CKR_OK (%i)", 
34c60 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72  CKR_OK);...retur
34c70 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a        n(CKR_OK);.}..